summaryrefslogtreecommitdiff
path: root/chromium/ui
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui')
-rw-r--r--chromium/ui/accelerated_widget_mac/BUILD.gn1
-rw-r--r--chromium/ui/accelerated_widget_mac/accelerated_widget_mac.h4
-rw-r--r--chromium/ui/accelerated_widget_mac/accelerated_widget_mac.mm2
-rw-r--r--chromium/ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm8
-rw-r--r--chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.h142
-rw-r--r--chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm773
-rw-r--r--chromium/ui/accelerated_widget_mac/io_surface_context.h2
-rw-r--r--chromium/ui/accessibility/BUILD.gn53
-rw-r--r--chromium/ui/accessibility/OWNERS1
-rw-r--r--chromium/ui/accessibility/accessibility_features.cc19
-rw-r--r--chromium/ui/accessibility/accessibility_features.h15
-rw-r--r--chromium/ui/accessibility/ax_common.h6
-rw-r--r--chromium/ui/accessibility/ax_computed_node_data.cc99
-rw-r--r--chromium/ui/accessibility/ax_computed_node_data.h28
-rw-r--r--chromium/ui/accessibility/ax_computed_node_data_unittest.cc66
-rw-r--r--chromium/ui/accessibility/ax_enum_localization_util.cc40
-rw-r--r--chromium/ui/accessibility/ax_enum_localization_util.h21
-rw-r--r--chromium/ui/accessibility/ax_enum_util.cc34
-rw-r--r--chromium/ui/accessibility/ax_enum_util.h4
-rw-r--r--chromium/ui/accessibility/ax_enums.mojom52
-rw-r--r--chromium/ui/accessibility/ax_event_generator.cc32
-rw-r--r--chromium/ui/accessibility/ax_event_generator.h11
-rw-r--r--chromium/ui/accessibility/ax_event_generator_unittest.cc118
-rw-r--r--chromium/ui/accessibility/ax_language_detection.h8
-rw-r--r--chromium/ui/accessibility/ax_language_detection_unittest.cc9
-rw-r--r--chromium/ui/accessibility/ax_mode.h6
-rw-r--r--chromium/ui/accessibility/ax_node.cc380
-rw-r--r--chromium/ui/accessibility/ax_node.h111
-rw-r--r--chromium/ui/accessibility/ax_node_data.cc33
-rw-r--r--chromium/ui/accessibility/ax_node_data.h3
-rw-r--r--chromium/ui/accessibility/ax_node_data_unittest.cc38
-rw-r--r--chromium/ui/accessibility/ax_node_position.cc4
-rw-r--r--chromium/ui/accessibility/ax_node_position_fuzzer.cc410
-rw-r--r--chromium/ui/accessibility/ax_node_position_unittest.cc42
-rw-r--r--chromium/ui/accessibility/ax_node_unittest.cc110
-rw-r--r--chromium/ui/accessibility/ax_position.h11
-rw-r--r--chromium/ui/accessibility/ax_range_unittest.cc2
-rw-r--r--chromium/ui/accessibility/ax_role_properties.cc3
-rw-r--r--chromium/ui/accessibility/ax_role_properties.h2
-rw-r--r--chromium/ui/accessibility/ax_tree.cc133
-rw-r--r--chromium/ui/accessibility/ax_tree.h25
-rw-r--r--chromium/ui/accessibility/ax_tree_fuzzer_util.cc355
-rw-r--r--chromium/ui/accessibility/ax_tree_fuzzer_util.h90
-rw-r--r--chromium/ui/accessibility/ax_tree_manager.cc107
-rw-r--r--chromium/ui/accessibility/ax_tree_manager.h90
-rw-r--r--chromium/ui/accessibility/ax_tree_manager_base.cc5
-rw-r--r--chromium/ui/accessibility/ax_tree_manager_base.h4
-rw-r--r--chromium/ui/accessibility/ax_tree_manager_map.cc35
-rw-r--r--chromium/ui/accessibility/ax_tree_manager_map.h24
-rw-r--r--chromium/ui/accessibility/ax_tree_serializer.h15
-rw-r--r--chromium/ui/accessibility/ax_tree_unittest.cc45
-rw-r--r--chromium/ui/accessibility/extensions/color_contrast_companion/background.js96
-rw-r--r--chromium/ui/accessibility/extensions/color_contrast_companion/browser_action.pngbin0 -> 12776 bytes
-rw-r--r--chromium/ui/accessibility/extensions/color_contrast_companion/common.js101
-rw-r--r--chromium/ui/accessibility/extensions/color_contrast_companion/contrast-128.pngbin0 -> 4211 bytes
-rw-r--r--chromium/ui/accessibility/extensions/color_contrast_companion/contrast-16.pngbin0 -> 534 bytes
-rw-r--r--chromium/ui/accessibility/extensions/color_contrast_companion/contrast-19.pngbin0 -> 711 bytes
-rw-r--r--chromium/ui/accessibility/extensions/color_contrast_companion/contrast-38.pngbin0 -> 1382 bytes
-rw-r--r--chromium/ui/accessibility/extensions/color_contrast_companion/contrast-48.pngbin0 -> 1746 bytes
-rw-r--r--chromium/ui/accessibility/extensions/color_contrast_companion/help.html151
-rw-r--r--chromium/ui/accessibility/extensions/color_contrast_companion/highcontrast.js177
-rw-r--r--chromium/ui/accessibility/extensions/color_contrast_companion/manifest.json22
-rw-r--r--chromium/ui/accessibility/extensions/color_contrast_companion/ui.html130
-rw-r--r--chromium/ui/accessibility/extensions/color_contrast_companion/ui.js290
-rw-r--r--chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_as.xtb2
-rw-r--r--chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_te.xtb2
-rw-r--r--chromium/ui/accessibility/mojom/BUILD.gn44
-rw-r--r--chromium/ui/accessibility/platform/BUILD.gn3
-rw-r--r--chromium/ui/accessibility/platform/ax_fragment_root_win.cc5
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_atk_hyperlink.cc120
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node.cc2
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_auralinux.cc78
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_auralinux.h4
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc55
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_base.cc131
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_base.h16
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_base_unittest.cc180
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_cocoa.mm25
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_delegate.cc36
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_delegate.h24
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_delegate_base.cc17
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_delegate_base.h5
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_mac.mm6
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc39
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_fuzzer.cc245
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc218
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_unittest.cc11
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_unittest.h5
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_win.cc72
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_win_unittest.cc48
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_win_unittest.h2
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_tree_manager.h5
-rw-r--r--chromium/ui/accessibility/platform/ax_unique_id.cc4
-rw-r--r--chromium/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.h9
-rw-r--r--chromium/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.mm81
-rw-r--r--chromium/ui/accessibility/platform/inspect/ax_element_wrapper_mac.h158
-rw-r--r--chromium/ui/accessibility/platform/inspect/ax_element_wrapper_mac.mm362
-rw-r--r--chromium/ui/accessibility/platform/inspect/ax_inspect_scenario.h3
-rw-r--r--chromium/ui/accessibility/platform/inspect/ax_inspect_utils_mac.h75
-rw-r--r--chromium/ui/accessibility/platform/inspect/ax_inspect_utils_mac.mm292
-rw-r--r--chromium/ui/accessibility/platform/inspect/ax_optional.h30
-rw-r--r--chromium/ui/accessibility/platform/inspect/ax_property_node.h2
-rw-r--r--chromium/ui/accessibility/platform/inspect/ax_transform_mac.mm7
-rw-r--r--chromium/ui/accessibility/platform/inspect/ax_tree_formatter_mac.h6
-rw-r--r--chromium/ui/accessibility/platform/inspect/ax_tree_formatter_mac.mm62
-rw-r--r--chromium/ui/accessibility/platform/inspect/ax_tree_indexer_mac.h14
-rw-r--r--chromium/ui/accessibility/platform/test_ax_tree_update.cc56
-rw-r--r--chromium/ui/accessibility/platform/test_ax_tree_update.h54
-rw-r--r--chromium/ui/accessibility/test_ax_tree_manager.cc81
-rw-r--r--chromium/ui/accessibility/test_ax_tree_manager.h11
-rw-r--r--chromium/ui/accessibility/test_ax_tree_update_json_reader.cc342
-rw-r--r--chromium/ui/accessibility/test_ax_tree_update_json_reader.h27
-rw-r--r--chromium/ui/android/BUILD.gn25
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/base/ApplicationViewportInsetSupplierTest.java14
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/base/MimeTypeUtilsTest.java1
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/dragdrop/DragAndDropDelegateImplUnitTest.java128
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/dragdrop/DropDataContentProviderTest.java31
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/modelutil/ModelListAdapterTest.java12
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/modelutil/ModelListPropertyChangeFilterTest.java95
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/resources/dynamics/BitmapDynamicResourceTest.java38
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/resources/dynamics/DynamicResourceTestUtils.java45
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/resources/dynamics/ViewResourceAdapterTest.java101
-rw-r--r--chromium/ui/android/view_android.cc9
-rw-r--r--chromium/ui/android/view_android.h1
-rw-r--r--chromium/ui/android/window_android.cc5
-rw-r--r--chromium/ui/android/window_android.h3
-rw-r--r--chromium/ui/aura/BUILD.gn9
-rw-r--r--chromium/ui/aura/OWNERS3
-rw-r--r--chromium/ui/aura/client/aura_constants.cc1
-rw-r--r--chromium/ui/aura/client/aura_constants.h10
-rw-r--r--chromium/ui/aura/client/capture_client.h8
-rw-r--r--chromium/ui/aura/cursor/BUILD.gn52
-rw-r--r--chromium/ui/aura/cursor/DEPS3
-rw-r--r--chromium/ui/aura/cursor/OWNERS1
-rw-r--r--chromium/ui/aura/env.cc31
-rw-r--r--chromium/ui/aura/env.h12
-rw-r--r--chromium/ui/aura/gestures/OWNERS1
-rw-r--r--chromium/ui/aura/native_window_occlusion_tracker_win.cc10
-rw-r--r--chromium/ui/aura/screen_ozone.cc16
-rw-r--r--chromium/ui/aura/screen_ozone.h32
-rw-r--r--chromium/ui/aura/test/ui_controls_ozone.cc4
-rw-r--r--chromium/ui/aura/test/ui_controls_ozone.h5
-rw-r--r--chromium/ui/aura/window.h2
-rw-r--r--chromium/ui/aura/window_event_dispatcher_unittest.cc31
-rw-r--r--chromium/ui/aura/window_observer.h10
-rw-r--r--chromium/ui/aura/window_tree_host.cc23
-rw-r--r--chromium/ui/aura/window_tree_host.h14
-rw-r--r--chromium/ui/aura/window_tree_host_observer.h7
-rw-r--r--chromium/ui/aura/window_tree_host_platform.cc20
-rw-r--r--chromium/ui/aura/window_tree_host_platform.h3
-rw-r--r--chromium/ui/aura/window_tree_host_platform_unittest.cc3
-rw-r--r--chromium/ui/base/BUILD.gn21
-rw-r--r--chromium/ui/base/DEPS2
-rw-r--r--chromium/ui/base/OWNERS1
-rw-r--r--chromium/ui/base/accelerators/accelerator.cc6
-rw-r--r--chromium/ui/base/accelerators/global_media_keys_listener_win.cc2
-rw-r--r--chromium/ui/base/accelerators/media_keys_listener_mac.mm4
-rw-r--r--chromium/ui/base/base_window.cc13
-rw-r--r--chromium/ui/base/base_window.h6
-rw-r--r--chromium/ui/base/clipboard/clipboard.cc3
-rw-r--r--chromium/ui/base/clipboard/clipboard_android.cc5
-rw-r--r--chromium/ui/base/clipboard/clipboard_android_test_support.cc4
-rw-r--r--chromium/ui/base/clipboard/clipboard_data.cc2
-rw-r--r--chromium/ui/base/clipboard/clipboard_data.h4
-rw-r--r--chromium/ui/base/clipboard/clipboard_ozone.cc150
-rw-r--r--chromium/ui/base/clipboard/clipboard_ozone.h16
-rw-r--r--chromium/ui/base/clipboard/clipboard_test_template.h5
-rw-r--r--chromium/ui/base/clipboard/custom_data_helper.cc2
-rw-r--r--chromium/ui/base/clipboard/scoped_clipboard_writer.h2
-rw-r--r--chromium/ui/base/cocoa/accessibility_focus_overrider.h3
-rw-r--r--chromium/ui/base/cocoa/find_pasteboard.h10
-rw-r--r--chromium/ui/base/cocoa/find_pasteboard.mm4
-rw-r--r--chromium/ui/base/cocoa/menu_controller.h2
-rw-r--r--chromium/ui/base/cocoa/menu_controller.mm12
-rw-r--r--chromium/ui/base/cocoa/menu_controller_unittest.mm26
-rw-r--r--chromium/ui/base/cocoa/nsmenu_additions.h28
-rw-r--r--chromium/ui/base/cocoa/nsmenu_additions.mm61
-rw-r--r--chromium/ui/base/cocoa/nsmenu_additions_unittest.mm159
-rw-r--r--chromium/ui/base/cocoa/nsmenuitem_additions.h16
-rw-r--r--chromium/ui/base/cocoa/nsmenuitem_additions.mm30
-rw-r--r--chromium/ui/base/cocoa/nsmenuitem_additions_unittest.mm94
-rw-r--r--chromium/ui/base/cocoa/nswindow_test_util.cc78
-rw-r--r--chromium/ui/base/cocoa/nswindow_test_util.h59
-rw-r--r--chromium/ui/base/cocoa/text_services_context_menu.h3
-rw-r--r--chromium/ui/base/cocoa/text_services_context_menu.mm (renamed from chromium/ui/base/cocoa/text_services_context_menu.cc)50
-rw-r--r--chromium/ui/base/cocoa/tool_tip_base_view.h4
-rw-r--r--chromium/ui/base/cocoa/weak_ptr_nsobject.mm4
-rw-r--r--chromium/ui/base/cursor/BUILD.gn11
-rw-r--r--chromium/ui/base/cursor/cursor_theme_manager.cc48
-rw-r--r--chromium/ui/base/cursor/cursor_theme_manager.h47
-rw-r--r--chromium/ui/base/data_transfer_policy/data_transfer_endpoint.h2
-rw-r--r--chromium/ui/base/data_transfer_policy/data_transfer_endpoint_serializer.cc12
-rw-r--r--chromium/ui/base/data_transfer_policy/data_transfer_endpoint_serializer.h5
-rw-r--r--chromium/ui/base/data_transfer_policy/data_transfer_endpoint_serializer_unittest.cc2
-rw-r--r--chromium/ui/base/dragdrop/drag_source_win.cc1
-rw-r--r--chromium/ui/base/dragdrop/drag_source_win.h10
-rw-r--r--chromium/ui/base/dragdrop/drop_target_event.cc4
-rw-r--r--chromium/ui/base/dragdrop/drop_target_event.h3
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_win.cc22
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_win.h2
-rw-r--r--chromium/ui/base/emoji/emoji_panel_helper_lacros.cc21
-rw-r--r--chromium/ui/base/glib/scoped_gobject.h3
-rw-r--r--chromium/ui/base/idle/BUILD.gn2
-rw-r--r--chromium/ui/base/idle/DEPS2
-rw-r--r--chromium/ui/base/idle/idle_chromeos.cc4
-rw-r--r--chromium/ui/base/idle/idle_linux.cc3
-rw-r--r--chromium/ui/base/idle/idle_polling_service.cc6
-rw-r--r--chromium/ui/base/idle/idle_polling_service.h7
-rw-r--r--chromium/ui/base/ime/BUILD.gn2
-rw-r--r--chromium/ui/base/ime/DEPS1
-rw-r--r--chromium/ui/base/ime/OWNERS1
-rw-r--r--chromium/ui/base/ime/PRESUBMIT.py2
-rw-r--r--chromium/ui/base/ime/ash/ime_assistive_window_handler_interface.h4
-rw-r--r--chromium/ui/base/ime/ash/ime_engine_handler_interface.h6
-rw-r--r--chromium/ui/base/ime/ash/input_method_ash.cc62
-rw-r--r--chromium/ui/base/ime/ash/input_method_ash.h9
-rw-r--r--chromium/ui/base/ime/ash/input_method_ash_unittest.cc32
-rw-r--r--chromium/ui/base/ime/ash/input_method_manager.h2
-rw-r--r--chromium/ui/base/ime/ash/mock_component_extension_ime_manager_delegate.h1
-rw-r--r--chromium/ui/base/ime/ash/mock_ime_engine_handler.cc7
-rw-r--r--chromium/ui/base/ime/ash/mock_ime_engine_handler.h2
-rw-r--r--chromium/ui/base/ime/ash/mock_input_method_manager.cc15
-rw-r--r--chromium/ui/base/ime/ash/mock_input_method_manager.h9
-rw-r--r--chromium/ui/base/ime/character_composer_data.h6
-rw-r--r--chromium/ui/base/ime/dummy_input_method.cc4
-rw-r--r--chromium/ui/base/ime/dummy_input_method.h3
-rw-r--r--chromium/ui/base/ime/dummy_text_input_client.cc8
-rw-r--r--chromium/ui/base/ime/dummy_text_input_client.h6
-rw-r--r--chromium/ui/base/ime/fake_text_input_client.cc8
-rw-r--r--chromium/ui/base/ime/fake_text_input_client.h6
-rw-r--r--chromium/ui/base/ime/fuchsia/BUILD.gn2
-rw-r--r--chromium/ui/base/ime/fuchsia/input_method_fuchsia.cc9
-rw-r--r--chromium/ui/base/ime/fuchsia/input_method_fuchsia.h4
-rw-r--r--chromium/ui/base/ime/fuchsia/keyboard_client.cc111
-rw-r--r--chromium/ui/base/ime/fuchsia/keyboard_client.h6
-rwxr-xr-xchromium/ui/base/ime/generate_character_composer_data.py23
-rw-r--r--chromium/ui/base/ime/ime_key_event_dispatcher.h (renamed from chromium/ui/base/ime/input_method_delegate.h)21
-rw-r--r--chromium/ui/base/ime/ime_text_span.cc4
-rw-r--r--chromium/ui/base/ime/ime_text_span.h8
-rw-r--r--chromium/ui/base/ime/init/input_method_factory.cc19
-rw-r--r--chromium/ui/base/ime/init/input_method_factory.h8
-rw-r--r--chromium/ui/base/ime/init/input_method_initializer.cc45
-rw-r--r--chromium/ui/base/ime/input_method.h33
-rw-r--r--chromium/ui/base/ime/input_method_base.cc66
-rw-r--r--chromium/ui/base/ime/input_method_base.h33
-rw-r--r--chromium/ui/base/ime/input_method_base_unittest.cc10
-rw-r--r--chromium/ui/base/ime/input_method_minimal.cc5
-rw-r--r--chromium/ui/base/ime/input_method_minimal.h2
-rw-r--r--chromium/ui/base/ime/input_method_minimal_unittest.cc28
-rw-r--r--chromium/ui/base/ime/linux/BUILD.gn18
-rw-r--r--chromium/ui/base/ime/linux/OWNERS2
-rw-r--r--chromium/ui/base/ime/linux/fake_input_method_context.cc15
-rw-r--r--chromium/ui/base/ime/linux/fake_input_method_context.h3
-rw-r--r--chromium/ui/base/ime/linux/fake_input_method_context_factory.cc22
-rw-r--r--chromium/ui/base/ime/linux/fake_input_method_context_factory.h34
-rw-r--r--chromium/ui/base/ime/linux/input_method_auralinux.cc164
-rw-r--r--chromium/ui/base/ime/linux/input_method_auralinux.h18
-rw-r--r--chromium/ui/base/ime/linux/input_method_auralinux_unittest.cc238
-rw-r--r--chromium/ui/base/ime/linux/linux_input_method_context.h30
-rw-r--r--chromium/ui/base/ime/linux/linux_input_method_context_factory.cc51
-rw-r--r--chromium/ui/base/ime/linux/linux_input_method_context_factory.h37
-rw-r--r--chromium/ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.cc23
-rw-r--r--chromium/ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h44
-rw-r--r--chromium/ui/base/ime/mac/input_method_mac.h2
-rw-r--r--chromium/ui/base/ime/mac/input_method_mac.mm4
-rw-r--r--chromium/ui/base/ime/mock_input_method.cc15
-rw-r--r--chromium/ui/base/ime/mock_input_method.h7
-rw-r--r--chromium/ui/base/ime/mojom/ime_types_mojom_traits.h4
-rw-r--r--chromium/ui/base/ime/text_input_client.h10
-rw-r--r--chromium/ui/base/ime/virtual_keyboard_controller_stub.cc28
-rw-r--r--chromium/ui/base/ime/virtual_keyboard_controller_stub.h9
-rw-r--r--chromium/ui/base/ime/win/input_method_win_base.cc7
-rw-r--r--chromium/ui/base/ime/win/input_method_win_base.h2
-rw-r--r--chromium/ui/base/ime/win/input_method_win_imm32.cc4
-rw-r--r--chromium/ui/base/ime/win/input_method_win_imm32.h2
-rw-r--r--chromium/ui/base/ime/win/input_method_win_tsf.cc15
-rw-r--r--chromium/ui/base/ime/win/input_method_win_tsf.h3
-rw-r--r--chromium/ui/base/ime/win/mock_tsf_bridge.cc10
-rw-r--r--chromium/ui/base/ime/win/mock_tsf_bridge.h9
-rw-r--r--chromium/ui/base/ime/win/tsf_bridge.cc19
-rw-r--r--chromium/ui/base/ime/win/tsf_bridge.h12
-rw-r--r--chromium/ui/base/ime/win/tsf_text_store.cc18
-rw-r--r--chromium/ui/base/ime/win/tsf_text_store.h15
-rw-r--r--chromium/ui/base/ime/win/tsf_text_store_unittest.cc16
-rw-r--r--chromium/ui/base/interaction/element_identifier.h3
-rw-r--r--chromium/ui/base/interaction/interaction_sequence.cc40
-rw-r--r--chromium/ui/base/interaction/interaction_sequence.h23
-rw-r--r--chromium/ui/base/interaction/interaction_test_util_mac.mm2
-rw-r--r--chromium/ui/base/l10n/formatter.cc5
-rw-r--r--chromium/ui/base/l10n/l10n_util.cc12
-rw-r--r--chromium/ui/base/l10n/l10n_util.h1
-rw-r--r--chromium/ui/base/l10n/l10n_util_collator.h8
-rw-r--r--chromium/ui/base/l10n/l10n_util_ios.h41
-rw-r--r--chromium/ui/base/l10n/l10n_util_ios.mm64
-rw-r--r--chromium/ui/base/l10n/l10n_util_ios_unittest.mm34
-rw-r--r--chromium/ui/base/l10n/l10n_util_mac.h10
-rw-r--r--chromium/ui/base/l10n/l10n_util_mac.mm38
-rw-r--r--chromium/ui/base/l10n/l10n_util_mac_unittest.mm21
-rw-r--r--chromium/ui/base/l10n/l10n_util_win.cc6
-rw-r--r--chromium/ui/base/l10n/l10n_util_win.h2
-rw-r--r--chromium/ui/base/l10n/time_format.cc5
-rw-r--r--chromium/ui/base/linux/linux_desktop.cc10
-rw-r--r--chromium/ui/base/linux/linux_desktop.h4
-rw-r--r--chromium/ui/base/models/button_menu_item_model.cc48
-rw-r--r--chromium/ui/base/models/button_menu_item_model.h20
-rw-r--r--chromium/ui/base/models/combobox_model.cc16
-rw-r--r--chromium/ui/base/models/combobox_model.h19
-rw-r--r--chromium/ui/base/models/dialog_model.h13
-rw-r--r--chromium/ui/base/models/dialog_model_field.cc4
-rw-r--r--chromium/ui/base/models/dialog_model_field.h6
-rw-r--r--chromium/ui/base/models/dialog_model_menu_model_adapter.cc46
-rw-r--r--chromium/ui/base/models/dialog_model_menu_model_adapter.h35
-rw-r--r--chromium/ui/base/models/list_selection_model.cc115
-rw-r--r--chromium/ui/base/models/list_selection_model.h52
-rw-r--r--chromium/ui/base/models/list_selection_model_unittest.cc127
-rw-r--r--chromium/ui/base/models/menu_model.cc30
-rw-r--r--chromium/ui/base/models/menu_model.h52
-rw-r--r--chromium/ui/base/models/simple_combobox_model.cc14
-rw-r--r--chromium/ui/base/models/simple_combobox_model.h12
-rw-r--r--chromium/ui/base/models/simple_menu_model.cc150
-rw-r--r--chromium/ui/base/models/simple_menu_model.h108
-rw-r--r--chromium/ui/base/models/table_model.cc8
-rw-r--r--chromium/ui/base/models/table_model.h10
-rw-r--r--chromium/ui/base/models/table_model_observer.h11
-rw-r--r--chromium/ui/base/models/tree_model.cc4
-rw-r--r--chromium/ui/base/models/tree_model.h11
-rw-r--r--chromium/ui/base/models/tree_node_model.h35
-rw-r--r--chromium/ui/base/models/tree_node_model_unittest.cc38
-rw-r--r--chromium/ui/base/prediction/OWNERS1
-rw-r--r--chromium/ui/base/resource/resource_bundle.cc2
-rw-r--r--chromium/ui/base/theme_provider.h3
-rw-r--r--chromium/ui/base/ui_base_features.cc21
-rw-r--r--chromium/ui/base/ui_base_features.h4
-rw-r--r--chromium/ui/base/ui_base_types.h7
-rw-r--r--chromium/ui/base/ui_features.gni4
-rw-r--r--chromium/ui/base/wayland/wayland_input_types_unittest.cc4
-rw-r--r--chromium/ui/base/webui/i18n_source_stream.cc16
-rw-r--r--chromium/ui/base/webui/i18n_source_stream.h13
-rw-r--r--chromium/ui/base/webui/jstemplate_builder.cc29
-rw-r--r--chromium/ui/base/webui/jstemplate_builder.h17
-rw-r--r--chromium/ui/base/webui/web_ui_util.cc5
-rw-r--r--chromium/ui/base/webui/web_ui_util.h4
-rw-r--r--chromium/ui/base/win/event_creation_utils.cc2
-rw-r--r--chromium/ui/base/win/session_change_observer.cc7
-rw-r--r--chromium/ui/base/x/BUILD.gn4
-rw-r--r--chromium/ui/base/x/DEPS5
-rw-r--r--chromium/ui/base/x/selection_requestor.h3
-rw-r--r--chromium/ui/base/x/selection_requestor_unittest.cc5
-rw-r--r--chromium/ui/base/x/visual_picker_glx.h3
-rw-r--r--chromium/ui/base/x/x11_clipboard_helper.cc16
-rw-r--r--chromium/ui/base/x/x11_clipboard_helper.h3
-rw-r--r--chromium/ui/base/x/x11_cursor_factory.cc8
-rw-r--r--chromium/ui/base/x/x11_cursor_factory.h14
-rw-r--r--chromium/ui/base/x/x11_cursor_loader.cc28
-rw-r--r--chromium/ui/base/x/x11_cursor_loader.h3
-rw-r--r--chromium/ui/base/x/x11_desktop_window_move_client.h3
-rw-r--r--chromium/ui/base/x/x11_display_manager.h5
-rw-r--r--chromium/ui/base/x/x11_drag_context.h3
-rw-r--r--chromium/ui/base/x/x11_drag_drop_client.h5
-rw-r--r--chromium/ui/base/x/x11_gl_egl_utility.cc2
-rw-r--r--chromium/ui/base/x/x11_global_shortcut_listener.h3
-rw-r--r--chromium/ui/base/x/x11_idle_query.h3
-rw-r--r--chromium/ui/base/x/x11_keyboard_hook.h3
-rw-r--r--chromium/ui/base/x/x11_os_exchange_data_provider.h3
-rw-r--r--chromium/ui/base/x/x11_shm_image_pool.h5
-rw-r--r--chromium/ui/base/x/x11_software_bitmap_presenter.cc11
-rw-r--r--chromium/ui/base/x/x11_software_bitmap_presenter.h3
-rw-r--r--chromium/ui/base/x/x11_util.h7
-rw-r--r--chromium/ui/base/x/x11_whole_screen_move_loop.h3
-rw-r--r--chromium/ui/base/x/x11_workspace_handler.h3
-rw-r--r--chromium/ui/chromeos/BUILD.gn2
-rw-r--r--chromium/ui/chromeos/strings/BUILD.gn2
-rw-r--r--chromium/ui/chromeos/styles/BUILD.gn24
-rw-r--r--chromium/ui/color/chromeos/native_color_mixers_chromeos.cc27
-rw-r--r--chromium/ui/color/color_id.h41
-rw-r--r--chromium/ui/color/color_provider_manager.cc23
-rw-r--r--chromium/ui/color/color_provider_manager.h38
-rw-r--r--chromium/ui/color/color_provider_manager_unittest.cc97
-rw-r--r--chromium/ui/color/color_provider_utils.cc2
-rw-r--r--chromium/ui/color/color_provider_utils.h1
-rw-r--r--chromium/ui/color/color_transform.cc15
-rw-r--r--chromium/ui/color/color_transform.h5
-rw-r--r--chromium/ui/color/ui_color_mixer.cc4
-rw-r--r--chromium/ui/compositor/BUILD.gn12
-rw-r--r--chromium/ui/compositor/compositor.cc17
-rw-r--r--chromium/ui/compositor/compositor.h12
-rw-r--r--chromium/ui/compositor/layer.cc6
-rw-r--r--chromium/ui/compositor/layer.h4
-rw-r--r--chromium/ui/compositor/layer_animation_delegate.h2
-rw-r--r--chromium/ui/compositor/layer_animation_element.cc18
-rw-r--r--chromium/ui/compositor/layer_animation_element.h3
-rw-r--r--chromium/ui/compositor/layer_animation_element_unittest.cc4
-rw-r--r--chromium/ui/compositor/layer_animator.cc6
-rw-r--r--chromium/ui/compositor/layer_animator_collection.cc4
-rw-r--r--chromium/ui/compositor/layer_owner.cc5
-rw-r--r--chromium/ui/compositor/layer_unittest.cc8
-rw-r--r--chromium/ui/compositor/recyclable_compositor_mac.cc79
-rw-r--r--chromium/ui/compositor/recyclable_compositor_mac.h34
-rw-r--r--chromium/ui/display/BUILD.gn18
-rw-r--r--chromium/ui/display/display.cc11
-rw-r--r--chromium/ui/display/display.h5
-rw-r--r--chromium/ui/display/display_features.cc15
-rw-r--r--chromium/ui/display/display_features.h9
-rw-r--r--chromium/ui/display/display_list.cc4
-rw-r--r--chromium/ui/display/display_list_unittest.cc10
-rw-r--r--chromium/ui/display/display_observer.h1
-rw-r--r--chromium/ui/display/fake/fake_display_delegate.cc3
-rw-r--r--chromium/ui/display/fake/fake_display_delegate.h3
-rw-r--r--chromium/ui/display/mac/display_link_mac.cc11
-rw-r--r--chromium/ui/display/mac/display_link_mac.h3
-rw-r--r--chromium/ui/display/manager/BUILD.gn2
-rw-r--r--chromium/ui/display/manager/configure_displays_task.cc84
-rw-r--r--chromium/ui/display/manager/configure_displays_task.h27
-rw-r--r--chromium/ui/display/manager/configure_displays_task_unittest.cc640
-rw-r--r--chromium/ui/display/manager/content_protection_manager.h6
-rw-r--r--chromium/ui/display/manager/display_change_observer.cc10
-rw-r--r--chromium/ui/display/manager/display_configurator.cc84
-rw-r--r--chromium/ui/display/manager/display_configurator.h24
-rw-r--r--chromium/ui/display/manager/display_configurator_unittest.cc474
-rw-r--r--chromium/ui/display/manager/display_layout_manager.h1
-rw-r--r--chromium/ui/display/manager/display_manager.cc33
-rw-r--r--chromium/ui/display/manager/display_manager_util.cc42
-rw-r--r--chromium/ui/display/manager/display_manager_util.h13
-rw-r--r--chromium/ui/display/manager/json_converter.cc97
-rw-r--r--chromium/ui/display/manager/json_converter.h15
-rw-r--r--chromium/ui/display/manager/json_converter_unittest.cc26
-rw-r--r--chromium/ui/display/manager/managed_display_info.cc97
-rw-r--r--chromium/ui/display/manager/managed_display_info.h46
-rw-r--r--chromium/ui/display/manager/managed_display_info_unittest.cc58
-rw-r--r--chromium/ui/display/manager/update_display_configuration_task.cc40
-rw-r--r--chromium/ui/display/manager/update_display_configuration_task.h25
-rw-r--r--chromium/ui/display/manager/update_display_configuration_task_unittest.cc116
-rw-r--r--chromium/ui/display/screen.cc25
-rw-r--r--chromium/ui/display/screen.h37
-rw-r--r--chromium/ui/display/types/display_constants.h27
-rw-r--r--chromium/ui/display/types/native_display_delegate.h11
-rw-r--r--chromium/ui/display/win/display_info.cc30
-rw-r--r--chromium/ui/display/win/display_info.h9
-rw-r--r--chromium/ui/display/win/scaling_util_unittest.cc3
-rw-r--r--chromium/ui/display/win/screen_win.cc25
-rw-r--r--chromium/ui/display/win/screen_win_display.cc1
-rw-r--r--chromium/ui/display/win/screen_win_unittest.cc6
-rw-r--r--chromium/ui/events/BUILD.gn4
-rw-r--r--chromium/ui/events/OWNERS1
-rw-r--r--chromium/ui/events/blink/web_input_event.cc4
-rw-r--r--chromium/ui/events/blink/web_input_event_builders_win_unittest.cc3
-rw-r--r--chromium/ui/events/blink/web_input_event_unittest.cc6
-rw-r--r--chromium/ui/events/event.cc60
-rw-r--r--chromium/ui/events/event.h45
-rw-r--r--chromium/ui/events/event_processor.cc9
-rw-r--r--chromium/ui/events/event_processor_unittest.cc120
-rw-r--r--chromium/ui/events/event_source.cc2
-rw-r--r--chromium/ui/events/event_switches.cc6
-rw-r--r--chromium/ui/events/event_switches.h3
-rw-r--r--chromium/ui/events/event_target.h3
-rw-r--r--chromium/ui/events/fuchsia/fakes/pointer_event_utility.cc11
-rw-r--r--chromium/ui/events/fuchsia/fakes/pointer_event_utility.h4
-rw-r--r--chromium/ui/events/fuchsia/input_event_dispatcher_unittest.cc2
-rw-r--r--chromium/ui/events/fuchsia/pointer_events_handler.cc55
-rw-r--r--chromium/ui/events/fuchsia/pointer_events_handler_unittest.cc229
-rw-r--r--chromium/ui/events/gestures/blink/BUILD.gn3
-rw-r--r--chromium/ui/events/keycodes/dom/dom_code.h1
-rw-r--r--chromium/ui/events/keycodes/dom/dom_codes_array.h (renamed from chromium/ui/events/keycodes/dom/dom_codes.h)9
-rw-r--r--chromium/ui/events/keycodes/dom/keycode_converter.cc4
-rw-r--r--chromium/ui/events/keycodes/keyboard_code_conversion_fuchsia.cc9
-rw-r--r--chromium/ui/events/mojom/mojom_traits_unittest.cc16
-rw-r--r--chromium/ui/events/ozone/evdev/BUILD.gn10
-rw-r--r--chromium/ui/events/ozone/evdev/DEPS2
-rw-r--r--chromium/ui/events/ozone/evdev/event_converter_evdev_impl.cc2
-rw-r--r--chromium/ui/events/ozone/evdev/event_converter_evdev_impl.h5
-rw-r--r--chromium/ui/events/ozone/evdev/event_converter_evdev_impl_unittest.cc2
-rw-r--r--chromium/ui/events/ozone/evdev/event_converter_test_util.cc3
-rw-r--r--chromium/ui/events/ozone/evdev/event_device_info.cc11
-rw-r--r--chromium/ui/events/ozone/evdev/event_factory_evdev.h7
-rw-r--r--chromium/ui/events/ozone/evdev/event_thread_evdev.cc7
-rw-r--r--chromium/ui/events/ozone/evdev/fake_keyboard_heuristic_metrics.cc2
-rw-r--r--chromium/ui/events/ozone/evdev/fake_keyboard_heuristic_metrics.h8
-rw-r--r--chromium/ui/events/ozone/evdev/gamepad_event_converter_evdev.cc2
-rw-r--r--chromium/ui/events/ozone/evdev/gamepad_event_converter_evdev.h3
-rw-r--r--chromium/ui/events/ozone/evdev/input_controller_evdev.h9
-rw-r--r--chromium/ui/events/ozone/evdev/input_device_factory_evdev.cc2
-rw-r--r--chromium/ui/events/ozone/evdev/input_device_factory_evdev.h3
-rw-r--r--chromium/ui/events/ozone/evdev/input_device_opener.h7
-rw-r--r--chromium/ui/events/ozone/evdev/input_device_opener_evdev.cc4
-rw-r--r--chromium/ui/events/ozone/evdev/input_injector_evdev.h3
-rw-r--r--chromium/ui/events/ozone/evdev/keyboard_evdev.h5
-rw-r--r--chromium/ui/events/ozone/evdev/microphone_mute_switch_event_converter_evdev.h3
-rw-r--r--chromium/ui/events/ozone/evdev/numberpad_metrics.h9
-rw-r--r--chromium/ui/events/ozone/evdev/numberpad_metrics_unittest.cc11
-rw-r--r--chromium/ui/events/ozone/evdev/stylus_button_event_converter_evdev.h3
-rw-r--r--chromium/ui/events/ozone/evdev/stylus_button_event_converter_evdev_unittest.cc2
-rw-r--r--chromium/ui/events/ozone/evdev/switches.cc14
-rw-r--r--chromium/ui/events/ozone/evdev/switches.h17
-rw-r--r--chromium/ui/events/ozone/evdev/tablet_event_converter_evdev.h5
-rw-r--r--chromium/ui/events/ozone/evdev/tablet_event_converter_evdev_unittest.cc2
-rw-r--r--chromium/ui/events/ozone/evdev/touch_event_converter_evdev.h4
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.cc26
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h9
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_unittest.cc3
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.cc113
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.h41
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util_unittest.cc241
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter.h3
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.cc15874
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.h9
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.cc15422
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.h40
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc38
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.h4
-rw-r--r--chromium/ui/events/ozone/events_ozone.cc7
-rw-r--r--chromium/ui/events/ozone/features.cc5
-rw-r--r--chromium/ui/events/ozone/features.h3
-rw-r--r--chromium/ui/events/ozone/keyboard/event_auto_repeat_handler.h3
-rw-r--r--chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h3
-rw-r--r--chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc5
-rw-r--r--chromium/ui/events/platform/x11/x11_event_source.h3
-rw-r--r--chromium/ui/events/platform/x11/x11_event_watcher_glib.cc10
-rw-r--r--chromium/ui/events/platform/x11/x11_event_watcher_glib.h5
-rw-r--r--chromium/ui/events/x/x11_event_translation.cc5
-rw-r--r--chromium/ui/file_manager/BUILD.gn237
-rw-r--r--chromium/ui/file_manager/audio_player/BUILD.gn50
-rw-r--r--chromium/ui/file_manager/audio_player/elements/BUILD.gn71
-rw-r--r--chromium/ui/file_manager/audio_player/js/BUILD.gn197
-rw-r--r--chromium/ui/file_manager/base/gn/BUILD.gn5
-rw-r--r--chromium/ui/file_manager/base/gn/js_test_gen_html.gni104
-rw-r--r--chromium/ui/file_manager/base/gn/js_test_type_check.gni74
-rw-r--r--chromium/ui/file_manager/file_manager/BUILD.gn14
-rw-r--r--chromium/ui/file_manager/file_manager/background/js/BUILD.gn113
-rw-r--r--chromium/ui/file_manager/file_manager/common/js/BUILD.gn78
-rw-r--r--chromium/ui/file_manager/file_manager/externs/ts/BUILD.gn13
-rw-r--r--chromium/ui/file_manager/file_manager/foreground/elements/BUILD.gn51
-rw-r--r--chromium/ui/file_manager/file_manager/foreground/js/BUILD.gn201
-rw-r--r--chromium/ui/file_manager/file_manager/foreground/js/metadata/BUILD.gn53
-rw-r--r--chromium/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn224
-rw-r--r--chromium/ui/file_manager/file_manager/foreground/js/ui/banners/BUILD.gn50
-rw-r--r--chromium/ui/file_manager/file_manager/foreground/js/ui/table/BUILD.gn2
-rw-r--r--chromium/ui/file_manager/file_names.gni168
-rw-r--r--chromium/ui/file_manager/image_loader/BUILD.gn36
-rw-r--r--chromium/ui/file_manager/integration_tests/BUILD.gn3
-rw-r--r--chromium/ui/file_manager/integration_tests/file_manager/BUILD.gn14
-rw-r--r--chromium/ui/gfx/BUILD.gn56
-rw-r--r--chromium/ui/gfx/DEPS1
-rw-r--r--chromium/ui/gfx/android/java_bitmap.cc2
-rw-r--r--chromium/ui/gfx/animation/BUILD.gn12
-rw-r--r--chromium/ui/gfx/animation/animation.cc10
-rw-r--r--chromium/ui/gfx/animation/animation_linux.cc10
-rw-r--r--chromium/ui/gfx/animation/animation_settings_provider_linux.cc30
-rw-r--r--chromium/ui/gfx/animation/animation_settings_provider_linux.h35
-rw-r--r--chromium/ui/gfx/animation/tween.cc32
-rw-r--r--chromium/ui/gfx/animation/tween.h3
-rw-r--r--chromium/ui/gfx/bidi_line_iterator.h1
-rw-r--r--chromium/ui/gfx/break_list.h103
-rw-r--r--chromium/ui/gfx/break_list_unittest.cc50
-rw-r--r--chromium/ui/gfx/canvas.cc2
-rw-r--r--chromium/ui/gfx/color_conversion_sk_filter_cache.cc43
-rw-r--r--chromium/ui/gfx/color_conversion_sk_filter_cache.h15
-rw-r--r--chromium/ui/gfx/color_space_win.cc2
-rw-r--r--chromium/ui/gfx/color_transform.cc166
-rw-r--r--chromium/ui/gfx/color_transform.h9
-rw-r--r--chromium/ui/gfx/color_transform_unittest.cc56
-rw-r--r--chromium/ui/gfx/delegated_ink_metadata.h3
-rw-r--r--chromium/ui/gfx/display_color_spaces.cc7
-rw-r--r--chromium/ui/gfx/display_color_spaces.h3
-rw-r--r--chromium/ui/gfx/font_fallback_linux.cc7
-rw-r--r--chromium/ui/gfx/font_render_params_linux.cc12
-rw-r--r--chromium/ui/gfx/font_render_params_linux_unittest.cc230
-rw-r--r--chromium/ui/gfx/geometry/linear_gradient.cc33
-rw-r--r--chromium/ui/gfx/geometry/linear_gradient.h13
-rw-r--r--chromium/ui/gfx/geometry/linear_gradient_unittest.cc32
-rw-r--r--chromium/ui/gfx/geometry/mask_filter_info.cc12
-rw-r--r--chromium/ui/gfx/geometry/mask_filter_info.h15
-rw-r--r--chromium/ui/gfx/geometry/matrix44.cc126
-rw-r--r--chromium/ui/gfx/geometry/matrix44.h63
-rw-r--r--chromium/ui/gfx/geometry/rect_f.cc14
-rw-r--r--chromium/ui/gfx/geometry/rect_f_unittest.cc29
-rw-r--r--chromium/ui/gfx/geometry/resize_utils.cc43
-rw-r--r--chromium/ui/gfx/geometry/resize_utils.h5
-rw-r--r--chromium/ui/gfx/geometry/resize_utils_unittest.cc27
-rw-r--r--chromium/ui/gfx/geometry/size.h4
-rw-r--r--chromium/ui/gfx/geometry/size_f.h9
-rw-r--r--chromium/ui/gfx/geometry/transform_util_unittest.cc2
-rw-r--r--chromium/ui/gfx/gpu_memory_buffer.cc2
-rw-r--r--chromium/ui/gfx/gpu_memory_buffer.h12
-rw-r--r--chromium/ui/gfx/hdr_metadata.h6
-rw-r--r--chromium/ui/gfx/icc_profile.cc2
-rw-r--r--chromium/ui/gfx/icc_profile.h2
-rw-r--r--chromium/ui/gfx/ipc/gfx_param_traits.cc7
-rw-r--r--chromium/ui/gfx/ipc/skia/gfx_skia_param_traits.cc8
-rw-r--r--chromium/ui/gfx/linux/client_native_pixmap_dmabuf.h3
-rw-r--r--chromium/ui/gfx/linux/fontconfig_util.cc3
-rw-r--r--chromium/ui/gfx/linux/gbm_wrapper.cc5
-rw-r--r--chromium/ui/gfx/mac/io_surface.cc13
-rw-r--r--chromium/ui/gfx/mac/io_surface_hdr_metadata.cc42
-rw-r--r--chromium/ui/gfx/mac/io_surface_hdr_metadata.h31
-rw-r--r--chromium/ui/gfx/mac/io_surface_unittest.cc24
-rw-r--r--chromium/ui/gfx/mojom/BUILD.gn3
-rw-r--r--chromium/ui/gfx/mojom/linear_gradient.mojom2
-rw-r--r--chromium/ui/gfx/mojom/linear_gradient_mojom_traits.cc2
-rw-r--r--chromium/ui/gfx/mojom/linear_gradient_mojom_traits.h6
-rw-r--r--chromium/ui/gfx/mojom/mask_filter_info.mojom5
-rw-r--r--chromium/ui/gfx/mojom/mask_filter_info_mojom_traits.cc10
-rw-r--r--chromium/ui/gfx/mojom/mask_filter_info_mojom_traits.h7
-rw-r--r--chromium/ui/gfx/mojom/mojom_traits_unittest.cc2
-rw-r--r--chromium/ui/gfx/mojom/native_handle_types.mojom7
-rw-r--r--chromium/ui/gfx/mojom/native_handle_types_mojom_traits.cc2
-rw-r--r--chromium/ui/gfx/mojom/native_handle_types_mojom_traits.h7
-rw-r--r--chromium/ui/gfx/overlay_plane_data.cc2
-rw-r--r--chromium/ui/gfx/overlay_plane_data.h4
-rw-r--r--chromium/ui/gfx/platform_font_skia.cc23
-rw-r--r--chromium/ui/gfx/platform_font_skia_unittest.cc49
-rw-r--r--chromium/ui/gfx/range/mojom/range_mojom_traits.h8
-rw-r--r--chromium/ui/gfx/range/mojom/range_mojom_traits_unittest.cc7
-rw-r--r--chromium/ui/gfx/range/range.cc3
-rw-r--r--chromium/ui/gfx/range/range.h31
-rw-r--r--chromium/ui/gfx/range/range_mac.mm2
-rw-r--r--chromium/ui/gfx/render_text.cc136
-rw-r--r--chromium/ui/gfx/render_text.h16
-rw-r--r--chromium/ui/gfx/render_text_api_fuzzer.cc140
-rw-r--r--chromium/ui/gfx/render_text_fuzzer.cc10
-rw-r--r--chromium/ui/gfx/render_text_harfbuzz.cc33
-rw-r--r--chromium/ui/gfx/render_text_unittest.cc37
-rw-r--r--chromium/ui/gfx/selection_model.cc2
-rw-r--r--chromium/ui/gfx/skia_font_delegate.cc23
-rw-r--r--chromium/ui/gfx/skia_font_delegate.h48
-rw-r--r--chromium/ui/gfx/skia_paint_util.cc4
-rw-r--r--chromium/ui/gfx/swap_result.h10
-rw-r--r--chromium/ui/gfx/win/hwnd_util.cc8
-rw-r--r--chromium/ui/gfx/win/hwnd_util.h5
-rw-r--r--chromium/ui/gfx/x/connection.h13
-rw-r--r--chromium/ui/gfx/x/event.h7
-rw-r--r--chromium/ui/gfx/x/keyboard_state.cc5
-rw-r--r--chromium/ui/gfx/x/property_cache.h3
-rw-r--r--chromium/ui/gfx/x/property_cache_unittest.cc3
-rw-r--r--chromium/ui/gfx/x/scoped_ignore_errors.h3
-rw-r--r--chromium/ui/gfx/x/window_cache.h5
-rw-r--r--chromium/ui/gfx/x/window_cache_unittest.cc3
-rw-r--r--chromium/ui/gfx/x/x11_atom_cache.h3
-rw-r--r--chromium/ui/gfx/x/xlib_support.cc20
-rw-r--r--chromium/ui/gfx/x/xlib_support.h5
-rw-r--r--chromium/ui/gfx/x/xproto_internal.cc6
-rw-r--r--chromium/ui/gfx/x/xproto_internal.h11
-rw-r--r--chromium/ui/gfx/x/xproto_types.h3
-rw-r--r--chromium/ui/gl/BUILD.gn2
-rw-r--r--chromium/ui/gl/EGL/eglextchromium.h50
-rw-r--r--chromium/ui/gl/OWNERS3
-rw-r--r--chromium/ui/gl/android/scoped_java_surface.cc5
-rw-r--r--chromium/ui/gl/ca_renderer_layer_params.cc2
-rw-r--r--chromium/ui/gl/ca_renderer_layer_params.h4
-rw-r--r--chromium/ui/gl/dc_layer_tree.cc10
-rw-r--r--chromium/ui/gl/dc_renderer_layer_params.h2
-rw-r--r--chromium/ui/gl/delegated_ink_point_renderer_gpu_unittest.cc3
-rw-r--r--chromium/ui/gl/direct_composition_child_surface_win.cc58
-rw-r--r--chromium/ui/gl/direct_composition_support.cc788
-rw-r--r--chromium/ui/gl/direct_composition_support.h169
-rw-r--r--chromium/ui/gl/direct_composition_surface_win.cc802
-rw-r--r--chromium/ui/gl/direct_composition_surface_win.h100
-rw-r--r--chromium/ui/gl/direct_composition_surface_win_unittest.cc30
-rw-r--r--chromium/ui/gl/egl_api_unittest.cc14
-rw-r--r--chromium/ui/gl/features.gni2
-rwxr-xr-xchromium/ui/gl/generate_bindings.py48
-rw-r--r--chromium/ui/gl/gl_angle_util_vulkan.cc5
-rw-r--r--chromium/ui/gl/gl_angle_util_win.cc5
-rw-r--r--chromium/ui/gl/gl_bindings.cc13
-rw-r--r--chromium/ui/gl/gl_bindings.h5
-rw-r--r--chromium/ui/gl/gl_bindings_autogen_egl.cc21
-rw-r--r--chromium/ui/gl/gl_bindings_autogen_egl.h29
-rw-r--r--chromium/ui/gl/gl_context.cc8
-rw-r--r--chromium/ui/gl/gl_context.h7
-rw-r--r--chromium/ui/gl/gl_context_cgl.cc5
-rw-r--r--chromium/ui/gl/gl_context_egl.cc53
-rw-r--r--chromium/ui/gl/gl_context_egl.h4
-rw-r--r--chromium/ui/gl/gl_context_glx.h5
-rw-r--r--chromium/ui/gl/gl_display.cc1020
-rw-r--r--chromium/ui/gl/gl_display.h134
-rw-r--r--chromium/ui/gl/gl_display_manager.cc4
-rw-r--r--chromium/ui/gl/gl_display_manager.h14
-rw-r--r--chromium/ui/gl/gl_egl_api_implementation.cc3
-rw-r--r--chromium/ui/gl/gl_enums_implementation_autogen.h4
-rw-r--r--chromium/ui/gl/gl_fence.cc42
-rw-r--r--chromium/ui/gl/gl_fence_egl.cc4
-rw-r--r--chromium/ui/gl/gl_gl_api_implementation.cc44
-rw-r--r--chromium/ui/gl/gl_gl_api_implementation.h1
-rw-r--r--chromium/ui/gl/gl_glx_api_implementation.h7
-rw-r--r--chromium/ui/gl/gl_image.h6
-rw-r--r--chromium/ui/gl/gl_image_d3d.cc7
-rw-r--r--chromium/ui/gl/gl_image_dxgi.cc31
-rw-r--r--chromium/ui/gl/gl_image_egl.cc7
-rw-r--r--chromium/ui/gl/gl_image_glx_native_pixmap.cc69
-rw-r--r--chromium/ui/gl/gl_image_io_surface.mm6
-rw-r--r--chromium/ui/gl/gl_image_io_surface_egl.mm6
-rw-r--r--chromium/ui/gl/gl_image_native_pixmap.cc63
-rw-r--r--chromium/ui/gl/gl_image_native_pixmap.h1
-rw-r--r--chromium/ui/gl/gl_image_native_pixmap_unittest.cc10
-rw-r--r--chromium/ui/gl/gl_implementation.cc17
-rw-r--r--chromium/ui/gl/gl_implementation.h6
-rw-r--r--chromium/ui/gl/gl_surface.cc1
-rw-r--r--chromium/ui/gl/gl_surface.h3
-rw-r--r--chromium/ui/gl/gl_surface_egl.cc1060
-rw-r--r--chromium/ui/gl/gl_surface_egl.h29
-rw-r--r--chromium/ui/gl/gl_surface_egl_surface_control.cc6
-rw-r--r--chromium/ui/gl/gl_surface_egl_unittest.cc9
-rw-r--r--chromium/ui/gl/gl_surface_egl_x11_gles2.cc2
-rw-r--r--chromium/ui/gl/gl_surface_glx.cc7
-rw-r--r--chromium/ui/gl/gl_surface_glx.h3
-rw-r--r--chromium/ui/gl/gl_switches.cc32
-rw-r--r--chromium/ui/gl/gl_switches.h6
-rw-r--r--chromium/ui/gl/gl_utils.cc46
-rw-r--r--chromium/ui/gl/gl_utils.h19
-rw-r--r--chromium/ui/gl/glx_util.cc59
-rw-r--r--chromium/ui/gl/glx_util.h9
-rw-r--r--chromium/ui/gl/gpu_switching_manager.cc4
-rw-r--r--chromium/ui/gl/gpu_switching_manager.h3
-rw-r--r--chromium/ui/gl/gpu_switching_observer.h2
-rw-r--r--chromium/ui/gl/hdr_metadata_helper_win.cc13
-rw-r--r--chromium/ui/gl/hdr_metadata_helper_win.h9
-rw-r--r--chromium/ui/gl/init/create_gr_gl_interface.cc27
-rw-r--r--chromium/ui/gl/init/gl_factory.cc12
-rw-r--r--chromium/ui/gl/init/gl_factory.h7
-rw-r--r--chromium/ui/gl/init/gl_factory_android.cc17
-rw-r--r--chromium/ui/gl/init/gl_factory_mac.cc22
-rw-r--r--chromium/ui/gl/init/gl_factory_ozone.cc14
-rw-r--r--chromium/ui/gl/init/gl_factory_win.cc22
-rw-r--r--chromium/ui/gl/init/gl_initializer_android.cc23
-rw-r--r--chromium/ui/gl/init/gl_initializer_mac.cc32
-rw-r--r--chromium/ui/gl/init/gl_initializer_ozone.cc4
-rw-r--r--chromium/ui/gl/init/gl_initializer_win.cc27
-rw-r--r--chromium/ui/gl/swap_chain_presenter.cc40
-rw-r--r--chromium/ui/gl/swap_chain_presenter.h2
-rw-r--r--chromium/ui/gl/vsync_thread_win.cc5
-rw-r--r--chromium/ui/gtk/BUILD.gn5
-rw-r--r--chromium/ui/gtk/DEPS1
-rw-r--r--chromium/ui/gtk/gtk_compat.cc40
-rw-r--r--chromium/ui/gtk/gtk_key_bindings_handler.h7
-rw-r--r--chromium/ui/gtk/gtk_ui.cc165
-rw-r--r--chromium/ui/gtk/gtk_ui.h49
-rw-r--r--chromium/ui/gtk/gtk_ui_factory.cc2
-rw-r--r--chromium/ui/gtk/gtk_ui_factory.h6
-rw-r--r--chromium/ui/gtk/gtk_ui_platform.h11
-rw-r--r--chromium/ui/gtk/gtk_ui_platform_stub.cc6
-rw-r--r--chromium/ui/gtk/gtk_ui_platform_stub.h3
-rw-r--r--chromium/ui/gtk/gtk_util.cc4
-rw-r--r--chromium/ui/gtk/gtk_util.h7
-rw-r--r--chromium/ui/gtk/input_method_context_impl_gtk.cc126
-rw-r--r--chromium/ui/gtk/input_method_context_impl_gtk.h37
-rw-r--r--chromium/ui/gtk/native_theme_gtk.cc80
-rw-r--r--chromium/ui/gtk/native_theme_gtk.h23
-rw-r--r--chromium/ui/gtk/nav_button_provider_gtk.cc91
-rw-r--r--chromium/ui/gtk/nav_button_provider_gtk.h21
-rw-r--r--chromium/ui/gtk/printing/print_dialog_gtk.cc7
-rw-r--r--chromium/ui/gtk/printing/print_dialog_gtk.h17
-rw-r--r--chromium/ui/gtk/settings_provider_gsettings.cc12
-rw-r--r--chromium/ui/gtk/settings_provider_gsettings.h3
-rw-r--r--chromium/ui/gtk/settings_provider_gtk.cc26
-rw-r--r--chromium/ui/gtk/settings_provider_gtk.h20
-rw-r--r--chromium/ui/gtk/wayland/gtk_ui_platform_wayland.cc14
-rw-r--r--chromium/ui/gtk/wayland/gtk_ui_platform_wayland.h6
-rw-r--r--chromium/ui/gtk/window_frame_provider_gtk.h8
-rw-r--r--chromium/ui/gtk/x/gtk_event_loop_x11.cc6
-rw-r--r--chromium/ui/gtk/x/gtk_event_loop_x11.h3
-rw-r--r--chromium/ui/gtk/x/gtk_ui_platform_x11.cc9
-rw-r--r--chromium/ui/gtk/x/gtk_ui_platform_x11.h8
-rw-r--r--chromium/ui/latency/OWNERS1
-rw-r--r--chromium/ui/latency/latency_tracker.cc2
-rw-r--r--chromium/ui/linux/BUILD.gn81
-rw-r--r--chromium/ui/linux/DEPS (renamed from chromium/ui/views/linux_ui/DEPS)9
-rw-r--r--chromium/ui/linux/OWNERS (renamed from chromium/ui/views/linux_ui/OWNERS)0
-rw-r--r--chromium/ui/linux/cursor_theme_manager_observer.h (renamed from chromium/ui/base/cursor/cursor_theme_manager_observer.h)6
-rw-r--r--chromium/ui/linux/device_scale_factor_observer.h (renamed from chromium/ui/views/linux_ui/device_scale_factor_observer.h)12
-rw-r--r--chromium/ui/linux/fake_linux_ui.cc146
-rw-r--r--chromium/ui/linux/fake_linux_ui.h67
-rw-r--r--chromium/ui/linux/linux_ui.cc (renamed from chromium/ui/views/linux_ui/linux_ui.cc)93
-rw-r--r--chromium/ui/linux/linux_ui.h (renamed from chromium/ui/views/linux_ui/linux_ui.h)158
-rw-r--r--chromium/ui/linux/linux_ui_base.cc20
-rw-r--r--chromium/ui/linux/linux_ui_base.h23
-rw-r--r--chromium/ui/linux/linux_ui_delegate.cc (renamed from chromium/ui/base/linux/linux_ui_delegate.cc)2
-rw-r--r--chromium/ui/linux/linux_ui_delegate.h (renamed from chromium/ui/base/linux/linux_ui_delegate.h)13
-rw-r--r--chromium/ui/linux/linux_ui_delegate_stub.cc (renamed from chromium/ui/base/linux/linux_ui_delegate_stub.cc)2
-rw-r--r--chromium/ui/linux/linux_ui_delegate_stub.h (renamed from chromium/ui/base/linux/linux_ui_delegate_stub.h)10
-rw-r--r--chromium/ui/linux/linux_ui_factory.cc (renamed from chromium/ui/views/linux_ui/linux_ui_factory.cc)27
-rw-r--r--chromium/ui/linux/linux_ui_factory.h (renamed from chromium/ui/views/linux_ui/linux_ui_factory.h)16
-rw-r--r--chromium/ui/linux/nav_button_provider.h (renamed from chromium/ui/views/linux_ui/nav_button_provider.h)32
-rw-r--r--chromium/ui/linux/status_icon_linux.cc (renamed from chromium/ui/views/linux_ui/status_icon_linux.cc)6
-rw-r--r--chromium/ui/linux/status_icon_linux.h (renamed from chromium/ui/views/linux_ui/status_icon_linux.h)19
-rw-r--r--chromium/ui/linux/window_button_order_observer.h (renamed from chromium/ui/views/linux_ui/window_button_order_observer.h)12
-rw-r--r--chromium/ui/linux/window_frame_provider.h (renamed from chromium/ui/views/linux_ui/window_frame_provider.h)10
-rw-r--r--chromium/ui/lottie/animation.cc267
-rw-r--r--chromium/ui/lottie/animation.h146
-rw-r--r--chromium/ui/lottie/animation_observer.h11
-rw-r--r--chromium/ui/lottie/animation_unittest.cc729
-rw-r--r--chromium/ui/message_center/BUILD.gn7
-rw-r--r--chromium/ui/message_center/message_center_impl.cc27
-rw-r--r--chromium/ui/message_center/public/cpp/notification.h13
-rw-r--r--chromium/ui/message_center/public/cpp/notification_types.h3
-rw-r--r--chromium/ui/message_center/public/cpp/notifier_id.cc13
-rw-r--r--chromium/ui/message_center/public/cpp/notifier_id.h4
-rw-r--r--chromium/ui/message_center/views/message_popup_collection_unittest.cc7
-rw-r--r--chromium/ui/message_center/views/message_view.cc1
-rw-r--r--chromium/ui/message_center/views/message_view.h5
-rw-r--r--chromium/ui/message_center/views/notification_header_view.cc34
-rw-r--r--chromium/ui/message_center/views/notification_header_view.h10
-rw-r--r--chromium/ui/message_center/views/notification_header_view_unittest.cc42
-rw-r--r--chromium/ui/message_center/views/notification_view_base.cc20
-rw-r--r--chromium/ui/message_center/views/notification_view_base.h2
-rw-r--r--chromium/ui/message_center/views/notification_view_base_unittest.cc23
-rw-r--r--chromium/ui/message_center/views/notification_view_unittest.cc40
-rw-r--r--chromium/ui/message_center/views/notification_view_util.cc2
-rw-r--r--chromium/ui/native_theme/caption_style.h1
-rw-r--r--chromium/ui/native_theme/caption_style_mac.mm11
-rw-r--r--chromium/ui/native_theme/native_theme.cc6
-rw-r--r--chromium/ui/native_theme/native_theme.h43
-rw-r--r--chromium/ui/native_theme/native_theme_aura.cc4
-rw-r--r--chromium/ui/native_theme/native_theme_base.cc7
-rw-r--r--chromium/ui/native_theme/native_theme_mac.mm26
-rw-r--r--chromium/ui/native_theme/native_theme_win.cc10
-rw-r--r--chromium/ui/native_theme/native_theme_win.h5
-rw-r--r--chromium/ui/native_theme/scrollbar_animator_mac.h3
-rw-r--r--chromium/ui/ozone/BUILD.gn2
-rw-r--r--chromium/ui/ozone/common/BUILD.gn2
-rw-r--r--chromium/ui/ozone/common/bitmap_cursor.h3
-rw-r--r--chromium/ui/ozone/common/gl_ozone_egl.cc29
-rw-r--r--chromium/ui/ozone/common/gl_ozone_egl.h12
-rw-r--r--chromium/ui/ozone/common/gl_surface_egl_readback.cc4
-rw-r--r--chromium/ui/ozone/common/gl_surface_egl_readback.h2
-rw-r--r--chromium/ui/ozone/common/native_pixmap_egl_binding.cc42
-rw-r--r--chromium/ui/ozone/common/native_pixmap_egl_binding.h30
-rw-r--r--chromium/ui/ozone/demo/demo_window.h5
-rw-r--r--chromium/ui/ozone/demo/gl_renderer.cc1
-rw-r--r--chromium/ui/ozone/demo/simple_renderer_factory.cc27
-rw-r--r--chromium/ui/ozone/demo/simple_renderer_factory.h5
-rw-r--r--chromium/ui/ozone/demo/skia/skia_gl_renderer.cc1
-rw-r--r--chromium/ui/ozone/demo/skia/skia_renderer_factory.cc20
-rw-r--r--chromium/ui/ozone/demo/skia/skia_renderer_factory.h7
-rw-r--r--chromium/ui/ozone/demo/surfaceless_gl_renderer.cc1
-rw-r--r--chromium/ui/ozone/demo/vulkan_overlay_renderer.h5
-rw-r--r--chromium/ui/ozone/demo/vulkan_renderer.h3
-rw-r--r--chromium/ui/ozone/demo/window_manager.cc3
-rw-r--r--chromium/ui/ozone/gl/gl_image_ozone_native_pixmap_unittest.cc10
-rw-r--r--chromium/ui/ozone/platform/README2
-rw-r--r--chromium/ui/ozone/platform/cast/gl_ozone_egl_cast.cc7
-rw-r--r--chromium/ui/ozone/platform/cast/gl_ozone_egl_cast.h2
-rw-r--r--chromium/ui/ozone/platform/cast/gl_surface_cast.cc5
-rw-r--r--chromium/ui/ozone/platform/cast/gl_surface_cast.h5
-rw-r--r--chromium/ui/ozone/platform/cast/ozone_platform_cast.cc4
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_device.cc4
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_device.h2
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.cc16
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h3
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_overlay_manager.cc54
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_overlay_manager_unittest.cc63
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc3
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_thread.cc6
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_thread.h1
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_window_unittest.cc6
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc37
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc8
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.h1
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.cc10
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc16
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/mock_drm_device.cc34
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/mock_drm_device.h6
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/screen_manager.cc92
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/screen_manager.h20
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc199
-rw-r--r--chromium/ui/ozone/platform/drm/host/drm_display_host_manager.cc59
-rw-r--r--chromium/ui/ozone/platform/drm/host/drm_display_host_manager.h3
-rw-r--r--chromium/ui/ozone/platform/drm/host/drm_native_display_delegate.cc6
-rw-r--r--chromium/ui/ozone/platform/drm/host/drm_native_display_delegate.h3
-rw-r--r--chromium/ui/ozone/platform/drm/host/drm_window_host.cc3
-rw-r--r--chromium/ui/ozone/platform/drm/host/gpu_thread_adapter.h3
-rw-r--r--chromium/ui/ozone/platform/drm/host/host_drm_device.cc6
-rw-r--r--chromium/ui/ozone/platform/drm/host/host_drm_device.h3
-rw-r--r--chromium/ui/ozone/platform/drm/mojom/drm_device.mojom6
-rw-r--r--chromium/ui/ozone/platform/drm/ozone_platform_drm.cc6
-rw-r--r--chromium/ui/ozone/platform/drm/test/vkms_tests.cc3
-rw-r--r--chromium/ui/ozone/platform/flatland/BUILD.gn2
-rw-r--r--chromium/ui/ozone/platform/flatland/flatland_surface.cc7
-rw-r--r--chromium/ui/ozone/platform/flatland/flatland_surface_factory.cc13
-rw-r--r--chromium/ui/ozone/platform/flatland/flatland_surface_unittest.cc6
-rw-r--r--chromium/ui/ozone/platform/flatland/flatland_sysmem_buffer_collection.cc35
-rw-r--r--chromium/ui/ozone/platform/flatland/flatland_sysmem_buffer_collection.h10
-rw-r--r--chromium/ui/ozone/platform/flatland/flatland_sysmem_native_pixmap.cc13
-rw-r--r--chromium/ui/ozone/platform/flatland/flatland_sysmem_native_pixmap.h10
-rw-r--r--chromium/ui/ozone/platform/flatland/flatland_window.cc6
-rw-r--r--chromium/ui/ozone/platform/flatland/overlay_manager_flatland.cc56
-rw-r--r--chromium/ui/ozone/platform/flatland/overlay_manager_flatland.h29
-rw-r--r--chromium/ui/ozone/platform/flatland/ozone_platform_flatland.cc8
-rw-r--r--chromium/ui/ozone/platform/flatland/vulkan_implementation_flatland.cc70
-rw-r--r--chromium/ui/ozone/platform/flatland/vulkan_implementation_flatland.h1
-rw-r--r--chromium/ui/ozone/platform/headless/BUILD.gn2
-rw-r--r--chromium/ui/ozone/platform/headless/headless_surface_factory.cc21
-rw-r--r--chromium/ui/ozone/platform/headless/headless_surface_factory.h4
-rw-r--r--chromium/ui/ozone/platform/headless/headless_window.h3
-rw-r--r--chromium/ui/ozone/platform/headless/ozone_platform_headless.cc4
-rw-r--r--chromium/ui/ozone/platform/headless/vulkan_implementation_headless.cc36
-rw-r--r--chromium/ui/ozone/platform/headless/vulkan_implementation_headless.h12
-rw-r--r--chromium/ui/ozone/platform/scenic/BUILD.gn15
-rw-r--r--chromium/ui/ozone/platform/scenic/ozone_platform_scenic.cc5
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_overlay_view.cc25
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_overlay_view.h16
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_surface.cc2
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc12
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_window.cc27
-rw-r--r--chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc24
-rw-r--r--chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h5
-rw-r--r--chromium/ui/ozone/platform/scenic/sysmem_native_pixmap.cc23
-rw-r--r--chromium/ui/ozone/platform/scenic/sysmem_native_pixmap.h8
-rw-r--r--chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc108
-rw-r--r--chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/BUILD.gn33
-rw-r--r--chromium/ui/ozone/platform/wayland/DEPS1
-rw-r--r--chromium/ui/ozone/platform/wayland/common/wayland_object.cc57
-rw-r--r--chromium/ui/ozone/platform/wayland/common/wayland_object.h7
-rw-r--r--chromium/ui/ozone/platform/wayland/common/wayland_overlay_config.cc2
-rw-r--r--chromium/ui/ozone/platform/wayland/common/wayland_overlay_config.h6
-rw-r--r--chromium/ui/ozone/platform/wayland/common/wayland_util.cc6
-rw-r--r--chromium/ui/ozone/platform/wayland/common/wayland_util.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/emulate/wayland_input_emulate.cc269
-rw-r--r--chromium/ui/ozone/platform/wayland/emulate/wayland_input_emulate.h89
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc5
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.h14
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.cc8
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.h6
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/gl_surface_wayland.cc4
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/gl_surface_wayland.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc18
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.h5
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc6
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.h9
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/wayland_overlay_candidates.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/wayland_overlay_manager.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc58
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory.h5
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory_unittest.cc58
-rw-r--r--chromium/ui/ozone/platform/wayland/host/DEPS1
-rw-r--r--chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/linux_ui_delegate_wayland.cc2
-rw-r--r--chromium/ui/ozone/platform/wayland/host/linux_ui_delegate_wayland.h5
-rw-r--r--chromium/ui/ozone/platform/wayland/host/org_gnome_mutter_idle_monitor.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/org_kde_kwin_idle.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/proxy/wayland_proxy.h19
-rw-r--r--chromium/ui/ozone/platform/wayland/host/proxy/wayland_proxy_impl.cc29
-rw-r--r--chromium/ui/ozone/platform/wayland/host/proxy/wayland_proxy_impl.h11
-rw-r--r--chromium/ui/ozone/platform/wayland/host/shell_popup_wrapper.h7
-rw-r--r--chromium/ui/ozone/platform/wayland/host/shell_toplevel_wrapper.h9
-rw-r--r--chromium/ui/ozone/platform/wayland/host/surface_augmenter.cc2
-rw-r--r--chromium/ui/ozone/platform/wayland/host/surface_augmenter.h2
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing.cc8
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing.h15
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.cc22
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.h1
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.cc7
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_solid_color.cc5
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_solid_color.h4
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_buffer_factory.cc82
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_buffer_factory.h91
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_buffer_handle.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_connector.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc29
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h9
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_clipboard.cc5
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_clipboard.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_clipboard_unittest.cc9
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_connection.cc24
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_connection.h43
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_connection_test_api.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_cursor.cc10
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_cursor.h9
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_cursor_factory.cc10
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_cursor_factory.h12
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_device.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_device_base.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_device_manager.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller.cc11
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller.h21
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller_unittest.cc46
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_source.h5
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_drm.cc13
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_drm.h6
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_event_source.cc430
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_event_source.h99
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_event_source_unittest.cc42
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_event_watcher.h5
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_event_watcher_glib.cc10
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_event_watcher_glib.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_exchange_data_provider_unittest.cc2
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_frame_manager.cc181
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_frame_manager.h16
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_input_controller.cc3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.cc133
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.h37
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_input_method_context_factory.cc39
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_input_method_context_factory.h43
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_input_method_context_unittest.cc155
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_keyboard.cc7
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_keyboard.h7
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_keyboard_unittest.cc124
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_menu_utils.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_output.cc30
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_output.h19
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_output_manager.cc43
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_output_manager.h12
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_pointer.cc31
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_pointer.h15
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_pointer_unittest.cc35
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_popup.cc79
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_popup.h15
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_screen.cc70
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_screen.h43
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc478
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_seat.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_shm.cc7
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_shm.h8
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_shm_buffer.cc14
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_shm_buffer.h6
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_subsurface.h5
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_surface.cc42
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_surface.h13
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc100
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.h22
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_touch.cc47
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_touch.h22
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_touch_unittest.cc104
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window.cc230
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window.h109
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc59
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.h21
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc53
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_factory.cc5
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_manager.cc73
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_manager.h18
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_manager_unittests.cc63
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_observer.cc2
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_observer.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_unittest.cc965
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zaura_output_unittest.cc3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell.cc4
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell_unittest.cc8
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.cc64
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.h47
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_management_surface.cc48
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_management_surface.h43
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_manager.cc60
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_manager.h52
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_space.cc128
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_space.h85
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_space_creator.cc48
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_space_creator.h40
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zcr_touchpad_haptics.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.cc15
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.h7
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zwp_pointer_constraints.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zwp_pointer_gestures.h5
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zwp_pointer_gestures_unittest.cc29
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zwp_relative_pointer_manager.h5
-rw-r--r--chromium/ui/ozone/platform/wayland/host/xdg_activation.cc144
-rw-r--r--chromium/ui/ozone/platform/wayland/host/xdg_activation.h55
-rw-r--r--chromium/ui/ozone/platform/wayland/host/xdg_foreign_wrapper.cc5
-rw-r--r--chromium/ui/ozone/platform/wayland/host/xdg_output.cc13
-rw-r--r--chromium/ui/ozone/platform/wayland/host/xdg_output.h4
-rw-r--r--chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.cc18
-rw-r--r--chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.h9
-rw-r--r--chromium/ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.cc4
-rw-r--r--chromium/ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.h5
-rw-r--r--chromium/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.cc69
-rw-r--r--chromium/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.h15
-rw-r--r--chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper.h28
-rw-r--r--chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.cc78
-rw-r--r--chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.h31
-rw-r--r--chromium/ui/ozone/platform/wayland/host/zxdg_popup_v6_wrapper_impl.cc11
-rw-r--r--chromium/ui/ozone/platform/wayland/host/zxdg_popup_v6_wrapper_impl.h7
-rw-r--r--chromium/ui/ozone/platform/wayland/host/zxdg_surface_v6_wrapper_impl.cc11
-rw-r--r--chromium/ui/ozone/platform/wayland/host/zxdg_surface_v6_wrapper_impl.h5
-rw-r--r--chromium/ui/ozone/platform/wayland/host/zxdg_toplevel_v6_wrapper_impl.cc8
-rw-r--r--chromium/ui/ozone/platform/wayland/host/zxdg_toplevel_v6_wrapper_impl.h8
-rw-r--r--chromium/ui/ozone/platform/wayland/mojom/DEPS2
-rw-r--r--chromium/ui/ozone/platform/wayland/mojom/wayland_buffer_manager.mojom4
-rw-r--r--chromium/ui/ozone/platform/wayland/mojom/wayland_overlay_config.mojom8
-rw-r--r--chromium/ui/ozone/platform/wayland/mojom/wayland_overlay_config_mojom_traits.cc3
-rw-r--r--chromium/ui/ozone/platform/wayland/mojom/wayland_overlay_config_mojom_traits.h10
-rw-r--r--chromium/ui/ozone/platform/wayland/ozone_platform_wayland.cc32
-rw-r--r--chromium/ui/ozone/platform/wayland/test/global_object.h8
-rw-r--r--chromium/ui/ozone/platform/wayland/test/mock_surface.h19
-rw-r--r--chromium/ui/ozone/platform/wayland/test/mock_wayland_platform_window_delegate.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.cc2
-rw-r--r--chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/test/mock_xdg_surface.cc14
-rw-r--r--chromium/ui/ozone/platform/wayland/test/mock_xdg_surface.h8
-rw-r--r--chromium/ui/ozone/platform/wayland/test/mock_zaura_shell.cc49
-rw-r--r--chromium/ui/ozone/platform/wayland/test/server_object.h4
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_alpha_blending.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_augmented_subsurface.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_augmented_surface.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_data_device.cc3
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_data_device.h7
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_data_device_manager.h5
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_data_offer.cc3
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_data_source.cc3
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_output.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_overlay_prioritized_surface.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_seat.h7
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_selection_device_manager.h15
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_subsurface.h8
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_touch.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_viewport.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_wayland_server_thread.cc2
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_wayland_server_thread.h10
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_wp_pointer_gestures.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_xdg_popup.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_zaura_popup.cc46
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_zaura_popup.h29
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_zaura_surface.cc170
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_zaura_surface.h29
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_zaura_toplevel.cc108
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_zaura_toplevel.h29
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_zcr_text_input_extension.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_zwp_linux_buffer_params.h5
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_zwp_linux_explicit_synchronization.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/test/test_zwp_text_input_manager.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/test/wayland_drag_drop_test.cc2
-rw-r--r--chromium/ui/ozone/platform/wayland/test/wayland_drag_drop_test.h9
-rw-r--r--chromium/ui/ozone/platform/wayland/test/wayland_ozone_ui_controls_test_helper.cc208
-rw-r--r--chromium/ui/ozone/platform/wayland/test/wayland_ozone_ui_controls_test_helper.h7
-rw-r--r--chromium/ui/ozone/platform/wayland/test/wayland_test.cc26
-rw-r--r--chromium/ui/ozone/platform/wayland/test/wayland_test.h9
-rw-r--r--chromium/ui/ozone/platform/wayland/wayland_buffer_manager_unittest.cc330
-rw-r--r--chromium/ui/ozone/platform/wayland/wayland_utils.h6
-rw-r--r--chromium/ui/ozone/platform/x11/BUILD.gn14
-rw-r--r--chromium/ui/ozone/platform/x11/DEPS1
-rw-r--r--chromium/ui/ozone/platform/x11/gl_ozone_glx.cc21
-rw-r--r--chromium/ui/ozone/platform/x11/gl_ozone_glx.h12
-rw-r--r--chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.cc6
-rw-r--r--chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.h6
-rw-r--r--chromium/ui/ozone/platform/x11/linux_ui_delegate_x11.h2
-rw-r--r--chromium/ui/ozone/platform/x11/native_pixmap_egl_x11_binding.cc45
-rw-r--r--chromium/ui/ozone/platform/x11/native_pixmap_egl_x11_binding.h29
-rw-r--r--chromium/ui/ozone/platform/x11/native_pixmap_glx_binding.cc41
-rw-r--r--chromium/ui/ozone/platform/x11/native_pixmap_glx_binding.h31
-rw-r--r--chromium/ui/ozone/platform/x11/ozone_platform_x11.cc16
-rw-r--r--chromium/ui/ozone/platform/x11/test/device_data_manager_x11_unittest.cc3
-rw-r--r--chromium/ui/ozone/platform/x11/test/x11_drag_drop_client_unittest.cc9
-rw-r--r--chromium/ui/ozone/platform/x11/test/x11_window_unittest.cc36
-rw-r--r--chromium/ui/ozone/platform/x11/x11_screen_ozone.cc33
-rw-r--r--chromium/ui/ozone/platform/x11/x11_screen_ozone.h26
-rw-r--r--chromium/ui/ozone/platform/x11/x11_surface_factory.cc49
-rw-r--r--chromium/ui/ozone/platform/x11/x11_window.cc99
-rw-r--r--chromium/ui/ozone/platform/x11/x11_window.h31
-rw-r--r--chromium/ui/ozone/platform/x11/x11_window_manager.cc4
-rw-r--r--chromium/ui/ozone/platform/x11/x11_window_manager.h5
-rw-r--r--chromium/ui/ozone/platform/x11/x11_window_ozone_unittest.cc6
-rw-r--r--chromium/ui/ozone/public/gl_ozone.h22
-rw-r--r--chromium/ui/ozone/public/hardware_capabilities.h5
-rw-r--r--chromium/ui/ozone/public/native_pixmap_gl_binding.cc54
-rw-r--r--chromium/ui/ozone/public/native_pixmap_gl_binding.h40
-rw-r--r--chromium/ui/ozone/public/overlay_surface_candidate.cc5
-rw-r--r--chromium/ui/ozone/public/overlay_surface_candidate.h3
-rw-r--r--chromium/ui/ozone/public/ozone_platform.h9
-rw-r--r--chromium/ui/ozone/public/ozone_ui_controls_test_helper.h9
-rw-r--r--chromium/ui/ozone/public/platform_global_shortcut_listener.h3
-rw-r--r--chromium/ui/ozone/public/platform_screen.cc24
-rw-r--r--chromium/ui/ozone/public/platform_screen.h38
-rw-r--r--chromium/ui/ozone/public/surface_factory_ozone.cc5
-rw-r--r--chromium/ui/ozone/public/surface_factory_ozone.h4
-rw-r--r--chromium/ui/ozone/test/mock_platform_window_delegate.cc6
-rw-r--r--chromium/ui/ozone/test/mock_platform_window_delegate.h6
-rw-r--r--chromium/ui/platform_window/extensions/wayland_extension.h4
-rw-r--r--chromium/ui/platform_window/platform_window_delegate.cc9
-rw-r--r--chromium/ui/platform_window/platform_window_delegate.h13
-rw-r--r--chromium/ui/platform_window/platform_window_init_properties.h10
-rw-r--r--chromium/ui/platform_window/stub/stub_window.cc3
-rw-r--r--chromium/ui/platform_window/win/win_window.cc3
-rw-r--r--chromium/ui/qt/BUILD.gn9
-rw-r--r--chromium/ui/qt/DEPS4
-rw-r--r--chromium/ui/qt/qt_interface.h10
-rw-r--r--chromium/ui/qt/qt_shim.cc73
-rw-r--r--chromium/ui/qt/qt_shim.h15
-rw-r--r--chromium/ui/qt/qt_shim_moc.cc29
-rw-r--r--chromium/ui/qt/qt_ui.cc233
-rw-r--r--chromium/ui/qt/qt_ui.h57
-rw-r--r--chromium/ui/resources/BUILD.gn10
-rw-r--r--chromium/ui/shell_dialogs/BUILD.gn9
-rw-r--r--chromium/ui/shell_dialogs/DEPS3
-rw-r--r--chromium/ui/shell_dialogs/select_file_dialog.h2
-rw-r--r--chromium/ui/shell_dialogs/select_file_dialog_lacros.h3
-rw-r--r--chromium/ui/shell_dialogs/select_file_dialog_linux_portal.cc2
-rw-r--r--chromium/ui/shell_dialogs/select_file_dialog_linux_portal.h5
-rw-r--r--chromium/ui/shell_dialogs/select_file_dialog_mac.h3
-rw-r--r--chromium/ui/shell_dialogs/select_file_dialog_mac_unittest.mm6
-rw-r--r--chromium/ui/shell_dialogs/shell_dialog_linux.cc47
-rw-r--r--chromium/ui/shell_dialogs/shell_dialog_linux.h42
-rw-r--r--chromium/ui/snapshot/BUILD.gn13
-rw-r--r--chromium/ui/snapshot/snapshot_mac_unittest.mm4
-rw-r--r--chromium/ui/strings/app_locale_settings.grd2
-rw-r--r--chromium/ui/strings/translations/app_locale_settings_am.xtb2
-rw-r--r--chromium/ui/strings/translations/app_locale_settings_ar.xtb2
-rw-r--r--chromium/ui/strings/translations/app_locale_settings_bn.xtb2
-rw-r--r--chromium/ui/strings/translations/app_locale_settings_he.xtb2
-rw-r--r--chromium/ui/strings/translations/app_locale_settings_hi.xtb2
-rw-r--r--chromium/ui/strings/translations/app_locale_settings_ja.xtb2
-rw-r--r--chromium/ui/strings/translations/app_locale_settings_kn.xtb2
-rw-r--r--chromium/ui/strings/translations/app_locale_settings_ko.xtb2
-rw-r--r--chromium/ui/strings/translations/app_locale_settings_ml.xtb2
-rw-r--r--chromium/ui/strings/translations/app_locale_settings_mr.xtb2
-rw-r--r--chromium/ui/strings/translations/app_locale_settings_ta.xtb2
-rw-r--r--chromium/ui/strings/translations/app_locale_settings_te.xtb2
-rw-r--r--chromium/ui/strings/translations/app_locale_settings_th.xtb2
-rw-r--r--chromium/ui/strings/translations/app_locale_settings_zh-CN.xtb2
-rw-r--r--chromium/ui/strings/translations/app_locale_settings_zh-TW.xtb2
-rw-r--r--chromium/ui/strings/translations/ax_strings_am.xtb2
-rw-r--r--chromium/ui/strings/translations/ui_strings_af.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_am.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ar.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_as.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_az.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_be.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_bg.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_bn.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_bs.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ca.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_cs.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_cy.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_da.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_de.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_el.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_en-GB.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_es-419.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_es.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_et.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_eu.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_fa.xtb6
-rw-r--r--chromium/ui/strings/translations/ui_strings_fi.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_fil.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_fr-CA.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_fr.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_gl.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_gu.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_hi.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_hr.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_hu.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_hy.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_id.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_is.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_it.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_iw.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ja.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ka.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_kk.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_km.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_kn.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ko.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ky.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_lo.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_lt.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_lv.xtb6
-rw-r--r--chromium/ui/strings/translations/ui_strings_mk.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ml.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_mn.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_mr.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ms.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_my.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ne.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_nl.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_no.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_or.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_pa.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_pl.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_pt-BR.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_pt-PT.xtb6
-rw-r--r--chromium/ui/strings/translations/ui_strings_ro.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ru.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_si.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_sk.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_sl.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_sq.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_sr-Latn.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_sr.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_sv.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_sw.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ta.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_te.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_th.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_tr.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_uk.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ur.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_uz.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_vi.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_zh-CN.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_zh-HK.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_zh-TW.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_zu.xtb4
-rw-r--r--chromium/ui/strings/ui_strings.grd12
-rw-r--r--chromium/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_FLOAT_ON_TOP.png.sha11
-rw-r--r--chromium/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_FULL.png.sha11
-rw-r--r--chromium/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_HALF.png.sha11
-rw-r--r--chromium/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_PARTIAL.png.sha11
-rw-r--r--chromium/ui/touch_selection/touch_handle.h2
-rw-r--r--chromium/ui/touch_selection/touch_handle_drawable_aura.h2
-rw-r--r--chromium/ui/views/BUILD.gn70
-rw-r--r--chromium/ui/views/DEPS2
-rw-r--r--chromium/ui/views/OWNERS2
-rw-r--r--chromium/ui/views/accessibility/accessibility_paint_checks.cc29
-rw-r--r--chromium/ui/views/accessibility/accessibility_paint_checks.h6
-rw-r--r--chromium/ui/views/accessibility/accessibility_paint_checks_unittest.cc61
-rw-r--r--chromium/ui/views/accessibility/ax_aura_obj_cache_unittest.cc50
-rw-r--r--chromium/ui/views/accessibility/ax_tree_source_views_unittest.cc10
-rw-r--r--chromium/ui/views/accessibility/ax_virtual_view.cc12
-rw-r--r--chromium/ui/views/accessibility/view_accessibility.cc154
-rw-r--r--chromium/ui/views/accessibility/view_accessibility.h71
-rw-r--r--chromium/ui/views/accessibility/view_ax_platform_node_delegate.cc14
-rw-r--r--chromium/ui/views/accessibility/view_ax_platform_node_delegate_auralinux.cc3
-rw-r--r--chromium/ui/views/accessibility/view_ax_platform_node_delegate_auralinux_unittest.cc44
-rw-r--r--chromium/ui/views/accessibility/view_ax_platform_node_delegate_mac_unittest.cc127
-rw-r--r--chromium/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc117
-rw-r--r--chromium/ui/views/accessibility/view_ax_platform_node_delegate_win_unittest.cc85
-rw-r--r--chromium/ui/views/accessibility/views_ax_tree_manager.cc46
-rw-r--r--chromium/ui/views/accessibility/views_ax_tree_manager.h17
-rw-r--r--chromium/ui/views/accessibility/views_ax_tree_manager_unittest.cc55
-rw-r--r--chromium/ui/views/accessible_pane_view_unittest.cc3
-rw-r--r--chromium/ui/views/animation/animation_builder.h16
-rw-r--r--chromium/ui/views/animation/animation_delegate_views.cc5
-rw-r--r--chromium/ui/views/animation/animation_delegate_views.h3
-rw-r--r--chromium/ui/views/animation/bounds_animator.cc25
-rw-r--r--chromium/ui/views/animation/bounds_animator.h4
-rw-r--r--chromium/ui/views/animation/bounds_animator_unittest.cc45
-rw-r--r--chromium/ui/views/animation/ink_drop_event_handler.cc2
-rw-r--r--chromium/ui/views/bubble/bubble_border.cc13
-rw-r--r--chromium/ui/views/bubble/bubble_dialog_delegate_view.cc22
-rw-r--r--chromium/ui/views/bubble/bubble_dialog_delegate_view.h7
-rw-r--r--chromium/ui/views/bubble/bubble_dialog_model_host.cc45
-rw-r--r--chromium/ui/views/bubble/bubble_frame_view.cc106
-rw-r--r--chromium/ui/views/bubble/bubble_frame_view.h10
-rw-r--r--chromium/ui/views/cascading_property.cc23
-rw-r--r--chromium/ui/views/cascading_property.h5
-rw-r--r--chromium/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm38
-rw-r--r--chromium/ui/views/cocoa/bridged_native_widget_unittest.mm69
-rw-r--r--chromium/ui/views/cocoa/drag_drop_client_mac.h4
-rw-r--r--chromium/ui/views/cocoa/drag_drop_client_mac_unittest.mm14
-rw-r--r--chromium/ui/views/cocoa/immersive_mode_delegate_mac.h14
-rw-r--r--chromium/ui/views/cocoa/native_widget_mac_event_monitor.h3
-rw-r--r--chromium/ui/views/cocoa/native_widget_mac_ns_window_host.h18
-rw-r--r--chromium/ui/views/cocoa/native_widget_mac_ns_window_host.mm67
-rw-r--r--chromium/ui/views/cocoa/text_input_host.h7
-rw-r--r--chromium/ui/views/cocoa/text_input_host.mm2
-rw-r--r--chromium/ui/views/cocoa/tooltip_manager_mac.h3
-rw-r--r--chromium/ui/views/color_chooser/color_chooser_view.cc4
-rw-r--r--chromium/ui/views/color_chooser/color_chooser_view.h11
-rw-r--r--chromium/ui/views/controls/animated_image_view.cc22
-rw-r--r--chromium/ui/views/controls/animated_image_view.h16
-rw-r--r--chromium/ui/views/controls/animated_image_view_unittest.cc8
-rw-r--r--chromium/ui/views/controls/button/label_button_unittest.cc26
-rw-r--r--chromium/ui/views/controls/combobox/combobox.cc389
-rw-r--r--chromium/ui/views/controls/combobox/combobox.h73
-rw-r--r--chromium/ui/views/controls/combobox/combobox_menu_model.cc105
-rw-r--r--chromium/ui/views/controls/combobox/combobox_menu_model.h54
-rw-r--r--chromium/ui/views/controls/combobox/combobox_unittest.cc245
-rw-r--r--chromium/ui/views/controls/combobox/empty_combobox_model.cc8
-rw-r--r--chromium/ui/views/controls/combobox/empty_combobox_model.h6
-rw-r--r--chromium/ui/views/controls/editable_combobox/editable_combobox.cc51
-rw-r--r--chromium/ui/views/controls/editable_combobox/editable_combobox.h8
-rw-r--r--chromium/ui/views/controls/editable_combobox/editable_combobox_unittest.cc44
-rw-r--r--chromium/ui/views/controls/focus_ring.cc50
-rw-r--r--chromium/ui/views/controls/focus_ring.h14
-rw-r--r--chromium/ui/views/controls/image_view.cc8
-rw-r--r--chromium/ui/views/controls/image_view_unittest.cc10
-rw-r--r--chromium/ui/views/controls/label.cc43
-rw-r--r--chromium/ui/views/controls/label.h12
-rw-r--r--chromium/ui/views/controls/label_unittest.cc36
-rw-r--r--chromium/ui/views/controls/link.cc5
-rw-r--r--chromium/ui/views/controls/link.h5
-rw-r--r--chromium/ui/views/controls/link_fragment.cc88
-rw-r--r--chromium/ui/views/controls/link_fragment.h57
-rw-r--r--chromium/ui/views/controls/link_fragment_unittest.cc140
-rw-r--r--chromium/ui/views/controls/menu/menu_closure_animation_mac.h5
-rw-r--r--chromium/ui/views/controls/menu/menu_controller.cc167
-rw-r--r--chromium/ui/views/controls/menu/menu_controller.h11
-rw-r--r--chromium/ui/views/controls/menu/menu_controller_unittest.cc91
-rw-r--r--chromium/ui/views/controls/menu/menu_insertion_delegate_win.h2
-rw-r--r--chromium/ui/views/controls/menu/menu_item_view.cc48
-rw-r--r--chromium/ui/views/controls/menu/menu_item_view.h22
-rw-r--r--chromium/ui/views/controls/menu/menu_item_view_unittest.cc18
-rw-r--r--chromium/ui/views/controls/menu/menu_model_adapter.cc34
-rw-r--r--chromium/ui/views/controls/menu/menu_model_adapter.h8
-rw-r--r--chromium/ui/views/controls/menu/menu_model_adapter_unittest.cc70
-rw-r--r--chromium/ui/views/controls/menu/menu_pre_target_handler_mac.h3
-rw-r--r--chromium/ui/views/controls/menu/menu_runner_cocoa_unittest.mm12
-rw-r--r--chromium/ui/views/controls/menu/menu_runner_impl_cocoa.mm21
-rw-r--r--chromium/ui/views/controls/menu/native_menu_win.cc40
-rw-r--r--chromium/ui/views/controls/menu/native_menu_win.h16
-rw-r--r--chromium/ui/views/controls/menu/submenu_view.cc21
-rw-r--r--chromium/ui/views/controls/menu/submenu_view.h10
-rw-r--r--chromium/ui/views/controls/native/native_view_host_mac.h5
-rw-r--r--chromium/ui/views/controls/prefix_delegate.h9
-rw-r--r--chromium/ui/views/controls/prefix_selector.cc19
-rw-r--r--chromium/ui/views/controls/prefix_selector.h8
-rw-r--r--chromium/ui/views/controls/prefix_selector_unittest.cc22
-rw-r--r--chromium/ui/views/controls/progress_bar.cc12
-rw-r--r--chromium/ui/views/controls/progress_bar.h7
-rw-r--r--chromium/ui/views/controls/scroll_view.cc1
-rw-r--r--chromium/ui/views/controls/scroll_view_unittest.cc106
-rw-r--r--chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.mm4
-rw-r--r--chromium/ui/views/controls/separator.cc18
-rw-r--r--chromium/ui/views/controls/separator.h9
-rw-r--r--chromium/ui/views/controls/separator_unittest.cc152
-rw-r--r--chromium/ui/views/controls/styled_label.cc48
-rw-r--r--chromium/ui/views/controls/styled_label.h14
-rw-r--r--chromium/ui/views/controls/styled_label_unittest.cc78
-rw-r--r--chromium/ui/views/controls/tabbed_pane/tabbed_pane.cc60
-rw-r--r--chromium/ui/views/controls/tabbed_pane/tabbed_pane.h8
-rw-r--r--chromium/ui/views/controls/tabbed_pane/tabbed_pane_accessibility_mac_unittest.mm6
-rw-r--r--chromium/ui/views/controls/table/table_grouper.h6
-rw-r--r--chromium/ui/views/controls/table/table_header.cc76
-rw-r--r--chromium/ui/views/controls/table/table_header.h10
-rw-r--r--chromium/ui/views/controls/table/table_utils.cc28
-rw-r--r--chromium/ui/views/controls/table/table_utils.h13
-rw-r--r--chromium/ui/views/controls/table/table_view.cc453
-rw-r--r--chromium/ui/views/controls/table/table_view.h79
-rw-r--r--chromium/ui/views/controls/table/table_view_unittest.cc292
-rw-r--r--chromium/ui/views/controls/table/test_table_model.cc8
-rw-r--r--chromium/ui/views/controls/table/test_table_model.h10
-rw-r--r--chromium/ui/views/controls/textfield/textfield.cc74
-rw-r--r--chromium/ui/views/controls/textfield/textfield.h21
-rw-r--r--chromium/ui/views/controls/textfield/textfield_model.cc8
-rw-r--r--chromium/ui/views/controls/textfield/textfield_model.h2
-rw-r--r--chromium/ui/views/controls/textfield/textfield_model_unittest.cc4
-rw-r--r--chromium/ui/views/controls/textfield/textfield_unittest.cc112
-rw-r--r--chromium/ui/views/controls/tree/tree_view.cc65
-rw-r--r--chromium/ui/views/controls/tree/tree_view.h10
-rw-r--r--chromium/ui/views/controls/tree/tree_view_unittest.cc50
-rw-r--r--chromium/ui/views/controls/webview/webview_unittest.cc18
-rw-r--r--chromium/ui/views/corewm/cursor_height_provider_win.cc38
-rw-r--r--chromium/ui/views/corewm/tooltip_aura.cc2
-rw-r--r--chromium/ui/views/corewm/tooltip_controller.cc4
-rw-r--r--chromium/ui/views/corewm/tooltip_controller.h3
-rw-r--r--chromium/ui/views/corewm/tooltip_win.cc4
-rw-r--r--chromium/ui/views/debug_utils.cc36
-rw-r--r--chromium/ui/views/debug_utils.h8
-rw-r--r--chromium/ui/views/examples/BUILD.gn7
-rw-r--r--chromium/ui/views/examples/animation_example.cc6
-rw-r--r--chromium/ui/views/examples/box_layout_example.cc10
-rw-r--r--chromium/ui/views/examples/combobox_example.cc9
-rw-r--r--chromium/ui/views/examples/designer_example.cc20
-rw-r--r--chromium/ui/views/examples/designer_example.h10
-rw-r--r--chromium/ui/views/examples/dialog_example.cc4
-rw-r--r--chromium/ui/views/examples/example_combobox_model.cc6
-rw-r--r--chromium/ui/views/examples/example_combobox_model.h8
-rw-r--r--chromium/ui/views/examples/examples_color_id.h2
-rw-r--r--chromium/ui/views/examples/examples_window.cc10
-rw-r--r--chromium/ui/views/examples/examples_with_content_main.cc9
-rw-r--r--chromium/ui/views/examples/flex_layout_example.cc7
-rw-r--r--chromium/ui/views/examples/label_example.cc8
-rw-r--r--chromium/ui/views/examples/login_bubble_dialog_example.cc6
-rw-r--r--chromium/ui/views/examples/multiline_example.cc2
-rw-r--r--chromium/ui/views/examples/notification_example.cc2
-rw-r--r--chromium/ui/views/examples/table_example.cc31
-rw-r--r--chromium/ui/views/examples/table_example.h12
-rw-r--r--chromium/ui/views/examples/text_example.cc10
-rw-r--r--chromium/ui/views/focus/focus_manager.cc80
-rw-r--r--chromium/ui/views/focus/focus_manager_unittest.cc73
-rw-r--r--chromium/ui/views/focus/focus_traversal_unittest.cc11
-rw-r--r--chromium/ui/views/highlight_border.cc61
-rw-r--r--chromium/ui/views/highlight_border.h18
-rw-r--r--chromium/ui/views/interaction/element_tracker_views_unittest.cc4
-rw-r--r--chromium/ui/views/interaction/interaction_sequence_views_unittest.cc2
-rw-r--r--chromium/ui/views/layout/animating_layout_manager.cc4
-rw-r--r--chromium/ui/views/layout/box_layout.h2
-rw-r--r--chromium/ui/views/layout/composite_layout_tests.cc8
-rw-r--r--chromium/ui/views/layout/flex_layout.cc2
-rw-r--r--chromium/ui/views/layout/layout_manager_base.cc2
-rw-r--r--chromium/ui/views/layout/table_layout.cc34
-rw-r--r--chromium/ui/views/layout/table_layout.h3
-rw-r--r--chromium/ui/views/layout/table_layout_unittest.cc66
-rw-r--r--chromium/ui/views/linux_ui/BUILD.gn22
-rw-r--r--chromium/ui/views/metadata/view_factory.h8
-rw-r--r--chromium/ui/views/metrics_aura.cc11
-rw-r--r--chromium/ui/views/selection_controller.cc2
-rw-r--r--chromium/ui/views/selection_controller.h2
-rw-r--r--chromium/ui/views/style/platform_style.cc4
-rw-r--r--chromium/ui/views/style/platform_style_mac.mm11
-rw-r--r--chromium/ui/views/style/typography.h8
-rw-r--r--chromium/ui/views/style/typography_provider.cc14
-rw-r--r--chromium/ui/views/style/typography_provider.h3
-rw-r--r--chromium/ui/views/test/ui_controls_factory_desktop_aura_ozone.cc42
-rw-r--r--chromium/ui/views/touchui/OWNERS1
-rw-r--r--chromium/ui/views/touchui/touch_selection_menu_views.h2
-rw-r--r--chromium/ui/views/vector_icons/drag_general_selection.icon94
-rw-r--r--chromium/ui/views/vector_icons/drag_image_selection.icon59
-rw-r--r--chromium/ui/views/view.cc69
-rw-r--r--chromium/ui/views/view.h52
-rw-r--r--chromium/ui/views/view_model.cc39
-rw-r--r--chromium/ui/views/view_model.h36
-rw-r--r--chromium/ui/views/view_model_unittest.cc8
-rw-r--r--chromium/ui/views/view_model_utils.cc18
-rw-r--r--chromium/ui/views/view_model_utils.h12
-rw-r--r--chromium/ui/views/view_model_utils_unittest.cc32
-rw-r--r--chromium/ui/views/view_targeter_unittest.cc229
-rw-r--r--chromium/ui/views/view_unittest.cc525
-rw-r--r--chromium/ui/views/view_unittest_mac.mm8
-rw-r--r--chromium/ui/views/widget/ax_native_widget_mac_unittest.mm7
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.h9
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc21
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager.cc2
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager.h4
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager_win.cc3
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc7
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_native_widget_aura.h10
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_screen_ozone_linux.cc (renamed from chromium/ui/views/widget/desktop_aura/desktop_screen_linux.cc)20
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc9
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc48
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h2
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_impl_interactive_uitest.cc13
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc5
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc4
-rw-r--r--chromium/ui/views/widget/desktop_aura/window_event_filter_lacros.h5
-rw-r--r--chromium/ui/views/widget/desktop_aura/window_event_filter_linux.cc32
-rw-r--r--chromium/ui/views/widget/desktop_aura/window_event_filter_linux.h5
-rw-r--r--chromium/ui/views/widget/drop_helper.h2
-rw-r--r--chromium/ui/views/widget/native_widget_aura.h2
-rw-r--r--chromium/ui/views/widget/native_widget_aura_unittest.cc282
-rw-r--r--chromium/ui/views/widget/native_widget_mac.h11
-rw-r--r--chromium/ui/views/widget/native_widget_mac.mm11
-rw-r--r--chromium/ui/views/widget/native_widget_mac_interactive_uitest.mm4
-rw-r--r--chromium/ui/views/widget/native_widget_mac_unittest.mm130
-rw-r--r--chromium/ui/views/widget/root_view.cc7
-rw-r--r--chromium/ui/views/widget/unique_widget_ptr.cc94
-rw-r--r--chromium/ui/views/widget/unique_widget_ptr.h50
-rw-r--r--chromium/ui/views/widget/widget.cc4
-rw-r--r--chromium/ui/views/widget/widget.h15
-rw-r--r--chromium/ui/views/widget/widget_delegate.cc16
-rw-r--r--chromium/ui/views/widget/widget_delegate.h10
-rw-r--r--chromium/ui/views/widget/widget_delegate_unittest.cc16
-rw-r--r--chromium/ui/views/widget/widget_hwnd_utils.cc10
-rw-r--r--chromium/ui/views/widget/widget_interactive_uitest.cc408
-rw-r--r--chromium/ui/views/widget/widget_unittest.cc149
-rw-r--r--chromium/ui/views/widget/widget_utils_mac.h3
-rw-r--r--chromium/ui/views/widget/widget_utils_mac.mm7
-rw-r--r--chromium/ui/views/widget/window_reorderer.h2
-rw-r--r--chromium/ui/views/widget/window_reorderer_unittest.cc8
-rw-r--r--chromium/ui/views/win/hwnd_message_handler.cc85
-rw-r--r--chromium/ui/views/win/hwnd_message_handler.h9
-rw-r--r--chromium/ui/views/win/hwnd_util_aurawin.cc6
-rw-r--r--chromium/ui/views/win/pen_event_processor.cc3
-rw-r--r--chromium/ui/views/win/pen_event_processor.h2
-rw-r--r--chromium/ui/views/window/client_view.h2
-rw-r--r--chromium/ui/views/window/dialog_client_view.cc2
-rw-r--r--chromium/ui/views/window/frame_caption_button.cc25
-rw-r--r--chromium/ui/views/window/frame_caption_button.h6
-rw-r--r--chromium/ui/views/window/non_client_view.h4
-rw-r--r--chromium/ui/views_content_client/views_content_client.h2
-rw-r--r--chromium/ui/views_content_client/views_content_client_main_parts_mac.mm1
-rw-r--r--chromium/ui/views_content_client/views_content_main_delegate.cc13
-rw-r--r--chromium/ui/views_content_client/views_content_main_delegate.h4
-rw-r--r--chromium/ui/web_dialogs/web_dialog_ui.cc12
-rw-r--r--chromium/ui/web_dialogs/web_dialog_ui.h4
-rw-r--r--chromium/ui/webui/BUILD.gn2
-rw-r--r--chromium/ui/webui/PLATFORM_OWNERS2
-rw-r--r--chromium/ui/webui/resources/BUILD.gn248
-rw-r--r--chromium/ui/webui/resources/cr_components/BUILD.gn3
-rw-r--r--chromium/ui/webui/resources/cr_components/app_management/BUILD.gn57
-rw-r--r--chromium/ui/webui/resources/cr_components/app_management/app_management.mojom1
-rw-r--r--chromium/ui/webui/resources/cr_components/app_management/app_management_mojom_traits.cc9
-rw-r--r--chromium/ui/webui/resources/cr_components/app_management/app_management_mojom_traits.h14
-rw-r--r--chromium/ui/webui/resources/cr_components/app_management/file_handling_item.ts8
-rw-r--r--chromium/ui/webui/resources/cr_components/app_management/more_permissions_item.ts4
-rw-r--r--chromium/ui/webui/resources/cr_components/app_management/permission_constants.ts2
-rw-r--r--chromium/ui/webui/resources/cr_components/app_management/permission_item.ts29
-rw-r--r--chromium/ui/webui/resources/cr_components/app_management/permission_util.ts14
-rw-r--r--chromium/ui/webui/resources/cr_components/app_management/run_on_os_login_item.ts71
-rw-r--r--chromium/ui/webui/resources/cr_components/app_management/toggle_row.ts4
-rw-r--r--chromium/ui/webui/resources/cr_components/app_management/uninstall_button.ts27
-rw-r--r--chromium/ui/webui/resources/cr_components/app_management/util.ts19
-rw-r--r--chromium/ui/webui/resources/cr_components/app_management/window_mode_item.ts61
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/BUILD.gn59
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.ts10
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.ts6
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_entry.ts2
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_list.html2
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_list.ts14
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.gni4
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.html2
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.ts13
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager_types.ts34
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.ts10
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.ts10
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_browser_proxy.ts30
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_details_dialog.ts9
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_entry.ts6
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_list.ts8
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.ts6
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificates_browser_proxy.ts68
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.ts6
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/bluetooth/BUILD.gn8
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_base_page.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_battery_icon_percentage.js16
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_dialog.js6
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_metrics_utils.js25
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_confirm_code_page.js4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_enter_code_page.html2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_enter_code_page.js26
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_request_code_page.js4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_ui.html2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_ui.js14
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_spinner_page.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn3
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page.js10
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/base_page.js4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/base_page.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.js4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_eid_dialog.js5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_eid_dialog.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.js4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup_delegate.m.d.ts8
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup_icons.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_types.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_manager_listener_behavior.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_manager_utils.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_page.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_page.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/provisioning_page.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/provisioning_page.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/setup_loading_page.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/webview_post_util.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/BUILD.gn1
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/button_bar.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/fake_mojo_service.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/BUILD.gn101
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/OWNERS1
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/cellular_utils.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_indicator_mojo.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_indicator_mojo.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/mojo_interface_provider.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_apnlist.js14
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_apnlist.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.js4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_config.js16
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_config.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_config_input.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_config_toggle.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_icon.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_icon.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_ip_config.js10
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_ip_config.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_list.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.html2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.js40
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_list_types.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_listener_behavior.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.js10
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.js8
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy.js4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_exclusions.js6
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_input.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_shared_css.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_siminfo.html16
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_siminfo.js51
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_siminfo.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js25
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.html27
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.js91
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.m.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics.js26
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics_types.js4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.js6
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/os_cr_components.gni11
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/BUILD.gn4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/lock_screen_constants.js8
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/setup_pin_keyboard.js4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/smb_shares/BUILD.gn7
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/smb_shares/add_smb_share_dialog.js8
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/traffic_counters/traffic_counters.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/traffic_counters/traffic_counters_adapter.d.ts5
-rw-r--r--chromium/ui/webui/resources/cr_components/color_change_listener/BUILD.gn5
-rw-r--r--chromium/ui/webui/resources/cr_components/color_change_listener/colors_css_updater.ts7
-rw-r--r--chromium/ui/webui/resources/cr_components/customize_themes/BUILD.gn51
-rw-r--r--chromium/ui/webui/resources/cr_components/customize_themes/customize_themes.html3
-rw-r--r--chromium/ui/webui/resources/cr_components/customize_themes/customize_themes.ts8
-rw-r--r--chromium/ui/webui/resources/cr_components/help_bubble/BUILD.gn78
-rw-r--r--chromium/ui/webui/resources/cr_components/help_bubble/COMMON_METADATA3
-rw-r--r--chromium/ui/webui/resources/cr_components/help_bubble/DIR_METADATA (renamed from chromium/ui/aura/cursor/DIR_METADATA)4
-rw-r--r--chromium/ui/webui/resources/cr_components/help_bubble/OWNERS6
-rw-r--r--chromium/ui/webui/resources/cr_components/help_bubble/README.md80
-rw-r--r--chromium/ui/webui/resources/cr_components/help_bubble/help_bubble.gni27
-rw-r--r--chromium/ui/webui/resources/cr_components/help_bubble/help_bubble.html239
-rw-r--r--chromium/ui/webui/resources/cr_components/help_bubble/help_bubble.mojom105
-rw-r--r--chromium/ui/webui/resources/cr_components/help_bubble/help_bubble.ts336
-rw-r--r--chromium/ui/webui/resources/cr_components/help_bubble/help_bubble_mixin.ts308
-rw-r--r--chromium/ui/webui/resources/cr_components/help_bubble/help_bubble_proxy.ts40
-rw-r--r--chromium/ui/webui/resources/cr_components/help_bubble/tsconfig_base.json9
-rw-r--r--chromium/ui/webui/resources/cr_components/history_clusters/BUILD.gn53
-rw-r--r--chromium/ui/webui/resources/cr_components/history_clusters/cluster.html42
-rw-r--r--chromium/ui/webui/resources/cr_components/history_clusters/cluster.ts25
-rw-r--r--chromium/ui/webui/resources/cr_components/history_clusters/clusters.html5
-rw-r--r--chromium/ui/webui/resources/cr_components/history_clusters/clusters.ts36
-rw-r--r--chromium/ui/webui/resources/cr_components/history_clusters/history_clusters.gni1
-rw-r--r--chromium/ui/webui/resources/cr_components/history_clusters/history_clusters.mojom22
-rw-r--r--chromium/ui/webui/resources/cr_components/history_clusters/menu_container.ts6
-rw-r--r--chromium/ui/webui/resources/cr_components/history_clusters/open_window_proxy.ts30
-rw-r--r--chromium/ui/webui/resources/cr_components/history_clusters/search_query.ts17
-rw-r--r--chromium/ui/webui/resources/cr_components/history_clusters/shared_vars.css5
-rw-r--r--chromium/ui/webui/resources/cr_components/history_clusters/url_visit.html2
-rw-r--r--chromium/ui/webui/resources/cr_components/history_clusters/url_visit.ts42
-rw-r--r--chromium/ui/webui/resources/cr_components/iph_bubble/iph_bubble.html79
-rw-r--r--chromium/ui/webui/resources/cr_components/iph_bubble/iph_bubble.ts190
-rw-r--r--chromium/ui/webui/resources/cr_components/localized_link/localized_link.ts4
-rw-r--r--chromium/ui/webui/resources/cr_components/managed_dialog/managed_dialog.ts6
-rw-r--r--chromium/ui/webui/resources/cr_components/managed_footnote/managed_footnote.ts2
-rw-r--r--chromium/ui/webui/resources/cr_components/most_visited/BUILD.gn21
-rw-r--r--chromium/ui/webui/resources/cr_components/most_visited/most_visited.html26
-rw-r--r--chromium/ui/webui/resources/cr_components/most_visited/most_visited.ts22
-rw-r--r--chromium/ui/webui/resources/cr_elements/BUILD.gn308
-rw-r--r--chromium/ui/webui/resources/cr_elements/README.md7
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/BUILD.gn12
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/BUILD.gn66
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.html152
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.js214
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_list.html100
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_list.js330
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.html72
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.js185
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_types.html1
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_types.js38
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/icons.html11
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/icons.js9
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/png.html2
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/png.js539
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/webcam_utils.js181
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/os_cr_elements.gni11
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html16
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.ts52
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_button/BUILD.gn28
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_button/cr_button.d.ts (renamed from chromium/ui/webui/resources/cr_elements/cr_button/cr_button.m.d.ts)0
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_button/cr_button.html21
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_button/cr_button.js18
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_checkbox/BUILD.gn37
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html33
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.js165
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.m.d.ts22
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.ts192
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_dialog/BUILD.gn33
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.d.ts (renamed from chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.m.d.ts)6
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html22
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.js248
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_elements.gni128
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_expand_button/BUILD.gn35
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.html13
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.js131
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.m.d.ts21
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.ts172
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_fingerprint/BUILD.gn52
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_icon.html3
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.html11
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.m.d.ts41
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.ts (renamed from chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.js)361
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc_externs.js22
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_icon_button/BUILD.gn23
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.d.ts (renamed from chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.m.d.ts)0
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html24
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.js153
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_input/BUILD.gn38
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_input/cr_input.d.ts (renamed from chromium/ui/webui/resources/cr_elements/cr_input/cr_input.m.d.ts)0
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_input/cr_input.html14
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_input/cr_input.js15
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_input/cr_input_style.css (renamed from chromium/ui/webui/resources/cr_elements/cr_input/cr_input_style_css.html)17
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_lazy_render/BUILD.gn36
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_lazy_render/cr_lazy_render.html8
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_lazy_render/cr_lazy_render.js73
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_lazy_render/cr_lazy_render.m.d.ts19
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_lazy_render/cr_lazy_render.ts81
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.html2
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.ts4
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_lottie/cr_lottie.js4
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_lottie/cr_lottie.m.d.ts4
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_menu_selector/cr_menu_selector.ts2
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.ts18
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_radio_button/BUILD.gn85
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.d.ts (renamed from chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.m.d.ts)9
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.html13
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.js34
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.d.ts (renamed from chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.m.d.ts)8
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.html13
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.js34
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_behavior.d.ts (renamed from chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_behavior.m.d.ts)0
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_behavior.js12
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_style.css (renamed from chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_style_css.html)20
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_radio_group/BUILD.gn46
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.d.ts (renamed from chromium/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.m.d.ts)0
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.html11
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.js282
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.ts264
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_search_field/cr_search_field.ts8
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_search_field/cr_search_field_mixin.ts2
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.ts4
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_slider/cr_slider.ts14
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_splitter/cr_splitter.ts23
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_tab_box/cr_tab_box.html2
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_tab_box/cr_tab_box.ts6
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.html13
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.ts6
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toggle/BUILD.gn25
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.d.ts (renamed from chromium/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.m.d.ts)0
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html22
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.js187
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.ts2
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.ts4
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.ts6
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree.ts27
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree_base.ts4
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.html27
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.ts92
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_view_manager/cr_view_manager.ts6
-rw-r--r--chromium/ui/webui/resources/cr_elements/find_shortcut_behavior.d.ts2
-rw-r--r--chromium/ui/webui/resources/cr_elements/find_shortcut_behavior.js2
-rw-r--r--chromium/ui/webui/resources/cr_elements/find_shortcut_mixin.ts4
-rw-r--r--chromium/ui/webui/resources/cr_elements/icons.html4
-rw-r--r--chromium/ui/webui/resources/cr_elements/md_select_css.html8
-rw-r--r--chromium/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.js2
-rw-r--r--chromium/ui/webui/resources/cr_elements/policy/cr_tooltip_icon.html9
-rw-r--r--chromium/ui/webui/resources/cr_elements/policy/cr_tooltip_icon.js2
-rw-r--r--chromium/ui/webui/resources/cr_elements/shared_vars_css.html12
-rw-r--r--chromium/ui/webui/resources/css/BUILD.gn2
-rw-r--r--chromium/ui/webui/resources/css/dialogs.css146
-rw-r--r--chromium/ui/webui/resources/css/tree.css185
-rw-r--r--chromium/ui/webui/resources/html/BUILD.gn59
-rw-r--r--chromium/ui/webui/resources/html/cr/ui/command.html4
-rw-r--r--chromium/ui/webui/resources/html/cr/ui/context_menu_handler.html1
-rw-r--r--chromium/ui/webui/resources/html/cr/ui/keyboard_shortcut_list.html3
-rw-r--r--chromium/ui/webui/resources/html/cr/ui/menu.html1
-rw-r--r--chromium/ui/webui/resources/html/cr/ui/menu_button.html1
-rw-r--r--chromium/ui/webui/resources/html/cr/ui/menu_item.html1
-rw-r--r--chromium/ui/webui/resources/html/cr/ui/position_util.html1
-rw-r--r--chromium/ui/webui/resources/html/list_property_update_behavior.html3
-rw-r--r--chromium/ui/webui/resources/js/BUILD.gn102
-rw-r--r--chromium/ui/webui/resources/js/browser_command/BUILD.gn3
-rw-r--r--chromium/ui/webui/resources/js/browser_command/browser_command.mojom3
-rw-r--r--chromium/ui/webui/resources/js/cr.gni6
-rw-r--r--chromium/ui/webui/resources/js/cr.js4
-rw-r--r--chromium/ui/webui/resources/js/cr.m.js2
-rw-r--r--chromium/ui/webui/resources/js/cr/BUILD.gn45
-rw-r--r--chromium/ui/webui/resources/js/cr/ui.js5
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/BUILD.gn666
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/command.js50
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/context_menu_handler.d.ts (renamed from chromium/ui/webui/resources/js/cr/ui/context_menu_handler.m.d.ts)4
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/context_menu_handler.js69
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/dialogs.js396
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/dialogs.m.d.ts36
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/drag_wrapper.ts (renamed from chromium/ui/webui/resources/js/cr/ui/drag_wrapper.js)83
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/focus_grid.ts (renamed from chromium/ui/webui/resources/js/cr/ui/focus_grid.js)73
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/focus_manager.js2
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/focus_row.js32
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/focus_row_behavior.js6
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/grid.js8
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/keyboard_shortcut_list.js9
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/list.js8
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/list.m.d.ts18
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/list_selection_controller.js2
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/list_selection_model.js2
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/menu.js43
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/menu_button.d.ts (renamed from chromium/ui/webui/resources/js/cr/ui/menu_button.m.d.ts)0
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/menu_button.js57
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/menu_item.d.ts (renamed from chromium/ui/webui/resources/js/cr/ui/menu_item.m.d.ts)0
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/menu_item.js41
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/position_util.js27
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/splitter.js250
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/store_ts.ts127
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/tree.js767
-rw-r--r--chromium/ui/webui/resources/js/i18n_template_no_process.js2
-rw-r--r--chromium/ui/webui/resources/js/icon.js12
-rw-r--r--chromium/ui/webui/resources/js/ios/mojo_api.js12
-rw-r--r--chromium/ui/webui/resources/js/ios/web_ui.js2
-rw-r--r--chromium/ui/webui/resources/js/list_property_update_behavior.d.ts (renamed from chromium/ui/webui/resources/js/list_property_update_behavior.m.d.ts)5
-rw-r--r--chromium/ui/webui/resources/js/list_property_update_behavior.js12
-rw-r--r--chromium/ui/webui/resources/js/metrics_reporter/BUILD.gn3
-rw-r--r--chromium/ui/webui/resources/js/metrics_reporter/metrics_reporter.ts2
-rw-r--r--chromium/ui/webui/resources/js/parse_html_subset.js6
-rw-r--r--chromium/ui/webui/resources/js/parse_html_subset.m.d.ts13
-rw-r--r--chromium/ui/webui/resources/js/search_highlight_utils.ts (renamed from chromium/ui/webui/resources/js/search_highlight_utils.js)99
-rw-r--r--chromium/ui/webui/resources/js/static_types.d.ts6
-rw-r--r--chromium/ui/webui/resources/js/static_types.js2
-rw-r--r--chromium/ui/webui/resources/js/test_loader_util.js2
-rw-r--r--chromium/ui/webui/resources/js/util.js123
-rw-r--r--chromium/ui/webui/resources/mojo/BUILD.gn4
-rw-r--r--chromium/ui/webui/resources/tools/generate_grd.gni2
-rw-r--r--chromium/ui/webui/untrusted_bubble_web_ui_controller.cc25
-rw-r--r--chromium/ui/webui/untrusted_bubble_web_ui_controller.h32
-rw-r--r--chromium/ui/webui/webui_features.gni4
-rw-r--r--chromium/ui/wm/BUILD.gn45
-rw-r--r--chromium/ui/wm/OWNERS2
-rw-r--r--chromium/ui/wm/core/OWNERS1
-rw-r--r--chromium/ui/wm/core/accelerator_filter.h4
-rw-r--r--chromium/ui/wm/core/base_focus_rules.h3
-rw-r--r--chromium/ui/wm/core/capture_controller.cc23
-rw-r--r--chromium/ui/wm/core/capture_controller.h10
-rw-r--r--chromium/ui/wm/core/capture_controller_unittest.cc113
-rw-r--r--chromium/ui/wm/core/compound_event_filter.h4
-rw-r--r--chromium/ui/wm/core/coordinate_conversion.h38
-rw-r--r--chromium/ui/wm/core/cursor_loader.cc (renamed from chromium/ui/aura/cursor/cursor_loader.cc)10
-rw-r--r--chromium/ui/wm/core/cursor_loader.h (renamed from chromium/ui/aura/cursor/cursor_loader.h)13
-rw-r--r--chromium/ui/wm/core/cursor_loader_unittest.cc (renamed from chromium/ui/aura/cursor/cursor_loader_unittest.cc)21
-rw-r--r--chromium/ui/wm/core/cursor_lookup.cc (renamed from chromium/ui/aura/cursor/cursor_lookup.cc)8
-rw-r--r--chromium/ui/wm/core/cursor_lookup.h (renamed from chromium/ui/aura/cursor/cursor_lookup.h)14
-rw-r--r--chromium/ui/wm/core/cursor_manager.h7
-rw-r--r--chromium/ui/wm/core/cursor_util.cc (renamed from chromium/ui/aura/cursor/cursor_util.cc)6
-rw-r--r--chromium/ui/wm/core/cursor_util.h (renamed from chromium/ui/aura/cursor/cursor_util.h)12
-rw-r--r--chromium/ui/wm/core/cursor_util_unittest.cc (renamed from chromium/ui/aura/cursor/cursor_util_unittest.cc)6
-rw-r--r--chromium/ui/wm/core/cursors_aura.cc (renamed from chromium/ui/aura/cursor/cursors_aura.cc)12
-rw-r--r--chromium/ui/wm/core/cursors_aura.h (renamed from chromium/ui/aura/cursor/cursors_aura.h)16
-rw-r--r--chromium/ui/wm/core/default_activation_client.h7
-rw-r--r--chromium/ui/wm/core/default_screen_position_client.h4
-rw-r--r--chromium/ui/wm/core/easy_resize_window_targeter.h5
-rw-r--r--chromium/ui/wm/core/focus_controller.h11
-rw-r--r--chromium/ui/wm/core/focus_controller_unittest.cc9
-rw-r--r--chromium/ui/wm/core/focus_rules.h4
-rw-r--r--chromium/ui/wm/core/ime_util_chromeos.h14
-rw-r--r--chromium/ui/wm/core/native_cursor_manager.h4
-rw-r--r--chromium/ui/wm/core/native_cursor_manager_delegate.h4
-rw-r--r--chromium/ui/wm/core/shadow_controller.h5
-rw-r--r--chromium/ui/wm/core/shadow_controller_delegate.h6
-rw-r--r--chromium/ui/wm/core/shadow_types.h16
-rw-r--r--chromium/ui/wm/core/transient_window_controller.h4
-rw-r--r--chromium/ui/wm/core/transient_window_manager.h5
-rw-r--r--chromium/ui/wm/core/transient_window_observer.h4
-rw-r--r--chromium/ui/wm/core/transient_window_stacking_client.h4
-rw-r--r--chromium/ui/wm/core/visibility_controller.h13
-rw-r--r--chromium/ui/wm/core/window_animations.cc1
-rw-r--r--chromium/ui/wm/core/window_animations.h42
-rw-r--r--chromium/ui/wm/core/window_modality_controller.h18
-rw-r--r--chromium/ui/wm/core/window_properties.cc4
-rw-r--r--chromium/ui/wm/core/window_properties.h24
-rw-r--r--chromium/ui/wm/core/window_util.cc2
-rw-r--r--chromium/ui/wm/core/window_util.h74
-rw-r--r--chromium/ui/wm/core/wm_core_export.h32
-rw-r--r--chromium/ui/wm/core/wm_core_switches.h4
-rw-r--r--chromium/ui/wm/core/wm_state.h4
-rw-r--r--chromium/ui/wm/public/BUILD.gn4
1950 files changed, 51852 insertions, 43322 deletions
diff --git a/chromium/ui/accelerated_widget_mac/BUILD.gn b/chromium/ui/accelerated_widget_mac/BUILD.gn
index dfd37911a72..93ea35046e9 100644
--- a/chromium/ui/accelerated_widget_mac/BUILD.gn
+++ b/chromium/ui/accelerated_widget_mac/BUILD.gn
@@ -36,7 +36,6 @@ component("accelerated_widget_mac") {
"//ui/events",
"//ui/events:events_base",
"//ui/gfx",
- "//ui/gfx:gfx_io_surface_hdr_metadata",
"//ui/gfx/geometry",
"//ui/gl",
]
diff --git a/chromium/ui/accelerated_widget_mac/accelerated_widget_mac.h b/chromium/ui/accelerated_widget_mac/accelerated_widget_mac.h
index 2cee06f0104..37f6f88fe24 100644
--- a/chromium/ui/accelerated_widget_mac/accelerated_widget_mac.h
+++ b/chromium/ui/accelerated_widget_mac/accelerated_widget_mac.h
@@ -5,7 +5,7 @@
#ifndef UI_ACCELERATED_WIDGET_MAC_ACCELERATED_WIDGET_MAC_H_
#define UI_ACCELERATED_WIDGET_MAC_ACCELERATED_WIDGET_MAC_H_
-
+#include "base/memory/raw_ptr.h"
#include "ui/accelerated_widget_mac/accelerated_widget_mac_export.h"
#include "ui/accelerated_widget_mac/ca_layer_frame_sink.h"
#include "ui/gfx/geometry/size.h"
@@ -68,7 +68,7 @@ class ACCELERATED_WIDGET_MAC_EXPORT AcceleratedWidgetMac
void UpdateCALayerTree(const gfx::CALayerParams& ca_layer_params) override;
// The AcceleratedWidgetMacNSView that is using this as its internals.
- AcceleratedWidgetMacNSView* view_ = nullptr;
+ raw_ptr<AcceleratedWidgetMacNSView> view_ = nullptr;
// A phony NSView handle used to identify this.
gfx::AcceleratedWidget native_widget_ = gfx::kNullAcceleratedWidget;
diff --git a/chromium/ui/accelerated_widget_mac/accelerated_widget_mac.mm b/chromium/ui/accelerated_widget_mac/accelerated_widget_mac.mm
index 6a509539aa4..27aab9d22e7 100644
--- a/chromium/ui/accelerated_widget_mac/accelerated_widget_mac.mm
+++ b/chromium/ui/accelerated_widget_mac/accelerated_widget_mac.mm
@@ -44,7 +44,7 @@ void AcceleratedWidgetMac::SetNSView(AcceleratedWidgetMacNSView* view) {
void AcceleratedWidgetMac::ResetNSView() {
last_ca_layer_params_valid_ = false;
- view_ = NULL;
+ view_ = nullptr;
}
const gfx::CALayerParams* AcceleratedWidgetMac::GetCALayerParams() const {
diff --git a/chromium/ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm b/chromium/ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm
index 3eaab83f5e2..48f59fdee1a 100644
--- a/chromium/ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm
+++ b/chromium/ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm
@@ -74,7 +74,7 @@ bool ScheduleCALayer(ui::CARendererLayerTree* tree,
properties->transform, properties->gl_image.get(),
properties->contents_rect, properties->rect, properties->background_color,
properties->edge_aa_mask, properties->opacity, properties->filter,
- gfx::ProtectedVideoType::kClear));
+ absl::nullopt, gfx::ProtectedVideoType::kClear));
}
void UpdateCALayerTree(std::unique_ptr<ui::CARendererLayerTree>& ca_layer_tree,
@@ -194,8 +194,7 @@ class CALayerTreePropertyUpdatesTest : public CALayerTreeTest {
EXPECT_EQ(properties.opacity, [content_layer opacity]);
EXPECT_NSEQ(kCAFilterLinear, [content_layer minificationFilter]);
EXPECT_NSEQ(kCAFilterLinear, [content_layer magnificationFilter]);
- if ([content_layer respondsToSelector:(@selector(contentsScale))])
- EXPECT_EQ(properties.scale_factor, [content_layer contentsScale]);
+ EXPECT_EQ(properties.scale_factor, [content_layer contentsScale]);
}
// Update just the clip rect and re-commit.
@@ -493,8 +492,7 @@ class CALayerTreePropertyUpdatesTest : public CALayerTreeTest {
gfx::Rect([content_layer bounds]));
EXPECT_EQ(kCALayerBottomEdge, [content_layer edgeAntialiasingMask]);
EXPECT_EQ(properties.opacity, [content_layer opacity]);
- if ([content_layer respondsToSelector:(@selector(contentsScale))])
- EXPECT_EQ(properties.scale_factor, [content_layer contentsScale]);
+ EXPECT_EQ(properties.scale_factor, [content_layer contentsScale]);
}
// Remove the rounded corners. This should result in the rounded corners
diff --git a/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.h b/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.h
index 457757a38ae..27d1c8691cd 100644
--- a/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.h
+++ b/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.h
@@ -8,17 +8,21 @@
#include <IOSurface/IOSurface.h>
#include <QuartzCore/QuartzCore.h>
+#include <list>
#include <memory>
-#include <vector>
+#include "base/containers/flat_map.h"
#include "base/mac/scoped_cftyperef.h"
#include "base/mac/scoped_nsobject.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/accelerated_widget_mac/accelerated_widget_mac_export.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/rect_f.h"
#include "ui/gfx/geometry/rrect_f.h"
#include "ui/gfx/geometry/transform.h"
+#include "ui/gfx/hdr_metadata.h"
#include "ui/gfx/mac/io_surface.h"
#include "ui/gfx/video_types.h"
@@ -82,10 +86,17 @@ class ACCELERATED_WIDGET_MAC_EXPORT CARendererLayerTree {
class ContentLayer;
friend class ContentLayer;
+ using CALayerMap = base::flat_map<IOSurfaceRef, base::WeakPtr<ContentLayer>>;
+
+ void MatchLayersToOldTreeDefault(CARendererLayerTree* old_tree);
+ void MatchLayersToOldTree(CARendererLayerTree* old_tree);
+ void VerifyCommittedCALayers();
+
class RootLayer {
public:
- RootLayer();
+ RootLayer(CARendererLayerTree* tree);
+ RootLayer(RootLayer&&) = delete;
RootLayer(const RootLayer&) = delete;
RootLayer& operator=(const RootLayer&) = delete;
@@ -95,8 +106,7 @@ class ACCELERATED_WIDGET_MAC_EXPORT CARendererLayerTree {
// Append a new content layer, without modifying the actual CALayer
// structure.
- bool AddContentLayer(CARendererLayerTree* tree,
- const CARendererLayerParams& params);
+ bool AddContentLayer(const CARendererLayerParams& params);
// Downgrade all downgradeable AVSampleBufferDisplayLayers to be normal
// CALayers.
@@ -107,40 +117,52 @@ class ACCELERATED_WIDGET_MAC_EXPORT CARendererLayerTree {
// properties appropriately. Re-use the CALayers from |old_layer| if
// possible. If re-using a CALayer from |old_layer|, reset its |ca_layer|
// to nil, so that its destructor will not remove an active CALayer.
- void CommitToCA(CALayer* superlayer,
- RootLayer* old_layer,
- const gfx::Size& pixel_size,
- float scale_factor);
+ void CommitToCA(CALayer* superlayer, const gfx::Size& pixel_size);
+
+ void CALayerFallBack();
// Return true if the CALayer tree is just a video layer on a black or
// transparent background, false otherwise.
- bool WantsFullcreenLowPowerBackdrop() const;
+ bool WantsFullscreenLowPowerBackdrop() const;
+
+ // Tree that owns `this`.
+ const raw_ptr<CARendererLayerTree> tree_;
- std::vector<ClipAndSortingLayer> clip_and_sorting_layers_;
+ std::list<ClipAndSortingLayer> clip_and_sorting_layers_;
base::scoped_nsobject<CALayer> ca_layer_;
+
+ // Weak pointer to the layer in the old CARendererLayerTree that will be
+ // reused by this layer, and the weak factory used to make that pointer.
+ base::WeakPtr<RootLayer> old_layer_;
+ base::WeakPtrFactory<RootLayer> weak_factory_for_new_layer_{this};
};
class ClipAndSortingLayer {
public:
- ClipAndSortingLayer(bool is_clipped,
+ ClipAndSortingLayer(RootLayer* root_layer,
+ bool is_clipped,
gfx::Rect clip_rect,
gfx::RRectF rounded_corner_bounds,
unsigned sorting_context_id,
bool is_singleton_sorting_context);
- ClipAndSortingLayer(ClipAndSortingLayer&& layer);
+ ClipAndSortingLayer(ClipAndSortingLayer&& layer) = delete;
ClipAndSortingLayer(const ClipAndSortingLayer&) = delete;
ClipAndSortingLayer& operator=(const ClipAndSortingLayer&) = delete;
// See the behavior of RootLayer for the effects of these functions on the
// |ca_layer| member and |old_layer| argument.
~ClipAndSortingLayer();
- void AddContentLayer(CARendererLayerTree* tree,
- const CARendererLayerParams& params);
- void CommitToCA(CALayer* superlayer,
- ClipAndSortingLayer* old_layer,
- float scale_factor);
+ void AddContentLayer(const CARendererLayerParams& params);
+
+ void CommitToCA(CALayer* last_committed_clip_ca_layer);
+ void CALayerFallBack();
+
+ CARendererLayerTree* tree() { return parent_layer_->tree_; }
+
+ // Parent layer that owns `this`, and child layers that `this` owns.
+ const raw_ptr<RootLayer> parent_layer_;
+ std::list<TransformLayer> transform_layers_;
- std::vector<TransformLayer> transform_layers_;
bool is_clipped_ = false;
gfx::Rect clip_rect_;
gfx::RRectF rounded_corner_bounds_;
@@ -148,31 +170,52 @@ class ACCELERATED_WIDGET_MAC_EXPORT CARendererLayerTree {
bool is_singleton_sorting_context_ = false;
base::scoped_nsobject<CALayer> clipping_ca_layer_;
base::scoped_nsobject<CALayer> rounded_corner_ca_layer_;
+
+ // The status when used as an old layer.
+ bool ca_layer_used_ = false;
+
+ // Weak pointer to the layer in the old CARendererLayerTree that will be
+ // reused by this layer, and the weak factory used to make that pointer.
+ base::WeakPtr<ClipAndSortingLayer> old_layer_;
+ base::WeakPtrFactory<ClipAndSortingLayer> weak_factory_for_new_layer_{this};
};
class TransformLayer {
public:
- TransformLayer(const gfx::Transform& transform);
- TransformLayer(TransformLayer&& layer);
+ TransformLayer(ClipAndSortingLayer* parent_layer,
+ const gfx::Transform& transform);
+ TransformLayer(TransformLayer&& layer) = delete;
TransformLayer(const TransformLayer&) = delete;
TransformLayer& operator=(const TransformLayer&) = delete;
// See the behavior of RootLayer for the effects of these functions on the
// |ca_layer| member and |old_layer| argument.
~TransformLayer();
- void AddContentLayer(CARendererLayerTree* tree,
- const CARendererLayerParams& params);
- void CommitToCA(CALayer* superlayer,
- TransformLayer* old_layer,
- float scale_factor);
+ void AddContentLayer(const CARendererLayerParams& params);
+ void CommitToCA(CALayer* last_committed_transform_ca_layer);
+
+ void CALayerFallBack();
+
+ CARendererLayerTree* tree() { return parent_layer_->tree(); }
+
+ // Parent layer that owns `this`, and child layers that `this` owns.
+ const raw_ptr<ClipAndSortingLayer> parent_layer_;
+ std::list<ContentLayer> content_layers_;
gfx::Transform transform_;
- std::vector<ContentLayer> content_layers_;
base::scoped_nsobject<CALayer> ca_layer_;
+
+ // The ca layer status when used as an old layer.
+ bool ca_layer_used_ = false;
+
+ // Weak pointer to the layer in the old CARendererLayerTree that will be
+ // reused by this layer, and the weak factory used to make that pointer.
+ base::WeakPtr<TransformLayer> old_layer_;
+ base::WeakPtrFactory<TransformLayer> weak_factory_for_new_layer_{this};
};
class ContentLayer {
public:
- ContentLayer(CARendererLayerTree* tree,
+ ContentLayer(TransformLayer* parent_layer,
base::ScopedCFTypeRef<IOSurfaceRef> io_surface,
base::ScopedCFTypeRef<CVPixelBufferRef> cv_pixel_buffer,
const gfx::RectF& contents_rect,
@@ -182,18 +225,24 @@ class ACCELERATED_WIDGET_MAC_EXPORT CARendererLayerTree {
unsigned edge_aa_mask,
float opacity,
unsigned filter,
+ absl::optional<gfx::HDRMetadata> hdr_metadata,
gfx::ProtectedVideoType protected_video_type);
- ContentLayer(ContentLayer&& layer);
+ ContentLayer(ContentLayer&& layer) = delete;
ContentLayer(const ContentLayer&) = delete;
ContentLayer& operator=(const ContentLayer&) = delete;
- // See the behavior of RootLayer for the effects of these functions on the
- // |ca_layer| member and |old_layer| argument.
+ // See the behavior of RootLayer for the effects of these functions.
~ContentLayer();
- void CommitToCA(CALayer* parent,
- ContentLayer* old_layer,
- float scale_factor);
+ void CommitToCA(CALayer* last_committed_ca_layer);
+
+ CARendererLayerTree* tree() { return parent_layer_->tree(); }
+ void UpdateMapAndMatchOldLayers(CALayerMap& old_ca_layer_map,
+ int& layer_order,
+ int& last_old_layer_order);
+
+ // Parent layer that owns `this`.
+ const raw_ptr<TransformLayer> parent_layer_;
// Ensure that the IOSurface be marked as in-use as soon as it is received.
// When they are committed to the window server, that will also increment
@@ -220,6 +269,8 @@ class ACCELERATED_WIDGET_MAC_EXPORT CARendererLayerTree {
// protected content (see https://crbug.com/1026703).
bool video_type_can_downgrade_ = true;
+ absl::optional<gfx::HDRMetadata> hdr_metadata_;
+
gfx::ProtectedVideoType protected_video_type_ =
gfx::ProtectedVideoType::kClear;
@@ -232,13 +283,36 @@ class ACCELERATED_WIDGET_MAC_EXPORT CARendererLayerTree {
// Layer used to colorize content when it updates, if borders are
// enabled.
base::scoped_nsobject<CALayer> update_indicator_layer_;
+
+ // Indicate the content layer order in the whole layer tree.
+ int layer_order_ = 0;
+
+ // The status when used as an old layer.
+ bool ca_layer_used_ = false;
+
+ // Weak pointer to the layer in the old CARendererLayerTree that will be
+ // reused by this layer, and the weak factory used to make that pointer.
+ base::WeakPtr<ContentLayer> old_layer_;
+ base::WeakPtrFactory<ContentLayer> weak_factory_for_new_layer_{this};
};
- RootLayer root_layer_;
+ RootLayer root_layer_{this};
float scale_factor_ = 1;
bool has_committed_ = false;
const bool allow_av_sample_buffer_display_layer_ = true;
const bool allow_solid_color_layers_ = true;
+
+ // Used for uma.
+ int changed_io_surfaces_during_commit_ = 0;
+ int unchanged_io_surfaces_during_commit_ = 0;
+ int total_updated_io_surface_size_during_commit_ = 0;
+
+ // Enable CALayerTree optimization that will try to reuse the CALayer with a
+ // matched CALayer from the old CALayerTree in the previous frame.
+ const bool ca_layer_tree_optimization_;
+
+ // Map of content IOSurface.
+ CALayerMap ca_layer_map_;
};
} // namespace ui
diff --git a/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm b/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm
index 523f6bd8847..3584fd56e03 100644
--- a/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm
+++ b/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm
@@ -12,8 +12,10 @@
#include <utility>
#include "base/command_line.h"
+#include "base/feature_list.h"
#include "base/logging.h"
#include "base/mac/foundation_util.h"
+#include "base/metrics/histogram_functions.h"
#include "base/trace_event/trace_event.h"
#include "components/metal_util/hdr_copier_layer.h"
#include "media/base/mac/color_space_util_mac.h"
@@ -21,7 +23,7 @@
#include "ui/base/cocoa/animation_utils.h"
#include "ui/base/ui_base_switches.h"
#include "ui/gfx/geometry/dip_util.h"
-#include "ui/gfx/mac/io_surface_hdr_metadata.h"
+#include "ui/gfx/hdr_metadata.h"
#include "ui/gl/ca_renderer_layer_params.h"
#include "ui/gl/gl_image_io_surface.h"
@@ -29,6 +31,45 @@ namespace ui {
namespace {
+// TODO(https://crbug.com/1313999): Remove debug prints after the code is
+// stable.
+constexpr bool g_print_ca_layers = false;
+// Output level for VLOG.
+constexpr int kOutputLevel = 4;
+
+base::Feature kCALayerTreeOptimization{"CALayerTreeOptimization",
+ base::FEATURE_ENABLED_BY_DEFAULT};
+
+void RecordIOSurfaceHistograms(
+ int changed_io_surfaces_during_commit,
+ int unchanged_io_surfaces_during_commit,
+ int total_updated_io_surface_size_during_commit) {
+ // UMA for updated IOSurfaces.
+ int total_io_surfaces =
+ changed_io_surfaces_during_commit + unchanged_io_surfaces_during_commit;
+ if (total_io_surfaces > 0) {
+ // Total changed IOSurface size perframe. Use 100M as a max for this
+ // histogram. IOSurface size = w x h x bpp x planes. A 32 bpp HD surface
+ // takes ~8M bytes.
+ base::UmaHistogramCustomCounts(
+ "Compositing.Renderer.CALayer.ChangedIOSurfacesSizePerFrame",
+ total_updated_io_surface_size_during_commit, 1 /*=min*/,
+ 100000000 /*=exclusive_max*/, 50 /*=buckets*/);
+
+ // The number of changed IOSurfaces per frame.
+ base::UmaHistogramCustomCounts(
+ "Compositing.Renderer.CALayer.ChangedIOSurfacesPerFrame",
+ changed_io_surfaces_during_commit, 1 /*=min*/, 300 /*=exclusive_max*/,
+ 50 /*=buckets*/);
+
+ int changed_io_surface_percentage =
+ changed_io_surfaces_during_commit * 100 / total_io_surfaces;
+ base::UmaHistogramPercentage(
+ "Compositing.Renderer.CALayer.ChangedIOSurfacesPercentagePerFrame",
+ changed_io_surface_percentage);
+ }
+}
+
// This will enqueue |io_surface| to be drawn by |av_layer|. This will
// retain |cv_pixel_buffer| until it is no longer being displayed.
bool AVSampleBufferDisplayLayerEnqueueCVPixelBuffer(
@@ -106,7 +147,8 @@ bool AVSampleBufferDisplayLayerEnqueueCVPixelBuffer(
bool AVSampleBufferDisplayLayerEnqueueIOSurface(
AVSampleBufferDisplayLayer* av_layer,
IOSurfaceRef io_surface,
- const gfx::ColorSpace& io_surface_color_space) {
+ const gfx::ColorSpace& io_surface_color_space,
+ absl::optional<gfx::HDRMetadata> hdr_metadata) {
CVReturn cv_return = kCVReturnSuccess;
base::ScopedCFTypeRef<CVPixelBufferRef> cv_pixel_buffer;
@@ -142,25 +184,19 @@ bool AVSampleBufferDisplayLayerEnqueueIOSurface(
: kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ,
kCVAttachmentMode_ShouldPropagate);
- // Transfer stashed HDR metadata from the IOSurface to the CVPixelBuffer.
- //
- // Note: It'd be nice to find a way to set this on the IOSurface itself
- // in some way that propagates to the CVPixelBuffer, but thus far we
- // haven't been able to find a way.
- gfx::HDRMetadata hdr_metadata;
- if (IOSurfaceGetHDRMetadata(io_surface, hdr_metadata)) {
- if (!(hdr_metadata.color_volume_metadata ==
+ if (hdr_metadata) {
+ if (!(hdr_metadata->color_volume_metadata ==
gfx::ColorVolumeMetadata())) {
CVBufferSetAttachment(
cv_pixel_buffer, kCVImageBufferMasteringDisplayColorVolumeKey,
- media::GenerateMasteringDisplayColorVolume(hdr_metadata),
+ media::GenerateMasteringDisplayColorVolume(*hdr_metadata),
kCVAttachmentMode_ShouldPropagate);
}
- if (hdr_metadata.max_content_light_level ||
- hdr_metadata.max_frame_average_light_level) {
+ if (hdr_metadata->max_content_light_level ||
+ hdr_metadata->max_frame_average_light_level) {
CVBufferSetAttachment(
cv_pixel_buffer, kCVImageBufferContentLightLevelInfoKey,
- media::GenerateContentLightLevelInfo(hdr_metadata),
+ media::GenerateContentLightLevelInfo(*hdr_metadata),
kCVAttachmentMode_ShouldPropagate);
}
}
@@ -178,6 +214,7 @@ class CARendererLayerTree::SolidColorContents
public:
static scoped_refptr<SolidColorContents> Get(SkColor color);
id GetContents() const;
+ IOSurfaceRef GetIOSurfaceRef() const;
private:
friend class base::RefCounted<SolidColorContents>;
@@ -226,6 +263,10 @@ id CARendererLayerTree::SolidColorContents::GetContents() const {
return static_cast<id>(io_surface_.get());
}
+IOSurfaceRef CARendererLayerTree::SolidColorContents::GetIOSurfaceRef() const {
+ return io_surface_.get();
+}
+
CARendererLayerTree::SolidColorContents::SolidColorContents(
SkColor color,
IOSurfaceRef io_surface)
@@ -255,7 +296,9 @@ CARendererLayerTree::CARendererLayerTree(
bool allow_solid_color_layers)
: allow_av_sample_buffer_display_layer_(
allow_av_sample_buffer_display_layer),
- allow_solid_color_layers_(allow_solid_color_layers) {}
+ allow_solid_color_layers_(allow_solid_color_layers),
+ ca_layer_tree_optimization_(
+ base::FeatureList::IsEnabled(kCALayerTreeOptimization)) {}
CARendererLayerTree::~CARendererLayerTree() {}
bool CARendererLayerTree::ScheduleCALayer(const CARendererLayerParams& params) {
@@ -263,7 +306,7 @@ bool CARendererLayerTree::ScheduleCALayer(const CARendererLayerParams& params) {
DLOG(ERROR) << "ScheduleCALayer called after CommitScheduledCALayers.";
return false;
}
- return root_layer_.AddContentLayer(this, params);
+ return root_layer_.AddContentLayer(params);
}
void CARendererLayerTree::CommitScheduledCALayers(
@@ -272,22 +315,293 @@ void CARendererLayerTree::CommitScheduledCALayers(
const gfx::Size& pixel_size,
float scale_factor) {
TRACE_EVENT0("gpu", "CARendererLayerTree::CommitScheduledCALayers");
- RootLayer* old_root_layer = nullptr;
- if (old_tree) {
- DCHECK(old_tree->has_committed_);
- if (old_tree->scale_factor_ == scale_factor)
- old_root_layer = &old_tree->root_layer_;
- }
+ scale_factor_ = scale_factor;
+
+ if (ca_layer_tree_optimization_)
+ MatchLayersToOldTree(old_tree.get());
+ else
+ MatchLayersToOldTreeDefault(old_tree.get());
- root_layer_.CommitToCA(superlayer, old_root_layer, pixel_size, scale_factor);
+ root_layer_.CommitToCA(superlayer, pixel_size);
// If there are any extra CALayers in |old_tree| that were not stolen by this
// tree, they will be removed from the CALayer tree in this deallocation.
old_tree.reset();
has_committed_ = true;
- scale_factor_ = scale_factor;
+
+ // UMA
+ RecordIOSurfaceHistograms(changed_io_surfaces_during_commit_,
+ unchanged_io_surfaces_during_commit_,
+ total_updated_io_surface_size_during_commit_);
+
+// TODO(https://crbug.com/1313999): Remove verfication after the code is stable.
+#ifndef NDEBUG
+ if (ca_layer_tree_optimization_)
+ VerifyCommittedCALayers();
+#endif
+}
+
+void CARendererLayerTree::MatchLayersToOldTreeDefault(
+ CARendererLayerTree* old_tree) {
+ if (!old_tree)
+ return;
+ DCHECK(old_tree->has_committed_);
+
+ // Match the root layer.
+ if (old_tree->scale_factor_ != scale_factor_)
+ return;
+
+ root_layer_.old_layer_ =
+ old_tree->root_layer_.weak_factory_for_new_layer_.GetWeakPtr();
+
+ root_layer_.CALayerFallBack();
+}
+
+void CARendererLayerTree::MatchLayersToOldTree(CARendererLayerTree* old_tree) {
+ if (!old_tree)
+ return;
+ DCHECK(old_tree->has_committed_);
+
+ // Match the root layer.
+ if (old_tree->scale_factor_ != scale_factor_)
+ return;
+
+ VLOG(kOutputLevel) << "--Mapping....";
+ DCHECK(ca_layer_map_.empty()) << "ca_layer_map_ is not empty.";
+
+ root_layer_.old_layer_ =
+ old_tree->root_layer_.weak_factory_for_new_layer_.GetWeakPtr();
+
+ int layer_order = 0;
+ int last_old_layer_order;
+ for (auto& clip_and_sorting_layer : root_layer_.clip_and_sorting_layers_) {
+ for (auto& transform_layer : clip_and_sorting_layer.transform_layers_) {
+ for (auto& content_layer : transform_layer.content_layers_) {
+ content_layer.UpdateMapAndMatchOldLayers(
+ old_tree->ca_layer_map_, layer_order, last_old_layer_order);
+ }
+ }
+ }
+
+ // Try to match unused old layers to saving reallocation of CALayer even
+ // though the IOSurface will be different.
+ root_layer_.CALayerFallBack();
+
+ VLOG(kOutputLevel) << "--";
+}
+
+void CARendererLayerTree::ContentLayer::UpdateMapAndMatchOldLayers(
+ CALayerMap& old_ca_layer_map,
+ int& layer_order,
+ int& last_old_layer_order) {
+ IOSurfaceRef io_surface_ref = io_surface_.get();
+
+ if (!io_surface_ref)
+ return;
+
+ // Add this ContentLayer to the map for this tree.
+ tree()->ca_layer_map_.insert(
+ std::make_pair(io_surface_ref, weak_factory_for_new_layer_.GetWeakPtr()));
+
+ layer_order_ = ++layer_order;
+
+ // Find a matched io surface from the old tree.
+ auto it = old_ca_layer_map.find(io_surface_ref);
+ if (it == old_ca_layer_map.end())
+ return;
+
+ auto matched_content_layer = it->second;
+
+ if (matched_content_layer->ca_layer_used_) {
+ VLOG(kOutputLevel) << " Skip. The matched content layer has been used. "
+ << matched_content_layer->ca_layer_;
+ } else if (matched_content_layer->layer_order_ < last_old_layer_order) {
+ VLOG(kOutputLevel) << " Skip. Wrong order. "
+ << matched_content_layer->ca_layer_;
+ }
+
+ // Should we try multimap for the same IOSurface used twice in the old tree?
+ if (matched_content_layer->ca_layer_used_)
+ return;
+
+ auto matched_transform_layer = matched_content_layer->parent_layer_;
+ auto matched_clip_layer = matched_transform_layer->parent_layer_;
+
+ // If the parenet is different, the supper layer must have changed. It
+ // should be removed from its superlayer and inserted back to the new
+ // superlayer in CommitToCa().
+
+ // clip_and_sorting_layer
+ if (!parent_layer_->parent_layer_->old_layer_) {
+ if (!matched_clip_layer->ca_layer_used_) {
+ // Use this clip_and_sorting_layer as an old layer.
+ parent_layer_->parent_layer_->old_layer_ =
+ matched_clip_layer->weak_factory_for_new_layer_.GetWeakPtr();
+ matched_clip_layer->ca_layer_used_ = true;
+ VLOG(kOutputLevel) << "ClipAndSort: "
+ << matched_clip_layer->clipping_ca_layer_;
+ } else {
+ [matched_transform_layer->ca_layer_ removeFromSuperlayer];
+ }
+ }
+
+ // transform_layer
+ if (!parent_layer_->old_layer_) {
+ if (!matched_transform_layer->ca_layer_used_) {
+ // Use this clip_and_sorting_layer as an old layer.
+ parent_layer_->old_layer_ =
+ matched_transform_layer->weak_factory_for_new_layer_.GetWeakPtr();
+ matched_transform_layer->ca_layer_used_ = true;
+ VLOG(kOutputLevel) << " Transform: "
+ << matched_transform_layer->ca_layer_;
+ } else {
+ [matched_content_layer->ca_layer_ removeFromSuperlayer];
+ }
+ }
+
+ if (matched_clip_layer.get() !=
+ parent_layer_->parent_layer_->old_layer_.get()) {
+ [matched_transform_layer->ca_layer_ removeFromSuperlayer];
+ }
+
+ if (matched_transform_layer.get() != parent_layer_->old_layer_.get()) {
+ [matched_content_layer->ca_layer_ removeFromSuperlayer];
+ } else if (matched_content_layer->layer_order_ < last_old_layer_order) {
+ // For the content layers with the same superlayer, if the order changes.
+ // this matched old layer should be removed from its superlayer first.
+ [matched_content_layer->ca_layer_ removeFromSuperlayer];
+ [matched_transform_layer->ca_layer_ removeFromSuperlayer];
+ [matched_clip_layer->clipping_ca_layer_ removeFromSuperlayer];
+ }
+
+ // This is the one to be used as an old layer.
+ old_layer_ = matched_content_layer;
+ old_layer_->ca_layer_used_ = true;
+ last_old_layer_order = matched_content_layer->layer_order_;
+
+ // Debug print
+ std::string str;
+ if ([matched_transform_layer->ca_layer_ superlayer] == nil)
+ str = ", transform layer's superlayer has changed";
+ if ([matched_content_layer->ca_layer_ superlayer] == nil)
+ str = ", clip layer's superlayer has changed ";
+ VLOG(kOutputLevel) << " Content: " << matched_content_layer->ca_layer_
+ << " io_surface_ref: " << io_surface_ref << str;
+}
+
+void CARendererLayerTree::RootLayer::CALayerFallBack() {
+ if (old_layer_) {
+ auto old_layer_child_it = old_layer_->clip_and_sorting_layers_.begin();
+ for (auto& child : clip_and_sorting_layers_) {
+ if (child.old_layer_) {
+ // Remove any children of `old_layer_` that appear before
+ // `child.old_layer_`. They may be re-parented (in the case of
+ // transposed content), or removed entirely.
+ while (old_layer_child_it !=
+ old_layer_->clip_and_sorting_layers_.end()) {
+ auto* old_layer_child = &(*old_layer_child_it);
+ if (child.old_layer_.get() == old_layer_child) {
+ ++old_layer_child_it;
+ break;
+ }
+ [old_layer_child->clipping_ca_layer_ removeFromSuperlayer];
+ ++old_layer_child_it;
+ }
+ } else {
+ // If `child.old_layer_` is unset, then set it to the next child of
+ // `old_layer_` (if it exists and has not been taken).
+ if (old_layer_child_it != old_layer_->clip_and_sorting_layers_.end()) {
+ if (!old_layer_child_it->ca_layer_used_) {
+ child.old_layer_ =
+ old_layer_child_it->weak_factory_for_new_layer_.GetWeakPtr();
+ ++old_layer_child_it;
+ } else {
+ // keep the current |old_layer_child_it|.
+ }
+ }
+ }
+
+ child.CALayerFallBack();
+ }
+ } else {
+ for (auto& child : clip_and_sorting_layers_)
+ child.CALayerFallBack();
+ }
+}
+
+void CARendererLayerTree::ClipAndSortingLayer::CALayerFallBack() {
+ if (old_layer_) {
+ auto old_layer_child_it = old_layer_->transform_layers_.begin();
+ for (auto& child : transform_layers_) {
+ if (child.old_layer_) {
+ // Remove any children of `old_layer_` that appear before
+ // `child.old_layer_`. They may be re-parented (in the case of
+ // transposed content), or removed entirely.
+ while (old_layer_child_it != old_layer_->transform_layers_.end()) {
+ auto* old_layer_child = &(*old_layer_child_it);
+ if (child.old_layer_.get() == old_layer_child) {
+ ++old_layer_child_it;
+ break;
+ }
+ [old_layer_child->ca_layer_ removeFromSuperlayer];
+ ++old_layer_child_it;
+ }
+ } else {
+ // If `child.old_layer_` is unset, then set it to the next child of
+ // `old_layer_` (if it exists and has not been taken).
+ if (old_layer_child_it != old_layer_->transform_layers_.end()) {
+ if (!old_layer_child_it->ca_layer_used_) {
+ child.old_layer_ =
+ old_layer_child_it->weak_factory_for_new_layer_.GetWeakPtr();
+ ++old_layer_child_it;
+ } else {
+ // keep the current |old_layer_child_it|.
+ }
+ }
+ }
+
+ child.CALayerFallBack();
+ }
+ } else {
+ for (auto& child : transform_layers_)
+ child.CALayerFallBack();
+ }
+}
+
+void CARendererLayerTree::TransformLayer::CALayerFallBack() {
+ if (old_layer_) {
+ auto old_layer_child_it = old_layer_->content_layers_.begin();
+ for (auto& child : content_layers_) {
+ if (child.old_layer_) {
+ // Remove any children of `old_layer_` that appear before
+ // `child.old_layer_`. They may be re-parented (in the case of
+ // transposed content), or removed entirely.
+ while (old_layer_child_it != old_layer_->content_layers_.end()) {
+ auto* old_layer_child = &(*old_layer_child_it);
+ if (child.old_layer_.get() == old_layer_child) {
+ ++old_layer_child_it;
+ break;
+ }
+ [old_layer_child->ca_layer_ removeFromSuperlayer];
+ ++old_layer_child_it;
+ }
+ } else {
+ // If `child.old_layer_` is unset, then set it to the next child of
+ // `old_layer_` (if it exists and has not been taken).
+ if (old_layer_child_it != old_layer_->content_layers_.end()) {
+ if (!old_layer_child_it->ca_layer_used_) {
+ child.old_layer_ =
+ old_layer_child_it->weak_factory_for_new_layer_.GetWeakPtr();
+ ++old_layer_child_it;
+ } else {
+ // keep the current |old_layer_child_it|.
+ }
+ }
+ }
+ }
+ }
}
-bool CARendererLayerTree::RootLayer::WantsFullcreenLowPowerBackdrop() const {
+bool CARendererLayerTree::RootLayer::WantsFullscreenLowPowerBackdrop() const {
bool found_video_layer = false;
for (auto& clip_layer : clip_and_sorting_layers_) {
for (auto& transform_layer : clip_layer.transform_layers_) {
@@ -345,25 +659,26 @@ IOSurfaceRef CARendererLayerTree::GetContentIOSurface() const {
return nullptr;
}
const ClipAndSortingLayer& clip_and_sorting =
- root_layer_.clip_and_sorting_layers_[0];
+ root_layer_.clip_and_sorting_layers_.front();
size_t transform_count = clip_and_sorting.transform_layers_.size();
if (transform_count != 1) {
DLOG(ERROR) << "Can only return contents IOSurface when there is 1 "
<< "TransformLayer, there are " << transform_count << ".";
return nullptr;
}
- const TransformLayer& transform = clip_and_sorting.transform_layers_[0];
+ const TransformLayer& transform = clip_and_sorting.transform_layers_.front();
size_t content_count = transform.content_layers_.size();
if (content_count != 1) {
DLOG(ERROR) << "Can only return contents IOSurface when there is 1 "
<< "ContentLayer, there are " << transform_count << ".";
return nullptr;
}
- const ContentLayer& content = transform.content_layers_[0];
+ const ContentLayer& content = transform.content_layers_.front();
return content.io_surface_.get();
}
-CARendererLayerTree::RootLayer::RootLayer() {}
+CARendererLayerTree::RootLayer::RootLayer(CARendererLayerTree* tree)
+ : tree_(tree) {}
// Note that for all destructors, the the CALayer will have been reset to nil if
// another layer has taken it.
@@ -372,57 +687,35 @@ CARendererLayerTree::RootLayer::~RootLayer() {
}
CARendererLayerTree::ClipAndSortingLayer::ClipAndSortingLayer(
+ RootLayer* parent_layer,
bool is_clipped,
gfx::Rect clip_rect,
gfx::RRectF rounded_corner_bounds_arg,
unsigned sorting_context_id,
bool is_singleton_sorting_context)
- : is_clipped_(is_clipped),
+ : parent_layer_(parent_layer),
+ is_clipped_(is_clipped),
clip_rect_(clip_rect),
rounded_corner_bounds_(rounded_corner_bounds_arg),
sorting_context_id_(sorting_context_id),
is_singleton_sorting_context_(is_singleton_sorting_context) {}
-CARendererLayerTree::ClipAndSortingLayer::ClipAndSortingLayer(
- ClipAndSortingLayer&& layer)
- : transform_layers_(std::move(layer.transform_layers_)),
- is_clipped_(layer.is_clipped_),
- clip_rect_(layer.clip_rect_),
- rounded_corner_bounds_(layer.rounded_corner_bounds_),
- sorting_context_id_(layer.sorting_context_id_),
- is_singleton_sorting_context_(layer.is_singleton_sorting_context_),
- clipping_ca_layer_(layer.clipping_ca_layer_),
- rounded_corner_ca_layer_(layer.rounded_corner_ca_layer_) {
- // Ensure that the ca_layer be reset, so that when the destructor is called,
- // the layer hierarchy is unaffected.
- // TODO(ccameron): Add a move constructor for scoped_nsobject to do this
- // automatically.
- layer.clipping_ca_layer_.reset();
- layer.rounded_corner_ca_layer_.reset();
-}
-
CARendererLayerTree::ClipAndSortingLayer::~ClipAndSortingLayer() {
[clipping_ca_layer_ removeFromSuperlayer];
[rounded_corner_ca_layer_ removeFromSuperlayer];
}
CARendererLayerTree::TransformLayer::TransformLayer(
+ ClipAndSortingLayer* parent_layer,
const gfx::Transform& transform)
- : transform_(transform) {}
-
-CARendererLayerTree::TransformLayer::TransformLayer(TransformLayer&& layer)
- : transform_(layer.transform_),
- content_layers_(std::move(layer.content_layers_)),
- ca_layer_(layer.ca_layer_) {
- layer.ca_layer_.reset();
-}
+ : parent_layer_(parent_layer), transform_(transform) {}
CARendererLayerTree::TransformLayer::~TransformLayer() {
[ca_layer_ removeFromSuperlayer];
}
CARendererLayerTree::ContentLayer::ContentLayer(
- CARendererLayerTree* tree,
+ TransformLayer* parent_layer,
base::ScopedCFTypeRef<IOSurfaceRef> io_surface,
base::ScopedCFTypeRef<CVPixelBufferRef> cv_pixel_buffer,
const gfx::RectF& contents_rect,
@@ -432,8 +725,10 @@ CARendererLayerTree::ContentLayer::ContentLayer(
unsigned edge_aa_mask,
float opacity,
unsigned filter,
+ absl::optional<gfx::HDRMetadata> hdr_metadata,
gfx::ProtectedVideoType protected_video_type)
- : io_surface_(io_surface),
+ : parent_layer_(parent_layer),
+ io_surface_(io_surface),
cv_pixel_buffer_(cv_pixel_buffer),
contents_rect_(contents_rect),
rect_(rect),
@@ -442,6 +737,7 @@ CARendererLayerTree::ContentLayer::ContentLayer(
ca_edge_aa_mask_(0),
opacity_(opacity),
ca_filter_(filter == GL_LINEAR ? kCAFilterLinear : kCAFilterNearest),
+ hdr_metadata_(hdr_metadata),
protected_video_type_(protected_video_type) {
DCHECK(filter == GL_LINEAR || filter == GL_NEAREST);
@@ -453,7 +749,7 @@ CARendererLayerTree::ContentLayer::ContentLayer(
// transparent layers must use real colors to be eligible for low power
// detachment in fullscreen.
// https://crbug.com/633805
- if (!io_surface && !tree->allow_solid_color_layers_ &&
+ if (!io_surface && !tree()->allow_solid_color_layers_ &&
background_color_ != SK_ColorBLACK &&
background_color_ != SK_ColorTRANSPARENT) {
solid_color_contents_ = SolidColorContents::Get(background_color);
@@ -490,7 +786,7 @@ CARendererLayerTree::ContentLayer::ContentLayer(
} else if (io_surface) {
// Only allow 4:2:0 frames which fill the layer's contents or protected
// video to be promoted to AV layers.
- if (tree->allow_av_sample_buffer_display_layer_) {
+ if (tree()->allow_av_sample_buffer_display_layer_) {
if (contents_rect == gfx::RectF(0, 0, 1, 1)) {
switch (IOSurfaceGetPixelFormat(io_surface)) {
case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange:
@@ -544,35 +840,12 @@ CARendererLayerTree::ContentLayer::ContentLayer(
}
}
-CARendererLayerTree::ContentLayer::ContentLayer(ContentLayer&& layer)
- : io_surface_(layer.io_surface_),
- cv_pixel_buffer_(layer.cv_pixel_buffer_),
- solid_color_contents_(layer.solid_color_contents_),
- contents_rect_(layer.contents_rect_),
- rect_(layer.rect_),
- background_color_(layer.background_color_),
- io_surface_color_space_(layer.io_surface_color_space_),
- ca_edge_aa_mask_(layer.ca_edge_aa_mask_),
- opacity_(layer.opacity_),
- ca_filter_(layer.ca_filter_),
- type_(layer.type_),
- video_type_can_downgrade_(layer.video_type_can_downgrade_),
- protected_video_type_(layer.protected_video_type_),
- ca_layer_(std::move(layer.ca_layer_)),
- av_layer_(std::move(layer.av_layer_)),
- update_indicator_layer_(std::move(layer.update_indicator_layer_)) {
- DCHECK(!layer.ca_layer_);
- DCHECK(!layer.av_layer_);
- DCHECK(!update_indicator_layer_);
-}
-
CARendererLayerTree::ContentLayer::~ContentLayer() {
[ca_layer_ removeFromSuperlayer];
[update_indicator_layer_ removeFromSuperlayer];
}
bool CARendererLayerTree::RootLayer::AddContentLayer(
- CARendererLayerTree* tree,
const CARendererLayerParams& params) {
bool needs_new_clip_and_sorting_layer = true;
@@ -606,16 +879,15 @@ bool CARendererLayerTree::RootLayer::AddContentLayer(
}
}
if (needs_new_clip_and_sorting_layer) {
- clip_and_sorting_layers_.push_back(ClipAndSortingLayer(
- params.is_clipped, params.clip_rect, params.rounded_corner_bounds,
- params.sorting_context_id, is_singleton_sorting_context));
+ clip_and_sorting_layers_.emplace_back(
+ this, params.is_clipped, params.clip_rect, params.rounded_corner_bounds,
+ params.sorting_context_id, is_singleton_sorting_context);
}
- clip_and_sorting_layers_.back().AddContentLayer(tree, params);
+ clip_and_sorting_layers_.back().AddContentLayer(params);
return true;
}
void CARendererLayerTree::ClipAndSortingLayer::AddContentLayer(
- CARendererLayerTree* tree,
const CARendererLayerParams& params) {
bool needs_new_transform_layer = true;
if (!transform_layers_.empty()) {
@@ -624,12 +896,12 @@ void CARendererLayerTree::ClipAndSortingLayer::AddContentLayer(
needs_new_transform_layer = false;
}
if (needs_new_transform_layer)
- transform_layers_.push_back(TransformLayer(params.transform));
- transform_layers_.back().AddContentLayer(tree, params);
+ transform_layers_.emplace_back(this, params.transform);
+
+ transform_layers_.back().AddContentLayer(params);
}
void CARendererLayerTree::TransformLayer::AddContentLayer(
- CARendererLayerTree* tree,
const CARendererLayerParams& params) {
base::ScopedCFTypeRef<IOSurfaceRef> io_surface;
base::ScopedCFTypeRef<CVPixelBufferRef> cv_pixel_buffer;
@@ -649,19 +921,18 @@ void CARendererLayerTree::TransformLayer::AddContentLayer(
// cv_pixel_buffer = io_surface_image->cv_pixel_buffer();
io_surface_color_space = params.image->color_space();
}
- content_layers_.push_back(ContentLayer(
- tree, io_surface, cv_pixel_buffer, params.contents_rect, params.rect,
+ content_layers_.emplace_back(
+ this, io_surface, cv_pixel_buffer, params.contents_rect, params.rect,
params.background_color, io_surface_color_space, params.edge_aa_mask,
- params.opacity, params.filter, params.protected_video_type));
+ params.opacity, params.filter, params.hdr_metadata,
+ params.protected_video_type);
}
void CARendererLayerTree::RootLayer::CommitToCA(CALayer* superlayer,
- RootLayer* old_layer,
- const gfx::Size& pixel_size,
- float scale_factor) {
- if (old_layer) {
- DCHECK(old_layer->ca_layer_);
- std::swap(ca_layer_, old_layer->ca_layer_);
+ const gfx::Size& pixel_size) {
+ if (old_layer_) {
+ DCHECK(old_layer_->ca_layer_);
+ std::swap(ca_layer_, old_layer_->ca_layer_);
} else {
ca_layer_.reset([[CALayer alloc] init]);
[ca_layer_ setAnchorPoint:CGPointZero];
@@ -669,15 +940,15 @@ void CARendererLayerTree::RootLayer::CommitToCA(CALayer* superlayer,
[superlayer addSublayer:ca_layer_];
[superlayer setBorderWidth:0];
}
- if ([ca_layer_ superlayer] != superlayer) {
- DLOG(ERROR) << "CARendererLayerTree root layer not attached to tree.";
- }
- if (WantsFullcreenLowPowerBackdrop()) {
+ DCHECK_EQ([ca_layer_ superlayer], superlayer)
+ << "CARendererLayerTree root layer not attached to tree.";
+
+ if (WantsFullscreenLowPowerBackdrop()) {
// In fullscreen low power mode there exists a single video layer on a
// solid black background.
const gfx::RectF bg_rect(
- ScaleSize(gfx::SizeF(pixel_size), 1 / scale_factor));
+ ScaleSize(gfx::SizeF(pixel_size), 1 / tree_->scale_factor_));
if (gfx::RectF([ca_layer_ frame]) != bg_rect)
[ca_layer_ setFrame:bg_rect.ToCGRect()];
if (![ca_layer_ backgroundColor])
@@ -699,44 +970,52 @@ void CARendererLayerTree::RootLayer::CommitToCA(CALayer* superlayer,
DowngradeAVLayersToCALayers();
}
- for (size_t i = 0; i < clip_and_sorting_layers_.size(); ++i) {
- ClipAndSortingLayer* old_clip_and_sorting_layer = nullptr;
- if (old_layer && i < old_layer->clip_and_sorting_layers_.size()) {
- old_clip_and_sorting_layer = &old_layer->clip_and_sorting_layers_[i];
- }
- clip_and_sorting_layers_[i].CommitToCA(
- ca_layer_.get(), old_clip_and_sorting_layer, scale_factor);
+ CALayer* last_committed_clip_ca_layer = nullptr;
+ for (auto& child_layer : clip_and_sorting_layers_) {
+ child_layer.CommitToCA(last_committed_clip_ca_layer);
+ last_committed_clip_ca_layer = child_layer.clipping_ca_layer_.get();
}
}
void CARendererLayerTree::ClipAndSortingLayer::CommitToCA(
- CALayer* superlayer,
- ClipAndSortingLayer* old_layer,
- float scale_factor) {
+ CALayer* last_committed_clip_ca_layer) {
+ CALayer* superlayer = parent_layer_->ca_layer_.get();
bool update_is_clipped = true;
bool update_clip_rect = true;
- if (old_layer) {
- DCHECK(old_layer->clipping_ca_layer_);
- DCHECK(old_layer->rounded_corner_ca_layer_);
- std::swap(clipping_ca_layer_, old_layer->clipping_ca_layer_);
- std::swap(rounded_corner_ca_layer_, old_layer->rounded_corner_ca_layer_);
- update_is_clipped = old_layer->is_clipped_ != is_clipped_;
- update_clip_rect = update_is_clipped || old_layer->clip_rect_ != clip_rect_;
+ if (old_layer_) {
+ DCHECK(old_layer_->clipping_ca_layer_);
+ DCHECK(old_layer_->rounded_corner_ca_layer_);
+ std::swap(clipping_ca_layer_, old_layer_->clipping_ca_layer_);
+ std::swap(rounded_corner_ca_layer_, old_layer_->rounded_corner_ca_layer_);
+ update_is_clipped = old_layer_->is_clipped_ != is_clipped_;
+ update_clip_rect =
+ update_is_clipped || old_layer_->clip_rect_ != clip_rect_;
+
} else {
clipping_ca_layer_.reset([[CALayer alloc] init]);
[clipping_ca_layer_ setAnchorPoint:CGPointZero];
- [superlayer addSublayer:clipping_ca_layer_];
+
rounded_corner_ca_layer_.reset([[CALayer alloc] init]);
[rounded_corner_ca_layer_ setAnchorPoint:CGPointZero];
[clipping_ca_layer_ addSublayer:rounded_corner_ca_layer_];
}
+ if ([clipping_ca_layer_ superlayer] != superlayer) {
+ DCHECK_EQ([clipping_ca_layer_ superlayer], nil);
+ if (last_committed_clip_ca_layer == nullptr) {
+ [superlayer insertSublayer:clipping_ca_layer_ atIndex:0];
+ } else {
+ [superlayer insertSublayer:clipping_ca_layer_
+ above:last_committed_clip_ca_layer];
+ }
+ }
+
if (!rounded_corner_bounds_.IsEmpty()) {
- if (!old_layer ||
- old_layer->rounded_corner_bounds_ != rounded_corner_bounds_) {
+ if (!old_layer_ ||
+ old_layer_->rounded_corner_bounds_ != rounded_corner_bounds_) {
gfx::RectF dip_rounded_corner_bounds =
gfx::RectF(rounded_corner_bounds_.rect());
- dip_rounded_corner_bounds.Scale(1 / scale_factor);
+ dip_rounded_corner_bounds.Scale(1 / tree()->scale_factor_);
[rounded_corner_ca_layer_ setMasksToBounds:true];
@@ -753,7 +1032,7 @@ void CARendererLayerTree::ClipAndSortingLayer::CommitToCA(
[rounded_corner_ca_layer_
setCornerRadius:rounded_corner_bounds_.GetSimpleRadius() /
- scale_factor];
+ tree()->scale_factor_];
}
} else {
[rounded_corner_ca_layer_ setMasksToBounds:false];
@@ -762,9 +1041,11 @@ void CARendererLayerTree::ClipAndSortingLayer::CommitToCA(
[rounded_corner_ca_layer_ setSublayerTransform:CATransform3DIdentity];
[rounded_corner_ca_layer_ setCornerRadius:0];
}
- if ([clipping_ca_layer_ superlayer] != superlayer) {
- DLOG(ERROR) << "CARendererLayerTree root layer not attached to tree.";
- }
+
+ DCHECK_EQ([clipping_ca_layer_ superlayer], superlayer)
+ << "CARendererLayerTree root layer not attached to tree."
+ << "clipping_ca_layer_: " << clipping_ca_layer_
+ << " last clilp ca_layer: " << last_committed_clip_ca_layer;
if (update_is_clipped)
[clipping_ca_layer_ setMasksToBounds:is_clipped_];
@@ -772,7 +1053,7 @@ void CARendererLayerTree::ClipAndSortingLayer::CommitToCA(
if (update_clip_rect) {
if (is_clipped_) {
gfx::RectF dip_clip_rect = gfx::RectF(clip_rect_);
- dip_clip_rect.Scale(1 / scale_factor);
+ dip_clip_rect.Scale(1 / tree()->scale_factor_);
[clipping_ca_layer_
setPosition:CGPointMake(dip_clip_rect.x(), dip_clip_rect.y())];
[clipping_ca_layer_ setBounds:CGRectMake(0, 0, dip_clip_rect.width(),
@@ -787,34 +1068,59 @@ void CARendererLayerTree::ClipAndSortingLayer::CommitToCA(
}
}
- for (size_t i = 0; i < transform_layers_.size(); ++i) {
- TransformLayer* old_transform_layer = nullptr;
- if (old_layer && i < old_layer->transform_layers_.size())
- old_transform_layer = &old_layer->transform_layers_[i];
- transform_layers_[i].CommitToCA(rounded_corner_ca_layer_,
- old_transform_layer, scale_factor);
+ if (g_print_ca_layers) {
+ std::string str;
+ if (old_layer_) {
+ str = " Reuse, ";
+ } else {
+ str = " New, ";
+ }
+ if (!update_is_clipped && !update_clip_rect)
+ str = str + "HIT";
+
+ VLOG(kOutputLevel) << "ClipAndSortingLayer: clip: " << clipping_ca_layer_
+ << " round:" << rounded_corner_ca_layer_ << str;
+ }
+
+ CALayer* last_committed_transform_ca_layer = nullptr;
+ for (auto& child_layer : transform_layers_) {
+ child_layer.CommitToCA(last_committed_transform_ca_layer);
+ last_committed_transform_ca_layer = child_layer.ca_layer_.get();
}
}
-void CARendererLayerTree::TransformLayer::CommitToCA(CALayer* superlayer,
- TransformLayer* old_layer,
- float scale_factor) {
+void CARendererLayerTree::TransformLayer::CommitToCA(
+ CALayer* last_committed_transform_ca_layer) {
+ CALayer* superlayer = parent_layer_->rounded_corner_ca_layer_.get();
bool update_transform = true;
- if (old_layer) {
- DCHECK(old_layer->ca_layer_);
- std::swap(ca_layer_, old_layer->ca_layer_);
- update_transform = old_layer->transform_ != transform_;
+
+ if (old_layer_) {
+ DCHECK(old_layer_->ca_layer_);
+ std::swap(ca_layer_, old_layer_->ca_layer_);
+ update_transform = old_layer_->transform_ != transform_;
} else {
ca_layer_.reset([[CATransformLayer alloc] init]);
- [superlayer addSublayer:ca_layer_];
}
- DCHECK_EQ([ca_layer_ superlayer], superlayer);
+
+ if ([ca_layer_ superlayer] != superlayer) {
+ DCHECK_EQ([ca_layer_ superlayer], nil);
+ if (last_committed_transform_ca_layer == nullptr) {
+ [superlayer insertSublayer:ca_layer_ atIndex:0];
+ } else {
+ [superlayer insertSublayer:ca_layer_
+ above:last_committed_transform_ca_layer];
+ }
+ }
+
+ DCHECK_EQ([ca_layer_ superlayer], superlayer)
+ << "ca_layer: " << ca_layer_
+ << " last transform ca_layer: " << last_committed_transform_ca_layer;
if (update_transform) {
gfx::Transform pre_scale;
gfx::Transform post_scale;
- pre_scale.Scale(1 / scale_factor, 1 / scale_factor);
- post_scale.Scale(scale_factor, scale_factor);
+ pre_scale.Scale(1 / tree()->scale_factor_, 1 / tree()->scale_factor_);
+ post_scale.Scale(tree()->scale_factor_, tree()->scale_factor_);
gfx::Transform conjugated_transform = pre_scale * transform_ * post_scale;
CATransform3D ca_transform =
@@ -822,18 +1128,29 @@ void CARendererLayerTree::TransformLayer::CommitToCA(CALayer* superlayer,
[ca_layer_ setTransform:ca_transform];
}
- for (size_t i = 0; i < content_layers_.size(); ++i) {
- ContentLayer* old_content_layer = nullptr;
- if (old_layer && i < old_layer->content_layers_.size())
- old_content_layer = &old_layer->content_layers_[i];
- content_layers_[i].CommitToCA(ca_layer_.get(), old_content_layer,
- scale_factor);
+ if (g_print_ca_layers) {
+ std::string str;
+ if (old_layer_) {
+ str = " Reuse, ";
+ } else {
+ str = " New, ";
+ }
+ if (!update_transform)
+ str = str + "HIT";
+
+ VLOG(kOutputLevel) << " TransformLayer: " << ca_layer_ << str;
+ }
+
+ CALayer* last_committed_content_ca_layer_ = nullptr;
+ for (auto& child_layer : content_layers_) {
+ child_layer.CommitToCA(last_committed_content_ca_layer_);
+ last_committed_content_ca_layer_ = child_layer.ca_layer_.get();
}
}
-void CARendererLayerTree::ContentLayer::CommitToCA(CALayer* superlayer,
- ContentLayer* old_layer,
- float scale_factor) {
+void CARendererLayerTree::ContentLayer::CommitToCA(
+ CALayer* last_committed_ca_layer) {
+ CALayer* superlayer = parent_layer_->ca_layer_.get();
bool update_contents = true;
bool update_contents_rect = true;
bool update_rect = true;
@@ -841,19 +1158,23 @@ void CARendererLayerTree::ContentLayer::CommitToCA(CALayer* superlayer,
bool update_ca_edge_aa_mask = true;
bool update_opacity = true;
bool update_ca_filter = true;
- if (old_layer && old_layer->type_ == type_) {
- DCHECK(old_layer->ca_layer_);
- std::swap(ca_layer_, old_layer->ca_layer_);
- std::swap(av_layer_, old_layer->av_layer_);
- update_contents = old_layer->io_surface_ != io_surface_ ||
- old_layer->cv_pixel_buffer_ != cv_pixel_buffer_ ||
- old_layer->solid_color_contents_ != solid_color_contents_;
- update_contents_rect = old_layer->contents_rect_ != contents_rect_;
- update_rect = old_layer->rect_ != rect_;
- update_background_color = old_layer->background_color_ != background_color_;
- update_ca_edge_aa_mask = old_layer->ca_edge_aa_mask_ != ca_edge_aa_mask_;
- update_opacity = old_layer->opacity_ != opacity_;
- update_ca_filter = old_layer->ca_filter_ != ca_filter_;
+
+ if (old_layer_ && old_layer_->type_ == type_) {
+ DCHECK(old_layer_->ca_layer_);
+ std::swap(ca_layer_, old_layer_->ca_layer_);
+ std::swap(av_layer_, old_layer_->av_layer_);
+ update_contents =
+ old_layer_->io_surface_ != io_surface_ ||
+ old_layer_->cv_pixel_buffer_ != cv_pixel_buffer_ ||
+ old_layer_->solid_color_contents_ != solid_color_contents_ ||
+ old_layer_->hdr_metadata_ != hdr_metadata_;
+ update_contents_rect = old_layer_->contents_rect_ != contents_rect_;
+ update_rect = old_layer_->rect_ != rect_;
+ update_background_color =
+ old_layer_->background_color_ != background_color_;
+ update_ca_edge_aa_mask = old_layer_->ca_edge_aa_mask_ != ca_edge_aa_mask_;
+ update_opacity = old_layer_->opacity_ != opacity_;
+ update_ca_filter = old_layer_->ca_filter_ != ca_filter_;
} else {
switch (type_) {
case CALayerType::kHDRCopier:
@@ -873,12 +1194,20 @@ void CARendererLayerTree::ContentLayer::CommitToCA(CALayer* superlayer,
ca_layer_.reset([[CALayer alloc] init]);
}
[ca_layer_ setAnchorPoint:CGPointZero];
- if (old_layer && old_layer->ca_layer_)
- [superlayer replaceSublayer:old_layer->ca_layer_ with:ca_layer_];
- else
- [superlayer addSublayer:ca_layer_];
}
- DCHECK_EQ([ca_layer_ superlayer], superlayer);
+
+ if ([ca_layer_ superlayer] != superlayer) {
+ DCHECK_EQ([ca_layer_ superlayer], nil);
+ if (last_committed_ca_layer == nullptr) {
+ [superlayer insertSublayer:ca_layer_ atIndex:0];
+ } else {
+ [superlayer insertSublayer:ca_layer_ above:last_committed_ca_layer];
+ }
+ }
+
+ DCHECK_EQ([ca_layer_ superlayer], superlayer)
+ << " last contnet ca_layer: " << last_committed_ca_layer;
+
bool update_anything = update_contents || update_contents_rect ||
update_rect || update_background_color ||
update_ca_edge_aa_mask || update_opacity ||
@@ -903,7 +1232,7 @@ void CARendererLayerTree::ContentLayer::CommitToCA(CALayer* superlayer,
}
} else {
result = AVSampleBufferDisplayLayerEnqueueIOSurface(
- av_layer_, io_surface_, io_surface_color_space_);
+ av_layer_, io_surface_, io_surface_color_space_, hdr_metadata_);
if (!result) {
LOG(ERROR) << "AVSampleBufferDisplayLayerEnqueueIOSurface failed";
}
@@ -918,13 +1247,20 @@ void CARendererLayerTree::ContentLayer::CommitToCA(CALayer* superlayer,
if (update_contents) {
if (io_surface_) {
[ca_layer_ setContents:static_cast<id>(io_surface_.get())];
+ // Used for UMA
+ tree()->changed_io_surfaces_during_commit_++;
+ tree()->total_updated_io_surface_size_during_commit_ +=
+ IOSurfaceGetAllocSize(io_surface_);
} else if (solid_color_contents_) {
[ca_layer_ setContents:solid_color_contents_->GetContents()];
} else {
[ca_layer_ setContents:nil];
}
- if ([ca_layer_ respondsToSelector:(@selector(setContentsScale:))])
- [ca_layer_ setContentsScale:scale_factor];
+ [ca_layer_ setContentsScale:tree()->scale_factor_];
+ } else {
+ // Used for UMA
+ if (io_surface_)
+ tree()->unchanged_io_surfaces_during_commit_++;
}
break;
}
@@ -935,7 +1271,7 @@ void CARendererLayerTree::ContentLayer::CommitToCA(CALayer* superlayer,
}
if (update_rect) {
gfx::RectF dip_rect = gfx::RectF(rect_);
- dip_rect.Scale(1 / scale_factor);
+ dip_rect.Scale(1 / tree()->scale_factor_);
[ca_layer_ setPosition:CGPointMake(dip_rect.x(), dip_rect.y())];
[ca_layer_ setBounds:CGRectMake(0, 0, dip_rect.width(), dip_rect.height())];
}
@@ -1037,6 +1373,85 @@ void CARendererLayerTree::ContentLayer::CommitToCA(CALayer* superlayer,
}
}
}
+
+ // Print CALayer optimizaton info
+ if (g_print_ca_layers) {
+ IOSurfaceRef io_surface_ref = io_surface_.get();
+
+ std::string str;
+ if (io_surface_ref) {
+ if (old_layer_ && old_layer_->type_ == type_) {
+ if (update_contents) {
+ IOSurfaceRef old_io_surface = nullptr;
+ if (old_layer_->io_surface_) {
+ old_io_surface = old_layer_->io_surface_.get();
+ } else if (old_layer_->solid_color_contents_) {
+ old_io_surface =
+ old_layer_->solid_color_contents_->GetIOSurfaceRef();
+ }
+
+ str = ", Missed, Reuse " +
+ base::StringPrintf("0x%lx", (unsigned long)old_io_surface);
+ } else {
+ str = ", HIT";
+ }
+ } else {
+ str = ", insert_new";
+ }
+ }
+
+ VLOG(kOutputLevel) << " ContentLayer: " << ca_layer_
+ << " io_surface_ref: " << io_surface_ref << str;
+ }
+}
+
+void CARendererLayerTree::VerifyCommittedCALayers() {
+ bool print_whole_tree = false;
+
+ NSArray<__kindof CALayer*>* _Nullable clip_sublayers =
+ [root_layer_.ca_layer_ sublayers];
+ if (print_whole_tree) {
+ VLOG(kOutputLevel) << "Veryfy Committed CALayers.";
+ VLOG(kOutputLevel) << "Clip and Sorting Sublayers: " << clip_sublayers;
+ }
+
+ int clip_index = 0;
+ for (auto& clip_and_sorting_layer : root_layer_.clip_and_sorting_layers_) {
+ DCHECK_EQ(clip_and_sorting_layer.clipping_ca_layer_.get(),
+ clip_sublayers[clip_index]);
+
+ NSArray<__kindof CALayer*>* _Nullable transform_sublayers =
+ [clip_and_sorting_layer.rounded_corner_ca_layer_ sublayers];
+ if (print_whole_tree) {
+ VLOG(kOutputLevel) << "Transform Sublayers of Clip[" << clip_index
+ << "]: " << transform_sublayers;
+ }
+
+ int transform_index = 0;
+ for (auto& transform_layer : clip_and_sorting_layer.transform_layers_) {
+ DCHECK_EQ(transform_layer.ca_layer_.get(),
+ transform_sublayers[transform_index]);
+
+ NSArray<__kindof CALayer*>* _Nullable content_sublayers =
+ [transform_layer.ca_layer_ sublayers];
+ if (print_whole_tree) {
+ VLOG(kOutputLevel) << "Content Sublayers of Transform["
+ << transform_index << "]: " << content_sublayers;
+ }
+
+ int content_index = 0;
+ for (auto& content_layer : transform_layer.content_layers_) {
+ DCHECK_EQ(content_layer.ca_layer_.get(),
+ content_sublayers[content_index])
+ << "Incorrect content layer "
+ << " ( " << clip_index << ", " << transform_index << ", "
+ << content_index << ")";
+ content_index++;
+ }
+ transform_index++;
+ }
+ clip_index++;
+ }
}
} // namespace ui
diff --git a/chromium/ui/accelerated_widget_mac/io_surface_context.h b/chromium/ui/accelerated_widget_mac/io_surface_context.h
index a46878285b3..e891ca32f8b 100644
--- a/chromium/ui/accelerated_widget_mac/io_surface_context.h
+++ b/chromium/ui/accelerated_widget_mac/io_surface_context.h
@@ -52,7 +52,7 @@ class IOSurfaceContext
IOSurfaceContext(
Type type,
base::ScopedTypeRef<CGLContextObj> clg_context_strong);
- virtual ~IOSurfaceContext();
+ ~IOSurfaceContext() override;
Type type_;
base::ScopedTypeRef<CGLContextObj> cgl_context_;
diff --git a/chromium/ui/accessibility/BUILD.gn b/chromium/ui/accessibility/BUILD.gn
index a98305b4887..16e5316fdd2 100644
--- a/chromium/ui/accessibility/BUILD.gn
+++ b/chromium/ui/accessibility/BUILD.gn
@@ -20,10 +20,12 @@ if (is_win) {
}
mojom("ax_constants_mojo") {
+ generate_java = true
sources = [ "ax_constants.mojom" ]
}
mojom_component("ax_enums_mojo") {
+ generate_java = true
sources = [ "ax_enums.mojom" ]
macro_prefix = "UI_ACCESSIBILITY_AX_MOJOM"
@@ -77,17 +79,29 @@ component("ax_base") {
"ax_tree_update_forward.h",
]
+ if (!is_chromeos_ash) {
+ sources += [
+ "ax_enum_localization_util.cc",
+ "ax_enum_localization_util.h",
+ ]
+ }
+
public_deps = [
":ax_constants_mojo",
":ax_enums_mojo",
"//base",
- "//base:i18n",
- "//ui/base",
"//ui/gfx",
"//ui/gfx/geometry",
- "//ui/strings",
]
+ if (!is_chromeos_ash) {
+ public_deps += [
+ "//base:i18n",
+ "//ui/base",
+ "//ui/strings",
+ ]
+ }
+
deps = [ "//build:chromeos_buildflags" ]
if (is_chromeos_ash) {
@@ -141,6 +155,7 @@ component("accessibility") {
"ax_tree.h",
"ax_tree_combiner.cc",
"ax_tree_combiner.h",
+ "ax_tree_manager.cc",
"ax_tree_manager.h",
"ax_tree_manager_base.cc",
"ax_tree_manager_base.h",
@@ -218,8 +233,12 @@ source_set("ax_assistant") {
static_library("test_support") {
testonly = true
sources = [
+ "platform/test_ax_tree_update.cc",
+ "platform/test_ax_tree_update.h",
"test_ax_node_helper.cc",
"test_ax_node_helper.h",
+ "test_ax_tree_update_json_reader.cc",
+ "test_ax_tree_update_json_reader.h",
"tree_generator.cc",
"tree_generator.h",
]
@@ -290,8 +309,6 @@ test("accessibility_unittests") {
"//ui/gfx:test_support",
]
- data_deps = [ "//testing/buildbot/filters:accessibility_unittests_filters" ]
-
if (is_fuchsia) {
sources += [
"platform/fuchsia/accessibility_bridge_fuchsia_unittest.cc",
@@ -358,6 +375,32 @@ fuzzer_test("ax_table_fuzzer") {
seed_corpus = "fuzz_corpus"
}
+fuzzer_test("ax_node_position_fuzzer") {
+ sources = [
+ "ax_node_position_fuzzer.cc",
+ "ax_tree_fuzzer_util.cc",
+ "ax_tree_fuzzer_util.h",
+ ]
+
+ deps = [ ":accessibility" ]
+}
+
+if (is_win) {
+ fuzzer_test("ax_platform_node_textrangeprovider_win_fuzzer") {
+ sources = [
+ "ax_tree_fuzzer_util.cc",
+ "ax_tree_fuzzer_util.h",
+ "platform/ax_platform_node_textrangeprovider_win_fuzzer.cc",
+ ]
+
+ deps = [
+ ":accessibility",
+ ":test_support",
+ "//base/test:test_support",
+ ]
+ }
+}
+
test("accessibility_perftests") {
testonly = true
sources = [ "ax_node_position_perftest.cc" ]
diff --git a/chromium/ui/accessibility/OWNERS b/chromium/ui/accessibility/OWNERS
index cfdb21e52d3..23fbf83409b 100644
--- a/chromium/ui/accessibility/OWNERS
+++ b/chromium/ui/accessibility/OWNERS
@@ -1,5 +1,6 @@
abigailbklein@google.com
aleventhal@chromium.org
+benjamin.beaudry@microsoft.com
dlibby@microsoft.com
dtseng@chromium.org
katie@chromium.org
diff --git a/chromium/ui/accessibility/accessibility_features.cc b/chromium/ui/accessibility/accessibility_features.cc
index aeaed89ea0f..fa22a30090a 100644
--- a/chromium/ui/accessibility/accessibility_features.cc
+++ b/chromium/ui/accessibility/accessibility_features.cc
@@ -79,6 +79,13 @@ bool IsAutoDisableAccessibilityEnabled() {
return base::FeatureList::IsEnabled(::features::kAutoDisableAccessibility);
}
+const base::Feature kTextBasedAudioDescription{
+ "TextBasedAudioDescription", base::FEATURE_DISABLED_BY_DEFAULT};
+
+bool IsTextBasedAudioDescriptionEnabled() {
+ return base::FeatureList::IsEnabled(::features::kTextBasedAudioDescription);
+}
+
#if BUILDFLAG(IS_WIN)
const base::Feature kIChromeAccessible{"IChromeAccessible",
base::FEATURE_DISABLED_BY_DEFAULT};
@@ -145,21 +152,13 @@ bool IsEnhancedNetworkVoicesEnabled() {
return base::FeatureList::IsEnabled(::features::kEnhancedNetworkVoices);
}
-const base::Feature kAccessibilityOSSettingsReorganization{
- "AccessibilityOSSettingsReorganization", base::FEATURE_DISABLED_BY_DEFAULT};
-
-bool IsAccessibilityOSSettingsReorganizationEnabled() {
- return base::FeatureList::IsEnabled(
- ::features::kAccessibilityOSSettingsReorganization);
-}
const base::Feature kAccessibilityOSSettingsVisibility{
- "AccessibilityOSSettingsVisibility", base::FEATURE_ENABLED_BY_DEFAULT};
+ "AccessibilityOSSettingsVisibility", base::FEATURE_DISABLED_BY_DEFAULT};
bool IsAccessibilityOSSettingsVisibilityEnabled() {
return base::FeatureList::IsEnabled(
::features::kAccessibilityOSSettingsVisibility);
}
-
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
const base::Feature kAugmentExistingImageLabels{
@@ -215,7 +214,7 @@ bool IsScreenAIVisualAnnotationsEnabled() {
}
bool IsScreenAIServiceNeeded() {
- return IsScreenAIVisualAnnotationsEnabled() ||
+ return IsPdfOcrEnabled() || IsScreenAIVisualAnnotationsEnabled() ||
IsReadAnythingWithScreen2xEnabled();
}
diff --git a/chromium/ui/accessibility/accessibility_features.h b/chromium/ui/accessibility/accessibility_features.h
index cb7f3556d84..942d0e2d739 100644
--- a/chromium/ui/accessibility/accessibility_features.h
+++ b/chromium/ui/accessibility/accessibility_features.h
@@ -62,6 +62,14 @@ AX_BASE_EXPORT extern const base::Feature kAutoDisableAccessibility;
// accessibility API usage in that time.
AX_BASE_EXPORT bool IsAutoDisableAccessibilityEnabled();
+// Enables a setting that can turn on/off browser vocalization of 'descriptions'
+// tracks.
+AX_BASE_EXPORT extern const base::Feature kTextBasedAudioDescription;
+
+// Returns true if the setting to turn on text based audio descriptions is
+// enabled.
+AX_BASE_EXPORT bool IsTextBasedAudioDescriptionEnabled();
+
#if BUILDFLAG(IS_WIN)
// Enables an experimental Chrome-specific accessibility COM API
AX_BASE_EXPORT extern const base::Feature kIChromeAccessible;
@@ -118,13 +126,6 @@ AX_BASE_EXPORT extern const base::Feature kEnhancedNetworkVoices;
// Returns true if network-based voices are enabled in Select-to-speak.
AX_BASE_EXPORT bool IsEnhancedNetworkVoicesEnabled();
-// Enables improved Accessibility OS Settings reorganization.
-AX_BASE_EXPORT extern const base::Feature
- kAccessibilityOSSettingsReorganization;
-
-// Returns true if improved Accessibility OS Settings reorganization is enabled.
-AX_BASE_EXPORT bool IsAccessibilityOSSettingsReorganizationEnabled();
-
// Enables improved Accessibility OS Settings visibility.
AX_BASE_EXPORT extern const base::Feature kAccessibilityOSSettingsVisibility;
diff --git a/chromium/ui/accessibility/ax_common.h b/chromium/ui/accessibility/ax_common.h
index 0153b455d7c..74b9575a938 100644
--- a/chromium/ui/accessibility/ax_common.h
+++ b/chromium/ui/accessibility/ax_common.h
@@ -19,7 +19,9 @@
// SANITIZER_CHECK's use case is severe, but recoverable situations that need
// priority debugging. They trigger on Clusterfuzz, debug and sanitizer builds.
-#if defined(AX_FAIL_FAST_BUILD)
+// Prefer DCHECK() when enabled because it logs messages in the crash tool,
+// unlike CHECK().
+#if defined(AX_FAIL_FAST_BUILD) && !DCHECK_IS_ON()
#define SANITIZER_CHECK(val) CHECK(val)
#define SANITIZER_CHECK_EQ(val1, val2) CHECK_EQ(val1, val2)
#define SANITIZER_CHECK_NE(val1, val2) CHECK_NE(val1, val2)
@@ -38,6 +40,6 @@
#define SANITIZER_CHECK_GE(val1, val2) DCHECK_GE(val1, val2)
#define SANITIZER_CHECK_GT(val1, val2) DCHECK_GT(val1, val2)
#define SANITIZER_NOTREACHED() NOTREACHED()
-#endif // AX_FAIL_FAST_BUIL
+#endif // AX_FAIL_FAST_BUILD && !DCHECK_IS_ON()
#endif // UI_ACCESSIBILITY_AX_COMMON_H_
diff --git a/chromium/ui/accessibility/ax_computed_node_data.cc b/chromium/ui/accessibility/ax_computed_node_data.cc
index cbb3f6f33e0..1a6fe8b8d77 100644
--- a/chromium/ui/accessibility/ax_computed_node_data.cc
+++ b/chromium/ui/accessibility/ax_computed_node_data.cc
@@ -25,22 +25,59 @@ AXComputedNodeData::AXComputedNodeData(const AXNode& node) : owner_(&node) {}
AXComputedNodeData::~AXComputedNodeData() = default;
int AXComputedNodeData::GetOrComputeUnignoredIndexInParent() const {
- DCHECK(!owner_->IsIgnored());
+ DCHECK(!owner_->IsIgnored())
+ << "Ignored nodes cannot have an `unignored index in parent`.\n"
+ << *owner_;
if (unignored_index_in_parent_)
return *unignored_index_in_parent_;
- if (const AXNode* unignored_parent = owner_->GetUnignoredParent()) {
+ if (const AXNode* unignored_parent = SlowGetUnignoredParent()) {
+ DCHECK_NE(unignored_parent->id(), kInvalidAXNodeID)
+ << "All nodes should have a valid ID.\n"
+ << *owner_;
unignored_parent->GetComputedNodeData().ComputeUnignoredValues();
} else {
// This should be the root node and, by convention, we assign it an
// index-in-parent of 0.
unignored_index_in_parent_ = 0;
+ unignored_parent_id_ = kInvalidAXNodeID;
}
return *unignored_index_in_parent_;
}
+AXNodeID AXComputedNodeData::GetOrComputeUnignoredParentID() const {
+ if (unignored_parent_id_)
+ return *unignored_parent_id_;
+
+ if (const AXNode* unignored_parent = SlowGetUnignoredParent()) {
+ DCHECK_NE(unignored_parent->id(), kInvalidAXNodeID)
+ << "All nodes should have a valid ID.\n"
+ << *owner_;
+ unignored_parent_id_ = unignored_parent->id();
+ } else {
+ // This should be the root node and, by convention, we assign it an
+ // index-in-parent of 0.
+ DCHECK(!owner_->GetParent())
+ << "If `unignored_parent` is nullptr, then this should be the "
+ "rootnode, since in all trees the rootnode should be unignored.\n"
+ << *owner_;
+ unignored_index_in_parent_ = 0;
+ unignored_parent_id_ = kInvalidAXNodeID;
+ }
+ return *unignored_parent_id_;
+}
+
+AXNode* AXComputedNodeData::GetOrComputeUnignoredParent() const {
+ DCHECK(owner_->tree())
+ << "All nodes should be owned by an accessibility tree.\n"
+ << *owner_;
+ return owner_->tree()->GetFromId(GetOrComputeUnignoredParentID());
+}
+
int AXComputedNodeData::GetOrComputeUnignoredChildCount() const {
- DCHECK(!owner_->IsIgnored());
+ DCHECK(!owner_->IsIgnored())
+ << "Ignored nodes cannot have an `unignored child count`.\n"
+ << *owner_;
if (!unignored_child_count_)
ComputeUnignoredValues();
return *unignored_child_count_;
@@ -48,12 +85,20 @@ int AXComputedNodeData::GetOrComputeUnignoredChildCount() const {
const std::vector<AXNodeID>& AXComputedNodeData::GetOrComputeUnignoredChildIDs()
const {
- DCHECK(!owner_->IsIgnored());
+ DCHECK(!owner_->IsIgnored())
+ << "Ignored nodes cannot have `unignored child IDs`.\n"
+ << *owner_;
if (!unignored_child_ids_)
ComputeUnignoredValues();
return *unignored_child_ids_;
}
+bool AXComputedNodeData::GetOrComputeIsDescendantOfPlatformLeaf() const {
+ if (!is_descendant_of_leaf_)
+ ComputeIsDescendantOfPlatformLeaf();
+ return *is_descendant_of_leaf_;
+}
+
bool AXComputedNodeData::HasOrCanComputeAttribute(
const ax::mojom::StringAttribute attribute) const {
if (owner_->data().HasStringAttribute(attribute))
@@ -235,12 +280,18 @@ int AXComputedNodeData::GetOrComputeTextContentLengthUTF16() const {
}
void AXComputedNodeData::ComputeUnignoredValues(
+ AXNodeID unignored_parent_id,
int starting_index_in_parent) const {
+ DCHECK_GE(starting_index_in_parent, 0);
// Reset any previously computed values.
unignored_index_in_parent_ = absl::nullopt;
+ unignored_parent_id_ = absl::nullopt;
unignored_child_count_ = absl::nullopt;
unignored_child_ids_ = absl::nullopt;
+ AXNodeID unignored_parent_id_for_child = unignored_parent_id;
+ if (!owner_->IsIgnored())
+ unignored_parent_id_for_child = owner_->id();
int unignored_child_count = 0;
std::vector<AXNodeID> unignored_child_ids;
for (auto iter = owner_->AllChildrenBegin(); iter != owner_->AllChildrenEnd();
@@ -250,7 +301,8 @@ void AXComputedNodeData::ComputeUnignoredValues(
if (iter->IsIgnored()) {
// Skip the ignored node and recursively look at its children.
- computed_data.ComputeUnignoredValues(new_index_in_parent);
+ computed_data.ComputeUnignoredValues(unignored_parent_id_for_child,
+ new_index_in_parent);
DCHECK(computed_data.unignored_child_count_);
unignored_child_count += *computed_data.unignored_child_count_;
DCHECK(computed_data.unignored_child_ids_);
@@ -258,18 +310,50 @@ void AXComputedNodeData::ComputeUnignoredValues(
computed_data.unignored_child_ids_->begin(),
computed_data.unignored_child_ids_->end());
} else {
+ // Setting `unignored_index_in_parent_` and `unignored_parent_id_` is the
+ // responsibility of the parent node, since only the parent node can
+ // calculate these values. This is in contrast to `unignored_child_count_`
+ // and `unignored_child_ids_` that are only set if this method is called
+ // on the node itself.
+ computed_data.unignored_index_in_parent_ = new_index_in_parent;
+ if (unignored_parent_id_for_child != kInvalidAXNodeID)
+ computed_data.unignored_parent_id_ = unignored_parent_id_for_child;
+
++unignored_child_count;
unignored_child_ids.push_back(iter->id());
- computed_data.unignored_index_in_parent_ = new_index_in_parent;
}
}
+ if (unignored_parent_id != kInvalidAXNodeID)
+ unignored_parent_id_ = unignored_parent_id;
// Ignored nodes store unignored child information in order to propagate it to
- // their parents, but do not expose it directly.
+ // their parents, but do not expose it directly. The latter is guarded via a
+ // DCHECK.
unignored_child_count_ = unignored_child_count;
unignored_child_ids_ = unignored_child_ids;
}
+AXNode* AXComputedNodeData::SlowGetUnignoredParent() const {
+ AXNode* unignored_parent = owner_->GetParent();
+ while (unignored_parent && unignored_parent->IsIgnored())
+ unignored_parent = unignored_parent->GetParent();
+ return unignored_parent;
+}
+
+void AXComputedNodeData::ComputeIsDescendantOfPlatformLeaf() const {
+ is_descendant_of_leaf_ = false;
+ for (const AXNode* ancestor = GetOrComputeUnignoredParent(); ancestor;
+ ancestor =
+ ancestor->GetComputedNodeData().GetOrComputeUnignoredParent()) {
+ if (ancestor->GetComputedNodeData().is_descendant_of_leaf_.value_or(
+ false) ||
+ ancestor->IsLeaf()) {
+ is_descendant_of_leaf_ = true;
+ return;
+ }
+ }
+}
+
void AXComputedNodeData::ComputeLineOffsetsIfNeeded() const {
if (line_starts_ || line_ends_) {
DCHECK_EQ(line_starts_->size(), line_ends_->size());
@@ -392,7 +476,6 @@ std::string AXComputedNodeData::ComputeTextContentUTF8() const {
if (owner_->IsLeaf() && !is_atomic_text_field_with_descendants) {
switch (owner_->data().GetNameFrom()) {
case ax::mojom::NameFrom::kNone:
- case ax::mojom::NameFrom::kUninitialized:
// The accessible name is not displayed on screen, e.g. aria-label, or is
// not displayed directly inside the node, e.g. an associated label
// element.
diff --git a/chromium/ui/accessibility/ax_computed_node_data.h b/chromium/ui/accessibility/ax_computed_node_data.h
index fe7d526683b..c7e82426111 100644
--- a/chromium/ui/accessibility/ax_computed_node_data.h
+++ b/chromium/ui/accessibility/ax_computed_node_data.h
@@ -15,6 +15,7 @@
#include "ui/accessibility/ax_enums.mojom-forward.h"
#include "ui/accessibility/ax_export.h"
#include "ui/accessibility/ax_node_data.h"
+#include "ui/accessibility/ax_node_id_forward.h"
namespace ui {
@@ -37,6 +38,12 @@ class AX_EXPORT AXComputedNodeData final {
// associated node is ignored.
int GetOrComputeUnignoredIndexInParent() const;
+ // The lowest unignored parent. This value should be computed for all
+ // associated nodes, ignored and unignored. Only the rootnode should not have
+ // an unignored parent.
+ AXNodeID GetOrComputeUnignoredParentID() const;
+ AXNode* GetOrComputeUnignoredParent() const;
+
// If the associated node is unignored, i.e. exposed to the platform's
// assistive software, the number of its children that are also unignored.
// Naturally, this value is not defined when the associated node is ignored.
@@ -46,6 +53,11 @@ class AX_EXPORT AXComputedNodeData final {
// assistive software, the IDs of its children that are also unignored.
const std::vector<AXNodeID>& GetOrComputeUnignoredChildIDs() const;
+ // Whether the associated node is a descendant of a platform leaf. The set of
+ // platform leaves are the lowest nodes that are exposed to the platform's
+ // assistive software.
+ bool GetOrComputeIsDescendantOfPlatformLeaf() const;
+
// Given an accessibility attribute, returns whether the attribute is
// currently present in the node's data, or if it can always be computed on
// demand.
@@ -97,10 +109,20 @@ class AX_EXPORT AXComputedNodeData final {
int GetOrComputeTextContentLengthUTF16() const;
private:
- // Computes and caches the `unignored_index_in_parent_`,
+ // Computes and caches the `unignored_index_in_parent_`, `unignored_parent_`,
// `unignored_child_count_` and `unignored_child_ids_` for the associated
// node.
- void ComputeUnignoredValues(int starting_index_in_parent = 0) const;
+ void ComputeUnignoredValues(AXNodeID unignored_parent_id = kInvalidAXNodeID,
+ int starting_index_in_parent = 0) const;
+
+ // Walks up the accessibility tree from the associated node until it finds the
+ // lowest unignored ancestor.
+ AXNode* SlowGetUnignoredParent() const;
+
+ // Computes and caches (if not already in the cache) whether the associated
+ // node is a descendant of a platform leaf. The set of platform leaves are the
+ // lowest nodes that are exposed to the platform's assistive software.
+ void ComputeIsDescendantOfPlatformLeaf() const;
// Computes and caches (if not already in the cache) the character offsets
// where each line in the associated node's on-screen text starts and ends.
@@ -126,8 +148,10 @@ class AX_EXPORT AXComputedNodeData final {
const raw_ptr<const AXNode> owner_;
mutable absl::optional<int> unignored_index_in_parent_;
+ mutable absl::optional<AXNodeID> unignored_parent_id_;
mutable absl::optional<int> unignored_child_count_;
mutable absl::optional<std::vector<AXNodeID>> unignored_child_ids_;
+ mutable absl::optional<bool> is_descendant_of_leaf_;
mutable absl::optional<std::vector<int32_t>> line_starts_;
mutable absl::optional<std::vector<int32_t>> line_ends_;
mutable absl::optional<std::vector<int32_t>> sentence_starts_;
diff --git a/chromium/ui/accessibility/ax_computed_node_data_unittest.cc b/chromium/ui/accessibility/ax_computed_node_data_unittest.cc
index 5a5a60d15b9..c6e6e16d015 100644
--- a/chromium/ui/accessibility/ax_computed_node_data_unittest.cc
+++ b/chromium/ui/accessibility/ax_computed_node_data_unittest.cc
@@ -13,6 +13,7 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/ax_node_data.h"
+#include "ui/accessibility/ax_node_id_forward.h"
#include "ui/accessibility/ax_position.h"
#include "ui/accessibility/ax_tree.h"
#include "ui/accessibility/ax_tree_data.h"
@@ -159,6 +160,8 @@ using ::testing::StrEq;
TEST_F(AXComputedNodeDataTest, UnignoredValues) {
const AXNode* paragraph_0_node = root_node_->GetChildAtIndex(0);
+ const AXNode* static_text_0_0_ignored_node =
+ paragraph_0_node->GetChildAtIndex(0);
const AXNode* paragraph_1_ignored_node = root_node_->GetChildAtIndex(1);
const AXNode* static_text_1_0_node =
paragraph_1_ignored_node->GetChildAtIndex(0);
@@ -185,6 +188,65 @@ TEST_F(AXComputedNodeDataTest, UnignoredValues) {
.GetOrComputeUnignoredIndexInParent());
EXPECT_EQ(
+ kInvalidAXNodeID,
+ root_node_->GetComputedNodeData().GetOrComputeUnignoredParentID());
+ EXPECT_EQ(nullptr,
+ root_node_->GetComputedNodeData().GetOrComputeUnignoredParent());
+ EXPECT_FALSE(root_node_->GetComputedNodeData()
+ .GetOrComputeIsDescendantOfPlatformLeaf());
+ EXPECT_EQ(root_node_->id(), paragraph_0_node->GetComputedNodeData()
+ .GetOrComputeUnignoredParentID());
+ EXPECT_EQ(
+ root_node_,
+ paragraph_0_node->GetComputedNodeData().GetOrComputeUnignoredParent());
+ EXPECT_FALSE(paragraph_0_node->GetComputedNodeData()
+ .GetOrComputeIsDescendantOfPlatformLeaf());
+ EXPECT_EQ(paragraph_0_node->id(),
+ static_text_0_0_ignored_node->GetComputedNodeData()
+ .GetOrComputeUnignoredParentID());
+ EXPECT_EQ(paragraph_0_node,
+ static_text_0_0_ignored_node->GetComputedNodeData()
+ .GetOrComputeUnignoredParent());
+ EXPECT_TRUE(static_text_0_0_ignored_node->GetComputedNodeData()
+ .GetOrComputeIsDescendantOfPlatformLeaf());
+ EXPECT_EQ(root_node_->id(), paragraph_1_ignored_node->GetComputedNodeData()
+ .GetOrComputeUnignoredParentID());
+ EXPECT_EQ(root_node_, paragraph_1_ignored_node->GetComputedNodeData()
+ .GetOrComputeUnignoredParent());
+ EXPECT_FALSE(paragraph_1_ignored_node->GetComputedNodeData()
+ .GetOrComputeIsDescendantOfPlatformLeaf());
+ EXPECT_EQ(root_node_->id(), static_text_1_0_node->GetComputedNodeData()
+ .GetOrComputeUnignoredParentID());
+ EXPECT_EQ(root_node_, static_text_1_0_node->GetComputedNodeData()
+ .GetOrComputeUnignoredParent());
+ EXPECT_FALSE(static_text_1_0_node->GetComputedNodeData()
+ .GetOrComputeIsDescendantOfPlatformLeaf());
+ EXPECT_EQ(root_node_->id(), paragraph_2_ignored_node->GetComputedNodeData()
+ .GetOrComputeUnignoredParentID());
+ EXPECT_EQ(root_node_, paragraph_2_ignored_node->GetComputedNodeData()
+ .GetOrComputeUnignoredParent());
+ EXPECT_FALSE(paragraph_2_ignored_node->GetComputedNodeData()
+ .GetOrComputeIsDescendantOfPlatformLeaf());
+ EXPECT_EQ(root_node_->id(), link_2_0_ignored_node->GetComputedNodeData()
+ .GetOrComputeUnignoredParentID());
+ EXPECT_EQ(root_node_, link_2_0_ignored_node->GetComputedNodeData()
+ .GetOrComputeUnignoredParent());
+ EXPECT_FALSE(link_2_0_ignored_node->GetComputedNodeData()
+ .GetOrComputeIsDescendantOfPlatformLeaf());
+ EXPECT_EQ(root_node_->id(), static_text_2_0_0_node->GetComputedNodeData()
+ .GetOrComputeUnignoredParentID());
+ EXPECT_EQ(root_node_, static_text_2_0_0_node->GetComputedNodeData()
+ .GetOrComputeUnignoredParent());
+ EXPECT_FALSE(static_text_2_0_0_node->GetComputedNodeData()
+ .GetOrComputeIsDescendantOfPlatformLeaf());
+ EXPECT_EQ(root_node_->id(), static_text_2_0_1_node->GetComputedNodeData()
+ .GetOrComputeUnignoredParentID());
+ EXPECT_EQ(root_node_, static_text_2_0_1_node->GetComputedNodeData()
+ .GetOrComputeUnignoredParent());
+ EXPECT_FALSE(static_text_2_0_1_node->GetComputedNodeData()
+ .GetOrComputeIsDescendantOfPlatformLeaf());
+
+ EXPECT_EQ(
4, root_node_->GetComputedNodeData().GetOrComputeUnignoredChildCount());
EXPECT_EQ(0, paragraph_0_node->GetComputedNodeData()
.GetOrComputeUnignoredChildCount());
@@ -267,7 +329,7 @@ TEST_F(AXComputedNodeDataTest, HasOrCanComputeAttribute) {
TEST_F(AXComputedNodeDataTest, GetOrComputeAttribute) {
// Embedded object behavior is dependant on platform. We manually set it to a
// specific value so that test results are consistent across platforms.
- testing::ScopedAXEmbeddedObjectBehaviorSetter embedded_object_behaviour(
+ ScopedAXEmbeddedObjectBehaviorSetter embedded_object_behaviour(
AXEmbeddedObjectBehavior::kSuppressCharacter);
// Line breaks should be inserted between each paragraph to mirror how HTML's
@@ -449,7 +511,7 @@ TEST_F(AXComputedNodeDataTest, GetOrComputeAttribute) {
TEST_F(AXComputedNodeDataTest, GetOrComputeTextContent) {
// Embedded object behavior is dependant on platform. We manually set it to a
// specific value so that test results are consistent across platforms.
- testing::ScopedAXEmbeddedObjectBehaviorSetter embedded_object_behaviour(
+ ScopedAXEmbeddedObjectBehaviorSetter embedded_object_behaviour(
AXEmbeddedObjectBehavior::kSuppressCharacter);
EXPECT_THAT(root_node_->GetComputedNodeData()
diff --git a/chromium/ui/accessibility/ax_enum_localization_util.cc b/chromium/ui/accessibility/ax_enum_localization_util.cc
new file mode 100644
index 00000000000..ee31b0f5f7c
--- /dev/null
+++ b/chromium/ui/accessibility/ax_enum_localization_util.cc
@@ -0,0 +1,40 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/accessibility/ax_enum_localization_util.h"
+
+#include "ui/accessibility/ax_enums.mojom.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/strings/grit/ax_strings.h"
+
+namespace ui {
+
+std::string ToLocalizedString(ax::mojom::DefaultActionVerb action_verb) {
+ switch (action_verb) {
+ case ax::mojom::DefaultActionVerb::kNone:
+ return "";
+ case ax::mojom::DefaultActionVerb::kActivate:
+ return l10n_util::GetStringUTF8(IDS_AX_ACTIVATE_ACTION_VERB);
+ case ax::mojom::DefaultActionVerb::kCheck:
+ return l10n_util::GetStringUTF8(IDS_AX_CHECK_ACTION_VERB);
+ case ax::mojom::DefaultActionVerb::kClick:
+ return l10n_util::GetStringUTF8(IDS_AX_CLICK_ACTION_VERB);
+ case ax::mojom::DefaultActionVerb::kClickAncestor:
+ return l10n_util::GetStringUTF8(IDS_AX_CLICK_ANCESTOR_ACTION_VERB);
+ case ax::mojom::DefaultActionVerb::kJump:
+ return l10n_util::GetStringUTF8(IDS_AX_JUMP_ACTION_VERB);
+ case ax::mojom::DefaultActionVerb::kOpen:
+ return l10n_util::GetStringUTF8(IDS_AX_OPEN_ACTION_VERB);
+ case ax::mojom::DefaultActionVerb::kPress:
+ return l10n_util::GetStringUTF8(IDS_AX_PRESS_ACTION_VERB);
+ case ax::mojom::DefaultActionVerb::kSelect:
+ return l10n_util::GetStringUTF8(IDS_AX_SELECT_ACTION_VERB);
+ case ax::mojom::DefaultActionVerb::kUncheck:
+ return l10n_util::GetStringUTF8(IDS_AX_UNCHECK_ACTION_VERB);
+ }
+
+ return "";
+}
+
+} // namespace ui
diff --git a/chromium/ui/accessibility/ax_enum_localization_util.h b/chromium/ui/accessibility/ax_enum_localization_util.h
new file mode 100644
index 00000000000..fce548b7f77
--- /dev/null
+++ b/chromium/ui/accessibility/ax_enum_localization_util.h
@@ -0,0 +1,21 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_ACCESSIBILITY_AX_ENUM_LOCALIZATION_UTIL_H_
+#define UI_ACCESSIBILITY_AX_ENUM_LOCALIZATION_UTIL_H_
+
+#include <string>
+
+#include "ui/accessibility/ax_base_export.h"
+#include "ui/accessibility/ax_enums.mojom-forward.h"
+
+namespace ui {
+
+// Returns a localized string that corresponds to the name of the given action.
+AX_BASE_EXPORT std::string ToLocalizedString(
+ ax::mojom::DefaultActionVerb action_verb);
+
+} // namespace ui
+
+#endif // UI_ACCESSIBILITY_AX_ENUM_LOCALIZATION_UTIL_H_
diff --git a/chromium/ui/accessibility/ax_enum_util.cc b/chromium/ui/accessibility/ax_enum_util.cc
index 3a82bcb7f80..aee128d71f5 100644
--- a/chromium/ui/accessibility/ax_enum_util.cc
+++ b/chromium/ui/accessibility/ax_enum_util.cc
@@ -6,9 +6,6 @@
#include "ui/accessibility/ax_enums.mojom.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/strings/grit/ax_strings.h"
-
namespace ui {
const char* ToString(ax::mojom::Event event) {
@@ -750,33 +747,6 @@ const char* ToString(ax::mojom::DefaultActionVerb default_action_verb) {
return "";
}
-std::string ToLocalizedString(ax::mojom::DefaultActionVerb action_verb) {
- switch (action_verb) {
- case ax::mojom::DefaultActionVerb::kNone:
- return "";
- case ax::mojom::DefaultActionVerb::kActivate:
- return l10n_util::GetStringUTF8(IDS_AX_ACTIVATE_ACTION_VERB);
- case ax::mojom::DefaultActionVerb::kCheck:
- return l10n_util::GetStringUTF8(IDS_AX_CHECK_ACTION_VERB);
- case ax::mojom::DefaultActionVerb::kClick:
- return l10n_util::GetStringUTF8(IDS_AX_CLICK_ACTION_VERB);
- case ax::mojom::DefaultActionVerb::kClickAncestor:
- return l10n_util::GetStringUTF8(IDS_AX_CLICK_ANCESTOR_ACTION_VERB);
- case ax::mojom::DefaultActionVerb::kJump:
- return l10n_util::GetStringUTF8(IDS_AX_JUMP_ACTION_VERB);
- case ax::mojom::DefaultActionVerb::kOpen:
- return l10n_util::GetStringUTF8(IDS_AX_OPEN_ACTION_VERB);
- case ax::mojom::DefaultActionVerb::kPress:
- return l10n_util::GetStringUTF8(IDS_AX_PRESS_ACTION_VERB);
- case ax::mojom::DefaultActionVerb::kSelect:
- return l10n_util::GetStringUTF8(IDS_AX_SELECT_ACTION_VERB);
- case ax::mojom::DefaultActionVerb::kUncheck:
- return l10n_util::GetStringUTF8(IDS_AX_UNCHECK_ACTION_VERB);
- }
-
- return "";
-}
-
const char* ToString(ax::mojom::Mutation mutation) {
switch (mutation) {
case ax::mojom::Mutation::kNone:
@@ -1552,8 +1522,6 @@ const char* ToString(ax::mojom::NameFrom name_from) {
switch (name_from) {
case ax::mojom::NameFrom::kNone:
return "none";
- case ax::mojom::NameFrom::kUninitialized:
- return "uninitialized";
case ax::mojom::NameFrom::kAttribute:
return "attribute";
case ax::mojom::NameFrom::kAttributeExplicitlyEmpty:
@@ -1581,6 +1549,8 @@ const char* ToString(ax::mojom::DescriptionFrom description_from) {
return "none";
case ax::mojom::DescriptionFrom::kAriaDescription:
return "ariaDescription";
+ case ax::mojom::DescriptionFrom::kAttributeExplicitlyEmpty:
+ return "attributeExplicitlyEmpty";
case ax::mojom::DescriptionFrom::kButtonLabel:
return "buttonLabel";
case ax::mojom::DescriptionFrom::kPopupElement:
diff --git a/chromium/ui/accessibility/ax_enum_util.h b/chromium/ui/accessibility/ax_enum_util.h
index f3c4605e9de..0bc02e0ad89 100644
--- a/chromium/ui/accessibility/ax_enum_util.h
+++ b/chromium/ui/accessibility/ax_enum_util.h
@@ -36,10 +36,6 @@ AX_BASE_EXPORT const char* ToString(ax::mojom::ActionFlags action_flags);
AX_BASE_EXPORT const char* ToString(
ax::mojom::DefaultActionVerb default_action_verb);
-// Returns a localized string that corresponds to the name of the given action.
-AX_BASE_EXPORT std::string ToLocalizedString(
- ax::mojom::DefaultActionVerb action_verb);
-
// ax::mojom::Mutation
AX_BASE_EXPORT const char* ToString(ax::mojom::Mutation mutation);
diff --git a/chromium/ui/accessibility/ax_enums.mojom b/chromium/ui/accessibility/ax_enums.mojom
index 671d00eaba7..34fcbe230ee 100644
--- a/chromium/ui/accessibility/ax_enums.mojom
+++ b/chromium/ui/accessibility/ax_enums.mojom
@@ -112,8 +112,7 @@ enum Event {
// Next value: 209
[Extensible, Stable, Uuid="d258eb73-e0cc-490c-b881-80ee11d3fec2"]
enum Role {
- // Used for role="none"/"presentation" -- ignored in platform tree.
- [Default]kNone = 0,
+ [Default]kUnknown = 181, // The role has not been set.
kAbbr = 1,
kAlert = 2,
kAlertDialog = 3,
@@ -281,6 +280,7 @@ enum Role {
kMenuListPopup = 128,
kMeter = 129,
kNavigation = 130,
+ kNone = 0, // Used for role="none"/"presentation"; ignored in platform tree.
kNote = 131,
kPane = 132,
kParagraph = 133,
@@ -333,7 +333,6 @@ enum Role {
kTree = 178,
kTreeGrid = 179,
kTreeItem = 180,
- kUnknown = 181,
kVideo = 182,
kWebView = 183,
kWindow = 184,
@@ -1172,7 +1171,6 @@ enum SortDirection {
enum NameFrom {
kNone,
- kUninitialized,
kAttribute, // E.g. aria-label.
kAttributeExplicitlyEmpty,
kCaption, // E.g. in the case of a table, from a caption element.
@@ -1183,17 +1181,55 @@ enum NameFrom {
kValue, // E.g. <input type="button" value="Button's name">.
};
+// The source of the accessible description. Used by some screen readers
+// to determine if and how the description should be presented to the user.
enum DescriptionFrom {
+ // No description has been provided. (See also kAttributeExplicitlyEmpty)
kNone,
+
+ // The description comes from a flat string, such as aria-description (in the
+ // case of web content) or provided by the View.
kAriaDescription,
- kButtonLabel, // HTML-AAM 5.2.2
+
+ // The description has been removed to improve accessibility. Example: The
+ // description normally provided by this View's tooltip contains text which
+ // is also present in this View's name. This could cause screen readers to
+ // speak the information twice, which is not desired. Therefore the
+ // description has been deliberately set to the empty string to prevent
+ // double presentation.
+ kAttributeExplicitlyEmpty,
+
+ // The description comes from the label/text of a button.
+ // See HTML-AAM's Accessible Name and Description Computation.
+ kButtonLabel,
+
+ // The description comes from some other object such as an element referenced
+ // by aria-describedby (in the case of web content), or another View present
+ // in the UI.
kRelatedElement,
+
+ // The description comes from a Ruby annotation.
kRubyAnnotation,
- kSummary, // HTML-AAM 5.8.2
+
+ // The description comes from the contents of a summary element.
+ // See HTML-AAM's Accessible Name and Description Computation.
+ kSummary,
+
+ // The description comes from the text of an SVG desc element.
+ // See SVG-AAM's Accessible Name and Description Computation.
kSvgDescElement,
- kTableCaption, // HTML-AAM 5.9.2
+
+ // The description comes from a table's caption element.
+ // See HTML-AAM's Accessible Name and Description Computation.
+ kTableCaption,
+
+ // The description comes from the title attribute (HTML), the title element
+ // (SVG), or a View's tooltip.
kTitle,
- kPopupElement, // E.g. |triggerpopup| attr pointing to `popup=hint`.
+
+ // The description comes from a non-tooltip popup, e.g. the |triggerpopup|
+ // attribute pointing to `popup=hint`.
+ kPopupElement,
};
// Next value: 4
diff --git a/chromium/ui/accessibility/ax_event_generator.cc b/chromium/ui/accessibility/ax_event_generator.cc
index e8135a1f6b6..c36911b1552 100644
--- a/chromium/ui/accessibility/ax_event_generator.cc
+++ b/chromium/ui/accessibility/ax_event_generator.cc
@@ -745,11 +745,6 @@ void AXEventGenerator::OnTreeDataChanged(AXTree* tree,
DCHECK_EQ(tree_, tree);
DCHECK(tree->root());
- if (new_tree_data.loaded && !old_tree_data.loaded &&
- ShouldFireLoadEvents(tree->root())) {
- AddEvent(tree->root(), Event::LOAD_COMPLETE);
- }
-
if (new_tree_data.title != old_tree_data.title)
AddEvent(tree->root(), Event::DOCUMENT_TITLE_CHANGED);
@@ -775,7 +770,7 @@ void AXEventGenerator::OnTreeDataChanged(AXTree* tree,
// fields, an event should still fire on the field where the selection
// ends.
if (AXNode* text_field = selection_focus->GetTextFieldAncestor())
- AddEvent(text_field, Event::SELECTION_IN_TEXT_FIELD_CHANGED);
+ AddEvent(text_field, Event::TEXT_SELECTION_CHANGED);
}
}
}
@@ -821,13 +816,6 @@ void AXEventGenerator::OnAtomicUpdateFinished(
DCHECK_EQ(tree_, tree);
DCHECK(tree->root());
- if (root_changed && ShouldFireLoadEvents(tree->root())) {
- if (tree->data().loaded)
- AddEvent(tree->root(), Event::LOAD_COMPLETE);
- else
- AddEvent(tree->root(), Event::LOAD_START);
- }
-
for (const auto& change : changes) {
DCHECK(change.node);
@@ -974,16 +962,6 @@ void AXEventGenerator::FireRelationSourceEvents(AXTree* tree,
});
}
-// Attempts to suppress load-related events that we presume no AT will be
-// interested in under any circumstances, such as pages which have no size.
-bool AXEventGenerator::ShouldFireLoadEvents(AXNode* node) {
- if (always_fire_load_complete_)
- return true;
-
- return node->data().relative_bounds.bounds.width() ||
- node->data().relative_bounds.bounds.height();
-}
-
void AXEventGenerator::TrimEventsDueToAncestorIgnoredChanged(
AXNode* node,
std::map<AXNode*, IgnoredChangedStatesBitset>&
@@ -1310,10 +1288,6 @@ const char* ToString(AXEventGenerator::Event event) {
return "liveRelevantChanged";
case AXEventGenerator::Event::LIVE_STATUS_CHANGED:
return "liveStatusChanged";
- case AXEventGenerator::Event::LOAD_COMPLETE:
- return "loadComplete";
- case AXEventGenerator::Event::LOAD_START:
- return "loadStart";
case AXEventGenerator::Event::MENU_ITEM_SELECTED:
return "menuItemSelected";
case ui::AXEventGenerator::Event::MENU_POPUP_END:
@@ -1366,8 +1340,8 @@ const char* ToString(AXEventGenerator::Event event) {
return "selectedChildrenChanged";
case AXEventGenerator::Event::SELECTED_VALUE_CHANGED:
return "selectedValueChanged";
- case AXEventGenerator::Event::SELECTION_IN_TEXT_FIELD_CHANGED:
- return "selectionInTextFieldChanged";
+ case AXEventGenerator::Event::TEXT_SELECTION_CHANGED:
+ return "textSelectionChanged";
case AXEventGenerator::Event::SET_SIZE_CHANGED:
return "setSizeChanged";
case AXEventGenerator::Event::SORT_CHANGED:
diff --git a/chromium/ui/accessibility/ax_event_generator.h b/chromium/ui/accessibility/ax_event_generator.h
index 3f3f0a45fdf..a7ec36be769 100644
--- a/chromium/ui/accessibility/ax_event_generator.h
+++ b/chromium/ui/accessibility/ax_event_generator.h
@@ -86,8 +86,6 @@ class AX_EXPORT AXEventGenerator : public AXTreeObserver {
LIVE_RELEVANT_CHANGED,
// Fired only on the root of the ARIA live region.
LIVE_STATUS_CHANGED,
- LOAD_COMPLETE,
- LOAD_START,
MENU_ITEM_SELECTED,
MENU_POPUP_END,
MENU_POPUP_START,
@@ -114,12 +112,12 @@ class AX_EXPORT AXEventGenerator : public AXTreeObserver {
SELECTED_CHANGED,
SELECTED_CHILDREN_CHANGED,
SELECTED_VALUE_CHANGED,
- SELECTION_IN_TEXT_FIELD_CHANGED,
SET_SIZE_CHANGED,
SORT_CHANGED,
STATE_CHANGED,
SUBTREE_CREATED,
TEXT_ATTRIBUTE_CHANGED,
+ TEXT_SELECTION_CHANGED,
VALUE_IN_TEXT_FIELD_CHANGED,
// This event is fired for the exact set of attributes that affect the
@@ -246,10 +244,6 @@ class AX_EXPORT AXEventGenerator : public AXTreeObserver {
// same order they were added.
void AddEvent(ui::AXNode* node, Event event);
- void set_always_fire_load_complete(bool val) {
- always_fire_load_complete_ = val;
- }
-
void AddEventsForTesting(const AXNode& node,
const std::set<EventParams>& events);
@@ -329,7 +323,6 @@ class AX_EXPORT AXEventGenerator : public AXTreeObserver {
void FireValueInTextFieldChangedEventIfNecessary(AXTree* tree,
AXNode* target_node);
void FireRelationSourceEvents(AXTree* tree, AXNode* target_node);
- bool ShouldFireLoadEvents(AXNode* node);
// Remove excessive events for a tree update containing node.
// We remove certain events on a node when it flips its IGNORED state to
@@ -364,8 +357,6 @@ class AX_EXPORT AXEventGenerator : public AXTreeObserver {
// previously unknown to ATs.
std::set<AXNodeID> nodes_to_suppress_parent_changed_on_;
- bool always_fire_load_complete_ = false;
-
// Helper that tracks live regions.
std::unique_ptr<AXLiveRegionTracker> live_region_tracker_;
diff --git a/chromium/ui/accessibility/ax_event_generator_unittest.cc b/chromium/ui/accessibility/ax_event_generator_unittest.cc
index bf9038fb3fb..0af42405df1 100644
--- a/chromium/ui/accessibility/ax_event_generator_unittest.cc
+++ b/chromium/ui/accessibility/ax_event_generator_unittest.cc
@@ -176,110 +176,6 @@ TEST(AXEventGeneratorTest, IterateThroughEmptyEventSets) {
EXPECT_TRUE(expected_event_map.empty());
}
-TEST(AXEventGeneratorTest, LoadCompleteSameTree) {
- AXTreeUpdate initial_state;
- initial_state.root_id = 1;
- initial_state.nodes.resize(1);
- initial_state.nodes[0].id = 1;
- initial_state.nodes[0].relative_bounds.bounds = gfx::RectF(0, 0, 800, 600);
- initial_state.has_tree_data = true;
- AXTree tree(initial_state);
-
- AXEventGenerator event_generator(&tree);
- ASSERT_THAT(event_generator, IsEmpty());
- AXTreeUpdate load_complete_update = initial_state;
- load_complete_update.tree_data.loaded = true;
-
- ASSERT_TRUE(tree.Unserialize(load_complete_update));
- EXPECT_THAT(event_generator, UnorderedElementsAre(HasEventAtNode(
- AXEventGenerator::Event::LOAD_COMPLETE, 1)));
-}
-
-TEST(AXEventGeneratorTest, LoadCompleteNewTree) {
- AXTreeUpdate initial_state;
- initial_state.root_id = 1;
- initial_state.nodes.resize(1);
- initial_state.nodes[0].id = 1;
- initial_state.has_tree_data = true;
- initial_state.tree_data.loaded = true;
- AXTree tree(initial_state);
-
- AXEventGenerator event_generator(&tree);
- ASSERT_THAT(event_generator, IsEmpty());
- AXTreeUpdate load_complete_update;
- load_complete_update.root_id = 2;
- load_complete_update.nodes.resize(1);
- load_complete_update.nodes[0].id = 2;
- load_complete_update.nodes[0].relative_bounds.bounds =
- gfx::RectF(0, 0, 800, 600);
- load_complete_update.has_tree_data = true;
- load_complete_update.tree_data.loaded = true;
-
- ASSERT_TRUE(tree.Unserialize(load_complete_update));
- EXPECT_THAT(event_generator,
- UnorderedElementsAre(
- HasEventAtNode(AXEventGenerator::Event::LOAD_COMPLETE, 2),
- HasEventAtNode(AXEventGenerator::Event::SUBTREE_CREATED, 2)));
-
- // Load complete should not be emitted for sizeless roots.
- load_complete_update.root_id = 3;
- load_complete_update.nodes.resize(1);
- load_complete_update.nodes[0].id = 3;
- load_complete_update.nodes[0].relative_bounds.bounds = gfx::RectF(0, 0, 0, 0);
- load_complete_update.has_tree_data = true;
- load_complete_update.tree_data.loaded = true;
-
- ASSERT_TRUE(tree.Unserialize(load_complete_update));
- EXPECT_THAT(event_generator,
- UnorderedElementsAre(
- HasEventAtNode(AXEventGenerator::Event::SUBTREE_CREATED, 3)));
-
- // TODO(accessibility): http://crbug.com/888758
- // Load complete should not be emitted for chrome-search URLs.
- load_complete_update.root_id = 4;
- load_complete_update.nodes.resize(1);
- load_complete_update.nodes[0].id = 4;
- load_complete_update.nodes[0].relative_bounds.bounds =
- gfx::RectF(0, 0, 800, 600);
- load_complete_update.nodes[0].AddStringAttribute(
- ax::mojom::StringAttribute::kUrl, "chrome-search://foo");
- load_complete_update.has_tree_data = true;
- load_complete_update.tree_data.loaded = true;
-
- ASSERT_TRUE(tree.Unserialize(load_complete_update));
- EXPECT_THAT(event_generator,
- UnorderedElementsAre(
- HasEventAtNode(AXEventGenerator::Event::LOAD_COMPLETE, 4),
- HasEventAtNode(AXEventGenerator::Event::SUBTREE_CREATED, 4)));
-}
-
-TEST(AXEventGeneratorTest, LoadStart) {
- AXTreeUpdate initial_state;
- initial_state.root_id = 1;
- initial_state.nodes.resize(1);
- initial_state.nodes[0].id = 1;
- initial_state.nodes[0].relative_bounds.bounds = gfx::RectF(0, 0, 800, 600);
- initial_state.has_tree_data = true;
- AXTree tree(initial_state);
-
- AXEventGenerator event_generator(&tree);
- ASSERT_THAT(event_generator, IsEmpty());
- AXTreeUpdate load_start_update;
- load_start_update.root_id = 2;
- load_start_update.nodes.resize(1);
- load_start_update.nodes[0].id = 2;
- load_start_update.nodes[0].relative_bounds.bounds =
- gfx::RectF(0, 0, 800, 600);
- load_start_update.has_tree_data = true;
- load_start_update.tree_data.loaded = false;
-
- ASSERT_TRUE(tree.Unserialize(load_start_update));
- EXPECT_THAT(event_generator,
- UnorderedElementsAre(
- HasEventAtNode(AXEventGenerator::Event::LOAD_START, 2),
- HasEventAtNode(AXEventGenerator::Event::SUBTREE_CREATED, 2)));
-}
-
TEST(AXEventGeneratorTest, DocumentSelectionChanged) {
AXTreeUpdate initial_state;
initial_state.root_id = 1;
@@ -560,15 +456,14 @@ TEST(AXEventGeneratorTest, SelectionInTextFieldChanged) {
UnorderedElementsAre(
HasEventAtNode(AXEventGenerator::Event::DOCUMENT_SELECTION_CHANGED,
root.id),
- HasEventAtNode(
- AXEventGenerator::Event::SELECTION_IN_TEXT_FIELD_CHANGED,
- text_field.id)));
+ HasEventAtNode(AXEventGenerator::Event::TEXT_SELECTION_CHANGED,
+ text_field.id)));
}
event_generator.ClearEvents();
{
// A selection that does not include a text field in it should not raise the
- // "SELECTION_IN_TEXT_FIELD_CHANGED" event.
+ // "TEXT_SELECTION_CHANGED" event.
tree_data.sel_anchor_object_id = root.id;
tree_data.sel_anchor_offset = 0;
tree_data.sel_focus_object_id = root.id;
@@ -587,7 +482,7 @@ TEST(AXEventGeneratorTest, SelectionInTextFieldChanged) {
event_generator.ClearEvents();
{
// A selection that spans more than one node but which nevertheless ends on
- // a text field should still raise the "SELECTION_IN_TEXT_FIELD_CHANGED"
+ // a text field should still raise the "TEXT_SELECTION_CHANGED"
// event.
tree_data.sel_anchor_object_id = root.id;
tree_data.sel_anchor_offset = 0;
@@ -603,9 +498,8 @@ TEST(AXEventGeneratorTest, SelectionInTextFieldChanged) {
UnorderedElementsAre(
HasEventAtNode(AXEventGenerator::Event::DOCUMENT_SELECTION_CHANGED,
root.id),
- HasEventAtNode(
- AXEventGenerator::Event::SELECTION_IN_TEXT_FIELD_CHANGED,
- text_field.id)));
+ HasEventAtNode(AXEventGenerator::Event::TEXT_SELECTION_CHANGED,
+ text_field.id)));
}
}
diff --git a/chromium/ui/accessibility/ax_language_detection.h b/chromium/ui/accessibility/ax_language_detection.h
index eded0ff39f0..61ec4a9c627 100644
--- a/chromium/ui/accessibility/ax_language_detection.h
+++ b/chromium/ui/accessibility/ax_language_detection.h
@@ -7,11 +7,11 @@
#include <memory>
#include <string>
-#include <unordered_map>
-#include <unordered_set>
#include <utility>
#include <vector>
+#include "base/containers/flat_map.h"
+#include "base/containers/flat_set.h"
#include "base/memory/raw_ptr.h"
#include "third_party/cld_3/src/src/nnet_language_identifier.h"
#include "ui/accessibility/ax_enums.mojom-forward.h"
@@ -150,7 +150,7 @@ class AX_EXPORT AXLanguageInfoStats {
friend class AXLanguageDetectionTestFixture;
// Store a count of the occurrences of a given language.
- std::unordered_map<std::string, int> lang_counts_;
+ base::flat_map<std::string, int> lang_counts_;
// Cache of last calculated top language results.
// A vector of pairs of (score, language) sorted by descending score.
@@ -201,7 +201,7 @@ class AX_EXPORT AXLanguageInfoStats {
// Set of top language detected for every node, used to generate the unique
// number of detected languages metric (LangsPerPage).
- std::unordered_set<std::string> unique_top_lang_detected_;
+ base::flat_set<std::string> unique_top_lang_detected_;
};
// AXLanguageDetectionObserver is registered as a change observer on an AXTree
diff --git a/chromium/ui/accessibility/ax_language_detection_unittest.cc b/chromium/ui/accessibility/ax_language_detection_unittest.cc
index 6b4bc538128..f7091ae2994 100644
--- a/chromium/ui/accessibility/ax_language_detection_unittest.cc
+++ b/chromium/ui/accessibility/ax_language_detection_unittest.cc
@@ -10,6 +10,7 @@
#include <memory>
#include "base/command_line.h"
+#include "base/containers/flat_set.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -103,7 +104,7 @@ class AXLanguageDetectionTestFixture : public testing::Test {
return tree.language_detection_manager->lang_info_stats_.count_overridden_;
}
- const std::unordered_set<std::string>& unique_top_lang_detected(
+ const base::flat_set<std::string>& unique_top_lang_detected(
AXTree& tree) const {
return tree.language_detection_manager->lang_info_stats_
.unique_top_lang_detected_;
@@ -672,8 +673,8 @@ TEST_F(AXLanguageDetectionTestStaticContent, MetricCollection) {
// There should be 4 unique languages (de, en, fr, es).
{
const auto& top_lang = unique_top_lang_detected(tree);
- const std::unordered_set<std::string> expected_top_lang = {"de", "en", "es",
- "fr"};
+ const base::flat_set<std::string> expected_top_lang = {"de", "en", "es",
+ "fr"};
EXPECT_EQ(top_lang, expected_top_lang);
}
histograms.ExpectUniqueSample("Accessibility.LanguageDetection.LangsPerPage",
@@ -1182,7 +1183,7 @@ TEST_F(AXLanguageDetectionTestDynamicContent, MetricCollection) {
// There should be 2 unique languages (fr, es).
{
auto top_lang = unique_top_lang_detected(tree);
- const std::unordered_set<std::string> expected_top_lang = {"es", "fr"};
+ const base::flat_set<std::string> expected_top_lang = {"es", "fr"};
EXPECT_EQ(top_lang, expected_top_lang);
}
// There should be a single (unique, 1) value for '2' unique languages.
diff --git a/chromium/ui/accessibility/ax_mode.h b/chromium/ui/accessibility/ax_mode.h
index 56306c72067..895fa7b9c96 100644
--- a/chromium/ui/accessibility/ax_mode.h
+++ b/chromium/ui/accessibility/ax_mode.h
@@ -71,7 +71,8 @@ class AX_BASE_EXPORT AXMode {
// Update this to include the last supported mode flag. If you add
// another, be sure to update the stream insertion operator for
- // logging and debugging.
+ // logging and debugging, as well as AccessibilityModeFlagEnum (and
+ // related metrics callsites, see: |ModeFlagHistogramValue|).
static constexpr uint32_t kLastModeFlag = 1 << 7;
constexpr AXMode() : flags_(0) {}
@@ -107,6 +108,9 @@ class AX_BASE_EXPORT AXMode {
UMA_AX_MODE_INLINE_TEXT_BOXES = 2,
UMA_AX_MODE_SCREEN_READER = 3,
UMA_AX_MODE_HTML = 4,
+ UMA_AX_MODE_HTML_METADATA = 5,
+ UMA_AX_MODE_LABEL_IMAGES = 6,
+ UMA_AX_MODE_PDF = 7,
// This must always be the last enum. It's okay for its value to
// increase, but none of the other enum values may change.
diff --git a/chromium/ui/accessibility/ax_node.cc b/chromium/ui/accessibility/ax_node.cc
index 75687a6e482..452b3907555 100644
--- a/chromium/ui/accessibility/ax_node.cc
+++ b/chromium/ui/accessibility/ax_node.cc
@@ -4,13 +4,10 @@
#include "ui/accessibility/ax_node.h"
-#include <string.h>
-
#include <algorithm>
-#include "base/debug/crash_logging.h"
-#include "base/debug/dump_without_crashing.h"
#include "base/no_destructor.h"
+#include "base/numerics/safe_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
@@ -23,7 +20,6 @@
#include "ui/accessibility/ax_table_info.h"
#include "ui/accessibility/ax_tree.h"
#include "ui/accessibility/ax_tree_manager.h"
-#include "ui/accessibility/ax_tree_manager_map.h"
#include "ui/gfx/color_utils.h"
#include "ui/gfx/geometry/transform.h"
@@ -50,7 +46,6 @@ AXNode::AXNode(AXNode::OwnerTree* tree,
AXNode::~AXNode() = default;
AXNodeData&& AXNode::TakeData() {
- has_data_been_taken_ = true;
return std::move(data_);
}
@@ -67,8 +62,7 @@ size_t AXNode::GetChildCount() const {
size_t AXNode::GetChildCountCrossingTreeBoundary() const {
DCHECK(!tree_->GetTreeUpdateInProgressState());
- const AXTreeManager* child_tree_manager =
- AXTreeManagerMap::GetInstance().GetManagerForChildTree(*this);
+ const AXTreeManager* child_tree_manager = AXTreeManager::ForChildTree(*this);
if (child_tree_manager)
return 1u;
@@ -85,8 +79,7 @@ size_t AXNode::GetUnignoredChildCountCrossingTreeBoundary() const {
// TODO(nektar): Should DCHECK that this node is not ignored.
DCHECK(!tree_->GetTreeUpdateInProgressState());
- const AXTreeManager* child_tree_manager =
- AXTreeManagerMap::GetInstance().GetManagerForChildTree(*this);
+ const AXTreeManager* child_tree_manager = AXTreeManager::ForChildTree(*this);
if (child_tree_manager) {
DCHECK_EQ(unignored_child_count_, 0u)
<< "A node cannot be hosting both a child tree and other nodes as "
@@ -107,8 +100,7 @@ AXNode* AXNode::GetChildAtIndex(size_t index) const {
AXNode* AXNode::GetChildAtIndexCrossingTreeBoundary(size_t index) const {
DCHECK(!tree_->GetTreeUpdateInProgressState());
- const AXTreeManager* child_tree_manager =
- AXTreeManagerMap::GetInstance().GetManagerForChildTree(*this);
+ const AXTreeManager* child_tree_manager = AXTreeManager::ForChildTree(*this);
if (child_tree_manager) {
DCHECK_EQ(index, 0u)
<< "A node cannot be hosting both a child tree and other nodes as "
@@ -137,8 +129,7 @@ AXNode* AXNode::GetUnignoredChildAtIndexCrossingTreeBoundary(
// TODO(nektar): Should DCHECK that this node is not ignored.
DCHECK(!tree_->GetTreeUpdateInProgressState());
- const AXTreeManager* child_tree_manager =
- AXTreeManagerMap::GetInstance().GetManagerForChildTree(*this);
+ const AXTreeManager* child_tree_manager = AXTreeManager::ForChildTree(*this);
if (child_tree_manager) {
DCHECK_EQ(index, 0u)
<< "A node cannot be hosting both a child tree and other nodes as "
@@ -159,36 +150,17 @@ AXNode* AXNode::GetParentCrossingTreeBoundary() const {
DCHECK(!tree_->GetTreeUpdateInProgressState());
if (parent_)
return parent_;
- const AXTreeManager* manager =
- AXTreeManagerMap::GetInstance().GetManager(tree_->GetAXTreeID());
+ const AXTreeManager* manager = GetManager();
if (manager)
return manager->GetParentNodeFromParentTreeAsAXNode();
return nullptr;
}
AXNode* AXNode::GetUnignoredParent() const {
- // TODO(crbug.com/1237353): The following bailout is to test a hypothesis that
- // this function is sometimes called while a tree update is in progress or
- // when data_ isn't valid, which may be the cause of the crash detailed in
- // crbug.com/1237353. Once this hypothesis has been verified, replace the
- // bailout with a fix, which ideally should not call this function under
- // the circumstances hypothesized. Also, add back in the following line:
- // DCHECK(!tree_->GetTreeUpdateInProgressState());
- if (tree_->GetTreeUpdateInProgressState() || !IsDataValid()) {
- static auto* const crash_key = base::debug::AllocateCrashKeyString(
- "ax_node_err", base::debug::CrashKeySize::Size64);
- std::ostringstream error;
- error << "dataUninitialized=" << is_data_still_uninitialized_
- << " dataTaken=" << has_data_been_taken_
- << " treeUpdating=" << tree_->GetTreeUpdateInProgressState();
- base::debug::SetCrashKeyString(crash_key, error.str());
- base::debug::DumpWithoutCrashing();
- return nullptr;
- }
+ DCHECK(!tree_->GetTreeUpdateInProgressState());
AXNode* unignored_parent = GetParent();
while (unignored_parent && unignored_parent->IsIgnored())
unignored_parent = unignored_parent->GetParent();
-
return unignored_parent;
}
@@ -196,8 +168,7 @@ AXNode* AXNode::GetUnignoredParentCrossingTreeBoundary() const {
DCHECK(!tree_->GetTreeUpdateInProgressState());
AXNode* unignored_parent = GetUnignoredParent();
if (!unignored_parent) {
- const AXTreeManager* manager =
- AXTreeManagerMap::GetInstance().GetManager(tree_->GetAXTreeID());
+ const AXTreeManager* manager = GetManager();
if (manager)
unignored_parent = manager->GetParentNodeFromParentTreeAsAXNode();
}
@@ -242,8 +213,7 @@ AXNode* AXNode::GetFirstUnignoredChild() const {
AXNode* AXNode::GetFirstUnignoredChildCrossingTreeBoundary() const {
DCHECK(!tree_->GetTreeUpdateInProgressState());
- const AXTreeManager* child_tree_manager =
- AXTreeManagerMap::GetInstance().GetManagerForChildTree(*this);
+ const AXTreeManager* child_tree_manager = AXTreeManager::ForChildTree(*this);
if (child_tree_manager)
return child_tree_manager->GetRootAsAXNode();
@@ -274,8 +244,7 @@ AXNode* AXNode::GetLastUnignoredChild() const {
AXNode* AXNode::GetLastUnignoredChildCrossingTreeBoundary() const {
DCHECK(!tree_->GetTreeUpdateInProgressState());
- const AXTreeManager* child_tree_manager =
- AXTreeManagerMap::GetInstance().GetManagerForChildTree(*this);
+ const AXTreeManager* child_tree_manager = AXTreeManager::ForChildTree(*this);
if (child_tree_manager)
return child_tree_manager->GetRootAsAXNode();
@@ -288,48 +257,104 @@ AXNode* AXNode::GetDeepestFirstChild() const {
return nullptr;
AXNode* deepest_child = GetFirstChild();
+ DCHECK(deepest_child);
while (deepest_child->GetChildCount())
deepest_child = deepest_child->GetFirstChild();
return deepest_child;
}
+AXNode* AXNode::GetDeepestFirstChildCrossingTreeBoundary() const {
+ DCHECK(!tree_->GetTreeUpdateInProgressState());
+ if (!GetChildCountCrossingTreeBoundary())
+ return nullptr;
+
+ AXNode* deepest_child = GetFirstChildCrossingTreeBoundary();
+ DCHECK(deepest_child);
+ while (deepest_child->GetChildCountCrossingTreeBoundary())
+ deepest_child = deepest_child->GetFirstChildCrossingTreeBoundary();
+
+ return deepest_child;
+}
+
AXNode* AXNode::GetDeepestFirstUnignoredChild() const {
DCHECK(!tree_->GetTreeUpdateInProgressState());
if (!GetUnignoredChildCount())
return nullptr;
AXNode* deepest_child = GetFirstUnignoredChild();
+ DCHECK(deepest_child);
while (deepest_child->GetUnignoredChildCount())
deepest_child = deepest_child->GetFirstUnignoredChild();
return deepest_child;
}
+AXNode* AXNode::GetDeepestFirstUnignoredChildCrossingTreeBoundary() const {
+ DCHECK(!tree_->GetTreeUpdateInProgressState());
+ if (!GetUnignoredChildCountCrossingTreeBoundary())
+ return nullptr;
+
+ AXNode* deepest_child = GetFirstUnignoredChildCrossingTreeBoundary();
+ DCHECK(deepest_child);
+ while (deepest_child->GetUnignoredChildCountCrossingTreeBoundary())
+ deepest_child = deepest_child->GetFirstUnignoredChildCrossingTreeBoundary();
+
+ return deepest_child;
+}
+
AXNode* AXNode::GetDeepestLastChild() const {
DCHECK(!tree_->GetTreeUpdateInProgressState());
if (!GetChildCount())
return nullptr;
AXNode* deepest_child = GetLastChild();
+ DCHECK(deepest_child);
while (deepest_child->GetChildCount())
deepest_child = deepest_child->GetLastChild();
return deepest_child;
}
+AXNode* AXNode::GetDeepestLastChildCrossingTreeBoundary() const {
+ DCHECK(!tree_->GetTreeUpdateInProgressState());
+ if (!GetChildCountCrossingTreeBoundary())
+ return nullptr;
+
+ AXNode* deepest_child = GetLastChildCrossingTreeBoundary();
+ DCHECK(deepest_child);
+ while (deepest_child->GetChildCountCrossingTreeBoundary())
+ deepest_child = deepest_child->GetLastChildCrossingTreeBoundary();
+
+ return deepest_child;
+}
+
AXNode* AXNode::GetDeepestLastUnignoredChild() const {
DCHECK(!tree_->GetTreeUpdateInProgressState());
if (!GetUnignoredChildCount())
return nullptr;
AXNode* deepest_child = GetLastUnignoredChild();
+ DCHECK(deepest_child);
while (deepest_child->GetUnignoredChildCount())
deepest_child = deepest_child->GetLastUnignoredChild();
return deepest_child;
}
+AXNode* AXNode::GetDeepestLastUnignoredChildCrossingTreeBoundary() const {
+ DCHECK(!tree_->GetTreeUpdateInProgressState());
+ if (!GetUnignoredChildCountCrossingTreeBoundary())
+ return nullptr;
+
+ AXNode* deepest_child = GetLastUnignoredChildCrossingTreeBoundary();
+ DCHECK(deepest_child);
+ while (deepest_child->GetUnignoredChildCountCrossingTreeBoundary())
+ deepest_child = deepest_child->GetLastUnignoredChildCrossingTreeBoundary();
+
+ return deepest_child;
+}
+
AXNode* AXNode::GetNextSibling() const {
DCHECK(!tree_->GetTreeUpdateInProgressState());
AXNode* parent = GetParent();
@@ -602,6 +627,11 @@ AXNode::UnignoredChildrenCrossingTreeBoundaryEnd() const {
return UnignoredChildCrossingTreeBoundaryIterator(this, nullptr);
}
+bool AXNode::CanFireEvents() const {
+ // TODO(nektar): Cache the `IsChildOfLeaf` state in `AXComputedNodeData`.
+ return !IsChildOfLeaf();
+}
+
absl::optional<int> AXNode::CompareTo(const AXNode& other) const {
if (this == &other)
return 0;
@@ -663,8 +693,6 @@ bool AXNode::IsLineBreak() const {
void AXNode::SetData(const AXNodeData& src) {
data_ = src;
- is_data_still_uninitialized_ = false;
- has_data_been_taken_ = false;
}
void AXNode::SetLocation(AXNodeID offset_container_id,
@@ -737,6 +765,78 @@ SkColor AXNode::ComputeColorAttribute(ax::mojom::IntAttribute attr) const {
return color;
}
+AXTreeManager* AXNode::GetManager() const {
+ return AXTreeManager::FromID(tree_->GetAXTreeID());
+}
+
+bool AXNode::HasVisibleCaretOrSelection() const {
+ const OwnerTree::Selection selection = GetSelection();
+ const AXNode* focus = tree()->GetFromId(selection.focus_object_id);
+ if (!focus || !focus->IsDescendantOf(this))
+ return false;
+
+ // A selection or the caret will be visible in a focused text field (including
+ // a content editable).
+ const AXNode* text_field = GetTextFieldAncestor();
+ if (text_field)
+ return true;
+
+ // The selection will be visible in non-editable content only if it is not
+ // collapsed.
+ return !selection.IsCollapsed();
+}
+
+AXNode::OwnerTree::Selection AXNode::GetSelection() const {
+ DCHECK(tree()) << "Cannot retrieve the current selection if the node is not "
+ "attached to an accessibility tree.\n"
+ << *this;
+ return tree()->GetSelection();
+}
+
+AXNode::OwnerTree::Selection AXNode::GetUnignoredSelection() const {
+ DCHECK(tree()) << "Cannot retrieve the current selection if the node is not "
+ "attached to an accessibility tree.\n"
+ << *this;
+ OwnerTree::Selection selection = tree()->GetUnignoredSelection();
+
+ // "selection.anchor_offset" and "selection.focus_ofset" might need to be
+ // adjusted if the anchor or the focus nodes include ignored children.
+ //
+ // TODO(nektar): Move this logic into its own "AXSelection" class and cache
+ // the result for faster reuse.
+ const AXNode* anchor = tree()->GetFromId(selection.anchor_object_id);
+ if (anchor && !anchor->IsLeaf()) {
+ DCHECK_GE(selection.anchor_offset, 0);
+ if (static_cast<size_t>(selection.anchor_offset) <
+ anchor->GetChildCount()) {
+ const AXNode* anchor_child =
+ anchor->GetChildAtIndex(selection.anchor_offset);
+ DCHECK(anchor_child);
+ selection.anchor_offset =
+ static_cast<int>(anchor_child->GetUnignoredIndexInParent());
+ } else {
+ selection.anchor_offset =
+ static_cast<int>(anchor->GetUnignoredChildCount());
+ }
+ }
+
+ const AXNode* focus = tree()->GetFromId(selection.focus_object_id);
+ if (focus && !focus->IsLeaf()) {
+ DCHECK_GE(selection.focus_offset, 0);
+ if (static_cast<size_t>(selection.focus_offset) < focus->GetChildCount()) {
+ const AXNode* focus_child =
+ focus->GetChildAtIndex(selection.focus_offset);
+ DCHECK(focus_child);
+ selection.focus_offset =
+ static_cast<int>(focus_child->GetUnignoredIndexInParent());
+ } else {
+ selection.focus_offset =
+ static_cast<int>(focus->GetUnignoredChildCount());
+ }
+ }
+ return selection;
+}
+
bool AXNode::HasStringAttribute(ax::mojom::StringAttribute attribute) const {
return GetComputedNodeData().HasOrCanComputeAttribute(attribute);
}
@@ -840,7 +940,7 @@ const std::string& AXNode::GetNameUTF8() const {
if (GetRole() == ax::mojom::Role::kPortal &&
GetNameFrom() == ax::mojom::NameFrom::kNone) {
const AXTreeManager* child_tree_manager =
- AXTreeManagerMap::GetInstance().GetManagerForChildTree(*this);
+ AXTreeManager::ForChildTree(*this);
if (child_tree_manager)
node = child_tree_manager->GetRootAsAXNode();
}
@@ -955,6 +1055,110 @@ int AXNode::GetTextContentLengthUTF16() const {
return GetComputedNodeData().GetOrComputeTextContentLengthUTF16();
}
+gfx::RectF AXNode::GetTextContentRangeBoundsUTF8(int start_offset,
+ int end_offset) const {
+ DCHECK(!tree_->GetTreeUpdateInProgressState());
+ DCHECK_LE(start_offset, end_offset)
+ << "Invalid `start_offset` and `end_offset`.\n"
+ << start_offset << ' ' << end_offset << "\nin\n"
+ << *this;
+ // Since we DCHECK that `start_offset` <= `end_offset`, there is no need to
+ // check whether `start_offset` is also in range.
+ if (end_offset > GetTextContentLengthUTF8())
+ return gfx::RectF();
+
+ // TODO(nektar): Update this to use
+ // "base/strings/utf_offset_string_conversions.h" which provides caching of
+ // offsets.
+ std::u16string out_trancated_string_utf16;
+ if (!base::UTF8ToUTF16(GetTextContentUTF8().data(),
+ base::checked_cast<size_t>(start_offset),
+ &out_trancated_string_utf16)) {
+ return gfx::RectF();
+ }
+ start_offset = base::checked_cast<int>(out_trancated_string_utf16.length());
+ if (!base::UTF8ToUTF16(GetTextContentUTF8().data(),
+ base::checked_cast<size_t>(end_offset),
+ &out_trancated_string_utf16)) {
+ return gfx::RectF();
+ }
+ end_offset = base::checked_cast<int>(out_trancated_string_utf16.length());
+ return GetTextContentRangeBoundsUTF16(start_offset, end_offset);
+}
+
+gfx::RectF AXNode::GetTextContentRangeBoundsUTF16(int start_offset,
+ int end_offset) const {
+ DCHECK(!tree_->GetTreeUpdateInProgressState());
+ DCHECK_LE(start_offset, end_offset)
+ << "Invalid `start_offset` and `end_offset`.\n"
+ << start_offset << ' ' << end_offset << "\nin\n"
+ << *this;
+ // Since we DCHECK that `start_offset` <= `end_offset`, there is no need to
+ // check whether `start_offset` is also in range.
+ if (end_offset > GetTextContentLengthUTF16())
+ return gfx::RectF();
+
+ const std::vector<int32_t>& character_offsets =
+ GetIntListAttribute(ax::mojom::IntListAttribute::kCharacterOffsets);
+ int character_offsets_length =
+ base::checked_cast<int>(character_offsets.size());
+ // Charactger offsets are always based on the UTF-16 representation of the
+ // text.
+ if (character_offsets_length < GetTextContentLengthUTF16()) {
+ // Blink might not return pixel offsets for all characters. Clamp the
+ // character range to be within the number of provided pixels. Note that the
+ // first character always starts at pixel 0, so an offset for that character
+ // is not provided.
+ //
+ // TODO(accessibility): We need to fix this bug in Blink.
+ start_offset = std::min(start_offset, character_offsets_length);
+ end_offset = std::min(end_offset, character_offsets_length);
+ }
+
+ // TODO(nektar): Remove all this code and fix up the character offsets vector
+ // itself.
+ int start_pixel_offset =
+ start_offset > 0
+ ? character_offsets[base::checked_cast<size_t>(start_offset - 1)]
+ : 0;
+ int end_pixel_offset =
+ end_offset > 0
+ ? character_offsets[base::checked_cast<size_t>(end_offset - 1)]
+ : 0;
+ int max_pixel_offset = character_offsets_length > 0
+ ? character_offsets[character_offsets_length - 1]
+ : 0;
+ const gfx::RectF& node_bounds = data().relative_bounds.bounds;
+
+ gfx::RectF out_bounds;
+ switch (static_cast<ax::mojom::WritingDirection>(
+ GetIntAttribute(ax::mojom::IntAttribute::kTextDirection))) {
+ case ax::mojom::WritingDirection::kNone:
+ case ax::mojom::WritingDirection::kLtr:
+ out_bounds = gfx::RectF(start_pixel_offset, 0,
+ end_pixel_offset - start_pixel_offset,
+ node_bounds.height());
+ break;
+ case ax::mojom::WritingDirection::kRtl: {
+ int left = max_pixel_offset - end_pixel_offset;
+ int right = max_pixel_offset - start_pixel_offset;
+ out_bounds = gfx::RectF(left, 0, right - left, node_bounds.height());
+ break;
+ }
+ case ax::mojom::WritingDirection::kTtb:
+ out_bounds = gfx::RectF(0, start_pixel_offset, node_bounds.width(),
+ end_pixel_offset - start_pixel_offset);
+ break;
+ case ax::mojom::WritingDirection::kBtt: {
+ int top = max_pixel_offset - end_pixel_offset;
+ int bottom = max_pixel_offset - start_pixel_offset;
+ out_bounds = gfx::RectF(0, top, node_bounds.width(), bottom - top);
+ break;
+ }
+ }
+ return out_bounds;
+}
+
std::string AXNode::GetLanguage() const {
DCHECK(!tree_->GetTreeUpdateInProgressState());
// Walk up tree considering both detected and author declared languages.
@@ -1496,6 +1700,7 @@ bool AXNode::IsIgnoredContainerForOrderedSet() const {
GetRole() == ax::mojom::Role::kLabelText ||
GetRole() == ax::mojom::Role::kListItem ||
GetRole() == ax::mojom::Role::kGenericContainer ||
+ GetRole() == ax::mojom::Role::kScrollView ||
GetRole() == ax::mojom::Role::kUnknown;
}
@@ -1555,12 +1760,21 @@ AXNode* AXNode::GetOrderedSet() const {
return result;
}
-bool AXNode::IsDataValid() const {
- return !is_data_still_uninitialized_ && !has_data_been_taken_;
-}
-
bool AXNode::IsReadOnlySupported() const {
- return IsCellOrHeaderOfAriaGrid() || ui::IsReadOnlySupported(GetRole());
+ // Grid cells and headers can't be derived solely from the role (need to check
+ // the ancestor chain) so check this first.
+ if (IsCellOrHeaderOfAriaGrid())
+ return true;
+
+ // kPopUpButton is special in that it is the role Blink assigns for both
+ // role=button with aria-haspopup set, along with <select> elements.
+ // HTML AAM (https://w3c.github.io/html-aam/) maps <select> to the combobox
+ // role, which supports readonly, but readonly is not supported for button
+ // roles.
+ if (GetRole() == ax::mojom::Role::kPopUpButton && !IsMenuListPopUpButton())
+ return false;
+
+ return ui::IsReadOnlySupported(GetRole());
}
bool AXNode::IsReadOnlyOrDisabled() const {
@@ -1675,6 +1889,7 @@ bool AXNode::IsInvisibleOrIgnored() const {
}
bool AXNode::IsChildOfLeaf() const {
+ // TODO(nektar): Cache this state in `AXComputedNodeData`.
for (const AXNode* ancestor = GetUnignoredParent(); ancestor;
ancestor = ancestor->GetUnignoredParent()) {
if (ancestor->IsLeaf())
@@ -1829,11 +2044,9 @@ bool AXNode::IsInListMarker() const {
grandparent_node->GetRole() == ax::mojom::Role::kListMarker;
}
-bool AXNode::IsCollapsedMenuListPopUpButton() const {
- if (GetRole() != ax::mojom::Role::kPopUpButton ||
- !HasState(ax::mojom::State::kCollapsed)) {
+bool AXNode::IsMenuListPopUpButton() const {
+ if (GetRole() != ax::mojom::Role::kPopUpButton)
return false;
- }
// When a popup button contains a menu list popup, its only child is unignored
// and is a menu list popup.
@@ -1844,6 +2057,22 @@ bool AXNode::IsCollapsedMenuListPopUpButton() const {
return node->GetRole() == ax::mojom::Role::kMenuListPopup;
}
+bool AXNode::IsCollapsedMenuListPopUpButton() const {
+ if (!HasState(ax::mojom::State::kCollapsed))
+ return false;
+
+ return IsMenuListPopUpButton();
+}
+
+bool AXNode::IsRootWebAreaForPresentationalIframe() const {
+ if (!ui::IsPlatformDocument(GetRole()))
+ return false;
+ const AXNode* parent = GetUnignoredParentCrossingTreeBoundary();
+ if (!parent)
+ return false;
+ return parent->GetRole() == ax::mojom::Role::kIframePresentational;
+}
+
AXNode* AXNode::GetCollapsedMenuListPopUpButtonAncestor() const {
AXNode* node = GetOrderedSet();
@@ -1911,6 +2140,51 @@ AXNode* AXNode::GetTextFieldAncestor() const {
return nullptr;
}
+AXNode* AXNode::GetTextFieldInnerEditorElement() const {
+ if (!data().IsAtomicTextField() || !GetUnignoredChildCount())
+ return nullptr;
+
+ // Text fields wrap their static text and inline text boxes in generic
+ // containers, and some, like <input type="search">, wrap the wrapper as well.
+ // There are several incarnations of this structure.
+ // 1. An empty atomic text field:
+ // -- Generic container <-- there can be any number of these in a chain.
+ // However, some empty text fields have the below structure, with empty
+ // text boxes.
+ // 2. A single line, an atomic text field with some text in it:
+ // -- Generic container <-- there can be any number of these in a chain.
+ // ---- Static text
+ // ------ Inline text box children (zero or more)
+ // ---- Line Break (optional, a placeholder break element if the text data
+ // ends with '\n' or '\r')
+ // 3. A multiline textarea with some text in it:
+ // Similar to #2, but can repeat the static text, line break children
+ // multiple times.
+
+ AXNode* text_container = GetDeepestFirstUnignoredChild();
+ DCHECK(text_container) << "Unable to retrieve deepest unignored child on\n"
+ << *this;
+ // Non-empty text fields expose a set of static text objects with one or more
+ // inline text boxes each. On some platforms, such as Android, we don't enable
+ // inline text boxes, and only the static text objects are exposed.
+ if (text_container->GetRole() == ax::mojom::Role::kInlineTextBox)
+ text_container = text_container->GetUnignoredParent();
+
+ // Get the parent of the static text or the line break, if any; a line break
+ // is possible when the field contains a line break as its first character.
+ if (text_container->GetRole() == ax::mojom::Role::kStaticText ||
+ text_container->GetRole() == ax::mojom::Role::kLineBreak) {
+ text_container = text_container->GetUnignoredParent();
+ }
+
+ DCHECK(text_container) << "Unexpected unignored parent while computing text "
+ "field inner editor element on\n"
+ << *this;
+ if (text_container->GetRole() == ax::mojom::Role::kGenericContainer)
+ return text_container;
+ return nullptr;
+}
+
AXNode* AXNode::GetSelectionContainer() const {
for (AXNode* ancestor = const_cast<AXNode*>(this); ancestor;
ancestor = ancestor->GetUnignoredParent()) {
diff --git a/chromium/ui/accessibility/ax_node.h b/chromium/ui/accessibility/ax_node.h
index 2a5efdc2176..2a98042c335 100644
--- a/chromium/ui/accessibility/ax_node.h
+++ b/chromium/ui/accessibility/ax_node.h
@@ -24,11 +24,14 @@
#include "ui/accessibility/ax_node_data.h"
#include "ui/accessibility/ax_text_attributes.h"
#include "ui/accessibility/ax_tree_id.h"
+#include "ui/gfx/geometry/rect_f.h"
namespace ui {
class AXComputedNodeData;
class AXTableInfo;
+class AXTreeManager;
+
struct AXLanguageInfo;
struct AXTreeData;
@@ -58,13 +61,27 @@ class AX_EXPORT AXNode final {
// be necessary.
class OwnerTree {
public:
- struct Selection {
- bool is_backward;
- AXNodeID anchor_object_id;
- int anchor_offset;
+ // A data structure that can store either the selected range of nodes in the
+ // accessibility tree, or the location of the caret in the case of a
+ // "collapsed" selection.
+ //
+ // TODO(nektar): Move this struct into its own file called "AXSelection",
+ // turn it into a class and make it compute the unignored selection given
+ // the `AXTreeData`.
+ struct Selection final {
+ // Returns true if this instance represents the position of the caret.
+ constexpr bool IsCollapsed() const {
+ return focus_object_id != kInvalidAXNodeID &&
+ anchor_object_id == focus_object_id &&
+ anchor_offset == focus_offset;
+ }
+
+ bool is_backward = false;
+ AXNodeID anchor_object_id = kInvalidAXNodeID;
+ int anchor_offset = -1;
ax::mojom::TextAffinity anchor_affinity;
- AXNodeID focus_object_id;
- int focus_offset;
+ AXNodeID focus_object_id = kInvalidAXNodeID;
+ int focus_offset = -1;
ax::mojom::TextAffinity focus_affinity;
};
@@ -80,8 +97,13 @@ class AX_EXPORT AXNode final {
virtual absl::optional<int> GetPosInSet(const AXNode& node) = 0;
virtual absl::optional<int> GetSetSize(const AXNode& node) = 0;
+ // See `AXTree::GetSelection`.
+ virtual Selection GetSelection() const = 0;
+ // See `AXTree::GetUnignoredSelection`.
virtual Selection GetUnignoredSelection() const = 0;
+ // See `AXTree::GetTreeUpdateInProgressState`.
virtual bool GetTreeUpdateInProgressState() const = 0;
+ // See `AXTree::HasPaginationSupport`.
virtual bool HasPaginationSupport() const = 0;
};
@@ -111,7 +133,7 @@ class AX_EXPORT AXNode final {
protected:
raw_ptr<const NodeType> parent_;
- raw_ptr<NodeType> child_;
+ raw_ptr<NodeType, DanglingUntriaged> child_;
};
// The constructor requires a parent, id, and index in parent, but
@@ -122,7 +144,7 @@ class AX_EXPORT AXNode final {
AXNode* parent,
AXNodeID id,
size_t index_in_parent,
- size_t unignored_index_in_parent = 0);
+ size_t unignored_index_in_parent = 0u);
virtual ~AXNode();
// Accessors.
@@ -167,10 +189,18 @@ class AX_EXPORT AXNode final {
AXNode* GetLastChildCrossingTreeBoundary() const;
AXNode* GetLastUnignoredChild() const;
AXNode* GetLastUnignoredChildCrossingTreeBoundary() const;
+
+ // TODO(accessibility): Consider renaming all "GetDeepest...Child" methods to
+ // "GetDeepest...Descendant".
AXNode* GetDeepestFirstChild() const;
+ AXNode* GetDeepestFirstChildCrossingTreeBoundary() const;
AXNode* GetDeepestFirstUnignoredChild() const;
+ AXNode* GetDeepestFirstUnignoredChildCrossingTreeBoundary() const;
AXNode* GetDeepestLastChild() const;
+ AXNode* GetDeepestLastChildCrossingTreeBoundary() const;
AXNode* GetDeepestLastUnignoredChild() const;
+ AXNode* GetDeepestLastUnignoredChildCrossingTreeBoundary() const;
+
AXNode* GetNextSibling() const;
AXNode* GetNextUnignoredSibling() const;
AXNode* GetPreviousSibling() const;
@@ -231,6 +261,12 @@ class AX_EXPORT AXNode final {
UnignoredChildCrossingTreeBoundaryIterator
UnignoredChildrenCrossingTreeBoundaryEnd() const;
+ // Returns true if this is a node on which accessibility events make sense to
+ // be fired. Events are not needed on nodes that will, for example, never
+ // appear in a tree that is visible to assistive software, as there will be no
+ // software to handle the event on the other end.
+ bool CanFireEvents() const;
+
// Returns an optional integer indicating the logical order of this node
// compared to another node, or returns an empty optional if the nodes are not
// comparable. Nodes are not comparable if they do not share a common
@@ -246,6 +282,8 @@ class AX_EXPORT AXNode final {
// be before (logically less) the node we visit later.
absl::optional<int> CompareTo(const AXNode& other) const;
+ bool IsDataValid() const { return data_.id != kInvalidAXNodeID; }
+
// Returns true if the node has any of the text related roles, including
// kStaticText, kInlineTextBox and kListMarker (for Legacy Layout). Does not
// include any text field roles.
@@ -292,6 +330,24 @@ class AX_EXPORT AXNode final {
SkColor ComputeColor() const;
SkColor ComputeBackgroundColor() const;
+ AXTreeManager* GetManager() const;
+
+ //
+ // Methods for accessing caret and selection information.
+ //
+
+ // Returns true if the caret is visible or there is an active selection inside
+ // this node.
+ bool HasVisibleCaretOrSelection() const;
+
+ // Gets the current selection from the accessibility tree.
+ OwnerTree::Selection GetSelection() const;
+
+ // Gets the unignored selection from the accessibility tree, meaning the
+ // selection whose endpoints are on unignored nodes. (An "ignored" node is a
+ // node that is not exposed to platform APIs: See `IsIgnored`.)
+ OwnerTree::Selection GetUnignoredSelection() const;
+
//
// Methods for accessing accessibility attributes including attributes that
// are computed on the browser side. (See `AXNodeData` and
@@ -388,6 +444,9 @@ class AX_EXPORT AXNode final {
bool HasHtmlAttribute(const char* attribute) const {
return data().HasHtmlAttribute(attribute);
}
+ std::u16string GetHtmlAttribute(const char* attribute) const {
+ return data().GetHtmlAttribute(attribute);
+ }
bool GetHtmlAttribute(const char* attribute, std::string* value) const {
return data().GetHtmlAttribute(attribute, value);
}
@@ -492,6 +551,18 @@ class AX_EXPORT AXNode final {
int GetTextContentLengthUTF8() const;
int GetTextContentLengthUTF16() const;
+ // Returns the smallest bounding box that can enclose the given range of
+ // characters in the node's text contents. The bounding box is relative to
+ // this node's coordinate system as specified in
+ // `AXNodeData::relative_bounds`.
+ //
+ // Note that `start_offset` and `end_offset` are either in UTF8 or UTF16 code
+ // units, not in grapheme clusters.
+ gfx::RectF GetTextContentRangeBoundsUTF8(int start_offset,
+ int end_offset) const;
+ gfx::RectF GetTextContentRangeBoundsUTF16(int start_offset,
+ int end_offset) const;
+
// Returns a string representing the language code.
//
// This will consider the language declared in the DOM, and may eventually
@@ -659,10 +730,18 @@ class AX_EXPORT AXNode final {
// of a list marker node. Returns false otherwise.
bool IsInListMarker() const;
+ // Returns true if this node is a popup button that is a parent to a menu list
+ // popup.
+ bool IsMenuListPopUpButton() const;
+
// Returns true if this node is a collapsed popup button that is parent to a
// menu list popup.
bool IsCollapsedMenuListPopUpButton() const;
+ // Returns true if this node is at the root of an accessibility tree that is
+ // hosted by a presentational iframe.
+ bool IsRootWebAreaForPresentationalIframe() const;
+
// Returns the popup button ancestor of this current node if any. The popup
// button needs to be the parent of a menu list popup and needs to be
// collapsed.
@@ -680,6 +759,11 @@ class AX_EXPORT AXNode final {
// contenteditable without the role, (see `AXNodeData::IsTextField()`).
AXNode* GetTextFieldAncestor() const;
+ // Get the native text field's deepest container; the lowest descendant that
+ // contains all its text. Returns nullptr if the text field is empty, or if it
+ // is not an atomic text field, (e.g., <input> or <textarea>).
+ AXNode* GetTextFieldInnerEditorElement() const;
+
// If this node is within a container (or widget) that supports either single
// or multiple selection, returns the node that represents the container.
AXNode* GetSelectionContainer() const;
@@ -698,10 +782,6 @@ class AX_EXPORT AXNode final {
// Finds and returns a pointer to ordered set containing node.
AXNode* GetOrderedSet() const;
- // Returns false if the |data_| is uninitialized or has been taken. Returns
- // true otherwise.
- bool IsDataValid() const;
-
// Returns true if the node supports the read-only attribute.
bool IsReadOnlySupported() const;
@@ -741,13 +821,6 @@ class AX_EXPORT AXNode final {
// computed by the tree's source, such as `content::BlinkAXTreeSource`.
AXNodeData data_;
- // Used to track when this object's data_ is valid. If either of these are
- // true, and data is accessed, there will be a crash.
- // TODO(crbug.com/1237353): Wrap this inside of an `#if DCHECK_IS_ON()` after
- // removing `DumpWithoutCrashing`.
- bool is_data_still_uninitialized_ = true;
- bool has_data_been_taken_ = false;
-
// See the class comment in "ax_hypertext.h" for an explanation of this
// member.
mutable AXHypertext hypertext_;
diff --git a/chromium/ui/accessibility/ax_node_data.cc b/chromium/ui/accessibility/ax_node_data.cc
index 639485b34ec..6179db7ebcf 100644
--- a/chromium/ui/accessibility/ax_node_data.cc
+++ b/chromium/ui/accessibility/ax_node_data.cc
@@ -257,9 +257,14 @@ AXNodeData::AXNodeData(AXNodeData&& other) {
html_attributes.swap(other.html_attributes);
child_ids.swap(other.child_ids);
relative_bounds = other.relative_bounds;
+
+ other.id = kInvalidAXNodeID;
+ other.role = ax::mojom::Role::kUnknown;
+ other.state = 0U;
+ other.actions = 0ULL;
}
-AXNodeData& AXNodeData::operator=(AXNodeData other) {
+AXNodeData& AXNodeData::operator=(const AXNodeData& other) {
id = other.id;
role = other.role;
state = other.state;
@@ -458,6 +463,12 @@ bool AXNodeData::GetHtmlAttribute(const char* attribute,
return false;
}
+std::u16string AXNodeData::GetHtmlAttribute(const char* attribute) const {
+ std::u16string value_utf16;
+ GetHtmlAttribute(attribute, &value_utf16);
+ return value_utf16;
+}
+
bool AXNodeData::GetHtmlAttribute(const char* attribute,
std::u16string* value) const {
std::string value_utf8;
@@ -607,9 +618,15 @@ AXTextAttributes AXNodeData::GetTextAttributes() const {
}
void AXNodeData::SetName(const std::string& name) {
- DCHECK_NE(role, ax::mojom::Role::kNone)
- << "A valid role is required before setting the name attribute, because "
- "the role is used for setting the required NameFrom attribute.";
+ // Elements with role='presentation' have Role::kNone. They should not be
+ // named. This check is only relevant if the name is not empty.
+ // TODO(accessibility): It would be nice to have a means to set the name
+ // and role at the same time to avoid this ordering requirement.
+ DCHECK(role != ax::mojom::Role::kNone || name.empty())
+ << "Cannot set name to '" << name << "' on class: '"
+ << GetStringAttribute(ax::mojom::StringAttribute::kClassName)
+ << "' because a valid role is needed to set the default NameFrom "
+ "attribute. Set the role first.";
auto iter = std::find_if(string_attributes.begin(), string_attributes.end(),
[](const auto& string_attribute) {
@@ -623,6 +640,13 @@ void AXNodeData::SetName(const std::string& name) {
iter->second = name;
}
+ // It is possible for SetName to be called after
+ // SetNameExplicitlyEmpty.
+ if (!name.empty() &&
+ GetNameFrom() == ax::mojom::NameFrom::kAttributeExplicitlyEmpty) {
+ RemoveIntAttribute(ax::mojom::IntAttribute::kNameFrom);
+ }
+
if (HasIntAttribute(ax::mojom::IntAttribute::kNameFrom))
return;
// Since this method is mostly used by tests which don't always set the
@@ -650,6 +674,7 @@ void AXNodeData::SetName(const std::u16string& name) {
void AXNodeData::SetNameExplicitlyEmpty() {
SetNameFrom(ax::mojom::NameFrom::kAttributeExplicitlyEmpty);
+ SetName(std::string());
}
void AXNodeData::SetDescription(const std::string& description) {
diff --git a/chromium/ui/accessibility/ax_node_data.h b/chromium/ui/accessibility/ax_node_data.h
index 9d2c3e605d9..6504ead5672 100644
--- a/chromium/ui/accessibility/ax_node_data.h
+++ b/chromium/ui/accessibility/ax_node_data.h
@@ -49,7 +49,7 @@ struct AX_BASE_EXPORT AXNodeData {
AXNodeData(const AXNodeData& other);
AXNodeData(AXNodeData&& other);
- AXNodeData& operator=(AXNodeData other);
+ AXNodeData& operator=(const AXNodeData& other);
// Accessing accessibility attributes:
//
@@ -104,6 +104,7 @@ struct AX_BASE_EXPORT AXNodeData {
bool HasHtmlAttribute(const char* attribute) const;
bool GetHtmlAttribute(const char* attribute, std::string* value) const;
+ std::u16string GetHtmlAttribute(const char* attribute) const;
bool GetHtmlAttribute(const char* attribute, std::u16string* value) const;
//
diff --git a/chromium/ui/accessibility/ax_node_data_unittest.cc b/chromium/ui/accessibility/ax_node_data_unittest.cc
index a9bfa61272e..2092adb21cf 100644
--- a/chromium/ui/accessibility/ax_node_data_unittest.cc
+++ b/chromium/ui/accessibility/ax_node_data_unittest.cc
@@ -10,6 +10,7 @@
#include <utility>
#include "base/containers/contains.h"
+#include "base/test/gtest_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/accessibility/ax_enum_util.h"
#include "ui/accessibility/ax_enums.mojom.h"
@@ -363,6 +364,43 @@ TEST(AXNodeDataTest, SupportsExpandCollapse) {
}
}
+TEST(AXNodeDataTest, SetName) {
+ AXNodeData data;
+ // SetName should not be called on a role of kNone. That role is used for
+ // presentational objects which should not be included in the accessibility
+ // tree. This is enforced by a DCHECK.
+ data.role = ax::mojom::Role::kNone;
+ EXPECT_DCHECK_DEATH(data.SetName("role is presentational"));
+
+ // For roles other than text, setting the name should result in the NameFrom
+ // source being kAttribute.
+ data.role = ax::mojom::Role::kButton;
+ data.SetName("foo");
+ EXPECT_EQ("foo", data.GetStringAttribute(ax::mojom::StringAttribute::kName));
+ EXPECT_EQ(data.GetNameFrom(), ax::mojom::NameFrom::kAttribute);
+
+ // TODO(accessibility): The static text role should have a NameFrom source of
+ // kContents. But nothing clears the NameFrom if the role of an existing
+ // object changes because currently there is no AXNodeData::SetRole method.
+ data.role = ax::mojom::Role::kStaticText;
+ data.SetName("bar");
+ EXPECT_EQ("bar", data.GetStringAttribute(ax::mojom::StringAttribute::kName));
+ EXPECT_EQ(data.GetNameFrom(), ax::mojom::NameFrom::kAttribute);
+
+ data.RemoveIntAttribute(ax::mojom::IntAttribute::kNameFrom);
+ data.SetName("baz");
+ EXPECT_EQ("baz", data.GetStringAttribute(ax::mojom::StringAttribute::kName));
+ EXPECT_EQ(data.GetNameFrom(), ax::mojom::NameFrom::kContents);
+
+ data.SetNameExplicitlyEmpty();
+ EXPECT_EQ("", data.GetStringAttribute(ax::mojom::StringAttribute::kName));
+ EXPECT_EQ(data.GetNameFrom(), ax::mojom::NameFrom::kAttributeExplicitlyEmpty);
+
+ data.SetName("foo");
+ EXPECT_EQ("foo", data.GetStringAttribute(ax::mojom::StringAttribute::kName));
+ EXPECT_EQ(data.GetNameFrom(), ax::mojom::NameFrom::kContents);
+}
+
TEST(AXNodeDataTest, BitFieldsSanityCheck) {
EXPECT_LT(static_cast<size_t>(ax::mojom::State::kMaxValue),
sizeof(AXNodeData::state) * 8);
diff --git a/chromium/ui/accessibility/ax_node_position.cc b/chromium/ui/accessibility/ax_node_position.cc
index 6af347c4e02..6f41e0724de 100644
--- a/chromium/ui/accessibility/ax_node_position.cc
+++ b/chromium/ui/accessibility/ax_node_position.cc
@@ -22,8 +22,6 @@ AXEmbeddedObjectBehavior g_ax_embedded_object_behavior =
AXEmbeddedObjectBehavior::kSuppressCharacter;
#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(USE_ATK)
-namespace testing {
-
ScopedAXEmbeddedObjectBehaviorSetter::ScopedAXEmbeddedObjectBehaviorSetter(
AXEmbeddedObjectBehavior behavior) {
prev_behavior_ = g_ax_embedded_object_behavior;
@@ -34,8 +32,6 @@ ScopedAXEmbeddedObjectBehaviorSetter::~ScopedAXEmbeddedObjectBehaviorSetter() {
g_ax_embedded_object_behavior = prev_behavior_;
}
-} // namespace testing
-
std::string ToString(const AXPositionKind kind) {
static constexpr auto kKindToString =
base::MakeFixedFlatMap<AXPositionKind, const char*>(
diff --git a/chromium/ui/accessibility/ax_node_position_fuzzer.cc b/chromium/ui/accessibility/ax_node_position_fuzzer.cc
new file mode 100644
index 00000000000..6c58f8254a6
--- /dev/null
+++ b/chromium/ui/accessibility/ax_node_position_fuzzer.cc
@@ -0,0 +1,410 @@
+// 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/accessibility/ax_enums.mojom.h"
+#include "ui/accessibility/ax_node.h"
+#include "ui/accessibility/ax_node_data.h"
+#include "ui/accessibility/ax_node_position.h"
+#include "ui/accessibility/ax_position.h"
+#include "ui/accessibility/ax_range.h"
+#include "ui/accessibility/ax_role_properties.h"
+#include "ui/accessibility/ax_tree.h"
+#include "ui/accessibility/ax_tree_data.h"
+#include "ui/accessibility/ax_tree_fuzzer_util.h"
+#include "ui/accessibility/ax_tree_id.h"
+#include "ui/accessibility/ax_tree_update.h"
+#include "ui/accessibility/test_ax_tree_manager.h"
+
+// Max amount of fuzz data needed to create the next position
+const size_t kNextNodePositionMaxDataSize = 4;
+
+// Min/Max node size for generated tree.
+const size_t kMinNodeCount = 10;
+const size_t kMaxNodeCount = kMinNodeCount + 50;
+
+// Min fuzz data needed for fuzzer to function.
+// Tree of minimum size with text for each node + 2 positions.
+const size_t kMinFuzzDataSize =
+ kMinNodeCount * AXTreeFuzzerGenerator::kMinimumNewNodeFuzzDataSize +
+ kMinNodeCount * AXTreeFuzzerGenerator::kMinTextFuzzDataSize +
+ 2 * kNextNodePositionMaxDataSize;
+// Cap fuzz data to avoid slowness.
+const size_t kMaxFuzzDataSize = 20000;
+
+using TestPositionType =
+ std::unique_ptr<ui::AXPosition<ui::AXNodePosition, ui::AXNode>>;
+using TestPositionRange =
+ ui::AXRange<ui::AXPosition<ui::AXNodePosition, ui::AXNode>>;
+
+// Helper to create positions in the given tree.
+class AXNodePositionFuzzerGenerator {
+ public:
+ AXNodePositionFuzzerGenerator(ui::AXTree* tree,
+ ui::AXNodeID max_id,
+ FuzzerData& fuzzer_data);
+
+ TestPositionType CreateNewPosition();
+ TestPositionType GenerateNextPosition(TestPositionType& current_position,
+ TestPositionType& previous_position);
+
+ static void CallPositionAPIs(TestPositionType& position,
+ TestPositionType& other_position);
+
+ private:
+ static ax::mojom::MoveDirection GenerateMoveDirection(unsigned char byte);
+ static ax::mojom::TextAffinity GenerateTextAffinity(unsigned char byte);
+ static ui::AXPositionKind GeneratePositionKind(unsigned char byte);
+ static ui::AXPositionAdjustmentBehavior GenerateAdjustmentBehavior(
+ unsigned char byte);
+ static ui::AXMovementOptions GenerateMovementOptions(
+ unsigned char behavior_byte,
+ unsigned char detection_byte);
+
+ TestPositionType CreateNewPosition(ui::AXNodeID anchor_id,
+ int child_index_or_text_offset,
+ ui::AXPositionKind position_kind,
+ ax::mojom::TextAffinity affinity);
+
+ ui::AXTree* tree_;
+ const ui::AXNodeID max_id_;
+ FuzzerData& fuzzer_data_;
+};
+
+AXNodePositionFuzzerGenerator::AXNodePositionFuzzerGenerator(
+ ui::AXTree* tree,
+ ui::AXNodeID max_id,
+ FuzzerData& fuzzer_data)
+ : tree_(tree), max_id_(max_id), fuzzer_data_(fuzzer_data) {}
+
+TestPositionType AXNodePositionFuzzerGenerator::CreateNewPosition() {
+ return CreateNewPosition(fuzzer_data_.NextByte(), fuzzer_data_.NextByte(),
+ GeneratePositionKind(fuzzer_data_.NextByte()),
+ GenerateTextAffinity(fuzzer_data_.NextByte()));
+}
+
+TestPositionType AXNodePositionFuzzerGenerator::CreateNewPosition(
+ ui::AXNodeID anchor_id,
+ int child_index_or_text_offset,
+ ui::AXPositionKind position_kind,
+ ax::mojom::TextAffinity affinity) {
+ // To ensure that anchor_id is between |ui::kInvalidAXNodeID| and the max ID
+ // of the tree (non-inclusive), get a number [0, max_id - 1) and then shift by
+ // 1 to get [1, max_id)
+ anchor_id = (anchor_id % (max_id_ - 1)) + 1;
+ ui::AXNode* anchor = tree_->GetFromId(anchor_id);
+ DCHECK(anchor);
+
+ switch (position_kind) {
+ case ui::AXPositionKind::TREE_POSITION:
+ // Avoid division by zero in the case where the node has no children.
+ child_index_or_text_offset =
+ anchor->GetChildCount()
+ ? child_index_or_text_offset % anchor->GetChildCount()
+ : 0;
+ return ui::AXNodePosition::CreateTreePosition(
+ tree_->GetAXTreeID(), anchor_id, child_index_or_text_offset);
+ case ui::AXPositionKind::TEXT_POSITION: {
+ // Avoid division by zero in the case where the node has no text.
+ child_index_or_text_offset =
+ anchor->GetTextContentLengthUTF16()
+ ? child_index_or_text_offset % anchor->GetTextContentLengthUTF16()
+ : 0;
+ return ui::AXNodePosition::CreateTextPosition(
+ tree_->GetAXTreeID(), anchor_id, child_index_or_text_offset,
+ affinity);
+ case ui::AXPositionKind::NULL_POSITION:
+ NOTREACHED();
+ return ui::AXNodePosition::CreateNullPosition();
+ }
+ }
+}
+
+ax::mojom::MoveDirection AXNodePositionFuzzerGenerator::GenerateMoveDirection(
+ unsigned char byte) {
+ constexpr unsigned char max_value =
+ static_cast<unsigned char>(ax::mojom::MoveDirection::kMaxValue);
+ return static_cast<ax::mojom::MoveDirection>(byte % max_value);
+}
+
+ax::mojom::TextAffinity AXNodePositionFuzzerGenerator::GenerateTextAffinity(
+ unsigned char byte) {
+ constexpr unsigned char max_value =
+ static_cast<unsigned char>(ax::mojom::TextAffinity::kMaxValue);
+ return static_cast<ax::mojom::TextAffinity>(byte % max_value);
+}
+
+ui::AXPositionKind AXNodePositionFuzzerGenerator::GeneratePositionKind(
+ unsigned char byte) {
+ return byte % 2 ? ui::AXPositionKind::TREE_POSITION
+ : ui::AXPositionKind::TEXT_POSITION;
+}
+
+ui::AXPositionAdjustmentBehavior
+AXNodePositionFuzzerGenerator::GenerateAdjustmentBehavior(unsigned char byte) {
+ return byte % 2 ? ui::AXPositionAdjustmentBehavior::kMoveBackward
+ : ui::AXPositionAdjustmentBehavior::kMoveForward;
+}
+
+ui::AXMovementOptions AXNodePositionFuzzerGenerator::GenerateMovementOptions(
+ unsigned char behavior_byte,
+ unsigned char detection_byte) {
+ return ui::AXMovementOptions(
+ static_cast<ui::AXBoundaryBehavior>(behavior_byte % 3),
+ static_cast<ui::AXBoundaryDetection>(detection_byte % 3));
+}
+
+TestPositionType AXNodePositionFuzzerGenerator::GenerateNextPosition(
+ TestPositionType& current_position,
+ TestPositionType& previous_position) {
+ switch (fuzzer_data_.NextByte() % 55) {
+ case 0:
+ default:
+ return CreateNewPosition();
+ case 1:
+ return current_position->AsValidPosition();
+ case 2:
+ return current_position->AsTreePosition();
+ case 3:
+ return current_position->AsLeafTreePosition();
+ case 4:
+ return current_position->AsTextPosition();
+ case 5:
+ return current_position->AsLeafTextPosition();
+ case 6:
+ return current_position->AsDomSelectionPosition();
+ case 7:
+ return current_position->AsUnignoredPosition(
+ GenerateAdjustmentBehavior(fuzzer_data_.NextByte()));
+ case 8:
+ return current_position->CreateAncestorPosition(
+ previous_position->GetAnchor(),
+ GenerateMoveDirection(fuzzer_data_.NextByte()));
+ case 9:
+ return current_position->CreatePositionAtStartOfAnchor();
+ case 10:
+ return current_position->CreatePositionAtEndOfAnchor();
+ case 11:
+ return current_position->CreatePositionAtStartOfAXTree();
+ case 12:
+ return current_position->CreatePositionAtEndOfAXTree();
+ case 13:
+ return current_position->CreatePositionAtStartOfContent();
+ case 14:
+ return current_position->CreatePositionAtEndOfContent();
+ case 15:
+ return current_position->CreateChildPositionAt(fuzzer_data_.NextByte() %
+ 10);
+ case 16:
+ return current_position->CreateParentPosition(
+ GenerateMoveDirection(fuzzer_data_.NextByte()));
+ case 17:
+ return current_position->CreateNextLeafTreePosition();
+ case 18:
+ return current_position->CreatePreviousLeafTreePosition();
+ case 19:
+ return current_position->CreateNextLeafTextPosition();
+ case 20:
+ return current_position->CreatePreviousLeafTextPosition();
+ case 21:
+ return current_position->AsLeafTextPositionBeforeCharacter();
+ case 22:
+ return current_position->AsLeafTextPositionAfterCharacter();
+ case 23:
+ return current_position->CreatePreviousCharacterPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 24:
+ return current_position->CreateNextWordStartPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 25:
+ return current_position->CreatePreviousWordStartPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 26:
+ return current_position->CreateNextWordEndPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 27:
+ return current_position->CreatePreviousWordEndPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 28:
+ return current_position->CreateNextLineStartPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 29:
+ return current_position->CreatePreviousLineStartPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 30:
+ return current_position->CreateNextLineEndPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 31:
+ return current_position->CreatePreviousLineEndPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 32:
+ return current_position->CreateNextFormatStartPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 33:
+ return current_position->CreatePreviousFormatStartPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 34:
+ return current_position->CreateNextFormatEndPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 35:
+ return current_position->CreatePreviousFormatEndPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 36:
+ return current_position->CreateNextSentenceStartPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 37:
+ return current_position->CreatePreviousSentenceStartPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 38:
+ return current_position->CreateNextSentenceEndPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 39:
+ return current_position->CreatePreviousSentenceEndPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 40:
+ return current_position->CreateNextParagraphStartPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 41:
+ return current_position
+ ->CreateNextParagraphStartPositionSkippingEmptyParagraphs(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 42:
+ return current_position->CreatePreviousParagraphStartPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 43:
+ return current_position
+ ->CreatePreviousParagraphStartPositionSkippingEmptyParagraphs(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 44:
+ return current_position->CreateNextParagraphEndPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 45:
+ return current_position->CreatePreviousParagraphEndPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 46:
+ return current_position->CreateNextPageStartPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 47:
+ return current_position->CreatePreviousPageStartPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 48:
+ return current_position->CreateNextPageEndPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 49:
+ return current_position->CreatePreviousPageEndPosition(
+ GenerateMovementOptions(fuzzer_data_.NextByte(),
+ fuzzer_data_.NextByte()));
+ case 52:
+ return current_position->CreateNextAnchorPosition();
+ case 53:
+ return current_position->CreatePreviousAnchorPosition();
+ case 54:
+ return current_position->LowestCommonAncestorPosition(
+ *previous_position, GenerateMoveDirection(fuzzer_data_.NextByte()));
+ }
+}
+
+void AXNodePositionFuzzerGenerator::CallPositionAPIs(
+ TestPositionType& position,
+ TestPositionType& other_position) {
+ // Call APIs on the created position. We don't care about any of the results,
+ // we just want to make sure none of these crash or hang.
+ std::ignore = position->GetAnchor();
+ std::ignore = position->GetAnchorSiblingCount();
+ std::ignore = position->IsIgnored();
+ std::ignore = position->IsLeaf();
+ std::ignore = position->IsValid();
+ std::ignore = position->AtStartOfWord();
+ std::ignore = position->AtEndOfWord();
+ std::ignore = position->AtStartOfLine();
+ std::ignore = position->AtEndOfLine();
+ std::ignore = position->GetFormatStartBoundaryType();
+ std::ignore = position->GetFormatEndBoundaryType();
+ std::ignore = position->AtStartOfSentence();
+ std::ignore = position->AtEndOfSentence();
+ std::ignore = position->AtStartOfParagraph();
+ std::ignore = position->AtEndOfParagraph();
+ std::ignore = position->AtStartOfInlineBlock();
+ std::ignore = position->AtStartOfPage();
+ std::ignore = position->AtEndOfPage();
+ std::ignore = position->AtStartOfAXTree();
+ std::ignore = position->AtEndOfAXTree();
+ std::ignore = position->AtStartOfContent();
+ std::ignore = position->AtEndOfContent();
+ std::ignore = position->LowestCommonAnchor(*other_position);
+ std::ignore = position->CompareTo(*other_position);
+ std::ignore = position->GetText();
+ std::ignore = position->IsPointingToLineBreak();
+ std::ignore = position->IsInTextObject();
+ std::ignore = position->IsInWhiteSpace();
+ std::ignore = position->MaxTextOffset();
+ std::ignore = position->GetRole();
+}
+
+// Entry point for LibFuzzer.
+extern "C" int LLVMFuzzerTestOneInput(const unsigned char* data, size_t size) {
+ if (size < kMinFuzzDataSize || size > kMaxFuzzDataSize)
+ return 0;
+ AXTreeFuzzerGenerator generator;
+ FuzzerData fuzz_data(data, size);
+ const size_t node_count =
+ kMinNodeCount + fuzz_data.NextByte() % kMaxNodeCount;
+ generator.GenerateInitialUpdate(fuzz_data, node_count);
+ ui::AXNodeID max_id = generator.GetMaxAssignedID();
+
+ ui::AXTree* tree = generator.GetTree();
+
+ // Run with --v=1 to aid in debugging a specific crash.
+ VLOG(1) << tree->ToString();
+
+ // Check to ensure there is enough fuzz data to create two positions.
+ if (fuzz_data.RemainingBytes() < kNextNodePositionMaxDataSize * 2)
+ return 0;
+ AXNodePositionFuzzerGenerator position_fuzzer(tree, max_id, fuzz_data);
+
+ // Having two positions allows us to test "more interesting" APIs that do work
+ // on multiple positions.
+ TestPositionType previous_position = position_fuzzer.CreateNewPosition();
+ TestPositionType position = position_fuzzer.CreateNewPosition();
+
+ while (fuzz_data.RemainingBytes() > kNextNodePositionMaxDataSize) {
+ // Run with --v=1 to aid in debugging a specific crash.
+ VLOG(1) << position->ToString() << fuzz_data.RemainingBytes();
+
+ position_fuzzer.CallPositionAPIs(position, previous_position);
+
+ // Determine next position to test:
+ TestPositionType next_position =
+ position_fuzzer.GenerateNextPosition(position, previous_position);
+ previous_position = std::move(position);
+ position = std::move(next_position);
+ }
+
+ return 0;
+}
diff --git a/chromium/ui/accessibility/ax_node_position_unittest.cc b/chromium/ui/accessibility/ax_node_position_unittest.cc
index 32c2f162137..c63083f407d 100644
--- a/chromium/ui/accessibility/ax_node_position_unittest.cc
+++ b/chromium/ui/accessibility/ax_node_position_unittest.cc
@@ -125,7 +125,7 @@ class AXPositionTest : public ::testing::Test, public TestAXTreeManager {
AXNodeData inline_box2_;
private:
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behaviour_;
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behaviour_;
// Manages a minimalistic Views tree that is hosting the test webpage.
TestAXTreeManager views_tree_manager_;
};
@@ -3032,7 +3032,7 @@ TEST_F(AXPositionTest, AtStartOrEndOfParagraphWithIgnoredNodes) {
}
TEST_F(AXPositionTest, AtStartOrEndOfParagraphWithEmbeddedObjectCharacter) {
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
AXEmbeddedObjectBehavior::kExposeCharacter);
// This test ensures that "At{Start|End}OfParagraph" work correctly when there
@@ -4088,7 +4088,7 @@ TEST_F(AXPositionTest, AsLeafTextPositionWithTextPositionAndEmptyTextSandwich) {
AXNodeData button_data;
button_data.id = 3;
button_data.role = ax::mojom::Role::kButton;
- button_data.SetName("");
+ button_data.SetNameExplicitlyEmpty();
button_data.SetNameFrom(ax::mojom::NameFrom::kContents);
AXNodeData more_text_data;
@@ -4131,7 +4131,7 @@ TEST_F(AXPositionTest, AsLeafTextPositionWithTextPositionAndEmptyTextSandwich) {
}
TEST_F(AXPositionTest, AsLeafTextPositionWithTextPositionAndEmbeddedObject) {
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
AXEmbeddedObjectBehavior::kExposeCharacter);
// ++1 kRootWebArea "<embedded_object><embedded_object>"
@@ -4883,7 +4883,7 @@ TEST_F(AXPositionTest, CreatePositionAtPreviousFormatStartWithNullPosition) {
}
TEST_F(AXPositionTest, CreatePositionAtPreviousFormatStartWithTreePosition) {
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
AXEmbeddedObjectBehavior::kExposeCharacter);
TestPositionType tree_position = AXNodePosition::CreateTreePosition(
GetTreeID(), static_text1_.id, 1 /* child_index */);
@@ -4943,7 +4943,7 @@ TEST_F(AXPositionTest, CreatePositionAtPreviousFormatStartWithTreePosition) {
}
TEST_F(AXPositionTest, CreatePositionAtPreviousFormatStartWithTextPosition) {
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
AXEmbeddedObjectBehavior::kExposeCharacter);
TestPositionType text_position = AXNodePosition::CreateTextPosition(
GetTreeID(), inline_box1_.id, 2 /* text_offset */,
@@ -5020,7 +5020,7 @@ TEST_F(AXPositionTest, CreatePositionAtNextFormatEndWithNullPosition) {
}
TEST_F(AXPositionTest, CreatePositionAtNextFormatEndWithTreePosition) {
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
AXEmbeddedObjectBehavior::kExposeCharacter);
TestPositionType tree_position = AXNodePosition::CreateTreePosition(
GetTreeID(), button_.id, 0 /* child_index */);
@@ -5087,7 +5087,7 @@ TEST_F(AXPositionTest, CreatePositionAtNextFormatEndWithTreePosition) {
}
TEST_F(AXPositionTest, CreatePositionAtNextFormatEndWithTextPosition) {
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
AXEmbeddedObjectBehavior::kExposeCharacter);
TestPositionType text_position = AXNodePosition::CreateTextPosition(
GetTreeID(), button_.id, 0 /* text_offset */,
@@ -5163,7 +5163,7 @@ TEST_F(AXPositionTest, CreatePositionAtNextFormatEndWithTextPosition) {
}
TEST_F(AXPositionTest, CreatePositionAtNextFormatEndOnEmbeddedObject) {
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
AXEmbeddedObjectBehavior::kExposeCharacter);
// ++root_1
// ++++heading_2
@@ -7772,7 +7772,7 @@ TEST_F(AXPositionTest, CreateParentPositionWithMoveDirection) {
// This test only applies when "object replacement characters" are used in the
// accessibility tree, e.g., in IAccessible2, UI Automation and Linux ATK
// APIs.
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
AXEmbeddedObjectBehavior::kExposeCharacter);
// This test ensures that "CreateParentPosition" (and by extension
@@ -8632,7 +8632,7 @@ TEST_F(AXPositionTest, CreateParentAndLeafPositionWithEmptyNodes) {
}
TEST_F(AXPositionTest, CreateParentAndLeafPositionWithEmbeddedObjects) {
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
AXEmbeddedObjectBehavior::kExposeCharacter);
// ++kRootWebArea "<embedded>Hello<embedded>"
@@ -9653,7 +9653,7 @@ TEST_F(AXPositionTest, AsValidPosition) {
}
TEST_F(AXPositionTest, AsValidPositionInDescendantOfEmptyObject) {
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
AXEmbeddedObjectBehavior::kExposeCharacter);
// ++1 kRootWebArea
@@ -10538,7 +10538,7 @@ TEST_F(AXPositionTest, OperatorEqualsSameTextOffsetDifferentAnchorIdLeaf) {
}
TEST_F(AXPositionTest, OperatorEqualsTextPositionsInTextField) {
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
AXEmbeddedObjectBehavior::kExposeCharacter);
// ++1 kRootWebArea
@@ -10603,7 +10603,7 @@ TEST_F(AXPositionTest, OperatorEqualsTextPositionsInTextField) {
}
TEST_F(AXPositionTest, OperatorEqualsTextPositionsInSearchBox) {
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
AXEmbeddedObjectBehavior::kExposeCharacter);
// ++1 kRootWebArea
@@ -10705,7 +10705,7 @@ TEST_F(AXPositionTest, OperatorEqualsTextPositionsInSearchBox) {
}
TEST_F(AXPositionTest, OperatorsTreePositionsAroundEmbeddedCharacter) {
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
AXEmbeddedObjectBehavior::kExposeCharacter);
// ++1 kRootWebArea "<embedded_object><embedded_object>"
@@ -10839,7 +10839,7 @@ TEST_F(AXPositionTest, OperatorsTreePositionsAroundEmbeddedCharacter) {
}
TEST_F(AXPositionTest, OperatorsTextPositionsAroundEmbeddedCharacter) {
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
AXEmbeddedObjectBehavior::kExposeCharacter);
// ++1 kRootWebArea "<embedded_object><embedded_object>"
@@ -11275,7 +11275,7 @@ TEST_F(AXPositionTest, CreateNextAnchorPosition) {
AXNodeData empty_text_data;
empty_text_data.id = 4;
empty_text_data.role = ax::mojom::Role::kStaticText;
- empty_text_data.SetName("");
+ empty_text_data.SetNameExplicitlyEmpty();
AXNodeData more_text_data;
more_text_data.id = 5;
@@ -11765,7 +11765,7 @@ TEST_F(AXPositionTest, CreatePreviousWordPositionInList) {
}
TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterTextNavigation) {
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
AXEmbeddedObjectBehavior::kExposeCharacter);
// ++1 kRootWebArea
@@ -12100,7 +12100,7 @@ TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterTextNavigation) {
}
TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterEmbedObject) {
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
AXEmbeddedObjectBehavior::kExposeCharacter);
// Parent Tree
@@ -12152,7 +12152,7 @@ TEST_F(AXPositionTest, TextNavigationWithCollapsedCombobox) {
// collapsed, the subtree of that combobox needs to be hidden and, when
// expanded, it must be accessible in the tree. This test ensures we can't
// navigate into the options of a collapsed menu list popup.
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
AXEmbeddedObjectBehavior::kExposeCharacter);
// ++1 kRootWebArea
@@ -12314,7 +12314,7 @@ TEST_F(AXPositionTest, TextNavigationWithCollapsedCombobox) {
}
TEST_F(AXPositionTest, GetUnignoredSelectionWithLeafNodes) {
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
AXEmbeddedObjectBehavior::kExposeCharacter);
AXNodeData root_data;
diff --git a/chromium/ui/accessibility/ax_node_unittest.cc b/chromium/ui/accessibility/ax_node_unittest.cc
index bd6674a2ac9..73553698b8f 100644
--- a/chromium/ui/accessibility/ax_node_unittest.cc
+++ b/chromium/ui/accessibility/ax_node_unittest.cc
@@ -11,6 +11,7 @@
#include "testing/gmock/include/gmock/gmock-matchers.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/accessibility/ax_enums.mojom-shared.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/accessibility/ax_position.h"
@@ -18,6 +19,7 @@
#include "ui/accessibility/ax_tree_data.h"
#include "ui/accessibility/ax_tree_id.h"
#include "ui/accessibility/test_ax_tree_manager.h"
+#include "ui/gfx/geometry/rect_f.h"
namespace ui {
@@ -396,7 +398,7 @@ TEST(AXNodeTest, TreeWalkingCrossingTreeBoundary) {
}
TEST(AXNodeTest, GetValueForControlTextField) {
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
AXEmbeddedObjectBehavior::kSuppressCharacter);
// kRootWebArea
@@ -631,6 +633,112 @@ TEST(AXNodeTest, GetLowestPlatformAncestor) {
EXPECT_EQ(text_field_node, inline_box_2_node->GetLowestPlatformAncestor());
}
+TEST(AXNodeTest, GetTextContentRangeBounds) {
+ constexpr char16_t kEnglishText[] = u"Hey";
+ const std::vector<int32_t> kEnglishCharacterOffsets = {12, 19, 27};
+ // A Hindi word (which means "Hindi") consisting of two letters.
+ constexpr char16_t kHindiText[] = u"\x0939\x093F\x0928\x094D\x0926\x0940";
+ const std::vector<int32_t> kHindiCharacterOffsets = {40, 40, 59, 59, 59, 59};
+ // A Thai word (which means "feel") consisting of 3 letters.
+ constexpr char16_t kThaiText[] = u"\x0E23\x0E39\x0E49\x0E2A\x0E36\x0E01";
+ const std::vector<int32_t> kThaiCharacterOffsets = {66, 66, 66, 76, 76, 85};
+
+ AXNodeData root_data;
+ root_data.id = 1;
+ root_data.role = ax::mojom::Role::kRootWebArea;
+
+ AXNodeData text_data1;
+ text_data1.id = 2;
+ text_data1.role = ax::mojom::Role::kStaticText;
+ text_data1.SetName(kEnglishText);
+ text_data1.AddIntAttribute(
+ ax::mojom::IntAttribute::kTextDirection,
+ static_cast<int32_t>(ax::mojom::WritingDirection::kLtr));
+ text_data1.AddIntListAttribute(ax::mojom::IntListAttribute::kCharacterOffsets,
+ kEnglishCharacterOffsets);
+
+ AXNodeData text_data2;
+ text_data2.id = 3;
+ text_data2.role = ax::mojom::Role::kStaticText;
+ text_data2.SetName(kHindiText);
+ text_data2.AddIntAttribute(
+ ax::mojom::IntAttribute::kTextDirection,
+ static_cast<int32_t>(ax::mojom::WritingDirection::kRtl));
+ text_data2.AddIntListAttribute(ax::mojom::IntListAttribute::kCharacterOffsets,
+ kHindiCharacterOffsets);
+
+ AXNodeData text_data3;
+ text_data3.id = 4;
+ text_data3.role = ax::mojom::Role::kStaticText;
+ text_data3.SetName(kThaiText);
+ text_data3.AddIntAttribute(
+ ax::mojom::IntAttribute::kTextDirection,
+ static_cast<int32_t>(ax::mojom::WritingDirection::kTtb));
+ text_data3.AddIntListAttribute(ax::mojom::IntListAttribute::kCharacterOffsets,
+ kThaiCharacterOffsets);
+
+ root_data.child_ids = {text_data1.id, text_data2.id, text_data3.id};
+
+ AXTreeUpdate update;
+ update.root_id = root_data.id;
+ update.nodes = {root_data, text_data1, text_data2, text_data3};
+ update.has_tree_data = true;
+
+ AXTreeData tree_data;
+ tree_data.tree_id = AXTreeID::CreateNewAXTreeID();
+ tree_data.title = "Application";
+ update.tree_data = tree_data;
+
+ AXTree tree;
+ ASSERT_TRUE(tree.Unserialize(update)) << tree.error();
+
+ const AXNode* root_node = tree.root();
+ ASSERT_EQ(root_data.id, root_node->id());
+
+ const AXNode* text1_node = root_node->GetUnignoredChildAtIndex(0);
+ ASSERT_EQ(text_data1.id, text1_node->id());
+ const AXNode* text2_node = root_node->GetUnignoredChildAtIndex(1);
+ ASSERT_EQ(text_data2.id, text2_node->id());
+ const AXNode* text3_node = root_node->GetUnignoredChildAtIndex(2);
+ ASSERT_EQ(text_data3.id, text3_node->id());
+
+ // Bounds should be the same between UTF-8 and UTF-16 for `kEnglishText`.
+ EXPECT_EQ(gfx::RectF(0, 0, 27, 0),
+ text1_node->GetTextContentRangeBoundsUTF8(0, 3));
+ EXPECT_EQ(gfx::RectF(12, 0, 7, 0),
+ text1_node->GetTextContentRangeBoundsUTF8(1, 2));
+ EXPECT_EQ(gfx::RectF(), text1_node->GetTextContentRangeBoundsUTF8(2, 4));
+ EXPECT_EQ(gfx::RectF(0, 0, 27, 0),
+ text1_node->GetTextContentRangeBoundsUTF16(0, 3));
+ EXPECT_EQ(gfx::RectF(12, 0, 7, 0),
+ text1_node->GetTextContentRangeBoundsUTF16(1, 2));
+ EXPECT_EQ(gfx::RectF(), text1_node->GetTextContentRangeBoundsUTF16(2, 4));
+
+ // Offsets are manually converted between UTF-8 and UTF-16.
+ //
+ // `kHindiText` is 6 code units in UTF-16 and 18 in UTF-8.
+ EXPECT_EQ(gfx::RectF(0, 0, 59, 0),
+ text2_node->GetTextContentRangeBoundsUTF8(0, 18));
+ EXPECT_EQ(gfx::RectF(0, 0, 19, 0),
+ text2_node->GetTextContentRangeBoundsUTF8(6, 12));
+ EXPECT_EQ(gfx::RectF(0, 0, 59, 0),
+ text2_node->GetTextContentRangeBoundsUTF16(0, 6));
+ EXPECT_EQ(gfx::RectF(0, 0, 19, 0),
+ text2_node->GetTextContentRangeBoundsUTF16(2, 4));
+
+ // Offsets are manually converted between UTF-8 and UTF-16.
+ //
+ // `kThaiText` is 6 code units in UTF-16 and 18 in UTF-8.
+ EXPECT_EQ(gfx::RectF(0, 0, 0, 85),
+ text3_node->GetTextContentRangeBoundsUTF8(0, 18));
+ EXPECT_EQ(gfx::RectF(0, 66, 0, 10),
+ text3_node->GetTextContentRangeBoundsUTF8(6, 12));
+ EXPECT_EQ(gfx::RectF(0, 0, 0, 85),
+ text3_node->GetTextContentRangeBoundsUTF16(0, 6));
+ EXPECT_EQ(gfx::RectF(0, 66, 0, 10),
+ text3_node->GetTextContentRangeBoundsUTF16(2, 4));
+}
+
TEST(AXNodeTest, IsGridCellReadOnlyOrDisabled) {
// ++kRootWebArea
// ++++kGrid
diff --git a/chromium/ui/accessibility/ax_position.h b/chromium/ui/accessibility/ax_position.h
index 13f38045eaf..3ada31c07f1 100644
--- a/chromium/ui/accessibility/ax_position.h
+++ b/chromium/ui/accessibility/ax_position.h
@@ -35,7 +35,6 @@
#include "ui/accessibility/ax_text_attributes.h"
#include "ui/accessibility/ax_tree_id.h"
#include "ui/accessibility/ax_tree_manager.h"
-#include "ui/accessibility/ax_tree_manager_map.h"
#include "ui/gfx/utf16_indexing.h"
namespace ui {
@@ -165,8 +164,6 @@ enum class AXEmbeddedObjectBehavior {
// TODO(crbug.com/1204592) Don't export this so tests can't change it.
extern AX_EXPORT AXEmbeddedObjectBehavior g_ax_embedded_object_behavior;
-namespace testing {
-
class AX_EXPORT ScopedAXEmbeddedObjectBehaviorSetter {
public:
explicit ScopedAXEmbeddedObjectBehaviorSetter(
@@ -177,8 +174,6 @@ class AX_EXPORT ScopedAXEmbeddedObjectBehaviorSetter {
AXEmbeddedObjectBehavior prev_behavior_;
};
-} // namespace testing
-
// Forward declarations.
template <class AXPositionType, class AXNodeType>
class AXPosition;
@@ -406,7 +401,7 @@ class AXPosition {
DCHECK(GetManager());
std::ostringstream str;
str << "* Position: " << ToString()
- << "\n* Manager: " << GetManager()->ToString()
+ << "\n* Manager: " << GetManager()->ax_tree()->data().ToString()
<< "\n* Anchor node: " << *GetAnchor();
return str.str();
}
@@ -415,9 +410,7 @@ class AXPosition {
AXTreeID tree_id() const { return tree_id_; }
AXNodeID anchor_id() const { return anchor_id_; }
- AXTreeManager* GetManager() const {
- return AXTreeManagerMap::GetInstance().GetManager(tree_id());
- }
+ AXTreeManager* GetManager() const { return AXTreeManager::FromID(tree_id()); }
AXNode* GetAnchor() const {
if (tree_id_ == AXTreeIDUnknown() || anchor_id_ == kInvalidAXNodeID)
diff --git a/chromium/ui/accessibility/ax_range_unittest.cc b/chromium/ui/accessibility/ax_range_unittest.cc
index 4f0182e4e09..918b615e390 100644
--- a/chromium/ui/accessibility/ax_range_unittest.cc
+++ b/chromium/ui/accessibility/ax_range_unittest.cc
@@ -145,7 +145,7 @@ class AXRangeTest : public ::testing::Test, public TestAXTreeManager {
AXNodeData empty_paragraph_;
private:
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior_;
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior_;
};
// These tests use kSuppressCharacter behavior.
diff --git a/chromium/ui/accessibility/ax_role_properties.cc b/chromium/ui/accessibility/ax_role_properties.cc
index 1141967da8b..ae176cfbece 100644
--- a/chromium/ui/accessibility/ax_role_properties.cc
+++ b/chromium/ui/accessibility/ax_role_properties.cc
@@ -105,8 +105,10 @@ bool IsCellOrTableHeader(const ax::mojom::Role role) {
bool IsChildTreeOwner(const ax::mojom::Role role) {
switch (role) {
+ case ax::mojom::Role::kEmbeddedObject:
case ax::mojom::Role::kIframe:
case ax::mojom::Role::kIframePresentational:
+ case ax::mojom::Role::kPluginObject:
case ax::mojom::Role::kPortal:
return true;
default:
@@ -547,7 +549,6 @@ bool IsReadOnlySupported(const ax::mojom::Role role) {
case ax::mojom::Role::kSwitch:
case ax::mojom::Role::kTextField:
case ax::mojom::Role::kTextFieldWithComboBox:
- case ax::mojom::Role::kToggleButton:
case ax::mojom::Role::kTreeGrid:
return true;
diff --git a/chromium/ui/accessibility/ax_role_properties.h b/chromium/ui/accessibility/ax_role_properties.h
index 0ab00426668..2165f8d65f9 100644
--- a/chromium/ui/accessibility/ax_role_properties.h
+++ b/chromium/ui/accessibility/ax_role_properties.h
@@ -41,6 +41,8 @@ AX_BASE_EXPORT bool IsButton(const ax::mojom::Role role);
AX_BASE_EXPORT bool IsCellOrTableHeader(const ax::mojom::Role role);
// Returns true if the role is expected to be the parent of a child tree.
+// Can return false for a child tree owner if an ARIA role was used, e.g.
+// <iframe role="region">.
AX_BASE_EXPORT bool IsChildTreeOwner(const ax::mojom::Role role);
// Returns true if the provided role belongs to an object on which a click
diff --git a/chromium/ui/accessibility/ax_tree.cc b/chromium/ui/accessibility/ax_tree.cc
index 5fc55901e6c..9e716fc9c10 100644
--- a/chromium/ui/accessibility/ax_tree.cc
+++ b/chromium/ui/accessibility/ax_tree.cc
@@ -802,9 +802,9 @@ void AXTree::Destroy() {
{
ScopedTreeUpdateInProgressStateSetter tree_update_in_progress(*this);
-
- DestroyNodeAndSubtree(root_, nullptr);
- root_ = nullptr;
+ // ExtractAsDangling clears the underlying pointer and returns another
+ // raw_ptr instance that is allowed to dangle.
+ DestroyNodeAndSubtree(root_.ExtractAsDangling(), nullptr);
} // tree_update_in_progress.
}
@@ -822,6 +822,7 @@ gfx::RectF AXTree::RelativeToTreeBoundsInternal(const AXNode* node,
gfx::RectF bounds,
bool* offscreen,
bool clip_bounds,
+ bool skip_container_offset,
bool allow_recursion) const {
// If |bounds| is uninitialized, which is not the same as empty,
// start with the node bounds.
@@ -838,16 +839,17 @@ gfx::RectF AXTree::RelativeToTreeBoundsInternal(const AXNode* node,
ui::AXNode* child = node->children()[i];
bool ignore_offscreen;
- gfx::RectF child_bounds = RelativeToTreeBoundsInternal(
- child, gfx::RectF(), &ignore_offscreen, clip_bounds,
- /* allow_recursion = */ false);
+ gfx::RectF child_bounds =
+ RelativeToTreeBoundsInternal(child, gfx::RectF(), &ignore_offscreen,
+ clip_bounds, skip_container_offset,
+ /* allow_recursion = */ false);
bounds.Union(child_bounds);
}
if (bounds.width() > 0 && bounds.height() > 0) {
return bounds;
}
}
- } else {
+ } else if (!skip_container_offset) {
bounds.Offset(node->data().relative_bounds.bounds.x(),
node->data().relative_bounds.bounds.y());
}
@@ -863,7 +865,7 @@ gfx::RectF AXTree::RelativeToTreeBoundsInternal(const AXNode* node,
GetFromId(node->data().relative_bounds.offset_container_id);
if (!container && container != root())
container = root();
- if (!container || container == node)
+ if (!container || container == node || skip_container_offset)
break;
gfx::RectF container_bounds = container->data().relative_bounds.bounds;
@@ -950,6 +952,7 @@ gfx::RectF AXTree::RelativeToTreeBoundsInternal(const AXNode* node,
bool ignore_offscreen;
ancestor_bounds = RelativeToTreeBoundsInternal(
ancestor, gfx::RectF(), &ignore_offscreen, clip_bounds,
+ skip_container_offset,
/* allow_recursion = */ false);
gfx::RectF original_bounds = original_node->data().relative_bounds.bounds;
@@ -971,10 +974,11 @@ gfx::RectF AXTree::RelativeToTreeBoundsInternal(const AXNode* node,
gfx::RectF AXTree::RelativeToTreeBounds(const AXNode* node,
gfx::RectF bounds,
bool* offscreen,
- bool clip_bounds) const {
+ bool clip_bounds,
+ bool skip_container_offset) const {
bool allow_recursion = true;
return RelativeToTreeBoundsInternal(node, bounds, offscreen, clip_bounds,
- allow_recursion);
+ skip_container_offset, allow_recursion);
}
gfx::RectF AXTree::GetTreeBounds(const AXNode* node,
@@ -1167,7 +1171,7 @@ bool AXTree::Unserialize(const AXTreeUpdate& update) {
if (!root_) {
ACCESSIBILITY_TREE_UNSERIALIZE_ERROR_HISTOGRAM(
AXTreeUnserializeError::kNoRoot);
- RecordError("Tree has no root.");
+ RecordError(update_state, "Tree has no root.");
return false;
}
@@ -1526,8 +1530,10 @@ bool AXTree::ComputePendingChangesToNode(const AXNodeData& new_data,
if (!is_new_root) {
ACCESSIBILITY_TREE_UNSERIALIZE_ERROR_HISTOGRAM(
AXTreeUnserializeError::kNotInTree);
- RecordError(base::StringPrintf(
- "%d will not be in the tree and is not the new root", new_data.id));
+ RecordError(*update_state,
+ base::StringPrintf(
+ "%d will not be in the tree and is not the new root",
+ new_data.id));
return false;
}
@@ -1537,9 +1543,11 @@ bool AXTree::ComputePendingChangesToNode(const AXNodeData& new_data,
absl::nullopt)) {
ACCESSIBILITY_TREE_UNSERIALIZE_ERROR_HISTOGRAM(
AXTreeUnserializeError::kCreationPending);
- RecordError(base::StringPrintf(
- "Node %d is already pending for creation, cannot be the new root",
- new_data.id));
+ RecordError(
+ *update_state,
+ base::StringPrintf(
+ "Node %d is already pending for creation, cannot be the new root",
+ new_data.id));
return false;
}
if (update_state->pending_root_id) {
@@ -1555,7 +1563,8 @@ bool AXTree::ComputePendingChangesToNode(const AXNodeData& new_data,
if (base::Contains(new_child_id_set, new_child_id)) {
ACCESSIBILITY_TREE_UNSERIALIZE_ERROR_HISTOGRAM(
AXTreeUnserializeError::kDuplicateChild);
- RecordError(base::StringPrintf("Node %d has duplicate child id %d",
+ RecordError(*update_state,
+ base::StringPrintf("Node %d has duplicate child id %d",
new_data.id, new_child_id));
return false;
}
@@ -1580,9 +1589,10 @@ bool AXTree::ComputePendingChangesToNode(const AXNodeData& new_data,
new_data.id)) {
ACCESSIBILITY_TREE_UNSERIALIZE_ERROR_HISTOGRAM(
AXTreeUnserializeError::kCreationPendingForChild);
- RecordError(base::StringPrintf(
- "Node %d is already pending for creation, cannot be a new child",
- child_id));
+ RecordError(*update_state,
+ base::StringPrintf("Node %d is already pending for "
+ "creation, cannot be a new child",
+ child_id));
return false;
}
}
@@ -1624,9 +1634,10 @@ bool AXTree::ComputePendingChangesToNode(const AXNodeData& new_data,
if (update_state->ShouldPendingNodeExistInTree(child_id)) {
ACCESSIBILITY_TREE_UNSERIALIZE_ERROR_HISTOGRAM(
AXTreeUnserializeError::kReparent);
- RecordError(base::StringPrintf(
- "Node %d is not marked for destruction, would be reparented to %d",
- child_id, new_data.id));
+ RecordError(*update_state,
+ base::StringPrintf("Node %d is not marked for destruction, "
+ "would be reparented to %d",
+ child_id, new_data.id));
return false;
}
@@ -1637,9 +1648,10 @@ bool AXTree::ComputePendingChangesToNode(const AXNodeData& new_data,
new_data.id)) {
ACCESSIBILITY_TREE_UNSERIALIZE_ERROR_HISTOGRAM(
AXTreeUnserializeError::kCreationPendingForChild);
- RecordError(base::StringPrintf(
- "Node %d is already pending for creation, cannot be a new child",
- child_id));
+ RecordError(*update_state,
+ base::StringPrintf("Node %d is already pending for "
+ "creation, cannot be a new child",
+ child_id));
return false;
}
} else {
@@ -1678,8 +1690,9 @@ bool AXTree::UpdateNode(const AXNodeData& src,
if (!is_new_root) {
ACCESSIBILITY_TREE_UNSERIALIZE_ERROR_HISTOGRAM(
AXTreeUnserializeError::kNotInTree);
- RecordError(base::StringPrintf(
- "%d is not in the tree and not the new root", src.id));
+ RecordError(*update_state,
+ base::StringPrintf(
+ "%d is not in the tree and not the new root", src.id));
return false;
}
@@ -2003,7 +2016,7 @@ bool AXTree::ValidatePendingChangesComplete(
std::string error = "Nodes left pending by the update:";
for (const AXNodeID pending_id : update_state.pending_node_ids)
error += base::StringPrintf(" %d", pending_id);
- RecordError(error);
+ RecordError(update_state, error);
return false;
}
@@ -2029,11 +2042,13 @@ bool AXTree::ValidatePendingChangesComplete(
if (has_pending_changes) {
ACCESSIBILITY_TREE_UNSERIALIZE_ERROR_HISTOGRAM(
AXTreeUnserializeError::kPendingChanges);
- RecordError(base::StringPrintf(
- "Changes left pending by the update; "
- "destroy subtrees: %s, destroy nodes: %s, create nodes: %s",
- destroy_subtree_ids.c_str(), destroy_node_ids.c_str(),
- create_node_ids.c_str()));
+ RecordError(
+ update_state,
+ base::StringPrintf(
+ "Changes left pending by the update; "
+ "destroy subtrees: %s, destroy nodes: %s, create nodes: %s",
+ destroy_subtree_ids.c_str(), destroy_node_ids.c_str(),
+ create_node_ids.c_str()));
}
return !has_pending_changes;
}
@@ -2142,7 +2157,8 @@ bool AXTree::CreateNewChildVector(AXNode* node,
// If this case occurs, continue so this node isn't left in an
// inconsistent state, but return failure at the end.
if (child->parent()) {
- RecordError(base::StringPrintf("Node %d reparented from %d to %d",
+ RecordError(*update_state,
+ base::StringPrintf("Node %d reparented from %d to %d",
child->id(), child->parent()->id(),
node->id()));
} else {
@@ -2668,12 +2684,15 @@ bool ComputeUnignoredSelectionEndpoint(
} // namespace
+AXTree::Selection AXTree::GetSelection() const {
+ return {data().sel_is_backward, data().sel_anchor_object_id,
+ data().sel_anchor_offset, data().sel_anchor_affinity,
+ data().sel_focus_object_id, data().sel_focus_offset,
+ data().sel_focus_affinity};
+}
+
AXTree::Selection AXTree::GetUnignoredSelection() const {
- Selection unignored_selection = {
- data().sel_is_backward, data().sel_anchor_object_id,
- data().sel_anchor_offset, data().sel_anchor_affinity,
- data().sel_focus_object_id, data().sel_focus_offset,
- data().sel_focus_affinity};
+ Selection unignored_selection = GetSelection();
// If one of the selection endpoints is invalid, then the other endpoint
// should also be unset.
@@ -2724,18 +2743,36 @@ void AXTree::NotifyTreeManagerWillBeRemoved(AXTreeID previous_tree_id) {
observer.OnTreeManagerWillBeRemoved(previous_tree_id);
}
-void AXTree::RecordError(std::string new_error) {
+void AXTree::RecordError(const AXTreeUpdateState& update_state,
+ std::string new_error) {
if (!error_.empty())
error_ = error_ + "\n"; // Add visual separation between errors.
error_ = error_ + new_error;
- if (!error_.empty()) {
- // Add a crash key so we can figure out why this is happening.
- static crash_reporter::CrashKeyString<256> ax_tree_error(
- "ax_tree_unserialize_error");
- ax_tree_error.Set(error_);
- LOG(ERROR) << error_;
- }
+ LOG(ERROR) << new_error;
+
+ static auto* const ax_tree_error_key = base::debug::AllocateCrashKeyString(
+ "ax_tree_error", base::debug::CrashKeySize::Size256);
+ static auto* const ax_tree_update_key = base::debug::AllocateCrashKeyString(
+ "ax_tree_update", base::debug::CrashKeySize::Size256);
+ static auto* const ax_tree_key = base::debug::AllocateCrashKeyString(
+ "ax_tree", base::debug::CrashKeySize::Size256);
+ static auto* const ax_tree_data_key = base::debug::AllocateCrashKeyString(
+ "ax_tree_data", base::debug::CrashKeySize::Size256);
+
+ // Log additional crash keys so we can debug bad tree updates.
+ base::debug::SetCrashKeyString(ax_tree_error_key, new_error);
+ base::debug::SetCrashKeyString(ax_tree_update_key,
+ update_state.pending_tree_update.ToString());
+ base::debug::SetCrashKeyString(ax_tree_key, TreeToStringHelper(root_, 1));
+ base::debug::SetCrashKeyString(ax_tree_data_key, data().ToString());
+
+ // In fast-failing-builds, crash immediately with a message, otherwise
+ // rely on AccessibilityFatalError(), which will not crash until multiple
+ // errors occur.
+ SANITIZER_NOTREACHED() << new_error << "\n"
+ << update_state.pending_tree_update.ToString() << "\n"
+ << ToString();
}
} // namespace ui
diff --git a/chromium/ui/accessibility/ax_tree.h b/chromium/ui/accessibility/ax_tree.h
index 5bf1e1b818d..554c202e5ec 100644
--- a/chromium/ui/accessibility/ax_tree.h
+++ b/chromium/ui/accessibility/ax_tree.h
@@ -11,9 +11,10 @@
#include <memory>
#include <set>
#include <string>
-#include <unordered_map>
#include <vector>
+#include "base/containers/flat_map.h"
+#include "base/debug/crash_logging.h"
#include "base/memory/raw_ptr.h"
#include "base/metrics/histogram_functions.h"
#include "base/observer_list.h"
@@ -146,7 +147,8 @@ class AX_EXPORT AXTree : public AXNode::OwnerTree {
gfx::RectF RelativeToTreeBounds(const AXNode* node,
gfx::RectF node_bounds,
bool* offscreen = nullptr,
- bool clip_bounds = true) const;
+ bool clip_bounds = true,
+ bool skip_container_offset = false) const;
// Get the bounds of a node in the coordinate space of the tree.
// If set, updates |offscreen| boolean to be true if the node is offscreen
@@ -213,6 +215,14 @@ class AX_EXPORT AXTree : public AXNode::OwnerTree {
// present in the cache.
absl::optional<int> GetSetSize(const AXNode& node) override;
+ // Returns the part of the current selection that falls within this
+ // accessibility tree, if any.
+ Selection GetSelection() const override;
+
+ // Returns the part of the current selection that falls within this
+ // accessibility tree, if any, adjusting its endpoints to be within unignored
+ // nodes. (An "ignored" node is a node that is not exposed to platform APIs:
+ // See `AXNode::IsIgnored`.)
Selection GetUnignoredSelection() const override;
bool GetTreeUpdateInProgressState() const override;
@@ -246,7 +256,9 @@ class AX_EXPORT AXTree : public AXNode::OwnerTree {
// Accumulate errors as there can be more than one before Chrome is crashed
// via AccessibilityFatalError();
- void RecordError(std::string new_error);
+ // In an AX_FAIL_FAST_BUILD, will assert/crash immediately.
+ void RecordError(const AXTreeUpdateState& update_state,
+ std::string new_error);
// AXNode::OwnerTree override.
//
@@ -384,13 +396,14 @@ class AX_EXPORT AXTree : public AXNode::OwnerTree {
gfx::RectF node_bounds,
bool* offscreen,
bool clip_bounds,
+ bool skip_container_offset,
bool allow_recursion) const;
base::ObserverList<AXTreeObserver> observers_;
raw_ptr<AXNode> root_ = nullptr;
- std::unordered_map<AXNodeID, std::unique_ptr<AXNode>> id_map_;
std::string error_;
AXTreeData data_;
+ base::flat_map<AXNodeID, std::unique_ptr<AXNode>> id_map_;
// Map from an int attribute (if IsNodeIdIntAttribute is true) to
// a reverse mapping from target nodes to source nodes.
@@ -403,7 +416,7 @@ class AX_EXPORT AXTree : public AXNode::OwnerTree {
// Map from node ID to cached table info, if the given node is a table.
// Invalidated every time the tree is updated.
- mutable std::unordered_map<AXNodeID, std::unique_ptr<AXTableInfo>>
+ mutable base::flat_map<AXNodeID, std::unique_ptr<AXTableInfo>>
table_info_map_;
// The next negative node ID to use for internal nodes.
@@ -462,7 +475,7 @@ class AX_EXPORT AXTree : public AXNode::OwnerTree {
// objects.
// All other objects will map to default-constructed OrderedSetInfo objects.
// Invalidated every time the tree is updated.
- mutable std::unordered_map<AXNodeID, NodeSetSizePosInSetInfo>
+ mutable base::flat_map<AXNodeID, NodeSetSizePosInSetInfo>
node_set_size_pos_in_set_info_map_;
// Indicates if the tree is updating.
diff --git a/chromium/ui/accessibility/ax_tree_fuzzer_util.cc b/chromium/ui/accessibility/ax_tree_fuzzer_util.cc
new file mode 100644
index 00000000000..ed27dc808ec
--- /dev/null
+++ b/chromium/ui/accessibility/ax_tree_fuzzer_util.cc
@@ -0,0 +1,355 @@
+// 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/accessibility/ax_tree_fuzzer_util.h"
+
+#include "ui/accessibility/ax_enums.mojom.h"
+#include "ui/accessibility/ax_node.h"
+#include "ui/accessibility/ax_node_data.h"
+#include "ui/accessibility/ax_node_position.h"
+#include "ui/accessibility/ax_range.h"
+#include "ui/accessibility/ax_role_properties.h"
+#include "ui/accessibility/ax_tree.h"
+#include "ui/accessibility/ax_tree_data.h"
+#include "ui/accessibility/ax_tree_id.h"
+#include "ui/accessibility/ax_tree_update.h"
+
+FuzzerData::FuzzerData(const unsigned char* data, size_t size)
+ : data_(data), data_size_(size), data_index_(0) {}
+
+size_t FuzzerData::RemainingBytes() {
+ return data_size_ - data_index_;
+}
+
+unsigned char FuzzerData::NextByte() {
+ CHECK(RemainingBytes());
+ return data_[data_index_++];
+}
+
+const unsigned char* FuzzerData::NextBytes(size_t amount) {
+ CHECK(RemainingBytes() >= amount);
+ const unsigned char* current_position = &data_[data_index_];
+ data_index_ += amount;
+ return current_position;
+}
+
+ui::AXTree* AXTreeFuzzerGenerator::GetTree() {
+ return tree_manager_.GetTree();
+}
+
+void AXTreeFuzzerGenerator::GenerateInitialUpdate(FuzzerData& fuzz_data,
+ int node_count) {
+ max_assigned_node_id_ = 1;
+ ui::AXTreeUpdate initial_state;
+ initial_state.root_id = max_assigned_node_id_++;
+
+ initial_state.has_tree_data = true;
+ initial_state.tree_data.tree_id = ui::AXTreeID::CreateNewAXTreeID();
+
+ ui::AXNodeData root;
+ root.id = initial_state.root_id;
+ root.role = ax::mojom::Role::kRootWebArea;
+
+ std::stack<size_t> parent_index_stack;
+ parent_index_stack.push(initial_state.nodes.size());
+ initial_state.nodes.push_back(root);
+
+ // As we give out ids sequentially, starting at 1, the
+ // ...max_assigned_node_id_... is equivalent to the node count.
+ while (fuzz_data.RemainingBytes() >= kMinimumNewNodeFuzzDataSize &&
+ max_assigned_node_id_ < node_count) {
+ size_t extra_data_size =
+ fuzz_data.RemainingBytes() - kMinimumNewNodeFuzzDataSize;
+
+ ui::AXNodeData& parent = initial_state.nodes[parent_index_stack.top()];
+
+ // Create a node.
+ ui::AXNodeData node = CreateChildNodeData(parent, max_assigned_node_id_++);
+
+ // Determine role.
+ node.role = GetInterestingRole(fuzz_data.NextByte(), parent.role);
+
+ // Add role-specific properties.
+ AddRoleSpecificProperties(
+ fuzz_data, node,
+ parent.GetStringAttribute(ax::mojom::StringAttribute::kName),
+ extra_data_size);
+
+ // Determine the relationship of the next node from fuzz data. See
+ // implementation of `DetermineNextNodeRelationship` for details.
+ size_t ancestor_pop_count;
+ switch (DetermineNextNodeRelationship(node.role, fuzz_data.NextByte())) {
+ case kChild:
+ CHECK(CanHaveChildren(node.role));
+ parent_index_stack.push(initial_state.nodes.size());
+ break;
+ case kSibling:
+ initial_state.nodes.push_back(node);
+ break;
+ case kSiblingToAncestor:
+ ancestor_pop_count = 1 + fuzz_data.NextByte() % kMaxAncestorPopCount;
+ for (size_t i = 0;
+ i < ancestor_pop_count && parent_index_stack.size() > 1; ++i) {
+ parent_index_stack.pop();
+ }
+ break;
+ }
+
+ initial_state.nodes.push_back(node);
+ }
+ // Run with --v=1 to aid in debugging a specific crash.
+ VLOG(1) << "Input accessibility tree:\n" << initial_state.ToString();
+ tree_manager_.SetTree(std::make_unique<ui::AXTree>(initial_state));
+}
+
+// Pre-order depth first walk of tree. Skip over deleted subtrees.
+void AXTreeFuzzerGenerator::RecursiveGenerateUpdate(
+ const ui::AXNode* node,
+ ui::AXTreeUpdate& tree_update,
+ FuzzerData& fuzz_data,
+ std::set<ui::AXNodeID>& updated_nodes) {
+ // Stop traversing if we run out of fuzz data.
+ if (fuzz_data.RemainingBytes() <= kMinimumNewNodeFuzzDataSize)
+ return;
+ size_t extra_data_size =
+ fuzz_data.RemainingBytes() - kMinimumNewNodeFuzzDataSize;
+
+ AXTreeFuzzerGenerator::TreeUpdateOperation operation = kNoOperation;
+ if (!updated_nodes.count(node->id()))
+ operation = DetermineTreeUpdateOperation(node, fuzz_data.NextByte());
+
+ switch (operation) {
+ case kAddChild: {
+ // Determine where to insert the node.
+ // Create node and attach to parent.
+ ui::AXNodeData parent = node->data();
+ ui::AXNodeData child =
+ CreateChildNodeData(parent, max_assigned_node_id_++);
+
+ // Determine role.
+ child.role = GetInterestingRole(fuzz_data.NextByte(), node->GetRole());
+
+ // Add role-specific properties.
+ AddRoleSpecificProperties(
+ fuzz_data, child,
+ node->GetStringAttribute(ax::mojom::StringAttribute::kName),
+ extra_data_size);
+ // Also add inline text child if we can.
+ ui::AXNodeData inline_text_data;
+ if (ui::CanHaveInlineTextBoxChildren(child.role)) {
+ inline_text_data = CreateChildNodeData(child, max_assigned_node_id_++);
+ inline_text_data.role = ax::mojom::Role::kInlineTextBox;
+ inline_text_data.SetName(
+ child.GetStringAttribute(ax::mojom::StringAttribute::kName));
+ }
+ // Add both the current node (parent) and the child to the tree update.
+ tree_update.nodes.push_back(parent);
+ tree_update.nodes.push_back(child);
+ updated_nodes.emplace(parent.id);
+ updated_nodes.emplace(child.id);
+ if (inline_text_data.id != ui::kInvalidAXNodeID) {
+ tree_update.nodes.push_back(inline_text_data);
+ updated_nodes.emplace(inline_text_data.id);
+ }
+ break;
+ }
+ case kRemoveNode: {
+ const ui::AXNode* parent = node->GetParent();
+ if (updated_nodes.count(parent->id()))
+ break;
+ // Determine what node to delete.
+ // To delete a node, just find the parent and update the child list to
+ // no longer include this node.
+ ui::AXNodeData parent_update = parent->data();
+ parent_update.child_ids.erase(
+ std::remove(parent_update.child_ids.begin(),
+ parent_update.child_ids.end(), node->id()),
+ parent_update.child_ids.end());
+ tree_update.nodes.push_back(parent_update);
+ updated_nodes.emplace(parent_update.id);
+
+ // This node was deleted, don't traverse to the subtree.
+ return;
+ }
+ case kTextChange: {
+ // Modify the text.
+ const ui::AXNode* child_inline_text = node->GetFirstChild();
+ if (!child_inline_text ||
+ child_inline_text->GetRole() != ax::mojom::Role::kInlineTextBox) {
+ break;
+ }
+ ui::AXNodeData static_text_data = node->data();
+ ui::AXNodeData inline_text_data = child_inline_text->data();
+ size_t text_size =
+ kMinTextFuzzDataSize + fuzz_data.NextByte() % kMaxTextFuzzDataSize;
+ if (text_size > extra_data_size)
+ text_size = extra_data_size;
+ extra_data_size -= text_size;
+ inline_text_data.SetName(
+ GenerateInterestingText(fuzz_data.NextBytes(text_size), text_size));
+ static_text_data.SetName(inline_text_data.GetStringAttribute(
+ ax::mojom::StringAttribute::kName));
+ tree_update.nodes.push_back(static_text_data);
+ tree_update.nodes.push_back(inline_text_data);
+ updated_nodes.emplace(static_text_data.id);
+ updated_nodes.emplace(inline_text_data.id);
+ break;
+ }
+ case kNoOperation:
+ break;
+ }
+
+ // Visit subtree.
+ for (auto iter = node->AllChildrenBegin(); iter != node->AllChildrenEnd();
+ ++iter) {
+ RecursiveGenerateUpdate(iter.get(), tree_update, fuzz_data, updated_nodes);
+ }
+}
+
+// When building a tree update, we must take care to not create an
+// unserializable tree. If the tree does not serialize, things like
+// TestAXTreeObserver will not be able to handle the incorrectly serialized
+// tree. This will require us to abort the fuzz run.
+bool AXTreeFuzzerGenerator::GenerateTreeUpdate(FuzzerData& fuzz_data,
+ size_t node_count) {
+ ui::AXTreeUpdate tree_update;
+ std::set<ui::AXNodeID> updated_nodes;
+ RecursiveGenerateUpdate(tree_manager_.GetRootAsAXNode(), tree_update,
+ fuzz_data, updated_nodes);
+ return GetTree()->Unserialize(tree_update);
+}
+
+ui::AXNodeID AXTreeFuzzerGenerator::GetMaxAssignedID() const {
+ return max_assigned_node_id_;
+}
+
+ui::AXNodeData AXTreeFuzzerGenerator::CreateChildNodeData(
+ ui::AXNodeData& parent,
+ ui::AXNodeID new_node_id) {
+ ui::AXNodeData node;
+ node.id = new_node_id;
+ // Connect parent to this node.
+ parent.child_ids.push_back(node.id);
+ return node;
+}
+
+// Determine the relationship of the next node from fuzz data.
+AXTreeFuzzerGenerator::NextNodeRelationship
+AXTreeFuzzerGenerator::DetermineNextNodeRelationship(ax::mojom::Role role,
+ unsigned char byte) {
+ // Force this to have a inline text child if it can.
+ if (ui::CanHaveInlineTextBoxChildren(role))
+ return NextNodeRelationship::kChild;
+
+ // Don't allow inline text boxes to have children or siblings.
+ if (role == ax::mojom::Role::kInlineTextBox)
+ return NextNodeRelationship::kSiblingToAncestor;
+
+ // Determine next node using fuzz data.
+ NextNodeRelationship relationship =
+ static_cast<NextNodeRelationship>(byte % 3);
+
+ // Check to ensure we can have children.
+ if (relationship == NextNodeRelationship::kChild && !CanHaveChildren(role)) {
+ return NextNodeRelationship::kSibling;
+ }
+ return relationship;
+}
+
+AXTreeFuzzerGenerator::TreeUpdateOperation
+AXTreeFuzzerGenerator::DetermineTreeUpdateOperation(const ui::AXNode* node,
+ unsigned char byte) {
+ switch (byte % 4) {
+ case 0:
+ // Don't delete the following nodes:
+ // 1) The root. TODO(janewman): implement root changes in an update.
+ // 2) Inline text. We don't want to leave Static text nodes without inline
+ // text children.
+ if (ax::mojom::Role::kRootWebArea != node->GetRole())
+ return kRemoveNode;
+ ABSL_FALLTHROUGH_INTENDED;
+ case 1:
+ // Check to ensure this node can have children. Also consider that we
+ // shouldn't add children to static text, as these nodes only expect to
+ // have a inline text single child.
+ if (CanHaveChildren(node->GetRole()) && !ui::IsText(node->GetRole()))
+ return kAddChild;
+ ABSL_FALLTHROUGH_INTENDED;
+ case 2:
+ if (ax::mojom::Role::kStaticText == node->GetRole())
+ return kTextChange;
+ ABSL_FALLTHROUGH_INTENDED;
+ default:
+ return kNoOperation;
+ }
+}
+
+void AXTreeFuzzerGenerator::AddRoleSpecificProperties(
+ FuzzerData& fuzz_data,
+ ui::AXNodeData& node,
+ const std::string& parentName,
+ size_t extra_data_size) {
+ // TODO(janewman): Add ignored state.
+ // Add role-specific properties.
+ if (node.role == ax::mojom::Role::kInlineTextBox) {
+ node.SetName(parentName);
+ } else if (node.role == ax::mojom::Role::kLineBreak) {
+ node.SetName("\n");
+ } else if (ui::IsText(node.role)) {
+ size_t text_size =
+ kMinTextFuzzDataSize + fuzz_data.NextByte() % kMaxTextFuzzDataSize;
+ if (text_size > extra_data_size)
+ text_size = extra_data_size;
+ extra_data_size -= text_size;
+ node.SetName(
+ GenerateInterestingText(fuzz_data.NextBytes(text_size), text_size));
+ }
+}
+
+ax::mojom::Role AXTreeFuzzerGenerator::GetInterestingRole(
+ unsigned char byte,
+ ax::mojom::Role parent_role) {
+ if (ui::CanHaveInlineTextBoxChildren(parent_role))
+ return ax::mojom::Role::kInlineTextBox;
+
+ // Bias towards creating text nodes so we end up with more text in the tree.
+ switch (byte % 7) {
+ default:
+ case 0:
+ case 1:
+ case 2:
+ return ax::mojom::Role::kStaticText;
+ case 3:
+ return ax::mojom::Role::kLineBreak;
+ case 4:
+ return ax::mojom::Role::kParagraph;
+ case 5:
+ return ax::mojom::Role::kGenericContainer;
+ case 6:
+ return ax::mojom::Role::kGroup;
+ }
+}
+
+bool AXTreeFuzzerGenerator::CanHaveChildren(ax::mojom::Role role) {
+ switch (role) {
+ case ax::mojom::Role::kInlineTextBox:
+ return false;
+ default:
+ return true;
+ }
+}
+
+std::u16string AXTreeFuzzerGenerator::GenerateInterestingText(
+ const unsigned char* data,
+ size_t size) {
+ std::u16string wide_str;
+ for (size_t i = 0; i + 1 < size; i += 2) {
+ char16_t char_16 = data[i] << 8;
+ char_16 |= data[i + 1];
+ // Don't insert a null character.
+ if (char_16)
+ wide_str.push_back(char_16);
+ }
+ return wide_str;
+}
diff --git a/chromium/ui/accessibility/ax_tree_fuzzer_util.h b/chromium/ui/accessibility/ax_tree_fuzzer_util.h
new file mode 100644
index 00000000000..b71af77e426
--- /dev/null
+++ b/chromium/ui/accessibility/ax_tree_fuzzer_util.h
@@ -0,0 +1,90 @@
+// 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_ACCESSIBILITY_AX_TREE_FUZZER_UTIL_H_
+#define UI_ACCESSIBILITY_AX_TREE_FUZZER_UTIL_H_
+
+#include "ui/accessibility/ax_tree.h"
+#include "ui/accessibility/ax_tree_data.h"
+#include "ui/accessibility/ax_tree_id.h"
+#include "ui/accessibility/ax_tree_update.h"
+#include "ui/accessibility/test_ax_tree_manager.h"
+
+// TODO(janewman): Replace usage with ...FuzzedDataProvider...
+class FuzzerData {
+ public:
+ FuzzerData(const unsigned char* data, size_t size);
+ size_t RemainingBytes();
+ unsigned char NextByte();
+ const unsigned char* NextBytes(size_t amount);
+
+ private:
+ const unsigned char* data_;
+ const size_t data_size_;
+ size_t data_index_;
+};
+
+class AXTreeFuzzerGenerator {
+ public:
+ AXTreeFuzzerGenerator() = default;
+ ~AXTreeFuzzerGenerator() = default;
+
+ ui::AXTree* GetTree();
+
+ void GenerateInitialUpdate(FuzzerData& fuzz_data, int node_count);
+ bool GenerateTreeUpdate(FuzzerData& fuzz_data, size_t node_count);
+
+ ui::AXNodeID GetMaxAssignedID() const;
+
+ // This must be kept in sync with the minimum amount of data needed to create
+ // any node. Any optional node data should check to ensure there is space.
+ static constexpr size_t kMinimumNewNodeFuzzDataSize = 5;
+ static constexpr size_t kMinTextFuzzDataSize = 10;
+ static constexpr size_t kMaxTextFuzzDataSize = 200;
+
+ // When creating a node, we allow for the next node to be a sibling of an
+ // ancestor, this constant determines the maximum nodes we will pop when
+ // building the tree.
+ static constexpr size_t kMaxAncestorPopCount = 3;
+
+ private:
+ enum NextNodeRelationship {
+ // Next node is a child of this node. (This node is a parent.)
+ kChild,
+ // Next node is sibling to this node. (This node is a leaf.)
+ kSibling,
+ // Next node is sibling to an ancestor. (This node is a leaf.)
+ kSiblingToAncestor,
+ };
+ enum TreeUpdateOperation {
+ kAddChild,
+ kRemoveNode,
+ kTextChange,
+ kNoOperation
+ };
+
+ void RecursiveGenerateUpdate(const ui::AXNode* node,
+ ui::AXTreeUpdate& tree_update,
+ FuzzerData& fuzz_data,
+ std::set<ui::AXNodeID>& updated_nodes);
+ // TODO(janewman): Many of these can be made static.
+ ui::AXNodeData CreateChildNodeData(ui::AXNodeData& parent,
+ ui::AXNodeID new_node_id);
+ NextNodeRelationship DetermineNextNodeRelationship(ax::mojom::Role role,
+ unsigned char byte);
+ TreeUpdateOperation DetermineTreeUpdateOperation(const ui::AXNode* node,
+ unsigned char byte);
+ void AddRoleSpecificProperties(FuzzerData& fuzz_data,
+ ui::AXNodeData& node,
+ const std::string& parentName,
+ size_t extra_data_size);
+ ax::mojom::Role GetInterestingRole(unsigned char byte,
+ ax::mojom::Role parent_role);
+ bool CanHaveChildren(ax::mojom::Role role);
+ bool CanHaveText(ax::mojom::Role role);
+ std::u16string GenerateInterestingText(const unsigned char* data,
+ size_t size);
+ ui::AXNodeID max_assigned_node_id_;
+ ui::TestAXTreeManager tree_manager_;
+};
+#endif // UI_ACCESSIBILITY_AX_TREE_FUZZER_UTIL_H_
diff --git a/chromium/ui/accessibility/ax_tree_manager.cc b/chromium/ui/accessibility/ax_tree_manager.cc
new file mode 100644
index 00000000000..311c23991c5
--- /dev/null
+++ b/chromium/ui/accessibility/ax_tree_manager.cc
@@ -0,0 +1,107 @@
+// 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/accessibility/ax_tree_manager.h"
+
+#include "base/no_destructor.h"
+#include "ui/accessibility/ax_export.h"
+#include "ui/accessibility/ax_node.h"
+#include "ui/accessibility/ax_tree_id.h"
+#include "ui/accessibility/ax_tree_manager_map.h"
+#include "ui/accessibility/ax_tree_observer.h"
+
+namespace ui {
+
+// static
+AXTreeManagerMap& AXTreeManager::GetMap() {
+ static base::NoDestructor<AXTreeManagerMap> map;
+ return *map;
+}
+
+// static
+AXTreeManager* AXTreeManager::FromID(AXTreeID ax_tree_id) {
+ return ax_tree_id != AXTreeIDUnknown() ? GetMap().GetManager(ax_tree_id)
+ : nullptr;
+}
+
+// static
+AXTreeManager* AXTreeManager::ForChildTree(const AXNode& parent_node) {
+ if (!parent_node.HasStringAttribute(
+ ax::mojom::StringAttribute::kChildTreeId)) {
+ return nullptr;
+ }
+
+ AXTreeID child_tree_id = AXTreeID::FromString(
+ parent_node.GetStringAttribute(ax::mojom::StringAttribute::kChildTreeId));
+ AXTreeManager* child_tree_manager = GetMap().GetManager(child_tree_id);
+
+ // Some platforms do not use AXTreeManagers, so child trees don't exist in
+ // the browser process.
+ DCHECK(!child_tree_manager ||
+ !child_tree_manager->GetParentNodeFromParentTreeAsAXNode() ||
+ child_tree_manager->GetParentNodeFromParentTreeAsAXNode()->id() ==
+ parent_node.id());
+ return child_tree_manager;
+}
+
+AXTreeManager::AXTreeManager()
+ : ax_tree_id_(AXTreeIDUnknown()),
+ ax_tree_(nullptr),
+ event_generator_(ax_tree()) {}
+
+AXTreeManager::AXTreeManager(std::unique_ptr<AXTree> tree)
+ : ax_tree_id_(tree ? tree->data().tree_id : AXTreeIDUnknown()),
+ ax_tree_(std::move(tree)),
+ event_generator_(ax_tree()) {
+ GetMap().AddTreeManager(ax_tree_id_, this);
+}
+
+AXTreeManager::AXTreeManager(const AXTreeID& tree_id,
+ std::unique_ptr<AXTree> tree)
+ : ax_tree_id_(tree_id),
+ ax_tree_(std::move(tree)),
+ event_generator_(ax_tree()) {
+ GetMap().AddTreeManager(ax_tree_id_, this);
+ if (ax_tree())
+ tree_observation_.Observe(ax_tree());
+}
+
+AXTreeID AXTreeManager::GetTreeID() const {
+ return ax_tree_ ? ax_tree_->data().tree_id : AXTreeIDUnknown();
+}
+
+AXTreeID AXTreeManager::GetParentTreeID() const {
+ return ax_tree_ ? ax_tree_->data().parent_tree_id : AXTreeIDUnknown();
+}
+
+AXNode* AXTreeManager::GetRootAsAXNode() const {
+ return ax_tree_ ? ax_tree_->root() : nullptr;
+}
+
+void AXTreeManager::WillBeRemovedFromMap() {
+ if (!ax_tree_)
+ return;
+ ax_tree_->NotifyTreeManagerWillBeRemoved(ax_tree_id_);
+}
+
+AXTreeManager::~AXTreeManager() {
+ // Stop observing so we don't get a callback for every node being deleted.
+ event_generator_.ReleaseTree();
+ if (ax_tree_)
+ GetMap().RemoveTreeManager(ax_tree_id_);
+}
+
+void AXTreeManager::OnTreeDataChanged(AXTree* tree,
+ const AXTreeData& old_data,
+ const AXTreeData& new_data) {
+ GetMap().RemoveTreeManager(ax_tree_id_);
+ ax_tree_id_ = new_data.tree_id;
+ GetMap().AddTreeManager(ax_tree_id_, this);
+}
+
+void AXTreeManager::RemoveFromMap() {
+ GetMap().RemoveTreeManager(ax_tree_id_);
+}
+
+} // namespace ui
diff --git a/chromium/ui/accessibility/ax_tree_manager.h b/chromium/ui/accessibility/ax_tree_manager.h
index 52f892c1acf..df43f35a0c2 100644
--- a/chromium/ui/accessibility/ax_tree_manager.h
+++ b/chromium/ui/accessibility/ax_tree_manager.h
@@ -5,18 +5,32 @@
#ifndef UI_ACCESSIBILITY_AX_TREE_MANAGER_H_
#define UI_ACCESSIBILITY_AX_TREE_MANAGER_H_
+#include "base/scoped_observation.h"
+#include "ui/accessibility/ax_event_generator.h"
#include "ui/accessibility/ax_export.h"
-#include "ui/accessibility/ax_node.h"
-#include "ui/accessibility/ax_tree_id.h"
+#include "ui/accessibility/ax_tree.h"
#include "ui/accessibility/ax_tree_observer.h"
namespace ui {
+class AXNode;
+class AXTreeManagerMap;
+
// Abstract interface for a class that owns an AXTree and manages its
// connections to other AXTrees in the same page or desktop (parent and child
// trees).
-class AX_EXPORT AXTreeManager {
+class AX_EXPORT AXTreeManager : public AXTreeObserver {
public:
+ static AXTreeManager* FromID(AXTreeID ax_tree_id);
+ // If the child of `parent_node` exists in a separate child tree, return the
+ // tree manager for that child tree. Otherwise, return nullptr.
+ static AXTreeManager* ForChildTree(const AXNode& parent_node);
+
+ AXTreeManager(const AXTreeManager&) = delete;
+ AXTreeManager& operator=(const AXTreeManager&) = delete;
+
+ ~AXTreeManager() override;
+
// Returns the AXNode with the given |node_id| from the tree that has the
// given |tree_id|. This allows for callers to access nodes outside of their
// own tree. Returns nullptr if |tree_id| or |node_id| is not found.
@@ -28,20 +42,15 @@ class AX_EXPORT AXTreeManager {
// Returns nullptr if |node_id| is not found.
virtual AXNode* GetNodeFromTree(const AXNodeID node_id) const = 0;
- // Use `AddObserver` and `RemoveObserver` when you want to be notified when
- // changes happen to an `XTree`
- virtual void AddObserver(AXTreeObserver* observer) {}
- virtual void RemoveObserver(AXTreeObserver* observer) {}
-
// Returns the tree id of the tree managed by this AXTreeManager.
- virtual AXTreeID GetTreeID() const = 0;
+ AXTreeID GetTreeID() const;
// Returns the tree id of the parent tree.
// Returns AXTreeIDUnknown if this tree doesn't have a parent tree.
- virtual AXTreeID GetParentTreeID() const = 0;
+ virtual AXTreeID GetParentTreeID() const;
// Returns the AXNode that is at the root of the current tree.
- virtual AXNode* GetRootAsAXNode() const = 0;
+ AXNode* GetRootAsAXNode() const;
// If this tree has a parent tree, returns the node in the parent tree that
// hosts the current tree. Returns nullptr if this tree doesn't have a parent
@@ -50,12 +59,61 @@ class AX_EXPORT AXTreeManager {
// Called when the tree manager is about to be removed from the tree map,
// `AXTreeManagerMap`.
- virtual void WillBeRemovedFromMap() {}
+ void WillBeRemovedFromMap();
+
+ const AXTreeID& ax_tree_id() const { return ax_tree_id_; }
+ AXTree* ax_tree() const { return ax_tree_.get(); }
+
+ const AXEventGenerator& event_generator() const { return event_generator_; }
+ AXEventGenerator& event_generator() { return event_generator_; }
+
+ // AXTreeObserver implementation.
+ void OnTreeDataChanged(ui::AXTree* tree,
+ const ui::AXTreeData& old_data,
+ const ui::AXTreeData& new_data) override;
+ void OnNodeWillBeDeleted(ui::AXTree* tree, ui::AXNode* node) override {}
+ void OnSubtreeWillBeDeleted(ui::AXTree* tree, ui::AXNode* node) override {}
+ void OnNodeCreated(ui::AXTree* tree, ui::AXNode* node) override {}
+ void OnNodeDeleted(ui::AXTree* tree, int32_t node_id) override {}
+ void OnNodeReparented(ui::AXTree* tree, ui::AXNode* node) override {}
+ void OnRoleChanged(ui::AXTree* tree,
+ ui::AXNode* node,
+ ax::mojom::Role old_role,
+ ax::mojom::Role new_role) override {}
+ void OnAtomicUpdateFinished(
+ ui::AXTree* tree,
+ bool root_changed,
+ const std::vector<ui::AXTreeObserver::Change>& changes) override {}
+
+ protected:
+ AXTreeManager();
+ explicit AXTreeManager(std::unique_ptr<AXTree> tree);
+ explicit AXTreeManager(const AXTreeID& tree_id, std::unique_ptr<AXTree> tree);
+
+ // TODO(benjamin.beaudry): Remove this helper once we move the logic related
+ // to the parent connection from `BrowserAccessibilityManager` to this class.
+ // `BrowserAccessibilityManager` needs to remove the manager from the map
+ // before calling `BrowserAccessibilityManager::ParentConnectionChanged`, so
+ // the default removal of the manager in `~AXTreeManager` occurs too late.
+ void RemoveFromMap();
+
+ AXTreeID ax_tree_id_;
+ std::unique_ptr<AXTree> ax_tree_;
+
+ AXEventGenerator event_generator_;
+
+ private:
+ friend class TestAXTreeManager;
+
+ static AXTreeManagerMap& GetMap();
- // For debugging.
- // TODO(benjamin.beaudry) Instead of this, implement GetTreeData() on all
- // AXTreeManager subclasses, and have callers use GetTreeData().ToString();
- virtual std::string ToString() const = 0;
+ // Automatically stops observing notifications from the AXTree when this class
+ // is destructed.
+ //
+ // This member needs to be destructed before any observed AXTrees. Since
+ // destructors for non-static member fields are called in the reverse order of
+ // declaration, do not move this member above other members.
+ base::ScopedObservation<AXTree, AXTreeObserver> tree_observation_{this};
};
} // namespace ui
diff --git a/chromium/ui/accessibility/ax_tree_manager_base.cc b/chromium/ui/accessibility/ax_tree_manager_base.cc
index 5b452d85e5f..461ad3aaffd 100644
--- a/chromium/ui/accessibility/ax_tree_manager_base.cc
+++ b/chromium/ui/accessibility/ax_tree_manager_base.cc
@@ -25,10 +25,9 @@ AXTreeManagerBase* AXTreeManagerBase::GetManager(const AXTreeID& tree_id) {
}
// static
-std::unordered_map<AXTreeID, AXTreeManagerBase*, AXTreeIDHash>&
+base::flat_map<AXTreeID, AXTreeManagerBase*>&
AXTreeManagerBase::GetTreeManagerMapInstance() {
- static base::NoDestructor<
- std::unordered_map<AXTreeID, AXTreeManagerBase*, AXTreeIDHash>>
+ static base::NoDestructor<base::flat_map<AXTreeID, AXTreeManagerBase*>>
map_instance;
return *map_instance;
}
diff --git a/chromium/ui/accessibility/ax_tree_manager_base.h b/chromium/ui/accessibility/ax_tree_manager_base.h
index b42429d79e0..ac733dbaabb 100644
--- a/chromium/ui/accessibility/ax_tree_manager_base.h
+++ b/chromium/ui/accessibility/ax_tree_manager_base.h
@@ -6,8 +6,8 @@
#define UI_ACCESSIBILITY_AX_TREE_MANAGER_BASE_H_
#include <memory>
-#include <unordered_map>
+#include "base/containers/flat_map.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/accessibility/ax_export.h"
#include "ui/accessibility/ax_node_data.h"
@@ -122,7 +122,7 @@ class AX_EXPORT AXTreeManagerBase final {
AXTreeManagerBase* DetachChildTree(AXNode& host_node);
private:
- static std::unordered_map<AXTreeID, AXTreeManagerBase*, AXTreeIDHash>&
+ static base::flat_map<AXTreeID, AXTreeManagerBase*>&
GetTreeManagerMapInstance();
std::unique_ptr<AXTree> tree_;
diff --git a/chromium/ui/accessibility/ax_tree_manager_map.cc b/chromium/ui/accessibility/ax_tree_manager_map.cc
index 8e12b1936b2..574f12cf3e8 100644
--- a/chromium/ui/accessibility/ax_tree_manager_map.cc
+++ b/chromium/ui/accessibility/ax_tree_manager_map.cc
@@ -5,8 +5,6 @@
#include "ui/accessibility/ax_tree_manager_map.h"
#include "base/containers/contains.h"
-#include "base/no_destructor.h"
-#include "ui/accessibility/ax_enums.mojom.h"
namespace ui {
@@ -14,26 +12,20 @@ AXTreeManagerMap::AXTreeManagerMap() = default;
AXTreeManagerMap::~AXTreeManagerMap() = default;
-// static
-AXTreeManagerMap& AXTreeManagerMap::GetInstance() {
- static base::NoDestructor<AXTreeManagerMap> instance;
- return *instance;
-}
-
-void AXTreeManagerMap::AddTreeManager(AXTreeID tree_id,
+void AXTreeManagerMap::AddTreeManager(const AXTreeID& tree_id,
AXTreeManager* manager) {
if (tree_id != AXTreeIDUnknown())
map_[tree_id] = manager;
}
-void AXTreeManagerMap::RemoveTreeManager(AXTreeID tree_id) {
+void AXTreeManagerMap::RemoveTreeManager(const AXTreeID& tree_id) {
if (auto* manager = GetManager(tree_id)) {
manager->WillBeRemovedFromMap();
map_.erase(tree_id);
}
}
-AXTreeManager* AXTreeManagerMap::GetManager(AXTreeID tree_id) {
+AXTreeManager* AXTreeManagerMap::GetManager(const AXTreeID& tree_id) {
if (tree_id == AXTreeIDUnknown())
return nullptr;
auto iter = map_.find(tree_id);
@@ -43,25 +35,4 @@ AXTreeManager* AXTreeManagerMap::GetManager(AXTreeID tree_id) {
return iter->second;
}
-AXTreeManager* AXTreeManagerMap::GetManagerForChildTree(
- const AXNode& parent_node) {
- if (!parent_node.HasStringAttribute(
- ax::mojom::StringAttribute::kChildTreeId)) {
- return nullptr;
- }
-
- AXTreeID child_tree_id = AXTreeID::FromString(
- parent_node.GetStringAttribute(ax::mojom::StringAttribute::kChildTreeId));
- AXTreeManager* child_tree_manager =
- AXTreeManagerMap::GetInstance().GetManager(child_tree_id);
-
- // Some platforms do not use AXTreeManagers, so child trees don't exist in
- // the browser process.
- DCHECK(!child_tree_manager ||
- !child_tree_manager->GetParentNodeFromParentTreeAsAXNode() ||
- child_tree_manager->GetParentNodeFromParentTreeAsAXNode()->id() ==
- parent_node.id());
- return child_tree_manager;
-}
-
} // namespace ui
diff --git a/chromium/ui/accessibility/ax_tree_manager_map.h b/chromium/ui/accessibility/ax_tree_manager_map.h
index aff21f0be99..4a444e920b3 100644
--- a/chromium/ui/accessibility/ax_tree_manager_map.h
+++ b/chromium/ui/accessibility/ax_tree_manager_map.h
@@ -5,17 +5,16 @@
#ifndef UI_ACCESSIBILITY_AX_TREE_MANAGER_MAP_H_
#define UI_ACCESSIBILITY_AX_TREE_MANAGER_MAP_H_
-#include <unordered_map>
-
+#include "base/containers/flat_map.h"
#include "ui/accessibility/ax_tree_id.h"
#include "ui/accessibility/ax_tree_manager.h"
namespace ui {
-// This class manages AXTreeManager instances. It is a singleton wrapper
-// around a std::unordered_map. AXTreeID's are used as the key for the map.
-// Since AXTreeID's might refer to AXTreeIDUnknown, callers should not expect
-// AXTreeIDUnknown to map to a particular AXTreeManager.
+// This class manages AXTreeManager instances. It is a wrapper around a
+// base::flat_map. AXTreeID's are used as the key for the map. Since AXTreeID's
+// might refer to AXTreeIDUnknown, callers should not expect AXTreeIDUnknown to
+// map to a particular AXTreeManager.
class AX_EXPORT AXTreeManagerMap {
public:
AXTreeManagerMap();
@@ -23,17 +22,12 @@ class AX_EXPORT AXTreeManagerMap {
AXTreeManagerMap(const AXTreeManagerMap& map) = delete;
AXTreeManagerMap& operator=(const AXTreeManagerMap& map) = delete;
- static AXTreeManagerMap& GetInstance();
- void AddTreeManager(AXTreeID tree_id, AXTreeManager* manager);
- void RemoveTreeManager(AXTreeID tree_id);
- AXTreeManager* GetManager(AXTreeID tree_id);
-
- // If the child of `parent_node` exists in a separate child tree, return the
- // tree manager for that child tree. Otherwise, return nullptr.
- AXTreeManager* GetManagerForChildTree(const AXNode& parent_node);
+ void AddTreeManager(const AXTreeID& tree_id, AXTreeManager* manager);
+ void RemoveTreeManager(const AXTreeID& tree_id);
+ AXTreeManager* GetManager(const AXTreeID& tree_id);
private:
- std::unordered_map<AXTreeID, AXTreeManager*, AXTreeIDHash> map_;
+ base::flat_map<AXTreeID, AXTreeManager*> map_;
};
} // namespace ui
diff --git a/chromium/ui/accessibility/ax_tree_serializer.h b/chromium/ui/accessibility/ax_tree_serializer.h
index 4d97ae45f98..9d927ec695d 100644
--- a/chromium/ui/accessibility/ax_tree_serializer.h
+++ b/chromium/ui/accessibility/ax_tree_serializer.h
@@ -13,7 +13,6 @@
#include <memory>
#include <ostream>
#include <set>
-#include <unordered_set>
#include <vector>
#include "base/debug/crash_logging.h"
@@ -322,16 +321,14 @@ AXSourceNode AXTreeSerializer<AXSourceNode>::LeastCommonAncestor(
// client ancestor chain disagree. The last node before they disagree
// is the LCA.
AXSourceNode lca = tree_->GetNull();
- int source_index = static_cast<int>(ancestors.size() - 1);
- int client_index = static_cast<int>(client_ancestors.size() - 1);
- while (source_index >= 0 && client_index >= 0) {
- if (tree_->GetId(ancestors[source_index]) !=
- client_ancestors[client_index]->id) {
+ for (size_t source_index = ancestors.size(),
+ client_index = client_ancestors.size();
+ source_index > 0 && client_index > 0; --source_index, --client_index) {
+ if (tree_->GetId(ancestors[source_index - 1]) !=
+ client_ancestors[client_index - 1]->id) {
return lca;
}
- lca = ancestors[source_index];
- source_index--;
- client_index--;
+ lca = ancestors[source_index - 1];
}
return lca;
}
diff --git a/chromium/ui/accessibility/ax_tree_unittest.cc b/chromium/ui/accessibility/ax_tree_unittest.cc
index 9388778e097..97dbe0a005b 100644
--- a/chromium/ui/accessibility/ax_tree_unittest.cc
+++ b/chromium/ui/accessibility/ax_tree_unittest.cc
@@ -449,6 +449,10 @@ TEST(AXTreeTest, LeaveOrphanedDeletedSubtreeFails) {
update.node_id_to_clear = 2;
update.nodes.resize(1);
update.nodes[0].id = 3;
+#if defined(AX_FAIL_FAST_BUILD)
+ EXPECT_DEATH_IF_SUPPORTED(tree.Unserialize(update),
+ "Nodes left pending by the update: 2");
+#else
EXPECT_FALSE(tree.Unserialize(update));
ASSERT_EQ("Nodes left pending by the update: 2", tree.error());
histogram_tester.ExpectUniqueSample(
@@ -456,6 +460,7 @@ TEST(AXTreeTest, LeaveOrphanedDeletedSubtreeFails) {
AXTreeUnserializeError::kPendingNodes, 1);
histogram_tester.ExpectTotalCount(
"Accessibility.Performance.Tree.Unserialize", 2);
+#endif
}
TEST(AXTreeTest, LeaveOrphanedNewChildFails) {
@@ -475,6 +480,10 @@ TEST(AXTreeTest, LeaveOrphanedNewChildFails) {
update.nodes.resize(1);
update.nodes[0].id = 1;
update.nodes[0].child_ids.push_back(2);
+#if defined(AX_FAIL_FAST_BUILD)
+ EXPECT_DEATH_IF_SUPPORTED(tree.Unserialize(update),
+ "Nodes left pending by the update: 2");
+#else
EXPECT_FALSE(tree.Unserialize(update));
ASSERT_EQ("Nodes left pending by the update: 2", tree.error());
histogram_tester.ExpectUniqueSample(
@@ -482,6 +491,7 @@ TEST(AXTreeTest, LeaveOrphanedNewChildFails) {
AXTreeUnserializeError::kPendingNodes, 1);
histogram_tester.ExpectTotalCount(
"Accessibility.Performance.Tree.Unserialize", 2);
+#endif
}
TEST(AXTreeTest, DuplicateChildIdFails) {
@@ -502,6 +512,10 @@ TEST(AXTreeTest, DuplicateChildIdFails) {
update.nodes[0].child_ids.push_back(2);
update.nodes[0].child_ids.push_back(2);
update.nodes[1].id = 2;
+#if defined(AX_FAIL_FAST_BUILD)
+ EXPECT_DEATH_IF_SUPPORTED(tree.Unserialize(update),
+ "Node 1 has duplicate child id 2");
+#else
EXPECT_FALSE(tree.Unserialize(update));
ASSERT_EQ("Node 1 has duplicate child id 2", tree.error());
histogram_tester.ExpectUniqueSample(
@@ -509,6 +523,7 @@ TEST(AXTreeTest, DuplicateChildIdFails) {
AXTreeUnserializeError::kDuplicateChild, 1);
histogram_tester.ExpectTotalCount(
"Accessibility.Performance.Tree.Unserialize", 1);
+#endif
}
TEST(AXTreeTest, InvalidReparentingFails) {
@@ -536,6 +551,11 @@ TEST(AXTreeTest, InvalidReparentingFails) {
update.nodes[0].child_ids.push_back(2);
update.nodes[1].id = 2;
update.nodes[2].id = 3;
+#if defined(AX_FAIL_FAST_BUILD)
+ EXPECT_DEATH_IF_SUPPORTED(
+ tree.Unserialize(update),
+ "Node 3 is not marked for destruction, would be reparented to 1");
+#else
EXPECT_FALSE(tree.Unserialize(update));
ASSERT_EQ("Node 3 is not marked for destruction, would be reparented to 1",
tree.error());
@@ -544,6 +564,7 @@ TEST(AXTreeTest, InvalidReparentingFails) {
AXTreeUnserializeError::kReparent, 1);
histogram_tester.ExpectTotalCount(
"Accessibility.Performance.Tree.Unserialize", 1);
+#endif
}
TEST(AXTreeTest, NoReparentingOfRootIfNoNewRoot) {
@@ -954,6 +975,7 @@ TEST(AXTreeTest, ImplicitAttributeDelete) {
initial_state.root_id = 1;
initial_state.nodes.resize(1);
initial_state.nodes[0].id = 1;
+ initial_state.nodes[0].role = ax::mojom::Role::kGroup;
initial_state.nodes[0].SetName("Node 1 name");
AXTree tree(initial_state);
@@ -1205,7 +1227,13 @@ TEST(AXTreeTest, BogusAXTree2) {
node2.child_ids.push_back(0);
initial_state.nodes.push_back(node2);
ui::AXTree tree;
- tree.Unserialize(initial_state);
+#if defined(AX_FAIL_FAST_BUILD)
+ EXPECT_DEATH_IF_SUPPORTED(tree.Unserialize(initial_state),
+ "Node 0 has duplicate child id 0");
+#else
+ EXPECT_FALSE(tree.Unserialize(initial_state));
+ EXPECT_EQ("Node 0 has duplicate child id 0", tree.error());
+#endif
}
// UAF caught by ax_tree_fuzzer
@@ -1223,7 +1251,13 @@ TEST(AXTreeTest, BogusAXTree3) {
initial_state.nodes.push_back(node2);
ui::AXTree tree;
- tree.Unserialize(initial_state);
+#if defined(AX_FAIL_FAST_BUILD)
+ EXPECT_DEATH_IF_SUPPORTED(tree.Unserialize(initial_state),
+ "Node 1 has duplicate child id 1");
+#else
+ EXPECT_FALSE(tree.Unserialize(initial_state));
+ EXPECT_EQ("Node 1 has duplicate child id 1", tree.error());
+#endif
}
TEST(AXTreeTest, RoleAndStateChangeCallbacks) {
@@ -5381,10 +5415,17 @@ TEST(AXTreeTest, UnserializeErrors) {
ui::AXNodeData disconnected_node;
disconnected_node.id = 2;
tree_update_3.nodes.push_back(disconnected_node);
+#if defined(AX_FAIL_FAST_BUILD)
+ EXPECT_DEATH_IF_SUPPORTED(
+ tree.Unserialize(tree_update_3),
+ "2 will not be in the tree and is not the new root");
+#else
EXPECT_FALSE(tree.Unserialize(tree_update_3));
+ EXPECT_EQ("2 will not be in the tree and is not the new root", tree.error());
histogram_tester.ExpectUniqueSample(
"Accessibility.Reliability.Tree.UnserializeError",
AXTreeUnserializeError::kNotInTree, 1);
+#endif
}
} // namespace ui
diff --git a/chromium/ui/accessibility/extensions/color_contrast_companion/background.js b/chromium/ui/accessibility/extensions/color_contrast_companion/background.js
new file mode 100644
index 00000000000..68e985c2c6c
--- /dev/null
+++ b/chromium/ui/accessibility/extensions/color_contrast_companion/background.js
@@ -0,0 +1,96 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+var stream = null;
+var ui = null;
+
+chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
+ console.log('Got message');
+ console.log(request);
+ if (request.close && ui) {
+ chrome.windows.remove(ui.id);
+ }
+});
+
+function capture() {
+ let video = document.createElement('video');
+ video.autoplay = true;
+ document.body.appendChild(video);
+ video.addEventListener('canplay', () => {
+ if (video.videoWidth < 100) {
+ // We probably need the permission again.
+ getStream();
+ return;
+ }
+
+ window.setTimeout(() => {
+ let canvas = document.createElement('canvas');
+ canvas.height = video.videoHeight;
+ canvas.width = video.videoWidth;
+ var context = canvas.getContext('2d');
+ context.drawImage(video, 0, 0, canvas.width, canvas.height);
+ var imageDataUrl = canvas.toDataURL();
+ document.body.removeChild(video);
+
+ // Close the stream so it stops using resources.
+ let tracks = stream.getTracks();
+ tracks.forEach(function(track) {
+ track.stop();
+ });
+ stream = null;
+
+ chrome.windows.create(
+ {
+ 'url': chrome.runtime.getURL('ui.html'),
+ 'focused': true,
+ 'type': 'popup',
+ 'state': 'fullscreen'
+ },
+ (win) => {
+ ui = win;
+ var tab = win.tabs[0];
+ window.setTimeout(() => {
+ console.log('Sending message');
+ chrome.tabs.sendMessage(tab.id, {'imageDataUrl': imageDataUrl});
+ }, 250);
+ });
+ }, 250);
+ });
+ video.srcObject = stream;
+}
+
+function getStream() {
+ chrome.desktopCapture.chooseDesktopMedia(['screen'], (streamId) => {
+ let video = document.createElement('video');
+ navigator.mediaDevices
+ .getUserMedia({
+ video: {
+ mandatory: {
+ chromeMediaSource: 'desktop',
+ chromeMediaSourceId: streamId,
+ }
+ }
+ })
+ .then(returnedStream => {
+ stream = returnedStream;
+ capture();
+ });
+ });
+}
+
+chrome.browserAction.onClicked.addListener(() => {
+ if (!stream) {
+ getStream();
+ return;
+ }
+
+ capture();
+});
+
+var alreadyShowedHelp = localStorage.getItem('help');
+if (!alreadyShowedHelp) {
+ localStorage.setItem('help', 'true');
+ chrome.windows.create(
+ {'url': chrome.runtime.getURL('help.html'), 'focused': true});
+}
diff --git a/chromium/ui/accessibility/extensions/color_contrast_companion/browser_action.png b/chromium/ui/accessibility/extensions/color_contrast_companion/browser_action.png
new file mode 100644
index 00000000000..a72899c2832
--- /dev/null
+++ b/chromium/ui/accessibility/extensions/color_contrast_companion/browser_action.png
Binary files differ
diff --git a/chromium/ui/accessibility/extensions/color_contrast_companion/common.js b/chromium/ui/accessibility/extensions/color_contrast_companion/common.js
new file mode 100644
index 00000000000..b4cf068274b
--- /dev/null
+++ b/chromium/ui/accessibility/extensions/color_contrast_companion/common.js
@@ -0,0 +1,101 @@
+// Copyright (c) 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+var DEFAULT_SCHEME = 3;
+var MAX_SCHEME = 5;
+
+function $(id) {
+ return document.getElementById(id);
+}
+
+function getEnabled() {
+ var result = localStorage['enabled'];
+ if (result === 'true' || result === 'false') {
+ return (result === 'true');
+ }
+ localStorage['enabled'] = 'true';
+ return true;
+}
+
+function setEnabled(enabled) {
+ localStorage['enabled'] = enabled;
+}
+
+function getKeyAction() {
+ var keyAction = localStorage['keyaction'];
+ if (keyAction == 'global' || keyAction == 'site') {
+ return keyAction;
+ }
+ keyAction = 'global';
+ localStorage['keyaction'] = keyAction;
+ return keyAction;
+}
+
+function setKeyAction(keyAction) {
+ if (keyAction != 'global' && keyAction != 'site') {
+ keyAction = 'global';
+ }
+ localStorage['keyaction'] = keyAction;
+}
+
+function getDefaultScheme() {
+ var scheme = localStorage['scheme'];
+ if (scheme >= 0 && scheme <= MAX_SCHEME) {
+ return scheme;
+ }
+ scheme = DEFAULT_SCHEME;
+ localStorage['scheme'] = scheme;
+ return scheme;
+}
+
+function setDefaultScheme(scheme) {
+ if (!(scheme >= 0 && scheme <= MAX_SCHEME)) {
+ scheme = DEFAULT_SCHEME;
+ }
+ localStorage['scheme'] = scheme;
+}
+
+function getSiteScheme(site) {
+ var scheme = getDefaultScheme();
+ try {
+ var siteSchemes = JSON.parse(localStorage['siteschemes']);
+ scheme = siteSchemes[site];
+ if (!(scheme >= 0 && scheme <= MAX_SCHEME)) {
+ scheme = getDefaultScheme();
+ }
+ } catch (e) {
+ scheme = getDefaultScheme();
+ }
+ return scheme;
+}
+
+function setSiteScheme(site, scheme) {
+ if (!(scheme >= 0 && scheme <= MAX_SCHEME)) {
+ scheme = getDefaultScheme();
+ }
+ var siteSchemes = {};
+ try {
+ siteSchemes = JSON.parse(localStorage['siteschemes']);
+ siteSchemes['www.example.com'] = getDefaultScheme();
+ } catch (e) {
+ siteSchemes = {};
+ }
+ siteSchemes[site] = scheme;
+ localStorage['siteschemes'] = JSON.stringify(siteSchemes);
+}
+
+function resetSiteSchemes() {
+ var siteSchemes = {};
+ localStorage['siteschemes'] = JSON.stringify(siteSchemes);
+}
+
+function siteFromUrl(url) {
+ var a = document.createElement('a');
+ a.href = url;
+ return a.hostname;
+}
+
+function isDisallowedUrl(url) {
+ return url.startsWith('chrome') || url.startsWith('about');
+}
diff --git a/chromium/ui/accessibility/extensions/color_contrast_companion/contrast-128.png b/chromium/ui/accessibility/extensions/color_contrast_companion/contrast-128.png
new file mode 100644
index 00000000000..2814544cafb
--- /dev/null
+++ b/chromium/ui/accessibility/extensions/color_contrast_companion/contrast-128.png
Binary files differ
diff --git a/chromium/ui/accessibility/extensions/color_contrast_companion/contrast-16.png b/chromium/ui/accessibility/extensions/color_contrast_companion/contrast-16.png
new file mode 100644
index 00000000000..9313a62fc67
--- /dev/null
+++ b/chromium/ui/accessibility/extensions/color_contrast_companion/contrast-16.png
Binary files differ
diff --git a/chromium/ui/accessibility/extensions/color_contrast_companion/contrast-19.png b/chromium/ui/accessibility/extensions/color_contrast_companion/contrast-19.png
new file mode 100644
index 00000000000..84d1b8271dd
--- /dev/null
+++ b/chromium/ui/accessibility/extensions/color_contrast_companion/contrast-19.png
Binary files differ
diff --git a/chromium/ui/accessibility/extensions/color_contrast_companion/contrast-38.png b/chromium/ui/accessibility/extensions/color_contrast_companion/contrast-38.png
new file mode 100644
index 00000000000..998b3f1a1dc
--- /dev/null
+++ b/chromium/ui/accessibility/extensions/color_contrast_companion/contrast-38.png
Binary files differ
diff --git a/chromium/ui/accessibility/extensions/color_contrast_companion/contrast-48.png b/chromium/ui/accessibility/extensions/color_contrast_companion/contrast-48.png
new file mode 100644
index 00000000000..0f61571e41e
--- /dev/null
+++ b/chromium/ui/accessibility/extensions/color_contrast_companion/contrast-48.png
Binary files differ
diff --git a/chromium/ui/accessibility/extensions/color_contrast_companion/help.html b/chromium/ui/accessibility/extensions/color_contrast_companion/help.html
new file mode 100644
index 00000000000..e99eb01c612
--- /dev/null
+++ b/chromium/ui/accessibility/extensions/color_contrast_companion/help.html
@@ -0,0 +1,151 @@
+<head>
+ <title>
+ Color Contrast Companion
+ </title>
+ <style>
+ .logo {
+ float: left;
+ }
+ h1 {
+ padding-top: 24px;
+ }
+ body, div, p {
+ font-family: system-ui, sans-serif;
+ font-size: 14pt;
+ line-height: 1.5;
+ }
+ p {
+ margin: 24px 0;
+ }
+ body {
+ background-color: #eee;
+ padding: 0;
+ margin: 0;
+ }
+ #main {
+ background-color: #fff;
+ width: 780px;
+ margin: 0 auto;
+ border-left: 1px solid #444;
+ border-right: 1px solid #444;
+ padding: 24px;
+ min-height: 500px;
+ }
+ .top {
+ width: 100%;
+ float: left;
+ }
+ .note {
+ padding: 0 16px;
+ border: 1px solid #88e;
+ }
+ </style>
+</head>
+<body>
+ <div id="main">
+ <div class="top">
+ <div class="logo">
+ <img src="contrast-128.png" alt="Color Contrast Companion logo">
+ </div>
+ <h1>Color Contrast Companion</h2>
+ <p>
+ <i>Quickly compute the color contrast of pixels anywhere on your screen.</i>
+ </p>
+ </div>
+
+ <p>
+ This is a tool to compute the contrast between a foreground and
+ background color, to help test whether an application is
+ providing enough contrast so that text can be read by people
+ with moderately low vision.
+ </p>
+
+ <p>
+ <a href="https://www.w3.org/TR/WCAG21/#contrast-minimum">WCAG</a>
+ recommends these contrast ratios:
+ <ul>
+ <li> AA: 4.5:1 for all text, 3:1 for 18 pts and larger.
+ <li> AAA: 7:1 for all text, 4.5:1 for 18 pts and larger.
+ <li> Focus indicators: 3:1 if 3px thick, 4.5:1 if less.
+ <a href="https://www.w3.org/WAI/GL/low-vision-a11y-tf/wiki/Contrast_(Minimum)#Focus_Indicators">(Source)</a>
+ </ul>
+ </p>
+ <p>
+ For more information, see the links at the bottom of this page.
+ </p>
+
+ <h2>How to use Color Contrast Companion</h2>
+
+ <div class="note">
+ <p>
+ <b>Note</b>:
+ If you're a web developer or if you're testing a web app, you already
+ have great color contrast tools built directly into Chrome's
+ Developer Tools! For more information, see
+ <a href="https://developers.google.com/web/updates/2018/01/devtools#contrast">
+ Contrast ratio in the Color Picker</a>.
+ </p>
+ <p>
+ However, there are cases where you might want to check the contrast of
+ something on your screen that you can't inspect in Chrome's Developer Tools -
+ such as Chrome's UI, text inside an image, or another app outside of Chrome.
+ For those cases, this extension can help!
+ </p>
+ </div>
+
+ <p>
+ <b>Step 1</b>:
+ Click on the Color Contrast Companion icon on the right side of the
+ Chrome toolbar. If you have a lot of extensions installed, the icon
+ might be inside the Chrome menu (the three dots).
+ </p>
+
+ <p>
+ <img src="browser_action.png" alt="Image of icon in Chrome toolbar">
+ </p>
+
+ <p>
+ <b>Step 2</b>:
+ A <b>Share Your Screen</b> dialog pops up asking for your permission to
+ share your entire screen with Color Contrast Companion.
+ This is necessary for Color Contrast Companion to take a screenshot of
+ your entire desktop. This image is never saved or sent to any server, it's
+ only used to let you pick colors. Click the Share button.
+ </p>
+
+ <p>
+ <b>Step 3</b>:
+ A window opens up showing a screenshot of your computer screen, magnified.
+ Scroll to the portion of the screen containing the pixels you're interested
+ in. Click once to pick the foreground color, click again to pick the
+ background color. Keep clicking as many times as necessary if you're not
+ happy with the colors you picked the first time.
+ </p>
+
+ <p>
+ <b>Step 4</b>:
+ The contrast ratio is shown at the top of the page. Copy the text from the
+ text box and paste it directly into a bug report if necessary, then click
+ the Close button.
+ </p>
+
+ <h2>Further reading</h2>
+
+ <p>
+ <ul>
+ <li>
+ <a href="https://www.w3.org/TR/WCAG21/#contrast-minimum">
+ Web Contents Accessibility Guidelines (WCAG) 2.1 spec
+ </a>
+ <li>
+
+ <a href="https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html">
+ Understanding Success Criterion 1.4.3: Contrast (Minimum)
+ </a>
+ </li>
+ </ul>
+ </p>
+
+ </div>
+
+</body>
diff --git a/chromium/ui/accessibility/extensions/color_contrast_companion/highcontrast.js b/chromium/ui/accessibility/extensions/color_contrast_companion/highcontrast.js
new file mode 100644
index 00000000000..83e31cfee98
--- /dev/null
+++ b/chromium/ui/accessibility/extensions/color_contrast_companion/highcontrast.js
@@ -0,0 +1,177 @@
+// Copyright (c) 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+var mode;
+var enabled = false;
+var scheme = '';
+var timeoutId = null;
+
+var filterMap = {
+ '0': 'url("#hc_extension_off")',
+ '1': 'url("#hc_extension_highcontrast")',
+ '2': 'url("#hc_extension_grayscale")',
+ '3': 'url("#hc_extension_invert")',
+ '4': 'url("#hc_extension_invert_grayscale")',
+ '5': 'url("#hc_extension_yellow_on_black")'
+};
+
+var svgContent =
+ '<svg xmlns="http://www.w3.org/2000/svg" version="1.1"><defs><filter x="0" y="0" width="99999" height="99999" id="hc_extension_off"><feComponentTransfer><feFuncR type="table" tableValues="0 1"/><feFuncG type="table" tableValues="0 1"/><feFuncB type="table" tableValues="0 1"/></feComponentTransfer></filter><filter x="0" y="0" width="99999" height="99999" id="hc_extension_highcontrast"><feComponentTransfer><feFuncR type="gamma" exponent="3.0"/><feFuncG type="gamma" exponent="3.0"/><feFuncB type="gamma" exponent="3.0"/></feComponentTransfer></filter><filter x="0" y="0" width="99999" height="99999" id="hc_extension_highcontrast_back"><feComponentTransfer><feFuncR type="gamma" exponent="0.33"/><feFuncG type="gamma" exponent="0.33"/><feFuncB type="gamma" exponent="0.33"/></feComponentTransfer></filter><filter x="0" y="0" width="99999" height="99999" id="hc_extension_grayscale"><feColorMatrix type="matrix" values="0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0"/><feComponentTransfer><feFuncR type="gamma" exponent="3"/><feFuncG type="gamma" exponent="3"/><feFuncB type="gamma" exponent="3"/></feComponentTransfer></filter><filter x="0" y="0" width="99999" height="99999" id="hc_extension_grayscale_back"><feComponentTransfer><feFuncR type="gamma" exponent="0.33"/><feFuncG type="gamma" exponent="0.33"/><feFuncB type="gamma" exponent="0.33"/></feComponentTransfer></filter><filter x="0" y="0" width="99999" height="99999" id="hc_extension_invert"><feComponentTransfer><feFuncR type="gamma" amplitude="-1" exponent="3" offset="1"/><feFuncG type="gamma" amplitude="-1" exponent="3" offset="1"/><feFuncB type="gamma" amplitude="-1" exponent="3" offset="1"/></feComponentTransfer></filter><filter x="0" y="0" width="99999" height="99999" id="hc_extension_invert_back"><feComponentTransfer><feFuncR type="table" tableValues="1 0"/><feFuncG type="table" tableValues="1 0"/><feFuncB type="table" tableValues="1 0"/></feComponentTransfer><feComponentTransfer><feFuncR type="gamma" exponent="1.7"/><feFuncG type="gamma" exponent="1.7"/><feFuncB type="gamma" exponent="1.7"/></feComponentTransfer></filter><filter x="0" y="0" width="99999" height="99999" id="hc_extension_invert_grayscale"><feColorMatrix type="matrix" values="0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0"/><feComponentTransfer><feFuncR type="gamma" amplitude="-1" exponent="3" offset="1"/><feFuncG type="gamma" amplitude="-1" exponent="3" offset="1"/><feFuncB type="gamma" amplitude="-1" exponent="3" offset="1"/></feComponentTransfer></filter><filter x="0" y="0" width="99999" height="99999" id="hc_extension_yellow_on_black"><feComponentTransfer><feFuncR type="gamma" amplitude="-1" exponent="3" offset="1"/><feFuncG type="gamma" amplitude="-1" exponent="3" offset="1"/><feFuncB type="gamma" amplitude="-1" exponent="3" offset="1"/></feComponentTransfer><feColorMatrix type="matrix" values="0.3 0.5 0.2 0 0 0.3 0.5 0.2 0 0 0 0 0 0 0 0 0 0 1 0"/></filter><filter x="0" y="0" width="99999" height="99999" id="hc_extension_yellow_on_black_back"><feComponentTransfer><feFuncR type="table" tableValues="1 0"/><feFuncG type="table" tableValues="1 0"/><feFuncB type="table" tableValues="1 0"/></feComponentTransfer><feComponentTransfer><feFuncR type="gamma" exponent="0.33"/><feFuncG type="gamma" exponent="0.33"/><feFuncB type="gamma" exponent="0.33"/></feComponentTransfer></filter></defs></svg>';
+
+var cssTemplate =
+ 'html[hc="a0"] { -webkit-filter: url("#hc_extension_off"); } html[hcx="0"] img[src*="jpg"], html[hcx="0"] img[src*="jpeg"], html[hcx="0"] svg image, html[hcx="0"] img.rg_i, html[hcx="0"] embed, html[hcx="0"] object, html[hcx="0"] video { -webkit-filter: url("#hc_extension_off"); } html[hc="a1"] { -webkit-filter: url("#hc_extension_highcontrast"); } html[hcx="1"] img[src*="jpg"], html[hcx="1"] img[src*="jpeg"], html[hcx="1"] img.rg_i, html[hcx="1"] svg image, html[hcx="1"] embed, html[hcx="1"] object, html[hcx="1"] video { -webkit-filter: url("#hc_extension_highcontrast_back"); } html[hc="a2"] { -webkit-filter: url("#hc_extension_grayscale"); } html[hcx="2"] img[src*="jpg"], html[hcx="2"] img[src*="jpeg"], html[hcx="2"] img.rg_i, html[hcx="2"] svg image, html[hcx="2"] embed, html[hcx="2"] object, html[hcx="2"] video { -webkit-filter: url("#hc_extension_grayscale_back"); } html[hc="a3"] { -webkit-filter: url("#hc_extension_invert"); } html[hcx="3"] img[src*="jpg"], html[hcx="3"] img[src*="jpeg"], html[hcx="3"] img.rg_i, html[hcx="3"] svg image, html[hcx="3"] embed, html[hcx="3"] object, html[hcx="3"] video { -webkit-filter: url("#hc_extension_invert_back"); } html[hc="a4"] { -webkit-filter: url("#hc_extension_invert_grayscale"); } html[hcx="4"] img[src*="jpg"], html[hcx="4"] img[src*="jpeg"], html[hcx="4"] img.rg_i, html[hcx="4"] svg image, html[hcx="4"] embed, html[hcx="4"] object, html[hcx="4"] video { -webkit-filter: url("#hc_extension_invert_back"); } html[hc="a5"] { -webkit-filter: url("#hc_extension_yellow_on_black"); } html[hcx="5"] img[src*="jpg"], html[hcx="5"] img[src*="jpeg"], html[hcx="5"] img.rg_i, html[hcx="5"] svg image, html[hcx="5"] embed, html[hcx="5"] object, html[hcx="5"] video { -webkit-filter: url("#hc_extension_yellow_on_black_back"); }';
+
+/**
+ * Add the elements to the pgae that make high-contrast adjustments possible.
+ */
+function addOrUpdateExtraElements() {
+ if (!enabled)
+ return;
+
+ // We used to include the CSS, but that doesn't work when the document
+ // uses the <base> element to set a relative url. So instead we
+ // add a <style> element directly to the document with the right
+ // urls hard-coded into it.
+ var style = document.getElementById('hc_style');
+ if (!style) {
+ var baseUrl = window.location.href.replace(window.location.hash, '');
+ var css = cssTemplate.replace(/#/g, baseUrl + '#');
+ style = document.createElement('style');
+ style.id = 'hc_style';
+ style.setAttribute('type', 'text/css');
+ style.innerHTML = css;
+ document.head.appendChild(style);
+ }
+
+ // Starting in Chrome 45 we can't apply a filter to the html element,
+ // so instead we create an element with low z-index that copies the
+ // body's background.
+ var bg = document.getElementById('hc_extension_bkgnd');
+ if (!bg) {
+ bg = document.createElement('div');
+ bg.id = 'hc_extension_bkgnd';
+ bg.style.position = 'fixed';
+ bg.style.left = '0px';
+ bg.style.top = '0px';
+ bg.style.right = '0px';
+ bg.style.bottom = '0px';
+ bg.style.zIndex = -1999999999;
+ document.body.appendChild(bg);
+ }
+ bg.style.display = 'block';
+ bg.style.background = window.getComputedStyle(document.body).background;
+
+ // As a special case, replace a zero-alpha background with white,
+ // otherwise we can't invert it.
+ var c = bg.style.backgroundColor;
+ c = c.replace(/\s\s*/g, '');
+ if (m = /^rgba\(([\d]+),([\d]+),([\d]+),([\d]+|[\d]*.[\d]+)\)/.exec(c)) {
+ if (m[4] == '0') {
+ bg.style.backgroundColor = '#fff';
+ }
+ }
+
+ // Add a hidden element with the SVG filters.
+ var wrap = document.getElementById('hc_extension_svg_filters');
+ if (wrap)
+ return;
+
+ wrap = document.createElement('span');
+ wrap.id = 'hc_extension_svg_filters';
+ wrap.setAttribute('hidden', '');
+ wrap.innerHTML = svgContent;
+ document.body.appendChild(wrap);
+}
+
+/**
+ * This is called on load and every time the mode might have changed
+ * (i.e. enabling/disabling, or changing the type of contrast adjustment
+ * for this page).
+ */
+function update() {
+ var html = document.documentElement;
+ if (enabled) {
+ if (!document.body) {
+ window.setTimeout(update, 100);
+ return;
+ }
+ addOrUpdateExtraElements();
+ if (html.getAttribute('hc') != mode + scheme)
+ html.setAttribute('hc', mode + scheme);
+ if (html.getAttribute('hcx') != scheme)
+ html.setAttribute('hcx', scheme);
+
+ if (window == window.top) {
+ window.scrollBy(0, 1);
+ window.scrollBy(0, -1);
+ }
+ } else {
+ html.setAttribute('hc', mode + '0');
+ html.setAttribute('hcx', '0');
+ window.setTimeout(function() {
+ html.removeAttribute('hc');
+ html.removeAttribute('hcx');
+ var bg = document.getElementById('hc_extension_bkgnd');
+ if (bg)
+ bg.style.display = 'none';
+ }, 0);
+ }
+}
+
+/**
+ * Called when we get a message from the background page.
+ */
+function onExtensionMessage(request) {
+ if (enabled != request.enabled || scheme != request.scheme) {
+ enabled = request.enabled;
+ scheme = request.scheme;
+ update();
+ }
+}
+
+/**
+ * KeyDown event handler
+ */
+function onKeyDown(evt) {
+ if (evt.keyCode == 122 /* F11 */ && evt.shiftKey) {
+ chrome.extension.sendRequest({'toggle_global': true});
+ evt.stopPropagation();
+ evt.preventDefault();
+ return false;
+ }
+ if (evt.keyCode == 123 /* F12 */ && evt.shiftKey) {
+ chrome.extension.sendRequest({'toggle_site': true});
+ evt.stopPropagation();
+ evt.preventDefault();
+ return false;
+ }
+ return true;
+}
+
+function init() {
+ if (window == window.top) {
+ mode = 'a';
+ } else {
+ mode = 'b';
+ }
+ chrome.extension.onRequest.addListener(onExtensionMessage);
+ chrome.extension.sendRequest({'init': true}, onExtensionMessage);
+ document.addEventListener('keydown', onKeyDown, false);
+
+ // Update again after a few seconds and again after load so that
+ // the background isn't wrong for long.
+ window.setTimeout(addOrUpdateExtraElements, 2000);
+ window.addEventListener('load', function() {
+ addOrUpdateExtraElements();
+
+ // Also update when the document body attributes change.
+ var config = {attributes: true, childList: false, characterData: false};
+ var observer = new MutationObserver(function(mutations) {
+ addOrUpdateExtraElements();
+ });
+ observer.observe(document.body, config);
+ });
+}
+
+init();
diff --git a/chromium/ui/accessibility/extensions/color_contrast_companion/manifest.json b/chromium/ui/accessibility/extensions/color_contrast_companion/manifest.json
new file mode 100644
index 00000000000..2f065558368
--- /dev/null
+++ b/chromium/ui/accessibility/extensions/color_contrast_companion/manifest.json
@@ -0,0 +1,22 @@
+{
+ "background": {
+ "scripts": [ "background.js" ]
+ },
+ "browser_action": {
+ "default_icon": {
+ "19": "contrast-19.png",
+ "38": "contrast-38.png"
+ },
+ "default_title": "Color Contrast Companion"
+ },
+ "description": "Quickly compute the color contrast of pixels anywhere on your screen.",
+ "icons": {
+ "128": "contrast-128.png",
+ "16": "contrast-16.png",
+ "48": "contrast-48.png"
+ },
+ "manifest_version": 2,
+ "name": "Color Contrast Companion",
+ "permissions": [ "desktopCapture", "tabs" ],
+ "version": "0.0.5"
+}
diff --git a/chromium/ui/accessibility/extensions/color_contrast_companion/ui.html b/chromium/ui/accessibility/extensions/color_contrast_companion/ui.html
new file mode 100644
index 00000000000..fafc5183701
--- /dev/null
+++ b/chromium/ui/accessibility/extensions/color_contrast_companion/ui.html
@@ -0,0 +1,130 @@
+<head>
+ <style>
+ #top_panel {
+ position: fixed;
+ top: 0px;
+ left: 0px;
+ right: 0px;
+ height: 96px;
+ display: flex;
+ }
+ #img_panel {
+ cursor: crosshair;
+ position: fixed;
+ bottom: 0px;
+ left: 0px;
+ right: 0px;
+ top: 96px;
+ overflow: scroll;
+ padding: 4px;
+ border: 4px solid #ff9900;
+ }
+ .color {
+ margin: 8px;
+ width: 128px;
+ height: 48px;
+ border: 1px solid #000;
+ }
+ .rgb {
+ }
+ .ratio {
+ width: 88px;
+ height: 48px;
+ border: 1px solid #000;
+ text-align: center;
+ line-height: 48px;
+ font-size: 18px;
+ margin: 8px;
+ }
+ #details {
+ width: 148px;
+ height: 72px;
+ margin: 8px;
+ }
+ .current {
+ outline: 3px solid #f00;
+ }
+ .group {
+ }
+ .gtop {
+ }
+ .caption {
+ margin-left: 8px;
+ }
+ button {
+ width: 90px;
+ height: 32px;
+ margin: 8px 8px 0 8px;
+ color: #000;
+ font-weight: bold;
+ background-color: #fc9;
+ }
+ button:disabled {
+ color: #999;
+ }
+ canvas {
+ image-rendering: pixelated;
+ transform-origin: top left;
+ }
+ #highlight_container {
+ position: relative;
+ width: 0;
+ height: 0;
+ overflow: visible;
+ }
+ #highlight {
+ position: absolute;
+ outline: 2px solid #ff9900;
+ outline-offset: 2px;
+ z-index: 2;
+ pointer-events: none;
+ }
+ </style>
+</head>
+<body>
+ <div id="top_panel">
+ <div style="width:96px">
+ <img src="contrast-128.png" width=96 height=96 >
+ </div>
+ <div class="group">
+ <div class="gtop">
+ <div class="color" id="hover"></div>
+ </div>
+ <div class="caption">Hover: <span class="rgb" id="hoverrgb"></span></div>
+ </div>
+ <div class="group">
+ <div class="gtop">
+ <div class="color" id="fg"></div>
+ </div>
+ <div class="caption">Foreground: <span class="rgb" id="fgrgb"><span></div>
+ </div>
+ <div class="group">
+ <div class="gtop">
+ <div class="color" id="bg"></div>
+ </div>
+ <div class="caption">Background: <span class="rgb" id="bgrgb"></span></div>
+ </div>
+ <div>
+ <div class="ratio" id="ratio"></div>
+ <div class="caption">Contrast Ratio</div>
+ </div>
+ <div>
+ <textarea id="details"></textarea>
+ </div>
+ <div style="width: 104px">
+ <button id="zoomin">Zoom In (+)</button>
+ <button id="zoomout">Zoom Out (-)</button>
+ </div>
+ <div style="width: 104px">
+ <button id="close">Close</button>
+ <button id="help">Help</button>
+ </div>
+ </div>
+ <div id="img_panel">
+ <div id="highlight_container">
+ <div id="highlight"></div>
+ </div>
+ <canvas></canvas>
+ </div>
+ <script src="ui.js"></script>
+</body>
diff --git a/chromium/ui/accessibility/extensions/color_contrast_companion/ui.js b/chromium/ui/accessibility/extensions/color_contrast_companion/ui.js
new file mode 100644
index 00000000000..4fc2ff3df9c
--- /dev/null
+++ b/chromium/ui/accessibility/extensions/color_contrast_companion/ui.js
@@ -0,0 +1,290 @@
+// 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.
+
+var maxScale = 32;
+
+var scale = 4;
+var fgtoggle = true;
+var fgcolor = null;
+var bgcolor = null;
+var srcImage = null;
+var imageData = null;
+var prevScale = 1;
+
+let close = document.getElementById('close');
+close.addEventListener('click', () => {
+ console.log('Sending message');
+ chrome.runtime.sendMessage({'close': true});
+});
+let help = document.getElementById('help');
+help.addEventListener('click', () => {
+ window.open(chrome.runtime.getURL('help.html'), '_blank');
+});
+
+let canvas = document.querySelector('canvas');
+
+function repaint() {
+ console.log('Repaint ' + scale);
+ let width = srcImage.naturalWidth;
+ let height = srcImage.naturalHeight;
+ let context = canvas.getContext('2d');
+ context.imageSmoothingEnabled = false;
+ canvas.style.transform = 'scale(' + scale + ')';
+
+ canvas.width = 1;
+ canvas.height = 1;
+ canvas.offsetLeft;
+ canvas.width = width;
+ canvas.height = height;
+ canvas.offsetLeft;
+
+ context.drawImage(srcImage, 0, 0, width, height);
+ imageData = context.getImageData(0, 0, width, height).data;
+}
+
+
+chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
+ if (request.imageDataUrl) {
+ var img = document.createElement('img');
+ img.addEventListener('load', () => {
+ srcImage = img;
+ repaint();
+ });
+ img.src = request.imageDataUrl;
+ }
+});
+
+let hover = document.getElementById('hover');
+let hoverrgb = document.getElementById('hoverrgb');
+let fg = document.getElementById('fg');
+let fgrgb = document.getElementById('fgrgb');
+let bg = document.getElementById('bg');
+let bgrgb = document.getElementById('bgrgb');
+let scrollpanel = document.getElementById('img_panel');
+let ratio = document.getElementById('ratio');
+let details = document.getElementById('details');
+let zoomin = document.getElementById('zoomin');
+let zoomout = document.getElementById('zoomout');
+let highlight = document.getElementById('highlight');
+
+fg.classList.add('current');
+bg.classList.remove('current');
+
+function rgbToHex(color) {
+ var r = color[0];
+ var g = color[1];
+ var b = color[2];
+ return '#' + ((r << 16) | (g << 8) | b).toString(16);
+}
+
+function getRelativeLuminance(color) {
+ var rSRGB = color[0] / 255;
+ var gSRGB = color[1] / 255;
+ var bSRGB = color[2] / 255;
+ var r =
+ rSRGB <= .03928 ? rSRGB / 12.92 : Math.pow((rSRGB + .055) / 1.055, 2.4);
+ var g =
+ gSRGB <= .03928 ? gSRGB / 12.92 : Math.pow((gSRGB + .055) / 1.055, 2.4);
+ var b =
+ bSRGB <= .03928 ? bSRGB / 12.92 : Math.pow((bSRGB + .055) / 1.055, 2.4);
+ return .2126 * r + .7152 * g + .0722 * b;
+};
+
+function getContrast(color1, color2) {
+ var c1lum = getRelativeLuminance(color1);
+ var c2lum = getRelativeLuminance(color2);
+ return (Math.max(c1lum, c2lum) + .05) / (Math.min(c1lum, c2lum) + .05);
+}
+
+let context = canvas.getContext('2d');
+let bounds = canvas.getBoundingClientRect();
+
+function getXY(evt) {
+ var x = evt.clientX + scrollpanel.scrollLeft - bounds.left;
+ var y = evt.clientY + scrollpanel.scrollTop - bounds.top;
+ return [Math.floor(x / scale), Math.floor(y / scale)];
+}
+
+function getColor(x, y) {
+ try {
+ var pixelIndex = y * srcImage.naturalWidth + x;
+ return imageData.slice(4 * pixelIndex, 4 * (pixelIndex + 1));
+ } catch (e) {
+ return [0, 0, 0, 0];
+ }
+}
+
+function brightness(color) {
+ return (color[0] + color[1] + color[2]) / 3;
+}
+
+function localMax(x, y) {
+ // This needs to be optional. Doesn't always do what we want.
+ return [x, y];
+
+ if (x < 0 || x >= srcImage.naturalWidth || y < 0 ||
+ y + j >= srcImage.naturalHeight) {
+ return [x, y];
+ }
+
+ var ctr = getColor(x, y);
+ var max = brightness(ctr);
+
+ var max;
+ var amax;
+ for (var i = -2; i <= 2; i++) {
+ for (var j = -2; j <= 2; j++) {
+ if (x + i < 0 || x + i >= srcImage.naturalWidth)
+ continue;
+ if (y + j < 0 || y + j >= srcImage.naturalHeight)
+ continue;
+ var c = getColor(x + i, y + j);
+ var cbright = brightness(c);
+ if (max > 128 && cbright > max) {
+ max = cbright;
+ amax = [x + i, y + j];
+ } else if (max < 128 && cbright < max) {
+ max = cbright;
+ amax = [x + i, y + j];
+ }
+ }
+ }
+
+ if (amax)
+ return amax;
+ else
+ return [x, y];
+}
+
+canvas.addEventListener('mousemove', (evt) => {
+ var x1, y1, x, y;
+ [x1, y1] = getXY(evt);
+ [x, y] = localMax(x1, y1);
+ var color = getColor(x, y);
+ var hex = rgbToHex(color);
+ hover.style.backgroundColor = hex;
+ hoverrgb.innerText = hex;
+
+ if (scale >= 8) {
+ highlight.style.display = 'block';
+ highlight.style.left = (scale * x) + 'px';
+ highlight.style.top = (scale * y) + 'px';
+ highlight.style.width = scale + 'px';
+ highlight.style.height = scale + 'px';
+ highlight.style.top = (scale * y) + 'px';
+ } else {
+ highlight.style.display = 'none';
+ }
+});
+
+canvas.addEventListener('mouseenter', (evt) => {
+ highlight.style.display = 'block';
+});
+
+canvas.addEventListener('mouseleave', (evt) => {
+ highlight.style.display = 'none';
+});
+
+canvas.addEventListener('click', (evt) => {
+ var x1, y1, x, y;
+ [x1, y1] = getXY(evt);
+ [x, y] = localMax(x1, y1);
+ var color = getColor(x, y);
+ var hex = rgbToHex(color);
+ if (fgtoggle) {
+ fg.style.backgroundColor = hex;
+ fgrgb.innerText = hex;
+ fgcolor = color;
+ bg.classList.add('current');
+ fg.classList.remove('current');
+ } else {
+ bg.style.backgroundColor = hex;
+ bgrgb.innerText = hex;
+ bgcolor = color;
+ fg.classList.add('current');
+ bg.classList.remove('current');
+ }
+ fgtoggle = !fgtoggle;
+ if (fgcolor && bgcolor) {
+ var contrast = getContrast(fgcolor, bgcolor);
+ ratio.innerText = contrast.toFixed(2);
+ details.innerHTML = 'Foreground: ' + fgrgb.innerText + '\n' +
+ 'Background: ' + bgrgb.innerText + '\n' +
+ 'Ratio: ' + ratio.innerText;
+ details.select();
+ }
+});
+
+function updateZoom() {
+ highlight.style.display = 'none';
+ var prevScrollLeft = scrollpanel.scrollLeft;
+ var prevScrollTop = scrollpanel.scrollTop;
+ var panelBounds = scrollpanel.getBoundingClientRect();
+
+ localStorage.setItem('scale', scale);
+ zoomout.disabled = (scale == 1);
+ zoomin.disabled = (scale >= maxScale);
+ if (srcImage)
+ repaint();
+
+ console.log('prev: ' + prevScrollLeft + ', ' + prevScrollTop);
+ console.log('factor: ' + (scale / prevScale));
+ var newLeft = prevScrollLeft * (scale / prevScale);
+ var newTop = prevScrollTop * (scale / prevScale);
+ console.log('newLeft: ' + newLeft);
+ console.log('newTop: ' + newTop);
+ if (scale > prevScale) {
+ newLeft += panelBounds.width / 2;
+ newTop += panelBounds.height / 2;
+ console.log('c newLeft: ' + newLeft);
+ console.log('c newTop: ' + newTop);
+ } else if (scale < prevScale) {
+ newLeft -= panelBounds.width / 4;
+ newTop -= panelBounds.height / 4;
+ console.log('c newLeft: ' + newLeft);
+ console.log('c newTop: ' + newTop);
+ }
+ scrollpanel.scrollLeft = newLeft;
+ scrollpanel.scrollTop = newTop;
+ prevScale = scale;
+}
+
+var scalevalue = localStorage.getItem('scale');
+scale = parseInt(scalevalue, 10);
+if (!scale || scale < 1 || scale > maxScale)
+ scale = 4;
+prevScale = scale;
+
+updateZoom();
+
+function onZoomIn() {
+ if (scale < maxScale)
+ scale *= 2;
+ updateZoom();
+}
+
+function onZoomOut() {
+ if (scale > 1)
+ scale /= 2;
+ updateZoom();
+}
+
+zoomin.addEventListener('click', () => {
+ onZoomIn();
+});
+
+zoomout.addEventListener('click', () => {
+ onZoomOut();
+});
+
+document.addEventListener('keydown', function(e) {
+ if (e.key == '+' || e.key == '=') {
+ onZoomIn();
+ }
+ if (e.key == '-') {
+ onZoomOut();
+ }
+
+ console.log(e.key);
+});
diff --git a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_as.xtb b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_as.xtb
index 5285dcc23f5..75516aee16e 100644
--- a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_as.xtb
+++ b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_as.xtb
@@ -19,7 +19,7 @@
<translation id="2648340354586434750">শব্দ অনুসৰি আঁতৰাবলৈ &lt;span class=’key’&gt;Option&lt;/span&gt; ধৰি থাকক।</translation>
<translation id="2795227192542594043">এই এক্সটেনশ্বনটোৱে আপোনাক ৱেব পৃষ্ঠাত এটা স্থানান্তৰযোগ্য কাৰ্ছৰ প্ৰদান কৰে যি আপোনাক কীব’ৰ্ডৰ দ্বাৰা পাঠ বাছনি কৰাৰ সুবিধা প্ৰদান কৰে।</translation>
<translation id="2808027189040546825">১ম প্ৰদক্ষেপ: আটাইতকৈ বেছি ধূসৰ তৰাযুক্ত শাৰীটো বাছনি কৰক:</translation>
-<translation id="2965611304828530558">&lt;p&gt;আপুনি যেতিয়া কোনো লিংক বা নিয়ন্ত্ৰণ গৈ পায় তেতিয়া তাত স্বয়ংক্ৰিয়ভাৱে ফ’কাছ কৰা হয়। কোনো লিংক বা বুটামত ক্লিক কৰিবলৈ &lt;span class=’key’&gt;Enter&lt;/span&gt; টিপক। &lt;/p&gt; &lt;p&gt; যেতিয়া কোনো ফ’কাছ কৰি ৰখা নিয়ন্ত্ৰণে (যেনে পাঠ বাকচ বা সূচীৰ বাকচ) কাঁড় কী কেপচাৰ কৰি থাকে তেতিয়া , কাৰেট ব্ৰাউজিং অব্যাহত ৰাখিবলৈ বাওঁ বা সোঁ কাঁড়ৰ পিছত &lt;span class=’key’&gt;Esc&lt;/span&gt;টিপক। &lt;/p&gt; &lt;p&gt; ইয়াৰ পৰিৱৰ্তে পৰৱৰ্তী ফ’কাছ কৰিবপৰা নিয়ন্ত্ৰণলৈ যাবলৈ &lt;span class=’key’&gt;Tab&lt;/span&gt; টিপক। &lt;/p&gt;</translation>
+<translation id="2965611304828530558">&lt;p&gt;আপুনি যেতিয়া কোনো লিংক বা নিয়ন্ত্ৰণ গৈ পায় তেতিয়া তাত স্বয়ংক্ৰিয়ভাৱে ফ’কাছ কৰা হয়। কোনো লিংক বা বুটামত ক্লিক কৰিবলৈ &lt;span class=’key’&gt;Enter&lt;/span&gt; টিপক। &lt;/p&gt; &lt;p&gt; যেতিয়া কোনো ফ’কাছ কৰি ৰখা নিয়ন্ত্ৰণে (যেনে পাঠ বাকচ বা সূচীৰ বাকচ) কাঁড় কী কেপচাৰ কৰি থাকে তেতিয়া , কাৰেট ব্ৰাউজিং অব্যাহত ৰাখিবলৈ বাওঁ বা সোঁ কাঁড়ৰ পাছত &lt;span class=’key’&gt;Esc&lt;/span&gt;টিপক। &lt;/p&gt; &lt;p&gt; ইয়াৰ পৰিৱৰ্তে পৰৱৰ্তী ফ’কাছ কৰিবপৰা নিয়ন্ত্ৰণলৈ যাবলৈ &lt;span class=’key’&gt;Tab&lt;/span&gt; টিপক। &lt;/p&gt;</translation>
<translation id="3252573918265662711">ছেট আপ</translation>
<translation id="3410969471888629217">ছাইট কাষ্টমাইজেশ্বনৰ সুবিধাটো পাহৰি যাওক</translation>
<translation id="3435896845095436175">সক্ষম কৰক</translation>
diff --git a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_te.xtb b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_te.xtb
index 63539df4ebb..e603638b369 100644
--- a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_te.xtb
+++ b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_te.xtb
@@ -13,7 +13,7 @@
<translation id="1996252509865389616">ప్రారంభించాలా?</translation>
<translation id="2079545284768500474">చర్య రద్దు</translation>
<translation id="2179565792157161713">సుదీర్ఘ వివరణను కొత్త ట్యాబ్‌లో తెరువు</translation>
-<translation id="2223143012868735942">రంగు గ్రాహ్యతను మెరుగుపరచడానికి వెబ్‌పేజీలకు వర్తింపజేసే అనుకూలీకరించగల రంగు ఫిల్టర్.</translation>
+<translation id="2223143012868735942">రంగు గ్రాహ్యతను మెరుగుపరచడానికి వెబ్‌పేజీలకు వర్తింపజేసే అనుకూలంగా మార్చగల రంగు ఫిల్టర్.</translation>
<translation id="2394933097471027016">ఇప్పుడే దీన్ని ప్రయత్నించండి - కేరెట్ బ్రౌజింగ్ ఈ పేజీలో ఎల్లప్పుడూ ప్రారంభించబడి ఉంటుంది!</translation>
<translation id="2471847333270902538"><ph name="SITE" /> కోసం రంగు స్కీమ్:</translation>
<translation id="2648340354586434750">పదాల వారీగా తరలించడానికి &lt;span class='key'&gt;Option&lt;/span&gt;ని నొక్కి పట్టుకోండి.</translation>
diff --git a/chromium/ui/accessibility/mojom/BUILD.gn b/chromium/ui/accessibility/mojom/BUILD.gn
index 3302ef749a9..af01cc903fb 100644
--- a/chromium/ui/accessibility/mojom/BUILD.gn
+++ b/chromium/ui/accessibility/mojom/BUILD.gn
@@ -5,6 +5,7 @@
import("//mojo/public/tools/bindings/mojom.gni")
mojom("mojom") {
+ generate_java = true
sources = [
"ax_action_data.mojom",
"ax_event.mojom",
@@ -26,7 +27,27 @@ mojom("mojom") {
"//url/mojom:url_mojom_gurl",
]
- cpp_typemaps = [
+ common_typemaps = [
+ {
+ types = [
+ {
+ mojom = "ax.mojom.AXRelativeBounds"
+ cpp = "::ui::AXRelativeBounds"
+ },
+ ]
+ traits_headers = [ "ax_relative_bounds_mojom_traits.h" ]
+ traits_public_deps = [
+ ":mojom_traits",
+ "//ui/gfx",
+ "//ui/gfx/geometry/mojom",
+ "//ui/gfx/geometry/mojom:mojom_traits",
+ "//ui/gfx/mojom",
+ ]
+ },
+ ]
+
+ cpp_typemaps = common_typemaps
+ cpp_typemaps += [
{
types = [
{
@@ -78,12 +99,10 @@ mojom("mojom") {
cpp = "::ui::AXRelativeBounds"
},
]
- traits_sources = [ "ax_relative_bounds_mojom_traits.cc" ]
traits_headers = [ "ax_relative_bounds_mojom_traits.h" ]
traits_public_deps = [
- "//ui/gfx",
+ "//ui/accessibility:ax_base",
"//ui/gfx/geometry/mojom",
- "//ui/gfx/geometry/mojom:mojom_traits",
"//ui/gfx/mojom",
]
},
@@ -121,7 +140,10 @@ mojom("mojom") {
traits_public_deps = [ "//ui/accessibility:ax_base" ]
},
]
+
+ blink_cpp_typemaps = common_typemaps
}
+
mojom("ax_assistant_mojom") {
sources = [ "ax_assistant_structure.mojom" ]
@@ -160,3 +182,17 @@ mojom("ax_assistant_mojom") {
"//url/mojom:url_mojom_gurl",
]
}
+
+source_set("mojom_traits") {
+ sources = [
+ "ax_relative_bounds_mojom_traits.cc",
+ "ax_relative_bounds_mojom_traits.h",
+ ]
+ public_deps = [
+ "//ui/accessibility:ax_base",
+ "//ui/accessibility/mojom:mojom_shared_cpp_sources",
+ "//ui/gfx",
+ "//ui/gfx/geometry/mojom:mojom_traits",
+ "//ui/gfx/mojom:mojom",
+ ]
+}
diff --git a/chromium/ui/accessibility/platform/BUILD.gn b/chromium/ui/accessibility/platform/BUILD.gn
index 052fb4b18db..f602ee43c03 100644
--- a/chromium/ui/accessibility/platform/BUILD.gn
+++ b/chromium/ui/accessibility/platform/BUILD.gn
@@ -87,6 +87,7 @@ source_set("platform") {
public_deps = [
"//ui/accessibility:ax_base",
+ "//ui/base:buildflags",
"//ui/display",
]
@@ -180,6 +181,8 @@ source_set("platform") {
"ax_utils_mac.mm",
"inspect/ax_call_statement_invoker_mac.h",
"inspect/ax_call_statement_invoker_mac.mm",
+ "inspect/ax_element_wrapper_mac.h",
+ "inspect/ax_element_wrapper_mac.mm",
"inspect/ax_event_recorder_mac.h",
"inspect/ax_event_recorder_mac.mm",
"inspect/ax_inspect_utils_mac.h",
diff --git a/chromium/ui/accessibility/platform/ax_fragment_root_win.cc b/chromium/ui/accessibility/platform/ax_fragment_root_win.cc
index 7cae2b153b7..34f8ee47116 100644
--- a/chromium/ui/accessibility/platform/ax_fragment_root_win.cc
+++ b/chromium/ui/accessibility/platform/ax_fragment_root_win.cc
@@ -4,8 +4,7 @@
#include "ui/accessibility/platform/ax_fragment_root_win.h"
-#include <unordered_map>
-
+#include "base/containers/flat_map.h"
#include "base/no_destructor.h"
#include "base/strings/string_number_conversions.h"
#include "ui/accessibility/platform/ax_fragment_root_delegate_win.h"
@@ -252,7 +251,7 @@ class AXFragmentRootMapWin {
}
private:
- std::unordered_map<gfx::AcceleratedWidget, AXFragmentRootWin*> map_;
+ base::flat_map<gfx::AcceleratedWidget, AXFragmentRootWin*> map_;
};
AXFragmentRootWin::AXFragmentRootWin(gfx::AcceleratedWidget widget,
diff --git a/chromium/ui/accessibility/platform/ax_platform_atk_hyperlink.cc b/chromium/ui/accessibility/platform/ax_platform_atk_hyperlink.cc
index 889f7496405..1635f46a8b9 100644
--- a/chromium/ui/accessibility/platform/ax_platform_atk_hyperlink.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_atk_hyperlink.cc
@@ -7,6 +7,7 @@
#include <string>
#include <utility>
+#include "ui/accessibility/ax_enum_localization_util.h"
#include "ui/accessibility/ax_enum_util.h"
#include "ui/accessibility/platform/ax_platform_node_auralinux.h"
#include "ui/accessibility/platform/ax_platform_node_delegate.h"
@@ -115,120 +116,6 @@ static void AXPlatformAtkHyperlinkClassInit(AtkHyperlinkClass* klass) {
klass->get_end_index = AXPlatformAtkHyperlinkGetEndIndex;
}
-//
-// AtkAction interface.
-//
-
-static AXPlatformNodeAuraLinux* ToAXPlatformNodeAuraLinuxFromHyperlinkAction(
- AtkAction* atk_action) {
- if (!IS_AX_PLATFORM_ATK_HYPERLINK(atk_action))
- return nullptr;
-
- return ToAXPlatformNodeAuraLinux(AX_PLATFORM_ATK_HYPERLINK(atk_action));
-}
-
-static gboolean ax_platform_atk_hyperlink_do_action(AtkAction* action,
- gint index) {
- g_return_val_if_fail(ATK_IS_ACTION(action), FALSE);
- g_return_val_if_fail(!index, FALSE);
-
- AXPlatformNodeAuraLinux* obj =
- ToAXPlatformNodeAuraLinuxFromHyperlinkAction(action);
- if (!obj)
- return FALSE;
-
- obj->DoDefaultAction();
-
- return TRUE;
-}
-
-static gint ax_platform_atk_hyperlink_get_n_actions(AtkAction* action) {
- g_return_val_if_fail(ATK_IS_ACTION(action), FALSE);
-
- AXPlatformNodeAuraLinux* obj =
- ToAXPlatformNodeAuraLinuxFromHyperlinkAction(action);
- if (!obj)
- return 0;
-
- return 1;
-}
-
-static const gchar* ax_platform_atk_hyperlink_get_description(AtkAction* action,
- gint index) {
- g_return_val_if_fail(ATK_IS_ACTION(action), FALSE);
- g_return_val_if_fail(!index, FALSE);
-
- AXPlatformNodeAuraLinux* obj =
- ToAXPlatformNodeAuraLinuxFromHyperlinkAction(action);
- if (!obj)
- return nullptr;
-
- // Not implemented
- return nullptr;
-}
-
-static const gchar* ax_platform_atk_hyperlink_get_keybinding(AtkAction* action,
- gint index) {
- g_return_val_if_fail(ATK_IS_ACTION(action), FALSE);
- g_return_val_if_fail(!index, FALSE);
-
- AXPlatformNodeAuraLinux* obj =
- ToAXPlatformNodeAuraLinuxFromHyperlinkAction(action);
- if (!obj)
- return nullptr;
-
- return obj->GetStringAttribute(ax::mojom::StringAttribute::kAccessKey)
- .c_str();
-}
-
-static const gchar* ax_platform_atk_hyperlink_get_name(AtkAction* atk_action,
- gint index) {
- g_return_val_if_fail(ATK_IS_ACTION(atk_action), FALSE);
- g_return_val_if_fail(!index, FALSE);
-
- AXPlatformNodeAuraLinux* obj =
- ToAXPlatformNodeAuraLinuxFromHyperlinkAction(atk_action);
- if (!obj)
- return nullptr;
-
- int action;
- if (!obj->GetIntAttribute(ax::mojom::IntAttribute::kDefaultActionVerb,
- &action))
- return nullptr;
- std::string action_verb =
- ui::ToString(static_cast<ax::mojom::DefaultActionVerb>(action));
- ATK_AURALINUX_RETURN_STRING(action_verb);
-}
-
-static const gchar* ax_platform_atk_hyperlink_get_localized_name(
- AtkAction* atk_action,
- gint index) {
- g_return_val_if_fail(ATK_IS_ACTION(atk_action), FALSE);
- g_return_val_if_fail(!index, FALSE);
-
- AXPlatformNodeAuraLinux* obj =
- ToAXPlatformNodeAuraLinuxFromHyperlinkAction(atk_action);
- if (!obj)
- return nullptr;
-
- int action;
- if (!obj->GetIntAttribute(ax::mojom::IntAttribute::kDefaultActionVerb,
- &action))
- return nullptr;
- std::string action_verb =
- ui::ToLocalizedString(static_cast<ax::mojom::DefaultActionVerb>(action));
- ATK_AURALINUX_RETURN_STRING(action_verb);
-}
-
-static void atk_action_interface_init(AtkActionIface* iface) {
- iface->do_action = ax_platform_atk_hyperlink_do_action;
- iface->get_n_actions = ax_platform_atk_hyperlink_get_n_actions;
- iface->get_description = ax_platform_atk_hyperlink_get_description;
- iface->get_keybinding = ax_platform_atk_hyperlink_get_keybinding;
- iface->get_name = ax_platform_atk_hyperlink_get_name;
- iface->get_localized_name = ax_platform_atk_hyperlink_get_localized_name;
-}
-
void ax_platform_atk_hyperlink_set_object(
AXPlatformAtkHyperlink* atk_hyperlink,
AXPlatformNodeAuraLinux* platform_node) {
@@ -263,13 +150,8 @@ GType ax_platform_atk_hyperlink_get_type() {
nullptr /* value table */
};
- static const GInterfaceInfo actionInfo = {
- (GInterfaceInitFunc)(GInterfaceInitFunc)atk_action_interface_init,
- (GInterfaceFinalizeFunc)0, 0};
-
GType type = g_type_register_static(
ATK_TYPE_HYPERLINK, "AXPlatformAtkHyperlink", &tinfo, GTypeFlags(0));
- g_type_add_interface_static(type, ATK_TYPE_ACTION, &actionInfo);
g_once_init_leave(&type_volatile, type);
}
diff --git a/chromium/ui/accessibility/platform/ax_platform_node.cc b/chromium/ui/accessibility/platform/ax_platform_node.cc
index 1c72c838ae2..a0c15c29d8b 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node.cc
@@ -94,7 +94,6 @@ void AXPlatformNode::RemoveAXModeObserver(AXModeObserver* observer) {
// static
void AXPlatformNode::NotifyAddAXModeFlags(AXMode mode_flags) {
- // Note: this is only called on Windows, and in tests.
AXMode new_ax_mode(ax_mode_);
new_ax_mode |= mode_flags;
@@ -108,7 +107,6 @@ void AXPlatformNode::NotifyAddAXModeFlags(AXMode mode_flags) {
// static
void AXPlatformNode::SetAXMode(AXMode new_mode) {
- // Note: this is only called on Windows.
ax_mode_ = new_mode;
}
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_auralinux.cc b/chromium/ui/accessibility/platform/ax_platform_node_auralinux.cc
index 5254242e25e..9650287fb80 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_auralinux.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_auralinux.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "ui/accessibility/platform/ax_platform_node_auralinux.h"
+#include "base/memory/raw_ptr.h"
#include <dlfcn.h>
#include <stdint.h>
@@ -125,7 +126,7 @@ typedef struct _AXPlatformNodeAuraLinuxClass AXPlatformNodeAuraLinuxClass;
struct _AXPlatformNodeAuraLinuxObject {
AtkObject parent;
- AXPlatformNodeAuraLinux* m_object;
+ raw_ptr<AXPlatformNodeAuraLinux> m_object;
};
struct _AXPlatformNodeAuraLinuxClass {
@@ -330,8 +331,10 @@ const char* BuildDescriptionFromHeaders(AXPlatformNodeDelegate* delegate,
std::vector<std::string> names;
for (const auto& node_id : ids) {
if (AXPlatformNode* header = delegate->GetFromNodeID(node_id)) {
- if (AtkObject* atk_header = header->GetNativeViewAccessible())
- names.push_back(atk_object_get_name(atk_header));
+ if (AtkObject* atk_header = header->GetNativeViewAccessible()) {
+ if (const gchar* name = atk_object_get_name(atk_header))
+ names.push_back(name);
+ }
}
}
@@ -606,13 +609,10 @@ gboolean DoAction(AtkAction* atk_action, gint index) {
if (!obj)
return FALSE;
- const std::vector<ax::mojom::Action> actions = obj->GetSupportedActions();
+ const std::vector<ax::mojom::Action> actions =
+ obj->GetDelegate()->GetSupportedActions();
g_return_val_if_fail(index < static_cast<gint>(actions.size()), FALSE);
- if (index == 0 && obj->HasDefaultActionVerb()) {
- // If there is a default action, it will always be at index 0.
- return obj->DoDefaultAction();
- }
AXActionData data;
data.action = actions[index];
return obj->GetDelegate()->AccessibilityPerformAction(data);
@@ -627,7 +627,7 @@ gint GetNActions(AtkAction* atk_action) {
if (!obj)
return 0;
- return static_cast<gint>(obj->GetSupportedActions().size());
+ return static_cast<gint>(obj->GetDelegate()->GetSupportedActions().size());
}
const gchar* GetDescription(AtkAction*, gint) {
@@ -645,10 +645,11 @@ const gchar* GetName(AtkAction* atk_action, gint index) {
if (!obj)
return nullptr;
- const std::vector<ax::mojom::Action> actions = obj->GetSupportedActions();
+ const std::vector<ax::mojom::Action> actions =
+ obj->GetDelegate()->GetSupportedActions();
g_return_val_if_fail(index < static_cast<gint>(actions.size()), nullptr);
- if (index == 0 && obj->HasDefaultActionVerb()) {
+ if (index == 0 && obj->GetDelegate()->HasDefaultActionVerb()) {
// If there is a default action, it will always be at index 0.
return obj->GetDefaultActionName();
}
@@ -664,10 +665,11 @@ const gchar* GetKeybinding(AtkAction* atk_action, gint index) {
if (!obj)
return nullptr;
- const std::vector<ax::mojom::Action> actions = obj->GetSupportedActions();
+ const std::vector<ax::mojom::Action> actions =
+ obj->GetDelegate()->GetSupportedActions();
g_return_val_if_fail(index < static_cast<gint>(actions.size()), nullptr);
- if (index == 0 && obj->HasDefaultActionVerb()) {
+ if (index == 0 && obj->GetDelegate()->HasDefaultActionVerb()) {
// If there is a default action, it will always be at index 0. Only the
// default action has a key binding.
return obj->GetStringAttribute(ax::mojom::StringAttribute::kAccessKey)
@@ -1013,10 +1015,11 @@ gunichar GetCharacterAtOffset(AtkText* atk_text, int offset) {
return 0;
std::u16string text = obj->GetHypertext();
- int32_t text_length = text.length();
+ size_t text_length = text.length();
offset = obj->UnicodeToUTF16OffsetInText(offset);
- int32_t limited_offset = base::clamp(offset, 0, text_length);
+ offset = std::max(offset, 0);
+ size_t limited_offset = std::min(static_cast<size_t>(offset), text_length);
base_icu::UChar32 code_point;
base::ReadUnicodeCharacter(text.c_str(), text_length + 1, &limited_offset,
@@ -3892,14 +3895,7 @@ void AXPlatformNodeAuraLinux::EmitCaretChangedSignal() {
return;
}
-#if DCHECK_IS_ON()
- AXTree::Selection unignored_selection =
- GetDelegate()->GetUnignoredSelection();
- DCHECK(HasCaret(&unignored_selection));
-#endif
-
std::pair<int, int> selection = GetSelectionOffsetsForAtk();
-
AtkObject* atk_object = GetOrCreateAtkObject();
if (!atk_object)
return;
@@ -4343,8 +4339,8 @@ AXPlatformNodeAuraLinux::GetHypertextAdjustments() {
text_unicode_adjustments_.emplace();
std::u16string text = GetHypertext();
- int32_t text_length = text.size();
- for (int32_t i = 0; i < text_length; i++) {
+ size_t text_length = text.size();
+ for (size_t i = 0; i < text_length; i++) {
base_icu::UChar32 code_point;
size_t original_i = i;
base::ReadUnicodeCharacter(text.c_str(), text_length + 1, &i, &code_point);
@@ -4618,12 +4614,6 @@ bool AXPlatformNodeAuraLinux::
return false;
}
-bool AXPlatformNodeAuraLinux::DoDefaultAction() {
- AXActionData action_data;
- action_data.action = ax::mojom::Action::kDoDefault;
- return delegate_->AccessibilityPerformAction(action_data);
-}
-
const gchar* AXPlatformNodeAuraLinux::GetDefaultActionName() {
int action;
if (!GetIntAttribute(ax::mojom::IntAttribute::kDefaultActionVerb, &action))
@@ -4732,9 +4722,7 @@ bool AXPlatformNodeAuraLinux::IsNameExposed() {
}
int AXPlatformNodeAuraLinux::GetCaretOffset() {
- AXTree::Selection unignored_selection =
- GetDelegate()->GetUnignoredSelection();
- if (!HasCaret(&unignored_selection)) {
+ if (!HasVisibleCaretOrSelection()) {
absl::optional<FindInPageResultInfo> result =
GetSelectionOffsetsFromFindInPage();
AtkObject* atk_object = GetOrCreateAtkObject();
@@ -5221,28 +5209,4 @@ std::pair<int, int> AXPlatformNodeAuraLinux::GetSelectionOffsetsForAtk() {
return selection;
}
-bool AXPlatformNodeAuraLinux::HasDefaultActionVerb() const {
- return GetData().GetDefaultActionVerb() !=
- ax::mojom::DefaultActionVerb::kNone;
-}
-
-std::vector<ax::mojom::Action> AXPlatformNodeAuraLinux::GetSupportedActions()
- const {
- static const base::NoDestructor<std::vector<ax::mojom::Action>>
- kActionsThatCanBeExposedViaAtkAction{
- {ax::mojom::Action::kDecrement, ax::mojom::Action::kIncrement}};
- std::vector<ax::mojom::Action> supported_actions;
-
- // The default action, if it exists, must be listed at index 0.
- if (HasDefaultActionVerb())
- supported_actions.push_back(ax::mojom::Action::kDoDefault);
-
- for (const auto& item : *kActionsThatCanBeExposedViaAtkAction) {
- if (HasAction(item))
- supported_actions.push_back(item);
- }
-
- return supported_actions;
-}
-
} // namespace ui
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_auralinux.h b/chromium/ui/accessibility/platform/ax_platform_node_auralinux.h
index c71f1359aea..1635ac83ae5 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_auralinux.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node_auralinux.h
@@ -154,7 +154,6 @@ class AX_EXPORT AXPlatformNodeAuraLinux : public AXPlatformNodeBase {
bool GrabFocusOrSetSequentialFocusNavigationStartingPointAtOffset(int offset);
bool GrabFocusOrSetSequentialFocusNavigationStartingPoint();
bool SetSequentialFocusNavigationStartingPoint();
- bool DoDefaultAction();
const gchar* GetDefaultActionName();
AtkAttributeSet* GetAtkAttributes();
@@ -293,9 +292,6 @@ class AX_EXPORT AXPlatformNodeAuraLinux : public AXPlatformNodeBase {
// nullopt.
absl::optional<std::pair<int, int>> GetEmbeddedObjectIndices();
- std::vector<ax::mojom::Action> GetSupportedActions() const;
- bool HasDefaultActionVerb() const;
-
std::string accessible_name_;
protected:
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc b/chromium/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc
index e2c5a8e317e..bd381d55d09 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc
@@ -7,6 +7,7 @@
#include <utility>
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/platform/atk_util_auralinux.h"
@@ -1000,6 +1001,7 @@ TEST_F(AXPlatformNodeAuraLinuxTest, TestAtkActionGetNActions) {
root.SetDefaultActionVerb(ax::mojom::DefaultActionVerb::kClick);
root.AddAction(ax::mojom::Action::kDecrement);
root.AddAction(ax::mojom::Action::kIncrement);
+ // Additionally, any object will have a context menu action, that makes it 4
Init(root);
AtkObject* root_obj(GetRootAtkObject());
@@ -1009,7 +1011,7 @@ TEST_F(AXPlatformNodeAuraLinuxTest, TestAtkActionGetNActions) {
gint number_of_actions = atk_action_get_n_actions(ATK_ACTION(root_obj));
- EXPECT_EQ(3, number_of_actions);
+ EXPECT_EQ(4, number_of_actions);
g_object_unref(root_obj);
}
@@ -1027,7 +1029,9 @@ TEST_F(AXPlatformNodeAuraLinuxTest, TestAtkActionGetNActionsNoActions) {
gint number_of_actions = atk_action_get_n_actions(ATK_ACTION(root_obj));
- EXPECT_EQ(0, number_of_actions);
+ // In absence of any other actions, we would expose the default and the
+ // context menu actions.
+ EXPECT_EQ(2, number_of_actions);
g_object_unref(root_obj);
}
@@ -1047,14 +1051,16 @@ TEST_F(AXPlatformNodeAuraLinuxTest, TestAtkActionGetName) {
g_object_ref(root_obj);
const gchar* action_name = atk_action_get_name(ATK_ACTION(root_obj), 0);
- // The index 0 is reserved for the default action. The rest of actions are
- // presented in the order they were added.
+ // The index 0 is reserved for the default action, and the index 1 to the
+ // context menu action. The rest of actions are presented in the order they
+ // were added.
EXPECT_STREQ("click", action_name);
action_name = atk_action_get_name(ATK_ACTION(root_obj), 1);
- EXPECT_STREQ("decrement", action_name);
+ EXPECT_STREQ("showContextMenu", action_name);
action_name = atk_action_get_name(ATK_ACTION(root_obj), 2);
+ EXPECT_STREQ("decrement", action_name);
+ action_name = atk_action_get_name(ATK_ACTION(root_obj), 3);
EXPECT_STREQ("increment", action_name);
- atk_action_do_action(ATK_ACTION(root_obj), 2);
g_object_unref(root_obj);
}
@@ -1078,10 +1084,11 @@ TEST_F(AXPlatformNodeAuraLinuxTest, TestAtkActionDoAction) {
EXPECT_EQ(root_node, TestAXNodeWrapper::GetNodeFromLastDefaultAction());
EXPECT_TRUE(atk_action_do_action(ATK_ACTION(root_obj), 1));
EXPECT_TRUE(atk_action_do_action(ATK_ACTION(root_obj), 2));
+ EXPECT_TRUE(atk_action_do_action(ATK_ACTION(root_obj), 3));
// Test that querying actions out of bounds doesn't crash
EXPECT_FALSE(atk_action_do_action(ATK_ACTION(root_obj), -1));
- EXPECT_FALSE(atk_action_do_action(ATK_ACTION(root_obj), 3));
+ EXPECT_FALSE(atk_action_do_action(ATK_ACTION(root_obj), 4));
g_object_unref(root_obj);
}
@@ -1258,6 +1265,38 @@ TEST_F(AXPlatformNodeAuraLinuxTest, TestAtkHyperlink) {
g_object_unref(root_obj);
}
+TEST_F(AXPlatformNodeAuraLinuxTest, TestAtkHyperlinkActions) {
+ AXNodeData root;
+ root.id = 1;
+ root.role = ax::mojom::Role::kLink;
+ root.AddStringAttribute(ax::mojom::StringAttribute::kUrl, "http://foo.com");
+ root.SetDefaultActionVerb(ax::mojom::DefaultActionVerb::kClick);
+ Init(root);
+
+ AtkObject* root_obj(GetRootAtkObject());
+ ASSERT_TRUE(ATK_IS_OBJECT(root_obj));
+ ASSERT_TRUE(ATK_IS_HYPERLINK_IMPL(root_obj));
+ ASSERT_TRUE(ATK_IS_ACTION(root_obj));
+ g_object_ref(root_obj);
+ auto* root_node = GetRootAsAXNode();
+
+ gint number_of_actions = atk_action_get_n_actions(ATK_ACTION(root_obj));
+ EXPECT_EQ(2, number_of_actions);
+
+ // The index 0 is reserved for the default action, and the index 1 to the
+ // context menu action. The rest of actions are presented in the order they
+ // were added.
+ const gchar* action_name = atk_action_get_name(ATK_ACTION(root_obj), 0);
+ EXPECT_STREQ("click", action_name);
+ action_name = atk_action_get_name(ATK_ACTION(root_obj), 1);
+ EXPECT_STREQ("showContextMenu", action_name);
+
+ EXPECT_TRUE(atk_action_do_action(ATK_ACTION(root_obj), 0));
+ EXPECT_EQ(root_node, TestAXNodeWrapper::GetNodeFromLastDefaultAction());
+
+ g_object_unref(root_obj);
+}
+
//
// AtkText interface
//
@@ -1738,7 +1777,7 @@ class ActivationTester {
g_signal_handler_disconnect(target_, deactivate_id_);
}
- AtkObject* target_;
+ raw_ptr<AtkObject> target_;
bool saw_activate_ = false;
bool saw_deactivate_ = false;
gulong activate_id_ = 0;
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_base.cc b/chromium/ui/accessibility/platform/ax_platform_node_base.cc
index 7ec9cd89979..0bf97a38d7c 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_base.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_base.cc
@@ -10,9 +10,10 @@
#include <set>
#include <sstream>
#include <string>
-#include <unordered_map>
+#include "base/containers/flat_map.h"
#include "base/no_destructor.h"
+#include "base/numerics/checked_math.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
@@ -65,7 +66,7 @@ bool FindDescendantRoleWithMaxDepth(const AXPlatformNodeBase* node,
const char16_t AXPlatformNodeBase::kEmbeddedCharacter = u'\xfffc';
// Map from each AXPlatformNode's unique id to its instance.
-using UniqueIdMap = std::unordered_map<int32_t, AXPlatformNode*>;
+using UniqueIdMap = base::flat_map<int32_t, AXPlatformNode*>;
base::LazyInstance<UniqueIdMap>::Leaky g_unique_id_map =
LAZY_INSTANCE_INITIALIZER;
@@ -193,6 +194,7 @@ std::string AXPlatformNodeBase::GetName() const {
name += extra_text;
}
+ DCHECK(base::IsStringUTF8AllowingNoncharacters(name)) << "Invalid UTF8";
return name;
}
return std::string();
@@ -824,10 +826,6 @@ bool AXPlatformNodeBase::IsPlatformDocument() const {
return delegate_ && delegate_->IsPlatformDocument();
}
-bool AXPlatformNodeBase::IsPlatformDocumentWithContent() const {
- return delegate_ && delegate_->IsPlatformDocumentWithContent();
-}
-
bool AXPlatformNodeBase::IsStructuredAnnotation() const {
// The node represents a structured annotation if it can trace back to a
// target node that is being annotated.
@@ -1115,27 +1113,8 @@ absl::optional<float> AXPlatformNodeBase::GetFontSizeInPoints() const {
return absl::nullopt;
}
-bool AXPlatformNodeBase::HasCaret(const AXTree::Selection* selection) {
- if (IsAtomicTextField() &&
- HasIntAttribute(ax::mojom::IntAttribute::kTextSelStart) &&
- HasIntAttribute(ax::mojom::IntAttribute::kTextSelEnd)) {
- return true;
- }
-
- // The caret is always at the focus of the selection.
- int32_t focus_id;
- if (selection)
- focus_id = selection->focus_object_id;
- else
- focus_id = delegate_->GetTreeData().sel_focus_object_id;
-
- AXPlatformNodeBase* focus_object =
- static_cast<AXPlatformNodeBase*>(delegate_->GetFromNodeID(focus_id));
-
- if (!focus_object)
- return false;
-
- return focus_object->IsDescendantOf(this);
+bool AXPlatformNodeBase::HasVisibleCaretOrSelection() const {
+ return delegate_ && delegate_->HasVisibleCaretOrSelection();
}
bool AXPlatformNodeBase::IsLeaf() const {
@@ -1153,7 +1132,7 @@ bool AXPlatformNodeBase::IsInvisibleOrIgnored() const {
if (HasState(ax::mojom::State::kFocusable))
return !IsFocused();
- return !const_cast<AXPlatformNodeBase*>(this)->HasCaret();
+ return !HasVisibleCaretOrSelection();
}
bool AXPlatformNodeBase::IsFocused() const {
@@ -1262,11 +1241,13 @@ void AXPlatformNodeBase::ComputeAttributes(PlatformAttributeList* attributes) {
case ax::mojom::DescriptionFrom::kPopupElement:
// The following types of markup are mapped to "tooltip":
// * The title attribute.
- // * A related popup=hint related via togglepopup/showpopup/hidepopup.
+ // * A related popup=hint related via popuptoggletarget /
+ // popupshowtarget / popuphidetarget.
// * A tooltip related via aria-describedby (see kRelatedElement above).
from = "tooltip";
break;
case ax::mojom::DescriptionFrom::kNone:
+ case ax::mojom::DescriptionFrom::kAttributeExplicitlyEmpty:
NOTREACHED();
}
DCHECK(!from.empty());
@@ -1777,6 +1758,31 @@ int32_t AXPlatformNodeBase::GetHypertextOffsetFromChild(
return GetHypertextOffsetFromHyperlinkIndex(hyperlink_index);
}
+int AXPlatformNodeBase::HypertextOffsetFromChildIndex(int child_index) const {
+ DCHECK_GE(child_index, 0);
+ DCHECK_LE(child_index, static_cast<int>(GetChildCount()));
+
+ // Use both a child index and an iterator to avoid an O(n^2) complexity which
+ // would be the case if we were to call GetChildAtIndex on each child.
+ int hypertext_offset = 0;
+ int endpoint_child_index = 0;
+ for (AXPlatformNodeChildIterator child_iter = AXPlatformNodeChildrenBegin();
+ child_iter != AXPlatformNodeChildrenEnd(); ++child_iter) {
+ if (endpoint_child_index >= child_index) {
+ break;
+ }
+
+ int child_text_len = 1;
+ if (child_iter->IsText())
+ child_text_len =
+ base::checked_cast<int>(child_iter->GetHypertext().size());
+
+ endpoint_child_index++;
+ hypertext_offset += child_text_len;
+ }
+ return hypertext_offset;
+}
+
int32_t AXPlatformNodeBase::GetHypertextOffsetFromDescendant(
AXPlatformNodeBase* descendant) {
auto* parent_object = static_cast<AXPlatformNodeBase*>(
@@ -1795,44 +1801,50 @@ int32_t AXPlatformNodeBase::GetHypertextOffsetFromDescendant(
int AXPlatformNodeBase::GetHypertextOffsetFromEndpoint(
AXPlatformNodeBase* endpoint_object,
int endpoint_offset) {
+ DCHECK_GE(endpoint_offset, 0);
+
// There are three cases:
- // 1. The selection endpoint is inside this object but not one of its
- // descendants, or is in an ancestor of this object. endpoint_offset should be
+ // 1. The selection endpoint is this object itself: endpoint_offset should be
// returned, possibly adjusted from a child offset to a hypertext offset.
- // 2. The selection endpoint is a descendant of this object. The offset of the
+ // 2. The selection endpoint is an ancestor of this object. If endpoint_offset
+ // points out after this object, then this object text length is returned,
+ // otherwise 0.
+ // 3. The selection endpoint is a descendant of this object. The offset of the
// character in this object's hypertext corresponding to the subtree in which
// the endpoint is located should be returned.
- // 3. The selection endpoint is in a completely different part of the tree.
+ // 4. The selection endpoint is in a completely different part of the tree.
// Either 0 or hypertext length should be returned depending on the direction
// that one needs to travel to find the endpoint.
//
// TODO(nektar): Replace all this logic with the use of AXNodePosition.
- // Case 1. Is the endpoint object equal to this object or an ancestor of this
- // object?
- //
- // IsDescendantOf includes the case when endpoint_object == this.
- if (IsDescendantOf(endpoint_object)) {
- if (endpoint_object->IsLeaf()) {
- DCHECK_EQ(endpoint_object, this) << "Text objects cannot have children.";
+ // Case 1. Is the endpoint object equal to this object
+ if (endpoint_object == this) {
+ if (endpoint_object->IsLeaf())
return endpoint_offset;
- } else {
- DCHECK_GE(endpoint_offset, 0);
- DCHECK_LE(static_cast<size_t>(endpoint_offset),
- endpoint_object->GetDelegate()->GetChildCount());
-
- // Adjust the |endpoint_offset| because the selection endpoint is a tree
- // position, i.e. it represents a child index and not a text offset.
- if (static_cast<size_t>(endpoint_offset) >=
- endpoint_object->GetChildCount()) {
- return static_cast<int>(endpoint_object->GetHypertext().size());
- } else {
- auto* child = static_cast<AXPlatformNodeBase*>(FromNativeViewAccessible(
- endpoint_object->ChildAtIndex(endpoint_offset)));
- DCHECK(child);
- return endpoint_object->GetHypertextOffsetFromChild(child);
- }
+ return HypertextOffsetFromChildIndex(endpoint_offset);
+ }
+
+ // Case 2. Is the endpoint an ancestor of this object.
+ if (IsDescendantOf(endpoint_object)) {
+ DCHECK_LE(endpoint_offset,
+ static_cast<int>(endpoint_object->GetChildCount()));
+
+ AXPlatformNodeBase* closest_ancestor = this;
+ while (closest_ancestor) {
+ AXPlatformNodeBase* parent = static_cast<AXPlatformNodeBase*>(
+ FromNativeViewAccessible(closest_ancestor->GetParent()));
+ if (parent == endpoint_object)
+ break;
+ closest_ancestor = parent;
}
+
+ // If the endpoint is after this node, then return the node's
+ // hypertext length, otherwise 0 as the endpoint points before the node.
+ if (endpoint_offset >
+ static_cast<int>(*closest_ancestor->GetIndexInParent()))
+ return static_cast<int>(GetHypertext().size());
+ return 0;
}
AXPlatformNodeBase* common_parent = this;
@@ -1895,14 +1907,15 @@ AXPlatformNodeBase::AXPosition AXPlatformNodeBase::HypertextOffsetToEndpoint(
DCHECK_GE(hypertext_offset, 0);
DCHECK_LT(hypertext_offset, static_cast<int>(GetHypertext().size()));
- int32_t current_hypertext_offset = hypertext_offset;
+ int current_hypertext_offset = hypertext_offset;
for (auto child_iter = AXPlatformNodeChildrenBegin();
child_iter != AXPlatformNodeChildrenEnd() &&
current_hypertext_offset >= 0;
++child_iter) {
int child_text_len = 1;
if (child_iter->IsText())
- child_text_len = child_iter->GetHypertext().size();
+ child_text_len =
+ base::checked_cast<int>(child_iter->GetHypertext().size());
if (current_hypertext_offset < child_text_len) {
int endpoint_offset = child_text_len - current_hypertext_offset;
@@ -1989,7 +2002,7 @@ void AXPlatformNodeBase::GetSelectionOffsetsFromTree(
// outside this object in their entirety.
// Selections that span more than one character are by definition inside
// this object, so checking them is not necessary.
- if (*selection_start == *selection_end && !HasCaret(selection)) {
+ if (*selection_start == *selection_end && !HasVisibleCaretOrSelection()) {
*selection_start = -1;
*selection_end = -1;
return;
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_base.h b/chromium/ui/accessibility/platform/ax_platform_node_base.h
index ef0715b28f4..9a78c92ee3c 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_base.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node_base.h
@@ -267,13 +267,8 @@ class AX_EXPORT AXPlatformNodeBase : public AXPlatformNode {
// Returns the font size converted to points, if available.
absl::optional<float> GetFontSizeInPoints() const;
- // Returns true if either a descendant has selection (sel_focus_object_id) or
- // if this node is a simple text element and has text selection attributes.
- // Optionally accepts a selection, which can be useful if checking the
- // unignored selection is required. If not provided, uses the selection from
- // the tree data, which is safe and fast but does not take ignored nodes into
- // account.
- bool HasCaret(const AXTree::Selection* selection = nullptr);
+ // See `AXNode::HasVisibleCaretOrSelection`.
+ bool HasVisibleCaretOrSelection() const;
// See AXPlatformNodeDelegate::IsChildOfLeaf().
bool IsChildOfLeaf() const;
@@ -425,10 +420,6 @@ class AX_EXPORT AXPlatformNodeBase : public AXPlatformNode {
// PDF.
bool IsPlatformDocument() const;
- // Returns true if this object is a platform document as described above and
- // also has at least some content.
- bool IsPlatformDocumentWithContent() const;
-
protected:
AXPlatformNodeBase();
@@ -547,6 +538,7 @@ class AX_EXPORT AXPlatformNodeBase : public AXPlatformNode {
int32_t GetHyperlinkIndexFromChild(AXPlatformNodeBase* child);
int32_t GetHypertextOffsetFromHyperlinkIndex(int32_t hyperlink_index);
int32_t GetHypertextOffsetFromChild(AXPlatformNodeBase* child);
+ int HypertextOffsetFromChildIndex(int child_index) const;
int32_t GetHypertextOffsetFromDescendant(AXPlatformNodeBase* descendant);
// If the selection endpoint is either equal to or an ancestor of this object,
@@ -592,6 +584,8 @@ class AX_EXPORT AXPlatformNodeBase : public AXPlatformNode {
friend AXPlatformNode* AXPlatformNode::Create(
AXPlatformNodeDelegate* delegate);
+
+ FRIEND_TEST_ALL_PREFIXES(AXPlatformNodeTest, HypertextOffsetFromEndpoint);
};
} // namespace ui
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_base_unittest.cc b/chromium/ui/accessibility/platform/ax_platform_node_base_unittest.cc
index 4072a27b660..d19651211ed 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_base_unittest.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_base_unittest.cc
@@ -7,22 +7,14 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/accessibility/platform/ax_platform_node_unittest.h"
#include "ui/accessibility/platform/test_ax_node_wrapper.h"
+#include "ui/accessibility/platform/test_ax_tree_update.h"
+
+using ax::mojom::Role;
+using ax::mojom::State;
namespace ui {
namespace {
-void MakeStaticText(AXNodeData* node, int id, const std::string& text) {
- node->id = id;
- node->role = ax::mojom::Role::kStaticText;
- node->SetName(text);
-}
-
-void MakeGroup(AXNodeData* node, int id, std::vector<int> child_ids) {
- node->id = id;
- node->role = ax::mojom::Role::kGroup;
- node->child_ids = child_ids;
-}
-
void SetIsInvisible(AXTree* tree, int id, bool invisible) {
AXTreeUpdate update;
update.nodes.resize(1);
@@ -45,33 +37,18 @@ void SetRole(AXTree* tree, int id, ax::mojom::Role role) {
} // namespace
TEST_F(AXPlatformNodeTest, GetHypertext) {
- AXTreeUpdate update;
-
// RootWebArea #1
// ++++StaticText "text1" #2
// ++++StaticText "text2" #3
// ++++StaticText "text3" #4
-
- update.root_id = 1;
- update.nodes.resize(4);
-
- update.nodes[0].id = 1;
- update.nodes[0].role = ax::mojom::Role::kRootWebArea;
- update.nodes[0].child_ids = {2, 3, 4};
-
- MakeStaticText(&update.nodes[1], 2, "text1");
- MakeStaticText(&update.nodes[2], 3, "text2");
- MakeStaticText(&update.nodes[3], 4, "text3");
-
- Init(update);
- AXTree& tree = *GetTree();
+ AXTree* tree = Init({Role::kRootWebArea, {{"text1"}, {"text2"}, {"text3"}}});
// Set an AXMode on the AXPlatformNode as some platforms (auralinux) use it to
// determine if it should enable accessibility.
testing::ScopedAxModeSetter ax_mode_setter(kAXModeComplete);
AXPlatformNodeBase* root = static_cast<AXPlatformNodeBase*>(
- TestAXNodeWrapper::GetOrCreate(&tree, tree.root())->ax_platform_node());
+ TestAXNodeWrapper::GetOrCreate(tree, tree->root())->ax_platform_node());
EXPECT_EQ(root->GetHypertext(), u"text1text2text3");
@@ -89,8 +66,6 @@ TEST_F(AXPlatformNodeTest, GetHypertext) {
}
TEST_F(AXPlatformNodeTest, GetHypertextIgnoredContainerSiblings) {
- AXTreeUpdate update;
-
// RootWebArea #1
// ++genericContainer IGNORED #2
// ++++StaticText "text1" #3
@@ -98,41 +73,18 @@ TEST_F(AXPlatformNodeTest, GetHypertextIgnoredContainerSiblings) {
// ++++StaticText "text2" #5
// ++genericContainer IGNORED #6
// ++++StaticText "text3" #7
+ AXTree* tree =
+ Init({Role::kRootWebArea,
+ {{Role::kGenericContainer, State::kIgnored, {{"text1"}}},
+ {Role::kGenericContainer, State::kIgnored, {{"text2"}}},
+ {Role::kGenericContainer, State::kIgnored, {{"text3"}}}}});
- update.root_id = 1;
- update.nodes.resize(7);
-
- update.nodes[0].id = 1;
- update.nodes[0].role = ax::mojom::Role::kRootWebArea;
- update.nodes[0].child_ids = {2, 4, 6};
-
- update.nodes[1].id = 2;
- update.nodes[1].child_ids = {3};
- update.nodes[1].role = ax::mojom::Role::kGenericContainer;
- update.nodes[1].AddState(ax::mojom::State::kIgnored);
- MakeStaticText(&update.nodes[2], 3, "text1");
-
- update.nodes[3].id = 4;
- update.nodes[3].child_ids = {5};
- update.nodes[3].role = ax::mojom::Role::kGenericContainer;
- update.nodes[3].AddState(ax::mojom::State::kIgnored);
- MakeStaticText(&update.nodes[4], 5, "text2");
-
- update.nodes[5].id = 6;
- update.nodes[5].child_ids = {7};
- update.nodes[5].role = ax::mojom::Role::kGenericContainer;
- update.nodes[5].AddState(ax::mojom::State::kIgnored);
- MakeStaticText(&update.nodes[6], 7, "text3");
-
- Init(update);
-
- AXTree& tree = *GetTree();
// Set an AXMode on the AXPlatformNode as some platforms (auralinux) use it to
// determine if it should enable accessibility.
ui::testing::ScopedAxModeSetter ax_mode_setter(kAXModeComplete);
AXPlatformNodeBase* root = static_cast<AXPlatformNodeBase*>(
- TestAXNodeWrapper::GetOrCreate(&tree, tree.root())->ax_platform_node());
+ TestAXNodeWrapper::GetOrCreate(tree, tree->root())->ax_platform_node());
EXPECT_EQ(root->GetHypertext(), u"text1text2text3");
@@ -153,25 +105,16 @@ TEST_F(AXPlatformNodeTest, GetHypertextIgnoredContainerSiblings) {
}
TEST_F(AXPlatformNodeTest, GetTextContentIgnoresInvisibleAndIgnored) {
- AXTreeUpdate update;
-
- update.root_id = 1;
- update.nodes.resize(6);
-
- MakeStaticText(&update.nodes[1], 2, "a");
- MakeStaticText(&update.nodes[2], 3, "b");
-
- MakeStaticText(&update.nodes[4], 5, "d");
- MakeStaticText(&update.nodes[5], 6, "e");
-
- MakeGroup(&update.nodes[3], 4, {5, 6});
- MakeGroup(&update.nodes[0], 1, {2, 3, 4});
-
- Init(update);
-
- AXTree& tree = *GetTree();
+ // kGroup
+ // ++kStaticText "a"
+ // ++kStaticText "b"
+ // ++kGroup
+ // ++++kStaticText "d"
+ // ++++kStaticText "e"
+ AXTree* tree =
+ Init({Role::kGroup, {{"a"}, {"b"}, {Role::kGroup, {{"d"}, {"e"}}}}});
auto* root = static_cast<AXPlatformNodeBase*>(
- TestAXNodeWrapper::GetOrCreate(&tree, tree.root())->ax_platform_node());
+ TestAXNodeWrapper::GetOrCreate(tree, tree->root())->ax_platform_node());
// Set an AXMode on the AXPlatformNode as some platforms (auralinux) use it to
// determine if it should enable accessibility.
@@ -182,26 +125,26 @@ TEST_F(AXPlatformNodeTest, GetTextContentIgnoresInvisibleAndIgnored) {
// Setting invisible or ignored on a static text node causes it to be included
// or excluded from the root node's text content:
{
- SetIsInvisible(&tree, 2, true);
+ SetIsInvisible(tree, 2, true);
EXPECT_EQ(root->GetTextContentUTF16(), u"bde");
- SetIsInvisible(&tree, 2, false);
+ SetIsInvisible(tree, 2, false);
EXPECT_EQ(root->GetTextContentUTF16(), u"abde");
- SetRole(&tree, 2, ax::mojom::Role::kNone);
+ SetRole(tree, 2, ax::mojom::Role::kNone);
EXPECT_EQ(root->GetTextContentUTF16(), u"bde");
- SetRole(&tree, 2, ax::mojom::Role::kStaticText);
+ SetRole(tree, 2, ax::mojom::Role::kStaticText);
EXPECT_EQ(root->GetTextContentUTF16(), u"abde");
}
// Setting invisible or ignored on a group node has no effect on the
// text content:
{
- SetIsInvisible(&tree, 4, true);
+ SetIsInvisible(tree, 4, true);
EXPECT_EQ(root->GetTextContentUTF16(), u"abde");
- SetRole(&tree, 4, ax::mojom::Role::kNone);
+ SetRole(tree, 4, ax::mojom::Role::kNone);
EXPECT_EQ(root->GetTextContentUTF16(), u"abde");
}
}
@@ -573,4 +516,73 @@ TEST_F(AXPlatformNodeTest, CompareTo) {
}
}
}
+
+TEST_F(AXPlatformNodeTest, HypertextOffsetFromEndpoint) {
+ // <p>
+ // <a href="google.com">link</a>
+ // </p>
+ //
+ // kRootWebArea
+ // ++kParagraph
+ // ++++kLink
+ // ++++++kStaticText "link"
+ // ++++++kStaticText "link#2"
+ AXTree* tree =
+ Init({Role::kRootWebArea,
+ {{Role::kParagraph, {{Role::kLink, {{"link"}, {"link#2"}}}}}}});
+ auto* root = static_cast<AXPlatformNodeBase*>(
+ TestAXNodeWrapper::GetOrCreate(tree, tree->root())->ax_platform_node());
+
+ // Set an AXMode on the AXPlatformNode as some platforms (auralinux) use it to
+ // determine if it should enable accessibility.
+ ui::testing::ScopedAxModeSetter ax_mode_setter(kAXModeComplete);
+
+ auto* paragraph = static_cast<AXPlatformNodeBase*>(
+ AXPlatformNode::FromNativeViewAccessible(root->ChildAtIndex(0)));
+
+ auto* link = static_cast<AXPlatformNodeBase*>(
+ AXPlatformNode::FromNativeViewAccessible(paragraph->ChildAtIndex(0)));
+
+ auto* static_text = static_cast<AXPlatformNodeBase*>(
+ AXPlatformNode::FromNativeViewAccessible(link->ChildAtIndex(0)));
+
+ auto* static_text2 = static_cast<AXPlatformNodeBase*>(
+ AXPlatformNode::FromNativeViewAccessible(link->ChildAtIndex(1)));
+
+ // End point is a parent, points before/after the link.
+ {
+ EXPECT_EQ(link->GetHypertextOffsetFromEndpoint(paragraph, 0), 0);
+ EXPECT_EQ(link->GetHypertextOffsetFromEndpoint(paragraph, 1), 10);
+ }
+
+ // End point is a parent, points before/after the static texts.
+ {
+ EXPECT_EQ(static_text->GetHypertextOffsetFromEndpoint(link, 0), 0);
+ EXPECT_EQ(static_text->GetHypertextOffsetFromEndpoint(link, 1), 4);
+ EXPECT_EQ(static_text->GetHypertextOffsetFromEndpoint(link, 2), 4);
+
+ EXPECT_EQ(static_text2->GetHypertextOffsetFromEndpoint(link, 0), 0);
+ EXPECT_EQ(static_text2->GetHypertextOffsetFromEndpoint(link, 1), 0);
+ EXPECT_EQ(static_text2->GetHypertextOffsetFromEndpoint(link, 2), 6);
+ }
+
+ // End point is a grand parent, points before/after the static text.
+ {
+ EXPECT_EQ(static_text->GetHypertextOffsetFromEndpoint(paragraph, 0), 0);
+ EXPECT_EQ(static_text->GetHypertextOffsetFromEndpoint(paragraph, 1), 4);
+ }
+
+ // End point is |this|, points into |this| text leaf object.
+ {
+ EXPECT_EQ(static_text->GetHypertextOffsetFromEndpoint(static_text, 0), 0);
+ EXPECT_EQ(static_text->GetHypertextOffsetFromEndpoint(static_text, 4), 4);
+ }
+
+ // End point is |this|, points into |this| hypertext object.
+ {
+ EXPECT_EQ(link->GetHypertextOffsetFromEndpoint(link, 0), 0);
+ EXPECT_EQ(link->GetHypertextOffsetFromEndpoint(link, 1), 4);
+ }
+}
+
} // namespace ui
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_cocoa.mm b/chromium/ui/accessibility/platform/ax_platform_node_cocoa.mm
index 84fa4180d2f..3abaab364ac 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_cocoa.mm
+++ b/chromium/ui/accessibility/platform/ax_platform_node_cocoa.mm
@@ -301,6 +301,7 @@ bool IsAXSetter(SEL selector) {
case ax::mojom::Role::kGenericContainer:
case ax::mojom::Role::kGroup:
case ax::mojom::Role::kRadioGroup:
+ case ax::mojom::Role::kTabPanel:
return true;
default:
break;
@@ -684,16 +685,22 @@ bool IsAXSetter(SEL selector) {
}
- (BOOL)isImage {
- bool isImage =
+ bool has_image_semantics =
ui::IsImage(_node->GetRole()) &&
- !_node->GetBoolAttribute(ax::mojom::BoolAttribute::kCanvasHasFallback);
- DCHECK(!([[self accessibilityRole] isEqualToString:NSAccessibilityImageRole] ^
- isImage))
- << "Internal and native roles do not match when determining if this "
- "object is an image. "
- << "Chrome role: " << ui::ToString(_node->GetRole())
- << ", NSAccessibility role: " << [self accessibilityRole];
- return isImage;
+ !_node->GetBoolAttribute(ax::mojom::BoolAttribute::kCanvasHasFallback) &&
+ !_node->GetChildCount() &&
+ _node->GetNameFrom() != ax::mojom::NameFrom::kAttributeExplicitlyEmpty;
+#if DCHECK_IS_ON()
+ bool is_native_image =
+ [[self accessibilityRole] isEqualToString:NSAccessibilityImageRole];
+ DCHECK_EQ(is_native_image, has_image_semantics)
+ << "\nPresence/lack of native image role do not match the expected "
+ "internal semantics:"
+ << "\n* Chrome role: " << ui::ToString(_node->GetRole())
+ << "\n* NSAccessibility role: " << [self accessibilityRole]
+ << "\n* AXNode: " << *_node;
+#endif
+ return has_image_semantics;
}
- (NSString*)getName {
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_delegate.cc b/chromium/ui/accessibility/platform/ax_platform_node_delegate.cc
index b1d01d7440e..02b953c3be9 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_delegate.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_delegate.cc
@@ -4,6 +4,8 @@
#include "ui/accessibility/platform/ax_platform_node_delegate.h"
+#include "base/containers/fixed_flat_set.h"
+
namespace ui {
gfx::Rect AXPlatformNodeDelegate::GetClippedScreenBoundsRect(
@@ -42,4 +44,38 @@ gfx::Rect AXPlatformNodeDelegate::GetUnclippedFrameBoundsRect(
AXClippingBehavior::kUnclipped, offscreen_result);
}
+bool AXPlatformNodeDelegate::HasDefaultActionVerb() const {
+ return GetData().GetDefaultActionVerb() !=
+ ax::mojom::DefaultActionVerb::kNone;
+}
+
+std::vector<ax::mojom::Action> AXPlatformNodeDelegate::GetSupportedActions()
+ const {
+ static constexpr auto kActionsThatCanBeExposed =
+ base::MakeFixedFlatSet<ax::mojom::Action>(
+ {ax::mojom::Action::kDecrement, ax::mojom::Action::kIncrement,
+ ax::mojom::Action::kScrollUp, ax::mojom::Action::kScrollDown,
+ ax::mojom::Action::kScrollLeft, ax::mojom::Action::kScrollRight,
+ ax::mojom::Action::kScrollForward,
+ ax::mojom::Action::kScrollBackward});
+ std::vector<ax::mojom::Action> supported_actions;
+
+ // The default action must be listed at index 0.
+ // TODO(crbug.com/1370076): Find out why some nodes do not expose a
+ // default action (HasDefaultActionVerb() is false).
+ supported_actions.push_back(ax::mojom::Action::kDoDefault);
+
+ // Users expect to be able to bring a context menu on any object via e.g.
+ // right click, so we make the context menu action available to any object
+ // unconditionally.
+ supported_actions.push_back(ax::mojom::Action::kShowContextMenu);
+
+ for (const auto& item : kActionsThatCanBeExposed) {
+ if (HasAction(item))
+ supported_actions.push_back(item);
+ }
+
+ return supported_actions;
+}
+
} // namespace ui
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_delegate.h b/chromium/ui/accessibility/platform/ax_platform_node_delegate.h
index f4b11c48a1d..4e4b7cba0d8 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_delegate.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node_delegate.h
@@ -168,8 +168,11 @@ class AX_EXPORT AXPlatformNodeDelegate {
virtual bool HasState(ax::mojom::State state) const = 0;
virtual ax::mojom::State GetState() const = 0;
virtual bool HasAction(ax::mojom::Action action) const = 0;
+ bool HasDefaultActionVerb() const;
+ std::vector<ax::mojom::Action> GetSupportedActions() const;
virtual bool HasTextStyle(ax::mojom::TextStyle text_style) const = 0;
virtual ax::mojom::NameFrom GetNameFrom() const = 0;
+ virtual ax::mojom::DescriptionFrom GetDescriptionFrom() const = 0;
// Returns the text of this node and all descendant nodes; including text
// found in embedded objects.
@@ -186,9 +189,7 @@ class AX_EXPORT AXPlatformNodeDelegate {
// field.
virtual std::u16string GetValueForControl() const = 0;
- // Get the unignored selection from the tree, meaning the selection whose
- // endpoints are on unignored nodes. (An ignored node means that the node
- // should not be exposed to platform APIs: See `IsIgnored`.)
+ // See `AXNode::GetUnignoredSelection`.
virtual const AXTree::Selection GetUnignoredSelection() const = 0;
// Creates a text position rooted at this object if it's a leaf node, or a
@@ -270,10 +271,6 @@ class AX_EXPORT AXPlatformNodeDelegate {
// PDF.
virtual bool IsPlatformDocument() const = 0;
- // Returns true if this object is a platform document as described above and
- // also has at least some content.
- virtual bool IsPlatformDocumentWithContent() const = 0;
-
// Returns true if this node is ignored and should be hidden from the
// accessibility tree. Methods that are used to navigate the accessibility
// tree, such as "ChildAtIndex", "GetParent", and "GetChildCount", among
@@ -347,6 +344,11 @@ class AX_EXPORT AXPlatformNodeDelegate {
// Returns the accessible name for the node.
virtual const std::string& GetName() const = 0;
+ // Returns the accessible description for the node.
+ // An accessible description gives more information about the node in
+ // contrast to the accessible name which is a shorter label for the node.
+ virtual const std::string& GetDescription() const = 0;
+
// Returns the text of this node and represent the text of descendant nodes
// with a special character in place of every embedded object. This represents
// the concept of text in ATK and IA2 APIs.
@@ -459,7 +461,7 @@ class AX_EXPORT AXPlatformNodeDelegate {
// Get whether this node is marked as read-only or is disabled.
virtual bool IsReadOnlyOrDisabled() const = 0;
- // Returns true if the caret or selection is visible on this object.
+ // See `AXNode::HasVisibleCaretOrSelection`.
virtual bool HasVisibleCaretOrSelection() const = 0;
// Get another node from this same tree.
@@ -559,8 +561,8 @@ class AX_EXPORT AXPlatformNodeDelegate {
// or treegrid.
virtual bool IsCellOrHeaderOfAriaGrid() const = 0;
- // True if this is a web area, and its grandparent is a presentational iframe.
- virtual bool IsWebAreaForPresentationalIframe() const = 0;
+ // See `AXNode::IsRootWebAreaForPresentationalIframe()`.
+ virtual bool IsRootWebAreaForPresentationalIframe() const = 0;
// Ordered-set-like and item-like nodes.
virtual bool IsOrderedSetItem() const = 0;
@@ -618,7 +620,7 @@ class AX_EXPORT AXPlatformNodeDelegate {
std::string SubtreeToString() { return SubtreeToStringHelper(0u); }
friend std::ostream& operator<<(std::ostream& stream,
- AXPlatformNodeDelegate& delegate) {
+ const AXPlatformNodeDelegate& delegate) {
return stream << delegate.ToString();
}
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.cc b/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.cc
index 14c9080cf1c..58414cdb95a 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.cc
@@ -213,6 +213,11 @@ ax::mojom::NameFrom AXPlatformNodeDelegateBase::GetNameFrom() const {
return GetData().GetNameFrom();
}
+ax::mojom::DescriptionFrom AXPlatformNodeDelegateBase::GetDescriptionFrom()
+ const {
+ return GetData().GetDescriptionFrom();
+}
+
std::u16string AXPlatformNodeDelegateBase::GetTextContentUTF16() const {
// Unlike in web content The "kValue" attribute always takes precedence,
// because we assume that users of this base class, such as Views controls,
@@ -385,10 +390,6 @@ bool AXPlatformNodeDelegateBase::IsPlatformDocument() const {
return ui::IsPlatformDocument(GetRole());
}
-bool AXPlatformNodeDelegateBase::IsPlatformDocumentWithContent() const {
- return IsPlatformDocument() && GetChildCount();
-}
-
bool AXPlatformNodeDelegateBase::IsDescendantOfAtomicTextField() const {
// TODO(nektar): Add const to all tree traversal methods and remove
// const_cast.
@@ -562,6 +563,10 @@ const std::string& AXPlatformNodeDelegateBase::GetName() const {
return GetStringAttribute(ax::mojom::StringAttribute::kName);
}
+const std::string& AXPlatformNodeDelegateBase::GetDescription() const {
+ return GetStringAttribute(ax::mojom::StringAttribute::kDescription);
+}
+
std::u16string AXPlatformNodeDelegateBase::GetHypertext() const {
return std::u16string();
}
@@ -774,14 +779,12 @@ bool AXPlatformNodeDelegateBase::IsCellOrHeaderOfAriaGrid() const {
return false;
}
-bool AXPlatformNodeDelegateBase::IsWebAreaForPresentationalIframe() const {
+bool AXPlatformNodeDelegateBase::IsRootWebAreaForPresentationalIframe() const {
if (!ui::IsPlatformDocument(GetRole()))
return false;
-
AXPlatformNodeDelegate* parent = GetParentDelegate();
if (!parent)
return false;
-
return parent->GetRole() == ax::mojom::Role::kIframePresentational;
}
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.h b/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.h
index 61a378dd299..3113e7144d9 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.h
@@ -96,6 +96,7 @@ class AX_EXPORT AXPlatformNodeDelegateBase : public AXPlatformNodeDelegate {
bool HasAction(ax::mojom::Action action) const override;
bool HasTextStyle(ax::mojom::TextStyle text_style) const override;
ax::mojom::NameFrom GetNameFrom() const override;
+ ax::mojom::DescriptionFrom GetDescriptionFrom() const override;
std::u16string GetTextContentUTF16() const override;
std::u16string GetValueForControl() const override;
const AXTree::Selection GetUnignoredSelection() const override;
@@ -139,7 +140,6 @@ class AX_EXPORT AXPlatformNodeDelegateBase : public AXPlatformNodeDelegate {
bool IsChildOfLeaf() const override;
bool IsDescendantOfAtomicTextField() const override;
bool IsPlatformDocument() const override;
- bool IsPlatformDocumentWithContent() const override;
bool IsLeaf() const override;
bool IsFocused() const override;
bool IsToplevelBrowserWindow() override;
@@ -171,6 +171,7 @@ class AX_EXPORT AXPlatformNodeDelegateBase : public AXPlatformNodeDelegate {
std::unique_ptr<AXPlatformNodeDelegate::ChildIterator> ChildrenEnd() override;
const std::string& GetName() const override;
+ const std::string& GetDescription() const override;
std::u16string GetHypertext() const override;
const std::map<int, int>& GetHypertextOffsetToHyperlinkChildIndex()
const override;
@@ -318,7 +319,7 @@ class AX_EXPORT AXPlatformNodeDelegateBase : public AXPlatformNodeDelegate {
int col_index) const override;
absl::optional<int32_t> CellIndexToId(int cell_index) const override;
bool IsCellOrHeaderOfAriaGrid() const override;
- bool IsWebAreaForPresentationalIframe() const override;
+ bool IsRootWebAreaForPresentationalIframe() const override;
// Ordered-set-like and item-like nodes.
bool IsOrderedSetItem() const override;
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_mac.mm b/chromium/ui/accessibility/platform/ax_platform_node_mac.mm
index c78802354ff..cae2a44f1ca 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_mac.mm
+++ b/chromium/ui/accessibility/platform/ax_platform_node_mac.mm
@@ -28,8 +28,12 @@ void PostAnnouncementNotification(NSString* announcement,
notification_info);
}
void NotifyMacEvent(AXPlatformNodeCocoa* target, ax::mojom::Event event_type) {
- if (![target AXWindow])
+ if (![target AXWindow]) {
+ // A child tree is not attached to the window. Return early, otherwise
+ // AppKit will hang trying to reach the root, resulting in a bug where
+ // VoiceOver keeps repeating "[appname] is not responding".
return;
+ }
NSString* notification =
[AXPlatformNodeCocoa nativeNotificationFromAXEvent:event_type];
if (notification)
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc b/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc
index 37a21fafde0..ad2a2d7e953 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc
@@ -470,6 +470,28 @@ HRESULT AXPlatformNodeTextRangeProviderWin::FindText(
WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_TEXTRANGE_FINDTEXT);
WIN_ACCESSIBILITY_API_PERF_HISTOGRAM(UMA_API_TEXTRANGE_FINDTEXT);
UIA_VALIDATE_TEXTRANGEPROVIDER_CALL_1_IN_1_OUT(string, result);
+ // On Windows, there's a dichotomy in the definition of a text offset in a
+ // text position between different APIs:
+ // - on UIA, a text offset translates to the offset in the text itself
+ // - on IA2, it translates to the offset in the hypertext
+ //
+ // All unignored non-text nodes are represented with an "embedded object
+ // character" in their parent's text representation on IA2, but aren't on UIA.
+ // This leads to different expected MaxTextOffset values for a same text
+ // position. If `string` is found in the text represented by the start/end
+ // endpoints, we'll create text positions in the least common ancestor, use
+ // the flat text representation's offsets of found string, then convert the
+ // positions to leaf. If 'embedded object characters' are considered, instead
+ // of the flat text representation, this falls apart.
+ //
+ // Whether we expose embedded object characters for nodes is managed by the
+ // |g_ax_embedded_object_behavior| global variable set in ax_node_position.cc.
+ // When on Windows, this variable is always set to kExposeCharacter... which
+ // is incorrect if we run UIA-specific code. To avoid problems caused by that,
+ // we use the following ScopedAXEmbeddedObjectBehaviorSetter to modify the
+ // value of the global variable to what is really expected on UIA.
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior(
+ AXEmbeddedObjectBehavior::kSuppressCharacter);
std::u16string search_string = base::WideToUTF16(string);
if (search_string.length() <= 0)
@@ -1108,9 +1130,7 @@ AXPlatformNodeWin* AXPlatformNodeTextRangeProviderWin::GetOwner() const {
const AXNode* anchor = position->GetAnchor();
DCHECK(anchor);
- AXTreeID tree_id = anchor->tree()->GetAXTreeID();
- const AXTreeManager* ax_tree_manager =
- AXTreeManagerMap::GetInstance().GetManager(tree_id);
+ const AXTreeManager* ax_tree_manager = position->GetManager();
DCHECK(ax_tree_manager);
const AXPlatformTreeManager* platform_tree_manager =
@@ -1359,8 +1379,7 @@ void AXPlatformNodeTextRangeProviderWin::NormalizeAsUnignoredTextRange(
AXPlatformNodeDelegate* AXPlatformNodeTextRangeProviderWin::GetRootDelegate(
const ui::AXTreeID tree_id) {
- const AXTreeManager* ax_tree_manager =
- AXTreeManagerMap::GetInstance().GetManager(tree_id);
+ const AXTreeManager* ax_tree_manager = AXTreeManager::FromID(tree_id);
DCHECK(ax_tree_manager);
AXNode* root_node = ax_tree_manager->GetRootAsAXNode();
const AXPlatformNode* root_platform_node =
@@ -1595,18 +1614,16 @@ void AXPlatformNodeTextRangeProviderWin::TextRangeEndpoints::SetEnd(
void AXPlatformNodeTextRangeProviderWin::TextRangeEndpoints::AddObserver(
const AXTreeID tree_id) {
- AXTreeManager* ax_tree_manager =
- AXTreeManagerMap::GetInstance().GetManager(tree_id);
+ AXTreeManager* ax_tree_manager = AXTreeManager::FromID(tree_id);
DCHECK(ax_tree_manager);
- ax_tree_manager->AddObserver(this);
+ ax_tree_manager->ax_tree()->AddObserver(this);
}
void AXPlatformNodeTextRangeProviderWin::TextRangeEndpoints::RemoveObserver(
const AXTreeID tree_id) {
- AXTreeManager* ax_tree_manager =
- AXTreeManagerMap::GetInstance().GetManager(tree_id);
+ AXTreeManager* ax_tree_manager = AXTreeManager::FromID(tree_id);
if (ax_tree_manager)
- ax_tree_manager->RemoveObserver(this);
+ ax_tree_manager->ax_tree()->RemoveObserver(this);
}
// Ensures that our endpoints are located on non-deleted nodes (step 1, case A
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_fuzzer.cc b/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_fuzzer.cc
new file mode 100644
index 00000000000..0ebe9747757
--- /dev/null
+++ b/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_fuzzer.cc
@@ -0,0 +1,245 @@
+// 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 "base/win/atl.h" // Must be before UIAutomationCore.h
+
+#include <UIAutomationClient.h>
+#include <UIAutomationCore.h>
+#include <UIAutomationCoreApi.h>
+
+#include <memory>
+#include <tuple>
+#include <utility>
+
+#include "base/at_exit.h"
+#include "base/i18n/icu_util.h"
+#include "base/test/scoped_feature_list.h"
+#include "base/win/atl.h"
+#include "base/win/scoped_bstr.h"
+#include "base/win/scoped_safearray.h"
+#include "base/win/scoped_variant.h"
+#include "ui/accessibility/ax_enums.mojom.h"
+#include "ui/accessibility/ax_node.h"
+#include "ui/accessibility/ax_node_data.h"
+#include "ui/accessibility/ax_node_position.h"
+#include "ui/accessibility/ax_position.h"
+#include "ui/accessibility/ax_range.h"
+#include "ui/accessibility/ax_role_properties.h"
+#include "ui/accessibility/ax_tree.h"
+#include "ui/accessibility/ax_tree_data.h"
+#include "ui/accessibility/ax_tree_fuzzer_util.h"
+#include "ui/accessibility/ax_tree_id.h"
+#include "ui/accessibility/ax_tree_update.h"
+#include "ui/accessibility/platform/ax_fragment_root_delegate_win.h"
+#include "ui/accessibility/platform/ax_fragment_root_win.h"
+#include "ui/accessibility/platform/ax_platform_node_textrangeprovider_win.h"
+#include "ui/accessibility/platform/test_ax_node_wrapper.h"
+#include "ui/accessibility/test_ax_tree_manager.h"
+
+using Microsoft::WRL::ComPtr;
+
+// We generate positions using fuzz data, this constant should be aligned
+// with the amount of bytes needed to generate a new text range.
+constexpr size_t kBytesNeededToGenerateTextRange = 4;
+// This should be aligned with the amount of bytes needed to mutate a text range
+// in ...MutateTextRangeProvider...
+constexpr size_t kBytesNeededToMutateTextRange = 4;
+
+// Min/Max node size for the initial tree.
+constexpr size_t kMinNodeCount = 10;
+constexpr size_t kMaxNodeCount = kMinNodeCount + 50;
+
+// Min fuzz data needed for fuzzer to function.
+// We need to ensure we have enough data to create a tree with text, as well as
+// generate a couple of text ranges and mutate them.
+constexpr size_t kMinFuzzDataSize =
+ kMinNodeCount * AXTreeFuzzerGenerator::kMinimumNewNodeFuzzDataSize +
+ kMinNodeCount * AXTreeFuzzerGenerator::kMinTextFuzzDataSize +
+ 2 * kBytesNeededToGenerateTextRange + 2 * kBytesNeededToMutateTextRange;
+
+// Cap fuzz data to avoid slowness.
+constexpr size_t kMaxFuzzDataSize = 20000;
+
+ui::AXPlatformNode* AXPlatformNodeFromNode(ui::AXTree* tree, ui::AXNode* node) {
+ const ui::TestAXNodeWrapper* wrapper =
+ ui::TestAXNodeWrapper::GetOrCreate(tree, node);
+ return wrapper ? wrapper->ax_platform_node() : nullptr;
+}
+
+template <typename T>
+ComPtr<T> QueryInterfaceFromNode(ui::AXTree* tree, ui::AXNode* node) {
+ ui::AXPlatformNode* ax_platform_node = AXPlatformNodeFromNode(tree, node);
+ if (!ax_platform_node)
+ return ComPtr<T>();
+ ComPtr<T> result;
+ ax_platform_node->GetNativeViewAccessible()->QueryInterface(__uuidof(T),
+ &result);
+ return result;
+}
+
+// This method returns a text range scoped to this node.
+void GetTextRangeProviderFromTextNode(
+ ui::AXTree* tree,
+ ui::AXNode* text_node,
+ ComPtr<ITextRangeProvider>& text_range_provider) {
+ ComPtr<IRawElementProviderSimple> provider_simple =
+ QueryInterfaceFromNode<IRawElementProviderSimple>(tree, text_node);
+ if (!provider_simple.Get())
+ return;
+ ComPtr<ITextProvider> text_provider;
+ provider_simple->GetPatternProvider(UIA_TextPatternId, &text_provider);
+
+ if (!text_provider.Get())
+ return;
+
+ text_provider->get_DocumentRange(&text_range_provider);
+
+ ComPtr<ui::AXPlatformNodeTextRangeProviderWin> text_range_provider_interal;
+ text_range_provider->QueryInterface(
+ IID_PPV_ARGS(&text_range_provider_interal));
+ ui::AXPlatformNode* ax_platform_node =
+ AXPlatformNodeFromNode(tree, text_node);
+ text_range_provider_interal->SetOwnerForTesting(
+ static_cast<ui::AXPlatformNodeWin*>(ax_platform_node));
+}
+
+void CallComparisonAPIs(const ComPtr<ITextRangeProvider>& text_range,
+ const ComPtr<ITextRangeProvider>& other_text_range) {
+ BOOL are_same;
+ std::ignore = text_range->Compare(other_text_range.Get(), &are_same);
+ int compare_endpoints_result;
+ std::ignore = text_range->CompareEndpoints(
+ TextPatternRangeEndpoint_Start, other_text_range.Get(),
+ TextPatternRangeEndpoint_Start, &compare_endpoints_result);
+ std::ignore = text_range->CompareEndpoints(
+ TextPatternRangeEndpoint_End, other_text_range.Get(),
+ TextPatternRangeEndpoint_Start, &compare_endpoints_result);
+ std::ignore = text_range->CompareEndpoints(
+ TextPatternRangeEndpoint_Start, other_text_range.Get(),
+ TextPatternRangeEndpoint_End, &compare_endpoints_result);
+ std::ignore = text_range->CompareEndpoints(
+ TextPatternRangeEndpoint_End, other_text_range.Get(),
+ TextPatternRangeEndpoint_End, &compare_endpoints_result);
+}
+
+TextPatternRangeEndpoint GenerateEndpoint(unsigned char byte) {
+ return (byte % 2) ? TextPatternRangeEndpoint_Start
+ : TextPatternRangeEndpoint_End;
+}
+
+TextUnit GenerateTextUnit(unsigned char byte) {
+ return static_cast<TextUnit>(byte % 7);
+}
+
+enum class TextRangeMutation {
+ kMoveEndpointByRange,
+ kExpandToEnclosingUnit,
+ kMove,
+ kMoveEndpointByUnit,
+ kLast
+};
+
+TextRangeMutation GenerateTextRangeMutation(unsigned char byte) {
+ constexpr unsigned char max =
+ static_cast<unsigned char>(TextRangeMutation::kLast);
+ return static_cast<TextRangeMutation>(byte % max);
+}
+
+void MutateTextRangeProvider(ComPtr<ITextRangeProvider>& text_range,
+ const ComPtr<ITextRangeProvider>& other_text_range,
+ FuzzerData& fuzz_data) {
+ const int kMaxMoveCount = 20;
+ TextUnit unit = GenerateTextUnit(fuzz_data.NextByte());
+ int units_moved;
+
+ TextRangeMutation mutation_type =
+ GenerateTextRangeMutation(fuzz_data.NextByte());
+ switch (mutation_type) {
+ case TextRangeMutation::kMoveEndpointByRange:
+ if (other_text_range.Get()) {
+ text_range->MoveEndpointByRange(GenerateEndpoint(fuzz_data.NextByte()),
+ other_text_range.Get(),
+ GenerateEndpoint(fuzz_data.NextByte()));
+ return;
+ }
+ ABSL_FALLTHROUGH_INTENDED;
+ case TextRangeMutation::kExpandToEnclosingUnit:
+ text_range->ExpandToEnclosingUnit(unit);
+ return;
+ case TextRangeMutation::kMove:
+ text_range->Move(unit, fuzz_data.NextByte() % kMaxMoveCount,
+ &units_moved);
+ return;
+ case TextRangeMutation::kMoveEndpointByUnit:
+ text_range->MoveEndpointByUnit(GenerateEndpoint(fuzz_data.NextByte()),
+ unit, fuzz_data.NextByte() % kMaxMoveCount,
+ &units_moved);
+ return;
+ case TextRangeMutation::kLast:
+ NOTREACHED();
+ }
+}
+
+struct Environment {
+ Environment() { CHECK(base::i18n::InitializeICU()); }
+ base::AtExitManager at_exit_manager;
+};
+
+// Entry point for LibFuzzer.
+extern "C" int LLVMFuzzerTestOneInput(const unsigned char* data, size_t size) {
+ if (size < kMinFuzzDataSize || size > kMaxFuzzDataSize)
+ return 0;
+ static Environment env;
+
+ FuzzerData fuzz_data(data, size);
+ AXTreeFuzzerGenerator generator;
+
+ // Create initial tree.
+ const size_t node_count =
+ kMinNodeCount + fuzz_data.NextByte() % (kMaxNodeCount - kMinNodeCount);
+ generator.GenerateInitialUpdate(fuzz_data, node_count);
+
+ ui::AXTree* tree = generator.GetTree();
+
+ // Run with --v=1 to aid in debugging a specific crash.
+ VLOG(1) << tree->ToString();
+
+ // Loop until data is expended.
+ std::vector<ComPtr<ITextRangeProvider>> created_ranges;
+ while (fuzz_data.RemainingBytes() > kBytesNeededToGenerateTextRange) {
+ // Create a new position on a random node in the tree.
+ {
+ // To ensure that anchor_id is between |ui::kInvalidAXNodeID| and the max
+ // ID of the tree (non-inclusive), get a number [0, max_id - 1) and then
+ // shift by 1 to get [1, max_id)
+ ui::AXNodeID anchor_id =
+ (fuzz_data.NextByte() % (generator.GetMaxAssignedID() - 1)) + 1;
+ ui::AXNode* anchor = tree->GetFromId(anchor_id);
+ if (!anchor)
+ continue;
+ ComPtr<ITextRangeProvider> text_range_provider;
+ GetTextRangeProviderFromTextNode(tree, anchor, text_range_provider);
+ if (text_range_provider)
+ created_ranges.push_back(std::move(text_range_provider));
+ }
+ for (size_t i = 0; i < created_ranges.size(); ++i) {
+ ComPtr<ITextRangeProvider> text_range = created_ranges[i];
+ ComPtr<ITextRangeProvider> other_range;
+ if (i > 0)
+ other_range = created_ranges[i - 1].Get();
+ if (!other_range.Get())
+ continue;
+
+ CallComparisonAPIs(text_range.Get(), other_range);
+ if (fuzz_data.RemainingBytes() > kBytesNeededToMutateTextRange)
+ MutateTextRangeProvider(text_range, other_range, fuzz_data);
+ }
+ // Do a Tree Update.
+ if (!generator.GenerateTreeUpdate(fuzz_data, 5))
+ break;
+ }
+ tree->Destroy();
+ ui::TestAXNodeWrapper::ResetGlobalState();
+ return 0;
+}
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc b/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc
index ceee20b402c..8ff0bf08649 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc
@@ -444,6 +444,8 @@ class AXPlatformNodeTextRangeProviderTest : public ui::AXPlatformNodeWinTest {
text_field.AddState(ax::mojom::State::kEditable);
text_field.AddStringAttribute(ax::mojom::StringAttribute::kHtmlTag,
"input");
+ text_field.AddStringAttribute(ax::mojom::StringAttribute::kInputType,
+ "text");
text_field.SetValue(ALL_TEXT);
text_field.AddIntListAttribute(ax::mojom::IntListAttribute::kLineStarts,
std::vector<int32_t>{0, 7});
@@ -2993,6 +2995,8 @@ TEST_F(AXPlatformNodeTextRangeProviderTest,
text_input_data.AddState(ax::mojom::State::kEditable);
text_input_data.AddStringAttribute(ax::mojom::StringAttribute::kHtmlTag,
"input");
+ text_input_data.AddStringAttribute(ax::mojom::StringAttribute::kInputType,
+ "text");
ui::AXNodeData group2_data;
group2_data.id = 5;
@@ -3015,7 +3019,7 @@ TEST_F(AXPlatformNodeTextRangeProviderTest,
empty_text_data.role = ax::mojom::Role::kStaticText;
empty_text_data.AddState(ax::mojom::State::kEditable);
text_content = "";
- empty_text_data.SetName(text_content);
+ empty_text_data.SetNameExplicitlyEmpty();
ComputeWordBoundariesOffsets(text_content, word_start_offsets,
word_end_offsets);
empty_text_data.AddIntListAttribute(ax::mojom::IntListAttribute::kWordStarts,
@@ -3376,6 +3380,8 @@ TEST_F(AXPlatformNodeTextRangeProviderTest,
search_box.role = ax::mojom::Role::kSearchBox;
search_box.AddState(ax::mojom::State::kEditable);
search_box.AddStringAttribute(ax::mojom::StringAttribute::kHtmlTag, "input");
+ search_box.AddStringAttribute(ax::mojom::StringAttribute::kInputType,
+ "search");
paragraph_data.child_ids.push_back(search_box.id);
ui::AXNodeData search_text;
@@ -3531,6 +3537,124 @@ TEST_F(AXPlatformNodeTextRangeProviderTest,
}
TEST_F(AXPlatformNodeTextRangeProviderTest,
+ TestITextRangeProviderGetEnclosingElementRichButton) {
+ // Set up ax tree with the following structure:
+ //
+ // root
+ // ++button_1
+ // ++++static_text_1
+ // ++++++inline_text_1
+ // ++button_2
+ // ++++heading
+ // ++++++statix_text_2
+ // ++++++++inline_text_2
+
+ ui::AXNodeData root;
+ ui::AXNodeData button_1;
+ ui::AXNodeData static_text_1;
+ ui::AXNodeData inline_text_1;
+ ui::AXNodeData button_2;
+ ui::AXNodeData heading;
+ ui::AXNodeData static_text_2;
+ ui::AXNodeData inline_text_2;
+
+ root.id = 1;
+ button_1.id = 2;
+ static_text_1.id = 3;
+ inline_text_1.id = 4;
+ button_2.id = 5;
+ heading.id = 6;
+ static_text_2.id = 7;
+ inline_text_2.id = 8;
+
+ root.role = ax::mojom::Role::kRootWebArea;
+ root.child_ids = {button_1.id, button_2.id};
+
+ button_1.role = ax::mojom::Role::kButton;
+ button_1.child_ids.push_back(static_text_1.id);
+
+ static_text_1.role = ax::mojom::Role::kStaticText;
+ static_text_1.child_ids.push_back(inline_text_1.id);
+
+ inline_text_1.role = ax::mojom::Role::kInlineTextBox;
+
+ button_2.role = ax::mojom::Role::kButton;
+ button_2.child_ids.push_back(heading.id);
+
+ heading.role = ax::mojom::Role::kHeading;
+ heading.child_ids.push_back(static_text_2.id);
+
+ static_text_2.role = ax::mojom::Role::kStaticText;
+ static_text_2.child_ids.push_back(inline_text_2.id);
+
+ inline_text_2.role = ax::mojom::Role::kInlineTextBox;
+
+ ui::AXTreeUpdate update;
+ ui::AXTreeData tree_data;
+ tree_data.tree_id = ui::AXTreeID::CreateNewAXTreeID();
+ update.tree_data = tree_data;
+ update.has_tree_data = true;
+ update.root_id = root.id;
+ update.nodes = {root, button_1, static_text_1, inline_text_1,
+ button_2, heading, static_text_2, inline_text_2};
+ Init(update);
+
+ // Set up variables from the tree for testing.
+ AXNode* button_1_node = GetRootAsAXNode()->children()[0];
+ AXNode* static_text_1_node = button_1_node->children()[0];
+ AXNode* inline_text_1_node = static_text_1_node->children()[0];
+ AXNode* button_2_node = GetRootAsAXNode()->children()[1];
+ AXNode* heading_node = button_2_node->children()[0];
+ AXNode* static_text_2_node = heading_node->children()[0];
+ AXNode* inline_text_2_node = static_text_2_node->children()[0];
+ AXPlatformNodeWin* owner =
+ static_cast<AXPlatformNodeWin*>(AXPlatformNodeFromNode(button_1_node));
+ ASSERT_NE(owner, nullptr);
+
+ ComPtr<IRawElementProviderSimple> button_1_node_raw =
+ QueryInterfaceFromNode<IRawElementProviderSimple>(button_1_node);
+ ComPtr<IRawElementProviderSimple> inline_text_1_node_raw =
+ QueryInterfaceFromNode<IRawElementProviderSimple>(inline_text_1_node);
+
+ ComPtr<IRawElementProviderSimple> static_text_2_node_raw =
+ QueryInterfaceFromNode<IRawElementProviderSimple>(static_text_2_node);
+ ComPtr<IRawElementProviderSimple> inline_text_2_node_raw =
+ QueryInterfaceFromNode<IRawElementProviderSimple>(inline_text_2_node);
+
+ // 1. The first button should hide its children since it contains a single
+ // text node. Thus, calling GetEnclosingElement on a descendant inline text
+ // box should return the button itself.
+ ComPtr<ITextProvider> text_provider;
+ EXPECT_HRESULT_SUCCEEDED(inline_text_1_node_raw->GetPatternProvider(
+ UIA_TextPatternId, &text_provider));
+
+ ComPtr<ITextRangeProvider> text_range_provider;
+ EXPECT_HRESULT_SUCCEEDED(
+ text_provider->get_DocumentRange(&text_range_provider));
+ SetOwner(owner, text_range_provider.Get());
+
+ ComPtr<IRawElementProviderSimple> enclosing_element;
+ EXPECT_HRESULT_SUCCEEDED(
+ text_range_provider->GetEnclosingElement(&enclosing_element));
+ EXPECT_EQ(button_1_node_raw.Get(), enclosing_element.Get());
+
+ // 2. The second button shouldn't hide its children since it doesn't contain a
+ // single text node (it contains a heading node). Thus, calling
+ // GetEnclosingElement on a descendant inline text box should return the
+ // parent node.
+ EXPECT_HRESULT_SUCCEEDED(inline_text_2_node_raw->GetPatternProvider(
+ UIA_TextPatternId, &text_provider));
+
+ EXPECT_HRESULT_SUCCEEDED(
+ text_provider->get_DocumentRange(&text_range_provider));
+ SetOwner(owner, text_range_provider.Get());
+
+ EXPECT_HRESULT_SUCCEEDED(
+ text_range_provider->GetEnclosingElement(&enclosing_element));
+ EXPECT_EQ(static_text_2_node_raw.Get(), enclosing_element.Get());
+}
+
+TEST_F(AXPlatformNodeTextRangeProviderTest,
TestITextRangeProviderMoveEndpointByRange) {
Init(BuildTextDocument({"some text", "more text"}));
@@ -3903,6 +4027,8 @@ TEST_F(AXPlatformNodeTextRangeProviderTest,
input_text_data.AddIntAttribute(ax::mojom::IntAttribute::kColor, 0xFFADC0DEU);
input_text_data.AddStringAttribute(ax::mojom::StringAttribute::kHtmlTag,
"input");
+ input_text_data.AddStringAttribute(ax::mojom::StringAttribute::kInputType,
+ "text");
input_text_data.SetName("placeholder");
input_text_data.child_ids = {13};
@@ -3928,6 +4054,8 @@ TEST_F(AXPlatformNodeTextRangeProviderTest,
0xFFADC0DEU);
input_text_data2.AddStringAttribute(ax::mojom::StringAttribute::kHtmlTag,
"input");
+ input_text_data2.AddStringAttribute(ax::mojom::StringAttribute::kInputType,
+ "text");
input_text_data2.SetName("foo");
input_text_data2.child_ids = {15};
@@ -5112,6 +5240,92 @@ TEST_F(AXPlatformNodeTextRangeProviderTest, TestITextRangeProviderFindText) {
}
TEST_F(AXPlatformNodeTextRangeProviderTest,
+ FindTextWithEmbeddedObjectCharacter) {
+ // ++1 kRootWebArea
+ // ++++2 kList
+ // ++++++3 kListItem
+ // ++++++++4 kStaticText
+ // ++++++++++5 kInlineTextBox
+ // ++++++6 kListItem
+ // ++++++++7 kStaticText
+ // ++++++++++8 kInlineTextBox
+ ui::AXNodeData root_1;
+ ui::AXNodeData list_2;
+ ui::AXNodeData list_item_3;
+ ui::AXNodeData static_text_4;
+ ui::AXNodeData inline_box_5;
+ ui::AXNodeData list_item_6;
+ ui::AXNodeData static_text_7;
+ ui::AXNodeData inline_box_8;
+
+ root_1.id = 1;
+ list_2.id = 2;
+ list_item_3.id = 3;
+ static_text_4.id = 4;
+ inline_box_5.id = 5;
+ list_item_6.id = 6;
+ static_text_7.id = 7;
+ inline_box_8.id = 8;
+
+ root_1.role = ax::mojom::Role::kRootWebArea;
+ root_1.child_ids = {list_2.id};
+
+ list_2.role = ax::mojom::Role::kList;
+ list_2.child_ids = {list_item_3.id, list_item_6.id};
+
+ list_item_3.role = ax::mojom::Role::kListItem;
+ list_item_3.child_ids = {static_text_4.id};
+
+ static_text_4.role = ax::mojom::Role::kStaticText;
+ static_text_4.SetName("foo");
+ static_text_4.child_ids = {inline_box_5.id};
+
+ inline_box_5.role = ax::mojom::Role::kInlineTextBox;
+ inline_box_5.SetName("foo");
+
+ list_item_6.role = ax::mojom::Role::kListItem;
+ list_item_6.child_ids = {static_text_7.id};
+
+ static_text_7.role = ax::mojom::Role::kStaticText;
+ static_text_7.child_ids = {inline_box_8.id};
+ static_text_7.SetName("bar");
+
+ inline_box_8.role = ax::mojom::Role::kInlineTextBox;
+ inline_box_8.SetName("bar");
+
+ ui::AXTreeUpdate update;
+ ui::AXTreeData tree_data;
+ tree_data.tree_id = ui::AXTreeID::CreateNewAXTreeID();
+ update.tree_data = tree_data;
+ update.has_tree_data = true;
+ update.root_id = root_1.id;
+ update.nodes = {root_1, list_2, list_item_3, static_text_4,
+ inline_box_5, list_item_6, static_text_7, inline_box_8};
+
+ Init(update);
+
+ AXNode* root_node = GetRootAsAXNode();
+ ComPtr<ITextRangeProvider> text_range_provider;
+ GetTextRangeProviderFromTextNode(text_range_provider, root_node);
+
+ base::win::ScopedBstr find_string(L"oobar");
+ Microsoft::WRL::ComPtr<ITextRangeProvider> text_range_provider_found;
+ EXPECT_HRESULT_SUCCEEDED(text_range_provider->FindText(find_string.Get(),
+ false, false, &text_range_provider_found));
+ ASSERT_TRUE(text_range_provider_found.Get());
+ Microsoft::WRL::ComPtr<AXPlatformNodeTextRangeProviderWin>
+ text_range_provider_win;
+ text_range_provider_found->QueryInterface(
+ IID_PPV_ARGS(&text_range_provider_win));
+ ASSERT_TRUE(GetStart(text_range_provider_win.Get())->IsTextPosition());
+ EXPECT_EQ(5, GetStart(text_range_provider_win.Get())->anchor_id());
+ EXPECT_EQ(1, GetStart(text_range_provider_win.Get())->text_offset());
+ ASSERT_TRUE(GetEnd(text_range_provider_win.Get())->IsTextPosition());
+ EXPECT_EQ(8, GetEnd(text_range_provider_win.Get())->anchor_id());
+ EXPECT_EQ(3, GetEnd(text_range_provider_win.Get())->text_offset());
+}
+
+TEST_F(AXPlatformNodeTextRangeProviderTest,
TestITextRangeProviderFindTextBackwards) {
Init(BuildTextDocument({"text", "some", "text"},
false /* build_word_boundaries_offsets */,
@@ -6294,7 +6508,7 @@ TEST_F(AXPlatformNodeTextRangeProviderTest, TestValidateStartAndEnd) {
// Now modify the tree so that start_ is pointing to a node that has been
// removed from the tree.
- text_data.SetName("");
+ text_data.SetNameExplicitlyEmpty();
AXTreeUpdate test_update2;
test_update2.nodes = {text_data};
ASSERT_TRUE(GetTree()->Unserialize(test_update2));
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_unittest.cc b/chromium/ui/accessibility/platform/ax_platform_node_unittest.cc
index 9d8c8f1fd06..d955e088225 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_unittest.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_unittest.cc
@@ -7,6 +7,7 @@
#include "ui/accessibility/ax_constants.mojom.h"
#include "ui/accessibility/platform/ax_platform_node_base.h"
#include "ui/accessibility/platform/test_ax_node_wrapper.h"
+#include "ui/accessibility/platform/test_ax_tree_update.h"
namespace ui {
@@ -74,6 +75,12 @@ void AXPlatformNodeTest::Init(
Init(update);
}
+AXTree* AXPlatformNodeTest::Init(const TestAXTreeUpdateNode& root) {
+ TestAXTreeUpdate update(root);
+ Init(update);
+ return GetTree();
+}
+
AXTreeUpdate AXPlatformNodeTest::BuildTextField() {
AXNodeData text_field_node;
text_field_node.id = 1;
@@ -81,6 +88,8 @@ AXTreeUpdate AXPlatformNodeTest::BuildTextField() {
text_field_node.AddState(ax::mojom::State::kEditable);
text_field_node.AddStringAttribute(ax::mojom::StringAttribute::kHtmlTag,
"input");
+ text_field_node.AddStringAttribute(ax::mojom::StringAttribute::kInputType,
+ "text");
text_field_node.SetValue("How now brown cow.");
AXTreeUpdate update;
@@ -98,6 +107,8 @@ AXTreeUpdate AXPlatformNodeTest::BuildTextFieldWithSelectionRange(
text_field_node.AddState(ax::mojom::State::kEditable);
text_field_node.AddStringAttribute(ax::mojom::StringAttribute::kHtmlTag,
"input");
+ text_field_node.AddStringAttribute(ax::mojom::StringAttribute::kInputType,
+ "text");
text_field_node.AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, true);
text_field_node.AddIntAttribute(ax::mojom::IntAttribute::kTextSelStart,
start);
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_unittest.h b/chromium/ui/accessibility/platform/ax_platform_node_unittest.h
index b006162bd24..a795d986e1a 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_unittest.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node_unittest.h
@@ -15,6 +15,8 @@
namespace ui {
+struct TestAXTreeUpdateNode;
+
class AXPlatformNodeTest : public ::testing::Test, public TestAXTreeManager {
public:
AXPlatformNodeTest();
@@ -42,6 +44,9 @@ class AXPlatformNodeTest : public ::testing::Test, public TestAXTreeManager {
const AXNodeData& node11 = AXNodeData(),
const AXNodeData& node12 = AXNodeData());
+ // Initialize given an AXTreeUpdate by given TestAXTreeUpdateNode instance.
+ AXTree* Init(const TestAXTreeUpdateNode& root);
+
AXTreeUpdate BuildTextField();
AXTreeUpdate BuildTextFieldWithSelectionRange(int32_t start, int32_t stop);
AXTreeUpdate BuildContentEditable();
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_win.cc b/chromium/ui/accessibility/platform/ax_platform_node_win.cc
index 7daf94358ff..36f633b07ac 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_win.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_win.cc
@@ -11,10 +11,10 @@
#include <map>
#include <set>
#include <string>
-#include <unordered_set>
#include <utility>
#include <vector>
+#include "base/containers/flat_set.h"
#include "base/json/json_writer.h"
#include "base/lazy_instance.h"
#include "base/metrics/histogram_functions.h"
@@ -40,6 +40,7 @@
#include "ui/accessibility/ax_action_handler_registry.h"
#include "ui/accessibility/ax_active_popup.h"
#include "ui/accessibility/ax_constants.mojom.h"
+#include "ui/accessibility/ax_enum_localization_util.h"
#include "ui/accessibility/ax_enum_util.h"
#include "ui/accessibility/ax_mode_observer.h"
#include "ui/accessibility/ax_node_data.h"
@@ -208,7 +209,7 @@ namespace ui {
namespace {
-typedef std::unordered_set<AXPlatformNodeWin*> AXPlatformNodeWinSet;
+typedef base::flat_set<AXPlatformNodeWin*> AXPlatformNodeWinSet;
// Set of all AXPlatformNodeWin objects that were the target of an
// alert event.
base::LazyInstance<AXPlatformNodeWinSet>::Leaky g_alert_targets =
@@ -471,6 +472,18 @@ SAFEARRAY* AXPlatformNodeWin::CreateUIAControllerForArray() {
platform_node_list.push_back(view_popup_node_win);
}
+ // The aria-errormessage attribute (mapped to the kErrormessageId) is expected
+ // to be exposed through the ControllerFor property on UIA:
+ // https://www.w3.org/TR/wai-aria-1.1/#aria-errormessage.
+ if (HasIntAttribute(ax::mojom::IntAttribute::kErrormessageId)) {
+ AXPlatformNodeWin* error_message_node_win =
+ static_cast<AXPlatformNodeWin*>(GetFromUniqueId(
+ GetIntAttribute(ax::mojom::IntAttribute::kErrormessageId)));
+
+ if (IsValidUiaRelationTarget(error_message_node_win))
+ platform_node_list.push_back(error_message_node_win);
+ }
+
return CreateUIAElementsSafeArray(platform_node_list);
}
@@ -761,7 +774,7 @@ AXPlatformNodeWin::UIARoleProperties AXPlatformNodeWin::GetUIARoleProperties() {
// If this is a web area for a presentational iframe, give it a role of
// something other than document so that the fact that it's a separate doc
// is not exposed to AT.
- if (GetDelegate()->IsWebAreaForPresentationalIframe())
+ if (GetDelegate()->IsRootWebAreaForPresentationalIframe())
return {UIALocalizationStrategy::kSupply, UIA_GroupControlTypeId, L"group"};
// See UIARoleProperties for descriptions of the properties.
@@ -1010,8 +1023,8 @@ AXPlatformNodeWin::UIARoleProperties AXPlatformNodeWin::GetUIARoleProperties() {
L"document"};
case ax::mojom::Role::kGraphicsObject:
- return {UIALocalizationStrategy::kSupply, UIA_PaneControlTypeId,
- L"region"};
+ return {UIALocalizationStrategy::kSupply, UIA_GroupControlTypeId,
+ L"group"};
case ax::mojom::Role::kGraphicsSymbol:
return {UIALocalizationStrategy::kSupply, UIA_ImageControlTypeId, L"img"};
@@ -1214,7 +1227,7 @@ AXPlatformNodeWin::UIARoleProperties AXPlatformNodeWin::GetUIARoleProperties() {
L"document"};
case ax::mojom::Role::kPopUpButton: {
- const std::string html_tag =
+ const std::string& html_tag =
GetStringAttribute(ax::mojom::StringAttribute::kHtmlTag);
if (html_tag == "select") {
return {UIALocalizationStrategy::kDeferToControlType,
@@ -4144,7 +4157,7 @@ IFACEMETHODIMP AXPlatformNodeWin::get_caretOffset(LONG* offset) {
AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
*offset = 0;
- if (!HasCaret())
+ if (!HasVisibleCaretOrSelection())
return S_FALSE;
int selection_start, selection_end;
@@ -4561,9 +4574,11 @@ IFACEMETHODIMP AXPlatformNodeWin::setSelections(LONG nSelections,
return E_INVALIDARG;
AXPosition start_position =
- start_node->HypertextOffsetToEndpoint(selections->startOffset);
+ start_node->HypertextOffsetToEndpoint(selections->startOffset)
+ ->AsDomSelectionPosition();
AXPosition end_position =
- end_node->HypertextOffsetToEndpoint(selections->endOffset);
+ end_node->HypertextOffsetToEndpoint(selections->endOffset)
+ ->AsDomSelectionPosition();
if (!start_position->IsNullPosition() || end_position->IsNullPosition())
return E_INVALIDARG;
@@ -5223,7 +5238,7 @@ HRESULT AXPlatformNodeWin::GetPropertyValueImpl(PROPERTYID property_id,
// Localized Control Type of "output" whereas the Core-AAM states
// the Localized Control Type of the ARIA status role should be
// "status".
- const std::string html_tag =
+ const std::string& html_tag =
GetStringAttribute(ax::mojom::StringAttribute::kHtmlTag);
std::u16string localized_control_type =
html_tag == "output"
@@ -6110,7 +6125,7 @@ int AXPlatformNodeWin::MSAARole() {
// If this is a web area for a presentational iframe, give it a role of
// something other than DOCUMENT so that the fact that it's a separate doc
// is not exposed to AT.
- if (GetDelegate()->IsWebAreaForPresentationalIframe())
+ if (GetDelegate()->IsRootWebAreaForPresentationalIframe())
return ROLE_SYSTEM_GROUPING;
switch (GetRole()) {
@@ -6707,7 +6722,7 @@ int32_t AXPlatformNodeWin::ComputeIA2Role() {
// If this is a web area for a presentational iframe, give it a role of
// something other than DOCUMENT so that the fact that it's a separate doc
// is not exposed to AT.
- if (GetDelegate()->IsWebAreaForPresentationalIframe()) {
+ if (GetDelegate()->IsRootWebAreaForPresentationalIframe()) {
return ROLE_SYSTEM_GROUPING;
}
@@ -7273,6 +7288,10 @@ bool AXPlatformNodeWin::IsUIAControl() const {
case ax::mojom::Role::kLabelText:
case ax::mojom::Role::kListBoxOption:
case ax::mojom::Role::kListItem:
+ // Treat the root of a MathML tree as content/control so that it is seen
+ // by UIA clients. The remainder of the tree remains as text for now until
+ // UIA mappings for MathML are defined (https://crbug.com/1260585).
+ case ax::mojom::Role::kMathMLMath:
case ax::mojom::Role::kMeter:
case ax::mojom::Role::kProgressIndicator:
case ax::mojom::Role::kRow:
@@ -7362,20 +7381,15 @@ bool AXPlatformNodeWin::ShouldHideChildrenForUIA() const {
return true;
auto role = GetRole();
- if (HasPresentationalChildren(role))
- return true;
-
switch (role) {
- // Other elements that are expected by UIA to hide their children without
- // having "Children Presentational: True".
- //
+ // Even though a node with role kButton has presentational children, it
+ // should only hide its children from UIA when it has a single text node
+ // (to avoid having its name announced twice). This is because buttons can
+ // have complex structures and they shouldn't hide their subtree.
+ case ax::mojom::Role::kButton:
// TODO(bebeaudr): We might be able to remove ax::mojom::Role::kLink once
// http://crbug.com/1054514 is fixed. Links should not have to hide their
// children.
- // TODO(virens): |kPdfActionableHighlight| needs to follow a fix similar to
- // links. At present Pdf highlghts have text nodes as children. But, we may
- // enable pdf highlights to have complex children like links based on user
- // feedback.
case ax::mojom::Role::kLink:
// Links with a single text-only child should hide their subtree.
if (GetChildCount() == 1) {
@@ -7383,10 +7397,16 @@ bool AXPlatformNodeWin::ShouldHideChildrenForUIA() const {
return only_child && only_child->IsText();
}
return false;
+ // TODO(virens): |kPdfActionableHighlight| needs to follow a fix similar to
+ // links. At present Pdf highlights have text nodes as children. But, we may
+ // enable pdf highlights to have complex children like links based on user
+ // feedback.
case ax::mojom::Role::kPdfActionableHighlight:
return true;
default:
- return false;
+ // UIA expects nodes that have "Children Presentational: True" to hide
+ // their children.
+ return HasPresentationalChildren(role);
}
}
@@ -7424,9 +7444,9 @@ int AXPlatformNodeWin::MSAAState() const {
// Exposing the busy state on the root web area means the NVDA user will end
// up without a virtualBuffer until the page fully loads. So if we have
// content, don't expose the busy state.
- if (GetBoolAttribute(ax::mojom::BoolAttribute::kBusy) &&
- !IsPlatformDocumentWithContent()) {
- msaa_state |= STATE_SYSTEM_BUSY;
+ if (GetBoolAttribute(ax::mojom::BoolAttribute::kBusy)) {
+ if (!IsPlatformDocument() || !GetChildCount())
+ msaa_state |= STATE_SYSTEM_BUSY;
}
if (HasState(ax::mojom::State::kCollapsed))
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_win_unittest.cc b/chromium/ui/accessibility/platform/ax_platform_node_win_unittest.cc
index 7e75543ab52..9c9dfb7f070 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_win_unittest.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_win_unittest.cc
@@ -3485,19 +3485,6 @@ TEST_F(AXPlatformNodeWinTest, IAccessibleTextTextFieldGetCaretOffsetNoCaret) {
EXPECT_EQ(0, offset);
}
-TEST_F(AXPlatformNodeWinTest, IAccessibleTextTextFieldGetCaretOffsetHasCaret) {
- Init(BuildTextFieldWithSelectionRange(1, 2));
-
- ComPtr<IAccessible2> ia2_text_field = ToIAccessible2(GetRootIAccessible());
- ComPtr<IAccessibleText> text_field;
- ia2_text_field.As(&text_field);
- ASSERT_NE(nullptr, text_field.Get());
-
- LONG offset;
- EXPECT_HRESULT_SUCCEEDED(text_field->get_caretOffset(&offset));
- EXPECT_EQ(2, offset);
-}
-
TEST_F(AXPlatformNodeWinTest,
IAccessibleTextContextEditableGetCaretOffsetNoCaret) {
Init(BuildContentEditable());
@@ -4387,7 +4374,7 @@ TEST_F(AXPlatformNodeWinTest, UIAGetControllerForPropertyId) {
AXNodeData root;
root.id = 1;
root.role = ax::mojom::Role::kRootWebArea;
- root.child_ids = {2, 3, 4};
+ root.child_ids = {2, 3, 4, 5, 6};
AXNodeData tab;
tab.id = 2;
@@ -4407,7 +4394,17 @@ TEST_F(AXPlatformNodeWinTest, UIAGetControllerForPropertyId) {
panel2.role = ax::mojom::Role::kTabPanel;
panel2.SetName("panel2");
- Init(root, tab, panel1, panel2);
+ AXNodeData group1;
+ group1.id = 5;
+ group1.role = ax::mojom::Role::kGenericContainer;
+ group1.AddIntAttribute(ax::mojom::IntAttribute::kErrormessageId, 6);
+
+ AXNodeData text1;
+ text1.id = 6;
+ text1.role = ax::mojom::Role::kStaticText;
+ text1.SetName("text1");
+
+ Init(root, tab, panel1, panel2, group1, text1);
TestAXNodeWrapper* root_wrapper =
TestAXNodeWrapper::GetOrCreate(GetTree(), GetRootAsAXNode());
root_wrapper->BuildAllWrappers(GetTree(), GetRootAsAXNode());
@@ -4429,6 +4426,17 @@ TEST_F(AXPlatformNodeWinTest, UIAGetControllerForPropertyId) {
EXPECT_UIA_PROPERTY_ELEMENT_ARRAY_BSTR_EQ(
tab_node, UIA_ControllerForPropertyId, UIA_NamePropertyId,
expected_names_2);
+
+ // The aria-errormessage attribute should be exposed through the ControllerFor
+ // UIA property.
+ ComPtr<IRawElementProviderSimple> group1_node =
+ QueryInterfaceFromNode<IRawElementProviderSimple>(
+ GetRootAsAXNode()->children()[3]);
+
+ std::vector<std::wstring> expected_names_3 = {L"text1"};
+ EXPECT_UIA_PROPERTY_ELEMENT_ARRAY_BSTR_EQ(
+ group1_node, UIA_ControllerForPropertyId, UIA_NamePropertyId,
+ expected_names_3);
}
TEST_F(AXPlatformNodeWinTest, UIAGetDescribedByPropertyId) {
@@ -5785,7 +5793,12 @@ TEST_F(AXPlatformNodeWinTest, ComputeUIAControlType) {
child6.role = ax::mojom::Role::kDialog;
root.child_ids.push_back(child6.id);
- Init(root, child1, child2, child3, child4, child5, child6);
+ AXNodeData child7;
+ child7.id = 8;
+ child7.role = ax::mojom::Role::kGraphicsObject;
+ root.child_ids.push_back(child7.id);
+
+ Init(root, child1, child2, child3, child4, child5, child6, child7);
EXPECT_UIA_INT_EQ(
QueryInterfaceFromNodeId<IRawElementProviderSimple>(child1.id),
@@ -5805,6 +5818,9 @@ TEST_F(AXPlatformNodeWinTest, ComputeUIAControlType) {
EXPECT_UIA_INT_EQ(
QueryInterfaceFromNodeId<IRawElementProviderSimple>(child6.id),
UIA_ControlTypePropertyId, int{UIA_WindowControlTypeId});
+ EXPECT_UIA_INT_EQ(
+ QueryInterfaceFromNodeId<IRawElementProviderSimple>(child7.id),
+ UIA_ControlTypePropertyId, int{UIA_GroupControlTypeId});
}
TEST_F(AXPlatformNodeWinTest, UIALandmarkType) {
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_win_unittest.h b/chromium/ui/accessibility/platform/ax_platform_node_win_unittest.h
index 2376d6bb2f8..085d6b3d55d 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_win_unittest.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node_win_unittest.h
@@ -134,7 +134,7 @@ class AXPlatformNodeWinTest : public AXPlatformNodeTest {
std::unique_ptr<AXFragmentRootWin> ax_fragment_root_;
std::unique_ptr<TestFragmentRootDelegate> test_fragment_root_delegate_;
- testing::ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior_;
+ ScopedAXEmbeddedObjectBehaviorSetter ax_embedded_object_behavior_;
base::test::ScopedFeatureList scoped_feature_list_;
};
diff --git a/chromium/ui/accessibility/platform/ax_platform_tree_manager.h b/chromium/ui/accessibility/platform/ax_platform_tree_manager.h
index 8d2944a433d..642104fa655 100644
--- a/chromium/ui/accessibility/platform/ax_platform_tree_manager.h
+++ b/chromium/ui/accessibility/platform/ax_platform_tree_manager.h
@@ -25,6 +25,11 @@ class AX_EXPORT AXPlatformTreeManager : public AXTreeManager {
// Returns an AXPlatformNode that corresponds to the given |node|.
virtual AXPlatformNode* GetPlatformNodeFromTree(const AXNode& node) const = 0;
+
+ protected:
+ explicit AXPlatformTreeManager(const AXTreeID& tree_id,
+ std::unique_ptr<AXTree> tree)
+ : AXTreeManager(tree_id, std::move(tree)) {}
};
} // namespace ui
diff --git a/chromium/ui/accessibility/platform/ax_unique_id.cc b/chromium/ui/accessibility/platform/ax_unique_id.cc
index cfb433a1280..08353303bf6 100644
--- a/chromium/ui/accessibility/platform/ax_unique_id.cc
+++ b/chromium/ui/accessibility/platform/ax_unique_id.cc
@@ -5,9 +5,9 @@
#include "ui/accessibility/platform/ax_unique_id.h"
#include <memory>
-#include <unordered_set>
#include "base/containers/contains.h"
+#include "base/containers/flat_set.h"
#include "base/lazy_instance.h"
#include "base/logging.h"
@@ -15,7 +15,7 @@ namespace ui {
namespace {
-base::LazyInstance<std::unordered_set<int32_t>>::Leaky g_assigned_ids =
+base::LazyInstance<base::flat_set<int32_t>>::Leaky g_assigned_ids =
LAZY_INSTANCE_INITIALIZER;
} // namespace
diff --git a/chromium/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.h b/chromium/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.h
index c42f3f4e77d..01fe3a72cbc 100644
--- a/chromium/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.h
+++ b/chromium/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.h
@@ -7,16 +7,13 @@
#include "base/memory/raw_ptr.h"
#include "ui/accessibility/ax_export.h"
-#include "ui/accessibility/platform/inspect/ax_optional.h"
#include "ui/accessibility/platform/inspect/ax_tree_indexer_mac.h"
namespace ui {
+class AXElementWrapper;
class AXPropertyNode;
-// Optional tri-state id object.
-using AXOptionalNSObject = AXOptional<id>;
-
// Invokes a script instruction describing a call unit which represents
// a sequence of calls.
class AX_EXPORT AXCallStatementInvoker final {
@@ -46,7 +43,7 @@ class AX_EXPORT AXCallStatementInvoker final {
// Invokes a property node for a given AXElement.
AXOptionalNSObject InvokeForAXElement(
- const id target,
+ const AXElementWrapper& ax_element,
const AXPropertyNode& property_node) const;
// Invokes a property node for a given AXTextMarkerRange.
@@ -65,7 +62,7 @@ class AX_EXPORT AXCallStatementInvoker final {
// Invokes setAccessibilityFocused method.
AXOptionalNSObject InvokeSetAccessibilityFocused(
- const id target,
+ const AXElementWrapper& ax_element,
const AXPropertyNode& property_node) const;
// Returns a parameterized attribute parameter by a property node representing
diff --git a/chromium/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.mm b/chromium/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.mm
index 060fad61719..41663d9127c 100644
--- a/chromium/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.mm
+++ b/chromium/ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.mm
@@ -6,6 +6,8 @@
#include "base/strings/sys_string_conversions.h"
#include "ui/accessibility/platform/ax_utils_mac.h"
+#include "ui/accessibility/platform/inspect/ax_element_wrapper_mac.h"
+#include "ui/accessibility/platform/inspect/ax_inspect_utils_mac.h"
#include "ui/accessibility/platform/inspect/ax_property_node.h"
namespace ui {
@@ -152,8 +154,8 @@ AXOptionalNSObject AXCallStatementInvoker::Invoke(
AXOptionalNSObject AXCallStatementInvoker::InvokeFor(
const id target,
const AXPropertyNode& property_node) const {
- if (IsNSAccessibilityElement(target) || IsAXUIElement(target))
- return InvokeForAXElement(target, property_node);
+ if (AXElementWrapper::IsValidElement(target))
+ return InvokeForAXElement({target}, property_node);
if (IsAXTextMarkerRange(target)) {
return InvokeForAXTextMarkerRange(target, property_node);
@@ -170,47 +172,48 @@ AXOptionalNSObject AXCallStatementInvoker::InvokeFor(
}
AXOptionalNSObject AXCallStatementInvoker::InvokeForAXElement(
- const id target,
+ const AXElementWrapper& ax_element,
const AXPropertyNode& property_node) const {
// Actions.
if (property_node.name_or_value == "AXActionNames") {
- return AXOptionalNSObject::NotNullOrNotApplicable(AXActionNamesOf(target));
+ return AXOptionalNSObject::NotNullOrNotApplicable(ax_element.ActionNames());
}
if (property_node.name_or_value == "AXPerformAction") {
AXOptionalNSObject param = ParamFrom(property_node);
if (param.IsNotNull()) {
- PerformAXAction(target, *param);
+ ax_element.PerformAction(*param);
return AXOptionalNSObject::Unsupported();
}
return AXOptionalNSObject::Error();
}
// Get or set attribute value if the attribute is supported.
- for (NSString* attribute : AXAttributeNamesOf(target)) {
+ for (NSString* attribute : ax_element.AttributeNames()) {
if (property_node.IsMatching(base::SysNSStringToUTF8(attribute))) {
// Setter
if (property_node.rvalue) {
AXOptionalNSObject rvalue = Invoke(*property_node.rvalue);
if (rvalue.IsNotNull()) {
- SetAXAttributeValueOf(target, attribute, *rvalue);
+ ax_element.SetAttributeValue(attribute, *rvalue);
return {rvalue};
}
return rvalue;
}
// Getter. Make sure to expose null values in ax scripts.
- id value = AXAttributeValueOf(target, attribute);
- return IsDumpingTree() ? AXOptionalNSObject::NotNullOrNotApplicable(value)
- : AXOptionalNSObject(value);
+ AXOptionalNSObject optional_value =
+ ax_element.GetAttributeValue(attribute);
+ return IsDumpingTree()
+ ? AXOptionalNSObject::NotNullOrNotApplicable(*optional_value)
+ : optional_value;
}
}
// Parameterized attributes.
- for (NSString* attribute : AXParameterizedAttributeNamesOf(target)) {
+ for (NSString* attribute : ax_element.ParameterizedAttributeNames()) {
if (property_node.IsMatching(base::SysNSStringToUTF8(attribute))) {
AXOptionalNSObject param = ParamFrom(property_node);
if (param.IsNotNull()) {
- return AXOptionalNSObject(
- AXParameterizedAttributeValueOf(target, attribute, *param));
+ return ax_element.GetParameterizedAttributeValue(attribute, *param);
}
return param;
}
@@ -240,33 +243,23 @@ AXOptionalNSObject AXCallStatementInvoker::InvokeForAXElement(
SEL selector =
NSSelectorFromString(base::SysUTF8ToNSString(selector_string));
- if (![target respondsToSelector:selector])
+ if (!ax_element.RespondsToSelector(selector))
return AXOptionalNSObject::Error();
- NSInvocation* invocation = [NSInvocation
- invocationWithMethodSignature:
- [[target class] instanceMethodSignatureForSelector:selector]];
- [invocation setSelector:selector];
- [invocation setTarget:target];
- if (optional_arg_selector) {
- // The target is at index 0 and the selector at index 1, so arguments
- // start at index 2.
- [invocation setArgument:&*optional_arg_selector atIndex:2];
- }
- [invocation invoke];
- BOOL return_value;
- [invocation getReturnValue:&return_value];
+ BOOL return_value =
+ optional_arg_selector
+ ? ax_element.Invoke<BOOL, SEL>(selector, *optional_arg_selector)
+ : ax_element.Invoke<BOOL>(selector);
return AXOptionalNSObject([NSNumber numberWithBool:return_value]);
}
if (property_node.name_or_value == "setAccessibilityFocused")
- return InvokeSetAccessibilityFocused(target, property_node);
+ return InvokeSetAccessibilityFocused(ax_element, property_node);
// accessibilityAttributeValue
if (property_node.name_or_value == "accessibilityAttributeValue") {
if (property_node.arguments.size() == 1) {
- return AXOptionalNSObject(AXAttributeValueOf(
- target,
+ return AXOptionalNSObject(ax_element.GetAttributeValue(
base::SysUTF8ToNSString(property_node.arguments[0].name_or_value)));
}
// Parameterized accessibilityAttributeValue.
@@ -277,8 +270,8 @@ AXOptionalNSObject AXCallStatementInvoker::InvokeForAXElement(
if (!param.HasValue())
return AXOptionalNSObject::Error();
- return AXOptionalNSObject(AXParameterizedAttributeValueOf(
- target, base::SysUTF8ToNSString(attribute), *param));
+ return AXOptionalNSObject(ax_element.GetParameterizedAttributeValue(
+ base::SysUTF8ToNSString(attribute), *param));
}
return AXOptionalNSObject::Error();
}
@@ -286,14 +279,15 @@ AXOptionalNSObject AXCallStatementInvoker::InvokeForAXElement(
if (base::StartsWith(property_node.name_or_value, "accessibility")) {
if (property_node.arguments.size() == 1) {
absl::optional<id> optional_id =
- PerformAXSelector(target, property_node.name_or_value,
- property_node.arguments[0].name_or_value);
+ ax_element.PerformSelector(property_node.name_or_value,
+ property_node.arguments[0].name_or_value);
if (optional_id) {
return AXOptionalNSObject(*optional_id);
}
}
if (property_node.arguments.empty()) {
- auto optional_id = PerformAXSelector(target, property_node.name_or_value);
+ auto optional_id =
+ ax_element.PerformSelector(property_node.name_or_value);
if (optional_id) {
return AXOptionalNSObject(*optional_id);
}
@@ -399,7 +393,7 @@ AXOptionalNSObject AXCallStatementInvoker::InvokeForDictionary(
}
AXOptionalNSObject AXCallStatementInvoker::InvokeSetAccessibilityFocused(
- const id target,
+ const AXElementWrapper& ax_element,
const AXPropertyNode& property_node) const {
std::string selector_string = property_node.name_or_value + ":";
if (property_node.arguments.size() != 1) {
@@ -410,24 +404,13 @@ AXOptionalNSObject AXCallStatementInvoker::InvokeSetAccessibilityFocused(
}
SEL selector = NSSelectorFromString(base::SysUTF8ToNSString(selector_string));
- if (![target respondsToSelector:selector]) {
+ if (!ax_element.RespondsToSelector(selector)) {
LOG(ERROR) << "Target doesn't answer to " << selector_string << " selector";
return AXOptionalNSObject::Error();
}
- NSInvocation* invocation = [NSInvocation
- invocationWithMethodSignature:
- [[target class] instanceMethodSignatureForSelector:selector]];
-
- [invocation setSelector:selector];
- [invocation setTarget:target];
-
- // The target is at index 0 and the selector at index 1, so arguments
- // start at index 2.
BOOL val = property_node.arguments[0].name_or_value == "FALSE" ? FALSE : TRUE;
- [invocation setArgument:&val atIndex:2];
- [invocation invoke];
-
+ ax_element.Invoke<void, BOOL>(selector, val);
return AXOptionalNSObject(nil);
}
diff --git a/chromium/ui/accessibility/platform/inspect/ax_element_wrapper_mac.h b/chromium/ui/accessibility/platform/inspect/ax_element_wrapper_mac.h
new file mode 100644
index 00000000000..e02150cb618
--- /dev/null
+++ b/chromium/ui/accessibility/platform/inspect/ax_element_wrapper_mac.h
@@ -0,0 +1,158 @@
+// 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_ACCESSIBILITY_PLATFORM_INSPECT_AX_ELEMENT_WRAPPER_MAC_H_
+#define UI_ACCESSIBILITY_PLATFORM_INSPECT_AX_ELEMENT_WRAPPER_MAC_H_
+
+#import <Cocoa/Cocoa.h>
+
+#include "base/callback_forward.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+#include "ui/accessibility/ax_export.h"
+#include "ui/accessibility/platform/inspect/ax_inspect.h"
+#include "ui/accessibility/platform/inspect/ax_optional.h"
+
+namespace ui {
+
+// Optional tri-state id object.
+using AXOptionalNSObject = AXOptional<id>;
+
+// A wrapper around AXUIElement or NSAccessibilityElement object.
+class AX_EXPORT AXElementWrapper final {
+ public:
+ // Returns true if the object is either NSAccessibilityElement or
+ // AXUIElement.
+ static bool IsValidElement(const id node);
+
+ // Return true if the object is internal BrowserAccessibilityCocoa.
+ static bool IsNSAccessibilityElement(const id node);
+
+ // Returns true if the object is AXUIElement.
+ static bool IsAXUIElement(const id node);
+
+ // Returns the children of an accessible object, either AXUIElement or
+ // BrowserAccessibilityCocoa.
+ static NSArray* ChildrenOf(const id node);
+
+ // Returns the DOM id of a given node (either AXUIElement or
+ // BrowserAccessibilityCocoa).
+ static std::string DOMIdOf(const id node);
+
+ AXElementWrapper(const id node) : node_(node){};
+
+ // Returns true if the object is either an NSAccessibilityElement or
+ // AXUIElement.
+ bool IsValidElement() const;
+
+ // Return true if the object is an internal BrowserAccessibilityCocoa.
+ bool IsNSAccessibilityElement() const;
+
+ // Returns true if the object is an AXUIElement.
+ bool IsAXUIElement() const;
+
+ // Returns the wrapped object.
+ id AsId() const;
+
+ // Returns the DOM id of the object.
+ std::string DOMId() const;
+
+ // Returns the children of the object.
+ NSArray* Children() const;
+
+ // Returns the AXSize and AXPosition attributes for the object.
+ NSSize Size() const;
+ NSPoint Position() const;
+
+ // Returns the (parameterized) attributes of the object.
+ NSArray* AttributeNames() const;
+ NSArray* ParameterizedAttributeNames() const;
+
+ // Returns (parameterized) attribute value on the object.
+ AXOptionalNSObject GetAttributeValue(NSString* attribute) const;
+ AXOptionalNSObject GetParameterizedAttributeValue(NSString* attribute,
+ id parameter) const;
+
+ // Performs the given selector on the object and returns the result. If
+ // the object does not conform to the NSAccessibility protocol or the selector
+ // is not found, then returns nullopt.
+ absl::optional<id> PerformSelector(const std::string& selector) const;
+
+ // Performs the given selector on the object with exactly one string
+ // argument and returns the result. If the object does not conform to the
+ // NSAccessibility protocol or the selector is not found, then returns
+ // nullopt.
+ absl::optional<id> PerformSelector(const std::string& selector_string,
+ const std::string& argument_string) const;
+
+ // Sets attribute value on the object.
+ void SetAttributeValue(NSString* attribute, id value) const;
+
+ // Returns the list of actions supported on the object.
+ NSArray* ActionNames() const;
+
+ // Performs the given action on the object.
+ void PerformAction(NSString* action) const;
+
+ // Returns true if the object responds to the given selector.
+ bool RespondsToSelector(SEL selector) const {
+ return [node_ respondsToSelector:selector];
+ }
+
+ // Invokes a method of the given signature.
+ template <typename ReturnType, typename... Args>
+ typename std::enable_if<!std::is_same<ReturnType, void>::value,
+ ReturnType>::type
+ Invoke(SEL selector, Args... args) const {
+ NSInvocation* invocation = InvokeInternal(selector, args...);
+ ReturnType return_value;
+ [invocation getReturnValue:&return_value];
+ return return_value;
+ }
+
+ template <typename ReturnType, typename... Args>
+ typename std::enable_if<std::is_same<ReturnType, void>::value, void>::type
+ Invoke(SEL selector, Args... args) const {
+ InvokeInternal(selector, args...);
+ }
+
+ private:
+ template <typename... Args>
+ NSInvocation* InvokeInternal(SEL selector, Args... args) const {
+ NSInvocation* invocation = [NSInvocation
+ invocationWithMethodSignature:
+ [[node_ class] instanceMethodSignatureForSelector:selector]];
+ [invocation setSelector:selector];
+ [invocation setTarget:node_];
+ SetInvocationArguments<Args...>(invocation, 2, args...);
+ [invocation invoke];
+ return invocation;
+ }
+
+ template <typename Arg, typename... Args>
+ void SetInvocationArguments(NSInvocation* invocation,
+ int argument_index,
+ Arg& arg,
+ Args&... args) const {
+ [invocation setArgument:&arg atIndex:argument_index];
+ SetInvocationArguments<Args...>(invocation, argument_index + 1, args...);
+ }
+
+ template <typename... Args>
+ void SetInvocationArguments(NSInvocation*, int) const {}
+
+ // Generates an error message from the given error.
+ std::string AXErrorMessage(AXError, const std::string& message) const;
+
+ // Returns true on success, otherwise returns false and logs error.
+ bool AXSuccess(AXError result, const std::string& message) const;
+
+ // Converts the given value and the error object into AXOptional object.
+ AXOptionalNSObject ToOptional(id, AXError, const std::string& message) const;
+
+ const id node_;
+};
+
+} // namespace ui
+
+#endif // UI_ACCESSIBILITY_PLATFORM_INSPECT_AX_ELEMENT_WRAPPER_MAC_H_
diff --git a/chromium/ui/accessibility/platform/inspect/ax_element_wrapper_mac.mm b/chromium/ui/accessibility/platform/inspect/ax_element_wrapper_mac.mm
new file mode 100644
index 00000000000..a8bb7e90298
--- /dev/null
+++ b/chromium/ui/accessibility/platform/inspect/ax_element_wrapper_mac.mm
@@ -0,0 +1,362 @@
+// 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/accessibility/platform/inspect/ax_element_wrapper_mac.h"
+
+#include <ostream>
+
+#include "base/callback.h"
+#include "base/containers/fixed_flat_set.h"
+#include "base/debug/stack_trace.h"
+#include "base/logging.h"
+#include "base/strings/pattern.h"
+#include "base/strings/sys_string_conversions.h"
+#include "ui/accessibility/platform/ax_private_attributes_mac.h"
+
+// error: 'accessibilityAttributeNames' is deprecated: first deprecated in
+// macOS 10.10 - Use the NSAccessibility protocol methods instead (see
+// NSAccessibilityProtocols.h
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+
+namespace ui {
+
+using base::SysNSStringToUTF8;
+
+constexpr char kUnsupportedObject[] =
+ "Only AXUIElementRef and BrowserAccessibilityCocoa are supported.";
+
+// static
+bool AXElementWrapper::IsValidElement(const id node) {
+ return AXElementWrapper(node).IsValidElement();
+}
+
+bool AXElementWrapper::IsNSAccessibilityElement(const id node) {
+ return AXElementWrapper(node).IsNSAccessibilityElement();
+}
+
+bool AXElementWrapper::IsAXUIElement(const id node) {
+ return AXElementWrapper(node).IsAXUIElement();
+}
+
+NSArray* AXElementWrapper::ChildrenOf(const id node) {
+ return AXElementWrapper(node).Children();
+}
+
+// Returns DOM id of a given node (either AXUIElement or
+// BrowserAccessibilityCocoa).
+std::string AXElementWrapper::DOMIdOf(const id node) {
+ return AXElementWrapper(node).DOMId();
+}
+
+bool AXElementWrapper::IsValidElement() const {
+ return IsNSAccessibilityElement() || IsAXUIElement();
+}
+
+bool AXElementWrapper::IsNSAccessibilityElement() const {
+ return [node_ isKindOfClass:[NSAccessibilityElement class]];
+}
+
+bool AXElementWrapper::IsAXUIElement() const {
+ return CFGetTypeID(node_) == AXUIElementGetTypeID();
+}
+
+id AXElementWrapper::AsId() const {
+ return node_;
+}
+
+std::string AXElementWrapper::DOMId() const {
+ const id domid_value =
+ *GetAttributeValue(base::SysUTF8ToNSString("AXDOMIdentifier"));
+ return base::SysNSStringToUTF8(static_cast<NSString*>(domid_value));
+}
+
+NSArray* AXElementWrapper::Children() const {
+ if (IsNSAccessibilityElement())
+ return [node_ children];
+
+ if (IsAXUIElement()) {
+ CFTypeRef children_ref;
+ if ((AXUIElementCopyAttributeValue(static_cast<AXUIElementRef>(node_),
+ kAXChildrenAttribute, &children_ref)) ==
+ kAXErrorSuccess)
+ return static_cast<NSArray*>(children_ref);
+ return nil;
+ }
+
+ NOTREACHED()
+ << "Only AXUIElementRef and BrowserAccessibilityCocoa are supported.";
+ return nil;
+}
+
+NSSize AXElementWrapper::Size() const {
+ if (IsNSAccessibilityElement()) {
+ return [node_ accessibilityFrame].size;
+ }
+
+ if (!IsAXUIElement()) {
+ NOTREACHED()
+ << "Only AXUIElementRef and BrowserAccessibilityCocoa are supported.";
+ return NSMakeSize(0, 0);
+ }
+
+ id value = *GetAttributeValue(NSAccessibilitySizeAttribute);
+ if (value && CFGetTypeID(value) == AXValueGetTypeID()) {
+ AXValueType type = AXValueGetType(static_cast<AXValueRef>(value));
+ if (type == kAXValueCGSizeType) {
+ NSSize size;
+ if (AXValueGetValue(static_cast<AXValueRef>(value), type, &size)) {
+ return size;
+ }
+ }
+ }
+ return NSMakeSize(0, 0);
+}
+
+NSPoint AXElementWrapper::Position() const {
+ if (IsNSAccessibilityElement()) {
+ return [node_ accessibilityFrame].origin;
+ }
+
+ if (!IsAXUIElement()) {
+ NOTREACHED()
+ << "Only AXUIElementRef and BrowserAccessibilityCocoa are supported.";
+ return NSMakePoint(0, 0);
+ }
+
+ id value = *GetAttributeValue(NSAccessibilityPositionAttribute);
+ if (value && CFGetTypeID(value) == AXValueGetTypeID()) {
+ AXValueType type = AXValueGetType(static_cast<AXValueRef>(value));
+ if (type == kAXValueCGPointType) {
+ NSPoint point;
+ if (AXValueGetValue(static_cast<AXValueRef>(value), type, &point)) {
+ return point;
+ }
+ }
+ }
+ return NSMakePoint(0, 0);
+}
+
+NSArray* AXElementWrapper::AttributeNames() const {
+ if (IsNSAccessibilityElement())
+ return [node_ accessibilityAttributeNames];
+
+ if (IsAXUIElement()) {
+ CFArrayRef attributes_ref;
+ AXError result = AXUIElementCopyAttributeNames(
+ static_cast<AXUIElementRef>(node_), &attributes_ref);
+ if (AXSuccess(result, "AXAttributeNamesOf"))
+ return static_cast<NSArray*>(attributes_ref);
+ return nil;
+ }
+
+ NOTREACHED()
+ << "Only AXUIElementRef and BrowserAccessibilityCocoa are supported.";
+ return nil;
+}
+
+NSArray* AXElementWrapper::ParameterizedAttributeNames() const {
+ if (IsNSAccessibilityElement())
+ return [node_ accessibilityParameterizedAttributeNames];
+
+ if (IsAXUIElement()) {
+ CFArrayRef attributes_ref;
+ AXError result = AXUIElementCopyParameterizedAttributeNames(
+ static_cast<AXUIElementRef>(node_), &attributes_ref);
+ if (AXSuccess(result, "AXParameterizedAttributeNamesOf"))
+ return static_cast<NSArray*>(attributes_ref);
+ return nil;
+ }
+
+ NOTREACHED()
+ << "Only AXUIElementRef and BrowserAccessibilityCocoa are supported.";
+ return nil;
+}
+
+AXOptionalNSObject AXElementWrapper::GetAttributeValue(
+ NSString* attribute) const {
+ if (IsNSAccessibilityElement())
+ return AXOptionalNSObject([node_ accessibilityAttributeValue:attribute]);
+
+ if (IsAXUIElement()) {
+ CFTypeRef value_ref;
+ AXError result = AXUIElementCopyAttributeValue(
+ static_cast<AXUIElementRef>(node_), static_cast<CFStringRef>(attribute),
+ &value_ref);
+ return ToOptional(
+ static_cast<id>(value_ref), result,
+ "AXGetAttributeValue(" + base::SysNSStringToUTF8(attribute) + ")");
+ }
+
+ return AXOptionalNSObject::Error(kUnsupportedObject);
+}
+
+AXOptionalNSObject AXElementWrapper::GetParameterizedAttributeValue(
+ NSString* attribute,
+ id parameter) const {
+ if (IsNSAccessibilityElement())
+ return AXOptionalNSObject([node_ accessibilityAttributeValue:attribute
+ forParameter:parameter]);
+
+ if (IsAXUIElement()) {
+ // Convert NSValue parameter to CFTypeRef if needed.
+ CFTypeRef parameter_ref = static_cast<CFTypeRef>(parameter);
+ if ([parameter isKindOfClass:[NSValue class]] &&
+ !strcmp([static_cast<NSValue*>(parameter) objCType],
+ @encode(NSRange))) {
+ NSRange range = [static_cast<NSValue*>(parameter) rangeValue];
+ parameter_ref = AXValueCreate(kAXValueTypeCFRange, &range);
+ }
+
+ // Get value.
+ CFTypeRef value_ref;
+ AXError result = AXUIElementCopyParameterizedAttributeValue(
+ static_cast<AXUIElementRef>(node_), static_cast<CFStringRef>(attribute),
+ parameter_ref, &value_ref);
+
+ return ToOptional(static_cast<id>(value_ref), result,
+ "GetParameterizedAttributeValue(" +
+ base::SysNSStringToUTF8(attribute) + ")");
+ }
+
+ return AXOptionalNSObject::Error(kUnsupportedObject);
+}
+
+absl::optional<id> AXElementWrapper::PerformSelector(
+ const std::string& selector_string) const {
+ if (![node_ conformsToProtocol:@protocol(NSAccessibility)])
+ return absl::nullopt;
+
+ NSString* selector_nsstring = base::SysUTF8ToNSString(selector_string);
+ SEL selector = NSSelectorFromString(selector_nsstring);
+
+ if ([node_ respondsToSelector:selector])
+ return [node_ valueForKey:selector_nsstring];
+ return absl::nullopt;
+}
+
+absl::optional<id> AXElementWrapper::PerformSelector(
+ const std::string& selector_string,
+ const std::string& argument_string) const {
+ if (![node_ conformsToProtocol:@protocol(NSAccessibility)])
+ return absl::nullopt;
+
+ SEL selector =
+ NSSelectorFromString(base::SysUTF8ToNSString(selector_string + ":"));
+ NSString* argument = base::SysUTF8ToNSString(argument_string);
+
+ if ([node_ respondsToSelector:selector])
+ return [node_ performSelector:selector withObject:argument];
+ return absl::nullopt;
+}
+
+void AXElementWrapper::SetAttributeValue(NSString* attribute, id value) const {
+ if (IsNSAccessibilityElement()) {
+ [node_ accessibilitySetValue:value forAttribute:attribute];
+ return;
+ }
+
+ if (IsAXUIElement()) {
+ AXUIElementSetAttributeValue(static_cast<AXUIElementRef>(node_),
+ static_cast<CFStringRef>(attribute),
+ static_cast<CFTypeRef>(value));
+ return;
+ }
+
+ NOTREACHED()
+ << "Only AXUIElementRef and BrowserAccessibilityCocoa are supported.";
+}
+
+NSArray* AXElementWrapper::ActionNames() const {
+ if (IsNSAccessibilityElement())
+ return [node_ accessibilityActionNames];
+
+ if (IsAXUIElement()) {
+ CFArrayRef attributes_ref;
+ if ((AXUIElementCopyActionNames(static_cast<AXUIElementRef>(node_),
+ &attributes_ref)) == kAXErrorSuccess)
+ return static_cast<NSArray*>(attributes_ref);
+ return nil;
+ }
+
+ NOTREACHED()
+ << "Only AXUIElementRef and BrowserAccessibilityCocoa are supported.";
+ return nil;
+}
+
+void AXElementWrapper::PerformAction(NSString* action) const {
+ if (IsNSAccessibilityElement()) {
+ [node_ accessibilityPerformAction:action];
+ return;
+ }
+
+ if (IsAXUIElement()) {
+ AXUIElementPerformAction(static_cast<AXUIElementRef>(node_),
+ static_cast<CFStringRef>(action));
+ return;
+ }
+
+ NOTREACHED()
+ << "Only AXUIElementRef and BrowserAccessibilityCocoa are supported.";
+}
+
+std::string AXElementWrapper::AXErrorMessage(AXError result,
+ const std::string& message) const {
+ if (result == kAXErrorSuccess) {
+ return {};
+ }
+
+ std::string error;
+ switch (result) {
+ case kAXErrorAttributeUnsupported:
+ error = "attribute unsupported";
+ break;
+ case kAXErrorParameterizedAttributeUnsupported:
+ error = "parameterized attribute unsupported";
+ break;
+ case kAXErrorNoValue:
+ error = "no value";
+ break;
+ case kAXErrorIllegalArgument:
+ error = "illegal argument";
+ break;
+ case kAXErrorInvalidUIElement:
+ error = "invalid UIElement";
+ break;
+ case kAXErrorCannotComplete:
+ error = "cannot complete";
+ break;
+ case kAXErrorNotImplemented:
+ error = "not implemented";
+ break;
+ default:
+ error = "unknown error";
+ break;
+ }
+ return {message + ": " + error};
+}
+
+bool AXElementWrapper::AXSuccess(AXError result,
+ const std::string& message) const {
+ std::string message_text = AXErrorMessage(result, message);
+ if (message_text.empty())
+ return true;
+
+ LOG(WARNING) << message_text;
+ return false;
+}
+
+AXOptionalNSObject AXElementWrapper::ToOptional(
+ id value,
+ AXError result,
+ const std::string& message) const {
+ if (result == kAXErrorSuccess)
+ return AXOptionalNSObject(value);
+
+ return AXOptionalNSObject::Error(AXErrorMessage(result, message));
+}
+
+} // namespace ui
+
+#pragma clang diagnostic pop
diff --git a/chromium/ui/accessibility/platform/inspect/ax_inspect_scenario.h b/chromium/ui/accessibility/platform/inspect/ax_inspect_scenario.h
index 3f870ae4872..5be2b665b22 100644
--- a/chromium/ui/accessibility/platform/inspect/ax_inspect_scenario.h
+++ b/chromium/ui/accessibility/platform/inspect/ax_inspect_scenario.h
@@ -10,6 +10,7 @@
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/accessibility/ax_export.h"
+#include "ui/accessibility/platform/inspect/ax_inspect.h"
namespace base {
class FilePath;
@@ -17,8 +18,6 @@ class FilePath;
namespace ui {
-struct AXPropertyFilter;
-struct AXNodeFilter;
class AXScriptInstruction;
// Describes the test execution flow, which is parsed from a sequence
diff --git a/chromium/ui/accessibility/platform/inspect/ax_inspect_utils_mac.h b/chromium/ui/accessibility/platform/inspect/ax_inspect_utils_mac.h
index e223ecc7e80..3d4fcae136d 100644
--- a/chromium/ui/accessibility/platform/inspect/ax_inspect_utils_mac.h
+++ b/chromium/ui/accessibility/platform/inspect/ax_inspect_utils_mac.h
@@ -16,97 +16,22 @@ using ui::AXTreeSelector;
namespace ui {
-//
// Returns true if the given accessibility attribute is valid, and could have
// been exposed on certain accessibility objects.
AX_EXPORT bool IsValidAXAttribute(const std::string& attribute);
-//
-// Return true if the given object is internal BrowserAccessibilityCocoa.
-AX_EXPORT bool IsNSAccessibilityElement(const id node);
-
-//
-// Returns true if the given object is AXUIElement.
-AX_EXPORT bool IsAXUIElement(const id node);
-
-//
-// Returns children of an accessible object, either AXUIElement or
-// BrowserAccessibilityCocoa.
-AX_EXPORT NSArray* AXChildrenOf(const id node);
-
-//
-// Returns AXSize and AXPosition attributes for an accessible object.
-AX_EXPORT NSSize AXSizeOf(const id node);
-AX_EXPORT NSPoint AXPositionOf(const id node);
-
-//
-// Returns (parameterized) attributes of an accessible object, (either
-// AXUIElement or BrowserAccessibilityCocoa).
-AX_EXPORT NSArray* AXAttributeNamesOf(const id node);
-AX_EXPORT NSArray* AXParameterizedAttributeNamesOf(const id node);
-
-//
-// Returns (parameterized) attribute value on a given node (either AXUIElement
-// or BrowserAccessibilityCocoa).
-AX_EXPORT id AXAttributeValueOf(const id node, NSString* attribute);
-AX_EXPORT id AXParameterizedAttributeValueOf(const id node,
- NSString* attribute,
- id parameter);
-
-//
-// Performs the given selector on the given node and returns the result. If
-// the node does not conform to the NSAccessibility protocol or the selector is
-// not found, then returns nullopt.
-AX_EXPORT absl::optional<id> PerformAXSelector(const id node,
- const std::string& selector);
-
-//
-// Performs the given selector on the given node with exactly one string
-// argument and returns the result. If the node does not conform to the
-// NSAccessibility protocol or the selector is not found, then returns nullopt.
-AX_EXPORT absl::optional<id> PerformAXSelector(
- const id node,
- const std::string& selector_string,
- const std::string& argument_string);
-
-//
-// Sets attribute value on a given node (either AXUIElement or
-// BrowserAccessibilityCocoa).
-AX_EXPORT void SetAXAttributeValueOf(const id node,
- NSString* attribute,
- id value);
-
-// Returns a list of actions supported on a given accessible node (either
-// AXUIElement or BrowserAccessibilityCocoa).
-AX_EXPORT NSArray* AXActionNamesOf(const id node);
-
-// Performs action on a given accessible node (either AXUIElement or
-// BrowserAccessibilityCocoa).
-AX_EXPORT void PerformAXAction(const id node, NSString* action);
-
-//
-// Returns DOM id of a given node (either AXUIElement or
-// BrowserAccessibilityCocoa).
-AX_EXPORT std::string GetDOMId(const id node);
-
-//
// Return AXElement in a tree by a given criteria.
using AXFindCriteria = base::RepeatingCallback<bool(const AXUIElementRef)>;
AX_EXPORT AXUIElementRef FindAXUIElement(const AXUIElementRef node,
const AXFindCriteria& criteria);
-//
// Returns AXUIElement and its application process id by a given tree selector.
AX_EXPORT std::pair<AXUIElementRef, int> FindAXUIElement(const AXTreeSelector&);
-//
// Returns AXUIElement for a window having title matching the given pattern.
AX_EXPORT AXUIElementRef FindAXWindowChild(AXUIElementRef parent,
const std::string& pattern);
-// Returns true on success, otherwise returns false and logs error.
-AX_EXPORT bool AXSuccess(AXError, const std::string& message);
-
} // namespace ui
#endif // UI_ACCESSIBILITY_PLATFORM_INSPECT_AX_INSPECT_UTILS_MAC_H_
diff --git a/chromium/ui/accessibility/platform/inspect/ax_inspect_utils_mac.mm b/chromium/ui/accessibility/platform/inspect/ax_inspect_utils_mac.mm
index 2a5a5b0f0a4..456192fdf02 100644
--- a/chromium/ui/accessibility/platform/inspect/ax_inspect_utils_mac.mm
+++ b/chromium/ui/accessibility/platform/inspect/ax_inspect_utils_mac.mm
@@ -8,10 +8,12 @@
#include "base/callback.h"
#include "base/containers/fixed_flat_set.h"
+#include "base/debug/stack_trace.h"
#include "base/logging.h"
#include "base/strings/pattern.h"
#include "base/strings/sys_string_conversions.h"
#include "ui/accessibility/platform/ax_private_attributes_mac.h"
+#include "ui/accessibility/platform/inspect/ax_element_wrapper_mac.h"
// error: 'accessibilityAttributeNames' is deprecated: first deprecated in
// macOS 10.10 - Use the NSAccessibility protocol methods instead (see
@@ -92,251 +94,12 @@ bool IsValidAXAttribute(const std::string& attribute) {
return kValidAttributes.contains(base::SysUTF8ToNSString(attribute));
}
-bool IsNSAccessibilityElement(const id node) {
- return [node isKindOfClass:[NSAccessibilityElement class]];
-}
-
-bool IsAXUIElement(const id node) {
- return CFGetTypeID(node) == AXUIElementGetTypeID();
-}
-
NSArray* AXChildrenOf(const id node) {
- if (IsNSAccessibilityElement(node))
- return [node children];
-
- if (IsAXUIElement(node)) {
- CFTypeRef children_ref;
- if ((AXUIElementCopyAttributeValue(static_cast<AXUIElementRef>(node),
- kAXChildrenAttribute, &children_ref)) ==
- kAXErrorSuccess)
- return static_cast<NSArray*>(children_ref);
- return nil;
- }
-
- NOTREACHED()
- << "Only AXUIElementRef and BrowserAccessibilityCocoa are supported.";
- return nil;
-}
-
-NSSize AXSizeOf(const id node) {
- if (IsNSAccessibilityElement(node)) {
- return [node accessibilityFrame].size;
- }
-
- if (!IsAXUIElement(node)) {
- NOTREACHED()
- << "Only AXUIElementRef and BrowserAccessibilityCocoa are supported.";
- return NSMakeSize(0, 0);
- }
-
- id value = AXAttributeValueOf(node, NSAccessibilitySizeAttribute);
- if (value && CFGetTypeID(value) == AXValueGetTypeID()) {
- AXValueType type = AXValueGetType(static_cast<AXValueRef>(value));
- if (type == kAXValueCGSizeType) {
- NSSize size;
- if (AXValueGetValue(static_cast<AXValueRef>(value), type, &size)) {
- return size;
- }
- }
- }
- return NSMakeSize(0, 0);
-}
-
-NSPoint AXPositionOf(const id node) {
- if (IsNSAccessibilityElement(node)) {
- return [node accessibilityFrame].origin;
- }
-
- if (!IsAXUIElement(node)) {
- NOTREACHED()
- << "Only AXUIElementRef and BrowserAccessibilityCocoa are supported.";
- return NSMakePoint(0, 0);
- }
-
- id value = AXAttributeValueOf(node, NSAccessibilityPositionAttribute);
- if (value && CFGetTypeID(value) == AXValueGetTypeID()) {
- AXValueType type = AXValueGetType(static_cast<AXValueRef>(value));
- if (type == kAXValueCGPointType) {
- NSPoint point;
- if (AXValueGetValue(static_cast<AXValueRef>(value), type, &point)) {
- return point;
- }
- }
- }
- return NSMakePoint(0, 0);
-}
-
-NSArray* AXAttributeNamesOf(const id node) {
- if (IsNSAccessibilityElement(node))
- return [node accessibilityAttributeNames];
-
- if (IsAXUIElement(node)) {
- CFArrayRef attributes_ref;
- AXError result = AXUIElementCopyAttributeNames(
- static_cast<AXUIElementRef>(node), &attributes_ref);
- if (AXSuccess(result, "AXAttributeNamesOf"))
- return static_cast<NSArray*>(attributes_ref);
- return nil;
- }
-
- NOTREACHED()
- << "Only AXUIElementRef and BrowserAccessibilityCocoa are supported.";
- return nil;
-}
-
-NSArray* AXParameterizedAttributeNamesOf(const id node) {
- if (IsNSAccessibilityElement(node))
- return [node accessibilityParameterizedAttributeNames];
-
- if (IsAXUIElement(node)) {
- CFArrayRef attributes_ref;
- AXError result = AXUIElementCopyParameterizedAttributeNames(
- static_cast<AXUIElementRef>(node), &attributes_ref);
- if (AXSuccess(result, "AXParameterizedAttributeNamesOf"))
- return static_cast<NSArray*>(attributes_ref);
- return nil;
- }
-
- NOTREACHED()
- << "Only AXUIElementRef and BrowserAccessibilityCocoa are supported.";
- return nil;
-}
-
-id AXAttributeValueOf(const id node, NSString* attribute) {
- if (IsNSAccessibilityElement(node))
- return [node accessibilityAttributeValue:attribute];
-
- if (IsAXUIElement(node)) {
- CFTypeRef value_ref;
- AXError result = AXUIElementCopyAttributeValue(
- static_cast<AXUIElementRef>(node), static_cast<CFStringRef>(attribute),
- &value_ref);
- if (AXSuccess(result, "AXAttributeValueOf(" +
- base::SysNSStringToUTF8(attribute) + ")"))
- return static_cast<id>(value_ref);
- return nil;
- }
-
- NOTREACHED()
- << "Only AXUIElementRef and BrowserAccessibilityCocoa are supported.";
- return nil;
-}
-
-id AXParameterizedAttributeValueOf(const id node,
- NSString* attribute,
- id parameter) {
- if (IsNSAccessibilityElement(node))
- return [node accessibilityAttributeValue:attribute forParameter:parameter];
-
- if (IsAXUIElement(node)) {
- // Convert NSValue parameter to CFTypeRef if needed.
- CFTypeRef parameter_ref = static_cast<CFTypeRef>(parameter);
- if ([parameter isKindOfClass:[NSValue class]] &&
- !strcmp([static_cast<NSValue*>(parameter) objCType],
- @encode(NSRange))) {
- NSRange range = [static_cast<NSValue*>(parameter) rangeValue];
- parameter_ref = AXValueCreate(kAXValueTypeCFRange, &range);
- }
-
- // Get value.
- CFTypeRef value_ref;
- AXError result = AXUIElementCopyParameterizedAttributeValue(
- static_cast<AXUIElementRef>(node), static_cast<CFStringRef>(attribute),
- parameter_ref, &value_ref);
- if (AXSuccess(result, "AXParameterizedAttributeValueOf(" +
- base::SysNSStringToUTF8(attribute) + ")"))
- return static_cast<id>(value_ref);
-
- return nil;
- }
-
- NOTREACHED()
- << "Only AXUIElementRef and BrowserAccessibilityCocoa are supported.";
- return nil;
-}
-
-absl::optional<id> PerformAXSelector(const id node,
- const std::string& selector_string) {
- if (![node conformsToProtocol:@protocol(NSAccessibility)])
- return absl::nullopt;
-
- NSString* selector_nsstring = base::SysUTF8ToNSString(selector_string);
- SEL selector = NSSelectorFromString(selector_nsstring);
-
- if ([node respondsToSelector:selector])
- return [node valueForKey:selector_nsstring];
- return absl::nullopt;
-}
-
-absl::optional<id> PerformAXSelector(const id node,
- const std::string& selector_string,
- const std::string& argument_string) {
- if (![node conformsToProtocol:@protocol(NSAccessibility)])
- return absl::nullopt;
-
- SEL selector =
- NSSelectorFromString(base::SysUTF8ToNSString(selector_string + ":"));
- NSString* argument = base::SysUTF8ToNSString(argument_string);
-
- if ([node respondsToSelector:selector])
- return [node performSelector:selector withObject:argument];
- return absl::nullopt;
-}
-
-void SetAXAttributeValueOf(const id node, NSString* attribute, id value) {
- if (IsNSAccessibilityElement(node)) {
- [node accessibilitySetValue:value forAttribute:attribute];
- return;
- }
-
- if (IsAXUIElement(node)) {
- AXUIElementSetAttributeValue(static_cast<AXUIElementRef>(node),
- static_cast<CFStringRef>(attribute),
- static_cast<CFTypeRef>(value));
- return;
- }
-
- NOTREACHED()
- << "Only AXUIElementRef and BrowserAccessibilityCocoa are supported.";
-}
-
-NSArray* AXActionNamesOf(const id node) {
- if (IsNSAccessibilityElement(node))
- return [node accessibilityActionNames];
-
- if (IsAXUIElement(node)) {
- CFArrayRef attributes_ref;
- if ((AXUIElementCopyActionNames(static_cast<AXUIElementRef>(node),
- &attributes_ref)) == kAXErrorSuccess)
- return static_cast<NSArray*>(attributes_ref);
- return nil;
- }
-
- NOTREACHED()
- << "Only AXUIElementRef and BrowserAccessibilityCocoa are supported.";
- return nil;
-}
-
-void PerformAXAction(const id node, NSString* action) {
- if (IsNSAccessibilityElement(node)) {
- [node accessibilityPerformAction:action];
- return;
- }
-
- if (IsAXUIElement(node)) {
- AXUIElementPerformAction(static_cast<AXUIElementRef>(node),
- static_cast<CFStringRef>(action));
- return;
- }
-
- NOTREACHED()
- << "Only AXUIElementRef and BrowserAccessibilityCocoa are supported.";
+ return AXElementWrapper(node).Children();
}
std::string GetDOMId(const id node) {
- const id domid_value =
- AXAttributeValueOf(node, base::SysUTF8ToNSString("AXDOMIdentifier"));
- return base::SysNSStringToUTF8(static_cast<NSString*>(domid_value));
+ return AXElementWrapper(node).DOMId();
}
AXUIElementRef FindAXUIElement(const AXUIElementRef node,
@@ -408,8 +171,9 @@ std::pair<AXUIElementRef, int> FindAXUIElement(const AXTreeSelector& selector) {
node, base::BindRepeating([](const AXUIElementRef node) {
// Only active tab in exposed in browsers, thus find first
// AXWebArea role.
- NSString* role = AXAttributeValueOf(static_cast<id>(node),
- NSAccessibilityRoleAttribute);
+ AXElementWrapper ax_node(static_cast<id>(node));
+ NSString* role =
+ *ax_node.GetAttributeValue(NSAccessibilityRoleAttribute);
return SysNSStringToUTF8(role) == "AXWebArea";
}));
}
@@ -428,54 +192,20 @@ AXUIElementRef FindAXWindowChild(AXUIElementRef parent,
return nil;
id window = [children objectAtIndex:0];
- NSString* role = AXAttributeValueOf(window, NSAccessibilityRoleAttribute);
+
+ AXElementWrapper ax_window(window);
+ NSString* role = *ax_window.GetAttributeValue(NSAccessibilityRoleAttribute);
if (SysNSStringToUTF8(role) != "AXWindow")
return nil;
NSString* window_title =
- AXAttributeValueOf(window, NSAccessibilityTitleAttribute);
+ *ax_window.GetAttributeValue(NSAccessibilityTitleAttribute);
if (base::MatchPattern(SysNSStringToUTF8(window_title), pattern))
return static_cast<AXUIElementRef>(window);
return nil;
}
-AX_EXPORT bool AXSuccess(AXError result, const std::string& message) {
- if (result == kAXErrorSuccess) {
- return true;
- }
-
- std::string error;
- switch (result) {
- case kAXErrorAttributeUnsupported:
- error = "attribute unsupported";
- break;
- case kAXErrorParameterizedAttributeUnsupported:
- error = "parameterized attribute unsupported";
- break;
- case kAXErrorNoValue:
- error = "no value";
- break;
- case kAXErrorIllegalArgument:
- error = "illegal argument";
- break;
- case kAXErrorInvalidUIElement:
- error = "invalid UIElement";
- break;
- case kAXErrorCannotComplete:
- error = "cannot complete";
- break;
- case kAXErrorNotImplemented:
- error = "not implemented";
- break;
- default:
- error = "unknown error";
- break;
- }
- LOG(WARNING) << message << ": " << error;
- return false;
-}
-
} // namespace ui
#pragma clang diagnostic pop
diff --git a/chromium/ui/accessibility/platform/inspect/ax_optional.h b/chromium/ui/accessibility/platform/inspect/ax_optional.h
index da0c195c607..aeb622c9efa 100644
--- a/chromium/ui/accessibility/platform/inspect/ax_optional.h
+++ b/chromium/ui/accessibility/platform/inspect/ax_optional.h
@@ -18,7 +18,12 @@ template <typename ValueType>
class AX_EXPORT AXOptional final {
public:
static constexpr AXOptional Unsupported() { return AXOptional(kUnsupported); }
- static constexpr AXOptional Error() { return AXOptional(kError); }
+ static constexpr AXOptional Error(const char* error_text = nullptr) {
+ return error_text ? AXOptional(kError, error_text) : AXOptional(kError);
+ }
+ static constexpr AXOptional Error(const std::string& error_text) {
+ return AXOptional(kError, error_text);
+ }
static constexpr AXOptional NotApplicable() {
return AXOptional(kNotApplicable);
}
@@ -31,11 +36,11 @@ class AX_EXPORT AXOptional final {
}
explicit constexpr AXOptional(ValueType value_)
- : value_(value_), flag_(kValue) {}
+ : value_(value_), state_(kValue) {}
- bool constexpr IsUnsupported() const { return flag_ == kUnsupported; }
- bool constexpr IsNotApplicable() const { return flag_ == kNotApplicable; }
- bool constexpr IsError() const { return flag_ == kError; }
+ bool constexpr IsUnsupported() const { return state_ == kUnsupported; }
+ bool constexpr IsNotApplicable() const { return state_ == kNotApplicable; }
+ bool constexpr IsError() const { return state_ == kError; }
template <typename T = ValueType>
bool constexpr IsNotNull(
@@ -49,9 +54,12 @@ class AX_EXPORT AXOptional final {
return true;
}
- bool constexpr HasValue() { return flag_ == kValue; }
+ bool constexpr HasValue() { return state_ == kValue; }
constexpr const ValueType& operator*() const { return value_; }
+ bool HasStateText() const { return !state_text_.empty(); }
+ std::string StateText() const { return state_text_; }
+
std::string ToString() const {
if (IsNotNull())
return "<value>";
@@ -85,12 +93,14 @@ class AX_EXPORT AXOptional final {
kUnsupported,
};
- explicit constexpr AXOptional(State flag_) : value_(nullptr), flag_(flag_) {}
- explicit constexpr AXOptional(ValueType value_, State flag_)
- : value_(value_), flag_(flag_) {}
+ explicit constexpr AXOptional(State state, const std::string& state_text = {})
+ : value_(nullptr), state_(state), state_text_(state_text) {}
+ explicit constexpr AXOptional(ValueType value, State state)
+ : value_(value), state_(state) {}
ValueType value_;
- State flag_;
+ State state_;
+ std::string state_text_;
};
} // namespace ui
diff --git a/chromium/ui/accessibility/platform/inspect/ax_property_node.h b/chromium/ui/accessibility/platform/inspect/ax_property_node.h
index 64d34d1b2fd..ade1520c6b9 100644
--- a/chromium/ui/accessibility/platform/inspect/ax_property_node.h
+++ b/chromium/ui/accessibility/platform/inspect/ax_property_node.h
@@ -5,7 +5,9 @@
#ifndef UI_ACCESSIBILITY_PLATFORM_INSPECT_AX_PROPERTY_NODE_H_
#define UI_ACCESSIBILITY_PLATFORM_INSPECT_AX_PROPERTY_NODE_H_
+#include <memory>
#include <string>
+#include <utility>
#include <vector>
#include "third_party/abseil-cpp/absl/types/optional.h"
diff --git a/chromium/ui/accessibility/platform/inspect/ax_transform_mac.mm b/chromium/ui/accessibility/platform/inspect/ax_transform_mac.mm
index 7cb34e119cd..397f01d7249 100644
--- a/chromium/ui/accessibility/platform/inspect/ax_transform_mac.mm
+++ b/chromium/ui/accessibility/platform/inspect/ax_transform_mac.mm
@@ -11,6 +11,7 @@
#include "ui/accessibility/platform/ax_platform_node_delegate.h"
#include "ui/accessibility/platform/ax_platform_tree_manager.h"
#include "ui/accessibility/platform/ax_utils_mac.h"
+#include "ui/accessibility/platform/inspect/ax_element_wrapper_mac.h"
#include "ui/accessibility/platform/inspect/ax_inspect_utils.h"
namespace ui {
@@ -96,7 +97,7 @@ base::Value AXNSObjectToBaseValue(id value, const AXTreeIndexerMac* indexer) {
return AXTextMarkerRangeToBaseValue(value, indexer);
// Accessible object
- if (IsNSAccessibilityElement(value) || IsAXUIElement(value)) {
+ if (AXElementWrapper::IsValidElement(value)) {
return AXElementToBaseValue(value, indexer);
}
@@ -115,8 +116,8 @@ base::Value AXPositionToBaseValue(
if (position->IsNullPosition())
return AXNilToBaseValue();
- const AXPlatformTreeManager* manager = static_cast<AXPlatformTreeManager*>(
- AXTreeManagerMap::GetInstance().GetManager(position->tree_id()));
+ const AXPlatformTreeManager* manager =
+ static_cast<AXPlatformTreeManager*>(position->GetManager());
if (!manager)
return AXNilToBaseValue();
diff --git a/chromium/ui/accessibility/platform/inspect/ax_tree_formatter_mac.h b/chromium/ui/accessibility/platform/inspect/ax_tree_formatter_mac.h
index f011ed090c6..819f3ee5719 100644
--- a/chromium/ui/accessibility/platform/inspect/ax_tree_formatter_mac.h
+++ b/chromium/ui/accessibility/platform/inspect/ax_tree_formatter_mac.h
@@ -46,12 +46,12 @@ class AX_EXPORT AXTreeFormatterMac : public AXTreeFormatterBase {
base::Value BuildTree(const id root) const;
base::Value BuildTreeForAXUIElement(AXUIElementRef node) const;
- void RecursiveBuildTree(const id node,
+ void RecursiveBuildTree(const AXElementWrapper& ax_element,
const NSRect& root_rect,
const AXTreeIndexerMac* indexer,
base::Value* dict) const;
- void AddProperties(const id node,
+ void AddProperties(const AXElementWrapper& ax_element,
const NSRect& root_rect,
const AXTreeIndexerMac* indexer,
base::Value* dict) const;
@@ -62,7 +62,7 @@ class AX_EXPORT AXTreeFormatterMac : public AXTreeFormatterBase {
const AXPropertyNode& property_node,
const AXTreeIndexerMac* indexer) const;
- base::Value PopulateLocalPosition(const id node,
+ base::Value PopulateLocalPosition(const AXElementWrapper& ax_element,
const NSRect& root_rect) const;
std::string ProcessTreeForOutput(
diff --git a/chromium/ui/accessibility/platform/inspect/ax_tree_formatter_mac.mm b/chromium/ui/accessibility/platform/inspect/ax_tree_formatter_mac.mm
index c40fbd7a50d..b224dc70a34 100644
--- a/chromium/ui/accessibility/platform/inspect/ax_tree_formatter_mac.mm
+++ b/chromium/ui/accessibility/platform/inspect/ax_tree_formatter_mac.mm
@@ -11,6 +11,7 @@
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "ui/accessibility/platform/ax_platform_node_cocoa.h"
+#include "ui/accessibility/platform/inspect/ax_element_wrapper_mac.h"
#include "ui/accessibility/platform/inspect/ax_inspect_scenario.h"
#include "ui/accessibility/platform/inspect/ax_inspect_utils.h"
#include "ui/accessibility/platform/inspect/ax_inspect_utils_mac.h"
@@ -32,10 +33,11 @@ namespace ui {
namespace {
-const char kLocalPositionDictAttr[] = "LocalPosition";
+constexpr char kLocalPositionDictAttr[] = "LocalPosition";
-const char kFailedToParseError[] = "_const_ERROR:FAILED_TO_PARSE";
-const char kNotApplicable[] = "_const_n/a";
+constexpr char kFailedPrefix[] = "_const_ERROR:";
+constexpr char kFailedToParseError[] = "_const_ERROR:FAILED_TO_PARSE";
+constexpr char kNotApplicable[] = "_const_n/a";
} // namespace
@@ -85,11 +87,12 @@ base::Value AXTreeFormatterMac::BuildTree(const id root) const {
AXTreeIndexerMac indexer(root);
base::Value dict(base::Value::Type::DICTIONARY);
- NSPoint position = AXPositionOf(root);
- NSSize size = AXSizeOf(root);
+ AXElementWrapper ax_element(root);
+ NSPoint position = ax_element.Position();
+ NSSize size = ax_element.Size();
NSRect rect = NSMakeRect(position.x, position.y, size.width, size.height);
- RecursiveBuildTree(root, rect, &indexer, &dict);
+ RecursiveBuildTree(ax_element, rect, &indexer, &dict);
return dict;
}
@@ -142,7 +145,9 @@ std::string AXTreeFormatterMac::EvaluateScript(
base::Value result;
if (value.IsError()) {
- result = base::Value(kFailedToParseError);
+ result = value.HasStateText()
+ ? base::Value(kFailedPrefix + value.StateText())
+ : base::Value(kFailedToParseError);
} else if (value.IsNotApplicable()) {
result = base::Value(kNotApplicable);
} else {
@@ -172,61 +177,64 @@ base::Value AXTreeFormatterMac::BuildNode(const id node) const {
AXTreeIndexerMac indexer(node);
base::Value dict(base::Value::Type::DICTIONARY);
- NSPoint position = AXPositionOf(node);
- NSSize size = AXSizeOf(node);
+ AXElementWrapper ax_element(node);
+ NSPoint position = ax_element.Position();
+ NSSize size = ax_element.Size();
NSRect rect = NSMakeRect(position.x, position.y, size.width, size.height);
- AddProperties(node, rect, &indexer, &dict);
+ AddProperties(ax_element, rect, &indexer, &dict);
return dict;
}
-void AXTreeFormatterMac::RecursiveBuildTree(const id node,
+void AXTreeFormatterMac::RecursiveBuildTree(const AXElementWrapper& ax_element,
const NSRect& root_rect,
const AXTreeIndexerMac* indexer,
base::Value* dict) const {
- AXPlatformNodeDelegate* platform_node =
- IsNSAccessibilityElement(node) ? [node nodeDelegate] : nullptr;
+ AXPlatformNodeDelegate* platform_node = ax_element.IsNSAccessibilityElement()
+ ? [ax_element.AsId() nodeDelegate]
+ : nullptr;
if (platform_node && !ShouldDumpNode(*platform_node))
return;
- AddProperties(node, root_rect, indexer, dict);
+ AddProperties(ax_element, root_rect, indexer, dict);
if (platform_node && !ShouldDumpChildren(*platform_node))
return;
- NSArray* children = AXChildrenOf(node);
+ NSArray* children = ax_element.Children();
base::Value child_dict_list(base::Value::Type::LIST);
for (id child in children) {
base::Value child_dict(base::Value::Type::DICTIONARY);
- RecursiveBuildTree(child, root_rect, indexer, &child_dict);
+ RecursiveBuildTree({child}, root_rect, indexer, &child_dict);
child_dict_list.Append(std::move(child_dict));
}
dict->SetPath(kChildrenDictAttr, std::move(child_dict_list));
}
-void AXTreeFormatterMac::AddProperties(const id node,
+void AXTreeFormatterMac::AddProperties(const AXElementWrapper& ax_element,
const NSRect& root_rect,
const AXTreeIndexerMac* indexer,
base::Value* dict) const {
// Chromium special attributes.
- dict->SetPath(kLocalPositionDictAttr, PopulateLocalPosition(node, root_rect));
+ dict->SetPath(kLocalPositionDictAttr,
+ PopulateLocalPosition(ax_element, root_rect));
// Dump all attributes if match-all filter is specified.
if (HasMatchAllPropertyFilter()) {
- NSArray* attributes = AXAttributeNamesOf(node);
+ NSArray* attributes = ax_element.AttributeNames();
for (NSString* attribute : attributes) {
- dict->SetPath(
- SysNSStringToUTF8(attribute),
- AXNSObjectToBaseValue(AXAttributeValueOf(node, attribute), indexer));
+ dict->SetPath(SysNSStringToUTF8(attribute),
+ AXNSObjectToBaseValue(
+ *ax_element.GetAttributeValue(attribute), indexer));
}
return;
}
// Otherwise dump attributes matching allow filters only.
- std::string line_index = indexer->IndexBy(node);
+ std::string line_index = indexer->IndexBy(ax_element.AsId());
for (const AXPropertyNode& property_node :
PropertyFilterNodesFor(line_index)) {
- AXCallStatementInvoker invoker(node, indexer);
+ AXCallStatementInvoker invoker(ax_element.AsId(), indexer);
AXOptionalNSObject value = invoker.Invoke(property_node);
if (value.IsNotApplicable() || value.IsUnsupported()) {
continue;
@@ -242,7 +250,7 @@ void AXTreeFormatterMac::AddProperties(const id node,
}
base::Value AXTreeFormatterMac::PopulateLocalPosition(
- const id node,
+ const AXElementWrapper& ax_element,
const NSRect& root_rect) const {
// The NSAccessibility position of an object is in global coordinates and
// based on the lower-left corner of the object. To make this easier and
@@ -251,8 +259,8 @@ base::Value AXTreeFormatterMac::PopulateLocalPosition(
int root_top = -static_cast<int>(root_rect.origin.y + root_rect.size.height);
int root_left = static_cast<int>(root_rect.origin.x);
- NSPoint node_position = AXPositionOf(node);
- NSSize node_size = AXSizeOf(node);
+ NSPoint node_position = ax_element.Position();
+ NSSize node_size = ax_element.Size();
return AXNSPointToBaseValue(NSMakePoint(
static_cast<int>(node_position.x - root_left),
diff --git a/chromium/ui/accessibility/platform/inspect/ax_tree_indexer_mac.h b/chromium/ui/accessibility/platform/inspect/ax_tree_indexer_mac.h
index 6f9e8eb0cac..bd5904a55e5 100644
--- a/chromium/ui/accessibility/platform/inspect/ax_tree_indexer_mac.h
+++ b/chromium/ui/accessibility/platform/inspect/ax_tree_indexer_mac.h
@@ -5,7 +5,7 @@
#ifndef UI_ACCESSIBILITY_PLATFORM_INSPECT_AX_TREE_INDEXER_MAC_H_
#define UI_ACCESSIBILITY_PLATFORM_INSPECT_AX_TREE_INDEXER_MAC_H_
-#include "ui/accessibility/platform/inspect/ax_inspect_utils_mac.h"
+#include "ui/accessibility/platform/inspect/ax_element_wrapper_mac.h"
#include "ui/accessibility/platform/inspect/ax_tree_indexer.h"
namespace ui {
@@ -15,12 +15,12 @@ namespace ui {
struct AXNodeComparator {
constexpr bool operator()(const gfx::NativeViewAccessible& lhs,
const gfx::NativeViewAccessible& rhs) const {
- if (IsAXUIElement(lhs)) {
- DCHECK(IsAXUIElement(rhs));
+ if (AXElementWrapper::IsAXUIElement(lhs)) {
+ DCHECK(AXElementWrapper::IsAXUIElement(rhs));
return CFHash(lhs) < CFHash(rhs);
}
- DCHECK(IsNSAccessibilityElement(lhs));
- DCHECK(IsNSAccessibilityElement(rhs));
+ DCHECK(AXElementWrapper::IsNSAccessibilityElement(lhs));
+ DCHECK(AXElementWrapper::IsNSAccessibilityElement(rhs));
return lhs < rhs;
}
};
@@ -28,9 +28,9 @@ struct AXNodeComparator {
//
// NSAccessibility tree indexer.
using AXTreeIndexerMac = AXTreeIndexer<const gfx::NativeViewAccessible,
- GetDOMId,
+ AXElementWrapper::DOMIdOf,
NSArray*,
- AXChildrenOf,
+ AXElementWrapper::ChildrenOf,
AXNodeComparator>;
} // namespace ui
diff --git a/chromium/ui/accessibility/platform/test_ax_tree_update.cc b/chromium/ui/accessibility/platform/test_ax_tree_update.cc
new file mode 100644
index 00000000000..5a021738ea1
--- /dev/null
+++ b/chromium/ui/accessibility/platform/test_ax_tree_update.cc
@@ -0,0 +1,56 @@
+// 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/accessibility/platform/test_ax_tree_update.h"
+
+namespace ui {
+
+TestAXTreeUpdateNode::TestAXTreeUpdateNode(const TestAXTreeUpdateNode&) =
+ default;
+
+TestAXTreeUpdateNode::TestAXTreeUpdateNode(TestAXTreeUpdateNode&&) = default;
+
+TestAXTreeUpdateNode::~TestAXTreeUpdateNode() = default;
+
+TestAXTreeUpdateNode::TestAXTreeUpdateNode(
+ ax::mojom::Role role,
+ const std::vector<TestAXTreeUpdateNode>& children)
+ : children(children) {
+ DCHECK_NE(role, ax::mojom::Role::kUnknown);
+ data.role = role;
+}
+
+TestAXTreeUpdateNode::TestAXTreeUpdateNode(
+ ax::mojom::Role role,
+ ax::mojom::State state,
+ const std::vector<TestAXTreeUpdateNode>& children)
+ : children(children) {
+ DCHECK_NE(role, ax::mojom::Role::kUnknown);
+ DCHECK_NE(state, ax::mojom::State::kNone);
+ data.role = role;
+ data.AddState(state);
+}
+
+TestAXTreeUpdateNode::TestAXTreeUpdateNode(const std::string& text) {
+ data.role = ax::mojom::Role::kStaticText;
+ data.SetName(text);
+}
+
+TestAXTreeUpdate::TestAXTreeUpdate(const TestAXTreeUpdateNode& root) {
+ root_id = SetSubtree(root);
+}
+
+AXNodeID TestAXTreeUpdate::SetSubtree(const TestAXTreeUpdateNode& node) {
+ size_t node_index = nodes.size();
+ nodes.push_back(node.data);
+ nodes[node_index].id = node_index + 1;
+ std::vector<AXNodeID> child_ids;
+ for (const auto& child : node.children) {
+ child_ids.push_back(SetSubtree(child));
+ }
+ nodes[node_index].child_ids = child_ids;
+ return nodes[node_index].id;
+}
+
+} // namespace ui
diff --git a/chromium/ui/accessibility/platform/test_ax_tree_update.h b/chromium/ui/accessibility/platform/test_ax_tree_update.h
new file mode 100644
index 00000000000..41878fa0920
--- /dev/null
+++ b/chromium/ui/accessibility/platform/test_ax_tree_update.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 UI_ACCESSIBILITY_PLATFORM_TEST_AX_TREE_UPDATE_H_
+#define UI_ACCESSIBILITY_PLATFORM_TEST_AX_TREE_UPDATE_H_
+
+#include "ui/accessibility/ax_tree_update.h"
+
+namespace ui {
+
+// These utility classes, help construct an AXTreeUpdate together with all of
+// the updated nodes more easily. Only for use in tests for constructing /
+// updating simple accessibility trees.
+
+// Used to construct AXTreeUpdate node.
+struct TestAXTreeUpdateNode {
+ TestAXTreeUpdateNode() = delete;
+ ~TestAXTreeUpdateNode();
+
+ TestAXTreeUpdateNode(const TestAXTreeUpdateNode&);
+ TestAXTreeUpdateNode(TestAXTreeUpdateNode&&);
+
+ TestAXTreeUpdateNode(ax::mojom::Role role,
+ const std::vector<TestAXTreeUpdateNode>& children);
+ TestAXTreeUpdateNode(ax::mojom::Role role,
+ ax::mojom::State state,
+ const std::vector<TestAXTreeUpdateNode>& children);
+ TestAXTreeUpdateNode(const std::string& text);
+
+ AXNodeData data;
+ std::vector<TestAXTreeUpdateNode> children;
+};
+
+// Used to construct an accessible tree from a hierarchical list of nodes
+// {<node_properties>, {<node_children>}}. For example,
+// {Role::kRootWebArea, {"text"}} will create the following tree:
+// kRootWebArea
+// ++kStaticText "text"
+class TestAXTreeUpdate final : public AXTreeUpdate {
+ public:
+ TestAXTreeUpdate(const TestAXTreeUpdateNode& root);
+
+ TestAXTreeUpdate(const TestAXTreeUpdate&) = delete;
+ TestAXTreeUpdate& operator=(const TestAXTreeUpdate&) = delete;
+
+ private:
+ // Recursively creates the tree update structure.
+ AXNodeID SetSubtree(const TestAXTreeUpdateNode& node);
+};
+
+} // namespace ui
+
+#endif // UI_ACCESSIBILITY_PLATFORM_TEST_AX_TREE_UPDATE_H_
diff --git a/chromium/ui/accessibility/test_ax_tree_manager.cc b/chromium/ui/accessibility/test_ax_tree_manager.cc
index 5ee1750a265..392ba9146ff 100644
--- a/chromium/ui/accessibility/test_ax_tree_manager.cc
+++ b/chromium/ui/accessibility/test_ax_tree_manager.cc
@@ -13,93 +13,66 @@ namespace ui {
TestAXTreeManager::TestAXTreeManager() = default;
TestAXTreeManager::TestAXTreeManager(std::unique_ptr<AXTree> tree)
- : tree_(std::move(tree)) {
- if (tree_)
- AXTreeManagerMap::GetInstance().AddTreeManager(GetTreeID(), this);
-}
+ : AXTreeManager(std::move(tree)) {}
TestAXTreeManager::TestAXTreeManager(TestAXTreeManager&& manager)
- : tree_(std::move(manager.tree_)) {
- if (tree_) {
- AXTreeManagerMap::GetInstance().RemoveTreeManager(GetTreeID());
- AXTreeManagerMap::GetInstance().AddTreeManager(GetTreeID(), this);
+ : AXTreeManager(std::move(manager.ax_tree_)) {
+ if (ax_tree_) {
+ GetMap().RemoveTreeManager(GetTreeID());
+ GetMap().AddTreeManager(GetTreeID(), this);
}
}
TestAXTreeManager& TestAXTreeManager::operator=(TestAXTreeManager&& manager) {
if (this == &manager)
return *this;
- if (manager.tree_)
- AXTreeManagerMap::GetInstance().RemoveTreeManager(manager.GetTreeID());
+ if (manager.ax_tree_)
+ GetMap().RemoveTreeManager(manager.GetTreeID());
// std::move(nullptr) == nullptr, so no need to check if `manager.tree_` is
// assigned.
- SetTree(std::move(manager.tree_));
+ SetTree(std::move(manager.ax_tree_));
return *this;
}
-TestAXTreeManager::~TestAXTreeManager() {
- if (tree_)
- AXTreeManagerMap::GetInstance().RemoveTreeManager(GetTreeID());
-}
+TestAXTreeManager::~TestAXTreeManager() = default;
void TestAXTreeManager::DestroyTree() {
- if (!tree_)
+ if (!ax_tree_)
return;
- AXTreeManagerMap::GetInstance().RemoveTreeManager(GetTreeID());
- tree_.reset();
+ GetMap().RemoveTreeManager(GetTreeID());
+ ax_tree_.reset();
}
AXTree* TestAXTreeManager::GetTree() const {
- DCHECK(tree_) << "Did you forget to call SetTree?";
- return tree_.get();
+ DCHECK(ax_tree_) << "Did you forget to call SetTree?";
+ return ax_tree_.get();
}
void TestAXTreeManager::SetTree(std::unique_ptr<AXTree> tree) {
- if (tree_)
- AXTreeManagerMap::GetInstance().RemoveTreeManager(GetTreeID());
+ if (ax_tree_)
+ GetMap().RemoveTreeManager(GetTreeID());
- tree_ = std::move(tree);
- if (tree_)
- AXTreeManagerMap::GetInstance().AddTreeManager(GetTreeID(), this);
+ ax_tree_ = std::move(tree);
+ ax_tree_id_ = GetTreeID();
+ if (ax_tree_)
+ GetMap().AddTreeManager(GetTreeID(), this);
}
AXNode* TestAXTreeManager::GetNodeFromTree(const AXTreeID tree_id,
const AXNodeID node_id) const {
- return (tree_ && GetTreeID() == tree_id) ? tree_->GetFromId(node_id)
- : nullptr;
+ return (ax_tree_ && GetTreeID() == tree_id) ? ax_tree_->GetFromId(node_id)
+ : nullptr;
}
AXNode* TestAXTreeManager::GetNodeFromTree(const AXNodeID node_id) const {
- return tree_ ? tree_->GetFromId(node_id) : nullptr;
-}
-
-void TestAXTreeManager::AddObserver(AXTreeObserver* observer) {
- if (tree_)
- tree_->AddObserver(observer);
-}
-
-void TestAXTreeManager::RemoveObserver(AXTreeObserver* observer) {
- if (tree_)
- tree_->RemoveObserver(observer);
-}
-
-AXTreeID TestAXTreeManager::GetTreeID() const {
- return tree_ ? tree_->data().tree_id : AXTreeIDUnknown();
-}
-
-AXTreeID TestAXTreeManager::GetParentTreeID() const {
- return tree_ ? tree_->data().parent_tree_id : AXTreeIDUnknown();
-}
-
-AXNode* TestAXTreeManager::GetRootAsAXNode() const {
- return tree_ ? tree_->root() : nullptr;
+ return ax_tree_ ? ax_tree_->GetFromId(node_id) : nullptr;
}
AXNode* TestAXTreeManager::GetParentNodeFromParentTreeAsAXNode() const {
AXTreeID parent_tree_id = GetParentTreeID();
- TestAXTreeManager* parent_manager = static_cast<TestAXTreeManager*>(
- AXTreeManagerMap::GetInstance().GetManager(parent_tree_id));
+ TestAXTreeManager* parent_manager =
+ static_cast<TestAXTreeManager*>(AXTreeManager::FromID(parent_tree_id));
if (!parent_manager)
return nullptr;
@@ -116,8 +89,4 @@ AXNode* TestAXTreeManager::GetParentNodeFromParentTreeAsAXNode() const {
return nullptr;
}
-std::string TestAXTreeManager::ToString() const {
- return "<TestAXTreeManager>";
-}
-
} // namespace ui
diff --git a/chromium/ui/accessibility/test_ax_tree_manager.h b/chromium/ui/accessibility/test_ax_tree_manager.h
index dabc5650132..a3299a3ac3a 100644
--- a/chromium/ui/accessibility/test_ax_tree_manager.h
+++ b/chromium/ui/accessibility/test_ax_tree_manager.h
@@ -30,7 +30,7 @@ class AX_EXPORT TestAXTreeManager : public AXTreeManager {
// Takes ownership of |tree|.
explicit TestAXTreeManager(std::unique_ptr<AXTree> tree);
- virtual ~TestAXTreeManager();
+ ~TestAXTreeManager() override;
TestAXTreeManager(const TestAXTreeManager& manager) = delete;
TestAXTreeManager& operator=(const TestAXTreeManager& manager) = delete;
@@ -47,16 +47,7 @@ class AX_EXPORT TestAXTreeManager : public AXTreeManager {
AXNode* GetNodeFromTree(const AXTreeID tree_id,
const AXNodeID node_id) const override;
AXNode* GetNodeFromTree(const AXNodeID node_id) const override;
- void AddObserver(AXTreeObserver* observer) override;
- void RemoveObserver(AXTreeObserver* observer) override;
- AXTreeID GetTreeID() const override;
- AXTreeID GetParentTreeID() const override;
- AXNode* GetRootAsAXNode() const override;
AXNode* GetParentNodeFromParentTreeAsAXNode() const override;
- std::string ToString() const override;
-
- private:
- std::unique_ptr<AXTree> tree_;
};
} // namespace ui
diff --git a/chromium/ui/accessibility/test_ax_tree_update_json_reader.cc b/chromium/ui/accessibility/test_ax_tree_update_json_reader.cc
new file mode 100644
index 00000000000..11bc70b65f2
--- /dev/null
+++ b/chromium/ui/accessibility/test_ax_tree_update_json_reader.cc
@@ -0,0 +1,342 @@
+// 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/accessibility/test_ax_tree_update_json_reader.h"
+
+#include "base/containers/contains.h"
+#include "base/containers/flat_set.h"
+#include "base/numerics/clamped_math.h"
+#include "base/strings/string_split.h"
+#include "ui/accessibility/ax_enum_util.h"
+
+namespace {
+
+using RoleConversions = const std::map<std::string, ax::mojom::Role>;
+
+// The 3 lists below include all terms that are not parsed now if they are in a
+// JSON file. Since this class is only used for testing, we will only encounter
+// errors regarding that in the following two cases:
+// - We add a new JSON file (or modify one) for testing that includes different
+// unsupported.
+// - There is a new property added to AXNode that is not covered in the existing
+// JSON parsor and a test relies on it.
+// In both above cases, existing tests will catch the issue and warn about the
+// missing/changed property.
+const base::flat_set<std::string> kUnusedAxNodeProperties = {
+ "controls", "describedby", "details", "disabled", "editable",
+ "focused", "hidden", "hiddenRoot", "live", "multiline",
+ "readonly", "relevant", "required", "settable"};
+
+const base::flat_set<std::string> kUnusedAxNodeItems = {
+ "frameId", "ignoredReasons", "parentId"};
+
+const base::flat_set<std::string> kUnusedStyles = {
+ "background-image", "background-size", "clip", "font-style",
+ "margin-bottom", "margin-left", "margin-right", "margin-top",
+ "opacity", "padding-bottom", "padding-left", "padding-right",
+ "padding-top", "position", "text-align", "text-decoration",
+ "z-index"};
+
+int GetAsInt(const base::Value& value) {
+ if (value.is_int())
+ return value.GetInt();
+ if (value.is_string())
+ return atoi(value.GetString().c_str());
+
+ NOTREACHED() << "Unexpected: " << value;
+ return 0;
+}
+
+double GetAsDouble(const base::Value& value) {
+ if (value.is_double())
+ return value.GetDouble();
+ if (value.is_int())
+ return value.GetInt();
+ if (value.is_string())
+ return atof(value.GetString().c_str());
+
+ NOTREACHED() << "Unexpected: " << value;
+ return 0;
+}
+
+bool GetAsBoolean(const base::Value& value) {
+ if (value.is_bool())
+ return value.GetBool();
+ if (value.is_string()) {
+ if (value.GetString() == "false")
+ return false;
+ if (value.GetString() == "true")
+ return true;
+ }
+
+ NOTREACHED() << "Unexpected: " << value;
+ return false;
+}
+
+void GetTypeAndValue(const base::Value& node,
+ std::string& type,
+ std::string& value) {
+ type = node.GetDict().Find("type")->GetString();
+ value = node.GetDict().Find("value")->GetString();
+}
+
+ui::AXNodeID AddNode(ui::AXTreeUpdate& tree_update,
+ const base::Value& node,
+ RoleConversions* role_conversions);
+
+void ParseAxNodeChildIds(ui::AXNodeData& node_data,
+ const base::Value& child_ids) {
+ for (const auto& item : child_ids.GetList())
+ node_data.child_ids.push_back(GetAsInt(item));
+}
+
+void ParseAxNodeDescription(ui::AXNodeData& node_data,
+ const base::Value& description) {
+ std::string type, value;
+ GetTypeAndValue(description, type, value);
+ DCHECK_EQ(type, "computedString");
+ node_data.SetDescription(value);
+}
+
+void ParseAxNodeName(ui::AXNodeData& node_data, const base::Value& name) {
+ std::string type, value;
+ GetTypeAndValue(name, type, value);
+ DCHECK_EQ(type, "computedString");
+ node_data.SetName(value);
+}
+
+void ParseAxNodeProperties(ui::AXNodeData& node_data,
+ const base::Value& properties) {
+ if (properties.is_list()) {
+ for (const auto& item : properties.GetList())
+ ParseAxNodeProperties(node_data, item);
+ return;
+ }
+
+ const std::string prop_type = properties.GetDict().Find("name")->GetString();
+ const base::Value* prop_value =
+ properties.GetDict().Find("value")->GetDict().Find("value");
+
+ if (prop_type == "atomic") {
+ node_data.AddBoolAttribute(
+ ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot,
+ !GetAsBoolean(*prop_value));
+ } else if (prop_type == "focusable") {
+ if (GetAsBoolean(*prop_value))
+ node_data.AddState(ax::mojom::State::kFocusable);
+ } else if (prop_type == "expanded") {
+ if (GetAsBoolean(*prop_value))
+ node_data.AddState(ax::mojom::State::kExpanded);
+ } else if (prop_type == "hasPopup") {
+ node_data.SetHasPopup(
+ ui::ParseAXEnum<ax::mojom::HasPopup>(prop_value->GetString().c_str()));
+ } else if (prop_type == "invalid") {
+ node_data.SetInvalidState(GetAsBoolean(*prop_value)
+ ? ax::mojom::InvalidState::kTrue
+ : ax::mojom::InvalidState::kFalse);
+ } else if (prop_type == "level") {
+ node_data.AddIntAttribute(ax::mojom::IntAttribute::kHierarchicalLevel,
+ GetAsInt(*prop_value));
+ } else {
+ DCHECK(base::Contains(kUnusedAxNodeProperties, prop_type)) << prop_type;
+ }
+}
+
+ax::mojom::Role RoleFromString(std::string role,
+ RoleConversions* role_conversions) {
+ const auto& item = role_conversions->find(role);
+ DCHECK(item != role_conversions->end()) << role;
+ return item->second;
+}
+
+void ParseAxNodeRole(ui::AXNodeData& node_data,
+ const base::Value& role,
+ RoleConversions* role_conversions) {
+ const std::string role_type = role.GetDict().Find("type")->GetString();
+ std::string role_value = role.GetDict().Find("value")->GetString();
+
+ DCHECK(role_type == "role" || role_type == "internalRole");
+
+ node_data.role = RoleFromString(role_value, role_conversions);
+}
+
+void ParseAxNode(ui::AXNodeData& node_data,
+ const base::Value& ax_node,
+ RoleConversions* role_conversions) {
+ // Store the name and set it at the end because |AXNodeData::SetName|
+ // expects a valid role to have already been set prior to calling it.
+ base::Value name_value;
+ for (const auto item : ax_node.GetDict()) {
+ if (item.first == "backendDOMNodeId") {
+ node_data.AddIntAttribute(ax::mojom::IntAttribute::kDOMNodeId,
+ GetAsInt(item.second));
+ } else if (item.first == "childIds") {
+ ParseAxNodeChildIds(node_data, item.second);
+ } else if (item.first == "description") {
+ ParseAxNodeDescription(node_data, item.second);
+ } else if (item.first == "ignored") {
+ DCHECK(item.second.is_bool());
+ if (item.second.GetBool())
+ node_data.AddState(ax::mojom::State::kIgnored);
+ } else if (item.first == "name") {
+ name_value = item.second.Clone();
+ } else if (item.first == "nodeId") {
+ node_data.id = GetAsInt(item.second);
+ } else if (item.first == "properties") {
+ ParseAxNodeProperties(node_data, item.second);
+ } else if (item.first == "role") {
+ ParseAxNodeRole(node_data, item.second, role_conversions);
+ } else {
+ DCHECK(base::Contains(kUnusedAxNodeItems, item.first)) << item.first;
+ }
+ }
+ if (!name_value.is_none())
+ ParseAxNodeName(node_data, name_value);
+}
+
+void ParseChildren(ui::AXTreeUpdate& tree_update,
+ const base::Value& children,
+ RoleConversions* role_conversions) {
+ for (const auto& child : children.GetList())
+ AddNode(tree_update, child, role_conversions);
+}
+
+// Converts "rgb(R,G,B)" or "rgba(R,G,B,A)" to one ARGB integer where R,G, and B
+// are integers and A is float < 1.
+uint32_t ConvertRgbaStringToArgbInt(const std::string& argb_string) {
+ std::vector<std::string> values = base::SplitString(
+ argb_string, ",()", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+
+ uint32_t a, r, g, b;
+
+ if (values.size() == 4 && values[0] == "rgb") {
+ a = 0;
+ } else if (values.size() == 5 && values[0] == "rgba") {
+ a = base::ClampRound(atof(values[4].c_str()) * 255);
+ } else {
+ NOTREACHED() << "Unexpected color value: " << argb_string;
+ return -1;
+ }
+
+ r = atoi(values[1].c_str());
+ g = atoi(values[2].c_str());
+ b = atoi(values[3].c_str());
+
+ return (a << 24) + (r << 16) + (g << 8) + b;
+}
+
+void ParseStyle(ui::AXNodeData& node_data, const base::Value& style) {
+ const std::string& name = style.GetDict().Find("name")->GetString();
+ const std::string& value = style.GetDict().Find("value")->GetString();
+
+ if (name == "color") {
+ node_data.AddIntAttribute(ax::mojom::IntAttribute::kColor,
+ ConvertRgbaStringToArgbInt(value));
+ } else if (name == "direction") {
+ node_data.AddIntAttribute(
+ ax::mojom::IntAttribute::kTextDirection,
+ static_cast<int>(
+ ui::ParseAXEnum<ax::mojom::WritingDirection>(value.c_str())));
+ } else if (name == "display") {
+ node_data.AddStringAttribute(ax::mojom::StringAttribute::kDisplay, value);
+ } else if (name == "font-size") {
+ // Drop the 'px' at the end of font size.
+ DCHECK(style.GetDict().Find("value")->is_string());
+ node_data.AddFloatAttribute(
+ ax::mojom::FloatAttribute::kFontSize,
+ atof(value.substr(0, value.length() - 2).c_str()));
+ } else if (name == "font-weight") {
+ DCHECK(style.GetDict().Find("value")->is_string());
+ node_data.AddFloatAttribute(ax::mojom::FloatAttribute::kFontSize,
+ atof(value.c_str()));
+ } else if (name == "list-style-type") {
+ node_data.AddIntAttribute(
+ ax::mojom::IntAttribute::kListStyle,
+ static_cast<int>(ui::ParseAXEnum<ax::mojom::ListStyle>(value.c_str())));
+ } else if (name == "visibility") {
+ if (value == "hidden")
+ node_data.AddState(ax::mojom::State::kInvisible);
+ else
+ DCHECK_EQ(value, "visible");
+ } else {
+ DCHECK(base::Contains(kUnusedStyles, name)) << name;
+ }
+}
+
+void ParseExtras(ui::AXNodeData& node_data, const base::Value& extras) {
+ for (const auto extra : extras.GetDict()) {
+ const base::Value::List& items = extra.second.GetList();
+ if (extra.first == "bounds") {
+ node_data.relative_bounds.bounds.set_x(GetAsDouble(items[0]));
+ node_data.relative_bounds.bounds.set_y(GetAsDouble(items[1]));
+ node_data.relative_bounds.bounds.set_width(GetAsDouble(items[2]));
+ node_data.relative_bounds.bounds.set_height(GetAsDouble(items[3]));
+ } else if (extra.first == "styles") {
+ for (const auto& style : items)
+ ParseStyle(node_data, style);
+ } else {
+ NOTREACHED() << "Unexpected: " << extra.first;
+ }
+ }
+}
+
+// Adds a node and returns its id.
+ui::AXNodeID AddNode(ui::AXTreeUpdate& tree_update,
+ const base::Value& node,
+ RoleConversions* role_conversions) {
+ ui::AXNodeData node_data;
+
+ // Store the string and set it at the end because |AXNodeData::SetName|
+ // expects a valid role to have already been set prior to calling it.
+ std::string name_string;
+
+ for (const auto item : node.GetDict()) {
+ if (item.first == "axNode") {
+ ParseAxNode(node_data, item.second, role_conversions);
+ } else if (item.first == "backendDomId") {
+ node_data.AddIntAttribute(ax::mojom::IntAttribute::kDOMNodeId,
+ GetAsInt(item.second));
+ } else if (item.first == "children") {
+ ParseChildren(tree_update, item.second, role_conversions);
+ } else if (item.first == "description") {
+ node_data.SetDescription(item.second.GetString());
+ } else if (item.first == "extras") {
+ ParseExtras(node_data, item.second);
+ } else if (item.first == "interesting") {
+ // Not used yet, boolean.
+ } else if (item.first == "name") {
+ name_string = item.second.GetString();
+ } else if (item.first == "role") {
+ node_data.role =
+ RoleFromString(item.second.GetString(), role_conversions);
+ } else {
+ NOTREACHED() << "Unexpected: " << item.first;
+ }
+ }
+
+ node_data.SetName(name_string);
+
+ tree_update.nodes.push_back(node_data);
+
+ return node_data.id;
+}
+
+} // namespace
+
+namespace ui {
+
+AXTreeUpdate AXTreeUpdateFromJSON(const base::Value& json,
+ RoleConversions* role_conversions) {
+ AXTreeUpdate tree_update;
+
+ // Input should be a list with one item, which is the root node.
+ DCHECK(json.is_list() && json.GetList().size() == 1);
+
+ tree_update.root_id =
+ AddNode(tree_update, json.GetList().front(), role_conversions);
+
+ return tree_update;
+}
+
+} // namespace ui
diff --git a/chromium/ui/accessibility/test_ax_tree_update_json_reader.h b/chromium/ui/accessibility/test_ax_tree_update_json_reader.h
new file mode 100644
index 00000000000..2fd51c37115
--- /dev/null
+++ b/chromium/ui/accessibility/test_ax_tree_update_json_reader.h
@@ -0,0 +1,27 @@
+// 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_ACCESSIBILITY_TEST_AX_TREE_UPDATE_JSON_READER_H_
+#define UI_ACCESSIBILITY_TEST_AX_TREE_UPDATE_JSON_READER_H_
+
+#include "base/values.h"
+#include "ui/accessibility/ax_tree.h"
+
+namespace ui {
+
+// This function assumes that the JSON input is properly formatted and any
+// error in parsing can result in a runtime error.
+// The JSON format is based on the output of
+// |InspectorAccessibilityAgent::WalkAXNodesToDepth| and should stay in sync
+// with that.
+// NOTE: This parser is not complete and only processes the required tags for
+// the existing tests.
+// |role_conversions| is a map of role strings in the JSON file to Chrome roles.
+// TODO(https://crbug.com/1278249): Drop |role_conversions| once Chrome roles
+// are added to the JSON file.
+AXTreeUpdate AXTreeUpdateFromJSON(
+ const base::Value& json,
+ const std::map<std::string, ax::mojom::Role>* role_conversions);
+} // namespace ui
+#endif // UI_ACCESSIBILITY_TEST_AX_TREE_UPDATE_JSON_READER_H_
diff --git a/chromium/ui/android/BUILD.gn b/chromium/ui/android/BUILD.gn
index 63f1ce900db..0d9968f818c 100644
--- a/chromium/ui/android/BUILD.gn
+++ b/chromium/ui/android/BUILD.gn
@@ -304,6 +304,7 @@ android_library("ui_no_recycler_view_java") {
"java/src/org/chromium/ui/modelutil/ListObservableImpl.java",
"java/src/org/chromium/ui/modelutil/MVCListAdapter.java",
"java/src/org/chromium/ui/modelutil/ModelListAdapter.java",
+ "java/src/org/chromium/ui/modelutil/ModelListPropertyChangeFilter.java",
"java/src/org/chromium/ui/modelutil/PropertyKey.java",
"java/src/org/chromium/ui/modelutil/PropertyListModel.java",
"java/src/org/chromium/ui/modelutil/PropertyModel.java",
@@ -327,8 +328,13 @@ android_library("ui_no_recycler_view_java") {
"java/src/org/chromium/ui/resources/ResourceManager.java",
"java/src/org/chromium/ui/resources/async/AsyncPreloadResourceLoader.java",
"java/src/org/chromium/ui/resources/dynamics/BitmapDynamicResource.java",
+ "java/src/org/chromium/ui/resources/dynamics/CaptureObserver.java",
+ "java/src/org/chromium/ui/resources/dynamics/CaptureUtils.java",
"java/src/org/chromium/ui/resources/dynamics/DynamicResource.java",
"java/src/org/chromium/ui/resources/dynamics/DynamicResourceLoader.java",
+ "java/src/org/chromium/ui/resources/dynamics/DynamicResourceSnapshot.java",
+ "java/src/org/chromium/ui/resources/dynamics/HardwareDraw.java",
+ "java/src/org/chromium/ui/resources/dynamics/SoftwareDraw.java",
"java/src/org/chromium/ui/resources/dynamics/ViewResourceAdapter.java",
"java/src/org/chromium/ui/resources/dynamics/ViewResourceInflater.java",
"java/src/org/chromium/ui/resources/statics/NinePatchData.java",
@@ -368,6 +374,8 @@ android_library("ui_no_recycler_view_java") {
"//base:jni_java",
"//build/android:build_java",
"//components/url_formatter/android:url_formatter_java",
+ "//third_party/android_deps:com_google_code_findbugs_jsr305_java",
+ "//third_party/androidx:androidx_activity_activity_java",
"//third_party/androidx:androidx_annotation_annotation_java",
"//third_party/androidx:androidx_appcompat_appcompat_java",
"//third_party/androidx:androidx_appcompat_appcompat_resources_java",
@@ -406,11 +414,9 @@ java_group("ui_full_java") {
]
}
-android_library("ui_junit_test_support") {
- # Skip platform checks since Robolectric depends on requires_android targets.
- bypass_platform_checks = true
- testonly = true
+robolectric_library("ui_junit_test_support") {
sources = [
+ "junit/src/org/chromium/ui/resources/dynamics/DynamicResourceTestUtils.java",
"junit/src/org/chromium/ui/shadows/ShadowAnimatedStateListDrawable.java",
"junit/src/org/chromium/ui/shadows/ShadowAppCompatResources.java",
"junit/src/org/chromium/ui/shadows/ShadowAsyncLayoutInflater.java",
@@ -419,10 +425,10 @@ android_library("ui_junit_test_support") {
deps = [
":ui_java",
"//base:base_java",
- "//third_party/android_deps:robolectric_all_java",
"//third_party/androidx:androidx_annotation_annotation_java",
"//third_party/androidx:androidx_appcompat_appcompat_resources_java",
"//third_party/androidx:androidx_asynclayoutinflater_asynclayoutinflater_java",
+ "//third_party/junit",
]
}
@@ -475,7 +481,7 @@ android_resources("ui_javatest_resources") {
android_manifest = "junit/AndroidManifest.xml"
}
-junit_binary("ui_junit_tests") {
+robolectric_binary("ui_junit_tests") {
sources = [
"junit/src/org/chromium/ui/AsyncViewProviderTest.java",
"junit/src/org/chromium/ui/AsyncViewStubTest.java",
@@ -495,6 +501,7 @@ junit_binary("ui_junit_tests") {
"junit/src/org/chromium/ui/modelutil/LazyConstructionPropertyMcpTest.java",
"junit/src/org/chromium/ui/modelutil/ListModelBaseTest.java",
"junit/src/org/chromium/ui/modelutil/ModelListAdapterTest.java",
+ "junit/src/org/chromium/ui/modelutil/ModelListPropertyChangeFilterTest.java",
"junit/src/org/chromium/ui/modelutil/PropertyListModelTest.java",
"junit/src/org/chromium/ui/modelutil/PropertyModelTest.java",
"junit/src/org/chromium/ui/modelutil/SimpleListObservableTest.java",
@@ -512,6 +519,7 @@ junit_binary("ui_junit_tests") {
"junit/src/org/chromium/ui/widget/ViewRectProviderTest.java",
]
deps = [
+ ":ui_android_jni_headers",
":ui_java",
":ui_java_test_support",
":ui_javatest_resources",
@@ -585,10 +593,11 @@ android_library("clipboard_java_test_support") {
]
}
-android_library("ui_javatests") {
+android_library("ui_unit_device_javatests") {
testonly = true
sources = [
+ "java/src/org/chromium/ui/resources/dynamics/HardwareDrawTest.java",
"java/src/org/chromium/ui/widget/TextViewWithTightWrapTest.java",
"javatests/src/org/chromium/ui/base/ClipboardAndroidTest.java",
]
@@ -597,8 +606,10 @@ android_library("ui_javatests") {
":clipboard_java_test_support",
":ui_java",
":ui_java_test_support",
+ "//base:base_java",
"//base:base_java_test_support",
"//content/public/test/android:content_java_test_support",
+ "//third_party/androidx:androidx_annotation_annotation_java",
"//third_party/androidx:androidx_test_runner_java",
"//third_party/hamcrest:hamcrest_library_java",
"//third_party/junit",
diff --git a/chromium/ui/android/junit/src/org/chromium/ui/base/ApplicationViewportInsetSupplierTest.java b/chromium/ui/android/junit/src/org/chromium/ui/base/ApplicationViewportInsetSupplierTest.java
index a762f391a43..ade4593c304 100644
--- a/chromium/ui/android/junit/src/org/chromium/ui/base/ApplicationViewportInsetSupplierTest.java
+++ b/chromium/ui/android/junit/src/org/chromium/ui/base/ApplicationViewportInsetSupplierTest.java
@@ -43,7 +43,7 @@ public class ApplicationViewportInsetSupplierTest {
mFeatureInsetSupplier = new ObservableSupplierImpl<>();
mWindowInsetObserver = new CapturingCallback<>();
- mWindowApplicationInsetSupplier.addSupplier(mFeatureInsetSupplier);
+ mWindowApplicationInsetSupplier.addOverlappingSupplier(mFeatureInsetSupplier);
mWindowApplicationInsetSupplier.addObserver(mWindowInsetObserver);
}
@@ -63,7 +63,7 @@ public class ApplicationViewportInsetSupplierTest {
@Test
public void testSupplierTriggersObserver_multipleSuppliers_2() {
ObservableSupplierImpl<Integer> secondSupplier = new ObservableSupplierImpl<>();
- mWindowApplicationInsetSupplier.addSupplier(secondSupplier);
+ mWindowApplicationInsetSupplier.addOverlappingSupplier(secondSupplier);
mFeatureInsetSupplier.set(5);
secondSupplier.set(10);
@@ -75,10 +75,10 @@ public class ApplicationViewportInsetSupplierTest {
@Test
public void testSupplierTriggersObserver_multipleSuppliers_3() {
ObservableSupplierImpl<Integer> secondSupplier = new ObservableSupplierImpl<>();
- mWindowApplicationInsetSupplier.addSupplier(secondSupplier);
+ mWindowApplicationInsetSupplier.addOverlappingSupplier(secondSupplier);
ObservableSupplierImpl<Integer> thirdSupplier = new ObservableSupplierImpl<>();
- mWindowApplicationInsetSupplier.addSupplier(thirdSupplier);
+ mWindowApplicationInsetSupplier.addOverlappingSupplier(thirdSupplier);
mFeatureInsetSupplier.set(5);
secondSupplier.set(20);
@@ -93,7 +93,7 @@ public class ApplicationViewportInsetSupplierTest {
ObservableSupplierImpl<Integer> supplier = new ObservableSupplierImpl<>();
supplier.set(20);
- mWindowApplicationInsetSupplier.addSupplier(supplier);
+ mWindowApplicationInsetSupplier.addOverlappingSupplier(supplier);
assertEquals("The observer should have been triggered after the supplier was added.",
(Integer) 20, mWindowInsetObserver.getCapturedValue());
@@ -102,10 +102,10 @@ public class ApplicationViewportInsetSupplierTest {
@Test
public void testSupplierRemoveTriggersEvent() {
ObservableSupplierImpl<Integer> secondSupplier = new ObservableSupplierImpl<>();
- mWindowApplicationInsetSupplier.addSupplier(secondSupplier);
+ mWindowApplicationInsetSupplier.addOverlappingSupplier(secondSupplier);
ObservableSupplierImpl<Integer> thirdSupplier = new ObservableSupplierImpl<>();
- mWindowApplicationInsetSupplier.addSupplier(thirdSupplier);
+ mWindowApplicationInsetSupplier.addOverlappingSupplier(thirdSupplier);
mFeatureInsetSupplier.set(5);
secondSupplier.set(20);
diff --git a/chromium/ui/android/junit/src/org/chromium/ui/base/MimeTypeUtilsTest.java b/chromium/ui/android/junit/src/org/chromium/ui/base/MimeTypeUtilsTest.java
index 753116a42f6..8596f24609c 100644
--- a/chromium/ui/android/junit/src/org/chromium/ui/base/MimeTypeUtilsTest.java
+++ b/chromium/ui/android/junit/src/org/chromium/ui/base/MimeTypeUtilsTest.java
@@ -30,6 +30,7 @@ import org.chromium.url.GURL;
* Tests for {@link MimeTypeUtils}, verifying behavior across OS versions.
*/
@RunWith(BaseRobolectricTestRunner.class)
+@SuppressWarnings("DoNotMock") // Mocking GURL
public class MimeTypeUtilsTest {
@Mock
private GURL mMockedUrl;
diff --git a/chromium/ui/android/junit/src/org/chromium/ui/dragdrop/DragAndDropDelegateImplUnitTest.java b/chromium/ui/android/junit/src/org/chromium/ui/dragdrop/DragAndDropDelegateImplUnitTest.java
index d22c0dec013..05d12538b42 100644
--- a/chromium/ui/android/junit/src/org/chromium/ui/dragdrop/DragAndDropDelegateImplUnitTest.java
+++ b/chromium/ui/android/junit/src/org/chromium/ui/dragdrop/DragAndDropDelegateImplUnitTest.java
@@ -5,6 +5,8 @@
package org.chromium.ui.dragdrop;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.content.ClipData;
import android.content.ClipDescription;
@@ -29,7 +31,9 @@ import org.junit.Assert;
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.annotation.Config;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
@@ -37,7 +41,8 @@ import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowAccessibilityManager;
import org.chromium.base.compat.ApiHelperForN;
-import org.chromium.base.metrics.test.ShadowRecordHistogram;
+import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.base.metrics.UmaRecorderHolder;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.ui.dragdrop.DragAndDropDelegateImpl.DragTargetType;
import org.chromium.url.JUnitTestGURLs;
@@ -46,14 +51,19 @@ import org.chromium.url.JUnitTestGURLs;
* Unit tests for {@link DragAndDropDelegateImpl}.
*/
@RunWith(BaseRobolectricTestRunner.class)
-@Config(shadows = {ShadowRecordHistogram.class})
public class DragAndDropDelegateImplUnitTest {
/** Using a window size of 1000*600 for the ease of dp / pixel calculation. */
private static final int WINDOW_WIDTH = 1000;
private static final int WINDOW_HEIGHT = 600;
+ private static final float DRAG_START_X_DP = 1.0f;
+ private static final float DRAG_START_Y_DP = 1.0f;
+
private static final String IMAGE_FILENAME = "image.png";
+ @Mock
+ private DragAndDropPermissions mDragAndDropPermissions;
+
/** Helper shadow class to make sure #startDragAndDrop is accepted by Android. */
@Implements(ApiHelperForN.class)
static class ShadowApiHelperForN {
@@ -73,6 +83,8 @@ public class DragAndDropDelegateImplUnitTest {
@Before
public void setup() {
+ MockitoAnnotations.initMocks(this);
+
mContext = ApplicationProvider.getApplicationContext();
mDragAndDropDelegateImpl = new DragAndDropDelegateImpl();
@@ -86,7 +98,7 @@ public class DragAndDropDelegateImplUnitTest {
@After
public void tearDown() {
DropDataContentProvider.onDragEnd(false);
- ShadowRecordHistogram.reset();
+ UmaRecorderHolder.resetForTesting();
ShadowApiHelperForN.sLastDragShadowBuilder = null;
}
@@ -188,6 +200,14 @@ public class DragAndDropDelegateImplUnitTest {
}
@Test
+ public void testStartDragAndDrop_InvalidDropData() {
+ final DropDataAndroid dropData = DropDataAndroid.create(null, null, null, null, null);
+
+ Assert.assertFalse("Drag and drop should not start.",
+ mDragAndDropDelegateImpl.startDragAndDrop(mContainerView, null, dropData));
+ }
+
+ @Test
@Config(shadows = {ShadowApiHelperForN.class})
public void testDragImage_ShadowPlaceholder() {
final Bitmap shadowImage = Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8);
@@ -254,6 +274,21 @@ public class DragAndDropDelegateImplUnitTest {
}
@Test
+ public void testDragStartedFromContainerView() {
+ final Bitmap shadowImage = Bitmap.createBitmap(100, 200, Bitmap.Config.ALPHA_8);
+ final DropDataAndroid imageDropData =
+ DropDataAndroid.create("", null, new byte[] {1, 2, 3, 4}, "png", IMAGE_FILENAME);
+ mDragAndDropDelegateImpl.startDragAndDrop(mContainerView, shadowImage, imageDropData);
+
+ mDragAndDropDelegateImpl.onDrag(
+ mContainerView, mockDragEvent(DragEvent.ACTION_DRAG_STARTED));
+ Assert.assertEquals("Recorded drag start X dp should match.", DRAG_START_X_DP,
+ mDragAndDropDelegateImpl.getDragStartXDp(), 0.0f);
+ Assert.assertEquals("Recorded drag start Y dp should match.", DRAG_START_Y_DP,
+ mDragAndDropDelegateImpl.getDragStartYDp(), 0.0f);
+ }
+
+ @Test
public void testResizeShadowImage_ScaleDownWithRatio() {
doTestResizeShadowImage("Resize 60%",
/*width=*/100, /*height=*/100,
@@ -330,7 +365,7 @@ public class DragAndDropDelegateImplUnitTest {
@Test
@Config(sdk = VERSION_CODES.O)
- public void testClipData_ImageWithUrl() {
+ public void testClipData_ImageWithUrl_PostO() {
final DropDataAndroid dropData =
DropDataAndroid.create("", JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL),
new byte[] {1, 2, 3, 4}, "png", IMAGE_FILENAME);
@@ -343,25 +378,23 @@ public class DragAndDropDelegateImplUnitTest {
}
@Test
- public void testClipData_TextLink() {
- final DropDataAndroid dropData = DropDataAndroid.create(
- "", JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL), null, null, null);
- mDragAndDropDelegateImpl.setDragAndDropBrowserDelegate(new DragAndDropBrowserDelegate() {
- @Override
- public boolean getSupportDropInChrome() {
- return false;
- }
+ @Config(sdk = VERSION_CODES.N_MR1)
+ public void testClipData_ImageWithUrl_PreO() {
+ final DropDataAndroid dropData =
+ DropDataAndroid.create("", JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL),
+ new byte[] {1, 2, 3, 4}, "png", IMAGE_FILENAME);
- @Override
- public DragAndDropPermissions getDragAndDropPermissions(DragEvent dropEvent) {
- return null;
- }
+ ClipData clipData = mDragAndDropDelegateImpl.buildClipData(dropData);
+ Assert.assertEquals(
+ "Image ClipData should include only image info.", 1, clipData.getItemCount());
+ }
- @Override
- public Intent createLinkIntent(String urlString) {
- return new Intent();
- }
- });
+ @Test
+ public void testClipData_TextLink_NonNullIntent() {
+ final DropDataAndroid dropData = DropDataAndroid.create(
+ "", JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL), null, null, null);
+ mDragAndDropDelegateImpl.setDragAndDropBrowserDelegate(
+ createDragAndDropBrowserDelegate(false, null, new Intent()));
ClipData clipData = mDragAndDropDelegateImpl.buildClipData(dropData);
Assert.assertTrue("Link ClipData should include plaintext MIME type.",
clipData.getDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN));
@@ -373,6 +406,30 @@ public class DragAndDropDelegateImplUnitTest {
"ClipData intent should not be null.", clipData.getItemAt(0).getIntent());
}
+ @Test
+ public void testClipData_TextLink_NullIntent() {
+ final DropDataAndroid dropData = DropDataAndroid.create(
+ "", JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL), null, null, null);
+ mDragAndDropDelegateImpl.setDragAndDropBrowserDelegate(
+ createDragAndDropBrowserDelegate(false, null, null));
+ ClipData clipData = mDragAndDropDelegateImpl.buildClipData(dropData);
+ Assert.assertTrue("Link ClipData should include plaintext MIME type.",
+ clipData.getDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN));
+ Assert.assertFalse("Link ClipData should not include intent MIME type.",
+ clipData.getDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_INTENT));
+ Assert.assertEquals("Dragged link text should match.", JUnitTestGURLs.EXAMPLE_URL,
+ clipData.getItemAt(0).getText());
+ }
+
+ @Test
+ public void testDropInChromeFromOutside() {
+ mDragAndDropDelegateImpl.setDragAndDropBrowserDelegate(
+ createDragAndDropBrowserDelegate(true, mDragAndDropPermissions, null));
+ // Assume that data is dragged from outside Chrome.
+ mDragAndDropDelegateImpl.onDrag(mContainerView, mockDragEvent(DragEvent.ACTION_DROP));
+ verify(mDragAndDropPermissions).release();
+ }
+
private void doTestResizeShadowImage(
String testcase, int width, int height, int expectedWidth, int expectedHeight) {
Pair<Integer, Integer> widthHeight =
@@ -392,6 +449,8 @@ public class DragAndDropDelegateImplUnitTest {
private DragEvent mockDragEvent(int action) {
DragEvent event = Mockito.mock(DragEvent.class);
+ when(event.getX()).thenReturn(DRAG_START_X_DP);
+ when(event.getY()).thenReturn(DRAG_START_Y_DP);
doReturn(action).when(event).getAction();
return event;
}
@@ -403,8 +462,8 @@ public class DragAndDropDelegateImplUnitTest {
private void assertDragTypeRecorded(@DragTargetType int type) {
final String histogram = "Android.DragDrop.FromWebContent.TargetType";
final String errorMsg = "<" + histogram + "> is not recorded correctly.";
- Assert.assertEquals(errorMsg, 1,
- ShadowRecordHistogram.getHistogramValueCountForTesting(histogram, type));
+ Assert.assertEquals(
+ errorMsg, 1, RecordHistogram.getHistogramValueCountForTesting(histogram, type));
}
private void assertDragOutsideWebContentHistogramsRecorded(boolean dropResult) {
@@ -437,7 +496,26 @@ public class DragAndDropDelegateImplUnitTest {
private void assertHistogramRecorded(String histogram, boolean recorded, String reason) {
Assert.assertEquals(
String.format("<%s> is not recorded correctly. Reason: %s", histogram, reason),
- recorded ? 1 : 0,
- ShadowRecordHistogram.getHistogramTotalCountForTesting(histogram));
+ recorded ? 1 : 0, RecordHistogram.getHistogramTotalCountForTesting(histogram));
+ }
+
+ private DragAndDropBrowserDelegate createDragAndDropBrowserDelegate(
+ boolean supportDropInChrome, DragAndDropPermissions permissions, Intent intent) {
+ return new DragAndDropBrowserDelegate() {
+ @Override
+ public boolean getSupportDropInChrome() {
+ return supportDropInChrome;
+ }
+
+ @Override
+ public DragAndDropPermissions getDragAndDropPermissions(DragEvent dropEvent) {
+ return permissions;
+ }
+
+ @Override
+ public Intent createLinkIntent(String urlString) {
+ return intent;
+ }
+ };
}
}
diff --git a/chromium/ui/android/junit/src/org/chromium/ui/dragdrop/DropDataContentProviderTest.java b/chromium/ui/android/junit/src/org/chromium/ui/dragdrop/DropDataContentProviderTest.java
index d9ffd2f6880..d83abacd0b8 100644
--- a/chromium/ui/android/junit/src/org/chromium/ui/dragdrop/DropDataContentProviderTest.java
+++ b/chromium/ui/android/junit/src/org/chromium/ui/dragdrop/DropDataContentProviderTest.java
@@ -18,10 +18,10 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowLooper;
-import org.chromium.base.metrics.test.ShadowRecordHistogram;
+import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.base.metrics.UmaRecorderHolder;
import org.chromium.base.test.BaseRobolectricTestRunner;
import java.io.FileNotFoundException;
@@ -31,7 +31,6 @@ import java.util.concurrent.TimeUnit;
* Test basic functionality of {@link DropDataContentProvider}.
*/
@RunWith(BaseRobolectricTestRunner.class)
-@Config(shadows = {ShadowRecordHistogram.class})
public class DropDataContentProviderTest {
private static final byte[] IMAGE_DATA_A = new byte[100];
private static final byte[] IMAGE_DATA_B = new byte[50];
@@ -59,7 +58,7 @@ public class DropDataContentProviderTest {
public void tearDown() {
DropDataContentProvider.clearCache();
DropDataContentProvider.clearLastUriCreatedTimestampForTesting();
- ShadowRecordHistogram.reset();
+ UmaRecorderHolder.resetForTesting();
}
@Test
@@ -194,42 +193,42 @@ public class DropDataContentProviderTest {
private void assertImageSizeRecorded(int expectedCnt) {
final String histogram = "Android.DragDrop.Image.Size";
final String errorMsg = "<" + histogram + "> is not recorded properly.";
- Assert.assertEquals(errorMsg, expectedCnt,
- ShadowRecordHistogram.getHistogramTotalCountForTesting(histogram));
+ Assert.assertEquals(
+ errorMsg, expectedCnt, RecordHistogram.getHistogramTotalCountForTesting(histogram));
}
private void assertImageUriCreatedIntervalRecorded(int expectedCnt) {
final String histogram = "Android.DragDrop.Image.UriCreatedInterval";
final String errorMsg = "<" + histogram + "> is not recorded properly.";
- Assert.assertEquals(errorMsg, expectedCnt,
- ShadowRecordHistogram.getHistogramTotalCountForTesting(histogram));
+ Assert.assertEquals(
+ errorMsg, expectedCnt, RecordHistogram.getHistogramTotalCountForTesting(histogram));
}
private void assertImageFirstOpenFileRecorded(int expectedCnt) {
final String histogram = "Android.DragDrop.Image.OpenFileTime.FirstAttempt";
final String errorMsg = "<" + histogram + "> is not recorded properly.";
- Assert.assertEquals(errorMsg, expectedCnt,
- ShadowRecordHistogram.getHistogramTotalCountForTesting(histogram));
+ Assert.assertEquals(
+ errorMsg, expectedCnt, RecordHistogram.getHistogramTotalCountForTesting(histogram));
}
private void assertImageLastOpenFileRecorded(int expectedCnt) {
final String histogram = "Android.DragDrop.Image.OpenFileTime.LastAttempt";
final String errorMsg = "<" + histogram + "> is not recorded properly.";
- Assert.assertEquals(errorMsg, expectedCnt,
- ShadowRecordHistogram.getHistogramTotalCountForTesting(histogram));
+ Assert.assertEquals(
+ errorMsg, expectedCnt, RecordHistogram.getHistogramTotalCountForTesting(histogram));
}
private void assertImageFirstExpiredOpenFileRecorded(int expectedCnt) {
final String histogram = "Android.DragDrop.Image.OpenFileTime.FirstExpired";
final String errorMsg = "<" + histogram + "> is not recorded properly.";
- Assert.assertEquals(errorMsg, expectedCnt,
- ShadowRecordHistogram.getHistogramTotalCountForTesting(histogram));
+ Assert.assertEquals(
+ errorMsg, expectedCnt, RecordHistogram.getHistogramTotalCountForTesting(histogram));
}
private void assertImageAllExpiredOpenFileRecorded(int expectedCnt) {
final String histogram = "Android.DragDrop.Image.OpenFileTime.AllExpired";
final String errorMsg = "<" + histogram + "> is not recorded properly.";
- Assert.assertEquals(errorMsg, expectedCnt,
- ShadowRecordHistogram.getHistogramTotalCountForTesting(histogram));
+ Assert.assertEquals(
+ errorMsg, expectedCnt, RecordHistogram.getHistogramTotalCountForTesting(histogram));
}
}
diff --git a/chromium/ui/android/junit/src/org/chromium/ui/modelutil/ModelListAdapterTest.java b/chromium/ui/android/junit/src/org/chromium/ui/modelutil/ModelListAdapterTest.java
index 575a4c4892c..f3c23d0e000 100644
--- a/chromium/ui/android/junit/src/org/chromium/ui/modelutil/ModelListAdapterTest.java
+++ b/chromium/ui/android/junit/src/org/chromium/ui/modelutil/ModelListAdapterTest.java
@@ -339,16 +339,4 @@ public class ModelListAdapterTest {
mBindIntCallbackHelper.waitForCallback(0);
mBindObjectCallbackHelper.waitForCallback(0);
}
-
- @Test(expected = AssertionError.class)
- public void testBindNewModel_RewriteReadOnlyProperty() {
- PropertyModel oldModel = new PropertyModel.Builder(READONLY_BOOLEAN_PROPERTY)
- .with(READONLY_BOOLEAN_PROPERTY, false)
- .build();
- PropertyModel newModel = new PropertyModel.Builder(READONLY_BOOLEAN_PROPERTY)
- .with(READONLY_BOOLEAN_PROPERTY, true)
- .build();
- ModelListAdapter.bindNewModel(
- newModel, oldModel, new View(RuntimeEnvironment.application), new TestViewBinder());
- }
}
diff --git a/chromium/ui/android/junit/src/org/chromium/ui/modelutil/ModelListPropertyChangeFilterTest.java b/chromium/ui/android/junit/src/org/chromium/ui/modelutil/ModelListPropertyChangeFilterTest.java
new file mode 100644
index 00000000000..fff7a7c6f76
--- /dev/null
+++ b/chromium/ui/android/junit/src/org/chromium/ui/modelutil/ModelListPropertyChangeFilterTest.java
@@ -0,0 +1,95 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.ui.modelutil;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.CollectionUtil;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.ui.modelutil.MVCListAdapter.ListItem;
+import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
+import org.chromium.ui.modelutil.PropertyModel.WritableBooleanPropertyKey;
+
+/** Unit tests for {@link ModelListPropertyChangeFilter}. */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class ModelListPropertyChangeFilterTest {
+ private static final WritableBooleanPropertyKey PROPERTY_FOO = new WritableBooleanPropertyKey();
+ private static final WritableBooleanPropertyKey PROPERTY_BAR = new WritableBooleanPropertyKey();
+
+ private int mCallbackCounter;
+
+ private void onPropertyChange() {
+ mCallbackCounter++;
+ }
+
+ @Test
+ public void testSetProperty() {
+ ModelList modelList = new ModelList();
+ PropertyModel propertyModel = new PropertyModel(PROPERTY_FOO, PROPERTY_BAR);
+ modelList.add(new ListItem(/*type*/ 0, propertyModel));
+
+ ModelListPropertyChangeFilter propertyObserverFilter = new ModelListPropertyChangeFilter(
+ this::onPropertyChange, modelList, CollectionUtil.newHashSet(PROPERTY_FOO));
+ Assert.assertEquals(1, mCallbackCounter);
+
+ propertyModel.set(PROPERTY_BAR, true);
+ Assert.assertEquals(1, mCallbackCounter);
+
+ propertyModel.set(PROPERTY_FOO, true);
+ Assert.assertEquals(2, mCallbackCounter);
+
+ propertyModel.set(PROPERTY_FOO, false);
+ Assert.assertEquals(3, mCallbackCounter);
+
+ propertyObserverFilter.destroy();
+
+ propertyModel.set(PROPERTY_FOO, true);
+ Assert.assertEquals(3, mCallbackCounter);
+ }
+
+ @Test
+ public void testAddRemoveTriggers() {
+ ModelList modelList = new ModelList();
+ ModelListPropertyChangeFilter propertyObserverFilter = new ModelListPropertyChangeFilter(
+ this::onPropertyChange, modelList, CollectionUtil.newHashSet(PROPERTY_FOO));
+ Assert.assertEquals(1, mCallbackCounter);
+
+ PropertyModel propertyModel = new PropertyModel(PROPERTY_FOO, PROPERTY_BAR);
+ modelList.add(new ListItem(/*type*/ 0, propertyModel));
+ Assert.assertEquals(2, mCallbackCounter);
+
+ modelList.removeAt(0);
+ Assert.assertEquals(3, mCallbackCounter);
+
+ modelList.add(new ListItem(/*type*/ 0, propertyModel));
+ Assert.assertEquals(4, mCallbackCounter);
+
+ propertyObserverFilter.destroy();
+
+ modelList.removeAt(0);
+ Assert.assertEquals(4, mCallbackCounter);
+ }
+
+ @Test
+ public void testRemoveStopsObserving() {
+ ModelList modelList = new ModelList();
+ PropertyModel propertyModel = new PropertyModel(PROPERTY_FOO, PROPERTY_BAR);
+ modelList.add(new ListItem(/*type*/ 0, propertyModel));
+
+ ModelListPropertyChangeFilter propertyObserverFilter = new ModelListPropertyChangeFilter(
+ this::onPropertyChange, modelList, CollectionUtil.newHashSet(PROPERTY_FOO));
+ Assert.assertEquals(1, mCallbackCounter);
+
+ modelList.removeAt(0);
+ Assert.assertEquals(2, mCallbackCounter);
+
+ propertyModel.set(PROPERTY_FOO, true);
+ Assert.assertEquals(2, mCallbackCounter);
+ }
+} \ No newline at end of file
diff --git a/chromium/ui/android/junit/src/org/chromium/ui/resources/dynamics/BitmapDynamicResourceTest.java b/chromium/ui/android/junit/src/org/chromium/ui/resources/dynamics/BitmapDynamicResourceTest.java
index 719def28f42..006f6094bcb 100644
--- a/chromium/ui/android/junit/src/org/chromium/ui/resources/dynamics/BitmapDynamicResourceTest.java
+++ b/chromium/ui/android/junit/src/org/chromium/ui/resources/dynamics/BitmapDynamicResourceTest.java
@@ -7,17 +7,23 @@ package org.chromium.ui.resources.dynamics;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.MockitoAnnotations.initMocks;
import static org.chromium.base.GarbageCollectionTestUtils.canBeGarbageCollected;
import android.graphics.Bitmap;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
import org.robolectric.annotation.Config;
import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.JniMocker;
+import org.chromium.ui.resources.ResourceFactory;
+import org.chromium.ui.resources.ResourceFactoryJni;
import java.lang.ref.WeakReference;
@@ -29,8 +35,15 @@ import java.lang.ref.WeakReference;
public class BitmapDynamicResourceTest {
private BitmapDynamicResource mResource;
+ @Rule
+ public JniMocker mJniMocker = new JniMocker();
+ @Mock
+ private ResourceFactory.Natives mResourceFactoryJni;
+
@Before
public void setup() {
+ initMocks(this);
+ mJniMocker.mock(ResourceFactoryJni.TEST_HOOKS, mResourceFactoryJni);
mResource = new BitmapDynamicResource(1);
}
@@ -38,7 +51,11 @@ public class BitmapDynamicResourceTest {
public void testGetBitmap() {
Bitmap bitmap = Bitmap.createBitmap(1, 2, Bitmap.Config.ARGB_8888);
mResource.setBitmap(bitmap);
- assertEquals(bitmap, mResource.getBitmap());
+ assertEquals(bitmap, DynamicResourceTestUtils.getBitmapSync(mResource));
+
+ // Bitmap was already returned, next onResourceRequested should no-op.
+ mResource.setOnResourceReadyCallback((resource) -> { assert false; });
+ mResource.onResourceRequested();
}
@Test
@@ -62,7 +79,24 @@ public class BitmapDynamicResourceTest {
bitmap = null;
assertFalse(canBeGarbageCollected(bitmapWeakReference));
- mResource.getBitmap();
+ DynamicResourceTestUtils.getBitmapSync(mResource);
assertTrue(canBeGarbageCollected(bitmapWeakReference));
}
+
+ @Test
+ public void testOnResourceRequested_NotReady() {
+ Bitmap bitmap = Bitmap.createBitmap(1, 2, Bitmap.Config.ARGB_8888);
+
+ // No callback or bitmap, onResourceRequested should no-op.
+ mResource.onResourceRequested();
+
+ // No bitmap, onResourceRequested should no-op.
+ mResource.setOnResourceReadyCallback((resource) -> { assert false; });
+ mResource.onResourceRequested();
+
+ // No callback, onResourceRequested should no-op.
+ mResource.setOnResourceReadyCallback(null);
+ mResource.setBitmap(bitmap);
+ mResource.onResourceRequested();
+ }
}
diff --git a/chromium/ui/android/junit/src/org/chromium/ui/resources/dynamics/DynamicResourceTestUtils.java b/chromium/ui/android/junit/src/org/chromium/ui/resources/dynamics/DynamicResourceTestUtils.java
new file mode 100644
index 00000000000..8fa5e0cd5c3
--- /dev/null
+++ b/chromium/ui/android/junit/src/org/chromium/ui/resources/dynamics/DynamicResourceTestUtils.java
@@ -0,0 +1,45 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.ui.resources.dynamics;
+
+import static org.junit.Assert.assertNotNull;
+
+import android.graphics.Bitmap;
+import android.graphics.Rect;
+
+import org.chromium.ui.resources.Resource;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * Test utils class to share accessor patterns for working with {link @DynamicResoursce}. Primarily
+ * for old tests that were written and verify the behavior of synchronous resources.
+ */
+public final class DynamicResourceTestUtils {
+ /** Only works on {@link DynamicResource} that synchronously invoke their callback. */
+ public static Rect getBitmapSizeSync(DynamicResource dynamicResource) {
+ return getResourceSync(dynamicResource).getBitmapSize();
+ }
+
+ /** Only works on {@link DynamicResource} that synchronously invoke their callback. */
+ public static Bitmap getBitmapSync(DynamicResource dynamicResource) {
+ return getResourceSync(dynamicResource).getBitmap();
+ }
+
+ /** Only works on {@link DynamicResource} that synchronously invoke their callback. */
+ public static Resource getResourceSync(DynamicResource dynamicResource) {
+ AtomicReference<Resource> resourcePointer = new AtomicReference<>();
+ dynamicResource.setOnResourceReadyCallback((resource) -> resourcePointer.set(resource));
+ dynamicResource.onResourceRequested();
+ Resource temp = resourcePointer.get();
+ assertNotNull(temp);
+
+ // Clear out the callback which is owning the AtomicReference, which in turn keeps alive the
+ // Resource and/or Bitmap. Some tests will verify GC is able to reclaim these.
+ dynamicResource.setOnResourceReadyCallback(null);
+
+ return temp;
+ }
+} \ No newline at end of file
diff --git a/chromium/ui/android/junit/src/org/chromium/ui/resources/dynamics/ViewResourceAdapterTest.java b/chromium/ui/android/junit/src/org/chromium/ui/resources/dynamics/ViewResourceAdapterTest.java
index da93e809a3e..0a863dc8c36 100644
--- a/chromium/ui/android/junit/src/org/chromium/ui/resources/dynamics/ViewResourceAdapterTest.java
+++ b/chromium/ui/android/junit/src/org/chromium/ui/resources/dynamics/ViewResourceAdapterTest.java
@@ -20,12 +20,18 @@ import android.graphics.Rect;
import android.view.View;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.robolectric.annotation.Config;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.JniMocker;
+import org.chromium.ui.resources.ResourceFactory;
+import org.chromium.ui.resources.ResourceFactoryJni;
import java.lang.ref.WeakReference;
@@ -33,10 +39,29 @@ import java.lang.ref.WeakReference;
* Tests for {@link ViewResourceAdapter}.
*/
@RunWith(BaseRobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
+@Config(manifest = Config.NONE, shadows = {ViewResourceAdapterTest.ShadowCaptureUtils.class})
public class ViewResourceAdapterTest {
+ /**
+ * Mock this out to avoid calling {@link View#draw(Canvas)} on the mocked mView.
+ * Otherwise the GC-related tests would fail because Mockito holds onto a references to the
+ * bitmap forever.
+ */
+ @Implements(CaptureUtils.class)
+ static class ShadowCaptureUtils {
+ @Implementation
+ public static boolean captureCommon(Canvas canvas, View view, Rect dirtyRect, float scale,
+ boolean drawWhileDetached, CaptureObserver observer) {
+ return true;
+ }
+ }
+
private int mViewWidth;
private int mViewHeight;
+
+ @Rule
+ public JniMocker mJniMocker = new JniMocker();
+ @Mock
+ private ResourceFactory.Natives mResourceFactoryJni;
@Mock
private View mView;
@@ -45,6 +70,7 @@ public class ViewResourceAdapterTest {
@Before
public void setup() {
initMocks(this);
+ mJniMocker.mock(ResourceFactoryJni.TEST_HOOKS, mResourceFactoryJni);
mViewWidth = 200;
mViewHeight = 100;
@@ -52,22 +78,24 @@ public class ViewResourceAdapterTest {
when(mView.getWidth()).thenAnswer((invocation) -> mViewWidth);
when(mView.getHeight()).thenAnswer((invocation) -> mViewHeight);
- mAdapter = new ViewResourceAdapter(mView) {
- /**
- * Mock this out to avoid calling {@link View#draw(Canvas)} on the mocked mView.
- * Otherwise the GC-related tests would fail.
- */
- @Override
- protected boolean captureCommon(Canvas canvas, boolean drawWhileDetached) {
- return true;
- }
- };
+ mAdapter = new ViewResourceAdapter(mView);
+ }
+
+ private Rect getBitmapSize() {
+ // Need to mark dirty before requesting, otherwise it will no-op.
+ mAdapter.invalidate(null);
+ return DynamicResourceTestUtils.getBitmapSizeSync(mAdapter);
+ }
+ private Bitmap getBitmap() {
+ // Need to mark dirty before requesting, otherwise it will no-op.
+ mAdapter.invalidate(null);
+ return DynamicResourceTestUtils.getBitmapSync(mAdapter);
}
@Test
public void testGetBitmap() {
- Bitmap bitmap = mAdapter.getBitmap();
+ Bitmap bitmap = getBitmap();
assertNotNull(bitmap);
assertEquals(mViewWidth, bitmap.getWidth());
assertEquals(mViewHeight, bitmap.getHeight());
@@ -75,8 +103,9 @@ public class ViewResourceAdapterTest {
@Test
public void testGetBitmapSize() {
- Bitmap bitmap = mAdapter.getBitmap();
- Rect rect = mAdapter.getBitmapSize();
+ Bitmap bitmap = getBitmap();
+ Rect rect = getBitmapSize();
+
assertEquals(bitmap.getWidth(), rect.width());
assertEquals(bitmap.getHeight(), rect.height());
}
@@ -85,11 +114,11 @@ public class ViewResourceAdapterTest {
public void testSetDownsamplingSize() {
float scale = 0.5f;
mAdapter.setDownsamplingScale(scale);
- Bitmap bitmap = mAdapter.getBitmap();
+ Bitmap bitmap = getBitmap();
assertEquals(mViewWidth * scale, bitmap.getWidth(), 1);
assertEquals(mViewHeight * scale, bitmap.getHeight(), 1);
- Rect rect = mAdapter.getBitmapSize();
+ Rect rect = getBitmapSize();
assertEquals(mViewWidth, rect.width());
assertEquals(mViewHeight, rect.height());
}
@@ -98,13 +127,13 @@ public class ViewResourceAdapterTest {
public void testIsDirty() {
assertTrue(mAdapter.isDirty());
- mAdapter.getBitmap();
+ getBitmap();
assertFalse(mAdapter.isDirty());
}
@Test
public void testOnLayoutChange() {
- mAdapter.getBitmap();
+ getBitmap();
assertFalse(mAdapter.isDirty());
mAdapter.onLayoutChange(mView, 0, 0, 1, 2, 0, 0, mViewWidth, mViewHeight);
@@ -119,7 +148,7 @@ public class ViewResourceAdapterTest {
public void testOnLayoutChangeDownsampled() {
mAdapter.setDownsamplingScale(0.5f);
- mAdapter.getBitmap();
+ getBitmap();
assertFalse(mAdapter.isDirty());
mAdapter.onLayoutChange(mView, 0, 0, 1, 2, 0, 0, mViewWidth, mViewHeight);
@@ -132,7 +161,7 @@ public class ViewResourceAdapterTest {
@Test
public void testInvalidate() {
- mAdapter.getBitmap();
+ getBitmap();
assertFalse(mAdapter.isDirty());
mAdapter.invalidate(null);
@@ -145,7 +174,7 @@ public class ViewResourceAdapterTest {
@Test
public void testInvalidateRect() {
- mAdapter.getBitmap();
+ getBitmap();
assertFalse(mAdapter.isDirty());
Rect dirtyRect = new Rect(1, 2, 3, 4);
@@ -158,7 +187,7 @@ public class ViewResourceAdapterTest {
public void testInvalidateRectDownsampled() {
mAdapter.setDownsamplingScale(0.5f);
- mAdapter.getBitmap();
+ getBitmap();
assertFalse(mAdapter.isDirty());
Rect dirtyRect = new Rect(1, 2, 3, 4);
@@ -169,7 +198,7 @@ public class ViewResourceAdapterTest {
@Test
public void testInvalidateRectUnion() {
- mAdapter.getBitmap();
+ getBitmap();
assertFalse(mAdapter.isDirty());
mAdapter.invalidate(new Rect(1, 2, 3, 4));
@@ -181,7 +210,7 @@ public class ViewResourceAdapterTest {
@Test
public void testGetBitmapResized() {
- Bitmap bitmap = mAdapter.getBitmap();
+ Bitmap bitmap = getBitmap();
assertNotNull(bitmap);
assertEquals(mViewWidth, bitmap.getWidth());
assertEquals(mViewHeight, bitmap.getHeight());
@@ -189,7 +218,7 @@ public class ViewResourceAdapterTest {
mViewWidth = 10;
mViewHeight = 20;
mAdapter.invalidate(null);
- Bitmap bitmap2 = mAdapter.getBitmap();
+ Bitmap bitmap2 = getBitmap();
assertNotNull(bitmap2);
assertEquals(mViewWidth, bitmap2.getWidth());
assertEquals(mViewHeight, bitmap2.getHeight());
@@ -198,39 +227,39 @@ public class ViewResourceAdapterTest {
@Test
public void testBitmapReused() {
- Bitmap bitmap = mAdapter.getBitmap();
+ Bitmap bitmap = getBitmap();
assertNotNull(bitmap);
mAdapter.invalidate(null);
assertTrue(mAdapter.isDirty());
- assertEquals(bitmap, mAdapter.getBitmap());
+ assertEquals(bitmap, getBitmap());
}
@Test
public void testDropCachedBitmap() {
- Bitmap bitmap = mAdapter.getBitmap();
+ Bitmap bitmap = getBitmap();
assertNotNull(bitmap);
mAdapter.invalidate(null);
assertTrue(mAdapter.isDirty());
- assertEquals(bitmap, mAdapter.getBitmap());
+ assertEquals(bitmap, getBitmap());
mAdapter.dropCachedBitmap();
mAdapter.invalidate(null);
assertTrue(mAdapter.isDirty());
- assertNotEquals(bitmap, mAdapter.getBitmap());
+ assertNotEquals(bitmap, getBitmap());
}
@Test
public void testDropCachedBitmapNotDirty() {
- mAdapter.getBitmap();
+ getBitmap();
mAdapter.dropCachedBitmap();
assertFalse(mAdapter.isDirty());
}
@Test
public void testDropCachedBitmapGCed() {
- WeakReference<Bitmap> bitmapWeakReference = new WeakReference<>(mAdapter.getBitmap());
+ WeakReference<Bitmap> bitmapWeakReference = new WeakReference<>(getBitmap());
assertNotNull(bitmapWeakReference.get());
assertFalse(canBeGarbageCollected(bitmapWeakReference));
@@ -240,19 +269,19 @@ public class ViewResourceAdapterTest {
@Test
public void testResizeGCed() {
- WeakReference<Bitmap> bitmapWeakReference = new WeakReference<>(mAdapter.getBitmap());
+ WeakReference<Bitmap> bitmapWeakReference = new WeakReference<>(getBitmap());
assertNotNull(bitmapWeakReference.get());
assertFalse(canBeGarbageCollected(bitmapWeakReference));
mViewWidth += 10;
mAdapter.invalidate(null);
- mAdapter.getBitmap();
+ getBitmap();
assertTrue(canBeGarbageCollected(bitmapWeakReference));
}
@Test
public void testGetDirtyRect() {
- mAdapter.getBitmap();
+ getBitmap();
Rect rect = mAdapter.getDirtyRect();
assertTrue(rect.isEmpty());
@@ -266,7 +295,7 @@ public class ViewResourceAdapterTest {
public void testGetDirtyRectDownsampled() {
mAdapter.setDownsamplingScale(0.5f);
- mAdapter.getBitmap();
+ getBitmap();
Rect rect = mAdapter.getDirtyRect();
assertTrue(rect.isEmpty());
diff --git a/chromium/ui/android/view_android.cc b/chromium/ui/android/view_android.cc
index 88f52f45efd..987194edad7 100644
--- a/chromium/ui/android/view_android.cc
+++ b/chromium/ui/android/view_android.cc
@@ -442,6 +442,15 @@ void ViewAndroid::OnCursorChanged(const Cursor& cursor) {
}
}
+void ViewAndroid::SetHoverActionStylusWritable(bool stylus_writable) {
+ ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate());
+ if (delegate.is_null())
+ return;
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_ViewAndroidDelegate_setHoverActionStylusWritable(env, delegate,
+ stylus_writable);
+}
+
void ViewAndroid::OnBackgroundColorChanged(unsigned int color) {
ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate());
if (delegate.is_null())
diff --git a/chromium/ui/android/view_android.h b/chromium/ui/android/view_android.h
index d9983159105..3df8a036ee9 100644
--- a/chromium/ui/android/view_android.h
+++ b/chromium/ui/android/view_android.h
@@ -169,6 +169,7 @@ class UI_ANDROID_EXPORT ViewAndroid {
const gfx::Size& size,
absl::optional<base::TimeDelta> deadline_override = absl::nullopt);
void OnCursorChanged(const Cursor& cursor);
+ void SetHoverActionStylusWritable(bool stylus_writable);
void OnBackgroundColorChanged(unsigned int color);
void OnTopControlsChanged(float top_controls_offset,
float top_content_offset,
diff --git a/chromium/ui/android/window_android.cc b/chromium/ui/android/window_android.cc
index 42cc265ce7a..3c4a28877fd 100644
--- a/chromium/ui/android/window_android.cc
+++ b/chromium/ui/android/window_android.cc
@@ -250,11 +250,6 @@ WindowAndroid* WindowAndroid::GetWindowAndroid() const {
return const_cast<WindowAndroid*>(this);
}
-ScopedJavaLocalRef<jobject> WindowAndroid::GetWindowToken() {
- JNIEnv* env = AttachCurrentThread();
- return Java_WindowAndroid_getWindowToken(env, GetJavaObject());
-}
-
display::Display WindowAndroid::GetDisplayWithWindowColorSpace() {
display::Display display =
display::Screen::GetScreen()->GetDisplayNearestWindow(this);
diff --git a/chromium/ui/android/window_android.h b/chromium/ui/android/window_android.h
index 5ffff2c35c6..25abcac4902 100644
--- a/chromium/ui/android/window_android.h
+++ b/chromium/ui/android/window_android.h
@@ -107,9 +107,6 @@ class UI_ANDROID_EXPORT WindowAndroid : public ViewAndroid {
static std::unique_ptr<ScopedWindowAndroidForTesting> CreateForTesting();
- // Return the window token for this window, if one exists.
- base::android::ScopedJavaLocalRef<jobject> GetWindowToken();
-
// This should return the same Display as Screen::GetDisplayNearestWindow
// except the color space depends on the status of this particular window
// rather than the display itself.
diff --git a/chromium/ui/aura/BUILD.gn b/chromium/ui/aura/BUILD.gn
index 033d8551fed..4b140564c2d 100644
--- a/chromium/ui/aura/BUILD.gn
+++ b/chromium/ui/aura/BUILD.gn
@@ -322,7 +322,6 @@ test("aura_unittests") {
"//mojo/core/embedder",
"//skia",
"//testing/gtest",
- "//ui/aura/cursor:unittests",
"//ui/aura_extra",
"//ui/aura_extra:tests",
"//ui/base:test_support",
@@ -345,9 +344,11 @@ test("aura_unittests") {
}
if (is_fuchsia) {
- use_cfv2 = false
- additional_manifest_fragments =
- [ "//build/config/fuchsia/test/present_view_capabilities.test-cmx" ]
+ use_cfv1 = false
+ additional_manifest_fragments = [
+ "//build/config/fuchsia/test/present_view.shard.test-cml",
+ "//third_party/fuchsia-sdk/sdk/pkg/vulkan/client.shard.cml",
+ ]
}
data_deps = [ "//third_party/mesa_headers" ]
diff --git a/chromium/ui/aura/OWNERS b/chromium/ui/aura/OWNERS
index 5b124f5fd28..38b739d3aeb 100644
--- a/chromium/ui/aura/OWNERS
+++ b/chromium/ui/aura/OWNERS
@@ -1,4 +1,7 @@
sky@chromium.org
+oshima@chromium.org
+
+# Not working on chromium anymore, but kept just in case we need his review.
sadrul@chromium.org
per-file *x11.cc=thomasanderson@chromium.org
diff --git a/chromium/ui/aura/client/aura_constants.cc b/chromium/ui/aura/client/aura_constants.cc
index 409191bb33f..21cf0ff894e 100644
--- a/chromium/ui/aura/client/aura_constants.cc
+++ b/chromium/ui/aura/client/aura_constants.cc
@@ -76,6 +76,7 @@ DEFINE_UI_CLASS_PROPERTY_KEY(ui::WindowShowState,
DEFINE_UI_CLASS_PROPERTY_KEY(ui::WindowShowState,
kRestoreShowStateKey,
ui::SHOW_STATE_NORMAL)
+DEFINE_UI_CLASS_PROPERTY_KEY(bool, kIsRestoringKey, false)
DEFINE_UI_CLASS_PROPERTY_KEY(bool, kSkipImeProcessing, false)
DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(std::u16string, kTitleKey, nullptr)
DEFINE_UI_CLASS_PROPERTY_KEY(int, kTopViewInset, 0)
diff --git a/chromium/ui/aura/client/aura_constants.h b/chromium/ui/aura/client/aura_constants.h
index abf3c63e895..a2b27f6ad66 100644
--- a/chromium/ui/aura/client/aura_constants.h
+++ b/chromium/ui/aura/client/aura_constants.h
@@ -153,6 +153,16 @@ AURA_EXPORT extern const WindowProperty<ui::WindowShowState>* const
AURA_EXPORT extern const WindowProperty<ui::WindowShowState>* const
kRestoreShowStateKey;
+// A property key to indicate if a window is currently being restored. Normally
+// restoring a window equals to changing window's state to normal window state.
+// This property will be used on Chrome OS to decide if we should use window
+// state restore stack to decide which window state the window should restore
+// back to, and it's not always the normal window state. As an example,
+// unminimizing a window will restore the window back to its pre-minimized
+// window state, which can have a non-normal window state. Note this property
+// does not have any effort on any other operation systems except Chrome OS.
+AURA_EXPORT extern const WindowProperty<bool>* const kIsRestoringKey;
+
// A property key to store key event dispatch policy. The default value is
// false, which means IME receives a key event in PREDISPATCH phace before a
// window receives it. If it's true, a window receives a key event before IME.
diff --git a/chromium/ui/aura/client/capture_client.h b/chromium/ui/aura/client/capture_client.h
index c7874267e8b..cd17c05c89b 100644
--- a/chromium/ui/aura/client/capture_client.h
+++ b/chromium/ui/aura/client/capture_client.h
@@ -15,6 +15,14 @@ namespace client {
class CaptureClientObserver;
// An interface implemented by an object that manages input capture.
+//
+// The intended semantics of window-capture are that:
+// * At most one window on the system can register as "capturing" input.
+// * If a window is capturing input, then all input events will get routed to
+// this window.
+// * The window may choose to release capture while processing an event. The
+// resulting behavior is platform dependent (e.g. whether the event is
+// redispatched to the window server).
class AURA_EXPORT CaptureClient {
public:
// Does a capture on the |window|.
diff --git a/chromium/ui/aura/cursor/BUILD.gn b/chromium/ui/aura/cursor/BUILD.gn
deleted file mode 100644
index 41b7004c087..00000000000
--- a/chromium/ui/aura/cursor/BUILD.gn
+++ /dev/null
@@ -1,52 +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.
-
-component("cursor") {
- output_name = "ui_aura_cursor"
- sources = [
- "cursor_loader.cc",
- "cursor_loader.h",
- "cursor_lookup.cc",
- "cursor_lookup.h",
- "cursor_util.cc",
- "cursor_util.h",
- "cursors_aura.cc",
- "cursors_aura.h",
- ]
- defines = [ "IS_UI_AURA_CURSOR_IMPL" ]
- public_deps = [
- "//base",
- "//ui/base/cursor",
- "//ui/base/cursor/mojom:cursor_type",
- "//ui/display",
- ]
- deps = [
- "//skia",
- "//ui/base",
- "//ui/gfx",
- "//ui/gfx/geometry",
- "//ui/resources:ui_resources_grd",
- ]
-}
-
-source_set("unittests") {
- testonly = true
- sources = [
- "cursor_loader_unittest.cc",
- "cursor_util_unittest.cc",
- ]
- deps = [
- ":cursor",
- "//base",
- "//skia",
- "//testing/gtest",
- "//ui/aura:test_support",
- "//ui/base",
- "//ui/base/cursor",
- "//ui/base/cursor/mojom:cursor_type",
- "//ui/gfx:gfx_skia",
- "//ui/gfx/geometry",
- ]
- data_deps = [ "//ui/resources:ui_test_pak_data" ]
-}
diff --git a/chromium/ui/aura/cursor/DEPS b/chromium/ui/aura/cursor/DEPS
deleted file mode 100644
index 5ea09cfdcd1..00000000000
--- a/chromium/ui/aura/cursor/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
- "+ui/resources",
-]
diff --git a/chromium/ui/aura/cursor/OWNERS b/chromium/ui/aura/cursor/OWNERS
deleted file mode 100644
index 229cc1ab7f2..00000000000
--- a/chromium/ui/aura/cursor/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://ui/base/cursor/OWNERS
diff --git a/chromium/ui/aura/env.cc b/chromium/ui/aura/env.cc
index 219ffda5e7f..0268a5fec7b 100644
--- a/chromium/ui/aura/env.cc
+++ b/chromium/ui/aura/env.cc
@@ -14,12 +14,14 @@
#include "base/observer_list_types.h"
#include "build/build_config.h"
#include "ui/aura/client/aura_constants.h"
+#include "ui/aura/client/screen_position_client.h"
#include "ui/aura/env_input_state_controller.h"
#include "ui/aura/env_observer.h"
#include "ui/aura/input_state_lookup.h"
#include "ui/aura/window.h"
#include "ui/aura/window_event_dispatcher_observer.h"
#include "ui/aura/window_occlusion_tracker.h"
+#include "ui/display/screen.h"
#include "ui/events/event_observer.h"
#include "ui/events/event_target_iterator.h"
#include "ui/events/gestures/gesture_recognizer_impl.h"
@@ -67,7 +69,7 @@ class EventObserverAdapter : public ui::EventHandler,
// ui::EventHandler:
void OnEvent(ui::Event* event) override {
if (types_.count(event->type()) > 0) {
- std::unique_ptr<ui::Event> cloned_event = ui::Event::Clone(*event);
+ std::unique_ptr<ui::Event> cloned_event = event->Clone();
ui::Event::DispatcherApi(cloned_event.get()).set_target(event->target());
// The root location of located events should be in screen coordinates.
if (cloned_event->IsLocatedEvent() && cloned_event->target()) {
@@ -152,6 +154,33 @@ void Env::SetGestureRecognizer(
gesture_recognizer_ = std::move(gesture_recognizer);
}
+gfx::Point Env::GetLastPointerPoint(ui::mojom::DragEventSource event_source,
+ Window* window,
+ absl::optional<gfx::Point> fallback) {
+ if (event_source == ui::mojom::DragEventSource::kTouch && is_touch_down()) {
+ DCHECK(window);
+ DCHECK(window->GetRootWindow());
+ gfx::PointF touch_point_f;
+ bool got_touch_point = gesture_recognizer()->GetLastTouchPointForTarget(
+ window, &touch_point_f);
+ if (got_touch_point) {
+ Window* root = window->GetRootWindow();
+ DCHECK(root);
+ DCHECK(root->GetRootWindow());
+ DCHECK(aura::client::GetScreenPositionClient(root->GetRootWindow()));
+ client::GetScreenPositionClient(root->GetRootWindow())
+ ->ConvertPointToScreen(root, &touch_point_f);
+ return gfx::ToFlooredPoint(touch_point_f);
+ }
+ // Fallback when touch state is lost. See http://crbug.com/1162541.
+ if (fallback)
+ return *fallback;
+ }
+
+ // TODO(https://crbug.com/1338746): Use last_mouse_location_.
+ return display::Screen::GetScreen()->GetCursorScreenPoint();
+}
+
WindowOcclusionTracker* Env::GetWindowOcclusionTracker() {
if (!window_occlusion_tracker_) {
// Use base::WrapUnique + new because of the constructor is private.
diff --git a/chromium/ui/aura/env.h b/chromium/ui/aura/env.h
index 44488da7fa2..0b947f277e6 100644
--- a/chromium/ui/aura/env.h
+++ b/chromium/ui/aura/env.h
@@ -14,6 +14,7 @@
#include "build/build_config.h"
#include "mojo/public/cpp/system/buffer.h"
#include "ui/aura/aura_export.h"
+#include "ui/base/dragdrop/mojom/drag_drop_types.mojom.h"
#include "ui/events/event_target.h"
#include "ui/events/types/event_type.h"
#include "ui/gfx/geometry/point.h"
@@ -113,10 +114,15 @@ class AURA_EXPORT Env : public ui::EventTarget,
ui::GestureRecognizer* gesture_recognizer() {
return gesture_recognizer_.get();
}
-
void SetGestureRecognizer(
std::unique_ptr<ui::GestureRecognizer> gesture_recognizer);
+ // The `fallback` parameter allows callers of this API to specify a
+ // value to be returned in the case of a missing touch state.
+ gfx::Point GetLastPointerPoint(ui::mojom::DragEventSource event_source,
+ aura::Window* window,
+ absl::optional<gfx::Point> fallback);
+
// Get WindowOcclusionTracker instance. Create one if not yet created.
WindowOcclusionTracker* GetWindowOcclusionTracker();
@@ -193,7 +199,9 @@ class AURA_EXPORT Env : public ui::EventTarget,
std::unique_ptr<InputStateLookup> input_state_lookup_;
std::unique_ptr<ui::PlatformEventSource> event_source_;
- raw_ptr<ui::ContextFactory> context_factory_ = nullptr;
+ // TODO(crbug.com/1298696): Breaks content_unittests.
+ raw_ptr<ui::ContextFactory, DanglingUntriagedDegradeToNoOpWhenMTE>
+ context_factory_ = nullptr;
static bool initial_throttle_input_on_resize_;
bool throttle_input_on_resize_ = initial_throttle_input_on_resize_;
diff --git a/chromium/ui/aura/gestures/OWNERS b/chromium/ui/aura/gestures/OWNERS
index 854bbfa6ab0..9f2d76af775 100644
--- a/chromium/ui/aura/gestures/OWNERS
+++ b/chromium/ui/aura/gestures/OWNERS
@@ -1,3 +1,2 @@
rjkroege@chromium.org
-sadrul@chromium.org
flackr@chromium.org
diff --git a/chromium/ui/aura/native_window_occlusion_tracker_win.cc b/chromium/ui/aura/native_window_occlusion_tracker_win.cc
index 01d9ccbca25..58e42377a23 100644
--- a/chromium/ui/aura/native_window_occlusion_tracker_win.cc
+++ b/chromium/ui/aura/native_window_occlusion_tracker_win.cc
@@ -254,12 +254,8 @@ bool NativeWindowOcclusionTrackerWin::IsWindowVisibleAndFullyOpaque(
// not displayed. explorer.exe, in particular has one that's the
// size of the desktop. It's usually behind Chrome windows in the z-order,
// but using a remote desktop can move it up in the z-order. So, ignore them.
- DWORD reason;
- if (SUCCEEDED(DwmGetWindowAttribute(hwnd, DWMWA_CLOAKED, &reason,
- sizeof(reason))) &&
- reason != 0) {
+ if (gfx::IsWindowCloaked(hwnd))
return false;
- }
RECT win_rect;
// Filter out windows that take up zero area. The call to GetWindowRect is one
@@ -954,6 +950,10 @@ absl::optional<bool> NativeWindowOcclusionTrackerWin::
if (!virtual_desktop_manager_)
return true;
+ // If the window is not cloaked, it is not on another desktop.
+ if (!gfx::IsWindowCloaked(hwnd))
+ return true;
+
return gfx::IsWindowOnCurrentVirtualDesktop(hwnd, virtual_desktop_manager_);
}
diff --git a/chromium/ui/aura/screen_ozone.cc b/chromium/ui/aura/screen_ozone.cc
index a78a6a48f1d..1b8ab23a1d2 100644
--- a/chromium/ui/aura/screen_ozone.cc
+++ b/chromium/ui/aura/screen_ozone.cc
@@ -4,6 +4,8 @@
#include "ui/aura/screen_ozone.h"
+#include <memory>
+
#include "ui/aura/client/screen_position_client.h"
#include "ui/aura/window.h"
#include "ui/aura/window_tree_host.h"
@@ -108,8 +110,16 @@ display::Display ScreenOzone::GetPrimaryDisplay() const {
}
#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
-bool ScreenOzone::SetScreenSaverSuspended(bool suspend) {
- return platform_screen_->SetScreenSaverSuspended(suspend);
+ScreenOzone::ScreenSaverSuspenderOzone::ScreenSaverSuspenderOzone(
+ std::unique_ptr<ui::PlatformScreen::PlatformScreenSaverSuspender> suspender)
+ : suspender_(std::move(suspender)) {}
+
+ScreenOzone::ScreenSaverSuspenderOzone::~ScreenSaverSuspenderOzone() = default;
+
+std::unique_ptr<display::Screen::ScreenSaverSuspender>
+ScreenOzone::SuspendScreenSaver() {
+ return std::make_unique<ScreenSaverSuspenderOzone>(
+ platform_screen_->SuspendScreenSaver());
}
#endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
@@ -133,7 +143,7 @@ std::string ScreenOzone::GetCurrentWorkspace() {
return platform_screen_->GetCurrentWorkspace();
}
-std::vector<base::Value> ScreenOzone::GetGpuExtraInfo(
+base::Value::List ScreenOzone::GetGpuExtraInfo(
const gfx::GpuExtraInfo& gpu_extra_info) {
return platform_screen_->GetGpuExtraInfo(gpu_extra_info);
}
diff --git a/chromium/ui/aura/screen_ozone.h b/chromium/ui/aura/screen_ozone.h
index 2970a0e0e7d..ebd8d2394bb 100644
--- a/chromium/ui/aura/screen_ozone.h
+++ b/chromium/ui/aura/screen_ozone.h
@@ -8,13 +8,11 @@
#include <memory>
#include <vector>
+#include "base/values.h"
#include "build/chromeos_buildflags.h"
#include "ui/aura/aura_export.h"
#include "ui/display/screen.h"
-
-namespace ui {
-class PlatformScreen;
-}
+#include "ui/ozone/public/platform_screen.h"
namespace aura {
@@ -48,12 +46,16 @@ class AURA_EXPORT ScreenOzone : public display::Screen {
display::Display GetDisplayMatching(
const gfx::Rect& match_rect) const override;
display::Display GetPrimaryDisplay() const override;
+#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
+ std::unique_ptr<display::Screen::ScreenSaverSuspender> SuspendScreenSaver()
+ override;
+#endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
bool IsScreenSaverActive() const override;
base::TimeDelta CalculateIdleTime() const override;
void AddObserver(display::DisplayObserver* observer) override;
void RemoveObserver(display::DisplayObserver* observer) override;
std::string GetCurrentWorkspace() override;
- std::vector<base::Value> GetGpuExtraInfo(
+ base::Value::List GetGpuExtraInfo(
const gfx::GpuExtraInfo& gpu_extra_info) override;
// Returns the NativeWindow associated with the AcceleratedWidget.
@@ -65,11 +67,27 @@ class AURA_EXPORT ScreenOzone : public display::Screen {
protected:
ui::PlatformScreen* platform_screen() { return platform_screen_.get(); }
+ private:
#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
- bool SetScreenSaverSuspended(bool suspend) override;
+ class ScreenSaverSuspenderOzone
+ : public display::Screen::ScreenSaverSuspender {
+ public:
+ explicit ScreenSaverSuspenderOzone(
+ std::unique_ptr<ui::PlatformScreen::PlatformScreenSaverSuspender>
+ suspender);
+
+ ScreenSaverSuspenderOzone(const ScreenSaverSuspenderOzone&) = delete;
+ ScreenSaverSuspenderOzone& operator=(const ScreenSaverSuspenderOzone&) =
+ delete;
+
+ ~ScreenSaverSuspenderOzone() override;
+
+ private:
+ std::unique_ptr<ui::PlatformScreen::PlatformScreenSaverSuspender>
+ suspender_;
+ };
#endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
- private:
gfx::AcceleratedWidget GetAcceleratedWidgetForWindow(
aura::Window* window) const;
diff --git a/chromium/ui/aura/test/ui_controls_ozone.cc b/chromium/ui/aura/test/ui_controls_ozone.cc
index 560b407d384..b2f598ad3fa 100644
--- a/chromium/ui/aura/test/ui_controls_ozone.cc
+++ b/chromium/ui/aura/test/ui_controls_ozone.cc
@@ -208,7 +208,7 @@ bool UIControlsOzone::SendMouseClick(ui_controls::MouseButton type) {
ui_controls::kNoAccelerator);
}
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
bool UIControlsOzone::SendTouchEvents(int action, int id, int x, int y) {
return SendTouchEventsNotifyWhenDone(action, id, x, y, base::OnceClosure());
}
@@ -252,7 +252,7 @@ void UIControlsOzone::SendEventToSink(ui::Event* event,
base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
std::move(closure));
}
- WindowTreeHost* host = optional_host ? optional_host : host_;
+ WindowTreeHost* host = optional_host ? optional_host : host_.get();
ui::EventSourceTestApi event_source_test(host->GetEventSource());
std::ignore = event_source_test.SendEventToSink(event);
}
diff --git a/chromium/ui/aura/test/ui_controls_ozone.h b/chromium/ui/aura/test/ui_controls_ozone.h
index 9e64ff1a736..68fe5840a38 100644
--- a/chromium/ui/aura/test/ui_controls_ozone.h
+++ b/chromium/ui/aura/test/ui_controls_ozone.h
@@ -7,6 +7,7 @@
#include "base/bind.h"
#include "base/logging.h"
+#include "base/memory/raw_ptr.h"
#include "base/task/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "build/chromeos_buildflags.h"
@@ -59,7 +60,7 @@ class UIControlsOzone : public ui_controls::UIControlsAura {
base::OnceClosure closure,
int accelerator_state) override;
bool SendMouseClick(ui_controls::MouseButton type) override;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
bool SendTouchEvents(int action, int id, int x, int y) override;
bool SendTouchEventsNotifyWhenDone(int action,
int id,
@@ -120,7 +121,7 @@ class UIControlsOzone : public ui_controls::UIControlsAura {
// This is the default host used for events that are not scoped to a window.
// Events scoped to a window always use the window's host.
- WindowTreeHost* const host_;
+ const raw_ptr<WindowTreeHost> host_;
// Mask of the mouse buttons currently down. This is static as it needs to
// track the state globally for all displays. A UIControlsOzone instance is
diff --git a/chromium/ui/aura/window.h b/chromium/ui/aura/window.h
index d564d05a0ac..ca95c22042a 100644
--- a/chromium/ui/aura/window.h
+++ b/chromium/ui/aura/window.h
@@ -725,7 +725,7 @@ class AURA_EXPORT Window : public ui::LayerDelegate,
// parent during its parents destruction.
bool owned_by_parent_ = true;
- raw_ptr<WindowDelegate> delegate_;
+ raw_ptr<WindowDelegate, DanglingUntriaged> delegate_;
// The Window's parent.
raw_ptr<Window> parent_ = nullptr;
diff --git a/chromium/ui/aura/window_event_dispatcher_unittest.cc b/chromium/ui/aura/window_event_dispatcher_unittest.cc
index 3875abfe3ef..7862a874bcc 100644
--- a/chromium/ui/aura/window_event_dispatcher_unittest.cc
+++ b/chromium/ui/aura/window_event_dispatcher_unittest.cc
@@ -111,13 +111,13 @@ class ConsumeKeyHandler : public ui::test::TestEventHandler {
}
};
-// InputMethodDelegate that tracks the events passed to PostIME phase.
-class TestInputMethodDelegate : public ui::internal::InputMethodDelegate {
+// ImeKeyEventDispatcher that tracks the events passed to PostIME phase.
+class TestImeKeyEventDispatcher : public ui::ImeKeyEventDispatcher {
public:
- TestInputMethodDelegate() = default;
- ~TestInputMethodDelegate() override = default;
+ TestImeKeyEventDispatcher() = default;
+ ~TestImeKeyEventDispatcher() override = default;
- // ui::internal::InputMethodDelegate:
+ // ui::ImeKeyEventDispatcher:
ui::EventDispatchDetails DispatchKeyEventPostIME(
ui::KeyEvent* event) override {
++dispatched_event_count_;
@@ -401,16 +401,22 @@ TEST_F(WindowEventDispatcherTest, GetCanProcessEventsWithinSubtree) {
}
TEST_F(WindowEventDispatcherTest, DontIgnoreUnknownKeys) {
+ ui::Event::Properties properties;
+ properties.emplace(ui::kPropertyKeyboardImeFlag,
+ std::vector<uint8_t>{ui::kPropertyKeyboardImeIgnoredFlag});
+
ConsumeKeyHandler handler;
root_window()->AddPreTargetHandler(&handler);
ui::KeyEvent unknown_event(ui::ET_KEY_PRESSED, ui::VKEY_UNKNOWN, ui::EF_NONE);
+ unknown_event.SetProperties(properties);
DispatchEventUsingWindowDispatcher(&unknown_event);
EXPECT_TRUE(unknown_event.handled());
EXPECT_EQ(1, handler.num_key_events());
handler.Reset();
ui::KeyEvent known_event(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::EF_NONE);
+ known_event.SetProperties(properties);
DispatchEventUsingWindowDispatcher(&known_event);
EXPECT_TRUE(known_event.handled());
EXPECT_EQ(1, handler.num_key_events());
@@ -418,6 +424,7 @@ TEST_F(WindowEventDispatcherTest, DontIgnoreUnknownKeys) {
handler.Reset();
ui::KeyEvent ime_event(ui::ET_KEY_PRESSED, ui::VKEY_UNKNOWN,
ui::EF_IME_FABRICATED_KEY);
+ ime_event.SetProperties(properties);
DispatchEventUsingWindowDispatcher(&ime_event);
EXPECT_TRUE(ime_event.handled());
EXPECT_EQ(1, handler.num_key_events());
@@ -426,6 +433,7 @@ TEST_F(WindowEventDispatcherTest, DontIgnoreUnknownKeys) {
ui::KeyEvent unknown_key_with_char_event(ui::ET_KEY_PRESSED, ui::VKEY_UNKNOWN,
ui::EF_NONE);
unknown_key_with_char_event.set_character(0x00e4 /* "ä" */);
+ unknown_key_with_char_event.SetProperties(properties);
DispatchEventUsingWindowDispatcher(&unknown_key_with_char_event);
EXPECT_TRUE(unknown_key_with_char_event.handled());
EXPECT_EQ(1, handler.num_key_events());
@@ -440,6 +448,11 @@ TEST_F(WindowEventDispatcherTest, NoDelegateWindowReceivesKeyEvents) {
ui::test::TestEventHandler handler;
w1->AddPreTargetHandler(&handler);
ui::KeyEvent key_press(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::EF_NONE);
+ ui::Event::Properties properties;
+ properties.emplace(ui::kPropertyKeyboardImeFlag,
+ std::vector<uint8_t>{ui::kPropertyKeyboardImeIgnoredFlag});
+ key_press.SetProperties(properties);
+
DispatchEventUsingWindowDispatcher(&key_press);
EXPECT_TRUE(key_press.handled());
EXPECT_EQ(1, handler.num_key_events());
@@ -496,8 +509,8 @@ TEST_F(WindowEventDispatcherTest, ScrollEventDispatch) {
TEST_F(WindowEventDispatcherTest, PreDispatchKeyEventToIme) {
ui::MockInputMethod mock_ime(nullptr);
- TestInputMethodDelegate delegate;
- mock_ime.SetDelegate(&delegate);
+ TestImeKeyEventDispatcher dispatcher;
+ mock_ime.SetImeKeyEventDispatcher(&dispatcher);
host()->SetSharedInputMethod(&mock_ime);
ConsumeKeyHandler handler;
@@ -510,7 +523,7 @@ TEST_F(WindowEventDispatcherTest, PreDispatchKeyEventToIme) {
ui::KeyEvent key_press(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::EF_NONE);
DispatchEventUsingWindowDispatcher(&key_press);
EXPECT_EQ(0, handler.num_key_events());
- EXPECT_EQ(1, delegate.dispatched_event_count());
+ EXPECT_EQ(1, dispatcher.dispatched_event_count());
// However, for the window with kSkipImeProcessing
// The event went to the event target at first.
@@ -518,7 +531,7 @@ TEST_F(WindowEventDispatcherTest, PreDispatchKeyEventToIme) {
ui::KeyEvent key_release(ui::ET_KEY_RELEASED, ui::VKEY_A, ui::EF_NONE);
DispatchEventUsingWindowDispatcher(&key_release);
EXPECT_EQ(1, handler.num_key_events());
- EXPECT_EQ(1, delegate.dispatched_event_count());
+ EXPECT_EQ(1, dispatcher.dispatched_event_count());
}
namespace {
diff --git a/chromium/ui/aura/window_observer.h b/chromium/ui/aura/window_observer.h
index d893c9345b1..c84127caaa0 100644
--- a/chromium/ui/aura/window_observer.h
+++ b/chromium/ui/aura/window_observer.h
@@ -5,7 +5,7 @@
#ifndef UI_AURA_WINDOW_OBSERVER_H_
#define UI_AURA_WINDOW_OBSERVER_H_
-
+#include "base/memory/raw_ptr.h"
#include "base/observer_list_types.h"
#include "ui/aura/aura_export.h"
#include "ui/compositor/property_change_reason.h"
@@ -27,11 +27,11 @@ class AURA_EXPORT WindowObserver : public base::CheckedObserver {
HIERARCHY_CHANGED
};
- Window* target; // The window that was added or removed.
- Window* new_parent;
- Window* old_parent;
+ raw_ptr<Window> target; // The window that was added or removed.
+ raw_ptr<Window> new_parent;
+ raw_ptr<Window> old_parent;
HierarchyChangePhase phase;
- Window* receiver; // The window receiving the notification.
+ raw_ptr<Window> receiver; // The window receiving the notification.
};
WindowObserver();
diff --git a/chromium/ui/aura/window_tree_host.cc b/chromium/ui/aura/window_tree_host.cc
index 618560b574a..0d9378ddf13 100644
--- a/chromium/ui/aura/window_tree_host.cc
+++ b/chromium/ui/aura/window_tree_host.cc
@@ -156,7 +156,7 @@ class WindowTreeHost::HideHelper {
// WARNING: this has been deleted.
}
- raw_ptr<WindowTreeHost> host_;
+ raw_ptr<WindowTreeHost, DanglingUntriaged> host_;
scoped_refptr<cc::Layer> compositor_root_layer_;
std::unique_ptr<ui::Layer> layer_for_transition_;
base::WeakPtrFactory<HideHelper> weak_ptr_factory_{this};
@@ -175,10 +175,6 @@ WindowTreeHost::VideoCaptureLock::VideoCaptureLock(WindowTreeHost* host)
WindowTreeHost::~WindowTreeHost() {
DCHECK(!compositor_) << "compositor must be destroyed before root window";
- if (owned_input_method_) {
- delete input_method_;
- input_method_ = nullptr;
- }
}
// static
@@ -344,18 +340,15 @@ void WindowTreeHost::MoveCursorToLocationInPixels(
ui::InputMethod* WindowTreeHost::GetInputMethod() {
if (!input_method_) {
- input_method_ =
- ui::CreateInputMethod(this, GetAcceleratedWidget()).release();
- owned_input_method_ = true;
+ input_method_owned_ = ui::CreateInputMethod(this, GetAcceleratedWidget());
+ input_method_ = input_method_owned_.get();
}
return input_method_;
}
void WindowTreeHost::SetSharedInputMethod(ui::InputMethod* input_method) {
- if (input_method_ && owned_input_method_)
- delete input_method_;
input_method_ = input_method;
- owned_input_method_ = false;
+ input_method_owned_.reset();
}
ui::EventDispatchDetails WindowTreeHost::DispatchKeyEventPostIME(
@@ -660,13 +653,11 @@ void WindowTreeHost::OnAcceleratedWidgetAvailable() {
}
}
-void WindowTreeHost::OnHostMovedInPixels(
- const gfx::Point& new_location_in_pixels) {
- TRACE_EVENT1("ui", "WindowTreeHost::OnHostMovedInPixels", "origin",
- new_location_in_pixels.ToString());
+void WindowTreeHost::OnHostMovedInPixels() {
+ TRACE_EVENT0("ui", "WindowTreeHost::OnHostMovedInPixels");
for (WindowTreeHostObserver& observer : observers_)
- observer.OnHostMovedInPixels(this, new_location_in_pixels);
+ observer.OnHostMovedInPixels(this);
}
void WindowTreeHost::OnHostResizedInPixels(
diff --git a/chromium/ui/aura/window_tree_host.h b/chromium/ui/aura/window_tree_host.h
index 2e1ffa04104..b82002bbe82 100644
--- a/chromium/ui/aura/window_tree_host.h
+++ b/chromium/ui/aura/window_tree_host.h
@@ -22,7 +22,7 @@
#include "ui/aura/scoped_enable_unadjusted_mouse_events.h"
#include "ui/aura/window.h"
#include "ui/base/cursor/cursor.h"
-#include "ui/base/ime/input_method_delegate.h"
+#include "ui/base/ime/ime_key_event_dispatcher.h"
#include "ui/compositor/compositor_observer.h"
#include "ui/display/display_observer.h"
#include "ui/events/event_source.h"
@@ -63,7 +63,7 @@ class WindowTreeHostObserver;
// WindowTreeHost bridges between a native window and the embedded RootWindow.
// It provides the accelerated widget and maps events from the native os to
// aura.
-class AURA_EXPORT WindowTreeHost : public ui::internal::InputMethodDelegate,
+class AURA_EXPORT WindowTreeHost : public ui::ImeKeyEventDispatcher,
public ui::EventSource,
public display::DisplayObserver,
public ui::CompositorObserver {
@@ -195,7 +195,7 @@ class AURA_EXPORT WindowTreeHost : public ui::internal::InputMethodDelegate,
// WindowTreeHost to dispatch events.
void SetSharedInputMethod(ui::InputMethod* input_method);
- // Overridden from ui::internal::InputMethodDelegate:
+ // Overridden from ui::ImeKeyEventDispatcher:
ui::EventDispatchDetails DispatchKeyEventPostIME(ui::KeyEvent* event) final;
// Overridden from ui::EventSource:
@@ -342,7 +342,7 @@ class AURA_EXPORT WindowTreeHost : public ui::internal::InputMethodDelegate,
// Returns the location of the RootWindow on native screen.
virtual gfx::Point GetLocationOnScreenInPixels() const = 0;
- void OnHostMovedInPixels(const gfx::Point& new_location_in_pixels);
+ void OnHostMovedInPixels();
void OnHostResizedInPixels(const gfx::Size& new_size_in_pixels);
void OnHostWorkspaceChanged();
void OnHostDisplayChanged();
@@ -444,7 +444,7 @@ class AURA_EXPORT WindowTreeHost : public ui::internal::InputMethodDelegate,
// valid during its deletion. (Window's dtor notifies observers that may
// attempt to reach back up to access this object which will be valid until
// the end of the dtor).
- raw_ptr<Window> window_; // Owning.
+ raw_ptr<Window, DanglingUntriaged> window_; // Owning.
// Keeps track of the occlusion state of the host, and used to send
// notifications to observers when it changes.
@@ -481,14 +481,12 @@ class AURA_EXPORT WindowTreeHost : public ui::internal::InputMethodDelegate,
std::unique_ptr<ui::ViewProp> prop_;
+ std::unique_ptr<ui::InputMethod> input_method_owned_;
// The InputMethod instance used to process key events.
// If owned it, it is created in GetInputMethod() method;
// If not owned it, it is passed in through SetSharedInputMethod() method.
raw_ptr<ui::InputMethod> input_method_ = nullptr;
- // Whether the InputMethod instance is owned by this WindowTreeHost.
- bool owned_input_method_ = false;
-
// Set to true if this WindowTreeHost is currently holding pointer moves.
bool holding_pointer_moves_ = false;
diff --git a/chromium/ui/aura/window_tree_host_observer.h b/chromium/ui/aura/window_tree_host_observer.h
index ec317f17bbb..f9ef4976171 100644
--- a/chromium/ui/aura/window_tree_host_observer.h
+++ b/chromium/ui/aura/window_tree_host_observer.h
@@ -12,10 +12,6 @@
class SkRegion;
-namespace gfx {
-class Point;
-}
-
namespace aura {
class WindowTreeHost;
@@ -25,8 +21,7 @@ class AURA_EXPORT WindowTreeHostObserver {
virtual void OnHostResized(WindowTreeHost* host) {}
// Called when the host is moved on screen.
- virtual void OnHostMovedInPixels(WindowTreeHost* host,
- const gfx::Point& new_origin_in_pixels) {}
+ virtual void OnHostMovedInPixels(WindowTreeHost* host) {}
// Called when the host is moved to a different workspace.
virtual void OnHostWorkspaceChanged(WindowTreeHost* host) {}
diff --git a/chromium/ui/aura/window_tree_host_platform.cc b/chromium/ui/aura/window_tree_host_platform.cc
index e25a3357dae..657c84103e6 100644
--- a/chromium/ui/aura/window_tree_host_platform.cc
+++ b/chromium/ui/aura/window_tree_host_platform.cc
@@ -52,7 +52,7 @@ WindowTreeHostPlatform::WindowTreeHostPlatform(
ui::PlatformWindowInitProperties properties,
std::unique_ptr<Window> window)
: WindowTreeHost(std::move(window)) {
- bounds_in_pixels_ = properties.bounds;
+ size_in_pixels_ = properties.bounds.size();
CreateCompositor(false, false, properties.enable_compositing_based_throttling,
properties.compositor_memory_limit_mb);
CreateAndSetPlatformWindow(std::move(properties));
@@ -65,10 +65,10 @@ WindowTreeHostPlatform::WindowTreeHostPlatform(std::unique_ptr<Window> window)
void WindowTreeHostPlatform::CreateAndSetPlatformWindow(
ui::PlatformWindowInitProperties properties) {
- // Cache initial bounds used to create |platform_window_| so that it does not
+ // Cache initial size used to create |platform_window_| so that it does not
// end up propagating unneeded bounds change event when it is first notified
// through OnBoundsChanged, which may lead to unneeded re-layouts, etc.
- bounds_in_pixels_ = properties.bounds;
+ size_in_pixels_ = properties.bounds.size();
#if defined(USE_OZONE)
platform_window_ = ui::OzonePlatform::GetInstance()->CreatePlatformWindow(
this, std::move(properties));
@@ -197,18 +197,18 @@ void WindowTreeHostPlatform::OnBoundsChanged(const BoundsChange& change) {
}
float current_scale = compositor()->device_scale_factor();
float new_scale = ui::GetScaleFactorForNativeView(window());
- gfx::Rect old_bounds = bounds_in_pixels_;
auto weak_ref = GetWeakPtr();
- bounds_in_pixels_ = change.bounds;
- if (bounds_in_pixels_.origin() != old_bounds.origin()) {
- OnHostMovedInPixels(bounds_in_pixels_.origin());
+ auto new_size = GetBoundsInPixels().size();
+ bool size_changed = size_in_pixels_ != new_size;
+ size_in_pixels_ = new_size;
+ if (change.origin_changed) {
+ OnHostMovedInPixels();
// Changing the bounds may destroy this.
if (!weak_ref)
return;
}
- if (bounds_in_pixels_.size() != old_bounds.size() ||
- current_scale != new_scale) {
- OnHostResizedInPixels(bounds_in_pixels_.size());
+ if (size_changed || current_scale != new_scale) {
+ OnHostResizedInPixels(new_size);
// Changing the size may destroy this.
if (!weak_ref)
return;
diff --git a/chromium/ui/aura/window_tree_host_platform.h b/chromium/ui/aura/window_tree_host_platform.h
index db462e1209a..9cd83248659 100644
--- a/chromium/ui/aura/window_tree_host_platform.h
+++ b/chromium/ui/aura/window_tree_host_platform.h
@@ -97,7 +97,8 @@ class AURA_EXPORT WindowTreeHostPlatform : public WindowTreeHost,
gfx::AcceleratedWidget widget_;
std::unique_ptr<ui::PlatformWindow> platform_window_;
gfx::NativeCursor current_cursor_;
- gfx::Rect bounds_in_pixels_;
+ // TODO: use compositor's size.
+ gfx::Size size_in_pixels_;
std::unique_ptr<ui::KeyboardHook> keyboard_hook_;
diff --git a/chromium/ui/aura/window_tree_host_platform_unittest.cc b/chromium/ui/aura/window_tree_host_platform_unittest.cc
index 603cd9cd36a..f2370c9046f 100644
--- a/chromium/ui/aura/window_tree_host_platform_unittest.cc
+++ b/chromium/ui/aura/window_tree_host_platform_unittest.cc
@@ -135,8 +135,7 @@ class DeleteHostWindowTreeHostObserver : public WindowTreeHostObserver {
TestWindowTreeHost* host() { return host_.get(); }
// WindowTreeHostObserver:
- void OnHostMovedInPixels(WindowTreeHost* host,
- const gfx::Point& new_origin_in_pixels) override {
+ void OnHostMovedInPixels(WindowTreeHost* host) override {
host_->RemoveObserver(this);
host_.reset();
}
diff --git a/chromium/ui/base/BUILD.gn b/chromium/ui/base/BUILD.gn
index c5b1287e4b7..8efef6d9adb 100644
--- a/chromium/ui/base/BUILD.gn
+++ b/chromium/ui/base/BUILD.gn
@@ -293,8 +293,12 @@ component("base") {
"cocoa/flipped_view.mm",
"cocoa/menu_controller.h",
"cocoa/menu_controller.mm",
+ "cocoa/nsmenu_additions.h",
+ "cocoa/nsmenu_additions.mm",
"cocoa/nsmenuitem_additions.h",
"cocoa/nsmenuitem_additions.mm",
+ "cocoa/nswindow_test_util.cc",
+ "cocoa/nswindow_test_util.h",
"cocoa/permissions_utils.h",
"cocoa/permissions_utils.mm",
"cocoa/quartz_util.h",
@@ -305,8 +309,8 @@ component("base") {
"cocoa/remote_layer_api.mm",
"cocoa/secure_password_input.h",
"cocoa/secure_password_input.mm",
- "cocoa/text_services_context_menu.cc",
"cocoa/text_services_context_menu.h",
+ "cocoa/text_services_context_menu.mm",
"cocoa/tool_tip_base_view.h",
"cocoa/tool_tip_base_view.mm",
"cocoa/touch_bar_util.h",
@@ -381,10 +385,6 @@ component("base") {
"accelerators/menu_label_accelerator_util_linux.h",
"linux/linux_desktop.cc",
"linux/linux_desktop.h",
- "linux/linux_ui_delegate.cc",
- "linux/linux_ui_delegate.h",
- "linux/linux_ui_delegate_stub.cc",
- "linux/linux_ui_delegate_stub.h",
]
}
@@ -504,6 +504,8 @@ component("base") {
if (is_ios) {
sources += [
+ "l10n/l10n_util_ios.h",
+ "l10n/l10n_util_ios.mm",
"l10n/l10n_util_mac.h",
"l10n/l10n_util_mac.mm",
"l10n/l10n_util_mac_bridge.h",
@@ -743,8 +745,6 @@ static_library("test_support") {
"test/menu_test_observer.mm",
"test/ns_ax_tree_validator.h",
"test/ns_ax_tree_validator.mm",
- "test/nswindow_fullscreen_notification_waiter.h",
- "test/nswindow_fullscreen_notification_waiter.mm",
"test/scoped_fake_full_keyboard_access.h",
"test/scoped_fake_full_keyboard_access.mm",
"test/scoped_fake_nswindow_focus.h",
@@ -991,6 +991,7 @@ test("ui_base_unittests") {
if (is_mac) {
sources += [
"cocoa/defaults_utils_unittest.mm",
+ "cocoa/nsmenu_additions_unittest.mm",
"cocoa/nsmenuitem_additions_unittest.mm",
"interaction/element_tracker_mac_unittest.mm",
"l10n/l10n_util_mac_unittest.mm",
@@ -1006,10 +1007,7 @@ test("ui_base_unittests") {
]
if (is_mac) {
- sources += [
- "test/scoped_fake_nswindow_fullscreen_unittest.mm",
- "test/view_tree_validator_unittest.mm",
- ]
+ sources += [ "test/view_tree_validator_unittest.mm" ]
}
}
@@ -1059,6 +1057,7 @@ test("ui_base_unittests") {
if (is_ios) {
sources += [
+ "l10n/l10n_util_ios_unittest.mm",
"l10n/l10n_util_mac_unittest.mm",
"test/ios/ui_image_test_utils_unittest.mm",
]
diff --git a/chromium/ui/base/DEPS b/chromium/ui/base/DEPS
index d5f0903652e..2f9fa3ecd19 100644
--- a/chromium/ui/base/DEPS
+++ b/chromium/ui/base/DEPS
@@ -1,6 +1,8 @@
include_rules = [
"+chromeos/crosapi/cpp/crosapi_constants.h",
+ "+chromeos/crosapi/mojom/emoji_picker.mojom.h",
"+chromeos/lacros/lacros_paths.h",
+ "+chromeos/lacros/lacros_service.h",
"+components/vector_icons",
"+components/version_info",
"+media/media_buildflags.h",
diff --git a/chromium/ui/base/OWNERS b/chromium/ui/base/OWNERS
index 4e8d458f043..355a2b25a94 100644
--- a/chromium/ui/base/OWNERS
+++ b/chromium/ui/base/OWNERS
@@ -2,7 +2,6 @@ dfried@chromium.org
pbos@chromium.org
per-file template_expressions*=dpapad@chromium.org
-per-file template_expressions*=michaelpg@chromium.org
per-file template_expressions*=rbpotter@chromium.org
per-file class_property*=kylixrd@chromium.org
diff --git a/chromium/ui/base/accelerators/accelerator.cc b/chromium/ui/base/accelerators/accelerator.cc
index 9fca6ff3e62..e032433d709 100644
--- a/chromium/ui/base/accelerators/accelerator.cc
+++ b/chromium/ui/base/accelerators/accelerator.cc
@@ -300,12 +300,10 @@ std::u16string Accelerator::GetShortcutText() const {
// intended to be removed when the menu system moved to MenuItemView. That was
// crbug.com/2822, closed in 2010. Can we finally remove all of this?
if (adjust_shortcut_for_rtl) {
- int key_length = static_cast<int>(shortcut_rtl.length());
- DCHECK_GT(key_length, 0);
+ DCHECK_GT(shortcut_rtl.length(), 0u);
shortcut_rtl.append(u"+");
- // Subtracting the size of the shortcut key and 1 for the '+' sign.
- shortcut_rtl.append(shortcut, 0, shortcut.length() - key_length - 1);
+ shortcut_rtl.append(shortcut, 0, shortcut.length() - shortcut_rtl.length());
shortcut.swap(shortcut_rtl);
}
#endif // BUILDFLAG(IS_MAC)
diff --git a/chromium/ui/base/accelerators/global_media_keys_listener_win.cc b/chromium/ui/base/accelerators/global_media_keys_listener_win.cc
index 824462adf7e..46cae556717 100644
--- a/chromium/ui/base/accelerators/global_media_keys_listener_win.cc
+++ b/chromium/ui/base/accelerators/global_media_keys_listener_win.cc
@@ -66,7 +66,7 @@ void GlobalMediaKeysListenerWin::OnWndProc(HWND hwnd,
// SingletonHwndHotKeyObservers should only send us hot key messages.
DCHECK_EQ(WM_HOTKEY, static_cast<int>(message));
- int win_key_code = HIWORD(lparam);
+ WORD win_key_code = HIWORD(lparam);
KeyboardCode key_code = KeyboardCodeForWindowsKeyCode(win_key_code);
// We should only receive hot key events for keys that we're observing.
diff --git a/chromium/ui/base/accelerators/media_keys_listener_mac.mm b/chromium/ui/base/accelerators/media_keys_listener_mac.mm
index 0bed8d1e2e2..87a53282aa3 100644
--- a/chromium/ui/base/accelerators/media_keys_listener_mac.mm
+++ b/chromium/ui/base/accelerators/media_keys_listener_mac.mm
@@ -6,6 +6,8 @@
#include <ApplicationServices/ApplicationServices.h>
#include <Carbon/Carbon.h>
+#include "base/memory/raw_ptr.h"
+
#import <Cocoa/Cocoa.h>
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/hidsystem/ev_keymap.h>
@@ -63,7 +65,7 @@ class MediaKeysListenerImpl : public MediaKeysListener {
void StartEventTapIfNecessary();
void StopEventTapIfNecessary();
- MediaKeysListener::Delegate* delegate_;
+ raw_ptr<MediaKeysListener::Delegate> delegate_;
const Scope scope_;
// Event tap for intercepting mac media keys.
CFMachPortRef event_tap_ = nullptr;
diff --git a/chromium/ui/base/base_window.cc b/chromium/ui/base/base_window.cc
index 43812c3f3bb..231a1771797 100644
--- a/chromium/ui/base/base_window.cc
+++ b/chromium/ui/base/base_window.cc
@@ -6,24 +6,11 @@
namespace ui {
-namespace {
-bool g_is_fullscreen_faked_for_testing = false;
-} // namespace
-
bool BaseWindow::IsRestored(const BaseWindow& window) {
return !window.IsMaximized() &&
!window.IsMinimized() &&
!window.IsFullscreen();
}
-void BaseWindow::SetFullscreenFakedForTesting(
- bool is_fullscreen_faked_for_testing) {
- g_is_fullscreen_faked_for_testing = is_fullscreen_faked_for_testing;
-}
-
-bool BaseWindow::IsFullscreenFakedForTesting() {
- return g_is_fullscreen_faked_for_testing;
-}
-
} // namespace ui
diff --git a/chromium/ui/base/base_window.h b/chromium/ui/base/base_window.h
index 883dfc4311f..0d4fb25fb0b 100644
--- a/chromium/ui/base/base_window.h
+++ b/chromium/ui/base/base_window.h
@@ -36,12 +36,6 @@ class COMPONENT_EXPORT(UI_BASE) BaseWindow {
// Minimized).
static bool IsRestored(const BaseWindow& window);
- // IsFullscreenFakedForTesting is set by tests that are not written robustly
- // to asynchronous transitions to fullscreen (e.g, by using
- // ScopedFakeNSWindowFullscreen on macOS).
- static void SetFullscreenFakedForTesting(bool);
- static bool IsFullscreenFakedForTesting();
-
// Return a platform dependent identifier for this window.
virtual gfx::NativeWindow GetNativeWindow() const = 0;
diff --git a/chromium/ui/base/clipboard/clipboard.cc b/chromium/ui/base/clipboard/clipboard.cc
index 4a840e90b3f..1cba159099d 100644
--- a/chromium/ui/base/clipboard/clipboard.cc
+++ b/chromium/ui/base/clipboard/clipboard.cc
@@ -197,9 +197,8 @@ Clipboard::ReadAvailableStandardAndCustomFormatNames(
ExtractCustomPlatformNames(buffer, data_dst);
for (const auto& items : custom_format_names)
format_names.push_back(base::ASCIIToUTF16(items.first));
- for (const auto& item : GetStandardFormats(buffer, data_dst)) {
+ for (const auto& item : GetStandardFormats(buffer, data_dst))
format_names.push_back(item);
- }
return format_names;
}
diff --git a/chromium/ui/base/clipboard/clipboard_android.cc b/chromium/ui/base/clipboard/clipboard_android.cc
index 8996b669f41..26d58a88621 100644
--- a/chromium/ui/base/clipboard/clipboard_android.cc
+++ b/chromium/ui/base/clipboard/clipboard_android.cc
@@ -420,6 +420,11 @@ Clipboard* Clipboard::Create() {
return new ClipboardAndroid;
}
+// Static method for testing.
+void JNI_Clipboard_CleanupForTesting(JNIEnv* env) {
+ Clipboard::DestroyClipboardForCurrentThread();
+}
+
// ClipboardAndroid implementation.
void ClipboardAndroid::OnPrimaryClipChanged(
diff --git a/chromium/ui/base/clipboard/clipboard_android_test_support.cc b/chromium/ui/base/clipboard/clipboard_android_test_support.cc
index d821fdd28be..db3cfb86571 100644
--- a/chromium/ui/base/clipboard/clipboard_android_test_support.cc
+++ b/chromium/ui/base/clipboard/clipboard_android_test_support.cc
@@ -15,10 +15,6 @@
namespace ui {
-void JNI_ClipboardAndroidTestSupport_Cleanup(JNIEnv* env) {
- Clipboard::DestroyClipboardForCurrentThread();
-}
-
jboolean JNI_ClipboardAndroidTestSupport_NativeWriteHtml(
JNIEnv* env,
const base::android::JavaParamRef<jstring>& j_html_text) {
diff --git a/chromium/ui/base/clipboard/clipboard_data.cc b/chromium/ui/base/clipboard/clipboard_data.cc
index 066df20ed36..68ff2539b0d 100644
--- a/chromium/ui/base/clipboard/clipboard_data.cc
+++ b/chromium/ui/base/clipboard/clipboard_data.cc
@@ -30,7 +30,7 @@ std::vector<uint8_t> ClipboardData::EncodeBitmapData(const SkBitmap& bitmap) {
return data;
}
-ClipboardData::ClipboardData() : web_smart_paste_(false), format_(0) {}
+ClipboardData::ClipboardData() = default;
ClipboardData::ClipboardData(const ClipboardData& other) {
format_ = other.format_;
diff --git a/chromium/ui/base/clipboard/clipboard_data.h b/chromium/ui/base/clipboard/clipboard_data.h
index 30ba0c75323..85c2af9d232 100644
--- a/chromium/ui/base/clipboard/clipboard_data.h
+++ b/chromium/ui/base/clipboard/clipboard_data.h
@@ -198,7 +198,7 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) ClipboardData {
std::string custom_data_data_;
// WebKit smart paste data.
- bool web_smart_paste_;
+ bool web_smart_paste_ = false;
// Svg data.
std::string svg_data_;
@@ -206,7 +206,7 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) ClipboardData {
// text/uri-list filenames data.
std::vector<ui::FileInfo> filenames_;
- int format_;
+ int format_ = 0;
// The source of the data.
std::unique_ptr<DataTransferEndpoint> src_;
diff --git a/chromium/ui/base/clipboard/clipboard_ozone.cc b/chromium/ui/base/clipboard/clipboard_ozone.cc
index 18c740a0cb4..fc55f853843 100644
--- a/chromium/ui/base/clipboard/clipboard_ozone.cc
+++ b/chromium/ui/base/clipboard/clipboard_ozone.cc
@@ -10,9 +10,11 @@
#include <vector>
#include "base/bind.h"
+#include "base/check.h"
#include "base/containers/contains.h"
#include "base/containers/flat_map.h"
#include "base/containers/span.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/no_destructor.h"
#include "base/notreached.h"
@@ -104,8 +106,11 @@ class StubPlatformClipboard : public PlatformClipboard {
// specified MIME types.
class ClipboardOzone::AsyncClipboardOzone {
public:
- explicit AsyncClipboardOzone(PlatformClipboard* platform_clipboard)
- : platform_clipboard_(platform_clipboard), weak_factory_(this) {
+ explicit AsyncClipboardOzone(PlatformClipboard* platform_clipboard,
+ ClipboardOzone* clipboard_ozone)
+ : platform_clipboard_(platform_clipboard),
+ clipboard_ozone_(clipboard_ozone),
+ weak_factory_(this) {
DCHECK(platform_clipboard_);
// Set a callback to listen to requests to increase the clipboard sequence
@@ -124,22 +129,25 @@ class ClipboardOzone::AsyncClipboardOzone {
return platform_clipboard_->IsSelectionBufferAvailable();
}
- base::span<uint8_t> ReadClipboardDataAndWait(ClipboardBuffer buffer,
- const std::string& mime_type) {
- if (buffer == ClipboardBuffer::kSelection && !IsSelectionBufferAvailable())
- return {};
+ base::span<uint8_t> ReadClipboardDataSetSourceAndWait(
+ ClipboardBuffer buffer,
+ const std::string& mime_type) {
+ const auto data = ReadClipboardDataAndWait(buffer, mime_type);
- // We can use a fastpath if we are the owner of the selection.
- if (platform_clipboard_->IsSelectionOwner(buffer)) {
- auto it = offered_data_[buffer].find(mime_type);
- if (it == offered_data_[buffer].end())
- return {};
- return base::make_span(it->second->front(), it->second->size());
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+ if (!data.empty()) {
+ const auto data_src =
+ ReadClipboardDataAndWait(buffer, kMimeTypeDataTransferEndpoint);
+ std::string data_src_json = std::string(
+ reinterpret_cast<char*>(data_src.data()), data_src.size());
+ std::unique_ptr<DataTransferEndpoint> dte =
+ ui::ConvertJsonToDataTransferEndpoint(data_src_json);
+ if (dte)
+ clipboard_ozone_->SetSource(buffer, std::move(dte));
}
+#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
- if (auto data = Read(buffer, mime_type))
- return base::make_span(data->front(), data->size());
- return {};
+ return data;
}
std::vector<std::string> RequestMimeTypes(ClipboardBuffer buffer) {
@@ -189,6 +197,25 @@ class ClipboardOzone::AsyncClipboardOzone {
}
private:
+ base::span<uint8_t> ReadClipboardDataAndWait(ClipboardBuffer buffer,
+ const std::string& mime_type) {
+ if (buffer == ClipboardBuffer::kSelection && !IsSelectionBufferAvailable())
+ return {};
+
+ // We can use a fastpath if we are the owner of the selection.
+ if (platform_clipboard_->IsSelectionOwner(buffer)) {
+ auto it = offered_data_[buffer].find(mime_type);
+ if (it == offered_data_[buffer].end())
+ return {};
+ return base::make_span(it->second->front(), it->second->size());
+ }
+
+ if (auto data = Read(buffer, mime_type))
+ return base::make_span(data->front(), data->size());
+
+ return {};
+ }
+
// Request<Result> encapsulates a clipboard request and provides a sync-like
// way to perform it, whereas Result is the operation return type. Request
// instances are created by factory functions (e.g: Read, Offer, GetMimeTypes,
@@ -313,7 +340,12 @@ class ClipboardOzone::AsyncClipboardOzone {
base::flat_map<ClipboardBuffer, PlatformClipboard::DataMap> offered_data_;
// Provides communication to a system clipboard under ozone level.
- PlatformClipboard* const platform_clipboard_ = nullptr;
+ const raw_ptr<PlatformClipboard> platform_clipboard_ = nullptr;
+
+ // Reference to the ClipboardOzone object instantiating this
+ // ClipboardOzone::AsyncClipboardOzone object. It is used to set
+ // the correct source when some text is copied from Ash and pasted to Lacros.
+ const raw_ptr<ClipboardOzone> clipboard_ozone_;
ClipboardSequenceNumberToken clipboard_sequence_number_;
ClipboardSequenceNumberToken selection_sequence_number_;
@@ -325,15 +357,16 @@ class ClipboardOzone::AsyncClipboardOzone {
ClipboardOzone::ClipboardOzone() {
auto* platform_clipboard =
OzonePlatform::GetInstance()->GetPlatformClipboard();
+
if (platform_clipboard) {
async_clipboard_ozone_ =
std::make_unique<ClipboardOzone::AsyncClipboardOzone>(
- platform_clipboard);
+ platform_clipboard, this);
} else {
static base::NoDestructor<StubPlatformClipboard> stub_platform_clipboard;
async_clipboard_ozone_ =
std::make_unique<ClipboardOzone::AsyncClipboardOzone>(
- stub_platform_clipboard.get());
+ stub_platform_clipboard.get(), this);
}
}
@@ -357,8 +390,7 @@ bool ClipboardOzone::IsFormatAvailable(
const DataTransferEndpoint* data_dst) const {
DCHECK(CalledOnValidThread());
- if (!GetSourceAndCheckIfReadIsAllowed(buffer, data_dst,
- base::span<uint8_t>()))
+ if (!IsReadAllowed(GetSource(buffer), data_dst, base::span<uint8_t>()))
return false;
auto available_types = async_clipboard_ozone_->RequestMimeTypes(buffer);
@@ -418,7 +450,7 @@ void ClipboardOzone::ReadAvailableTypes(
// of mime types to report.
if (IsFormatAvailable(ClipboardFormatType::WebCustomDataType(), buffer,
data_dst)) {
- auto data = async_clipboard_ozone_->ReadClipboardDataAndWait(
+ auto data = async_clipboard_ozone_->ReadClipboardDataSetSourceAndWait(
buffer, ClipboardFormatType::WebCustomDataType().GetName());
ReadCustomDataTypes(data.data(), data.size(), types);
}
@@ -428,11 +460,11 @@ void ClipboardOzone::ReadText(ClipboardBuffer buffer,
const DataTransferEndpoint* data_dst,
std::u16string* result) const {
DCHECK(CalledOnValidThread());
-
auto clipboard_data =
- async_clipboard_ozone_->ReadClipboardDataAndWait(buffer, kMimeTypeText);
+ async_clipboard_ozone_->ReadClipboardDataSetSourceAndWait(buffer,
+ kMimeTypeText);
- if (!GetSourceAndCheckIfReadIsAllowed(buffer, data_dst, clipboard_data))
+ if (!IsReadAllowed(GetSource(buffer), data_dst, clipboard_data))
return;
RecordRead(ClipboardFormatMetric::kText);
@@ -446,9 +478,10 @@ void ClipboardOzone::ReadAsciiText(ClipboardBuffer buffer,
DCHECK(CalledOnValidThread());
auto clipboard_data =
- async_clipboard_ozone_->ReadClipboardDataAndWait(buffer, kMimeTypeText);
+ async_clipboard_ozone_->ReadClipboardDataSetSourceAndWait(buffer,
+ kMimeTypeText);
- if (!GetSourceAndCheckIfReadIsAllowed(buffer, data_dst, clipboard_data))
+ if (!IsReadAllowed(GetSource(buffer), data_dst, clipboard_data))
return;
RecordRead(ClipboardFormatMetric::kText);
@@ -464,9 +497,10 @@ void ClipboardOzone::ReadHTML(ClipboardBuffer buffer,
DCHECK(CalledOnValidThread());
auto clipboard_data =
- async_clipboard_ozone_->ReadClipboardDataAndWait(buffer, kMimeTypeHTML);
+ async_clipboard_ozone_->ReadClipboardDataSetSourceAndWait(buffer,
+ kMimeTypeHTML);
- if (!GetSourceAndCheckIfReadIsAllowed(buffer, data_dst, clipboard_data))
+ if (!IsReadAllowed(GetSource(buffer), data_dst, clipboard_data))
return;
RecordRead(ClipboardFormatMetric::kHtml);
@@ -489,9 +523,10 @@ void ClipboardOzone::ReadSvg(ClipboardBuffer buffer,
DCHECK(CalledOnValidThread());
auto clipboard_data =
- async_clipboard_ozone_->ReadClipboardDataAndWait(buffer, kMimeTypeSvg);
+ async_clipboard_ozone_->ReadClipboardDataSetSourceAndWait(buffer,
+ kMimeTypeSvg);
- if (!GetSourceAndCheckIfReadIsAllowed(buffer, data_dst, clipboard_data))
+ if (!IsReadAllowed(GetSource(buffer), data_dst, clipboard_data))
return;
RecordRead(ClipboardFormatMetric::kSvg);
@@ -505,9 +540,10 @@ void ClipboardOzone::ReadRTF(ClipboardBuffer buffer,
DCHECK(CalledOnValidThread());
auto clipboard_data =
- async_clipboard_ozone_->ReadClipboardDataAndWait(buffer, kMimeTypeRTF);
+ async_clipboard_ozone_->ReadClipboardDataSetSourceAndWait(buffer,
+ kMimeTypeRTF);
- if (!GetSourceAndCheckIfReadIsAllowed(buffer, data_dst, clipboard_data))
+ if (!IsReadAllowed(GetSource(buffer), data_dst, clipboard_data))
return;
RecordRead(ClipboardFormatMetric::kRtf);
@@ -519,7 +555,7 @@ void ClipboardOzone::ReadPng(ClipboardBuffer buffer,
ReadPngCallback callback) const {
auto clipboard_data = ReadPngInternal(buffer);
- if (!GetSourceAndCheckIfReadIsAllowed(buffer, data_dst, clipboard_data)) {
+ if (!IsReadAllowed(GetSource(buffer), data_dst, clipboard_data)) {
std::move(callback).Run(std::vector<uint8_t>());
return;
}
@@ -536,10 +572,10 @@ void ClipboardOzone::ReadCustomData(ClipboardBuffer buffer,
std::u16string* result) const {
DCHECK(CalledOnValidThread());
- auto custom_data = async_clipboard_ozone_->ReadClipboardDataAndWait(
+ auto custom_data = async_clipboard_ozone_->ReadClipboardDataSetSourceAndWait(
buffer, kMimeTypeWebCustomData);
- if (!GetSourceAndCheckIfReadIsAllowed(buffer, data_dst, custom_data))
+ if (!IsReadAllowed(GetSource(buffer), data_dst, custom_data))
return;
RecordRead(ClipboardFormatMetric::kCustomData);
@@ -551,10 +587,11 @@ void ClipboardOzone::ReadFilenames(ClipboardBuffer buffer,
std::vector<ui::FileInfo>* result) const {
DCHECK(CalledOnValidThread());
- auto clipboard_data = async_clipboard_ozone_->ReadClipboardDataAndWait(
- buffer, kMimeTypeURIList);
+ auto clipboard_data =
+ async_clipboard_ozone_->ReadClipboardDataSetSourceAndWait(
+ buffer, kMimeTypeURIList);
- if (!GetSourceAndCheckIfReadIsAllowed(buffer, data_dst, clipboard_data))
+ if (!IsReadAllowed(GetSource(buffer), data_dst, clipboard_data))
return;
RecordRead(ClipboardFormatMetric::kFilenames);
@@ -576,11 +613,12 @@ void ClipboardOzone::ReadData(const ClipboardFormatType& format,
std::string* result) const {
DCHECK(CalledOnValidThread());
- auto clipboard_data = async_clipboard_ozone_->ReadClipboardDataAndWait(
- ClipboardBuffer::kCopyPaste, format.GetName());
+ auto clipboard_data =
+ async_clipboard_ozone_->ReadClipboardDataSetSourceAndWait(
+ ClipboardBuffer::kCopyPaste, format.GetName());
- if (!GetSourceAndCheckIfReadIsAllowed(ClipboardBuffer::kCopyPaste, data_dst,
- clipboard_data))
+ if (!IsReadAllowed(GetSource(ClipboardBuffer::kCopyPaste), data_dst,
+ clipboard_data))
return;
RecordRead(ClipboardFormatMetric::kData);
@@ -709,35 +747,19 @@ void ClipboardOzone::AddClipboardSourceToDataOffer(
async_clipboard_ozone_->InsertData(std::move(data),
{kMimeTypeDataTransferEndpoint});
}
-#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
-
-bool ClipboardOzone::GetSourceAndCheckIfReadIsAllowed(
- ClipboardBuffer buffer,
- const DataTransferEndpoint* data_dst,
- const base::span<uint8_t> data) const {
- DataTransferEndpoint* data_src = GetSource(buffer);
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
- if (!data_src) {
- auto clipboard_data = async_clipboard_ozone_->ReadClipboardDataAndWait(
- buffer, kMimeTypeDataTransferEndpoint);
- std::string data_src_json = std::string(
- reinterpret_cast<char*>(clipboard_data.data()), clipboard_data.size());
-
- return IsReadAllowed(
- ui::ConvertJsonToDataTransferEndpoint(data_src_json).get(), data_dst,
- data);
- }
-#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
-
- return IsReadAllowed(data_src, data_dst, data);
+void ClipboardOzone::SetSource(ClipboardBuffer buffer,
+ std::unique_ptr<DataTransferEndpoint> data_src) {
+ data_src_[buffer] = std::move(data_src);
}
+#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
base::span<uint8_t> ClipboardOzone::ReadPngInternal(
const ClipboardBuffer buffer) const {
DCHECK(CalledOnValidThread());
- return async_clipboard_ozone_->ReadClipboardDataAndWait(buffer, kMimeTypePNG);
+ return async_clipboard_ozone_->ReadClipboardDataSetSourceAndWait(
+ buffer, kMimeTypePNG);
}
} // namespace ui
diff --git a/chromium/ui/base/clipboard/clipboard_ozone.h b/chromium/ui/base/clipboard/clipboard_ozone.h
index bd690efdfe9..2b083d4db82 100644
--- a/chromium/ui/base/clipboard/clipboard_ozone.h
+++ b/chromium/ui/base/clipboard/clipboard_ozone.h
@@ -106,17 +106,13 @@ class ClipboardOzone : public Clipboard {
#if BUILDFLAG(IS_CHROMEOS_LACROS)
// Used for syncing clipboard sources between Lacros and Ash in ChromeOS.
void AddClipboardSourceToDataOffer(const ClipboardBuffer buffer);
-#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
- // Retrieves the clipboard source data transfer endpoint. This source and
- // clipboard destination are passed to the DLP stack to check if restrictions
- // allow or prevent the clipboard read. If no clipboard source exists in the
- // internal store (i.e. none was initially provided), an attempt to parse the
- // source from the data offer occurs since clipboard sources from Ash are
- // offered to Lacros through a custom MIME type.
- bool GetSourceAndCheckIfReadIsAllowed(const ClipboardBuffer buffer,
- const DataTransferEndpoint* data_dst,
- const base::span<uint8_t> data) const;
+ // Updates the source for the given buffer. It is used by
+ // `async_clipboard_ozone_` whenever some text is copied from Ash and pasted
+ // to Lacros.
+ void SetSource(ClipboardBuffer buffer,
+ std::unique_ptr<DataTransferEndpoint> data_src);
+#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
base::span<uint8_t> ReadPngInternal(const ClipboardBuffer buffer) const;
diff --git a/chromium/ui/base/clipboard/clipboard_test_template.h b/chromium/ui/base/clipboard/clipboard_test_template.h
index 410ecbeb726..0b3c7e929cf 100644
--- a/chromium/ui/base/clipboard/clipboard_test_template.h
+++ b/chromium/ui/base/clipboard/clipboard_test_template.h
@@ -1103,9 +1103,8 @@ TYPED_TEST(ClipboardTest, PolicyAllowDataRead) {
ui::ClipboardFormatType::DataTransferEndpointDataType(),
/* data_dst = */ nullptr, &actual_json);
- EXPECT_EQ(
- R"({"endpoint_type":"url","url":"https://www.google.com/","url_origin":"https://www.google.com"})",
- actual_json);
+ EXPECT_EQ(R"({"endpoint_type":"url","url":"https://www.google.com/"})",
+ actual_json);
#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
::testing::Mock::VerifyAndClearExpectations(policy_controller.get());
diff --git a/chromium/ui/base/clipboard/custom_data_helper.cc b/chromium/ui/base/clipboard/custom_data_helper.cc
index 443996b4a47..def5a11d51f 100644
--- a/chromium/ui/base/clipboard/custom_data_helper.cc
+++ b/chromium/ui/base/clipboard/custom_data_helper.cc
@@ -20,7 +20,7 @@ namespace {
bool SkipString16(base::PickleIterator* iter) {
DCHECK(iter);
- int len;
+ size_t len;
if (!iter->ReadLength(&len))
return false;
return iter->SkipBytes(len * sizeof(char16_t));
diff --git a/chromium/ui/base/clipboard/scoped_clipboard_writer.h b/chromium/ui/base/clipboard/scoped_clipboard_writer.h
index c47909313da..96f5bf8b6b5 100644
--- a/chromium/ui/base/clipboard/scoped_clipboard_writer.h
+++ b/chromium/ui/base/clipboard/scoped_clipboard_writer.h
@@ -47,7 +47,7 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) ScopedClipboardWriter {
// Converts |text| to UTF-8 and adds it to the clipboard.
void WriteText(const std::u16string& text);
- // Adds HTML to the clipboard. The url parameter is optional, but especially
+ // Adds HTML to the clipboard. The url parameter is optional, but especially
// useful if the HTML fragment contains relative links.
void WriteHTML(const std::u16string& markup, const std::string& source_url);
diff --git a/chromium/ui/base/cocoa/accessibility_focus_overrider.h b/chromium/ui/base/cocoa/accessibility_focus_overrider.h
index 7d3b88d04a7..d3a5042432f 100644
--- a/chromium/ui/base/cocoa/accessibility_focus_overrider.h
+++ b/chromium/ui/base/cocoa/accessibility_focus_overrider.h
@@ -6,6 +6,7 @@
#define UI_BASE_COCOA_ACCESSIBILITY_FOCUS_OVERRIDER_H_
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
namespace ui {
@@ -60,7 +61,7 @@ class COMPONENT_EXPORT(UI_BASE) AccessibilityFocusOverrider {
bool app_is_remote_ = false;
bool window_is_key_ = false;
bool view_is_first_responder_ = false;
- Client* const client_;
+ const raw_ptr<Client> client_;
};
} // namespace ui
diff --git a/chromium/ui/base/cocoa/find_pasteboard.h b/chromium/ui/base/cocoa/find_pasteboard.h
index c3daace4363..06a4909b434 100644
--- a/chromium/ui/base/cocoa/find_pasteboard.h
+++ b/chromium/ui/base/cocoa/find_pasteboard.h
@@ -5,11 +5,6 @@
#ifndef UI_BASE_COCOA_FIND_PASTEBOARD_H_
#define UI_BASE_COCOA_FIND_PASTEBOARD_H_
-#include <string>
-
-
-#ifdef __OBJC__
-
#import <Cocoa/Cocoa.h>
#include "base/component_export.h"
@@ -52,9 +47,4 @@ COMPONENT_EXPORT(UI_BASE)
- (NSPasteboard*)findPboard;
@end
-#endif // __OBJC__
-
-// Also provide a c++ interface
-COMPONENT_EXPORT(UI_BASE) std::u16string GetFindPboardText();
-
#endif // UI_BASE_COCOA_FIND_PASTEBOARD_H_
diff --git a/chromium/ui/base/cocoa/find_pasteboard.mm b/chromium/ui/base/cocoa/find_pasteboard.mm
index f1dae630cc5..5569fec0625 100644
--- a/chromium/ui/base/cocoa/find_pasteboard.mm
+++ b/chromium/ui/base/cocoa/find_pasteboard.mm
@@ -75,7 +75,3 @@ NSString* kFindPasteboardChangedNotification =
}
@end
-
-std::u16string GetFindPboardText() {
- return base::SysNSStringToUTF16([[FindPasteboard sharedInstance] findText]);
-}
diff --git a/chromium/ui/base/cocoa/menu_controller.h b/chromium/ui/base/cocoa/menu_controller.h
index 6eb5d2e6524..823d80ae6ba 100644
--- a/chromium/ui/base/cocoa/menu_controller.h
+++ b/chromium/ui/base/cocoa/menu_controller.h
@@ -21,7 +21,7 @@ COMPONENT_EXPORT(UI_BASE)
// Called as each item is created during menu or submenu creation.
- (void)controllerWillAddItem:(NSMenuItem*)menuItem
fromModel:(ui::MenuModel*)model
- atIndex:(NSInteger)index
+ atIndex:(size_t)index
withColorProvider:(const ui::ColorProvider*)colorProvider;
// Called after all menu items in a menu or submenu are created.
- (void)controllerWillAddMenu:(NSMenu*)menu fromModel:(ui::MenuModel*)model;
diff --git a/chromium/ui/base/cocoa/menu_controller.mm b/chromium/ui/base/cocoa/menu_controller.mm
index be5ee49d234..c299e6ab685 100644
--- a/chromium/ui/base/cocoa/menu_controller.mm
+++ b/chromium/ui/base/cocoa/menu_controller.mm
@@ -35,8 +35,8 @@ NSMenu* MakeEmptySubmenu() {
// Called when adding a submenu to the menu and checks if the submenu, via its
// |model|, has visible child items.
bool MenuHasVisibleItems(const ui::MenuModel* model) {
- int count = model->GetItemCount();
- for (int index = 0; index < count; index++) {
+ size_t count = model->GetItemCount();
+ for (size_t index = 0; index < count; ++index) {
if (model->IsVisibleAt(index))
return true;
}
@@ -91,7 +91,7 @@ bool MenuHasVisibleItems(const ui::MenuModel* model) {
// Adds the item at |index| in |model| as an NSMenuItem at |index| of |menu|.
// Associates a submenu if the MenuModel::ItemType is TYPE_SUBMENU.
- (void)addItemToMenu:(NSMenu*)menu
- atIndex:(NSInteger)index
+ atIndex:(size_t)index
fromModel:(ui::MenuModel*)model
withColorProvider:(const ui::ColorProvider*)colorProvider;
@@ -184,8 +184,8 @@ bool MenuHasVisibleItems(const ui::MenuModel* model) {
withColorProvider:(const ui::ColorProvider*)colorProvider {
NSMenu* menu = [[[NSMenu alloc] initWithTitle:@""] autorelease];
- const int count = model->GetItemCount();
- for (int index = 0; index < count; index++) {
+ const size_t count = model->GetItemCount();
+ for (size_t index = 0; index < count; ++index) {
if (model->GetTypeAt(index) == ui::MenuModel::TYPE_SEPARATOR) {
[self addSeparatorToMenu:menu atIndex:index];
} else {
@@ -206,7 +206,7 @@ bool MenuHasVisibleItems(const ui::MenuModel* model) {
}
- (void)addItemToMenu:(NSMenu*)menu
- atIndex:(NSInteger)index
+ atIndex:(size_t)index
fromModel:(ui::MenuModel*)model
withColorProvider:(const ui::ColorProvider*)colorProvider {
NSString* label = l10n_util::FixUpWindowsStyleLabel(model->GetLabelAt(index));
diff --git a/chromium/ui/base/cocoa/menu_controller_unittest.mm b/chromium/ui/base/cocoa/menu_controller_unittest.mm
index cbad5cd0ab8..98e71a4991e 100644
--- a/chromium/ui/base/cocoa/menu_controller_unittest.mm
+++ b/chromium/ui/base/cocoa/menu_controller_unittest.mm
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/memory/raw_ptr.h"
+
#import <Cocoa/Cocoa.h>
#include "base/run_loop.h"
@@ -59,13 +61,14 @@ class TestSimpleMenuModelVisibility : public SimpleMenuModel {
const TestSimpleMenuModelVisibility&) = delete;
// SimpleMenuModel:
- bool IsVisibleAt(int index) const override {
+ bool IsVisibleAt(size_t index) const override {
return items_[ValidateItemIndex(index)].visible;
}
void SetVisibility(int command_id, bool visible) {
- int index = SimpleMenuModel::GetIndexOfCommandId(command_id);
- items_[ValidateItemIndex(index)].visible = visible;
+ absl::optional<size_t> index =
+ SimpleMenuModel::GetIndexOfCommandId(command_id);
+ items_[ValidateItemIndex(index.value())].visible = visible;
}
void AddItem(int command_id, const std::u16string& label) {
@@ -86,9 +89,8 @@ class TestSimpleMenuModelVisibility : public SimpleMenuModel {
typedef std::vector<Item> ItemVector;
- int ValidateItemIndex(int index) const {
- CHECK_GE(index, 0);
- CHECK_LT(static_cast<size_t>(index), items_.size());
+ int ValidateItemIndex(size_t index) const {
+ CHECK_LT(index, items_.size());
return index;
}
@@ -202,7 +204,7 @@ class OwningDelegate : public Delegate {
*did_delete_ = true;
}
- bool* did_delete_;
+ raw_ptr<bool> did_delete_;
SimpleMenuModel model_;
base::scoped_nsobject<WatchedLifetimeMenuController> controller_;
};
@@ -213,16 +215,16 @@ class FontListMenuModel : public SimpleMenuModel {
public:
FontListMenuModel(SimpleMenuModel::Delegate* delegate,
const gfx::FontList* font_list,
- int index)
+ size_t index)
: SimpleMenuModel(delegate), font_list_(font_list), index_(index) {}
~FontListMenuModel() override {}
- const gfx::FontList* GetLabelFontListAt(int index) const override {
- return (index == index_) ? font_list_ : NULL;
+ const gfx::FontList* GetLabelFontListAt(size_t index) const override {
+ return (index == index_) ? font_list_.get() : nullptr;
}
private:
- const gfx::FontList* font_list_;
- const int index_;
+ raw_ptr<const gfx::FontList> font_list_;
+ const size_t index_;
};
TEST_F(MenuControllerTest, EmptyMenu) {
diff --git a/chromium/ui/base/cocoa/nsmenu_additions.h b/chromium/ui/base/cocoa/nsmenu_additions.h
new file mode 100644
index 00000000000..3186a53d73d
--- /dev/null
+++ b/chromium/ui/base/cocoa/nsmenu_additions.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 UI_BASE_COCOA_NSMENU_ADDITIONS_H_
+#define UI_BASE_COCOA_NSMENU_ADDITIONS_H_
+
+#import <Cocoa/Cocoa.h>
+
+@interface NSMenu (ChromeAdditions)
+
+// Sets a block that cr_menuItemForKeyEquivalentEvent: calls before
+// beginning its search for a matching menu item. Useful for code
+// outside of /content to arrange for code execution (to perform custom
+// menu item updates, for example) before the search begins.
+//
+// This method does not support multiple pre-search blocks. It will
+// CHECK() if called after a block has already been set.
++ (void)cr_setMenuItemForKeyEquivalentEventPreSearchBlock:(void (^)(void))block;
+
+// Searches the menu and its submenus for the item with the keyboard
+// equivalent matching `event`. Returns nil if no corresponding
+// menu item exists.
+- (NSMenuItem*)cr_menuItemForKeyEquivalentEvent:(NSEvent*)event;
+
+@end
+
+#endif // UI_BASE_COCOA_NSMENU_ADDITIONS_H_
diff --git a/chromium/ui/base/cocoa/nsmenu_additions.mm b/chromium/ui/base/cocoa/nsmenu_additions.mm
new file mode 100644
index 00000000000..d3f5bd49709
--- /dev/null
+++ b/chromium/ui/base/cocoa/nsmenu_additions.mm
@@ -0,0 +1,61 @@
+// 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 "ui/base/cocoa/nsmenu_additions.h"
+
+#include "base/check.h"
+#include "base/mac/scoped_nsobject.h"
+#import "ui/base/cocoa/nsmenuitem_additions.h"
+
+namespace {
+
+typedef void (^PreSearchBlock)(void);
+
+PreSearchBlock g_pre_search_block;
+
+NSMenuItem* MenuItemForKeyEquivalentEventInMenu(NSEvent* event, NSMenu* menu) {
+ NSMenuItem* result = nil;
+
+ for (NSMenuItem* item in [menu itemArray]) {
+ NSMenu* submenu = [item submenu];
+ if (submenu) {
+ if (submenu != [NSApp servicesMenu])
+ result = MenuItemForKeyEquivalentEventInMenu(event, submenu);
+ } else if ([item cr_firesForKeyEquivalentEvent:event]) {
+ result = item;
+ }
+
+ if (result)
+ break;
+ }
+
+ return result;
+}
+
+} // namespace
+
+@implementation NSMenu (ChromeAdditions)
+
++ (void)cr_setMenuItemForKeyEquivalentEventPreSearchBlock:
+ (void (^)(void))block {
+ if (block != nil)
+ CHECK(g_pre_search_block == nil);
+ g_pre_search_block = block;
+}
+
+- (NSMenuItem*)cr_menuItemForKeyEquivalentEvent:(NSEvent*)event {
+ if ([event type] != NSEventTypeKeyDown)
+ return nil;
+
+ if (g_pre_search_block) {
+ g_pre_search_block();
+ }
+
+ // Validate menu items before searching.
+ [self update];
+
+ return MenuItemForKeyEquivalentEventInMenu(event, self);
+}
+
+@end
diff --git a/chromium/ui/base/cocoa/nsmenu_additions_unittest.mm b/chromium/ui/base/cocoa/nsmenu_additions_unittest.mm
new file mode 100644
index 00000000000..1f5374d2ecf
--- /dev/null
+++ b/chromium/ui/base/cocoa/nsmenu_additions_unittest.mm
@@ -0,0 +1,159 @@
+// 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 "ui/base/cocoa/nsmenu_additions.h"
+
+#include "base/mac/scoped_nsobject.h"
+#include "base/test/gtest_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+@interface NSMenuAdditionsUnitTestMenuItem : NSMenuItem
+@end
+
+@implementation NSMenuAdditionsUnitTestMenuItem {
+ BOOL includeFunctionModifierInFlags_;
+}
+
+- (void)setKeyEquivalentModifierMask:(NSEventModifierFlags)mask {
+ // The AppKit ignores NSEventModifierFlagFunction when it's included
+ // in the mask. Note that it was included so we can fake it later.
+ includeFunctionModifierInFlags_ = (mask & NSEventModifierFlagFunction) > 0;
+
+ // Remove the flag to avoid a warning from the AppKit.
+ mask &= ~NSEventModifierFlagFunction;
+
+ [super setKeyEquivalentModifierMask:mask];
+}
+
+- (NSEventModifierFlags)keyEquivalentModifierMask {
+ NSEventModifierFlags flags = [super keyEquivalentModifierMask];
+ if (includeFunctionModifierInFlags_) {
+ flags |= NSEventModifierFlagFunction;
+ }
+ return flags;
+}
+
+@end
+
+namespace {
+
+NSMenu* Menu(NSString* title) {
+ NSMenu* menu = [[[NSMenu alloc] initWithTitle:title] autorelease];
+ [menu setAutoenablesItems:NO];
+ return menu;
+}
+
+NSMenuItem* MenuItem(NSString* title,
+ NSString* key_equivalent = @"",
+ NSEventModifierFlags modifier_mask = 0) {
+ NSMenuAdditionsUnitTestMenuItem* item =
+ [[[NSMenuAdditionsUnitTestMenuItem alloc] initWithTitle:title
+ action:NULL
+ keyEquivalent:key_equivalent]
+ autorelease];
+ [item setKeyEquivalentModifierMask:modifier_mask];
+ [item setEnabled:YES];
+ return item;
+}
+
+NSEvent* KeyEvent(const NSEventModifierFlags modifierFlags,
+ NSString* chars,
+ NSString* charsNoMods = nil,
+ const NSUInteger keyCode = 0) {
+ if (charsNoMods == nil)
+ charsNoMods = chars;
+
+ return [NSEvent keyEventWithType:NSEventTypeKeyDown
+ location:NSZeroPoint
+ modifierFlags:modifierFlags
+ timestamp:0.0
+ windowNumber:0
+ context:nil
+ characters:chars
+ charactersIgnoringModifiers:charsNoMods
+ isARepeat:NO
+ keyCode:keyCode];
+}
+
+} // namespace
+
+TEST(NSMenuAdditionsTest, TestMenuItemForKeyEquivalentEvent) {
+ NSMenu* main_menu = Menu(@"Main Menu");
+
+ [main_menu addItem:MenuItem(@"App")];
+ NSString* file_title = @"File";
+ [main_menu addItem:MenuItem(file_title)];
+ [main_menu addItem:MenuItem(@"Edit")];
+ [main_menu addItem:MenuItem(@"Window")];
+ [main_menu addItem:MenuItem(@"Help")];
+
+ NSMenu* file_menu = Menu(file_title);
+ NSMenuItem* file_menu_item = [main_menu itemWithTitle:[file_menu title]];
+ [file_menu_item setSubmenu:file_menu];
+
+ [file_menu addItem:MenuItem(@"New")];
+ NSString* open_title = @"Open";
+ [file_menu addItem:MenuItem(open_title, @"o", NSEventModifierFlagCommand)];
+ NSString* open_recent_title = @"Open Recent";
+ [file_menu addItem:MenuItem(open_recent_title)];
+ NSString* close_all_title = @"Close All";
+ [file_menu
+ addItem:MenuItem(close_all_title, @"W", NSEventModifierFlagCommand)];
+
+ NSMenu* open_recent_menu = Menu(open_recent_title);
+ NSMenuItem* open_recent_menu_item =
+ [file_menu itemWithTitle:[open_recent_menu title]];
+ [open_recent_menu_item setSubmenu:open_recent_menu];
+
+ [open_recent_menu addItem:MenuItem(@"Mock up")];
+ [open_recent_menu addItem:MenuItem(@"Preview-1")];
+ [open_recent_menu addItem:MenuItem(@"Scrtachpad")];
+ [open_recent_menu addItem:[NSMenuItem separatorItem]];
+ NSString* clear_menu_title = @"Clear Menu";
+ [open_recent_menu
+ addItem:MenuItem(clear_menu_title, @"c",
+ NSEventModifierFlagCommand | NSEventModifierFlagControl |
+ NSEventModifierFlagOption |
+ NSEventModifierFlagFunction)];
+
+ NSEvent* event = KeyEvent(NSEventModifierFlagCommand, @"o");
+ EXPECT_EQ([file_menu itemWithTitle:open_title],
+ [main_menu cr_menuItemForKeyEquivalentEvent:event]);
+
+ event = KeyEvent(NSEventModifierFlagCommand, @"W");
+ EXPECT_EQ([file_menu itemWithTitle:close_all_title],
+ [main_menu cr_menuItemForKeyEquivalentEvent:event]);
+
+ event = KeyEvent(NSEventModifierFlagCommand | NSEventModifierFlagControl |
+ NSEventModifierFlagOption | NSEventModifierFlagFunction,
+ @"c");
+ EXPECT_EQ([open_recent_menu itemWithTitle:clear_menu_title],
+ [main_menu cr_menuItemForKeyEquivalentEvent:event]);
+
+ event = KeyEvent(NSEventModifierFlagCommand, @"g");
+ EXPECT_EQ(nil, [main_menu cr_menuItemForKeyEquivalentEvent:event]);
+}
+
+// Tests that a set pre-search block is executed during calls to
+// -[NSMenu cr_menuItemForKeyEquivalentEvent:].
+TEST(NSMenuAdditionsTest, TestPreSearchBlock) {
+ __block bool block_was_called = false;
+
+ [NSMenu cr_setMenuItemForKeyEquivalentEventPreSearchBlock:^{
+ block_was_called = true;
+ }];
+
+ NSMenu* main_menu = Menu(@"Main Menu");
+ NSEvent* event = KeyEvent(NSEventModifierFlagCommand, @"c");
+ [main_menu cr_menuItemForKeyEquivalentEvent:event];
+
+ EXPECT_TRUE(block_was_called);
+
+ // Setting the block again should cause a crash (the API only supports a
+ // single pre-search block).
+ EXPECT_CHECK_DEATH(
+ [NSMenu cr_setMenuItemForKeyEquivalentEventPreSearchBlock:^{
+ block_was_called = true;
+ }]);
+}
diff --git a/chromium/ui/base/cocoa/nsmenuitem_additions.h b/chromium/ui/base/cocoa/nsmenuitem_additions.h
index 6ac3570a891..02131f0c910 100644
--- a/chromium/ui/base/cocoa/nsmenuitem_additions.h
+++ b/chromium/ui/base/cocoa/nsmenuitem_additions.h
@@ -11,10 +11,10 @@
@interface NSMenuItem (ChromeAdditions)
-// Returns true exactly if the menu item would fire if it would be put into
-// a menu and then |menu performKeyEquivalent:event| was called.
-// This method always returns NO if the menu item is not enabled.
-- (BOOL)cr_firesForKeyEvent:(NSEvent*)event;
+// Returns YES if the menu item is enabled and a call to
+// [menu performKeyEquivalent:`event`] would cause the
+// menu item to fire.
+- (BOOL)cr_firesForKeyEquivalentEvent:(NSEvent*)event;
@end
@@ -32,6 +32,14 @@ void COMPONENT_EXPORT(UI_BASE)
bool COMPONENT_EXPORT(UI_BASE)
IsKeyboardLayoutCommandQwerty(NSString* layout_id);
+// Returns a suitable keyboard shortcut modifier mask for `event`. In
+// particular, NSEventModifierFlagFunction may be present in the event's
+// modifiers but it may not indicate the user is pressing the Function key (it
+// exists, for example, when pressing a function key like Up Arrow). This
+// distinction matters when evaluating a key event as a possible keyboard
+// shortcut.
+NSUInteger COMPONENT_EXPORT(UI_BASE) ModifierMaskForKeyEvent(NSEvent* event);
+
} // namespace cocoa
} // namespace ui
diff --git a/chromium/ui/base/cocoa/nsmenuitem_additions.mm b/chromium/ui/base/cocoa/nsmenuitem_additions.mm
index c4061712913..e2a67bace80 100644
--- a/chromium/ui/base/cocoa/nsmenuitem_additions.mm
+++ b/chromium/ui/base/cocoa/nsmenuitem_additions.mm
@@ -26,6 +26,31 @@ bool IsKeyboardLayoutCommandQwerty(NSString* layout_id) {
[layout_id isEqualToString:@"com.apple.keylayout.Dhivehi-QWERTY"];
}
+NSUInteger ModifierMaskForKeyEvent(NSEvent* event) {
+ NSUInteger eventModifierMask =
+ NSEventModifierFlagCommand | NSEventModifierFlagControl |
+ NSEventModifierFlagOption | NSEventModifierFlagShift;
+
+ // If `event` isn't a function key press or it's not a character key press
+ // (e.g. it's a flags change), we can simply return the mask.
+ if (([event modifierFlags] & NSEventModifierFlagFunction) == 0 ||
+ [event type] != NSEventTypeKeyDown)
+ return eventModifierMask;
+
+ // "Up arrow", home, and other "function" key events include
+ // NSEventModifierFlagFunction in their flags even though the user isn't
+ // holding down the keyboard's function / world key. Add
+ // NSEventModifierFlagFunction to the returned modifier mask only if the
+ // event isn't for a function key.
+ unichar firstCharacter =
+ [[event charactersIgnoringModifiers] characterAtIndex:0];
+ if (firstCharacter < NSUpArrowFunctionKey ||
+ firstCharacter > NSModeSwitchFunctionKey)
+ eventModifierMask |= NSEventModifierFlagFunction;
+
+ return eventModifierMask;
+}
+
} // namespace cocoa
} // namespace ui
@@ -68,7 +93,7 @@ bool IsKeyboardLayoutCommandQwerty(NSString* layout_id) {
@implementation NSMenuItem (ChromeAdditions)
-- (BOOL)cr_firesForKeyEvent:(NSEvent*)event {
+- (BOOL)cr_firesForKeyEquivalentEvent:(NSEvent*)event {
if (![self isEnabled])
return NO;
@@ -189,8 +214,7 @@ bool IsKeyboardLayoutCommandQwerty(NSString* layout_id) {
}
// Clear all non-interesting modifiers
- eventModifiers &= NSEventModifierFlagCommand | NSEventModifierFlagControl |
- NSEventModifierFlagOption | NSEventModifierFlagShift;
+ eventModifiers &= ui::cocoa::ModifierMaskForKeyEvent(event);
return [eventString isEqualToString:[self keyEquivalent]] &&
eventModifiers == [self keyEquivalentModifierMask];
diff --git a/chromium/ui/base/cocoa/nsmenuitem_additions_unittest.mm b/chromium/ui/base/cocoa/nsmenuitem_additions_unittest.mm
index b0e041f0bdf..f382715b1e3 100644
--- a/chromium/ui/base/cocoa/nsmenuitem_additions_unittest.mm
+++ b/chromium/ui/base/cocoa/nsmenuitem_additions_unittest.mm
@@ -28,7 +28,7 @@ namespace {
NSEvent* KeyEvent(const NSUInteger modifierFlags,
NSString* chars,
NSString* charsNoMods,
- const NSUInteger keyCode) {
+ const NSUInteger keyCode = 0) {
return [NSEvent keyEventWithType:NSEventTypeKeyDown
location:NSZeroPoint
modifierFlags:modifierFlags
@@ -63,7 +63,8 @@ void ExpectKeyFiresItemEq(bool result,
NSEvent* key,
NSMenuItem* item,
bool compareCocoa) {
- EXPECT_EQ(result, [item cr_firesForKeyEvent:key]) << key << '\n' << item;
+ EXPECT_EQ(result, [item cr_firesForKeyEquivalentEvent:key]) << key << '\n'
+ << item;
// Make sure that Cocoa does in fact agree with our expectations. However,
// in some cases cocoa behaves weirdly (if you create e.g. a new event that
@@ -92,6 +93,37 @@ void ExpectKeyDoesntFireItem(NSEvent* key,
ExpectKeyFiresItemEq(false, key, item, compareCocoa);
}
+TEST(NSMenuItemAdditionsTest, TestExtractsKeyEventModifierMask) {
+ const NSEventModifierFlags mask =
+ NSEventModifierFlagCommand | NSEventModifierFlagControl |
+ NSEventModifierFlagOption | NSEventModifierFlagShift;
+
+ // The mask returned by ModifierMaskForKeyEvent() should include
+ // NSEventModifierFlagFunction if the user holds down the function modifier
+ // key with a non-function key.
+ NSEvent* event = KeyEvent(mask | NSEventModifierFlagFunction, @"e", @"e");
+ EXPECT_EQ(mask | NSEventModifierFlagFunction, ModifierMaskForKeyEvent(event));
+
+ // The mask returned by ModifierMaskForKeyEvent() should not include
+ // NSEventModifierFlagFunction when the user presses a function key such as
+ // up arrow (the AppKit adds NSEventModifierFlagFunction to the key event's
+ // modifiers whenever the user presses a function key regardless of the state
+ // of the function modifier key).
+ unichar buffer[2];
+ buffer[0] = NSUpArrowFunctionKey;
+ buffer[1] = 0;
+ NSString* characters = [NSString stringWithCharacters:buffer length:1];
+ event = KeyEvent(NSEventModifierFlagFunction, characters, characters);
+ EXPECT_EQ(mask, ModifierMaskForKeyEvent(event));
+
+ // The mask returned by ModifierMaskForKeyEvent() should not include
+ // NSEventModifierFlagFunction if the user does not hold down the function
+ // modifier key with a non-function key.
+ const NSEventModifierFlags kNoModifiers = 0;
+ event = KeyEvent(kNoModifiers, @"a", @"a");
+ EXPECT_EQ(mask, ModifierMaskForKeyEvent(event));
+}
+
TEST(NSMenuItemAdditionsTest, TestFiresForKeyEvent) {
// These test cases were built by writing a small test app that has a
// MainMenu.xib with a given key equivalent set in Interface Builder and
@@ -160,7 +192,8 @@ TEST(NSMenuItemAdditionsTest, TestFiresForKeyEvent) {
ExpectKeyFiresItem(key, item);
// Turns out Cocoa fires "+ 100108 + 18" if you hit cmd-= and the menu only
- // has a cmd-+ shortcut. But that's transparent for |cr_firesForKeyEvent:|.
+ // has a cmd-+ shortcut. But that's transparent for
+ // |cr_firesForKeyEquivalentEvent:|.
// ctrl-3
key = KeyEvent(0x40101, @"3", @"3", 0x14);
@@ -483,6 +516,61 @@ TEST(NSMenuItemAdditionsTest, TestMOnDifferentLayouts) {
CFRelease(list);
}
+// Tests that ModifierMaskForKeyEvent() works correctly for "flags changed"
+// events.
+TEST(NSMenuItemAdditionsTest, MMFKEHandlesFlagsChangedEvents) {
+ NSEventModifierFlags modifiers = NSEventModifierFlagCommand;
+ NSEvent* flags_changed_event =
+ [NSEvent keyEventWithType:NSEventTypeFlagsChanged
+ location:NSZeroPoint
+ modifierFlags:modifiers
+ timestamp:0.0
+ windowNumber:0
+ context:nil
+ characters:@""
+ charactersIgnoringModifiers:@""
+ isARepeat:NO
+ keyCode:0];
+
+ NSEventModifierFlags expected_flags =
+ NSEventModifierFlagCommand | NSEventModifierFlagControl |
+ NSEventModifierFlagOption | NSEventModifierFlagShift;
+ // Flags changed events don't have characters. Make sure we don't make the
+ // mistake of of assuming the event contains characters.
+ EXPECT_EQ(expected_flags, ModifierMaskForKeyEvent(flags_changed_event));
+
+ modifiers = NSEventModifierFlagFunction;
+ flags_changed_event = [NSEvent keyEventWithType:NSEventTypeFlagsChanged
+ location:NSZeroPoint
+ modifierFlags:modifiers
+ timestamp:0.0
+ windowNumber:0
+ context:nil
+ characters:@""
+ charactersIgnoringModifiers:@""
+ isARepeat:NO
+ keyCode:0];
+
+ // Make sure, in particular, we handle flags changed for the function key.
+ // See https://crbug.com/1340934 .
+ EXPECT_EQ(expected_flags, ModifierMaskForKeyEvent(flags_changed_event));
+
+ modifiers = NSEventModifierFlagOption;
+ NSEvent* key_up_event = [NSEvent keyEventWithType:NSEventTypeKeyUp
+ location:NSZeroPoint
+ modifierFlags:modifiers
+ timestamp:0.0
+ windowNumber:0
+ context:nil
+ characters:@"a"
+ charactersIgnoringModifiers:@"a"
+ isARepeat:NO
+ keyCode:0];
+
+ // Check that there are no issues with key up events.
+ EXPECT_EQ(expected_flags, ModifierMaskForKeyEvent(key_up_event));
+}
+
} // namespace
} // namespace cocoa
} // namespace ui
diff --git a/chromium/ui/base/cocoa/nswindow_test_util.cc b/chromium/ui/base/cocoa/nswindow_test_util.cc
new file mode 100644
index 00000000000..7355191580b
--- /dev/null
+++ b/chromium/ui/base/cocoa/nswindow_test_util.cc
@@ -0,0 +1,78 @@
+// 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/base/cocoa/nswindow_test_util.h"
+
+namespace ui {
+
+NSWindowFullscreenNotificationWaiter::NSWindowFullscreenNotificationWaiter(
+ gfx::NativeWindow window)
+ : window_(window) {
+ // We only support one NSWindowFullscreenNotificationWaiter instance at once.
+ DCHECK(!instance_);
+ instance_ = this;
+}
+
+NSWindowFullscreenNotificationWaiter::~NSWindowFullscreenNotificationWaiter() {
+ DCHECK(instance_ == this);
+ instance_ = nullptr;
+}
+
+void NSWindowFullscreenNotificationWaiter::WaitForEnterAndExitCount(
+ int target_enter_count,
+ int target_exit_count) {
+ target_enter_count_ = target_enter_count;
+ target_exit_count_ = target_exit_count;
+
+ // Do not wait if the targets are already met.
+ if (enter_count_ >= target_enter_count_ &&
+ exit_count_ >= target_exit_count_) {
+ return;
+ }
+
+ run_loop_ = std::make_unique<base::RunLoop>();
+ run_loop_->Run();
+ run_loop_.reset();
+}
+
+void NSWindowFullscreenNotificationWaiter::NotifyFullscreenTransitionComplete(
+ bool fullscreen) {
+ if (fullscreen)
+ enter_count_++;
+ else
+ exit_count_++;
+
+ if (run_loop_ && enter_count_ >= target_enter_count_ &&
+ exit_count_ >= target_exit_count_) {
+ run_loop_->Quit();
+ }
+}
+
+// static
+void NSWindowFullscreenNotificationWaiter::NotifyFullscreenTransitionComplete(
+ gfx::NativeWindow window,
+ bool fullscreen) {
+ if (!instance_ || instance_->window_ != window)
+ return;
+ instance_->NotifyFullscreenTransitionComplete(fullscreen);
+}
+
+// static
+NSWindowFullscreenNotificationWaiter*
+ NSWindowFullscreenNotificationWaiter::instance_ = nullptr;
+
+// static
+void NSWindowFakedForTesting::SetEnabled(bool enabled) {
+ enabled_ = enabled;
+}
+
+// static
+bool NSWindowFakedForTesting::IsEnabled() {
+ return enabled_;
+}
+
+// static
+bool NSWindowFakedForTesting::enabled_ = false;
+
+} // namespace ui
diff --git a/chromium/ui/base/cocoa/nswindow_test_util.h b/chromium/ui/base/cocoa/nswindow_test_util.h
new file mode 100644
index 00000000000..c592214539d
--- /dev/null
+++ b/chromium/ui/base/cocoa/nswindow_test_util.h
@@ -0,0 +1,59 @@
+// 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_BASE_COCOA_NSWINDOW_TEST_UTIL_H_
+#define UI_BASE_COCOA_NSWINDOW_TEST_UTIL_H_
+
+#include <memory>
+
+#include "base/component_export.h"
+#include "base/run_loop.h"
+#include "ui/gfx/native_widget_types.h"
+
+namespace ui {
+
+class COMPONENT_EXPORT(UI_BASE) NSWindowFullscreenNotificationWaiter {
+ public:
+ explicit NSWindowFullscreenNotificationWaiter(gfx::NativeWindow window);
+ ~NSWindowFullscreenNotificationWaiter();
+
+ void WaitForEnterAndExitCount(int target_enter_count, int target_exit_count);
+ int enter_count() const { return enter_count_; }
+ int exit_count() const { return exit_count_; }
+
+ static void NotifyFullscreenTransitionComplete(gfx::NativeWindow window,
+ bool fullscreen);
+
+ private:
+ void NotifyFullscreenTransitionComplete(bool fullscreen);
+
+ std::unique_ptr<base::RunLoop> run_loop_;
+ const gfx::NativeWindow window_;
+
+ int enter_count_ = 0;
+ int exit_count_ = 0;
+ int target_enter_count_ = 0;
+ int target_exit_count_ = 0;
+
+ static NSWindowFullscreenNotificationWaiter* instance_;
+};
+
+class COMPONENT_EXPORT(UI_BASE) NSWindowFakedForTesting {
+ public:
+ // This is set by tests that are not written robustly to asynchronous
+ // transitions to fullscreen (e.g, by using ScopedFakeNSWindowFullscreen on
+ // macOS).
+ static void SetEnabled(bool);
+ static bool IsEnabled();
+
+ private:
+ static bool enabled_;
+};
+
+// static void SetFullscreenFakedForTesting(bool);
+// static bool IsFullscreenFakedForTesting();
+
+} // namespace ui
+
+#endif // UI_BASE_COCOA_NSWINDOW_TEST_UTIL_H_
diff --git a/chromium/ui/base/cocoa/text_services_context_menu.h b/chromium/ui/base/cocoa/text_services_context_menu.h
index 371d0971f07..25071043626 100644
--- a/chromium/ui/base/cocoa/text_services_context_menu.h
+++ b/chromium/ui/base/cocoa/text_services_context_menu.h
@@ -9,6 +9,7 @@
#include "base/component_export.h"
#include "base/i18n/rtl.h"
+#include "base/memory/raw_ptr.h"
#include "ui/base/models/simple_menu_model.h"
namespace ui {
@@ -84,7 +85,7 @@ class COMPONENT_EXPORT(UI_BASE) TextServicesContextMenu
// Model for the BiDi input submenu.
ui::SimpleMenuModel bidi_submenu_model_;
- Delegate* delegate_; // Weak.
+ raw_ptr<Delegate> delegate_; // Weak.
};
} // namespace ui
diff --git a/chromium/ui/base/cocoa/text_services_context_menu.cc b/chromium/ui/base/cocoa/text_services_context_menu.mm
index b4f4d5101fc..aff18e1013e 100644
--- a/chromium/ui/base/cocoa/text_services_context_menu.cc
+++ b/chromium/ui/base/cocoa/text_services_context_menu.mm
@@ -4,22 +4,22 @@
#include "ui/base/cocoa/text_services_context_menu.h"
-#include <utility>
+#import <AppKit/AppKit.h>
-#include <ApplicationServices/ApplicationServices.h>
-#include <CoreAudio/CoreAudio.h>
+#include <utility>
-#include "base/mac/mac_logging.h"
#include "base/strings/sys_string_conversions.h"
-#include "base/strings/utf_string_conversions.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/strings/grit/ui_strings.h"
namespace {
-// The speech channel used for speaking. This is shared to check if a speech
-// channel is currently speaking.
-SpeechChannel g_speech_channel;
+NSSpeechSynthesizer* SpeechSynthesizer() {
+ static NSSpeechSynthesizer* speech_synthesizer =
+ [[NSSpeechSynthesizer alloc] initWithVoice:nil];
+
+ return speech_synthesizer;
+}
// Returns the TextDirection associated associated with the given BiDi
// |command_id|.
@@ -60,27 +60,37 @@ TextServicesContextMenu::TextServicesContextMenu(Delegate* delegate)
kWritingDirectionRtl, IDS_CONTENT_CONTEXT_WRITING_DIRECTION_RTL);
}
+// A note about the Speech submenu.
+//
+// All standard AppKit implementations of `-(IBAction)startSpeaking:(id)sender`
+// and `-(IBAction)stopSpeaking:(id)sender` funnel into messages to
+// `NSApplication`:
+//
+// @interface NSApplication ()
+// - (void)speakString:(NSString*)string;
+// - (IBAction)stopSpeaking:(id)sender;
+// - (BOOL)isSpeaking;
+// @end
+//
+// However, it is an explicit decision to not use these messages, and to keep an
+// independent `NSSpeechSynthesizer`, as Chromium tries to avoid the use of SPI
+// when it's reasonably straightforward to do so. This does mean that speech
+// initiated within Chromium doesn't interoperate with speech initiated with
+// any native controls (if there are any left) via this submenu.
+
void TextServicesContextMenu::SpeakText(const std::u16string& text) {
if (IsSpeaking())
- StopSpeaking();
-
- if (!g_speech_channel) {
- OSErr result = NewSpeechChannel(nullptr, &g_speech_channel);
- OSSTATUS_DCHECK(result == noErr, result);
- }
+ [SpeechSynthesizer() stopSpeaking];
- SpeakCFString(g_speech_channel, base::SysUTF16ToCFStringRef(text), nullptr);
+ [SpeechSynthesizer() startSpeakingString:base::SysUTF16ToNSString(text)];
}
void TextServicesContextMenu::StopSpeaking() {
- DCHECK(g_speech_channel);
- StopSpeechAt(g_speech_channel, kImmediate);
- DisposeSpeechChannel(g_speech_channel);
- g_speech_channel = nullptr;
+ [SpeechSynthesizer() stopSpeaking];
}
bool TextServicesContextMenu::IsSpeaking() {
- return SpeechBusy();
+ return SpeechSynthesizer().speaking;
}
void TextServicesContextMenu::AppendToContextMenu(SimpleMenuModel* model) {
diff --git a/chromium/ui/base/cocoa/tool_tip_base_view.h b/chromium/ui/base/cocoa/tool_tip_base_view.h
index 32d354fd525..1de57b4367b 100644
--- a/chromium/ui/base/cocoa/tool_tip_base_view.h
+++ b/chromium/ui/base/cocoa/tool_tip_base_view.h
@@ -5,6 +5,8 @@
#ifndef UI_BASE_COCOA_TOOL_TIP_BASE_VIEW_H_
#define UI_BASE_COCOA_TOOL_TIP_BASE_VIEW_H_
+#include "base/memory/raw_ptr.h"
+
#import <AppKit/AppKit.h>
#include "base/component_export.h"
@@ -18,7 +20,7 @@ COMPONENT_EXPORT(UI_BASE)
@private
// These are part of the magic tooltip code from WebKit's WebHTMLView:
id _trackingRectOwner; // (not retained)
- void* _trackingRectUserData;
+ raw_ptr<void> _trackingRectUserData;
NSTrackingRectTag _lastToolTipTag;
base::scoped_nsobject<NSString> _toolTip;
}
diff --git a/chromium/ui/base/cocoa/weak_ptr_nsobject.mm b/chromium/ui/base/cocoa/weak_ptr_nsobject.mm
index c8d17e9a122..6c14107077b 100644
--- a/chromium/ui/base/cocoa/weak_ptr_nsobject.mm
+++ b/chromium/ui/base/cocoa/weak_ptr_nsobject.mm
@@ -2,13 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/memory/raw_ptr.h"
+
#import "ui/base/cocoa/weak_ptr_nsobject.h"
#import <Foundation/Foundation.h>
@interface WeakPtrNSObject : NSObject {
@public
- void* weak_ptr;
+ raw_ptr<void> weak_ptr;
}
@end
@implementation WeakPtrNSObject
diff --git a/chromium/ui/base/cursor/BUILD.gn b/chromium/ui/base/cursor/BUILD.gn
index 18e4f4a535f..50b7ecb2d71 100644
--- a/chromium/ui/base/cursor/BUILD.gn
+++ b/chromium/ui/base/cursor/BUILD.gn
@@ -24,17 +24,6 @@ component("cursor") {
deps = [ "//ui/gfx:gfx_skia" ]
}
-component("theme_manager") {
- output_name = "ui_base_cursor_theme_manager"
- sources = [
- "cursor_theme_manager.cc",
- "cursor_theme_manager.h",
- "cursor_theme_manager_observer.h",
- ]
- defines = [ "IS_UI_BASE_CURSOR_THEME_MANAGER_IMPL" ]
- public_deps = [ "//base" ]
-}
-
source_set("unittests") {
testonly = true
sources = []
diff --git a/chromium/ui/base/cursor/cursor_theme_manager.cc b/chromium/ui/base/cursor/cursor_theme_manager.cc
deleted file mode 100644
index c790164f8f9..00000000000
--- a/chromium/ui/base/cursor/cursor_theme_manager.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/base/cursor/cursor_theme_manager.h"
-
-#include "base/check.h"
-#include "base/check_op.h"
-#include "base/observer_list.h"
-
-namespace ui {
-
-namespace {
-
-CursorThemeManager* g_instance = nullptr;
-
-}
-
-CursorThemeManager::~CursorThemeManager() {
- DCHECK_EQ(g_instance, this);
- g_instance = nullptr;
-}
-
-// static
-CursorThemeManager* CursorThemeManager::GetInstance() {
- return g_instance;
-}
-
-void CursorThemeManager::AddObserver(CursorThemeManagerObserver* observer) {
- cursor_theme_observers_.AddObserver(observer);
- std::string name = GetCursorThemeName();
- if (!name.empty())
- observer->OnCursorThemeNameChanged(name);
- int size = GetCursorThemeSize();
- if (size)
- observer->OnCursorThemeSizeChanged(size);
-}
-
-void CursorThemeManager::RemoveObserver(CursorThemeManagerObserver* observer) {
- cursor_theme_observers_.RemoveObserver(observer);
-}
-
-CursorThemeManager::CursorThemeManager() {
- DCHECK(!g_instance);
- g_instance = this;
-}
-
-} // namespace ui
diff --git a/chromium/ui/base/cursor/cursor_theme_manager.h b/chromium/ui/base/cursor/cursor_theme_manager.h
deleted file mode 100644
index 42a4dacf7ae..00000000000
--- a/chromium/ui/base/cursor/cursor_theme_manager.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_BASE_CURSOR_CURSOR_THEME_MANAGER_H_
-#define UI_BASE_CURSOR_CURSOR_THEME_MANAGER_H_
-
-#include <string>
-
-#include "base/component_export.h"
-#include "base/observer_list.h"
-#include "ui/base/cursor/cursor_theme_manager_observer.h"
-
-namespace ui {
-
-class COMPONENT_EXPORT(UI_BASE_CURSOR_THEME_MANAGER) CursorThemeManager {
- public:
- CursorThemeManager(const CursorThemeManager&) = delete;
- CursorThemeManager& operator=(const CursorThemeManager&) = delete;
- virtual ~CursorThemeManager();
-
- static CursorThemeManager* GetInstance();
-
- // Adds |observer| and makes initial OnCursorThemNameChanged() and/or
- // OnCursorThemeSizeChanged() calls if the respective settings were set.
- void AddObserver(CursorThemeManagerObserver* observer);
-
- void RemoveObserver(CursorThemeManagerObserver* observer);
-
- virtual std::string GetCursorThemeName() = 0;
- virtual int GetCursorThemeSize() = 0;
-
- protected:
- CursorThemeManager();
-
- const base::ObserverList<CursorThemeManagerObserver>&
- cursor_theme_observers() {
- return cursor_theme_observers_;
- }
-
- private:
- base::ObserverList<CursorThemeManagerObserver> cursor_theme_observers_;
-};
-
-} // namespace ui
-
-#endif // UI_BASE_CURSOR_CURSOR_THEME_MANAGER_H_
diff --git a/chromium/ui/base/data_transfer_policy/data_transfer_endpoint.h b/chromium/ui/base/data_transfer_policy/data_transfer_endpoint.h
index c3cd9d69c0c..956c1e0778c 100644
--- a/chromium/ui/base/data_transfer_policy/data_transfer_endpoint.h
+++ b/chromium/ui/base/data_transfer_policy/data_transfer_endpoint.h
@@ -70,7 +70,7 @@ class COMPONENT_EXPORT(UI_BASE_DATA_TRANSFER_POLICY) DataTransferEndpoint {
bool notify_if_restricted() const { return notify_if_restricted_; }
- // Returns true if both of the endpoints have the same origin_ and type_ ==
+ // Returns true if both of the endpoints have the same url_ and type_ ==
// kUrl.
bool IsSameURLWith(const DataTransferEndpoint& other) const;
diff --git a/chromium/ui/base/data_transfer_policy/data_transfer_endpoint_serializer.cc b/chromium/ui/base/data_transfer_policy/data_transfer_endpoint_serializer.cc
index 058d199a1df..852096aa85d 100644
--- a/chromium/ui/base/data_transfer_policy/data_transfer_endpoint_serializer.cc
+++ b/chromium/ui/base/data_transfer_policy/data_transfer_endpoint_serializer.cc
@@ -14,7 +14,6 @@
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
#include "url/gurl.h"
-#include "url/origin.h"
namespace ui {
@@ -22,7 +21,6 @@ namespace {
// JSON Keys
constexpr char kEndpointTypeKey[] = "endpoint_type";
-constexpr char kUrlOriginKey[] = "url_origin";
constexpr char kUrlKey[] = "url";
// Endpoint Type Strings
@@ -98,12 +96,8 @@ std::string ConvertDataTransferEndpointToJson(const DataTransferEndpoint& dte) {
const GURL* url = dte.GetURL();
- if (url && url->is_valid()) {
+ if (url && url->is_valid())
encoded_dte.SetStringKey(kUrlKey, url->spec());
- // TODO(crbug.com/1300476): remove |kUrlOriginKey| after M102.
- encoded_dte.SetStringKey(kUrlOriginKey,
- url::Origin::Create(*url).Serialize());
- }
std::string json;
base::JSONWriter::Write(encoded_dte, &json);
@@ -121,10 +115,6 @@ std::unique_ptr<DataTransferEndpoint> ConvertJsonToDataTransferEndpoint(
dte_dictionary->FindStringKey(kEndpointTypeKey);
const std::string* url_string = dte_dictionary->FindStringKey(kUrlKey);
- // TODO(crbug.com/1300476): remove |kUrlOriginKey| after M102.
- if (!url_string)
- url_string = dte_dictionary->FindStringKey(kUrlOriginKey);
-
if (url_string) {
GURL url = GURL(*url_string);
diff --git a/chromium/ui/base/data_transfer_policy/data_transfer_endpoint_serializer.h b/chromium/ui/base/data_transfer_policy/data_transfer_endpoint_serializer.h
index d6b3651dc80..27fb6907596 100644
--- a/chromium/ui/base/data_transfer_policy/data_transfer_endpoint_serializer.h
+++ b/chromium/ui/base/data_transfer_policy/data_transfer_endpoint_serializer.h
@@ -14,11 +14,8 @@
// The MIME type data is a JSON string in the form:
// {
// "endpoint_type": "<endpoint type>",
-// "url_origin": "https://www.google.com",
// "url": "https://www.google.com"
// }
-// TODO(crbug.com/1300476): "url_origin" is still being sent because of the
-// version skew between Lacros and ash. It should be removed after M102.
namespace ui {
@@ -28,7 +25,7 @@ COMPONENT_EXPORT(UI_BASE_DATA_TRANSFER_POLICY)
std::string ConvertDataTransferEndpointToJson(const DataTransferEndpoint& dte);
// Decodes JSON strings into DataTransferEndpoint objects.
-// If no type or origin found, nullptr is returned.
+// If no type or url found, nullptr is returned.
COMPONENT_EXPORT(UI_BASE_DATA_TRANSFER_POLICY)
std::unique_ptr<DataTransferEndpoint> ConvertJsonToDataTransferEndpoint(
std::string json);
diff --git a/chromium/ui/base/data_transfer_policy/data_transfer_endpoint_serializer_unittest.cc b/chromium/ui/base/data_transfer_policy/data_transfer_endpoint_serializer_unittest.cc
index 609d15e348a..ecd9e248aa6 100644
--- a/chromium/ui/base/data_transfer_policy/data_transfer_endpoint_serializer_unittest.cc
+++ b/chromium/ui/base/data_transfer_policy/data_transfer_endpoint_serializer_unittest.cc
@@ -15,7 +15,7 @@ namespace {
constexpr char kExampleUrl[] = "https://www.google.com";
constexpr char kExampleJsonUrlType[] =
- R"({"endpoint_type":"url","url":"https://www.google.com/","url_origin":"https://www.google.com"})";
+ R"({"endpoint_type":"url","url":"https://www.google.com/"})";
constexpr char kExampleJsonUrlTypeNoUrl[] = R"({"endpoint_type":"url"})";
#if BUILDFLAG(IS_CHROMEOS)
diff --git a/chromium/ui/base/dragdrop/drag_source_win.cc b/chromium/ui/base/dragdrop/drag_source_win.cc
index e02b9374736..c27409139ee 100644
--- a/chromium/ui/base/dragdrop/drag_source_win.cc
+++ b/chromium/ui/base/dragdrop/drag_source_win.cc
@@ -16,7 +16,6 @@ DragSourceWin::DragSourceWin() : cancel_drag_(false), data_(nullptr) {
}
HRESULT DragSourceWin::QueryContinueDrag(BOOL escape_pressed, DWORD key_state) {
- num_query_continues_++;
if (cancel_drag_)
return DRAGDROP_S_CANCEL;
diff --git a/chromium/ui/base/dragdrop/drag_source_win.h b/chromium/ui/base/dragdrop/drag_source_win.h
index b4557af4047..5b03fe23bd6 100644
--- a/chromium/ui/base/dragdrop/drag_source_win.h
+++ b/chromium/ui/base/dragdrop/drag_source_win.h
@@ -46,10 +46,6 @@ class DragSourceWin
cancel_drag_ = true;
}
- // This is used to tell if the drag drop actually started, for generating
- // a BooleanSuccess histogram.
- int num_query_continues() const { return num_query_continues_; }
-
// IDropSource implementation:
HRESULT __stdcall QueryContinueDrag(BOOL escape_pressed,
DWORD key_state) override;
@@ -70,12 +66,6 @@ class DragSourceWin
bool cancel_drag_;
raw_ptr<const OSExchangeData> data_;
-
- // The number of times for this drag that Windows asked if the drag should
- // continue. This is used in DesktopDragDropClientWin::StartDragAndDrop to
- // detect if touch drag drop started successfully. See comment there for much
- // more info.
- int num_query_continues_ = 0;
};
} // namespace ui
diff --git a/chromium/ui/base/dragdrop/drop_target_event.cc b/chromium/ui/base/dragdrop/drop_target_event.cc
index 9c212257e10..4024f50a8b0 100644
--- a/chromium/ui/base/dragdrop/drop_target_event.cc
+++ b/chromium/ui/base/dragdrop/drop_target_event.cc
@@ -28,5 +28,9 @@ DropTargetEvent::DropTargetEvent(const DropTargetEvent& other)
data_(other.data_),
source_operations_(other.source_operations_) {}
+std::unique_ptr<Event> DropTargetEvent::Clone() const {
+ return std::make_unique<DropTargetEvent>(*this);
+}
+
} // namespace ui
diff --git a/chromium/ui/base/dragdrop/drop_target_event.h b/chromium/ui/base/dragdrop/drop_target_event.h
index c0128cc2449..8c1548e93e9 100644
--- a/chromium/ui/base/dragdrop/drop_target_event.h
+++ b/chromium/ui/base/dragdrop/drop_target_event.h
@@ -24,6 +24,9 @@ class COMPONENT_EXPORT(UI_BASE) DropTargetEvent : public LocatedEvent {
const OSExchangeData& data() const { return data_; }
int source_operations() const { return source_operations_; }
+ // Event:
+ std::unique_ptr<Event> Clone() const override;
+
private:
// Data associated with the drag/drop session.
const OSExchangeData& data_;
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_provider_win.cc b/chromium/ui/base/dragdrop/os_exchange_data_provider_win.cc
index c6536868e16..0d973359391 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_win.cc
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_win.cc
@@ -418,7 +418,7 @@ void OSExchangeDataProviderWin::SetVirtualFileContentsForTesting(
base::win::ScopedHGlobal<FILEGROUPDESCRIPTORW*> locked_mem(hdata);
FILEGROUPDESCRIPTORW* descriptor = locked_mem.get();
- descriptor->cItems = num_files;
+ descriptor->cItems = base::checked_cast<UINT>(num_files);
STGMEDIUM storage = {
.tymed = TYMED_HGLOBAL, .hGlobal = hdata, .pUnkForRelease = nullptr};
@@ -427,7 +427,7 @@ void OSExchangeDataProviderWin::SetVirtualFileContentsForTesting(
for (size_t i = 0; i < num_files; i++) {
// Fill in each FILEDESCRIPTORW with file name.
- descriptor->fgd[i].dwFlags |= FD_UNICODE;
+ descriptor->fgd[i].dwFlags |= static_cast<DWORD>(FD_UNICODE);
std::wstring file_name = filenames_and_contents[i].first.value();
wcsncpy_s(descriptor->fgd[i].cFileName, MAX_PATH, file_name.c_str(),
std::min(file_name.size(), static_cast<size_t>(MAX_PATH - 1u)));
@@ -437,14 +437,15 @@ void OSExchangeDataProviderWin::SetVirtualFileContentsForTesting(
base::make_span(reinterpret_cast<const uint8_t*>(
filenames_and_contents[i].second.data()),
filenames_and_contents[i].second.length());
- SetVirtualFileContentAtIndexForTesting(data_buffer, tymed, i);
+ SetVirtualFileContentAtIndexForTesting(data_buffer, tymed, // IN-TEST
+ static_cast<LONG>(i));
}
}
void OSExchangeDataProviderWin::SetVirtualFileContentAtIndexForTesting(
base::span<const uint8_t> data_buffer,
DWORD tymed,
- size_t index) {
+ LONG index) {
STGMEDIUM storage_for_contents = kNullStorageMedium;
if (tymed == TYMED_ISTORAGE) {
@@ -467,8 +468,9 @@ void OSExchangeDataProviderWin::SetVirtualFileContentAtIndexForTesting(
Microsoft::WRL::ComPtr<IStream> source_stream;
if (SUCCEEDED(hr)) {
- source_stream =
- ::SHCreateMemStream(data_buffer.data(), data_buffer.size_bytes());
+ source_stream = ::SHCreateMemStream(
+ data_buffer.data(),
+ base::checked_cast<UINT>(data_buffer.size_bytes()));
}
if (source_stream) {
@@ -484,8 +486,8 @@ void OSExchangeDataProviderWin::SetVirtualFileContentAtIndexForTesting(
storage_for_contents.tymed = TYMED_ISTORAGE;
} else if (tymed == TYMED_ISTREAM) {
- storage_for_contents.pstm =
- ::SHCreateMemStream(data_buffer.data(), data_buffer.size_bytes());
+ storage_for_contents.pstm = ::SHCreateMemStream(
+ data_buffer.data(), base::checked_cast<UINT>(data_buffer.size_bytes()));
if (storage_for_contents.pstm) {
// A properly implemented IDataObject::GetData moves the stream pointer
// to end.
@@ -635,7 +637,7 @@ bool OSExchangeDataProviderWin::GetPickledData(
if (medium.tymed & TYMED_HGLOBAL) {
base::win::ScopedHGlobal<char*> c_data(medium.hGlobal);
DCHECK_GT(c_data.Size(), 0u);
- *data = base::Pickle(c_data.get(), static_cast<int>(c_data.Size()));
+ *data = base::Pickle(c_data.get(), c_data.Size());
success = true;
}
ReleaseStgMedium(&medium);
@@ -1095,7 +1097,7 @@ ULONG DataObjectImpl::Release() {
// anonymous namespace functions
namespace {
STGMEDIUM CreateStorageForBytes(const void* data, size_t bytes) {
- HANDLE handle = GlobalAlloc(GPTR, static_cast<int>(bytes));
+ HANDLE handle = GlobalAlloc(GPTR, bytes);
if (handle) {
base::win::ScopedHGlobal<uint8_t*> scoped(handle);
memcpy(scoped.get(), data, bytes);
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_provider_win.h b/chromium/ui/base/dragdrop/os_exchange_data_provider_win.h
index c84bafbd043..e0e9ffbc944 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_win.h
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_win.h
@@ -203,7 +203,7 @@ class COMPONENT_EXPORT(UI_BASE) OSExchangeDataProviderWin
private:
void SetVirtualFileContentAtIndexForTesting(base::span<const uint8_t> data,
DWORD tymed,
- size_t index);
+ LONG index);
scoped_refptr<DataObjectImpl> data_;
Microsoft::WRL::ComPtr<IDataObject> source_object_;
diff --git a/chromium/ui/base/emoji/emoji_panel_helper_lacros.cc b/chromium/ui/base/emoji/emoji_panel_helper_lacros.cc
new file mode 100644
index 00000000000..fc481a4ee66
--- /dev/null
+++ b/chromium/ui/base/emoji/emoji_panel_helper_lacros.cc
@@ -0,0 +1,21 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/base/emoji/emoji_panel_helper.h"
+
+#include "chromeos/crosapi/mojom/emoji_picker.mojom.h"
+#include "chromeos/lacros/lacros_service.h"
+
+namespace ui {
+
+bool IsEmojiPanelSupported() {
+ return chromeos::LacrosService::Get()
+ ->IsAvailable<crosapi::mojom::EmojiPicker>();
+}
+
+void ShowEmojiPanel() {
+ auto* lacros_service = chromeos::LacrosService::Get();
+ if (lacros_service->IsAvailable<crosapi::mojom::EmojiPicker>())
+ lacros_service->GetRemote<crosapi::mojom::EmojiPicker>()->ShowEmojiPicker();
+} // namespace ui \ No newline at end of file
diff --git a/chromium/ui/base/glib/scoped_gobject.h b/chromium/ui/base/glib/scoped_gobject.h
index 7c5a5ea89bc..77b845fdadc 100644
--- a/chromium/ui/base/glib/scoped_gobject.h
+++ b/chromium/ui/base/glib/scoped_gobject.h
@@ -8,6 +8,7 @@
#include <glib-object.h>
#include "base/check.h"
+#include "base/memory/raw_ptr.h"
// Similar to a std::shared_ptr for GObject types.
template <typename T>
@@ -69,7 +70,7 @@ class ScopedGObject {
g_object_unref(obj_);
}
- T* obj_ = nullptr;
+ raw_ptr<T> obj_ = nullptr;
};
// Create a ScopedGObject and do not increase the GObject's reference count.
diff --git a/chromium/ui/base/idle/BUILD.gn b/chromium/ui/base/idle/BUILD.gn
index bd3ac4e8ba8..43c702917b3 100644
--- a/chromium/ui/base/idle/BUILD.gn
+++ b/chromium/ui/base/idle/BUILD.gn
@@ -30,7 +30,7 @@ component("idle") {
]
if (is_chromeos_ash) {
- deps += [ "//chromeos/dbus/session_manager" ]
+ deps += [ "//chromeos/ash/components/dbus/session_manager" ]
}
sources = [
diff --git a/chromium/ui/base/idle/DEPS b/chromium/ui/base/idle/DEPS
index 50cec1b8c00..e14048d04b1 100644
--- a/chromium/ui/base/idle/DEPS
+++ b/chromium/ui/base/idle/DEPS
@@ -1,6 +1,6 @@
include_rules = [
+ "+chromeos/ash/components/dbus/session_manager",
"+chromeos/dbus/dbus_thread_manager.h",
- "+chromeos/dbus/session_manager",
"+chromeos/lacros",
"+dbus",
"+ui/base/ui_base_jni_headers",
diff --git a/chromium/ui/base/idle/idle_chromeos.cc b/chromium/ui/base/idle/idle_chromeos.cc
index a0f4cde65dc..8dca08e0909 100644
--- a/chromium/ui/base/idle/idle_chromeos.cc
+++ b/chromium/ui/base/idle/idle_chromeos.cc
@@ -5,7 +5,7 @@
#include "ui/base/idle/idle.h"
#include "base/time/time.h"
-#include "chromeos/dbus/session_manager/session_manager_client.h"
+#include "chromeos/ash/components/dbus/session_manager/session_manager_client.h"
#include "ui/base/idle/idle_internal.h"
#include "ui/base/user_activity/user_activity_detector.h"
@@ -21,7 +21,7 @@ bool CheckIdleStateIsLocked() {
if (IdleStateForTesting().has_value())
return IdleStateForTesting().value() == IDLE_STATE_LOCKED;
- return chromeos::SessionManagerClient::Get()->IsScreenLocked();
+ return ash::SessionManagerClient::Get()->IsScreenLocked();
}
} // namespace ui
diff --git a/chromium/ui/base/idle/idle_linux.cc b/chromium/ui/base/idle/idle_linux.cc
index d1f3f058617..bd6ff57145f 100644
--- a/chromium/ui/base/idle/idle_linux.cc
+++ b/chromium/ui/base/idle/idle_linux.cc
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/memory/raw_ptr.h"
#include "base/notreached.h"
#include "base/time/time.h"
#include "ui/base/idle/idle.h"
@@ -202,7 +203,7 @@ class DBusScreenSaverWatcher {
scoped_refptr<dbus::Bus> bus_;
scoped_refptr<base::SequencedTaskRunner> task_runner_;
- dbus::ObjectProxy* proxy_ = nullptr;
+ raw_ptr<dbus::ObjectProxy> proxy_ = nullptr;
base::WeakPtrFactory<DBusScreenSaverWatcher> weak_factory_{this};
};
diff --git a/chromium/ui/base/idle/idle_polling_service.cc b/chromium/ui/base/idle/idle_polling_service.cc
index a1da7216c1c..cf1deda46b8 100644
--- a/chromium/ui/base/idle/idle_polling_service.cc
+++ b/chromium/ui/base/idle/idle_polling_service.cc
@@ -6,6 +6,7 @@
#include "base/no_destructor.h"
#include "base/observer_list.h"
+#include "base/task/sequenced_task_runner.h"
#include "ui/base/idle/idle.h"
#include "ui/base/idle/idle_time_provider.h"
@@ -78,6 +79,11 @@ bool IdlePollingService::IsPollingForTest() {
return timer_.IsRunning();
}
+void IdlePollingService::SetTaskRunnerForTest(
+ scoped_refptr<base::SequencedTaskRunner> task_runner) {
+ timer_.SetTaskRunner(std::move(task_runner));
+}
+
IdlePollingService::IdlePollingService()
: timer_(FROM_HERE,
kPollInterval,
diff --git a/chromium/ui/base/idle/idle_polling_service.h b/chromium/ui/base/idle/idle_polling_service.h
index ee2b13f3f7a..69e8ea5c45a 100644
--- a/chromium/ui/base/idle/idle_polling_service.h
+++ b/chromium/ui/base/idle/idle_polling_service.h
@@ -8,12 +8,17 @@
#include <memory>
#include "base/component_export.h"
+#include "base/memory/scoped_refptr.h"
#include "base/no_destructor.h"
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
+namespace base {
+class SequencedTaskRunner;
+} // namespace base
+
namespace ui {
class IdleTimeProvider;
@@ -44,6 +49,8 @@ class COMPONENT_EXPORT(UI_BASE_IDLE) IdlePollingService {
void SetProviderForTest(std::unique_ptr<IdleTimeProvider> provider);
bool IsPollingForTest();
+ void SetTaskRunnerForTest(
+ scoped_refptr<base::SequencedTaskRunner> task_runner);
private:
friend class base::NoDestructor<IdlePollingService>;
diff --git a/chromium/ui/base/ime/BUILD.gn b/chromium/ui/base/ime/BUILD.gn
index 3a18c6bf896..64b8a0939c8 100644
--- a/chromium/ui/base/ime/BUILD.gn
+++ b/chromium/ui/base/ime/BUILD.gn
@@ -59,10 +59,10 @@ component("ime") {
sources = [
"constants.cc",
"constants.h",
+ "ime_key_event_dispatcher.h",
"input_method.h",
"input_method_base.cc",
"input_method_base.h",
- "input_method_delegate.h",
"input_method_minimal.cc",
"input_method_minimal.h",
"input_method_observer.h",
diff --git a/chromium/ui/base/ime/DEPS b/chromium/ui/base/ime/DEPS
index ff8745b46e1..b7643a9215c 100644
--- a/chromium/ui/base/ime/DEPS
+++ b/chromium/ui/base/ime/DEPS
@@ -2,4 +2,5 @@ include_rules = [
"+chromeos/system",
"+mojo/public",
"+services/metrics/public/cpp",
+ "+ui/linux",
]
diff --git a/chromium/ui/base/ime/OWNERS b/chromium/ui/base/ime/OWNERS
index c4ce4012767..1f76fb2d16f 100644
--- a/chromium/ui/base/ime/OWNERS
+++ b/chromium/ui/base/ime/OWNERS
@@ -1,5 +1,4 @@
# primary reviewers.
-shuchen@chromium.org
yhanada@chromium.org
keithlee@chromium.org
shend@chromium.org
diff --git a/chromium/ui/base/ime/PRESUBMIT.py b/chromium/ui/base/ime/PRESUBMIT.py
index 9bfd2f3a5bd..4b183d69bc6 100644
--- a/chromium/ui/base/ime/PRESUBMIT.py
+++ b/chromium/ui/base/ime/PRESUBMIT.py
@@ -32,7 +32,7 @@ def CheckCharacterComposerData(input_api, output_api):
# to ensure that it is not hand-editied and stays in sync with the sources.
(tempfd, tempname) = input_api.tempfile.mkstemp()
os.close(tempfd)
- generator = [input_api.python_executable,
+ generator = [input_api.python3_executable,
CHARACTER_COMPOSER_DATA_GENERATOR,
'--output',
tempname,
diff --git a/chromium/ui/base/ime/ash/ime_assistive_window_handler_interface.h b/chromium/ui/base/ime/ash/ime_assistive_window_handler_interface.h
index c36e9606917..a035d16ec6a 100644
--- a/chromium/ui/base/ime/ash/ime_assistive_window_handler_interface.h
+++ b/chromium/ui/base/ime/ash/ime_assistive_window_handler_interface.h
@@ -30,6 +30,10 @@ struct Bounds {
gfx::Rect caret;
// Position of the autocorrect span, empty if not present.
gfx::Rect autocorrect;
+
+ bool operator==(const Bounds& rhs) const {
+ return caret == rhs.caret && autocorrect == rhs.autocorrect;
+ }
};
// A interface to handle the assistive windows related method call.
diff --git a/chromium/ui/base/ime/ash/ime_engine_handler_interface.h b/chromium/ui/base/ime/ash/ime_engine_handler_interface.h
index 320b081b1cc..ee16207929f 100644
--- a/chromium/ui/base/ime/ash/ime_engine_handler_interface.h
+++ b/chromium/ui/base/ime/ash/ime_engine_handler_interface.h
@@ -100,6 +100,9 @@ class COMPONENT_EXPORT(UI_BASE_IME_ASH) IMEEngineHandlerInterface {
// Called when the composition bounds changed.
virtual void SetCompositionBounds(const std::vector<gfx::Rect>& bounds) = 0;
+ // Called when caret bounds changed.
+ virtual void SetCaretBounds(const gfx::Rect& caret_bounds) = 0;
+
// Gets the implementation of the keyboard controller.
virtual ui::VirtualKeyboardController* GetVirtualKeyboardController()
const = 0;
@@ -119,6 +122,9 @@ class COMPONENT_EXPORT(UI_BASE_IME_ASH) IMEEngineHandlerInterface {
virtual void SetMirroringEnabled(bool mirroring_enabled) = 0;
virtual void SetCastingEnabled(bool casting_enabled) = 0;
+ // Returns whether the IME is ready to accept key events for testing.
+ virtual bool IsReadyForTesting() = 0;
+
protected:
IMEEngineHandlerInterface() = default;
};
diff --git a/chromium/ui/base/ime/ash/input_method_ash.cc b/chromium/ui/base/ime/ash/input_method_ash.cc
index 9da2fc2e358..3d0d6c0044f 100644
--- a/chromium/ui/base/ime/ash/input_method_ash.cc
+++ b/chromium/ui/base/ime/ash/input_method_ash.cc
@@ -27,7 +27,7 @@
#include "ui/base/ime/ash/input_method_manager.h"
#include "ui/base/ime/ash/typing_session_manager.h"
#include "ui/base/ime/composition_text.h"
-#include "ui/base/ime/input_method_delegate.h"
+#include "ui/base/ime/ime_key_event_dispatcher.h"
#include "ui/base/ime/text_input_client.h"
#include "ui/events/event.h"
#include "ui/events/keycodes/dom/keycode_converter.h"
@@ -41,8 +41,8 @@ ui::IMEEngineHandlerInterface* GetEngine() {
}
// InputMethodAsh implementation -----------------------------------------
-InputMethodAsh::InputMethodAsh(internal::InputMethodDelegate* delegate)
- : InputMethodBase(delegate),
+InputMethodAsh::InputMethodAsh(ImeKeyEventDispatcher* ime_key_event_dispatcher)
+ : InputMethodBase(ime_key_event_dispatcher),
typing_session_manager_(base::DefaultClock::GetInstance()) {
ResetContext();
}
@@ -217,8 +217,11 @@ void InputMethodAsh::OnCaretBoundsChanged(const TextInputClient* client) {
DCHECK(client == GetTextInputClient());
DCHECK(!IsTextInputTypeNone());
- if (GetEngine())
- GetEngine()->SetCompositionBounds(GetCompositionBounds(client));
+ ui::IMEEngineHandlerInterface* engine = GetEngine();
+ if (engine) {
+ engine->SetCompositionBounds(GetCompositionBounds(client));
+ engine->SetCaretBounds(client->GetCaretBounds());
+ }
ash::IMECandidateWindowHandlerInterface* candidate_window =
ui::IMEBridge::Get()->GetCandidateWindowHandler();
@@ -370,8 +373,9 @@ bool InputMethodAsh::SetCompositionRange(
if (!client->GetEditableSelectionRange(&range))
return false;
- const gfx::Range composition_range(range.start() - before,
- range.end() + after);
+ const gfx::Range composition_range(
+ range.start() >= before ? range.start() - before : 0,
+ range.end() + after);
// Check that the composition range is valid.
gfx::Range text_range;
@@ -501,7 +505,7 @@ void InputMethodAsh::ConfirmCompositionText(bool reset_engine,
composition_changed_ = false;
}
if (client && client->HasCompositionText()) {
- const uint32_t characters_committed =
+ const size_t characters_committed =
client->ConfirmCompositionText(keep_selection);
typing_session_manager_.CommitCharacters(characters_committed);
}
@@ -644,9 +648,16 @@ void InputMethodAsh::MaybeProcessPendingInputMethodResult(ui::KeyEvent* event,
DCHECK(client);
if (pending_commit_) {
- if (pending_commit_->text.empty()) {
+ if (handled && NeedInsertChar()) {
+ for (const auto& ch : pending_commit_->text) {
+ KeyEvent ch_event(ET_KEY_PRESSED, VKEY_UNKNOWN, EF_NONE);
+ ch_event.set_character(ch);
+ client->InsertChar(ch_event);
+ }
+ } else if (pending_commit_->text.empty()) {
client->InsertText(
u"", TextInputClient::InsertTextCursorBehavior::kMoveCursorAfterText);
+ composing_text_ = false;
} else {
// Split the commit into two separate commits, one for the substring
// before the cursor and one for the substring after.
@@ -664,8 +675,8 @@ void InputMethodAsh::MaybeProcessPendingInputMethodResult(ui::KeyEvent* event,
after_cursor,
TextInputClient::InsertTextCursorBehavior::kMoveCursorBeforeText);
}
+ composing_text_ = false;
}
- composing_text_ = false;
typing_session_manager_.CommitCharacters(pending_commit_->text.length());
}
@@ -924,9 +935,12 @@ CompositionText InputMethodAsh::ExtractCompositionText(
}
DCHECK(text.selection.start() <= text.selection.end());
+ DCHECK(text.selection.end() <= char_length);
if (text.selection.start() < text.selection.end()) {
- const uint32_t start = text.selection.start();
- const uint32_t end = text.selection.end();
+ const size_t start =
+ std::min(text.selection.start(), static_cast<size_t>(char_length));
+ const size_t end =
+ std::min(text.selection.end(), static_cast<size_t>(char_length));
ImeTextSpan ime_text_span(
ui::ImeTextSpan::Type::kComposition, char16_offsets[start],
char16_offsets[end], ui::ImeTextSpan::Thickness::kThick,
@@ -994,4 +1008,28 @@ InputMethod* InputMethodAsh::GetInputMethod() {
return this;
}
+std::vector<gfx::Rect> InputMethodAsh::GetCompositionBounds(
+ const TextInputClient* client) {
+ std::vector<gfx::Rect> bounds;
+ if (client->HasCompositionText()) {
+ uint32_t i = 0;
+ gfx::Rect rect;
+ while (client->GetCompositionCharacterBounds(i++, &rect))
+ bounds.push_back(rect);
+ } else {
+ // For case of no composition at present, use caret bounds which is required
+ // by the IME extension for certain features (e.g. physical keyboard
+ // auto-correct).
+ bounds.push_back(client->GetCaretBounds());
+ }
+ return bounds;
+}
+
+bool InputMethodAsh::SendFakeProcessKeyEvent(bool pressed) const {
+ KeyEvent evt(pressed ? ET_KEY_PRESSED : ET_KEY_RELEASED,
+ pressed ? VKEY_PROCESSKEY : VKEY_UNKNOWN, EF_IME_FABRICATED_KEY);
+ std::ignore = DispatchKeyEventPostIME(&evt);
+ return evt.stopped_propagation();
+}
+
} // namespace ui
diff --git a/chromium/ui/base/ime/ash/input_method_ash.h b/chromium/ui/base/ime/ash/input_method_ash.h
index c6c0f3987b1..9f20178c7a5 100644
--- a/chromium/ui/base/ime/ash/input_method_ash.h
+++ b/chromium/ui/base/ime/ash/input_method_ash.h
@@ -27,7 +27,7 @@ class COMPONENT_EXPORT(UI_BASE_IME_ASH) InputMethodAsh
: public InputMethodBase,
public IMEInputContextHandlerInterface {
public:
- explicit InputMethodAsh(internal::InputMethodDelegate* delegate);
+ explicit InputMethodAsh(ImeKeyEventDispatcher* ime_key_event_dispatcher);
InputMethodAsh(const InputMethodAsh&) = delete;
InputMethodAsh& operator=(const InputMethodAsh&) = delete;
@@ -178,6 +178,13 @@ class COMPONENT_EXPORT(UI_BASE_IME_ASH) InputMethodAsh
// Gets the reason how the focused text input client was focused.
TextInputClient::FocusReason GetClientFocusReason() const;
+ // Gets the bounds of the composition text or cursor in |client|.
+ std::vector<gfx::Rect> GetCompositionBounds(const TextInputClient* client);
+
+ // Sends a fake key event for IME composing without physical key events.
+ // Returns true if the faked key event is stopped propagation.
+ bool SendFakeProcessKeyEvent(bool pressed) const;
+
// Pending composition text generated by the current pending key event.
// It'll be sent to the focused text input client as soon as we receive the
// processing result of the pending key event.
diff --git a/chromium/ui/base/ime/ash/input_method_ash_unittest.cc b/chromium/ui/base/ime/ash/input_method_ash_unittest.cc
index e97d82cdf4f..5eb42d0696c 100644
--- a/chromium/ui/base/ime/ash/input_method_ash_unittest.cc
+++ b/chromium/ui/base/ime/ash/input_method_ash_unittest.cc
@@ -25,7 +25,7 @@
#include "ui/base/ime/composition_text.h"
#include "ui/base/ime/dummy_text_input_client.h"
#include "ui/base/ime/fake_text_input_client.h"
-#include "ui/base/ime/input_method_delegate.h"
+#include "ui/base/ime/ime_key_event_dispatcher.h"
#include "ui/base/ime/text_input_client.h"
#include "ui/events/event.h"
#include "ui/events/event_utils.h"
@@ -56,8 +56,10 @@ uint32_t GetOffsetInUTF16(const std::u16string& utf16_string,
class TestableInputMethodAsh : public InputMethodAsh {
public:
- explicit TestableInputMethodAsh(internal::InputMethodDelegate* delegate)
- : InputMethodAsh(delegate), process_key_event_post_ime_call_count_(0) {}
+ explicit TestableInputMethodAsh(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher)
+ : InputMethodAsh(ime_key_event_dispatcher),
+ process_key_event_post_ime_call_count_(0) {}
struct ProcessKeyEventPostIMEArgs {
ProcessKeyEventPostIMEArgs()
@@ -207,7 +209,7 @@ class NiceMockIMEEngine : public ash::MockIMEEngineHandler {
void(const std::u16string&, uint32_t, uint32_t, uint32_t));
};
-class InputMethodAshTest : public internal::InputMethodDelegate,
+class InputMethodAshTest : public ImeKeyEventDispatcher,
public testing::Test,
public DummyTextInputClient {
public:
@@ -252,7 +254,7 @@ class InputMethodAshTest : public internal::InputMethodDelegate,
ResetFlags();
}
- // Overridden from ui::internal::InputMethodDelegate:
+ // Overridden from ui::ImeKeyEventDispatcher:
ui::EventDispatchDetails DispatchKeyEventPostIME(
ui::KeyEvent* event) override {
dispatched_key_event_ = *event;
@@ -265,7 +267,7 @@ class InputMethodAshTest : public internal::InputMethodDelegate,
void SetCompositionText(const CompositionText& composition) override {
composition_text_ = composition;
}
- uint32_t ConfirmCompositionText(bool keep_selection) override {
+ size_t ConfirmCompositionText(bool keep_selection) override {
// TODO(b/134473433) Modify this function so that when keep_selection is
// true, the selection is not changed when text committed
if (keep_selection) {
@@ -591,6 +593,18 @@ TEST_F(InputMethodAshTest, ExtractCompositionTextTest_NoAttribute) {
composition_text.ime_text_spans[0].thickness);
}
+TEST_F(InputMethodAshTest, SetCompositionTextFails) {
+ InputMethodAsh ime(this);
+ FakeTextInputClient fake_text_input_client(TEXT_INPUT_TYPE_TEXT);
+ ime.SetFocusedTextInputClient(&fake_text_input_client);
+
+ EXPECT_EQ(ime.GetTextInputType(), TEXT_INPUT_TYPE_TEXT);
+ // Intentionally have a range start that does not exist.
+ EXPECT_FALSE(ime.SetCompositionRange(10000, 5, {}));
+
+ ime.SetFocusedTextInputClient(nullptr);
+}
+
TEST_F(InputMethodAshTest, ExtractCompositionTextTest_SingleUnderline) {
const uint32_t kCursorPos = 2UL;
@@ -1009,7 +1023,7 @@ TEST_F(InputMethodAshKeyEventTest, KeyEventDelayResponseTest) {
u"A",
TextInputClient::InsertTextCursorBehavior::kMoveCursorAfterText);
- EXPECT_EQ(u"", inserted_text_);
+ EXPECT_EQ(0, inserted_char_);
// Do callback.
std::move(mock_ime_engine_handler_->last_passed_callback()).Run(true);
@@ -1022,7 +1036,7 @@ TEST_F(InputMethodAshKeyEventTest, KeyEventDelayResponseTest) {
EXPECT_EQ(kFlags, stored_event.flags());
EXPECT_TRUE(ime_->process_key_event_post_ime_args().handled);
- EXPECT_EQ(u"A", inserted_text_);
+ EXPECT_EQ(L'A', inserted_char_);
}
TEST_F(InputMethodAshKeyEventTest, MultiKeyEventDelayResponseTest) {
@@ -1189,7 +1203,7 @@ TEST_F(InputMethodAshKeyEventTest, SetAutocorrectRangeRunsAfterCommitText) {
std::move(mock_ime_engine_handler_->last_passed_callback())
.Run(/*handled=*/true);
- EXPECT_EQ(u"a", inserted_text_);
+ EXPECT_EQ(L'a', inserted_char_);
EXPECT_EQ(gfx::Range(0, 1), GetAutocorrectRange());
}
diff --git a/chromium/ui/base/ime/ash/input_method_manager.h b/chromium/ui/base/ime/ash/input_method_manager.h
index 66623e0267b..2f8c64bccaa 100644
--- a/chromium/ui/base/ime/ash/input_method_manager.h
+++ b/chromium/ui/base/ime/ash/input_method_manager.h
@@ -242,6 +242,8 @@ class COMPONENT_EXPORT(UI_BASE_IME_ASH) InputMethodManager {
// Sets the currently allowed input methods due to policy. Invalid
// input method ids are ignored. Passing an empty vector means that all
// input methods are allowed, which is the default.
+ // Automatically enables allowed methods in Kiosk sessions if the vector is
+ // non-empty.
virtual bool SetAllowedInputMethods(
const std::vector<std::string>& allowed_input_method_ids) = 0;
diff --git a/chromium/ui/base/ime/ash/mock_component_extension_ime_manager_delegate.h b/chromium/ui/base/ime/ash/mock_component_extension_ime_manager_delegate.h
index df34a84109c..9f54a83625e 100644
--- a/chromium/ui/base/ime/ash/mock_component_extension_ime_manager_delegate.h
+++ b/chromium/ui/base/ime/ash/mock_component_extension_ime_manager_delegate.h
@@ -8,6 +8,7 @@
#include <set>
#include "base/component_export.h"
+#include "ui/base/ime/ash/component_extension_ime_manager.h"
#include "ui/base/ime/ash/component_extension_ime_manager_delegate.h"
namespace ash {
diff --git a/chromium/ui/base/ime/ash/mock_ime_engine_handler.cc b/chromium/ui/base/ime/ash/mock_ime_engine_handler.cc
index 5325a4bd3f2..54862c88947 100644
--- a/chromium/ui/base/ime/ash/mock_ime_engine_handler.cc
+++ b/chromium/ui/base/ime/ash/mock_ime_engine_handler.cc
@@ -57,6 +57,9 @@ void MockIMEEngineHandler::ProcessKeyEvent(const ui::KeyEvent& key_event,
void MockIMEEngineHandler::SetCompositionBounds(
const std::vector<gfx::Rect>& bounds) {}
+void MockIMEEngineHandler::SetCaretBounds(
+ const gfx::Rect& caret_bounds) {}
+
ui::VirtualKeyboardController*
MockIMEEngineHandler::GetVirtualKeyboardController() const {
return nullptr;
@@ -82,6 +85,10 @@ void MockIMEEngineHandler::SetMirroringEnabled(bool mirroring_enabled) {}
void MockIMEEngineHandler::SetCastingEnabled(bool casting_enabled) {}
+bool MockIMEEngineHandler::IsReadyForTesting() {
+ return true;
+}
+
const std::string& MockIMEEngineHandler::GetActiveComponentId() const {
return active_component_id_;
}
diff --git a/chromium/ui/base/ime/ash/mock_ime_engine_handler.h b/chromium/ui/base/ime/ash/mock_ime_engine_handler.h
index 2d6ccc7c24c..69b1adf334d 100644
--- a/chromium/ui/base/ime/ash/mock_ime_engine_handler.h
+++ b/chromium/ui/base/ime/ash/mock_ime_engine_handler.h
@@ -31,6 +31,7 @@ class COMPONENT_EXPORT(UI_BASE_IME_ASH) MockIMEEngineHandler
void ProcessKeyEvent(const ui::KeyEvent& key_event,
KeyEventDoneCallback callback) override;
void SetCompositionBounds(const std::vector<gfx::Rect>& bounds) override;
+ void SetCaretBounds(const gfx::Rect& caret_bounds) override;
ui::VirtualKeyboardController* GetVirtualKeyboardController() const override;
void PropertyActivate(const std::string& property_name) override;
void CandidateClicked(uint32_t index) override;
@@ -40,6 +41,7 @@ class COMPONENT_EXPORT(UI_BASE_IME_ASH) MockIMEEngineHandler
uint32_t offset_pos) override;
void SetMirroringEnabled(bool mirroring_enabled) override;
void SetCastingEnabled(bool casting_enabled) override;
+ bool IsReadyForTesting() override;
const std::string& GetActiveComponentId() const;
diff --git a/chromium/ui/base/ime/ash/mock_input_method_manager.cc b/chromium/ui/base/ime/ash/mock_input_method_manager.cc
index c0050a9e5cb..09a6115530a 100644
--- a/chromium/ui/base/ime/ash/mock_input_method_manager.cc
+++ b/chromium/ui/base/ime/ash/mock_input_method_manager.cc
@@ -236,7 +236,7 @@ void MockInputMethodManager::NotifyObserversImeExtraInputStateChange() {}
ui::VirtualKeyboardController*
MockInputMethodManager::GetVirtualKeyboardController() {
- return this;
+ return virtual_keyboard_enabled_ ? this : nullptr;
}
void MockInputMethodManager::NotifyInputMethodExtensionAdded(
@@ -249,13 +249,20 @@ bool MockInputMethodManager::DisplayVirtualKeyboard() {
return false;
}
-void MockInputMethodManager::DismissVirtualKeyboard() {}
+void MockInputMethodManager::DismissVirtualKeyboard() {
+ for (auto& observer : observer_list_)
+ observer.OnKeyboardHidden();
+}
void MockInputMethodManager::AddObserver(
- ui::VirtualKeyboardControllerObserver* observer) {}
+ ui::VirtualKeyboardControllerObserver* observer) {
+ observer_list_.AddObserver(observer);
+}
void MockInputMethodManager::RemoveObserver(
- ui::VirtualKeyboardControllerObserver* observer) {}
+ ui::VirtualKeyboardControllerObserver* observer) {
+ observer_list_.RemoveObserver(observer);
+}
bool MockInputMethodManager::IsKeyboardVisible() {
return false;
diff --git a/chromium/ui/base/ime/ash/mock_input_method_manager.h b/chromium/ui/base/ime/ash/mock_input_method_manager.h
index fd46651c3d3..c58ffde2119 100644
--- a/chromium/ui/base/ime/ash/mock_input_method_manager.h
+++ b/chromium/ui/base/ime/ash/mock_input_method_manager.h
@@ -6,10 +6,12 @@
#define UI_BASE_IME_ASH_MOCK_INPUT_METHOD_MANAGER_H_
#include "base/component_export.h"
+#include "base/observer_list.h"
#include "ui/base/ime/ash/input_method_manager.h"
// TODO(https://crbug.com/1164001): remove and use forward declaration.
#include "ui/base/ime/ash/input_method_util.h"
#include "ui/base/ime/virtual_keyboard_controller.h"
+#include "ui/base/ime/virtual_keyboard_controller_observer.h"
namespace ash {
namespace input_method {
@@ -95,6 +97,10 @@ class COMPONENT_EXPORT(UI_BASE_IME_ASH) MockInputMethodManager
~MockInputMethodManager() override;
+ void SetVirtualKeyboardEnabled(bool enabled) {
+ virtual_keyboard_enabled_ = enabled;
+ }
+
// InputMethodManager:
void AddObserver(InputMethodManager::Observer* observer) override;
void AddCandidateWindowObserver(
@@ -146,6 +152,9 @@ class COMPONENT_EXPORT(UI_BASE_IME_ASH) MockInputMethodManager
private:
scoped_refptr<State> state_;
uint32_t features_enabled_state_;
+ bool virtual_keyboard_enabled_ = true;
+ base::ObserverList<ui::VirtualKeyboardControllerObserver>::Unchecked
+ observer_list_;
};
} // namespace input_method
diff --git a/chromium/ui/base/ime/character_composer_data.h b/chromium/ui/base/ime/character_composer_data.h
index 0485c6d9adf..249eecb2ec9 100644
--- a/chromium/ui/base/ime/character_composer_data.h
+++ b/chromium/ui/base/ime/character_composer_data.h
@@ -6,8 +6,8 @@
// GENERATED BY generate_character_composer_data.py
// FROM character_composer_sequences.txt
-#ifndef CHARACTER_COMPOSER_DATA_H_
-#define CHARACTER_COMPOSER_DATA_H_
+#ifndef UI_BASE_IME_CHARACTER_COMPOSER_DATA_H_
+#define UI_BASE_IME_CHARACTER_COMPOSER_DATA_H_
static const uint16_t kCompositionsTree[] = {
@@ -23522,4 +23522,4 @@ static const ui::TreeComposeChecker::CompositionData kCompositions = {
kCompositionsTree
};
-#endif // CHARACTER_COMPOSER_DATA_H_
+#endif // UI_BASE_IME_CHARACTER_COMPOSER_DATA_H_
diff --git a/chromium/ui/base/ime/dummy_input_method.cc b/chromium/ui/base/ime/dummy_input_method.cc
index d924bfd55b8..037be0507b1 100644
--- a/chromium/ui/base/ime/dummy_input_method.cc
+++ b/chromium/ui/base/ime/dummy_input_method.cc
@@ -14,8 +14,8 @@ DummyInputMethod::DummyInputMethod() {
DummyInputMethod::~DummyInputMethod() {
}
-void DummyInputMethod::SetDelegate(internal::InputMethodDelegate* delegate) {
-}
+void DummyInputMethod::SetImeKeyEventDispatcher(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher) {}
void DummyInputMethod::OnFocus() {
}
diff --git a/chromium/ui/base/ime/dummy_input_method.h b/chromium/ui/base/ime/dummy_input_method.h
index c307a3f0b53..5b7374c63f2 100644
--- a/chromium/ui/base/ime/dummy_input_method.h
+++ b/chromium/ui/base/ime/dummy_input_method.h
@@ -22,7 +22,8 @@ class DummyInputMethod : public InputMethod {
~DummyInputMethod() override;
// InputMethod overrides:
- void SetDelegate(internal::InputMethodDelegate* delegate) override;
+ void SetImeKeyEventDispatcher(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher) override;
void OnFocus() override;
void OnTouch(ui::EventPointerType pointerType) override;
void OnBlur() override;
diff --git a/chromium/ui/base/ime/dummy_text_input_client.cc b/chromium/ui/base/ime/dummy_text_input_client.cc
index 063ab67bd46..0b0c5670b63 100644
--- a/chromium/ui/base/ime/dummy_text_input_client.cc
+++ b/chromium/ui/base/ime/dummy_text_input_client.cc
@@ -33,8 +33,8 @@ void DummyTextInputClient::SetCompositionText(
composition_history_.push_back(composition);
}
-uint32_t DummyTextInputClient::ConfirmCompositionText(bool keep_selection) {
- return UINT32_MAX;
+size_t DummyTextInputClient::ConfirmCompositionText(bool keep_selection) {
+ return std::numeric_limits<size_t>::max();
}
void DummyTextInputClient::ClearCompositionText() {
@@ -82,7 +82,7 @@ gfx::Rect DummyTextInputClient::GetSelectionBoundingBox() const {
}
bool DummyTextInputClient::GetCompositionCharacterBounds(
- uint32_t index,
+ size_t index,
gfx::Rect* rect) const {
return false;
}
@@ -117,9 +117,11 @@ bool DummyTextInputClient::SetEditableSelectionRange(const gfx::Range& range) {
return true;
}
+#if BUILDFLAG(IS_MAC)
bool DummyTextInputClient::DeleteRange(const gfx::Range& range) {
return false;
}
+#endif
bool DummyTextInputClient::GetTextFromRange(const gfx::Range& range,
std::u16string* text) const {
diff --git a/chromium/ui/base/ime/dummy_text_input_client.h b/chromium/ui/base/ime/dummy_text_input_client.h
index 0b30b29236b..26ee8c85317 100644
--- a/chromium/ui/base/ime/dummy_text_input_client.h
+++ b/chromium/ui/base/ime/dummy_text_input_client.h
@@ -30,7 +30,7 @@ class DummyTextInputClient : public TextInputClient {
// Overriden from TextInputClient.
void SetCompositionText(const CompositionText& composition) override;
- uint32_t ConfirmCompositionText(bool keep_selection) override;
+ size_t ConfirmCompositionText(bool keep_selection) override;
void ClearCompositionText() override;
void InsertText(const std::u16string& text,
InsertTextCursorBehavior cursor_behavior) override;
@@ -42,7 +42,7 @@ class DummyTextInputClient : public TextInputClient {
bool CanComposeInline() const override;
gfx::Rect GetCaretBounds() const override;
gfx::Rect GetSelectionBoundingBox() const override;
- bool GetCompositionCharacterBounds(uint32_t index,
+ bool GetCompositionCharacterBounds(size_t index,
gfx::Rect* rect) const override;
bool HasCompositionText() const override;
ui::TextInputClient::FocusReason GetFocusReason() const override;
@@ -50,7 +50,9 @@ class DummyTextInputClient : public TextInputClient {
bool GetCompositionTextRange(gfx::Range* range) const override;
bool GetEditableSelectionRange(gfx::Range* range) const override;
bool SetEditableSelectionRange(const gfx::Range& range) override;
+#if BUILDFLAG(IS_MAC)
bool DeleteRange(const gfx::Range& range) override;
+#endif
bool GetTextFromRange(const gfx::Range& range,
std::u16string* text) const override;
void OnInputMethodChanged() override;
diff --git a/chromium/ui/base/ime/fake_text_input_client.cc b/chromium/ui/base/ime/fake_text_input_client.cc
index 7b3c2253f35..a5d110cf828 100644
--- a/chromium/ui/base/ime/fake_text_input_client.cc
+++ b/chromium/ui/base/ime/fake_text_input_client.cc
@@ -40,8 +40,8 @@ void FakeTextInputClient::SetCompositionText(
selection_ = gfx::Range(new_cursor, new_cursor);
}
-uint32_t FakeTextInputClient::ConfirmCompositionText(bool keep_selection) {
- return UINT32_MAX;
+size_t FakeTextInputClient::ConfirmCompositionText(bool keep_selection) {
+ return std::numeric_limits<size_t>::max();
}
void FakeTextInputClient::ClearCompositionText() {}
@@ -93,7 +93,7 @@ gfx::Rect FakeTextInputClient::GetSelectionBoundingBox() const {
return {};
}
-bool FakeTextInputClient::GetCompositionCharacterBounds(uint32_t index,
+bool FakeTextInputClient::GetCompositionCharacterBounds(size_t index,
gfx::Rect* rect) const {
return false;
}
@@ -124,9 +124,11 @@ bool FakeTextInputClient::SetEditableSelectionRange(const gfx::Range& range) {
return false;
}
+#if BUILDFLAG(IS_MAC)
bool FakeTextInputClient::DeleteRange(const gfx::Range& range) {
return false;
}
+#endif
bool FakeTextInputClient::GetTextFromRange(const gfx::Range& range,
std::u16string* text) const {
diff --git a/chromium/ui/base/ime/fake_text_input_client.h b/chromium/ui/base/ime/fake_text_input_client.h
index 5a7feaeeb18..3792ef09ed0 100644
--- a/chromium/ui/base/ime/fake_text_input_client.h
+++ b/chromium/ui/base/ime/fake_text_input_client.h
@@ -36,7 +36,7 @@ class FakeTextInputClient : public TextInputClient {
// TextInputClient:
void SetCompositionText(const CompositionText& composition) override;
- uint32_t ConfirmCompositionText(bool keep_selection) override;
+ size_t ConfirmCompositionText(bool keep_selection) override;
void ClearCompositionText() override;
void InsertText(
const std::u16string& text,
@@ -49,7 +49,7 @@ class FakeTextInputClient : public TextInputClient {
bool CanComposeInline() const override;
gfx::Rect GetCaretBounds() const override;
gfx::Rect GetSelectionBoundingBox() const override;
- bool GetCompositionCharacterBounds(uint32_t index,
+ bool GetCompositionCharacterBounds(size_t index,
gfx::Rect* rect) const override;
bool HasCompositionText() const override;
ui::TextInputClient::FocusReason GetFocusReason() const override;
@@ -57,7 +57,9 @@ class FakeTextInputClient : public TextInputClient {
bool GetCompositionTextRange(gfx::Range* range) const override;
bool GetEditableSelectionRange(gfx::Range* range) const override;
bool SetEditableSelectionRange(const gfx::Range& range) override;
+#if BUILDFLAG(IS_MAC)
bool DeleteRange(const gfx::Range& range) override;
+#endif
bool GetTextFromRange(const gfx::Range& range,
std::u16string* text) const override;
void OnInputMethodChanged() override;
diff --git a/chromium/ui/base/ime/fuchsia/BUILD.gn b/chromium/ui/base/ime/fuchsia/BUILD.gn
index 1b98ae14b06..fc3cb01c01e 100644
--- a/chromium/ui/base/ime/fuchsia/BUILD.gn
+++ b/chromium/ui/base/ime/fuchsia/BUILD.gn
@@ -19,6 +19,8 @@ component("fuchsia") {
defines = [ "IS_UI_BASE_IME_FUCHSIA_IMPL" ]
public_deps = [
+ "//base",
+ "//third_party/abseil-cpp:absl",
"//third_party/fuchsia-sdk/sdk/fidl/fuchsia.input.virtualkeyboard",
"//third_party/fuchsia-sdk/sdk/fidl/fuchsia.ui.input",
"//third_party/fuchsia-sdk/sdk/fidl/fuchsia.ui.input3",
diff --git a/chromium/ui/base/ime/fuchsia/input_method_fuchsia.cc b/chromium/ui/base/ime/fuchsia/input_method_fuchsia.cc
index 46e7288e901..e4b2bf2540c 100644
--- a/chromium/ui/base/ime/fuchsia/input_method_fuchsia.cc
+++ b/chromium/ui/base/ime/fuchsia/input_method_fuchsia.cc
@@ -18,10 +18,11 @@
namespace ui {
-InputMethodFuchsia::InputMethodFuchsia(bool enable_virtual_keyboard,
- internal::InputMethodDelegate* delegate,
- fuchsia::ui::views::ViewRef view_ref)
- : InputMethodBase(delegate) {
+InputMethodFuchsia::InputMethodFuchsia(
+ bool enable_virtual_keyboard,
+ ImeKeyEventDispatcher* ime_key_event_dispatcher,
+ fuchsia::ui::views::ViewRef view_ref)
+ : InputMethodBase(ime_key_event_dispatcher) {
if (enable_virtual_keyboard)
virtual_keyboard_controller_.emplace(std::move(view_ref), this);
}
diff --git a/chromium/ui/base/ime/fuchsia/input_method_fuchsia.h b/chromium/ui/base/ime/fuchsia/input_method_fuchsia.h
index 0c1e0477564..c5fe8022a0e 100644
--- a/chromium/ui/base/ime/fuchsia/input_method_fuchsia.h
+++ b/chromium/ui/base/ime/fuchsia/input_method_fuchsia.h
@@ -12,8 +12,8 @@
#include "base/component_export.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/base/ime/fuchsia/virtual_keyboard_controller_fuchsia.h"
+#include "ui/base/ime/ime_key_event_dispatcher.h"
#include "ui/base/ime/input_method_base.h"
-#include "ui/base/ime/input_method_delegate.h"
#include "ui/events/fuchsia/input_event_dispatcher.h"
#include "ui/events/fuchsia/input_event_sink.h"
#include "ui/gfx/native_widget_types.h"
@@ -25,7 +25,7 @@ class COMPONENT_EXPORT(UI_BASE_IME_FUCHSIA) InputMethodFuchsia
: public InputMethodBase {
public:
InputMethodFuchsia(bool enable_virtual_keyboard,
- internal::InputMethodDelegate* delegate,
+ ImeKeyEventDispatcher* ime_key_event_dispatcher,
fuchsia::ui::views::ViewRef view_ref);
~InputMethodFuchsia() override;
diff --git a/chromium/ui/base/ime/fuchsia/keyboard_client.cc b/chromium/ui/base/ime/fuchsia/keyboard_client.cc
index c70f72ca90d..14491e67a69 100644
--- a/chromium/ui/base/ime/fuchsia/keyboard_client.cc
+++ b/chromium/ui/base/ime/fuchsia/keyboard_client.cc
@@ -3,10 +3,15 @@
// found in the LICENSE file.
#include "ui/base/ime/fuchsia/keyboard_client.h"
-#include <memory>
+
+#include <limits>
+#include <tuple>
+#include <utility>
#include "base/logging.h"
#include "base/notreached.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+#include "ui/events/event.h"
#include "ui/events/fuchsia/input_event_sink.h"
#include "ui/events/keycodes/dom/dom_code.h"
#include "ui/events/keycodes/dom/keycode_converter.h"
@@ -54,32 +59,6 @@ absl::optional<EventType> ConvertKeyEventType(
}
}
-// Creates an event for an event which has no |key|.
-absl::optional<ui::KeyEvent> ConvertToCharacterEvent(
- const fuchsia::ui::input3::KeyEvent& key_event) {
- DCHECK(!key_event.has_key());
-
- absl::optional<EventType> event_type = ConvertKeyEventType(key_event.type());
- if (!event_type) {
- return absl::nullopt;
- }
- if (event_type != ET_KEY_PRESSED) {
- // Keypress phase cannot be tracked on keypresses without hardware keys,
- // so only handle the "pressed" edge transition.
- return absl::nullopt;
- }
-
- const uint32_t codepoint = key_event.key_meaning().codepoint();
- if (codepoint > std::numeric_limits<char16_t>::max()) {
- // TODO(crbug.com/1220260): Handle codepoints outside the BMP.
- return absl::nullopt;
- }
-
- return ui::KeyEvent(*event_type, VKEY_UNKNOWN, DomCode::NONE,
- EF_IS_SYNTHESIZED, DomKey::FromCharacter(codepoint),
- base::TimeTicks::FromZxTime(key_event.timestamp()), true);
-}
-
} // namespace
KeyboardClient::KeyboardClient(fuchsia::ui::input3::Keyboard* keyboard_service,
@@ -128,54 +107,68 @@ bool KeyboardClient::IsValid(const fuchsia::ui::input3::KeyEvent& key_event) {
bool KeyboardClient::ProcessKeyEvent(
const fuchsia::ui::input3::KeyEvent& key_event) {
- const bool generate_character_event = !key_event.has_key();
- absl::optional<ui::KeyEvent> converted_event;
- if (generate_character_event) {
- converted_event = ConvertToCharacterEvent(key_event);
- } else {
- UpdateCachedModifiers(key_event);
- converted_event = ConvertKeystrokeEvent(key_event);
- }
- if (!converted_event) {
- return false;
- }
-
- event_sink_->DispatchEvent(&converted_event.value());
- return converted_event->handled();
-}
-
-absl::optional<ui::KeyEvent> KeyboardClient::ConvertKeystrokeEvent(
- const fuchsia::ui::input3::KeyEvent& key_event) {
- DCHECK(key_event.has_key());
+ UpdateCachedModifiers(key_event);
absl::optional<EventType> event_type = ConvertKeyEventType(key_event.type());
- if (!event_type) {
- return absl::nullopt;
- }
+ if (!event_type)
+ return false;
// Convert |key_event| to a ui::KeyEvent.
int event_flags = EventFlagsForCachedModifiers();
if (key_event.has_modifiers())
event_flags |= ModifiersToEventFlags(key_event.modifiers());
- // TODO(https://crbug.com/1187257): Use input3.KeyMeaning instead of US layout
- // as the default.
- DomCode dom_code = KeycodeConverter::UsbKeycodeToDomCode(key_event.key());
- DomKey dom_key;
- KeyboardCode key_code;
- if (!DomCodeToUsLayoutDomKey(dom_code, event_flags, &dom_key, &key_code)) {
- LOG(ERROR) << "DomCodeToUsLayoutDomKey() failed for key: "
- << key_event.key();
+ // Derive the DOM Key and Code directly from the event's fields.
+ // |key_event| has already been validated, so is guaranteed to have one
+ // or both of the |key| or |key_meaning| fields set.
+ DomCode dom_code = DomCode::NONE;
+ DomKey dom_key = DomKey::UNIDENTIFIED;
+ KeyboardCode key_code = VKEY_UNKNOWN;
+
+ if (key_event.has_key()) {
+ dom_code = KeycodeConverter::UsbKeycodeToDomCode(key_event.key());
+
+ // Derive the legacy key_code. At present this only takes into account the
+ // DOM Code, and event flags, so requires that key() be set.
+ // TODO(crbug.com/1187257): Take into account the KeyMeaning, similarly to
+ // the X11 event conversion implementation.
+ // TODO(fxbug.dev/106600): Remove default-derivation of DOM Key, once the
+ // platform defines the missing values.
+ std::ignore =
+ DomCodeToUsLayoutDomKey(dom_code, event_flags, &dom_key, &key_code);
+ }
+
+ if (key_event.has_key_meaning()) {
+ // If the KeyMeaning is specified then use it to set the DOM Key.
+
+ // Ignore events with codepoints outside the Basic Multilingual Plane,
+ // since the Chromium keyboard pipeline cannot currently handle them.
+ if (key_event.key_meaning().is_codepoint() &&
+ (key_event.key_meaning().codepoint() >
+ std::numeric_limits<char16_t>::max())) {
+ return false;
+ }
+
+ DomKey dom_key_from_meaning =
+ DomKeyFromFuchsiaKeyMeaning(key_event.key_meaning());
+ if (dom_key_from_meaning != DomKey::UNIDENTIFIED)
+ dom_key = dom_key_from_meaning;
}
- return ui::KeyEvent(*event_type, key_code, dom_code, event_flags, dom_key,
- base::TimeTicks::FromZxTime(key_event.timestamp()));
+ ui::KeyEvent converted_event(
+ *event_type, key_code, dom_code, event_flags, dom_key,
+ base::TimeTicks::FromZxTime(key_event.timestamp()));
+ event_sink_->DispatchEvent(&converted_event);
+ return converted_event.handled();
}
// TODO(https://crbug.com/850697): Add additional modifiers as they become
// supported.
void KeyboardClient::UpdateCachedModifiers(
const fuchsia::ui::input3::KeyEvent& key_event) {
+ if (!key_event.has_key())
+ return;
+
// A SYNC event indicates that the key was pressed while the view gained input
// focus. A CANCEL event indicates the key was held when the view lost input
// focus. In both cases, the state of locally tracked modifiers should be
diff --git a/chromium/ui/base/ime/fuchsia/keyboard_client.h b/chromium/ui/base/ime/fuchsia/keyboard_client.h
index e3cad59f6b0..7feeae1ba8b 100644
--- a/chromium/ui/base/ime/fuchsia/keyboard_client.h
+++ b/chromium/ui/base/ime/fuchsia/keyboard_client.h
@@ -9,8 +9,6 @@
#include <lib/fidl/cpp/binding.h>
#include "base/component_export.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
-#include "ui/events/event.h"
namespace ui {
@@ -37,10 +35,6 @@ class COMPONENT_EXPORT(UI_BASE_IME_FUCHSIA) KeyboardClient
private:
bool IsValid(const fuchsia::ui::input3::KeyEvent& key_event);
- // Returns an unset value if the |key_event| type is unsupported.
- absl::optional<ui::KeyEvent> ConvertKeystrokeEvent(
- const fuchsia::ui::input3::KeyEvent& key_event);
-
// Handles converting and propagating |key_event|. Returns false if critical
// information about |key_event| is missing, or if the key's event type is not
// supported.
diff --git a/chromium/ui/base/ime/generate_character_composer_data.py b/chromium/ui/base/ime/generate_character_composer_data.py
index 44a58fad9b2..8244d29a4a1 100755
--- a/chromium/ui/base/ime/generate_character_composer_data.py
+++ b/chromium/ui/base/ime/generate_character_composer_data.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
@@ -68,6 +68,8 @@ import unicodedata
# Global error counter.
g_fail = 0
+unichr_compat = chr if sys.version_info[0] == 3 else unichr
+
class Key(str):
"""Represents an element of a composition sequence.
@@ -87,8 +89,8 @@ class Key(str):
- Key('Compose', 0)
"""
global g_fail
- if character > 0xFFFF:
- print '{}: unsupported non-BMP character {}'.format(location, character)
+ if character is not None and character > 0xFFFF:
+ print('{}: unsupported non-BMP character {}'.format(location, character))
g_fail += 1
s = 'ERROR'
elif key is None:
@@ -98,7 +100,8 @@ class Key(str):
elif key.lower() == 'compose':
s = 'D0000'
else:
- print '{}: unexpected combination {}<{}>'.format(location, key, character)
+ print('{}: unexpected combination {}<{}>'
+ .format(location, key, character))
g_fail += 1
s = 'ERROR'
return str.__new__(cls, s)
@@ -112,7 +115,7 @@ class Key(str):
def UnicodeName(self):
v = self.CharacterCode()
try:
- return unicodedata.name(unichr(v)).lower()
+ return unicodedata.name(unichr_compat(v)).lower()
except ValueError:
return 'U+{:04X}'.format(v)
@@ -236,8 +239,8 @@ class Lexer:
except KeyError:
g_fail += 1
character = None
- print '{}: unknown character name "{}"'.format(location,
- s.encode('utf-8'))
+ print('{}: unknown character name "{}"'.format(location,
+ s.encode('utf-8')))
return Key(key, character, location)
def Where(self):
@@ -265,8 +268,8 @@ class Parser:
break
if t and t != 'EOL' and t.Kind() != 'dead_key':
g_fail += 1
- print ('{}: sequence does not begin with Compose or Dead key'
- .format(self._lexer.Where()))
+ print('{}: sequence does not begin with Compose or Dead key'
+ .format(self._lexer.Where()))
break
while t and t != 'EOL':
seq.append(t)
@@ -421,7 +424,7 @@ def main(argv):
parse_tree = Parser(Lexer(Input(args.inputs))).Parse()
- with (sys.stdout if args.output == '-' else open(args.output, 'wb')) as out:
+ with (sys.stdout if args.output == '-' else open(args.output, 'w')) as out:
out.write('// Copyright 2015 The Chromium Authors. All rights reserved.\n')
out.write('// Use of this source code is governed by a BSD-style license')
out.write(' that can be\n// found in the LICENSE file.\n\n')
diff --git a/chromium/ui/base/ime/input_method_delegate.h b/chromium/ui/base/ime/ime_key_event_dispatcher.h
index 2a81f6cd294..05e9d458548 100644
--- a/chromium/ui/base/ime/input_method_delegate.h
+++ b/chromium/ui/base/ime/ime_key_event_dispatcher.h
@@ -2,31 +2,28 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_BASE_IME_INPUT_METHOD_DELEGATE_H_
-#define UI_BASE_IME_INPUT_METHOD_DELEGATE_H_
+#ifndef UI_BASE_IME_IME_KEY_EVENT_DISPATCHER_H_
+#define UI_BASE_IME_IME_KEY_EVENT_DISPATCHER_H_
#include "base/component_export.h"
namespace ui {
class KeyEvent;
-
struct EventDispatchDetails;
-namespace internal {
-
-// An interface implemented by the object that handles events sent back from an
-// ui::InputMethod implementation.
-class COMPONENT_EXPORT(UI_BASE_IME) InputMethodDelegate {
+// An interface implemented by the object that handles key events sent from an
+// ui::InputMethod.
+class COMPONENT_EXPORT(UI_BASE_IME) ImeKeyEventDispatcher {
public:
- virtual ~InputMethodDelegate() {}
-
// Dispatch a key event already processed by the input method. Returns the
// status of processing.
virtual EventDispatchDetails DispatchKeyEventPostIME(KeyEvent* key_event) = 0;
+
+ protected:
+ virtual ~ImeKeyEventDispatcher() = default;
};
-} // namespace internal
} // namespace ui
-#endif // UI_BASE_IME_INPUT_METHOD_DELEGATE_H_
+#endif // UI_BASE_IME_IME_KEY_EVENT_DISPATCHER_H_
diff --git a/chromium/ui/base/ime/ime_text_span.cc b/chromium/ui/base/ime/ime_text_span.cc
index 1fa3bb0207e..3a54dd87729 100644
--- a/chromium/ui/base/ime/ime_text_span.cc
+++ b/chromium/ui/base/ime/ime_text_span.cc
@@ -10,8 +10,8 @@
namespace ui {
ImeTextSpan::ImeTextSpan(Type type,
- uint32_t start_offset,
- uint32_t end_offset,
+ size_t start_offset,
+ size_t end_offset,
Thickness thickness,
UnderlineStyle underline_style,
SkColor background_color,
diff --git a/chromium/ui/base/ime/ime_text_span.h b/chromium/ui/base/ime/ime_text_span.h
index 2d373da4350..d03f57bb474 100644
--- a/chromium/ui/base/ime/ime_text_span.h
+++ b/chromium/ui/base/ime/ime_text_span.h
@@ -48,8 +48,8 @@ struct COMPONENT_EXPORT(UI_BASE_IME_TYPES) ImeTextSpan {
explicit ImeTextSpan(
Type type = Type::kComposition,
- uint32_t start_offset = 0,
- uint32_t end_offset = 0,
+ size_t start_offset = 0,
+ size_t end_offset = 0,
Thickness thickness = Thickness::kThin,
UnderlineStyle underline_style = UnderlineStyle::kSolid,
SkColor background_color = SK_ColorTRANSPARENT,
@@ -80,8 +80,8 @@ struct COMPONENT_EXPORT(UI_BASE_IME_TYPES) ImeTextSpan {
bool operator!=(const ImeTextSpan& rhs) const { return !(*this == rhs); }
Type type;
- uint32_t start_offset;
- uint32_t end_offset;
+ size_t start_offset;
+ size_t end_offset;
SkColor underline_color = SK_ColorTRANSPARENT;
Thickness thickness;
UnderlineStyle underline_style;
diff --git a/chromium/ui/base/ime/init/input_method_factory.cc b/chromium/ui/base/ime/init/input_method_factory.cc
index b58d5e3cc93..0701a0c014e 100644
--- a/chromium/ui/base/ime/init/input_method_factory.cc
+++ b/chromium/ui/base/ime/init/input_method_factory.cc
@@ -37,7 +37,7 @@ bool g_create_input_method_called = false;
namespace ui {
std::unique_ptr<InputMethod> CreateInputMethod(
- internal::InputMethodDelegate* delegate,
+ ImeKeyEventDispatcher* ime_key_event_dispatcher,
gfx::AcceleratedWidget widget) {
if (!g_create_input_method_called)
g_create_input_method_called = true;
@@ -49,23 +49,26 @@ std::unique_ptr<InputMethod> CreateInputMethod(
}
if (g_input_method_set_for_testing)
- return std::make_unique<MockInputMethod>(delegate);
+ return std::make_unique<MockInputMethod>(ime_key_event_dispatcher);
if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kHeadless))
- return base::WrapUnique(new MockInputMethod(delegate));
+ return base::WrapUnique(new MockInputMethod(ime_key_event_dispatcher));
#if BUILDFLAG(IS_WIN)
if (base::FeatureList::IsEnabled(features::kTSFImeSupport) &&
base::win::GetVersion() > base::win::Version::WIN7) {
- return std::make_unique<InputMethodWinTSF>(delegate, widget);
+ return std::make_unique<InputMethodWinTSF>(ime_key_event_dispatcher,
+ widget);
}
- return std::make_unique<InputMethodWinImm32>(delegate, widget);
+ return std::make_unique<InputMethodWinImm32>(ime_key_event_dispatcher,
+ widget);
#elif BUILDFLAG(IS_APPLE)
- return std::make_unique<InputMethodMac>(delegate);
+ return std::make_unique<InputMethodMac>(ime_key_event_dispatcher);
#elif defined(USE_OZONE)
- return ui::OzonePlatform::GetInstance()->CreateInputMethod(delegate, widget);
+ return ui::OzonePlatform::GetInstance()->CreateInputMethod(
+ ime_key_event_dispatcher, widget);
#else
- return std::make_unique<InputMethodMinimal>(delegate);
+ return std::make_unique<InputMethodMinimal>(ime_key_event_dispatcher);
#endif
}
diff --git a/chromium/ui/base/ime/init/input_method_factory.h b/chromium/ui/base/ime/init/input_method_factory.h
index 87c319f2a78..0d6cb2bb14e 100644
--- a/chromium/ui/base/ime/init/input_method_factory.h
+++ b/chromium/ui/base/ime/init/input_method_factory.h
@@ -12,16 +12,14 @@
#include "ui/gfx/native_widget_types.h"
namespace ui {
-namespace internal {
-class InputMethodDelegate;
-} // namespace internal
class InputMethod;
+class ImeKeyEventDispatcher;
// Creates a new instance of InputMethod and returns it.
COMPONENT_EXPORT(UI_BASE_IME_INIT)
std::unique_ptr<InputMethod> CreateInputMethod(
- internal::InputMethodDelegate* delegate,
+ ImeKeyEventDispatcher* ime_key_event_dispatcher,
gfx::AcceleratedWidget widget);
// Makes CreateInputMethod return a MockInputMethod.
@@ -39,6 +37,6 @@ class COMPONENT_EXPORT(UI_BASE_IME_INIT) ScopedTestInputMethodFactory {
~ScopedTestInputMethodFactory();
};
-} // namespace ui;
+} // namespace ui
#endif // UI_BASE_IME_INIT_INPUT_METHOD_FACTORY_H_
diff --git a/chromium/ui/base/ime/init/input_method_initializer.cc b/chromium/ui/base/ime/init/input_method_initializer.cc
index 6b01aa01ab1..5a6944c783f 100644
--- a/chromium/ui/base/ime/init/input_method_initializer.cc
+++ b/chromium/ui/base/ime/init/input_method_initializer.cc
@@ -4,29 +4,20 @@
#include "ui/base/ime/init/input_method_initializer.h"
-#include <ostream>
-
+#include "base/bind.h"
+#include "base/callback.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#if !BUILDFLAG(IS_CHROMEOS_ASH) && defined(USE_AURA) && \
(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
-#include "base/check.h"
-#include "ui/base/ime/linux/fake_input_method_context_factory.h"
+#include "ui/base/ime/linux/fake_input_method_context.h"
+#include "ui/base/ime/linux/linux_input_method_context_factory.h"
#elif BUILDFLAG(IS_WIN)
#include "ui/base/ime/init/input_method_factory.h"
#include "ui/base/ime/win/tsf_bridge.h"
#endif
-namespace {
-
-#if defined(USE_AURA) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
-const ui::LinuxInputMethodContextFactory*
- g_linux_input_method_context_factory_for_testing;
-#endif
-
-} // namespace
-
namespace ui {
void InitializeInputMethod() {
@@ -42,18 +33,12 @@ void ShutdownInputMethod() {
}
void InitializeInputMethodForTesting() {
-#if !BUILDFLAG(IS_CHROMEOS_ASH) && defined(USE_AURA) && \
- (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
- if (!g_linux_input_method_context_factory_for_testing)
- g_linux_input_method_context_factory_for_testing =
- new FakeInputMethodContextFactory();
- const LinuxInputMethodContextFactory* factory =
- LinuxInputMethodContextFactory::instance();
- CHECK(!factory || factory == g_linux_input_method_context_factory_for_testing)
- << "LinuxInputMethodContextFactory was already initialized somewhere "
- << "else.";
- LinuxInputMethodContextFactory::SetInstance(
- g_linux_input_method_context_factory_for_testing);
+#if defined(USE_AURA) && BUILDFLAG(IS_LINUX)
+ GetInputMethodContextFactoryForTest() =
+ base::BindRepeating([](LinuxInputMethodContextDelegate* delegate)
+ -> std::unique_ptr<LinuxInputMethodContext> {
+ return std::make_unique<FakeInputMethodContext>();
+ });
#elif BUILDFLAG(IS_WIN)
TSFBridge::InitializeForTesting();
#endif
@@ -62,13 +47,9 @@ void InitializeInputMethodForTesting() {
void ShutdownInputMethodForTesting() {
#if !BUILDFLAG(IS_CHROMEOS_ASH) && defined(USE_AURA) && \
(BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
- const LinuxInputMethodContextFactory* factory =
- LinuxInputMethodContextFactory::instance();
- CHECK(!factory || factory == g_linux_input_method_context_factory_for_testing)
- << "An unknown LinuxInputMethodContextFactory was set.";
- LinuxInputMethodContextFactory::SetInstance(nullptr);
- delete g_linux_input_method_context_factory_for_testing;
- g_linux_input_method_context_factory_for_testing = nullptr;
+ // The function owns the factory (as a static variable that's returned by
+ // reference), so setting this to an empty factory will free the old one.
+ GetInputMethodContextFactoryForTest() = LinuxInputMethodContextFactory();
#elif BUILDFLAG(IS_WIN)
TSFBridge::Shutdown();
#endif
diff --git a/chromium/ui/base/ime/input_method.h b/chromium/ui/base/ime/input_method.h
index 1c2f18ce26c..8c6fd7736fe 100644
--- a/chromium/ui/base/ime/input_method.h
+++ b/chromium/ui/base/ime/input_method.h
@@ -10,19 +10,17 @@
#include "build/build_config.h"
#include "ui/base/ime/text_input_mode.h"
#include "ui/base/ime/text_input_type.h"
+#include "ui/base/ime/virtual_keyboard_controller.h"
#include "ui/events/event_dispatcher.h"
#include "ui/events/platform_event.h"
#include "ui/gfx/geometry/rect.h"
namespace ui {
-namespace internal {
-class InputMethodDelegate;
-} // namespace internal
-
class VirtualKeyboardController;
class InputMethodObserver;
class KeyEvent;
+class ImeKeyEventDispatcher;
class TextInputClient;
// An interface implemented by an object that encapsulates a native input method
@@ -35,10 +33,10 @@ class TextInputClient;
// - The input method should handle the key event either of the following ways:
// 1) Send the original key down event to the focused window, which is e.g.
// a NativeWidgetAura (NWA) or a RenderWidgetHostViewAura (RWHVA), using
-// internal::InputMethodDelegate::DispatchKeyEventPostIME API, then send
-// a Char event using TextInputClient::InsertChar API to a text input
-// client, which is, again, e.g. NWA or RWHVA, and then send the original
-// key up event to the same window.
+// ImeKeyEventDispatcher API, then send a Char event using
+// TextInputClient::InsertChar API to a text input client, which is, again,
+// e.g. NWA or RWHVA, and then send the original key up event to the same
+// window.
// 2) Send VKEY_PROCESSKEY event to the window using the DispatchKeyEvent API,
// then update IME status (e.g. composition text) using TextInputClient,
// and then send the original key up event to the window.
@@ -55,11 +53,12 @@ class InputMethod {
typedef int32_t NativeEventResult;
#endif
- virtual ~InputMethod() {}
+ virtual ~InputMethod() = default;
- // Sets the delegate used by this InputMethod instance. It should only be
- // called by an object which manages the whole UI.
- virtual void SetDelegate(internal::InputMethodDelegate* delegate) = 0;
+ // Sets the key event dispatcher used by this InputMethod instance. It should
+ // only be called by an object which manages the whole UI.
+ virtual void SetImeKeyEventDispatcher(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher) = 0;
// Called when the top-level system window gets keyboard focus.
virtual void OnFocus() = 0;
@@ -147,11 +146,15 @@ class InputMethod {
virtual void AddObserver(InputMethodObserver* observer) = 0;
virtual void RemoveObserver(InputMethodObserver* observer) = 0;
- // Set screen bounds of a on-screen keyboard.
- virtual void SetOnScreenKeyboardBounds(const gfx::Rect& new_bounds) {}
+ // Set screen bounds of the virtual keyboard.
+ virtual void SetVirtualKeyboardBounds(const gfx::Rect& new_bounds) {}
- // Return the keyboard controller; used only on Windows.
+ // Return the keyboard controller.
virtual VirtualKeyboardController* GetVirtualKeyboardController() = 0;
+
+ // Sets a keyboard controller for testing.
+ virtual void SetVirtualKeyboardControllerForTesting(
+ std::unique_ptr<VirtualKeyboardController> controller) {}
};
} // namespace ui
diff --git a/chromium/ui/base/ime/input_method_base.cc b/chromium/ui/base/ime/input_method_base.cc
index 4d0a37167a0..c29465e9af6 100644
--- a/chromium/ui/base/ime/input_method_base.cc
+++ b/chromium/ui/base/ime/input_method_base.cc
@@ -12,7 +12,7 @@
#include "base/observer_list.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
-#include "ui/base/ime/input_method_delegate.h"
+#include "ui/base/ime/ime_key_event_dispatcher.h"
#include "ui/base/ime/input_method_observer.h"
#include "ui/base/ime/text_input_client.h"
#include "ui/base/ime/virtual_keyboard_controller_stub.h"
@@ -20,13 +20,14 @@
namespace ui {
-InputMethodBase::InputMethodBase(internal::InputMethodDelegate* delegate)
- : InputMethodBase(delegate, nullptr) {}
+InputMethodBase::InputMethodBase(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher)
+ : InputMethodBase(ime_key_event_dispatcher, nullptr) {}
InputMethodBase::InputMethodBase(
- internal::InputMethodDelegate* delegate,
+ ImeKeyEventDispatcher* ime_key_event_dispatcher,
std::unique_ptr<VirtualKeyboardController> keyboard_controller)
- : delegate_(delegate),
+ : ime_key_event_dispatcher_(ime_key_event_dispatcher),
keyboard_controller_(std::move(keyboard_controller)) {}
InputMethodBase::~InputMethodBase() {
@@ -34,8 +35,9 @@ InputMethodBase::~InputMethodBase() {
observer.OnInputMethodDestroyed(this);
}
-void InputMethodBase::SetDelegate(internal::InputMethodDelegate* delegate) {
- delegate_ = delegate;
+void InputMethodBase::SetImeKeyEventDispatcher(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher) {
+ ime_key_event_dispatcher_ = ime_key_event_dispatcher;
}
void InputMethodBase::OnFocus() {
@@ -46,20 +48,6 @@ void InputMethodBase::OnBlur() {
void InputMethodBase::OnTouch(ui::EventPointerType pointerType) {}
-#if BUILDFLAG(IS_WIN)
-bool InputMethodBase::OnUntranslatedIMEMessage(
- const CHROME_MSG event,
- InputMethod::NativeEventResult* result) {
- return false;
-}
-
-void InputMethodBase::OnInputLocaleChanged() {}
-
-bool InputMethodBase::IsInputLocaleCJK() const {
- return false;
-}
-#endif
-
void InputMethodBase::SetFocusedTextInputClient(TextInputClient* client) {
SetFocusedTextInputClientInternal(client);
}
@@ -74,7 +62,7 @@ TextInputClient* InputMethodBase::GetTextInputClient() const {
return text_input_client_;
}
-void InputMethodBase::SetOnScreenKeyboardBounds(const gfx::Rect& new_bounds) {
+void InputMethodBase::SetVirtualKeyboardBounds(const gfx::Rect& new_bounds) {
keyboard_bounds_ = new_bounds;
if (text_input_client_)
text_input_client_->EnsureCaretNotInRect(keyboard_bounds_);
@@ -116,6 +104,11 @@ VirtualKeyboardController* InputMethodBase::GetVirtualKeyboardController() {
return keyboard_controller_.get();
}
+void InputMethodBase::SetVirtualKeyboardControllerForTesting(
+ std::unique_ptr<VirtualKeyboardController> controller) {
+ keyboard_controller_ = std::move(controller);
+}
+
bool InputMethodBase::IsTextInputClientFocused(const TextInputClient* client) {
return client && (client == GetTextInputClient());
}
@@ -137,8 +130,9 @@ ui::EventDispatchDetails InputMethodBase::DispatchKeyEventPostIME(
if (event->handled())
return EventDispatchDetails();
}
- return delegate_ ? delegate_->DispatchKeyEventPostIME(event)
- : ui::EventDispatchDetails();
+ return ime_key_event_dispatcher_
+ ? ime_key_event_dispatcher_->DispatchKeyEventPostIME(event)
+ : ui::EventDispatchDetails();
}
void InputMethodBase::NotifyTextInputStateChanged(
@@ -168,28 +162,4 @@ void InputMethodBase::SetFocusedTextInputClientInternal(
text_input_client_->EnsureCaretNotInRect(keyboard_bounds_);
}
-std::vector<gfx::Rect> InputMethodBase::GetCompositionBounds(
- const TextInputClient* client) {
- std::vector<gfx::Rect> bounds;
- if (client->HasCompositionText()) {
- uint32_t i = 0;
- gfx::Rect rect;
- while (client->GetCompositionCharacterBounds(i++, &rect))
- bounds.push_back(rect);
- } else {
- // For case of no composition at present, use caret bounds which is required
- // by the IME extension for certain features (e.g. physical keyboard
- // auto-correct).
- bounds.push_back(client->GetCaretBounds());
- }
- return bounds;
-}
-
-bool InputMethodBase::SendFakeProcessKeyEvent(bool pressed) const {
- KeyEvent evt(pressed ? ET_KEY_PRESSED : ET_KEY_RELEASED,
- pressed ? VKEY_PROCESSKEY : VKEY_UNKNOWN, EF_IME_FABRICATED_KEY);
- std::ignore = DispatchKeyEventPostIME(&evt);
- return evt.stopped_propagation();
-}
-
} // namespace ui
diff --git a/chromium/ui/base/ime/input_method_base.h b/chromium/ui/base/ime/input_method_base.h
index d67d38714bf..394ee52d385 100644
--- a/chromium/ui/base/ime/input_method_base.h
+++ b/chromium/ui/base/ime/input_method_base.h
@@ -40,22 +40,16 @@ class COMPONENT_EXPORT(UI_BASE_IME) InputMethodBase
~InputMethodBase() override;
// Overriden from InputMethod.
- void SetDelegate(internal::InputMethodDelegate* delegate) override;
+ void SetImeKeyEventDispatcher(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher) override;
void OnFocus() override;
void OnTouch(ui::EventPointerType pointerType) override;
void OnBlur() override;
-#if BUILDFLAG(IS_WIN)
- bool OnUntranslatedIMEMessage(const CHROME_MSG event,
- NativeEventResult* result) override;
- void OnInputLocaleChanged() override;
- bool IsInputLocaleCJK() const override;
-#endif
-
void SetFocusedTextInputClient(TextInputClient* client) override;
void DetachTextInputClient(TextInputClient* client) override;
TextInputClient* GetTextInputClient() const override;
- void SetOnScreenKeyboardBounds(const gfx::Rect& new_bounds) override;
+ void SetVirtualKeyboardBounds(const gfx::Rect& new_bounds) override;
// If a derived class overrides this method, it should call parent's
// implementation.
@@ -67,10 +61,12 @@ class COMPONENT_EXPORT(UI_BASE_IME) InputMethodBase
void RemoveObserver(InputMethodObserver* observer) override;
VirtualKeyboardController* GetVirtualKeyboardController() override;
+ void SetVirtualKeyboardControllerForTesting(
+ std::unique_ptr<VirtualKeyboardController> controller) override;
protected:
- explicit InputMethodBase(internal::InputMethodDelegate* delegate);
- InputMethodBase(internal::InputMethodDelegate* delegate,
+ explicit InputMethodBase(ImeKeyEventDispatcher* ime_key_event_dispatcher);
+ InputMethodBase(ImeKeyEventDispatcher* ime_key_event_dispatcher,
std::unique_ptr<VirtualKeyboardController> controller);
virtual void OnWillChangeFocusedClient(TextInputClient* focused_before,
@@ -78,10 +74,6 @@ class COMPONENT_EXPORT(UI_BASE_IME) InputMethodBase
virtual void OnDidChangeFocusedClient(TextInputClient* focused_before,
TextInputClient* focused) {}
- // Sends a fake key event for IME composing without physical key events.
- // Returns true if the faked key event is stopped propagation.
- bool SendFakeProcessKeyEvent(bool pressed) const;
-
// Returns true if |client| is currently focused.
bool IsTextInputClientFocused(const TextInputClient* client);
@@ -105,13 +97,12 @@ class COMPONENT_EXPORT(UI_BASE_IME) InputMethodBase
// |client| which is the text input client with focus.
void NotifyTextInputCaretBoundsChanged(const TextInputClient* client);
- // Gets the bounds of the composition text or cursor in |client|.
- std::vector<gfx::Rect> GetCompositionBounds(const TextInputClient* client);
-
- internal::InputMethodDelegate* delegate() const { return delegate_; }
+ ImeKeyEventDispatcher* ime_key_event_dispatcher() {
+ return ime_key_event_dispatcher_;
+ }
private:
- raw_ptr<internal::InputMethodDelegate> delegate_;
+ raw_ptr<ImeKeyEventDispatcher> ime_key_event_dispatcher_;
void SetFocusedTextInputClientInternal(TextInputClient* client);
@@ -122,7 +113,7 @@ class COMPONENT_EXPORT(UI_BASE_IME) InputMethodBase
// Screen bounds of a on-screen keyboard.
gfx::Rect keyboard_bounds_;
- std::unique_ptr<VirtualKeyboardController> const keyboard_controller_;
+ std::unique_ptr<VirtualKeyboardController> keyboard_controller_;
};
} // namespace ui
diff --git a/chromium/ui/base/ime/input_method_base_unittest.cc b/chromium/ui/base/ime/input_method_base_unittest.cc
index f1f368b2556..0ffe6670e22 100644
--- a/chromium/ui/base/ime/input_method_base_unittest.cc
+++ b/chromium/ui/base/ime/input_method_base_unittest.cc
@@ -135,6 +135,16 @@ class MockInputMethodBase : public InputMethodBase {
void CancelComposition(const TextInputClient* client) override {}
bool IsCandidatePopupOpen() const override { return false; }
+#if BUILDFLAG(IS_WIN)
+ bool OnUntranslatedIMEMessage(
+ const CHROME_MSG event,
+ InputMethod::NativeEventResult* result) override {
+ return false;
+ }
+ void OnInputLocaleChanged() override {}
+ bool IsInputLocaleCJK() const override { return false; }
+#endif
+
// InputMethodBase:
void OnWillChangeFocusedClient(TextInputClient* focused_before,
TextInputClient* focused) override {
diff --git a/chromium/ui/base/ime/input_method_minimal.cc b/chromium/ui/base/ime/input_method_minimal.cc
index ce65eb358cc..9c6a93b32b7 100644
--- a/chromium/ui/base/ime/input_method_minimal.cc
+++ b/chromium/ui/base/ime/input_method_minimal.cc
@@ -12,8 +12,9 @@
namespace ui {
-InputMethodMinimal::InputMethodMinimal(internal::InputMethodDelegate* delegate)
- : InputMethodBase(delegate) {}
+InputMethodMinimal::InputMethodMinimal(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher)
+ : InputMethodBase(ime_key_event_dispatcher) {}
InputMethodMinimal::~InputMethodMinimal() {}
diff --git a/chromium/ui/base/ime/input_method_minimal.h b/chromium/ui/base/ime/input_method_minimal.h
index da99a20beb5..1346b2fd76a 100644
--- a/chromium/ui/base/ime/input_method_minimal.h
+++ b/chromium/ui/base/ime/input_method_minimal.h
@@ -15,7 +15,7 @@ namespace ui {
class COMPONENT_EXPORT(UI_BASE_IME) InputMethodMinimal
: public InputMethodBase {
public:
- explicit InputMethodMinimal(internal::InputMethodDelegate* delegate);
+ explicit InputMethodMinimal(ImeKeyEventDispatcher* ime_key_event_dispatcher);
InputMethodMinimal(const InputMethodMinimal&) = delete;
InputMethodMinimal& operator=(const InputMethodMinimal&) = delete;
diff --git a/chromium/ui/base/ime/input_method_minimal_unittest.cc b/chromium/ui/base/ime/input_method_minimal_unittest.cc
index a74e45481ad..fbdae0693bd 100644
--- a/chromium/ui/base/ime/input_method_minimal_unittest.cc
+++ b/chromium/ui/base/ime/input_method_minimal_unittest.cc
@@ -6,24 +6,25 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/ime/dummy_text_input_client.h"
+#include "ui/base/ime/ime_key_event_dispatcher.h"
#include "ui/base/ime/init/input_method_initializer.h"
-#include "ui/base/ime/input_method_delegate.h"
#include "ui/events/event.h"
#include "ui/events/test/keyboard_layout.h"
namespace ui {
namespace {
-class InputMethodDelegateForTesting : public internal::InputMethodDelegate {
+class ImeKeyEventDispatcherForTesting : public ImeKeyEventDispatcher {
public:
- InputMethodDelegateForTesting(bool propagation)
+ ImeKeyEventDispatcherForTesting(bool propagation)
: propagation_post_ime_(propagation) {}
- InputMethodDelegateForTesting(const InputMethodDelegateForTesting&) = delete;
- InputMethodDelegateForTesting& operator=(
- const InputMethodDelegateForTesting&) = delete;
+ ImeKeyEventDispatcherForTesting(const ImeKeyEventDispatcherForTesting&) =
+ delete;
+ ImeKeyEventDispatcherForTesting& operator=(
+ const ImeKeyEventDispatcherForTesting&) = delete;
- ~InputMethodDelegateForTesting() override {}
+ ~ImeKeyEventDispatcherForTesting() override {}
ui::EventDispatchDetails DispatchKeyEventPostIME(
ui::KeyEvent* key_event) override {
@@ -46,14 +47,14 @@ class InputMethodMinimalTest : public testing::Test {
~InputMethodMinimalTest() override = default;
void SetUp() override {
- delegate_ = std::make_unique<InputMethodDelegateForTesting>(true);
+ dispatcher_ = std::make_unique<ImeKeyEventDispatcherForTesting>(true);
input_method_minimal_ =
- std::make_unique<InputMethodMinimal>(delegate_.get());
+ std::make_unique<InputMethodMinimal>(dispatcher_.get());
input_method_minimal_->OnFocus();
}
std::unique_ptr<InputMethodMinimal> input_method_minimal_;
- std::unique_ptr<InputMethodDelegateForTesting> delegate_;
+ std::unique_ptr<ImeKeyEventDispatcherForTesting> dispatcher_;
};
TEST_F(InputMethodMinimalTest, StopPropagationTest) {
@@ -76,9 +77,10 @@ TEST_F(InputMethodMinimalTest, StopPropagationTest) {
EXPECT_EQ(2, client->insert_char_count());
EXPECT_EQ(97, client->last_insert_char());
- std::unique_ptr<InputMethodDelegateForTesting> delegate_no_propagation =
- std::make_unique<InputMethodDelegateForTesting>(false);
- input_method_minimal_->SetDelegate(delegate_no_propagation.get());
+ std::unique_ptr<ImeKeyEventDispatcherForTesting> dispatcher_no_propagation =
+ std::make_unique<ImeKeyEventDispatcherForTesting>(false);
+ input_method_minimal_->SetImeKeyEventDispatcher(
+ dispatcher_no_propagation.get());
input_method_minimal_->DispatchKeyEvent(&key);
EXPECT_EQ(2, client->insert_char_count());
diff --git a/chromium/ui/base/ime/linux/BUILD.gn b/chromium/ui/base/ime/linux/BUILD.gn
index 77452cf14f9..ea757d7d635 100644
--- a/chromium/ui/base/ime/linux/BUILD.gn
+++ b/chromium/ui/base/ime/linux/BUILD.gn
@@ -12,8 +12,6 @@ component("linux") {
sources = [
"fake_input_method_context.cc",
"fake_input_method_context.h",
- "fake_input_method_context_factory.cc",
- "fake_input_method_context_factory.h",
"input_method_auralinux.cc",
"input_method_auralinux.h",
"linux_input_method_context.h",
@@ -21,8 +19,6 @@ component("linux") {
"linux_input_method_context_factory.h",
"text_edit_command_auralinux.cc",
"text_edit_command_auralinux.h",
- "text_edit_key_bindings_delegate_auralinux.cc",
- "text_edit_key_bindings_delegate_auralinux.h",
]
defines = [ "IS_UI_BASE_IME_LINUX_IMPL" ]
@@ -37,7 +33,15 @@ component("linux") {
]
}
- # TODO(crbug.com/1199385): Remove this on unifying lacros and linux desktop
- # behavior again.
- deps = [ "//build:chromeos_buildflags" ]
+ deps = [
+ "//ui/base",
+
+ # TODO(crbug.com/1199385): Remove this on unifying lacros and linux desktop
+ # behavior again.
+ "//build:chromeos_buildflags",
+ ]
+
+ if (is_linux) {
+ deps += [ "//ui/linux:linux_ui" ]
+ }
}
diff --git a/chromium/ui/base/ime/linux/OWNERS b/chromium/ui/base/ime/linux/OWNERS
new file mode 100644
index 00000000000..b641050e9ea
--- /dev/null
+++ b/chromium/ui/base/ime/linux/OWNERS
@@ -0,0 +1,2 @@
+hidehiko@chromium.org
+thomasanderson@chromium.org
diff --git a/chromium/ui/base/ime/linux/fake_input_method_context.cc b/chromium/ui/base/ime/linux/fake_input_method_context.cc
index 79c95d4d844..2e016966ffe 100644
--- a/chromium/ui/base/ime/linux/fake_input_method_context.cc
+++ b/chromium/ui/base/ime/linux/fake_input_method_context.cc
@@ -6,7 +6,7 @@
namespace ui {
-FakeInputMethodContext::FakeInputMethodContext() {}
+FakeInputMethodContext::FakeInputMethodContext() = default;
// Overriden from ui::LinuxInputMethodContext
@@ -19,15 +19,13 @@ bool FakeInputMethodContext::IsPeekKeyEvent(const ui::KeyEvent& key_event) {
return false;
}
-void FakeInputMethodContext::Reset() {
-}
+void FakeInputMethodContext::Reset() {}
void FakeInputMethodContext::UpdateFocus(bool has_client,
TextInputType old_type,
TextInputType new_type) {}
-void FakeInputMethodContext::SetCursorLocation(const gfx::Rect& rect) {
-}
+void FakeInputMethodContext::SetCursorLocation(const gfx::Rect& rect) {}
void FakeInputMethodContext::SetSurroundingText(
const std::u16string& text,
@@ -38,6 +36,13 @@ void FakeInputMethodContext::SetContentType(TextInputType type,
uint32_t flags,
bool should_do_learning) {}
+void FakeInputMethodContext::SetGrammarFragmentAtCursor(
+ const ui::GrammarFragment& fragment) {}
+
+void FakeInputMethodContext::SetAutocorrectInfo(
+ const gfx::Range& autocorrect_range,
+ const gfx::Rect& autocorrect_bounds) {}
+
VirtualKeyboardController*
FakeInputMethodContext::GetVirtualKeyboardController() {
return nullptr;
diff --git a/chromium/ui/base/ime/linux/fake_input_method_context.h b/chromium/ui/base/ime/linux/fake_input_method_context.h
index 7e5746ee715..f8b23ac8f08 100644
--- a/chromium/ui/base/ime/linux/fake_input_method_context.h
+++ b/chromium/ui/base/ime/linux/fake_input_method_context.h
@@ -33,6 +33,9 @@ class COMPONENT_EXPORT(UI_BASE_IME_LINUX) FakeInputMethodContext
TextInputMode mode,
uint32_t flags,
bool should_do_learning) override;
+ void SetGrammarFragmentAtCursor(const ui::GrammarFragment& fragment) override;
+ void SetAutocorrectInfo(const gfx::Range& autocorrect_range,
+ const gfx::Rect& autocorrect_bounds) override;
VirtualKeyboardController* GetVirtualKeyboardController() override;
};
diff --git a/chromium/ui/base/ime/linux/fake_input_method_context_factory.cc b/chromium/ui/base/ime/linux/fake_input_method_context_factory.cc
deleted file mode 100644
index aba2f76ed30..00000000000
--- a/chromium/ui/base/ime/linux/fake_input_method_context_factory.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/base/ime/linux/fake_input_method_context_factory.h"
-
-#include "ui/base/ime/linux/fake_input_method_context.h"
-
-namespace ui {
-
-FakeInputMethodContextFactory::FakeInputMethodContextFactory() = default;
-
-FakeInputMethodContextFactory::~FakeInputMethodContextFactory() = default;
-
-std::unique_ptr<LinuxInputMethodContext>
-FakeInputMethodContextFactory::CreateInputMethodContext(
- LinuxInputMethodContextDelegate* /* delegate */,
- bool is_simple) const {
- return std::make_unique<FakeInputMethodContext>();
-}
-
-} // namespace ui
diff --git a/chromium/ui/base/ime/linux/fake_input_method_context_factory.h b/chromium/ui/base/ime/linux/fake_input_method_context_factory.h
deleted file mode 100644
index 55ddddf07f1..00000000000
--- a/chromium/ui/base/ime/linux/fake_input_method_context_factory.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_BASE_IME_LINUX_FAKE_INPUT_METHOD_CONTEXT_FACTORY_H_
-#define UI_BASE_IME_LINUX_FAKE_INPUT_METHOD_CONTEXT_FACTORY_H_
-
-#include "base/component_export.h"
-#include "ui/base/ime/linux/linux_input_method_context_factory.h"
-
-namespace ui {
-
-// An implementation of LinuxInputMethodContextFactory, which creates and
-// returns FakeInputMethodContext's.
-class COMPONENT_EXPORT(UI_BASE_IME_LINUX) FakeInputMethodContextFactory
- : public LinuxInputMethodContextFactory {
- public:
- FakeInputMethodContextFactory();
-
- FakeInputMethodContextFactory(const FakeInputMethodContextFactory&) = delete;
- FakeInputMethodContextFactory& operator=(
- const FakeInputMethodContextFactory&) = delete;
-
- ~FakeInputMethodContextFactory() override;
-
- // LinuxInputMethodContextFactory:
- std::unique_ptr<LinuxInputMethodContext> CreateInputMethodContext(
- LinuxInputMethodContextDelegate* delegate,
- bool is_simple) const override;
-};
-
-} // namespace ui
-
-#endif // UI_BASE_IME_LINUX_FAKE_INPUT_METHOD_CONTEXT_FACTORY_H_
diff --git a/chromium/ui/base/ime/linux/input_method_auralinux.cc b/chromium/ui/base/ime/linux/input_method_auralinux.cc
index 7293030a71c..2162e046ca6 100644
--- a/chromium/ui/base/ime/linux/input_method_auralinux.cc
+++ b/chromium/ui/base/ime/linux/input_method_auralinux.cc
@@ -7,6 +7,8 @@
#include "base/auto_reset.h"
#include "base/bind.h"
#include "base/environment.h"
+#include "base/strings/utf_offset_string_conversions.h"
+#include "base/strings/utf_string_conversions.h"
#include "build/chromeos_buildflags.h"
#include "ui/base/ime/constants.h"
#include "ui/base/ime/linux/linux_input_method_context_factory.h"
@@ -42,27 +44,18 @@ bool IsSameKeyEvent(const ui::KeyEvent& lhs, const ui::KeyEvent& rhs) {
namespace ui {
InputMethodAuraLinux::InputMethodAuraLinux(
- internal::InputMethodDelegate* delegate)
- : InputMethodBase(delegate),
+ ImeKeyEventDispatcher* ime_key_event_dispatcher)
+ : InputMethodBase(ime_key_event_dispatcher),
text_input_type_(TEXT_INPUT_TYPE_NONE),
is_sync_mode_(false),
composition_changed_(false) {
- DCHECK(LinuxInputMethodContextFactory::instance())
- << "Trying to initialize InputMethodAuraLinux, but "
- "LinuxInputMethodContextFactory is not initialized yet.";
- context_ =
- LinuxInputMethodContextFactory::instance()->CreateInputMethodContext(
- this, false);
- context_simple_ =
- LinuxInputMethodContextFactory::instance()->CreateInputMethodContext(
- this, true);
+ context_ = CreateLinuxInputMethodContext(this);
}
InputMethodAuraLinux::~InputMethodAuraLinux() = default;
-LinuxInputMethodContext* InputMethodAuraLinux::GetContextForTesting(
- bool is_simple) {
- return is_simple ? context_simple_.get() : context_.get();
+LinuxInputMethodContext* InputMethodAuraLinux::GetContextForTesting() {
+ return context_.get();
}
// Overriden from InputMethod.
@@ -109,18 +102,14 @@ ui::EventDispatchDetails InputMethodAuraLinux::DispatchKeyEvent(
}
ime_filtered_key_event_.reset();
- LinuxInputMethodContext* context =
- text_input_type_ != TEXT_INPUT_TYPE_NONE &&
- text_input_type_ != TEXT_INPUT_TYPE_PASSWORD
- ? context_.get()
- : context_simple_.get();
-
// If no text input client, dispatch immediately.
if (!GetTextInputClient()) {
// For Wayland, wl_keyboard::key will be sent following the peek key event
// if the event is not consumed by IME, so peek key events should not be
// dispatched. crbug.com/1225747
- if (context->IsPeekKeyEvent(*event)) {
+ // Do not keep release events. Non-peek Release key event is dispatched,
+ // so the event will be stale. See WaylandKeyboard::OnKey for details.
+ if (event->type() == ET_KEY_PRESSED && context_->IsPeekKeyEvent(*event)) {
ime_filtered_key_event_ = std::move(*event);
return ui::EventDispatchDetails();
}
@@ -147,9 +136,9 @@ ui::EventDispatchDetails InputMethodAuraLinux::DispatchKeyEvent(
suppress_non_key_input_until_ = base::TimeTicks::UnixEpoch();
composition_changed_ = false;
last_commit_result_.reset();
- result_text_.clear();
+ result_text_ = absl::nullopt;
base::AutoReset<bool> flipper(&is_sync_mode_, true);
- filtered = context->DispatchKeyEvent(*event);
+ filtered = context_->DispatchKeyEvent(*event);
}
// There are four cases here. They are a pair of two conditions:
@@ -227,7 +216,7 @@ ui::EventDispatchDetails InputMethodAuraLinux::DispatchKeyEvent(
if (event->stopped_propagation() || details.target_destroyed) {
ResetContext();
} else if (event->type() == ui::ET_KEY_PRESSED) {
- // If a key event was not filtered by |context_| or |context_simple_|,
+ // If a key event was not filtered by |context_|,
// then it means the key event didn't generate any result text. For some
// cases, the key event may still generate a valid character, eg. a
// control-key event (ctrl-a, return, tab, etc.). We need to send the
@@ -283,16 +272,16 @@ ui::EventDispatchDetails InputMethodAuraLinux::DispatchImeFilteredKeyPressEvent(
InputMethodAuraLinux::CommitResult InputMethodAuraLinux::MaybeCommitResult(
bool filtered,
const KeyEvent& event) {
- // Take the ownership of |result_text_|.
- std::u16string result_text = std::move(result_text_);
- result_text_.clear();
-
// Note: |client| could be NULL because DispatchKeyEventPostIME could have
// changed the text input client.
TextInputClient* client = GetTextInputClient();
- if (!client || result_text.empty())
+ if (!client || !result_text_)
return CommitResult::kNoCommitString;
+ // Take the ownership of |result_text_|.
+ std::u16string result_text = std::move(*result_text_);
+ result_text_ = absl::nullopt;
+
if (filtered && NeedInsertChar(result_text)) {
for (const auto ch : result_text) {
ui::KeyEvent ch_event(event);
@@ -350,14 +339,7 @@ void InputMethodAuraLinux::UpdateContextFocusState() {
auto* client = GetTextInputClient();
bool has_client = client != nullptr;
context_->UpdateFocus(has_client, old_text_input_type, text_input_type_);
- context_simple_->UpdateFocus(has_client, old_text_input_type,
- text_input_type_);
-
- LinuxInputMethodContext* context =
- text_input_type_ != TEXT_INPUT_TYPE_NONE &&
- text_input_type_ != TEXT_INPUT_TYPE_PASSWORD
- ? context_.get()
- : context_simple_.get();
+
TextInputMode mode = TEXT_INPUT_MODE_DEFAULT;
int flags = TEXT_INPUT_FLAG_NONE;
bool should_do_learning = false;
@@ -366,7 +348,7 @@ void InputMethodAuraLinux::UpdateContextFocusState() {
flags = client->GetTextInputFlags();
should_do_learning = client->ShouldDoLearning();
}
- context->SetContentType(text_input_type_, mode, flags, should_do_learning);
+ context_->SetContentType(text_input_type_, mode, flags, should_do_learning);
}
void InputMethodAuraLinux::OnTextInputTypeChanged(TextInputClient* client) {
@@ -386,6 +368,32 @@ void InputMethodAuraLinux::OnCaretBoundsChanged(const TextInputClient* client) {
if (client->GetTextRange(&text_range) &&
client->GetTextFromRange(text_range, &text) &&
client->GetEditableSelectionRange(&selection_range)) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+ // SetGrammarFragmentAtCursor must happen before SetSurroundingText to make
+ // sure it is properly updated before IME needs it.
+ auto grammar_fragment_opt = client->GetGrammarFragmentAtCursor();
+ if (grammar_fragment_opt) {
+ auto fragment = grammar_fragment_opt.value();
+ // Convert utf16 offsets to utf8.
+ std::vector<size_t> offsets = {fragment.range.start(),
+ fragment.range.end()};
+ base::UTF16ToUTF8AndAdjustOffsets(text, &offsets);
+ context_->SetGrammarFragmentAtCursor(
+ ui::GrammarFragment(gfx::Range(static_cast<uint32_t>(offsets[0]),
+ static_cast<uint32_t>(offsets[1])),
+ fragment.suggestion));
+ } else {
+ context_->SetGrammarFragmentAtCursor(
+ ui::GrammarFragment(gfx::Range(), ""));
+ }
+
+ // Send the updated autocorrect information before surrounding text,
+ // as surrounding text changes may trigger the IME to ask for the
+ // autocorrect information.
+ context_->SetAutocorrectInfo(client->GetAutocorrectRange(),
+ client->GetAutocorrectCharacterBounds());
+#endif
+
context_->SetSurroundingText(text, selection_range);
}
}
@@ -411,10 +419,9 @@ void InputMethodAuraLinux::ResetContext() {
}
context_->Reset();
- context_simple_->Reset();
composition_ = CompositionText();
- result_text_.clear();
+ result_text_ = absl::nullopt;
is_sync_mode_ = false;
composition_changed_ = false;
}
@@ -431,6 +438,9 @@ bool InputMethodAuraLinux::IsCandidatePopupOpen() const {
VirtualKeyboardController*
InputMethodAuraLinux::GetVirtualKeyboardController() {
+ // This should only be not null when set via testing.
+ if (auto* controller = InputMethodBase::GetVirtualKeyboardController())
+ return controller;
return context_->GetVirtualKeyboardController();
}
@@ -442,8 +452,13 @@ void InputMethodAuraLinux::OnCommit(const std::u16string& text) {
// Discard the result iff in async-mode and the TextInputType is None
// for backward compatibility.
- if (is_sync_mode_ || !IsTextInputTypeNone())
- result_text_.append(text);
+ if (is_sync_mode_ || !IsTextInputTypeNone()) {
+ if (result_text_) {
+ result_text_->append(text);
+ } else {
+ result_text_ = text;
+ }
+ }
// Sync mode means this is called on a stack of DispatchKeyEvent(), so its
// following code should handle the key dispatch and actual committing.
@@ -467,6 +482,10 @@ void InputMethodAuraLinux::OnCommit(const std::u16string& text) {
}
}
+void InputMethodAuraLinux::OnConfirmCompositionText(bool keep_selection) {
+ ConfirmCompositionText(keep_selection);
+}
+
void InputMethodAuraLinux::OnDeleteSurroundingText(size_t before,
size_t after) {
auto* client = GetTextInputClient();
@@ -492,6 +511,48 @@ void InputMethodAuraLinux::OnSetPreeditRegion(
if (!text_input_client)
return;
text_input_client->SetCompositionFromExistingText(range, spans);
+
+ std::u16string text;
+ if (text_input_client->GetTextFromRange(range, &text)) {
+ composition_changed_ |= composition_.text != text;
+ composition_.text = text;
+ }
+ last_commit_result_.reset();
+}
+
+void InputMethodAuraLinux::OnClearGrammarFragments(const gfx::Range& range) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+ auto* text_input_client = GetTextInputClient();
+ if (!text_input_client)
+ return;
+
+ text_input_client->ClearGrammarFragments(range);
+#endif
+}
+
+void InputMethodAuraLinux::OnAddGrammarFragment(
+ const ui::GrammarFragment& fragment) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+ auto* text_input_client = GetTextInputClient();
+ if (!text_input_client)
+ return;
+
+ text_input_client->AddGrammarFragments({fragment});
+#endif
+}
+
+void InputMethodAuraLinux::OnSetAutocorrectRange(const gfx::Range& range) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+ auto* text_input_client = GetTextInputClient();
+ if (!text_input_client)
+ return;
+ text_input_client->SetAutocorrectRange(range);
+#endif
+}
+
+void InputMethodAuraLinux::OnSetVirtualKeyboardOccludedBounds(
+ const gfx::Rect& screen_bounds) {
+ SetVirtualKeyboardBounds(screen_bounds);
}
// Overridden from InputMethodBase.
@@ -499,7 +560,7 @@ void InputMethodAuraLinux::OnSetPreeditRegion(
void InputMethodAuraLinux::OnWillChangeFocusedClient(
TextInputClient* focused_before,
TextInputClient* focused) {
- ConfirmCompositionText();
+ ResetContext();
}
void InputMethodAuraLinux::OnDidChangeFocusedClient(
@@ -543,14 +604,14 @@ void InputMethodAuraLinux::OnPreeditUpdate(
}
bool InputMethodAuraLinux::HasInputMethodResult() {
- return !result_text_.empty() || composition_changed_;
+ return result_text_ || composition_changed_;
}
bool InputMethodAuraLinux::NeedInsertChar(
- const std::u16string& result_text) const {
+ const absl::optional<std::u16string>& result_text) const {
return IsTextInputTypeNone() ||
- (!composition_changed_ && composition_.text.empty() &&
- result_text.length() == 1);
+ (!composition_changed_ && composition_.text.empty() && result_text &&
+ result_text->length() == 1);
}
ui::EventDispatchDetails InputMethodAuraLinux::SendFakeProcessKeyEvent(
@@ -562,8 +623,13 @@ ui::EventDispatchDetails InputMethodAuraLinux::SendFakeProcessKeyEvent(
return details;
}
-void InputMethodAuraLinux::ConfirmCompositionText() {
- ResetContext();
+void InputMethodAuraLinux::ConfirmCompositionText(bool keep_selection) {
+ auto* client = GetTextInputClient();
+ if (client)
+ client->ConfirmCompositionText(keep_selection);
+ composition_ = CompositionText();
+ composition_changed_ = false;
+ result_text_.reset();
}
} // namespace ui
diff --git a/chromium/ui/base/ime/linux/input_method_auralinux.h b/chromium/ui/base/ime/linux/input_method_auralinux.h
index 133cc14f696..bae76f53e25 100644
--- a/chromium/ui/base/ime/linux/input_method_auralinux.h
+++ b/chromium/ui/base/ime/linux/input_method_auralinux.h
@@ -22,12 +22,13 @@ class COMPONENT_EXPORT(UI_BASE_IME_LINUX) InputMethodAuraLinux
: public InputMethodBase,
public LinuxInputMethodContextDelegate {
public:
- explicit InputMethodAuraLinux(internal::InputMethodDelegate* delegate);
+ explicit InputMethodAuraLinux(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher);
InputMethodAuraLinux(const InputMethodAuraLinux&) = delete;
InputMethodAuraLinux& operator=(const InputMethodAuraLinux&) = delete;
~InputMethodAuraLinux() override;
- LinuxInputMethodContext* GetContextForTesting(bool is_simple);
+ LinuxInputMethodContext* GetContextForTesting();
// Overriden from InputMethod.
ui::EventDispatchDetails DispatchKeyEvent(ui::KeyEvent* event) override;
@@ -39,12 +40,18 @@ class COMPONENT_EXPORT(UI_BASE_IME_LINUX) InputMethodAuraLinux
// Overriden from ui::LinuxInputMethodContextDelegate
void OnCommit(const std::u16string& text) override;
+ void OnConfirmCompositionText(bool keep_selection) override;
void OnDeleteSurroundingText(size_t before, size_t after) override;
void OnPreeditChanged(const CompositionText& composition_text) override;
void OnPreeditEnd() override;
void OnPreeditStart() override {}
void OnSetPreeditRegion(const gfx::Range& range,
const std::vector<ImeTextSpan>& spans) override;
+ void OnClearGrammarFragments(const gfx::Range& range) override;
+ void OnAddGrammarFragment(const ui::GrammarFragment& fragment) override;
+ void OnSetAutocorrectRange(const gfx::Range& range) override;
+ void OnSetVirtualKeyboardOccludedBounds(
+ const gfx::Rect& screen_bounds) override;
protected:
// Overridden from InputMethodBase.
@@ -72,9 +79,9 @@ class COMPONENT_EXPORT(UI_BASE_IME_LINUX) InputMethodAuraLinux
// the client's composition string, specifically for async-mode case.
void OnPreeditUpdate(const ui::CompositionText& composition_text,
bool force_update_client);
- void ConfirmCompositionText();
+ void ConfirmCompositionText(bool keep_selection);
bool HasInputMethodResult();
- bool NeedInsertChar(const std::u16string& result_text) const;
+ bool NeedInsertChar(const absl::optional<std::u16string>& result_text) const;
[[nodiscard]] ui::EventDispatchDetails SendFakeProcessKeyEvent(
ui::KeyEvent* event) const;
void UpdateContextFocusState();
@@ -82,7 +89,6 @@ class COMPONENT_EXPORT(UI_BASE_IME_LINUX) InputMethodAuraLinux
bool IgnoringNonKeyInput() const;
std::unique_ptr<LinuxInputMethodContext> context_;
- std::unique_ptr<LinuxInputMethodContext> context_simple_;
// The last key event that IME is probably in process in
// async-mode.
@@ -91,7 +97,7 @@ class COMPONENT_EXPORT(UI_BASE_IME_LINUX) InputMethodAuraLinux
// Tracks last commit result during one key dispatch event.
absl::optional<CommitResult> last_commit_result_;
- std::u16string result_text_;
+ absl::optional<std::u16string> result_text_;
ui::CompositionText composition_;
diff --git a/chromium/ui/base/ime/linux/input_method_auralinux_unittest.cc b/chromium/ui/base/ime/linux/input_method_auralinux_unittest.cc
index 5e80ec1771f..357c68f727a 100644
--- a/chromium/ui/base/ime/linux/input_method_auralinux_unittest.cc
+++ b/chromium/ui/base/ime/linux/input_method_auralinux_unittest.cc
@@ -6,14 +6,17 @@
#include <stddef.h>
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/singleton.h"
#include "base/strings/string_split.h"
#include "base/strings/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/base/ime/dummy_text_input_client.h"
+#include "ui/base/ime/ime_key_event_dispatcher.h"
#include "ui/base/ime/init/input_method_initializer.h"
-#include "ui/base/ime/input_method_delegate.h"
-#include "ui/base/ime/linux/fake_input_method_context.h"
#include "ui/base/ime/linux/linux_input_method_context_factory.h"
#include "ui/base/ime/virtual_keyboard_controller_stub.h"
#include "ui/events/event.h"
@@ -60,13 +63,8 @@ class TestResult {
class LinuxInputMethodContextForTesting : public LinuxInputMethodContext {
public:
explicit LinuxInputMethodContextForTesting(
- LinuxInputMethodContextDelegate* delegate,
- bool is_simple)
- : delegate_(delegate),
- is_simple_(is_simple),
- is_sync_mode_(false),
- eat_key_(false),
- focused_(false) {}
+ LinuxInputMethodContextDelegate* delegate)
+ : delegate_(delegate), is_sync_mode_(false), eat_key_(false) {}
LinuxInputMethodContextForTesting(const LinuxInputMethodContextForTesting&) =
delete;
@@ -134,11 +132,10 @@ class LinuxInputMethodContextForTesting : public LinuxInputMethodContext {
// For the purposes of tests if kPropertyKeyboardImeFlag is not
// explicitly set assume the event is not a key event.
if (!properties)
- return false;
+ return true;
auto it = properties->find(kPropertyKeyboardImeFlag);
- if (it == properties->end()) {
- return false;
- }
+ if (it == properties->end())
+ return true;
return !(it->second[0] & kPropertyKeyboardImeIgnoredFlag);
}
@@ -146,13 +143,7 @@ class LinuxInputMethodContextForTesting : public LinuxInputMethodContext {
void UpdateFocus(bool has_client,
TextInputType old_type,
- TextInputType new_type) override {
- if (is_simple_) {
- focused_ = has_client;
- } else {
- focused_ = new_type != TEXT_INPUT_TYPE_NONE;
- }
- }
+ TextInputType new_type) override {}
void SetCursorLocation(const gfx::Rect& rect) override {
cursor_position_ = rect;
@@ -180,14 +171,17 @@ class LinuxInputMethodContextForTesting : public LinuxInputMethodContext {
should_do_learning_ = should_do_learning;
}
+ void SetGrammarFragmentAtCursor(
+ const ui::GrammarFragment& fragment) override {}
+ void SetAutocorrectInfo(const gfx::Range& autocorrect_range,
+ const gfx::Rect& autocorrect_bounds) override {}
+
private:
- LinuxInputMethodContextDelegate* delegate_;
+ raw_ptr<LinuxInputMethodContextDelegate> delegate_;
VirtualKeyboardControllerStub virtual_keyboard_controller_;
- const bool is_simple_;
std::vector<std::u16string> actions_;
bool is_sync_mode_;
bool eat_key_;
- bool focused_;
gfx::Rect cursor_position_;
TextInputType input_type_;
TextInputMode input_mode_;
@@ -195,25 +189,7 @@ class LinuxInputMethodContextForTesting : public LinuxInputMethodContext {
bool should_do_learning_;
};
-class LinuxInputMethodContextFactoryForTesting
- : public LinuxInputMethodContextFactory {
- public:
- LinuxInputMethodContextFactoryForTesting() {}
-
- LinuxInputMethodContextFactoryForTesting(
- const LinuxInputMethodContextFactoryForTesting&) = delete;
- LinuxInputMethodContextFactoryForTesting& operator=(
- const LinuxInputMethodContextFactoryForTesting&) = delete;
-
- std::unique_ptr<LinuxInputMethodContext> CreateInputMethodContext(
- LinuxInputMethodContextDelegate* delegate,
- bool is_simple) const override {
- return std::make_unique<LinuxInputMethodContextForTesting>(delegate,
- is_simple);
- }
-};
-
-class InputMethodDelegateForTesting : public internal::InputMethodDelegate {
+class InputMethodDelegateForTesting : public ImeKeyEventDispatcher {
public:
InputMethodDelegateForTesting() {}
@@ -254,6 +230,8 @@ class TextInputClientForTesting : public DummyTextInputClient {
gfx::Range selection_range;
std::u16string surrounding_text;
+ absl::optional<gfx::Rect> caret_not_in_rect;
+
protected:
void SetCompositionText(const CompositionText& composition) override {
composition_text = composition.text;
@@ -264,7 +242,7 @@ class TextInputClientForTesting : public DummyTextInputClient {
bool HasCompositionText() const override { return !composition_text.empty(); }
- uint32_t ConfirmCompositionText(bool keep_selection) override {
+ size_t ConfirmCompositionText(bool keep_selection) override {
// TODO(b/134473433) Modify this function so that when keep_selection is
// true, the selection is not changed when text committed
if (keep_selection) {
@@ -272,8 +250,7 @@ class TextInputClientForTesting : public DummyTextInputClient {
}
TestResult::GetInstance()->RecordAction(u"compositionend");
TestResult::GetInstance()->RecordAction(u"textinput:" + composition_text);
- const uint32_t composition_text_length =
- static_cast<uint32_t>(composition_text.length());
+ const size_t composition_text_length = composition_text.length();
composition_text.clear();
return composition_text_length;
}
@@ -295,7 +272,7 @@ class TextInputClientForTesting : public DummyTextInputClient {
void InsertChar(const ui::KeyEvent& event) override {
std::stringstream ss;
- ss << event.GetCharacter();
+ ss << static_cast<uint16_t>(event.GetCharacter());
TestResult::GetInstance()->RecordAction(u"keypress:" +
base::ASCIIToUTF16(ss.str()));
}
@@ -315,6 +292,10 @@ class TextInputClientForTesting : public DummyTextInputClient {
*text = surrounding_text.substr(range.GetMin(), range.length());
return true;
}
+
+ void EnsureCaretNotInRect(const gfx::Rect& rect) override {
+ caret_not_in_rect = rect;
+ }
};
class InputMethodAuraLinuxTest : public testing::Test {
@@ -324,18 +305,18 @@ class InputMethodAuraLinuxTest : public testing::Test {
protected:
InputMethodAuraLinuxTest()
- : factory_(nullptr),
- input_method_auralinux_(nullptr),
+ : input_method_auralinux_(nullptr),
delegate_(nullptr),
- context_(nullptr),
- context_simple_(nullptr) {
- factory_ = new LinuxInputMethodContextFactoryForTesting();
- LinuxInputMethodContextFactory::SetInstance(factory_);
+ context_(nullptr) {
+ GetInputMethodContextFactoryForTest() =
+ base::BindRepeating([](LinuxInputMethodContextDelegate* delegate)
+ -> std::unique_ptr<LinuxInputMethodContext> {
+ return std::make_unique<LinuxInputMethodContextForTesting>(delegate);
+ });
test_result_ = TestResult::GetInstance();
}
~InputMethodAuraLinuxTest() override {
- delete factory_;
- factory_ = nullptr;
+ ShutdownInputMethodForTesting();
test_result_ = nullptr;
}
@@ -344,20 +325,13 @@ class InputMethodAuraLinuxTest : public testing::Test {
input_method_auralinux_ = new InputMethodAuraLinux(delegate_);
input_method_auralinux_->OnFocus();
context_ = static_cast<LinuxInputMethodContextForTesting*>(
- input_method_auralinux_->GetContextForTesting(false));
- context_simple_ = static_cast<LinuxInputMethodContextForTesting*>(
- input_method_auralinux_->GetContextForTesting(true));
+ input_method_auralinux_->GetContextForTesting());
}
void TearDown() override {
context_->SetSyncMode(false);
context_->SetEatKey(false);
-
- context_simple_->SetSyncMode(false);
- context_simple_->SetEatKey(false);
-
context_ = nullptr;
- context_simple_ = nullptr;
delete input_method_auralinux_;
input_method_auralinux_ = nullptr;
@@ -365,12 +339,10 @@ class InputMethodAuraLinuxTest : public testing::Test {
delegate_ = nullptr;
}
- LinuxInputMethodContextFactoryForTesting* factory_;
- InputMethodAuraLinux* input_method_auralinux_;
- InputMethodDelegateForTesting* delegate_;
- LinuxInputMethodContextForTesting* context_;
- LinuxInputMethodContextForTesting* context_simple_;
- TestResult* test_result_;
+ raw_ptr<InputMethodAuraLinux> input_method_auralinux_;
+ raw_ptr<InputMethodDelegateForTesting> delegate_;
+ raw_ptr<LinuxInputMethodContextForTesting> context_;
+ raw_ptr<TestResult> test_result_;
};
TEST_F(InputMethodAuraLinuxTest, BasicSyncModeTest) {
@@ -396,8 +368,7 @@ TEST_F(InputMethodAuraLinuxTest, BasicSyncModeTest) {
input_method_auralinux_->DetachTextInputClient(client.get());
client =
std::make_unique<TextInputClientForTesting>(TEXT_INPUT_TYPE_PASSWORD);
- context_simple_->SetSyncMode(true);
- context_simple_->SetEatKey(false);
+ context_->SetEatKey(false);
input_method_auralinux_->SetFocusedTextInputClient(client.get());
input_method_auralinux_->OnTextInputTypeChanged(client.get());
@@ -438,8 +409,7 @@ TEST_F(InputMethodAuraLinuxTest, BasicAsyncModeTest) {
input_method_auralinux_->DetachTextInputClient(client.get());
client =
std::make_unique<TextInputClientForTesting>(TEXT_INPUT_TYPE_PASSWORD);
- context_simple_->SetSyncMode(false);
- context_simple_->SetEatKey(false);
+ context_->SetEatKey(false);
input_method_auralinux_->SetFocusedTextInputClient(client.get());
input_method_auralinux_->OnTextInputTypeChanged(client.get());
@@ -562,6 +532,38 @@ TEST_F(InputMethodAuraLinuxTest, JapaneseCommit) {
test_result_->Verify();
}
+TEST_F(InputMethodAuraLinuxTest, EmptyCommit) {
+ context_->SetSyncMode(false);
+ context_->SetEatKey(true);
+
+ std::unique_ptr<TextInputClientForTesting> client(
+ new TextInputClientForTesting(TEXT_INPUT_TYPE_TEXT));
+ input_method_auralinux_->SetFocusedTextInputClient(client.get());
+ input_method_auralinux_->OnTextInputTypeChanged(client.get());
+ KeyEvent key(ET_KEY_PRESSED, VKEY_A, 0);
+ key.set_character(L'a');
+ input_method_auralinux_->DispatchKeyEvent(&key);
+
+ input_method_auralinux_->OnPreeditStart();
+ CompositionText comp;
+ comp.text = u"a";
+ input_method_auralinux_->OnPreeditChanged(comp);
+
+ test_result_->ExpectAction("keydown:229");
+ test_result_->ExpectAction("compositionstart");
+ test_result_->ExpectAction("compositionupdate:a");
+ test_result_->Verify();
+
+ input_method_auralinux_->OnCommit(u"");
+ comp.text = u"";
+ input_method_auralinux_->OnPreeditChanged(comp);
+ input_method_auralinux_->OnPreeditEnd();
+
+ test_result_->ExpectAction("compositionend");
+ test_result_->ExpectAction("textinput:");
+ test_result_->Verify();
+}
+
// crbug.com/463491
void DeadKeyTest(TextInputType text_input_type,
InputMethodAuraLinux* input_method_auralinux,
@@ -619,8 +621,8 @@ TEST_F(InputMethodAuraLinuxTest, DeadKeyTest) {
test_result_);
}
-TEST_F(InputMethodAuraLinuxTest, DeadKeySimpleContextTest) {
- DeadKeyTest(TEXT_INPUT_TYPE_NONE, input_method_auralinux_, context_simple_,
+TEST_F(InputMethodAuraLinuxTest, DeadKeyTestTypeNone) {
+ DeadKeyTest(TEXT_INPUT_TYPE_NONE, input_method_auralinux_, context_,
test_result_);
}
@@ -628,15 +630,15 @@ TEST_F(InputMethodAuraLinuxTest, DeadKeySimpleContextTest) {
// consumed by IME. In that case, the peek key should not be dispatched.
TEST_F(InputMethodAuraLinuxTest, MockWaylandEventsTest) {
KeyEvent peek_key(ET_KEY_PRESSED, VKEY_TAB, 0);
- ui::Event::Properties properties;
- properties[ui::kPropertyKeyboardImeFlag] =
- std::vector<uint8_t>(ui::kPropertyKeyboardImeIgnoredFlag);
- peek_key.SetProperties(properties);
input_method_auralinux_->DispatchKeyEvent(&peek_key);
// No expected action for peek key events.
test_result_->Verify();
KeyEvent key(ET_KEY_PRESSED, VKEY_TAB, 0);
+ ui::Event::Properties properties;
+ properties[ui::kPropertyKeyboardImeFlag] =
+ std::vector<uint8_t>({ui::kPropertyKeyboardImeIgnoredFlag});
+ key.SetProperties(properties);
input_method_auralinux_->DispatchKeyEvent(&key);
test_result_->ExpectAction("keydown:9");
test_result_->Verify();
@@ -756,6 +758,7 @@ TEST_F(InputMethodAuraLinuxTest, CompositionEndWithEmptyCommitTest) {
test_result_->ExpectAction("keydown:229");
test_result_->ExpectAction("compositionend");
+ test_result_->ExpectAction("textinput:");
test_result_->Verify();
}
@@ -948,6 +951,18 @@ TEST_F(InputMethodAuraLinuxTest, ReleaseKeyTest) {
test_result_->Verify();
}
+TEST_F(InputMethodAuraLinuxTest, ReleaseKeyTest_PeekKey) {
+ context_->SetSyncMode(true);
+ context_->SetEatKey(true);
+
+ KeyEvent key(ET_KEY_RELEASED, VKEY_A, 0);
+ key.set_character(L'A');
+ input_method_auralinux_->DispatchKeyEvent(&key);
+
+ test_result_->ExpectAction("keyup:65");
+ test_result_->Verify();
+}
+
TEST_F(InputMethodAuraLinuxTest, SurroundingText_NoSelectionTest) {
std::unique_ptr<TextInputClientForTesting> client(
new TextInputClientForTesting(TEXT_INPUT_TYPE_TEXT));
@@ -1002,6 +1017,73 @@ TEST_F(InputMethodAuraLinuxTest, SurroundingText_PartialText) {
test_result_->Verify();
}
+TEST_F(InputMethodAuraLinuxTest, SetPreeditRegionSingleCharTest) {
+ std::unique_ptr<TextInputClientForTesting> client(
+ new TextInputClientForTesting(TEXT_INPUT_TYPE_TEXT));
+ input_method_auralinux_->SetFocusedTextInputClient(client.get());
+ input_method_auralinux_->OnTextInputTypeChanged(client.get());
+
+ client->surrounding_text = u"a";
+ client->text_range = gfx::Range(0, 1);
+ client->selection_range = gfx::Range(1, 1);
+
+ input_method_auralinux_->OnCaretBoundsChanged(client.get());
+ input_method_auralinux_->OnSetPreeditRegion(client->text_range,
+ std::vector<ImeTextSpan>());
+
+ test_result_->ExpectAction("surroundingtext:a");
+ test_result_->ExpectAction("selectionrangestart:1");
+ test_result_->ExpectAction("selectionrangeend:1");
+
+ input_method_auralinux_->OnCommit(u"a");
+
+ // Verifies single char commit under composition mode will call InsertText
+ // instead of InsertChar.
+ test_result_->ExpectAction("textinput:a");
+ test_result_->Verify();
+}
+
+TEST_F(InputMethodAuraLinuxTest, SetPreeditRegionCompositionEndTest) {
+ std::unique_ptr<TextInputClientForTesting> client(
+ new TextInputClientForTesting(TEXT_INPUT_TYPE_TEXT));
+ input_method_auralinux_->SetFocusedTextInputClient(client.get());
+ input_method_auralinux_->OnTextInputTypeChanged(client.get());
+
+ input_method_auralinux_->OnCommit(u"a");
+
+ test_result_->ExpectAction("keypress:97");
+
+ client->surrounding_text = u"a";
+ client->text_range = gfx::Range(0, 1);
+ client->selection_range = gfx::Range(1, 1);
+
+ input_method_auralinux_->OnCaretBoundsChanged(client.get());
+ input_method_auralinux_->OnSetPreeditRegion(client->text_range,
+ std::vector<ImeTextSpan>());
+
+ test_result_->ExpectAction("surroundingtext:a");
+ test_result_->ExpectAction("selectionrangestart:1");
+ test_result_->ExpectAction("selectionrangeend:1");
+
+ CompositionText comp;
+ comp.text = u"";
+ input_method_auralinux_->OnPreeditChanged(comp);
+
+ test_result_->ExpectAction("compositionend");
+ test_result_->Verify();
+}
+
+TEST_F(InputMethodAuraLinuxTest, OnSetVirtualKeyboardOccludedBounds) {
+ auto client =
+ std::make_unique<TextInputClientForTesting>(TEXT_INPUT_TYPE_TEXT);
+ input_method_auralinux_->SetFocusedTextInputClient(client.get());
+
+ constexpr gfx::Rect kBounds(10, 20, 300, 400);
+ input_method_auralinux_->OnSetVirtualKeyboardOccludedBounds(kBounds);
+
+ EXPECT_EQ(client->caret_not_in_rect, kBounds);
+}
+
TEST_F(InputMethodAuraLinuxTest, GetVirtualKeyboardController) {
EXPECT_EQ(input_method_auralinux_->GetVirtualKeyboardController(),
context_->GetVirtualKeyboardController());
diff --git a/chromium/ui/base/ime/linux/linux_input_method_context.h b/chromium/ui/base/ime/linux/linux_input_method_context.h
index b34965cdc23..695b54cebb5 100644
--- a/chromium/ui/base/ime/linux/linux_input_method_context.h
+++ b/chromium/ui/base/ime/linux/linux_input_method_context.h
@@ -11,6 +11,7 @@
#include <vector>
#include "base/component_export.h"
+#include "ui/base/ime/grammar_fragment.h"
#include "ui/base/ime/text_input_mode.h"
#include "ui/base/ime/text_input_type.h"
@@ -54,6 +55,15 @@ class COMPONENT_EXPORT(UI_BASE_IME_LINUX) LinuxInputMethodContext {
uint32_t flags,
bool should_do_learning) = 0;
+ // Sets grammar fragment at the cursor position. If not exists, sends a
+ // fragment with empty range.
+ virtual void SetGrammarFragmentAtCursor(
+ const ui::GrammarFragment& fragment) = 0;
+
+ // Tells Ash about the current autocorrect information.
+ virtual void SetAutocorrectInfo(const gfx::Range& autocorrect_range,
+ const gfx::Rect& autocorrect_bounds) = 0;
+
// Resets the context. A client needs to call OnTextInputTypeChanged() again
// before calling DispatchKeyEvent().
virtual void Reset() = 0;
@@ -76,6 +86,9 @@ class COMPONENT_EXPORT(UI_BASE_IME_LINUX) LinuxInputMethodContextDelegate {
// Commits the |text| to the text input client.
virtual void OnCommit(const std::u16string& text) = 0;
+ // Converts current composition text into final content.
+ virtual void OnConfirmCompositionText(bool keep_selection) = 0;
+
// Deletes the surrounding text around selection. |before| and |after|
// are in UTF-16 code points.
virtual void OnDeleteSurroundingText(size_t before, size_t after) = 0;
@@ -94,6 +107,23 @@ class COMPONENT_EXPORT(UI_BASE_IME_LINUX) LinuxInputMethodContextDelegate {
// |range| is in UTF-16 code range.
virtual void OnSetPreeditRegion(const gfx::Range& range,
const std::vector<ImeTextSpan>& spans) = 0;
+
+ // Clears all the grammar fragments in |range|. All indices are measured in
+ // UTF-16 code point.
+ virtual void OnClearGrammarFragments(const gfx::Range& range) = 0;
+
+ // Adds a new grammar marker according to |fragments|. Clients should show
+ // some visual indications such as underlining. All indices are measured in
+ // UTF-16 code point.
+ virtual void OnAddGrammarFragment(const ui::GrammarFragment& fragment) = 0;
+
+ // Sets the autocorrect range in the text input client.
+ // |range| is in UTF-16 code range.
+ virtual void OnSetAutocorrectRange(const gfx::Range& range) = 0;
+
+ // Sets the virtual keyboard's occluded bounds in screen DIP.
+ virtual void OnSetVirtualKeyboardOccludedBounds(
+ const gfx::Rect& screen_bounds) = 0;
};
} // namespace ui
diff --git a/chromium/ui/base/ime/linux/linux_input_method_context_factory.cc b/chromium/ui/base/ime/linux/linux_input_method_context_factory.cc
index 4ba27502284..4c001097842 100644
--- a/chromium/ui/base/ime/linux/linux_input_method_context_factory.cc
+++ b/chromium/ui/base/ime/linux/linux_input_method_context_factory.cc
@@ -4,25 +4,50 @@
#include "ui/base/ime/linux/linux_input_method_context_factory.h"
-namespace {
+#include "base/callback.h"
+#include "base/no_destructor.h"
+#include "build/build_config.h"
+#include "ui/base/ime/linux/fake_input_method_context.h"
-const ui::LinuxInputMethodContextFactory* g_linux_input_method_context_factory =
- NULL;
-
-} // namespace
+#if BUILDFLAG(IS_LINUX)
+#include "ui/linux/linux_ui.h"
+#include "ui/linux/linux_ui_delegate.h"
+#endif
namespace ui {
-// static
-const LinuxInputMethodContextFactory*
-LinuxInputMethodContextFactory::instance() {
- return g_linux_input_method_context_factory;
+LinuxInputMethodContextFactory& GetInputMethodContextFactoryForOzone() {
+ static base::NoDestructor<LinuxInputMethodContextFactory> factory;
+ return *factory;
+}
+
+LinuxInputMethodContextFactory& GetInputMethodContextFactoryForTest() {
+ static base::NoDestructor<LinuxInputMethodContextFactory> factory;
+ return *factory;
}
-// static
-void LinuxInputMethodContextFactory::SetInstance(
- const LinuxInputMethodContextFactory* instance) {
- g_linux_input_method_context_factory = instance;
+std::unique_ptr<LinuxInputMethodContext> CreateLinuxInputMethodContext(
+ LinuxInputMethodContextDelegate* delegate) {
+ // First, give the test-provided factory a chance to create the context.
+ if (auto factory = GetInputMethodContextFactoryForTest())
+ return factory.Run(delegate);
+
+#if BUILDFLAG(IS_LINUX)
+ // Give the toolkit a chance to create the context.
+ if (auto* linux_ui = LinuxUi::instance()) {
+ if (auto context = linux_ui->CreateInputMethodContext(delegate))
+ return context;
+ }
+#endif
+
+ // Finally, give the ozone platform a chance.
+ if (auto factory = GetInputMethodContextFactoryForOzone()) {
+ if (auto context = factory.Run(delegate))
+ return context;
+ }
+
+ // As a last resort, use a fake context.
+ return std::make_unique<FakeInputMethodContext>();
}
} // namespace ui
diff --git a/chromium/ui/base/ime/linux/linux_input_method_context_factory.h b/chromium/ui/base/ime/linux/linux_input_method_context_factory.h
index 4d30a968f3d..7aea00f9c5d 100644
--- a/chromium/ui/base/ime/linux/linux_input_method_context_factory.h
+++ b/chromium/ui/base/ime/linux/linux_input_method_context_factory.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/callback_forward.h"
#include "base/component_export.h"
namespace ui {
@@ -14,26 +15,22 @@ namespace ui {
class LinuxInputMethodContext;
class LinuxInputMethodContextDelegate;
-// An interface that lets different Linux platforms override the
-// CreateInputMethodContext function declared here to return native input method
-// contexts.
-class COMPONENT_EXPORT(UI_BASE_IME_LINUX) LinuxInputMethodContextFactory {
- public:
- // Returns the current active factory or NULL.
- static const LinuxInputMethodContextFactory* instance();
-
- // Sets the dynamically loaded singleton that creates an input method context.
- // This pointer is not owned, and if this method is called a second time,
- // the first instance is not deleted.
- static void SetInstance(const LinuxInputMethodContextFactory* instance);
-
- virtual ~LinuxInputMethodContextFactory() {}
-
- // Returns a native input method context.
- virtual std::unique_ptr<LinuxInputMethodContext> CreateInputMethodContext(
- LinuxInputMethodContextDelegate* delegate,
- bool is_simple) const = 0;
-};
+using LinuxInputMethodContextFactory =
+ base::RepeatingCallback<std::unique_ptr<ui::LinuxInputMethodContext>(
+ LinuxInputMethodContextDelegate*)>;
+
+// Callers may set the returned reference to set the factory.
+COMPONENT_EXPORT(UI_BASE_IME_LINUX)
+LinuxInputMethodContextFactory& GetInputMethodContextFactoryForOzone();
+
+// The test context factory has higher precedence than the ozone factory.
+COMPONENT_EXPORT(UI_BASE_IME_LINUX)
+LinuxInputMethodContextFactory& GetInputMethodContextFactoryForTest();
+
+// Returns a platform specific input method context.
+COMPONENT_EXPORT(UI_BASE_IME_LINUX)
+std::unique_ptr<LinuxInputMethodContext> CreateLinuxInputMethodContext(
+ LinuxInputMethodContextDelegate* delegate);
} // namespace ui
diff --git a/chromium/ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.cc b/chromium/ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.cc
deleted file mode 100644
index aaa8ca88f34..00000000000
--- a/chromium/ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h"
-
-namespace ui {
-
-namespace {
-// Optional delegate. Unowned pointer.
-TextEditKeyBindingsDelegateAuraLinux* text_edit_keybinding_delegate_ = 0;
-}
-
-void SetTextEditKeyBindingsDelegate(
- TextEditKeyBindingsDelegateAuraLinux* delegate) {
- text_edit_keybinding_delegate_ = delegate;
-}
-
-TextEditKeyBindingsDelegateAuraLinux* GetTextEditKeyBindingsDelegate() {
- return text_edit_keybinding_delegate_;
-}
-
-} // namespace ui
diff --git a/chromium/ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h b/chromium/ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h
deleted file mode 100644
index 560929a4cab..00000000000
--- a/chromium/ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_BASE_IME_LINUX_TEXT_EDIT_KEY_BINDINGS_DELEGATE_AURALINUX_H_
-#define UI_BASE_IME_LINUX_TEXT_EDIT_KEY_BINDINGS_DELEGATE_AURALINUX_H_
-
-#include <vector>
-
-#include "base/component_export.h"
-
-namespace ui {
-class Event;
-class TextEditCommandAuraLinux;
-
-// An interface which can interpret various text editing commands out of key
-// events.
-//
-// On desktop Linux, we've traditionally supported the user's custom
-// keybindings. We need to support this in both content/ and in views/.
-class COMPONENT_EXPORT(UI_BASE_IME_LINUX) TextEditKeyBindingsDelegateAuraLinux {
- public:
- // Matches a key event against the users' platform specific key bindings,
- // false will be returned if the key event doesn't correspond to a predefined
- // key binding. Edit commands matched with |event| will be stored in
- // |edit_commands|, if |edit_commands| is non-NULL.
- virtual bool MatchEvent(const ui::Event& event,
- std::vector<TextEditCommandAuraLinux>* commands) = 0;
-
- protected:
- virtual ~TextEditKeyBindingsDelegateAuraLinux() {}
-};
-
-// Sets/Gets the global TextEditKeyBindingsDelegateAuraLinux. No ownership
-// changes. Can be NULL.
-COMPONENT_EXPORT(UI_BASE_IME_LINUX)
-void SetTextEditKeyBindingsDelegate(
- TextEditKeyBindingsDelegateAuraLinux* delegate);
-COMPONENT_EXPORT(UI_BASE_IME_LINUX)
-TextEditKeyBindingsDelegateAuraLinux* GetTextEditKeyBindingsDelegate();
-
-} // namespace ui
-
-#endif // UI_BASE_IME_LINUX_TEXT_EDIT_KEY_BINDINGS_DELEGATE_AURALINUX_H_
diff --git a/chromium/ui/base/ime/mac/input_method_mac.h b/chromium/ui/base/ime/mac/input_method_mac.h
index 7e606b05f20..4602834093f 100644
--- a/chromium/ui/base/ime/mac/input_method_mac.h
+++ b/chromium/ui/base/ime/mac/input_method_mac.h
@@ -17,7 +17,7 @@ namespace ui {
class COMPONENT_EXPORT(UI_BASE_IME_MAC) InputMethodMac
: public InputMethodBase {
public:
- explicit InputMethodMac(internal::InputMethodDelegate* delegate);
+ explicit InputMethodMac(ImeKeyEventDispatcher* ime_key_event_dispatcher);
InputMethodMac(const InputMethodMac&) = delete;
InputMethodMac& operator=(const InputMethodMac&) = delete;
diff --git a/chromium/ui/base/ime/mac/input_method_mac.mm b/chromium/ui/base/ime/mac/input_method_mac.mm
index ea0ff87831f..29d6a4fda85 100644
--- a/chromium/ui/base/ime/mac/input_method_mac.mm
+++ b/chromium/ui/base/ime/mac/input_method_mac.mm
@@ -8,8 +8,8 @@
namespace ui {
-InputMethodMac::InputMethodMac(internal::InputMethodDelegate* delegate)
- : InputMethodBase(delegate) {}
+InputMethodMac::InputMethodMac(ImeKeyEventDispatcher* ime_key_event_dispatcher)
+ : InputMethodBase(ime_key_event_dispatcher) {}
InputMethodMac::~InputMethodMac() {
}
diff --git a/chromium/ui/base/ime/mock_input_method.cc b/chromium/ui/base/ime/mock_input_method.cc
index b634571dbd7..c9536c076d9 100644
--- a/chromium/ui/base/ime/mock_input_method.cc
+++ b/chromium/ui/base/ime/mock_input_method.cc
@@ -8,7 +8,7 @@
#include "base/callback_helpers.h"
#include "base/observer_list.h"
#include "build/build_config.h"
-#include "ui/base/ime/input_method_delegate.h"
+#include "ui/base/ime/ime_key_event_dispatcher.h"
#include "ui/base/ime/text_input_client.h"
#include "ui/events/event.h"
@@ -18,16 +18,19 @@
namespace ui {
-MockInputMethod::MockInputMethod(internal::InputMethodDelegate* delegate)
- : text_input_client_(nullptr), delegate_(delegate) {}
+MockInputMethod::MockInputMethod(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher)
+ : text_input_client_(nullptr),
+ ime_key_event_dispatcher_(ime_key_event_dispatcher) {}
MockInputMethod::~MockInputMethod() {
for (InputMethodObserver& observer : observer_list_)
observer.OnInputMethodDestroyed(this);
}
-void MockInputMethod::SetDelegate(internal::InputMethodDelegate* delegate) {
- delegate_ = delegate;
+void MockInputMethod::SetImeKeyEventDispatcher(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher) {
+ ime_key_event_dispatcher_ = ime_key_event_dispatcher;
}
void MockInputMethod::SetFocusedTextInputClient(TextInputClient* client) {
@@ -55,7 +58,7 @@ ui::EventDispatchDetails MockInputMethod::DispatchKeyEvent(
if (event->handled())
return EventDispatchDetails();
}
- return delegate_->DispatchKeyEventPostIME(event);
+ return ime_key_event_dispatcher_->DispatchKeyEventPostIME(event);
}
void MockInputMethod::OnFocus() {
diff --git a/chromium/ui/base/ime/mock_input_method.h b/chromium/ui/base/ime/mock_input_method.h
index d86a85c6b69..46b58227d20 100644
--- a/chromium/ui/base/ime/mock_input_method.h
+++ b/chromium/ui/base/ime/mock_input_method.h
@@ -25,7 +25,7 @@ class TextInputClient;
// ui/base/ime/init/input_method_factory.h
class COMPONENT_EXPORT(UI_BASE_IME) MockInputMethod : public InputMethod {
public:
- explicit MockInputMethod(internal::InputMethodDelegate* delegate);
+ explicit MockInputMethod(ImeKeyEventDispatcher* ime_key_event_dispatcher);
MockInputMethod(const MockInputMethod&) = delete;
MockInputMethod& operator=(const MockInputMethod&) = delete;
@@ -33,7 +33,8 @@ class COMPONENT_EXPORT(UI_BASE_IME) MockInputMethod : public InputMethod {
~MockInputMethod() override;
// Overriden from InputMethod.
- void SetDelegate(internal::InputMethodDelegate* delegate) override;
+ void SetImeKeyEventDispatcher(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher) override;
void OnFocus() override;
void OnBlur() override;
void OnTouch(ui::EventPointerType pointerType) override;
@@ -62,7 +63,7 @@ class COMPONENT_EXPORT(UI_BASE_IME) MockInputMethod : public InputMethod {
private:
raw_ptr<TextInputClient> text_input_client_;
base::ObserverList<InputMethodObserver>::Unchecked observer_list_;
- raw_ptr<internal::InputMethodDelegate> delegate_;
+ raw_ptr<ImeKeyEventDispatcher> ime_key_event_dispatcher_;
VirtualKeyboardControllerStub keyboard_controller_;
};
diff --git a/chromium/ui/base/ime/mojom/ime_types_mojom_traits.h b/chromium/ui/base/ime/mojom/ime_types_mojom_traits.h
index 50489fadc75..bd8235db46f 100644
--- a/chromium/ui/base/ime/mojom/ime_types_mojom_traits.h
+++ b/chromium/ui/base/ime/mojom/ime_types_mojom_traits.h
@@ -43,10 +43,10 @@ template <>
struct COMPONENT_EXPORT(IME_SHARED_MOJOM_TRAITS)
StructTraits<ui::mojom::ImeTextSpanDataView, ui::ImeTextSpan> {
static ui::ImeTextSpan::Type type(const ui::ImeTextSpan& c) { return c.type; }
- static uint32_t start_offset(const ui::ImeTextSpan& c) {
+ static size_t start_offset(const ui::ImeTextSpan& c) {
return c.start_offset;
}
- static uint32_t end_offset(const ui::ImeTextSpan& c) { return c.end_offset; }
+ static size_t end_offset(const ui::ImeTextSpan& c) { return c.end_offset; }
static uint32_t underline_color(const ui::ImeTextSpan& c) {
return c.underline_color;
}
diff --git a/chromium/ui/base/ime/text_input_client.h b/chromium/ui/base/ime/text_input_client.h
index 7c1d74e195f..5b7b2551c6e 100644
--- a/chromium/ui/base/ime/text_input_client.h
+++ b/chromium/ui/base/ime/text_input_client.h
@@ -19,7 +19,7 @@
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/base/ime/composition_text.h"
#include "ui/base/ime/grammar_fragment.h"
-#include "ui/base/ime/input_method_delegate.h"
+#include "ui/base/ime/ime_key_event_dispatcher.h"
#include "ui/base/ime/text_input_mode.h"
#include "ui/base/ime/text_input_type.h"
#include "ui/gfx/native_widget_types.h"
@@ -79,8 +79,8 @@ class COMPONENT_EXPORT(UI_BASE_IME) TextInputClient {
// otherwise, set it to be after the newly committed text.
// If text was committed, return the number of characters committed.
// If we do not know what the number of characters committed is, return
- // UINT32_MAX.
- virtual uint32_t ConfirmCompositionText(bool keep_selection) = 0;
+ // std::numeric_limits<size_t>::max().
+ virtual size_t ConfirmCompositionText(bool keep_selection) = 0;
// Removes current composition text.
virtual void ClearCompositionText() = 0;
@@ -146,7 +146,7 @@ class COMPONENT_EXPORT(UI_BASE_IME) TextInputClient {
// The |index| is zero-based index of character position in composition text.
// Returns false if there is no composition text or |index| is out of range.
// The |rect| is not touched in the case of failure.
- virtual bool GetCompositionCharacterBounds(uint32_t index,
+ virtual bool GetCompositionCharacterBounds(size_t index,
gfx::Rect* rect) const = 0;
// Returns true if there is composition text.
@@ -177,6 +177,7 @@ class COMPONENT_EXPORT(UI_BASE_IME) TextInputClient {
// Returns false if the operation is not supported.
virtual bool SetEditableSelectionRange(const gfx::Range& range) = 0;
+#if BUILDFLAG(IS_MAC)
// Deletes contents in the given UTF-16 code unit range. Current
// composition text will be confirmed before deleting the range.
// The input caret will be moved to the place where the range gets deleted.
@@ -186,6 +187,7 @@ class COMPONENT_EXPORT(UI_BASE_IME) TextInputClient {
// between browser and renderer. Returns false if the operation is not
// supported.
virtual bool DeleteRange(const gfx::Range& range) = 0;
+#endif
// Retrieves the text content in a given UTF-16 code unit range.
// The result will be stored into |*text|.
diff --git a/chromium/ui/base/ime/virtual_keyboard_controller_stub.cc b/chromium/ui/base/ime/virtual_keyboard_controller_stub.cc
index e48f421114d..140ce709097 100644
--- a/chromium/ui/base/ime/virtual_keyboard_controller_stub.cc
+++ b/chromium/ui/base/ime/virtual_keyboard_controller_stub.cc
@@ -3,28 +3,42 @@
// found in the LICENSE file.
#include "ui/base/ime/virtual_keyboard_controller_stub.h"
+#include "ui/gfx/geometry/rect.h"
namespace ui {
// VirtualKeyboardControllerStub member definitions.
-VirtualKeyboardControllerStub::VirtualKeyboardControllerStub() {}
+VirtualKeyboardControllerStub::VirtualKeyboardControllerStub() = default;
-VirtualKeyboardControllerStub::~VirtualKeyboardControllerStub() {}
+VirtualKeyboardControllerStub::~VirtualKeyboardControllerStub() = default;
bool VirtualKeyboardControllerStub::DisplayVirtualKeyboard() {
- return false;
+ visible_ = true;
+ for (auto& observer : observers_) {
+ observer.OnKeyboardVisible({});
+ }
+ return true;
}
-void VirtualKeyboardControllerStub::DismissVirtualKeyboard() {}
+void VirtualKeyboardControllerStub::DismissVirtualKeyboard() {
+ visible_ = false;
+ for (auto& observer : observers_) {
+ observer.OnKeyboardHidden();
+ }
+}
void VirtualKeyboardControllerStub::AddObserver(
- VirtualKeyboardControllerObserver* observer) {}
+ VirtualKeyboardControllerObserver* observer) {
+ observers_.AddObserver(observer);
+}
void VirtualKeyboardControllerStub::RemoveObserver(
- VirtualKeyboardControllerObserver* observer) {}
+ VirtualKeyboardControllerObserver* observer) {
+ observers_.RemoveObserver(observer);
+}
bool VirtualKeyboardControllerStub::IsKeyboardVisible() {
- return false;
+ return visible_;
}
} // namespace ui
diff --git a/chromium/ui/base/ime/virtual_keyboard_controller_stub.h b/chromium/ui/base/ime/virtual_keyboard_controller_stub.h
index f0b9a88858a..a094ce5f204 100644
--- a/chromium/ui/base/ime/virtual_keyboard_controller_stub.h
+++ b/chromium/ui/base/ime/virtual_keyboard_controller_stub.h
@@ -6,11 +6,14 @@
#define UI_BASE_IME_VIRTUAL_KEYBOARD_CONTROLLER_STUB_H_
#include "base/component_export.h"
+#include "base/observer_list.h"
#include "ui/base/ime/virtual_keyboard_controller.h"
+#include "ui/base/ime/virtual_keyboard_controller_observer.h"
namespace ui {
-// This class provides a stub VirtualKeyboardController.
+// TODO(aluh): Rename to fake.
+// This class provides a fake VirtualKeyboardController with minimal behavior.
class COMPONENT_EXPORT(UI_BASE_IME) VirtualKeyboardControllerStub final
: public VirtualKeyboardController {
public:
@@ -28,6 +31,10 @@ class COMPONENT_EXPORT(UI_BASE_IME) VirtualKeyboardControllerStub final
void AddObserver(VirtualKeyboardControllerObserver* observer) override;
void RemoveObserver(VirtualKeyboardControllerObserver* observer) override;
bool IsKeyboardVisible() override;
+
+ private:
+ base::ObserverList<VirtualKeyboardControllerObserver>::Unchecked observers_;
+ bool visible_ = false;
};
} // namespace ui
diff --git a/chromium/ui/base/ime/win/input_method_win_base.cc b/chromium/ui/base/ime/win/input_method_win_base.cc
index 15bc17eee38..a9ffb03dfd1 100644
--- a/chromium/ui/base/ime/win/input_method_win_base.cc
+++ b/chromium/ui/base/ime/win/input_method_win_base.cc
@@ -155,9 +155,10 @@ ui::EventDispatchDetails DispatcherDestroyedDetails() {
} // namespace
-InputMethodWinBase::InputMethodWinBase(internal::InputMethodDelegate* delegate,
- HWND attached_window_handle)
- : InputMethodBase(delegate,
+InputMethodWinBase::InputMethodWinBase(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher,
+ HWND attached_window_handle)
+ : InputMethodBase(ime_key_event_dispatcher,
CreateKeyboardController(attached_window_handle)),
attached_window_handle_(attached_window_handle),
pending_requested_direction_(base::i18n::UNKNOWN_DIRECTION) {}
diff --git a/chromium/ui/base/ime/win/input_method_win_base.h b/chromium/ui/base/ime/win/input_method_win_base.h
index 891dbd9318a..1c40809fed7 100644
--- a/chromium/ui/base/ime/win/input_method_win_base.h
+++ b/chromium/ui/base/ime/win/input_method_win_base.h
@@ -17,7 +17,7 @@ namespace ui {
class COMPONENT_EXPORT(UI_BASE_IME_WIN) InputMethodWinBase
: public InputMethodBase {
public:
- InputMethodWinBase(internal::InputMethodDelegate* delegate,
+ InputMethodWinBase(ImeKeyEventDispatcher* ime_key_event_dispatcher,
HWND attached_window_handle);
InputMethodWinBase(const InputMethodWinBase&) = delete;
diff --git a/chromium/ui/base/ime/win/input_method_win_imm32.cc b/chromium/ui/base/ime/win/input_method_win_imm32.cc
index 59a4577487a..ad2217216e8 100644
--- a/chromium/ui/base/ime/win/input_method_win_imm32.cc
+++ b/chromium/ui/base/ime/win/input_method_win_imm32.cc
@@ -24,9 +24,9 @@
namespace ui {
InputMethodWinImm32::InputMethodWinImm32(
- internal::InputMethodDelegate* delegate,
+ ImeKeyEventDispatcher* ime_key_event_dispatcher,
HWND attached_window_handle)
- : InputMethodWinBase(delegate, attached_window_handle),
+ : InputMethodWinBase(ime_key_event_dispatcher, attached_window_handle),
enabled_(false),
is_candidate_popup_open_(false),
diff --git a/chromium/ui/base/ime/win/input_method_win_imm32.h b/chromium/ui/base/ime/win/input_method_win_imm32.h
index 323ff6ff58a..a9dce83f90c 100644
--- a/chromium/ui/base/ime/win/input_method_win_imm32.h
+++ b/chromium/ui/base/ime/win/input_method_win_imm32.h
@@ -17,7 +17,7 @@ namespace ui {
class COMPONENT_EXPORT(UI_BASE_IME_WIN) InputMethodWinImm32
: public InputMethodWinBase {
public:
- InputMethodWinImm32(internal::InputMethodDelegate* delegate,
+ InputMethodWinImm32(ImeKeyEventDispatcher* ime_key_event_dispatcher,
HWND attached_window_handle);
InputMethodWinImm32(const InputMethodWinImm32&) = delete;
diff --git a/chromium/ui/base/ime/win/input_method_win_tsf.cc b/chromium/ui/base/ime/win/input_method_win_tsf.cc
index 1a02b6f98c8..ebe2ee1137a 100644
--- a/chromium/ui/base/ime/win/input_method_win_tsf.cc
+++ b/chromium/ui/base/ime/win/input_method_win_tsf.cc
@@ -32,9 +32,10 @@ class InputMethodWinTSF::TSFEventObserver : public TSFEventRouterObserver {
bool is_candidate_popup_open_ = false;
};
-InputMethodWinTSF::InputMethodWinTSF(internal::InputMethodDelegate* delegate,
- HWND attached_window_handle)
- : InputMethodWinBase(delegate, attached_window_handle),
+InputMethodWinTSF::InputMethodWinTSF(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher,
+ HWND attached_window_handle)
+ : InputMethodWinBase(ime_key_event_dispatcher, attached_window_handle),
tsf_event_observer_(new TSFEventObserver()),
tsf_event_router_(new TSFEventRouter(tsf_event_observer_.get())) {}
@@ -48,8 +49,8 @@ void InputMethodWinTSF::OnFocus() {
}
tsf_event_router_->SetManager(
ui::TSFBridge::GetInstance()->GetThreadManager().Get());
- ui::TSFBridge::GetInstance()->SetInputMethodDelegate(
- InputMethodBase::delegate());
+ ui::TSFBridge::GetInstance()->SetImeKeyEventDispatcher(
+ InputMethodBase::ime_key_event_dispatcher());
}
void InputMethodWinTSF::OnBlur() {
@@ -59,7 +60,7 @@ void InputMethodWinTSF::OnBlur() {
return;
}
tsf_event_router_->SetManager(nullptr);
- ui::TSFBridge::GetInstance()->RemoveInputMethodDelegate();
+ ui::TSFBridge::GetInstance()->RemoveImeKeyEventDispatcher();
}
bool InputMethodWinTSF::OnUntranslatedIMEMessage(
@@ -128,6 +129,8 @@ void InputMethodWinTSF::DetachTextInputClient(TextInputClient* client) {
ui::TSFBridge::GetInstance()->RemoveFocusedClient(client);
}
+void InputMethodWinTSF::OnInputLocaleChanged() {}
+
bool InputMethodWinTSF::IsInputLocaleCJK() const {
if (!ui::TSFBridge::GetInstance()) {
return false;
diff --git a/chromium/ui/base/ime/win/input_method_win_tsf.h b/chromium/ui/base/ime/win/input_method_win_tsf.h
index f35f6a1923f..e6ded2e7a08 100644
--- a/chromium/ui/base/ime/win/input_method_win_tsf.h
+++ b/chromium/ui/base/ime/win/input_method_win_tsf.h
@@ -18,7 +18,7 @@ class TSFEventRouter;
class COMPONENT_EXPORT(UI_BASE_IME_WIN) InputMethodWinTSF
: public InputMethodWinBase {
public:
- InputMethodWinTSF(internal::InputMethodDelegate* delegate,
+ InputMethodWinTSF(ImeKeyEventDispatcher* ime_key_event_dispatcher,
HWND attached_window_handle);
InputMethodWinTSF(const InputMethodWinTSF&) = delete;
@@ -35,6 +35,7 @@ class COMPONENT_EXPORT(UI_BASE_IME_WIN) InputMethodWinTSF
void OnCaretBoundsChanged(const TextInputClient* client) override;
void CancelComposition(const TextInputClient* client) override;
void DetachTextInputClient(TextInputClient* client) override;
+ void OnInputLocaleChanged() override;
bool IsInputLocaleCJK() const override;
bool IsCandidatePopupOpen() const override;
diff --git a/chromium/ui/base/ime/win/mock_tsf_bridge.cc b/chromium/ui/base/ime/win/mock_tsf_bridge.cc
index a15f2bedd43..8a2974f7caa 100644
--- a/chromium/ui/base/ime/win/mock_tsf_bridge.cc
+++ b/chromium/ui/base/ime/win/mock_tsf_bridge.cc
@@ -44,13 +44,13 @@ void MockTSFBridge::RemoveFocusedClient(TextInputClient* client) {
focused_window_ = nullptr;
}
-void MockTSFBridge::SetInputMethodDelegate(
- internal::InputMethodDelegate* delegate) {
- input_method_delegate_ = delegate;
+void MockTSFBridge::SetImeKeyEventDispatcher(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher) {
+ ime_key_event_dispatcher_ = ime_key_event_dispatcher;
}
-void MockTSFBridge::RemoveInputMethodDelegate() {
- input_method_delegate_ = nullptr;
+void MockTSFBridge::RemoveImeKeyEventDispatcher() {
+ ime_key_event_dispatcher_ = nullptr;
}
Microsoft::WRL::ComPtr<ITfThreadMgr> MockTSFBridge::GetThreadManager() {
diff --git a/chromium/ui/base/ime/win/mock_tsf_bridge.h b/chromium/ui/base/ime/win/mock_tsf_bridge.h
index c5e531bf1df..12650621c81 100644
--- a/chromium/ui/base/ime/win/mock_tsf_bridge.h
+++ b/chromium/ui/base/ime/win/mock_tsf_bridge.h
@@ -9,7 +9,7 @@
#include <wrl/client.h>
#include "base/memory/raw_ptr.h"
-#include "ui/base/ime/input_method_delegate.h"
+#include "ui/base/ime/ime_key_event_dispatcher.h"
#include "ui/base/ime/text_input_type.h"
#include "ui/base/ime/win/tsf_bridge.h"
#include "ui/base/ime/win/tsf_text_store.h"
@@ -32,8 +32,9 @@ class COMPONENT_EXPORT(UI_BASE_IME_WIN) MockTSFBridge : public TSFBridge {
void OnTextLayoutChanged() override;
void SetFocusedClient(HWND focused_window, TextInputClient* client) override;
void RemoveFocusedClient(TextInputClient* client) override;
- void SetInputMethodDelegate(internal::InputMethodDelegate* delegate) override;
- void RemoveInputMethodDelegate() override;
+ void SetImeKeyEventDispatcher(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher) override;
+ void RemoveImeKeyEventDispatcher() override;
Microsoft::WRL::ComPtr<ITfThreadMgr> GetThreadManager() override;
TextInputClient* GetFocusedTextInputClient() const override;
bool IsInputLanguageCJK() override;
@@ -100,7 +101,7 @@ class COMPONENT_EXPORT(UI_BASE_IME_WIN) MockTSFBridge : public TSFBridge {
unsigned set_focused_client_call_count_ = 0;
unsigned remove_focused_client_call_count_ = 0;
raw_ptr<TextInputClient> text_input_client_ = nullptr;
- raw_ptr<internal::InputMethodDelegate> input_method_delegate_ = nullptr;
+ raw_ptr<ImeKeyEventDispatcher> ime_key_event_dispatcher_ = nullptr;
HWND focused_window_ = nullptr;
TextInputType latest_text_input_type_ = TEXT_INPUT_TYPE_NONE;
Microsoft::WRL::ComPtr<ITfThreadMgr> thread_manager_;
diff --git a/chromium/ui/base/ime/win/tsf_bridge.cc b/chromium/ui/base/ime/win/tsf_bridge.cc
index 1d629d46dd4..561f51fbe8b 100644
--- a/chromium/ui/base/ime/win/tsf_bridge.cc
+++ b/chromium/ui/base/ime/win/tsf_bridge.cc
@@ -16,7 +16,7 @@
#include "base/threading/thread_local_storage.h"
#include "base/trace_event/trace_event.h"
#include "base/win/scoped_variant.h"
-#include "ui/base/ime/input_method_delegate.h"
+#include "ui/base/ime/ime_key_event_dispatcher.h"
#include "ui/base/ime/text_input_client.h"
#include "ui/base/ime/win/mock_tsf_bridge.h"
#include "ui/base/ime/win/tsf_text_store.h"
@@ -47,8 +47,9 @@ class TSFBridgeImpl : public TSFBridge {
bool ConfirmComposition() override;
void SetFocusedClient(HWND focused_window, TextInputClient* client) override;
void RemoveFocusedClient(TextInputClient* client) override;
- void SetInputMethodDelegate(internal::InputMethodDelegate* delegate) override;
- void RemoveInputMethodDelegate() override;
+ void SetImeKeyEventDispatcher(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher) override;
+ void RemoveImeKeyEventDispatcher() override;
bool IsInputLanguageCJK() override;
Microsoft::WRL::ComPtr<ITfThreadMgr> GetThreadManager() override;
TextInputClient* GetFocusedTextInputClient() const override;
@@ -355,21 +356,21 @@ void TSFBridgeImpl::RemoveFocusedClient(TextInputClient* client) {
}
}
-void TSFBridgeImpl::SetInputMethodDelegate(
- internal::InputMethodDelegate* delegate) {
+void TSFBridgeImpl::SetImeKeyEventDispatcher(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher) {
DCHECK(base::CurrentUIThread::IsSet());
- DCHECK(delegate);
+ DCHECK(ime_key_event_dispatcher);
DCHECK(IsInitialized());
for (TSFDocumentMap::iterator it = tsf_document_map_.begin();
it != tsf_document_map_.end(); ++it) {
if (it->second.text_store.get() == nullptr)
continue;
- it->second.text_store->SetInputMethodDelegate(delegate);
+ it->second.text_store->SetImeKeyEventDispatcher(ime_key_event_dispatcher);
}
}
-void TSFBridgeImpl::RemoveInputMethodDelegate() {
+void TSFBridgeImpl::RemoveImeKeyEventDispatcher() {
DCHECK(base::CurrentUIThread::IsSet());
DCHECK(IsInitialized());
@@ -377,7 +378,7 @@ void TSFBridgeImpl::RemoveInputMethodDelegate() {
it != tsf_document_map_.end(); ++it) {
if (it->second.text_store.get() == nullptr)
continue;
- it->second.text_store->RemoveInputMethodDelegate();
+ it->second.text_store->RemoveImeKeyEventDispatcher();
}
}
diff --git a/chromium/ui/base/ime/win/tsf_bridge.h b/chromium/ui/base/ime/win/tsf_bridge.h
index c5df58dad92..bbf2eec86ab 100644
--- a/chromium/ui/base/ime/win/tsf_bridge.h
+++ b/chromium/ui/base/ime/win/tsf_bridge.h
@@ -10,7 +10,7 @@
#include <wrl/client.h>
#include "base/component_export.h"
-#include "ui/base/ime/input_method_delegate.h"
+#include "ui/base/ime/ime_key_event_dispatcher.h"
namespace ui {
class TextInputClient;
@@ -82,12 +82,12 @@ class COMPONENT_EXPORT(UI_BASE_IME_WIN) TSFBridge {
// Caller must free |client|.
virtual void RemoveFocusedClient(TextInputClient* client) = 0;
- // Lets TSFTextstore see InputMethodDelegate instance when in focus.
- virtual void SetInputMethodDelegate(
- internal::InputMethodDelegate* delegate) = 0;
+ // Lets TSFTextstore see ImeKeyEventDispatcher instance when in focus.
+ virtual void SetImeKeyEventDispatcher(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher) = 0;
- // Remove InputMethodDelegate instance from TSFTextStore when not in focus.
- virtual void RemoveInputMethodDelegate() = 0;
+ // Remove ImeKeyEventDispatcher instance from TSFTextStore when not in focus.
+ virtual void RemoveImeKeyEventDispatcher() = 0;
// Returns whether the system's input language is CJK.
virtual bool IsInputLanguageCJK() = 0;
diff --git a/chromium/ui/base/ime/win/tsf_text_store.cc b/chromium/ui/base/ime/win/tsf_text_store.cc
index e4f43e94ba4..ac59b697155 100644
--- a/chromium/ui/base/ime/win/tsf_text_store.cc
+++ b/chromium/ui/base/ime/win/tsf_text_store.cc
@@ -471,8 +471,8 @@ HRESULT TSFTextStore::InsertTextAtSelection(DWORD flags,
LONG old_delta = (LONG)replace_text_range_.start() -
(LONG)replace_text_range_.end() + replace_text_size_;
LONG new_delta = start_pos - end_pos + text_buffer_size;
- replace_text_range_.set_start(
- std::min((uint32_t)start_pos, replace_text_range_.start()));
+ replace_text_range_.set_start(std::min(static_cast<size_t>(start_pos),
+ replace_text_range_.start()));
// New replacement text ends after previous replacement text. We need to
// use the new end after adjusting with previous delta.
if ((uint32_t)end_pos >=
@@ -950,8 +950,8 @@ void TSFTextStore::DispatchKeyEvent(ui::EventType type,
lparam};
ui::KeyEvent key_event = KeyEventFromMSG(key_event_MSG);
- if (input_method_delegate_) {
- input_method_delegate_->DispatchKeyEventPostIME(&key_event);
+ if (ime_key_event_dispatcher_) {
+ ime_key_event_dispatcher_->DispatchKeyEventPostIME(&key_event);
}
}
@@ -1317,13 +1317,13 @@ void TSFTextStore::RemoveFocusedTextInputClient(
}
}
-void TSFTextStore::SetInputMethodDelegate(
- internal::InputMethodDelegate* delegate) {
- input_method_delegate_ = delegate;
+void TSFTextStore::SetImeKeyEventDispatcher(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher) {
+ ime_key_event_dispatcher_ = ime_key_event_dispatcher;
}
-void TSFTextStore::RemoveInputMethodDelegate() {
- input_method_delegate_ = nullptr;
+void TSFTextStore::RemoveImeKeyEventDispatcher() {
+ ime_key_event_dispatcher_ = nullptr;
}
bool TSFTextStore::CancelComposition() {
diff --git a/chromium/ui/base/ime/win/tsf_text_store.h b/chromium/ui/base/ime/win/tsf_text_store.h
index 9bca2cf4472..28975277d54 100644
--- a/chromium/ui/base/ime/win/tsf_text_store.h
+++ b/chromium/ui/base/ime/win/tsf_text_store.h
@@ -12,8 +12,8 @@
#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
+#include "ui/base/ime/ime_key_event_dispatcher.h"
#include "ui/base/ime/ime_text_span.h"
-#include "ui/base/ime/input_method_delegate.h"
#include "ui/events/event_utils.h"
#include "ui/gfx/range/range.h"
@@ -253,11 +253,12 @@ class COMPONENT_EXPORT(UI_BASE_IME_WIN) TSFTextStore
// Removes currently focused TextInputClient.
void RemoveFocusedTextInputClient(TextInputClient* text_input_client);
- // Sets InputMethodDelegate pointer.
- void SetInputMethodDelegate(internal::InputMethodDelegate* delegate);
+ // Sets ImeKeyEventDispatcher pointer.
+ void SetImeKeyEventDispatcher(
+ ImeKeyEventDispatcher* ime_key_event_dispatcher);
- // Removes InputMethodDelegate pointer.
- void RemoveInputMethodDelegate();
+ // Removes ImeKeyEventDispatcher pointer.
+ void RemoveImeKeyEventDispatcher();
// Cancels the ongoing composition if exists.
bool CancelComposition();
@@ -342,8 +343,8 @@ class COMPONENT_EXPORT(UI_BASE_IME_WIN) TSFTextStore
// Current TextInputClient which is set in SetFocusedTextInputClient.
raw_ptr<TextInputClient> text_input_client_ = nullptr;
- // InputMethodDelegate instance which is used dispatch key events.
- raw_ptr<internal::InputMethodDelegate> input_method_delegate_ = nullptr;
+ // ImeKeyEventDispatcher instance which is used dispatch key events.
+ raw_ptr<ImeKeyEventDispatcher> ime_key_event_dispatcher_ = nullptr;
// |string_buffer_document_| contains all string in current active view.
// |string_pending_insertion_| contains only string in current edit session.
diff --git a/chromium/ui/base/ime/win/tsf_text_store_unittest.cc b/chromium/ui/base/ime/win/tsf_text_store_unittest.cc
index 7481c3f7f5b..d09d1ae726e 100644
--- a/chromium/ui/base/ime/win/tsf_text_store_unittest.cc
+++ b/chromium/ui/base/ime/win/tsf_text_store_unittest.cc
@@ -35,7 +35,7 @@ class MockTextInputClient : public TextInputClient {
public:
~MockTextInputClient() {}
MOCK_METHOD1(SetCompositionText, void(const ui::CompositionText&));
- MOCK_METHOD1(ConfirmCompositionText, uint32_t(bool));
+ MOCK_METHOD1(ConfirmCompositionText, size_t(bool));
MOCK_METHOD0(ClearCompositionText, void());
MOCK_METHOD2(
InsertText,
@@ -49,7 +49,7 @@ class MockTextInputClient : public TextInputClient {
MOCK_CONST_METHOD0(CanComposeInline, bool());
MOCK_CONST_METHOD0(GetCaretBounds, gfx::Rect());
MOCK_CONST_METHOD0(GetSelectionBoundingBox, gfx::Rect());
- MOCK_CONST_METHOD2(GetCompositionCharacterBounds, bool(uint32_t, gfx::Rect*));
+ MOCK_CONST_METHOD2(GetCompositionCharacterBounds, bool(size_t, gfx::Rect*));
MOCK_CONST_METHOD0(HasCompositionText, bool());
MOCK_CONST_METHOD0(GetFocusReason, ui::TextInputClient::FocusReason());
MOCK_METHOD0(ShouldDoLearning, bool());
@@ -78,9 +78,9 @@ class MockTextInputClient : public TextInputClient {
MOCK_METHOD0(GetTextEditingContext, ui::TextInputClient::EditingContext());
};
-class MockInputMethodDelegate : public internal::InputMethodDelegate {
+class MockImeKeyEventDispatcher : public ImeKeyEventDispatcher {
public:
- ~MockInputMethodDelegate() {}
+ ~MockImeKeyEventDispatcher() {}
MOCK_METHOD1(DispatchKeyEventPostIME, EventDispatchDetails(KeyEvent*));
};
@@ -150,7 +150,7 @@ class TSFTextStoreTest : public testing::Test {
EXPECT_EQ(S_OK, text_store_->AdviseSink(IID_ITextStoreACPSink, sink_.get(),
TS_AS_ALL_SINKS));
text_store_->SetFocusedTextInputClient(kWindowHandle, &text_input_client_);
- text_store_->SetInputMethodDelegate(&input_method_delegate_);
+ text_store_->SetImeKeyEventDispatcher(&ime_key_event_dispatcher_);
}
void TearDown() override {
@@ -167,7 +167,7 @@ class TSFTextStoreTest : public testing::Test {
base::win::ScopedCOMInitializer com_initializer_;
MockTextInputClient text_input_client_;
- MockInputMethodDelegate input_method_delegate_;
+ MockImeKeyEventDispatcher ime_key_event_dispatcher_;
scoped_refptr<TSFTextStore> text_store_;
scoped_refptr<MockStoreACPSink> sink_;
};
@@ -1757,7 +1757,7 @@ TEST_F(TSFTextStoreTest, KeyEventTest) {
.WillOnce(Invoke(&callback, &KeyEventTestCallback::InsertText2))
.WillOnce(Invoke(&callback, &KeyEventTestCallback::InsertText3));
- EXPECT_CALL(input_method_delegate_, DispatchKeyEventPostIME(_))
+ EXPECT_CALL(ime_key_event_dispatcher_, DispatchKeyEventPostIME(_))
.WillOnce(
Invoke(&callback, &KeyEventTestCallback::DispatchKeyEventPostIME1))
.WillOnce(
@@ -2813,7 +2813,7 @@ TEST_F(TSFTextStoreTest, RegressionTest) {
.WillOnce(
Invoke(&callback, &RegressionTestCallback::SetCompositionText5));
- EXPECT_CALL(input_method_delegate_, DispatchKeyEventPostIME(_))
+ EXPECT_CALL(ime_key_event_dispatcher_, DispatchKeyEventPostIME(_))
.WillOnce(
Invoke(&callback, &RegressionTestCallback::DispatchKeyEventPostIME1))
.WillOnce(
diff --git a/chromium/ui/base/interaction/element_identifier.h b/chromium/ui/base/interaction/element_identifier.h
index 3542cd458c9..021c0f12dce 100644
--- a/chromium/ui/base/interaction/element_identifier.h
+++ b/chromium/ui/base/interaction/element_identifier.h
@@ -11,6 +11,7 @@
#include <set>
#include "base/component_export.h"
+#include "base/numerics/safe_conversions.h"
#include "ui/base/class_property.h"
// Overview:
@@ -246,7 +247,7 @@ class ClassPropertyCaster<ui::ElementIdentifier> {
public:
static int64_t ToInt64(ui::ElementIdentifier x) { return x.GetRawValue(); }
static ui::ElementIdentifier FromInt64(int64_t x) {
- return ui::ElementIdentifier::FromRawValue(x);
+ return ui::ElementIdentifier::FromRawValue(base::checked_cast<intptr_t>(x));
}
};
diff --git a/chromium/ui/base/interaction/interaction_sequence.cc b/chromium/ui/base/interaction/interaction_sequence.cc
index 5967b8cae3d..3626c43f750 100644
--- a/chromium/ui/base/interaction/interaction_sequence.cc
+++ b/chromium/ui/base/interaction/interaction_sequence.cc
@@ -863,4 +863,44 @@ ElementContext InteractionSequence::GetElementContext(
return element ? element->context() : context();
}
+void PrintTo(InteractionSequence::StepType step_type, std::ostream* os) {
+ const char* const kStepTypeNames[] = {
+ "StepType::kShown", "StepType::kActivated", "StepType::kHidden",
+ "StepType::kCustomEvent"};
+ constexpr int kCount = sizeof(kStepTypeNames) / sizeof(kStepTypeNames[0]);
+ static_assert(kCount ==
+ static_cast<int>(InteractionSequence::StepType::kMaxValue) + 1);
+ const int value = static_cast<int>(step_type);
+ *os << ((value < 0 || value >= kCount) ? "[invalid StepType]"
+ : kStepTypeNames[value]);
+}
+
+void PrintTo(InteractionSequence::AbortedReason reason, std::ostream* os) {
+ const char* const kAbortedReasonNames[] = {
+ "AbortedReason::kSequenceDestroyed",
+ "AbortedReason::kElementHiddenBeforeSequenceStart",
+ "AbortedReason::kElementNotVisibleAtStartOfStep",
+ "AbortedReason::kElementHiddenDuringStep"};
+ constexpr int kCount =
+ sizeof(kAbortedReasonNames) / sizeof(kAbortedReasonNames[0]);
+ static_assert(
+ kCount ==
+ static_cast<int>(InteractionSequence::AbortedReason::kMaxValue) + 1);
+ const int value = static_cast<int>(reason);
+ *os << ((value < 0 || value >= kCount) ? "[invalid StepType]"
+ : kAbortedReasonNames[value]);
+}
+
+extern std::ostream& operator<<(std::ostream& os,
+ InteractionSequence::StepType step_type) {
+ PrintTo(step_type, &os);
+ return os;
+}
+
+extern std::ostream& operator<<(std::ostream& os,
+ InteractionSequence::AbortedReason reason) {
+ PrintTo(reason, &os);
+ return os;
+}
+
} // namespace ui
diff --git a/chromium/ui/base/interaction/interaction_sequence.h b/chromium/ui/base/interaction/interaction_sequence.h
index 392f38e9cdb..05fb1c05eb9 100644
--- a/chromium/ui/base/interaction/interaction_sequence.h
+++ b/chromium/ui/base/interaction/interaction_sequence.h
@@ -74,7 +74,9 @@ class COMPONENT_EXPORT(UI_BASE) InteractionSequence {
// Represents a custom event with a specific custom event type. You may
// further specify a required element name or ID to filter down which
// events you actually want to step on vs. ignore.
- kCustomEvent
+ kCustomEvent,
+ // Update this if values are added to the enumeration.
+ kMaxValue = kCustomEvent
};
// Details why a sequence was aborted.
@@ -86,7 +88,9 @@ class COMPONENT_EXPORT(UI_BASE) InteractionSequence {
// An element should have been visible at the start of a step but was not.
kElementNotVisibleAtStartOfStep,
// An element should have remained visible during a step but did not.
- kElementHiddenDuringStep
+ kElementHiddenDuringStep,
+ // Update this if values are added to the enumeration.
+ kMaxValue = kElementHiddenDuringStep
};
// Callback when a step in the sequence starts. If |element| is no longer
@@ -408,6 +412,21 @@ class COMPONENT_EXPORT(UI_BASE) InteractionSequence {
base::WeakPtrFactory<InteractionSequence> weak_factory_{this};
};
+COMPONENT_EXPORT(UI_BASE)
+extern void PrintTo(InteractionSequence::StepType step_type, std::ostream* os);
+
+COMPONENT_EXPORT(UI_BASE)
+extern void PrintTo(InteractionSequence::AbortedReason reason,
+ std::ostream* os);
+
+COMPONENT_EXPORT(UI_BASE)
+extern std::ostream& operator<<(std::ostream& os,
+ InteractionSequence::StepType step_type);
+
+COMPONENT_EXPORT(UI_BASE)
+extern std::ostream& operator<<(std::ostream& os,
+ InteractionSequence::AbortedReason reason);
+
} // namespace ui
#endif // UI_BASE_INTERACTION_INTERACTION_SEQUENCE_H_
diff --git a/chromium/ui/base/interaction/interaction_test_util_mac.mm b/chromium/ui/base/interaction/interaction_test_util_mac.mm
index 1076fecc589..b47f126b241 100644
--- a/chromium/ui/base/interaction/interaction_test_util_mac.mm
+++ b/chromium/ui/base/interaction/interaction_test_util_mac.mm
@@ -44,7 +44,7 @@ bool InteractionTestUtilSimulatorMac::SelectMenuItem(
if (!model)
return false;
- for (int i = 0; i < model->GetItemCount(); ++i) {
+ for (size_t i = 0; i < model->GetItemCount(); ++i) {
if (model->GetElementIdentifierAt(i) == element->identifier()) {
NSMenuItem* item = [menu itemWithTag:i];
if (item) {
diff --git a/chromium/ui/base/l10n/formatter.cc b/chromium/ui/base/l10n/formatter.cc
index 4770ef0e642..480195d774b 100644
--- a/chromium/ui/base/l10n/formatter.cc
+++ b/chromium/ui/base/l10n/formatter.cc
@@ -12,6 +12,7 @@
#include "base/check.h"
#include "base/component_export.h"
+#include "base/numerics/safe_conversions.h"
#include "third_party/icu/source/common/unicode/unistr.h"
#include "third_party/icu/source/i18n/unicode/msgfmt.h"
#include "ui/base/l10n/l10n_util.h"
@@ -283,7 +284,9 @@ std::unique_ptr<icu::MessageFormat> Formatter::InitFormat(
std::u16string pattern = l10n_util::GetStringUTF16(pluralities.id);
UErrorCode error = U_ZERO_ERROR;
std::unique_ptr<icu::MessageFormat> format(new icu::MessageFormat(
- icu::UnicodeString(false, pattern.data(), pattern.length()), error));
+ icu::UnicodeString(false, pattern.data(),
+ base::checked_cast<int32_t>(pattern.length())),
+ error));
DCHECK(U_SUCCESS(error));
if (format.get())
return format;
diff --git a/chromium/ui/base/l10n/l10n_util.cc b/chromium/ui/base/l10n/l10n_util.cc
index dc1d296bd27..e5434355c76 100644
--- a/chromium/ui/base/l10n/l10n_util.cc
+++ b/chromium/ui/base/l10n/l10n_util.cc
@@ -41,6 +41,10 @@
#include "ui/base/l10n/l10n_util_android.h"
#endif
+#if BUILDFLAG(IS_IOS)
+#include "ui/base/l10n/l10n_util_ios.h"
+#endif
+
#if defined(USE_GLIB)
#include <glib.h>
#endif
@@ -650,7 +654,7 @@ std::u16string GetDisplayNameForLocale(const std::string& locale,
UErrorCode error = U_ZERO_ERROR;
const int kBufferSize = 1024;
- int actual_size;
+ int32_t actual_size;
// For Country code in ICU64 we need to call uloc_getDisplayCountry
if (locale_code[0] == '-' || locale_code[0] == '_') {
actual_size = uloc_getDisplayCountry(
@@ -664,7 +668,7 @@ std::u16string GetDisplayNameForLocale(const std::string& locale,
if (disallow_default && U_USING_DEFAULT_WARNING == error)
return std::u16string();
DCHECK(U_SUCCESS(error));
- display_name.resize(actual_size);
+ display_name.resize(base::checked_cast<size_t>(actual_size));
}
#endif // BUILDFLAG(IS_IOS)
@@ -793,10 +797,10 @@ std::u16string FormatString(const std::u16string& format_string,
if (!offsets) {
// $9 is the highest allowed placeholder.
for (size_t i = 0; i < 9; ++i) {
- bool placeholder_should_exist = replacements.size() > i;
+ bool placeholder_should_exist = i < replacements.size();
std::u16string placeholder = u"$";
- placeholder += (L'1' + i);
+ placeholder += static_cast<char16_t>('1' + static_cast<char>(i));
size_t pos = format_string.find(placeholder);
if (placeholder_should_exist) {
DCHECK_NE(std::string::npos, pos) << " Didn't find a " << placeholder
diff --git a/chromium/ui/base/l10n/l10n_util.h b/chromium/ui/base/l10n/l10n_util.h
index 5828b68422a..6067a21c29b 100644
--- a/chromium/ui/base/l10n/l10n_util.h
+++ b/chromium/ui/base/l10n/l10n_util.h
@@ -206,6 +206,7 @@ std::u16string GetStringFUTF16(int message_id,
// ASCII digits in non-UI strings.
COMPONENT_EXPORT(UI_BASE)
std::u16string GetStringFUTF16Int(int message_id, int a);
+COMPONENT_EXPORT(UI_BASE)
std::u16string GetStringFUTF16Int(int message_id, int64_t a);
// Convenience functions to format a string with a single number that requires
diff --git a/chromium/ui/base/l10n/l10n_util_collator.h b/chromium/ui/base/l10n/l10n_util_collator.h
index 5dc4582efd0..e8665f757af 100644
--- a/chromium/ui/base/l10n/l10n_util_collator.h
+++ b/chromium/ui/base/l10n/l10n_util_collator.h
@@ -138,12 +138,12 @@ void SortVectorWithStringKey(const std::string& locale,
if (U_FAILURE(error))
collator.reset();
StringComparator<Element> c(collator.get());
+ const auto begin = elements->begin() + static_cast<ptrdiff_t>(begin_index);
+ const auto end = elements->begin() + static_cast<ptrdiff_t>(end_index);
if (needs_stable_sort) {
- stable_sort(elements->begin() + begin_index,
- elements->begin() + end_index,
- c);
+ stable_sort(begin, end, c);
} else {
- sort(elements->begin() + begin_index, elements->begin() + end_index, c);
+ sort(begin, end, c);
}
}
diff --git a/chromium/ui/base/l10n/l10n_util_ios.h b/chromium/ui/base/l10n/l10n_util_ios.h
new file mode 100644
index 00000000000..65c32524a16
--- /dev/null
+++ b/chromium/ui/base/l10n/l10n_util_ios.h
@@ -0,0 +1,41 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_BASE_L10N_L10N_UTIL_IOS_H_
+#define UI_BASE_L10N_L10N_UTIL_IOS_H_
+
+#include <string>
+
+#include "base/component_export.h"
+
+#ifdef __OBJC__
+@class NSString;
+#else
+class NSString;
+#endif
+
+namespace l10n_util {
+
+// Get localized language name using NSLocale Foundation API. If the system
+// API returns null or an empty string, ICU's formatting style of an unknown
+// language will be used which is "xyz (XYZ)" where the input is parsed into
+// language and script by the - token and reformatted as
+// "$lowercase_language ($UPPERCASE_SCRIPT)". If the - token is not found, the
+// lowercase version of |locale| will be returned.
+//
+// TODO(jshin): the locale id is not always ll-SSSS, but can be ll-RR,
+// ll-SSSS-RR (SSSS: 4 letter script, RR: 2 letter or 3 digit region code).
+// There are more complicated forms, too (per BCP 47).
+//
+// Consider changing this calling the ICU directly instead of trying to
+// emulate it in case of a fallback. Though how not sure whether iOS API
+// exposes the necessary function from ICU, and iOS is trying to not depend
+// on ICU to reduce the package size.
+COMPONENT_EXPORT(UI_BASE)
+std::u16string GetDisplayNameForLocale(const std::string& locale,
+ const std::string& display_locale);
+
+} // namespace l10n_util
+
+#endif // UI_BASE_L10N_L10N_UTIL_IOS_H_
diff --git a/chromium/ui/base/l10n/l10n_util_ios.mm b/chromium/ui/base/l10n/l10n_util_ios.mm
new file mode 100644
index 00000000000..f07b2970b01
--- /dev/null
+++ b/chromium/ui/base/l10n/l10n_util_ios.mm
@@ -0,0 +1,64 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ui/base/l10n/l10n_util_ios.h"
+
+#import <Foundation/Foundation.h>
+
+#include "base/check.h"
+#include "base/lazy_instance.h"
+#include "base/mac/bundle_locations.h"
+#import "base/mac/scoped_nsobject.h"
+#include "base/strings/sys_string_conversions.h"
+#include "ui/base/l10n/l10n_util.h"
+
+namespace l10n_util {
+namespace {
+
+// Helper version of GetDisplayNameForLocale() operating on NSString*.
+// Note: this function may be called from any thread and it *must* be
+// thread-safe. Thus attention must be paid if any caching is introduced.
+NSString* GetDisplayNameForLocale(NSString* language,
+ NSString* display_locale) {
+ base::scoped_nsobject<NSLocale> ns_locale(
+ [[NSLocale alloc] initWithLocaleIdentifier:display_locale]);
+
+ NSString* localized_language_name =
+ [ns_locale.get() displayNameForKey:NSLocaleIdentifier value:language];
+
+ // Return localized language if system API provided it. Do not attempt to
+ // manually parse into error format if no |locale| was provided.
+ if (localized_language_name.length || !language.length) {
+ return localized_language_name;
+ }
+
+ NSRange script_seperator = [language rangeOfString:@"-"
+ options:NSBackwardsSearch];
+ if (!script_seperator.length) {
+ return [language lowercaseString];
+ }
+
+ NSString* language_component =
+ [language substringToIndex:script_seperator.location];
+ NSString* script_component = [language
+ substringFromIndex:script_seperator.location + script_seperator.length];
+ if (!script_component.length) {
+ return [language_component lowercaseString];
+ }
+
+ return [NSString stringWithFormat:@"%@ (%@)",
+ [language_component lowercaseString],
+ [script_component uppercaseString]];
+}
+
+} // namespace
+
+std::u16string GetDisplayNameForLocale(const std::string& locale,
+ const std::string& display_locale) {
+ return base::SysNSStringToUTF16(
+ GetDisplayNameForLocale(base::SysUTF8ToNSString(locale),
+ base::SysUTF8ToNSString(display_locale)));
+}
+
+} // namespace l10n_util
diff --git a/chromium/ui/base/l10n/l10n_util_ios_unittest.mm b/chromium/ui/base/l10n/l10n_util_ios_unittest.mm
new file mode 100644
index 00000000000..f4be246faaa
--- /dev/null
+++ b/chromium/ui/base/l10n/l10n_util_ios_unittest.mm
@@ -0,0 +1,34 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/base/l10n/l10n_util_ios.h"
+
+#import <Foundation/Foundation.h>
+
+#include "base/strings/sys_string_conversions.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/platform_test.h"
+
+using L10nUtilIOSTest = PlatformTest;
+
+TEST_F(L10nUtilIOSTest, GetDisplayNameForLocale) {
+ // Test documented error cases and return values of GetDisplayNameForLocale.
+ std::u16string result = l10n_util::GetDisplayNameForLocale("xyz", "en");
+ EXPECT_EQ(base::SysNSStringToUTF16(@"xyz"), result);
+
+ result = l10n_util::GetDisplayNameForLocale("Xyz", "en");
+ EXPECT_EQ(base::SysNSStringToUTF16(@"xyz"), result);
+
+ result = l10n_util::GetDisplayNameForLocale("Xyz-Xyz", "en");
+ EXPECT_EQ(base::SysNSStringToUTF16(@"xyz (XYZ)"), result);
+
+ result = l10n_util::GetDisplayNameForLocale("Xyz-", "en");
+ EXPECT_EQ(base::SysNSStringToUTF16(@"xyz"), result);
+
+ result = l10n_util::GetDisplayNameForLocale("xyz-xyz-xyz", "en");
+ EXPECT_EQ(base::SysNSStringToUTF16(@"xyz-xyz (XYZ)"), result);
+
+ result = l10n_util::GetDisplayNameForLocale("", "en");
+ EXPECT_EQ(base::SysNSStringToUTF16(@""), result);
+}
diff --git a/chromium/ui/base/l10n/l10n_util_mac.h b/chromium/ui/base/l10n/l10n_util_mac.h
index 17b8e65005b..58bce25c1b6 100644
--- a/chromium/ui/base/l10n/l10n_util_mac.h
+++ b/chromium/ui/base/l10n/l10n_util_mac.h
@@ -20,16 +20,6 @@ class NSString;
namespace l10n_util {
-// Get localized language name using NSLocale Foundation API. If the system
-// API returns null or an empty string, ICU's formatting style of an unknown
-// language will be used which is "xyz (XYZ)" where the input is parsed into
-// language and script by the - token and reformatted as
-// "$lowercase_language ($UPPERCASE_SCRIPT)". If the - token is not found, the
-// lowercase version of |locale| will be returned.
-COMPONENT_EXPORT(UI_BASE)
-std::u16string GetDisplayNameForLocale(const std::string& locale,
- const std::string& display_locale);
-
// Remove the Windows-style accelerator marker (for labels, menuitems, etc.)
// and change "..." into an ellipsis.
// Returns the result in an autoreleased NSString.
diff --git a/chromium/ui/base/l10n/l10n_util_mac.mm b/chromium/ui/base/l10n/l10n_util_mac.mm
index b1dfef6a9a5..fd74cf43ff4 100644
--- a/chromium/ui/base/l10n/l10n_util_mac.mm
+++ b/chromium/ui/base/l10n/l10n_util_mac.mm
@@ -16,49 +16,11 @@ namespace {
base::LazyInstance<std::string>::DestructorAtExit g_overridden_locale =
LAZY_INSTANCE_INITIALIZER;
-base::LazyInstance<base::scoped_nsobject<NSLocale>>::DestructorAtExit
- mac_locale = LAZY_INSTANCE_INITIALIZER;
} // namespace
namespace l10n_util {
-std::u16string GetDisplayNameForLocale(const std::string& locale,
- const std::string& display_locale) {
- NSString* display = base::SysUTF8ToNSString(display_locale);
-
- if (mac_locale.Get() == nil ||
- ![[mac_locale.Get() localeIdentifier] isEqualToString:display]) {
- mac_locale.Get().reset([[NSLocale alloc] initWithLocaleIdentifier:display]);
- }
-
- NSString* language = base::SysUTF8ToNSString(locale);
- NSString* localized_language_name =
- [mac_locale.Get() displayNameForKey:NSLocaleIdentifier value:language];
- // Return localized language if system API provided it. Do not attempt to
- // manually parse into error format if no |locale| was provided.
- if (localized_language_name.length || !language.length) {
- return base::SysNSStringToUTF16(localized_language_name);
- }
-
- NSRange script_seperator =
- [language rangeOfString:@"-" options:NSBackwardsSearch];
- if (!script_seperator.length) {
- return base::SysNSStringToUTF16([language lowercaseString]);
- }
-
- NSString* language_component =
- [language substringToIndex:script_seperator.location];
- NSString* script_component = [language
- substringFromIndex:script_seperator.location + script_seperator.length];
- if (!script_component.length) {
- return base::SysNSStringToUTF16([language_component lowercaseString]);
- }
- return base::SysNSStringToUTF16([NSString
- stringWithFormat:@"%@ (%@)", [language_component lowercaseString],
- [script_component uppercaseString]]);
-}
-
const std::string& GetLocaleOverride() {
return g_overridden_locale.Get();
}
diff --git a/chromium/ui/base/l10n/l10n_util_mac_unittest.mm b/chromium/ui/base/l10n/l10n_util_mac_unittest.mm
index 98a2fded956..92e48cfd5d3 100644
--- a/chromium/ui/base/l10n/l10n_util_mac_unittest.mm
+++ b/chromium/ui/base/l10n/l10n_util_mac_unittest.mm
@@ -49,24 +49,3 @@ TEST_F(L10nUtilMacTest, FixUpWindowsStyleLabel) {
<< "', got '" << [result UTF8String] << "'";
}
}
-
-TEST_F(L10nUtilMacTest, GetDisplayNameForLocale) {
- // Test documented error cases and return values of GetDisplayNameForLocale.
- std::u16string result = l10n_util::GetDisplayNameForLocale("xyz", "en");
- EXPECT_EQ(base::SysNSStringToUTF16(@"xyz"), result);
-
- result = l10n_util::GetDisplayNameForLocale("Xyz", "en");
- EXPECT_EQ(base::SysNSStringToUTF16(@"xyz"), result);
-
- result = l10n_util::GetDisplayNameForLocale("Xyz-Xyz", "en");
- EXPECT_EQ(base::SysNSStringToUTF16(@"xyz (XYZ)"), result);
-
- result = l10n_util::GetDisplayNameForLocale("Xyz-", "en");
- EXPECT_EQ(base::SysNSStringToUTF16(@"xyz"), result);
-
- result = l10n_util::GetDisplayNameForLocale("xyz-xyz-xyz", "en");
- EXPECT_EQ(base::SysNSStringToUTF16(@"xyz-xyz (XYZ)"), result);
-
- result = l10n_util::GetDisplayNameForLocale("", "en");
- EXPECT_EQ(base::SysNSStringToUTF16(@""), result);
-}
diff --git a/chromium/ui/base/l10n/l10n_util_win.cc b/chromium/ui/base/l10n/l10n_util_win.cc
index 9e7028028cc..376d57aa493 100644
--- a/chromium/ui/base/l10n/l10n_util_win.cc
+++ b/chromium/ui/base/l10n/l10n_util_win.cc
@@ -46,12 +46,12 @@ int GetExtendedStyles() {
return !base::i18n::IsRTL() ? 0 : WS_EX_LAYOUTRTL | WS_EX_RTLREADING;
}
-int GetExtendedTooltipStyles() {
- return !base::i18n::IsRTL() ? 0 : WS_EX_LAYOUTRTL;
+DWORD GetExtendedTooltipStyles() {
+ return base::i18n::IsRTL() ? WS_EX_LAYOUTRTL : 0;
}
void HWNDSetRTLLayout(HWND hwnd) {
- DWORD ex_style = ::GetWindowLong(hwnd, GWL_EXSTYLE);
+ LONG ex_style = ::GetWindowLong(hwnd, GWL_EXSTYLE);
// We don't have to do anything if the style is already set for the HWND.
if (!(ex_style & WS_EX_LAYOUTRTL)) {
diff --git a/chromium/ui/base/l10n/l10n_util_win.h b/chromium/ui/base/l10n/l10n_util_win.h
index 380bba077d3..c282fa6bb64 100644
--- a/chromium/ui/base/l10n/l10n_util_win.h
+++ b/chromium/ui/base/l10n/l10n_util_win.h
@@ -22,7 +22,7 @@ COMPONENT_EXPORT(UI_BASE) int GetExtendedStyles();
// TODO(xji):
// This is a temporary name, it will eventually replace GetExtendedStyles
-COMPONENT_EXPORT(UI_BASE) int GetExtendedTooltipStyles();
+COMPONENT_EXPORT(UI_BASE) DWORD GetExtendedTooltipStyles();
// Give an HWND, this function sets the WS_EX_LAYOUTRTL extended style for the
// underlying window. When this style is set, the UI for the window is going to
diff --git a/chromium/ui/base/l10n/time_format.cc b/chromium/ui/base/l10n/time_format.cc
index 1af5daf44b6..032dd672c84 100644
--- a/chromium/ui/base/l10n/time_format.cc
+++ b/chromium/ui/base/l10n/time_format.cc
@@ -139,11 +139,12 @@ std::u16string TimeFormat::DetailedWithMonthAndYear(
formatter->Format(Formatter::UNIT_YEAR, year, &time_string);
}
- const int capacity = time_string.length() + 1;
+ const int32_t capacity = time_string.length() + 1;
DCHECK_GT(capacity, 1);
std::u16string result;
UErrorCode error = U_ZERO_ERROR;
- time_string.extract(base::WriteInto(&result, capacity), capacity, error);
+ time_string.extract(base::WriteInto(&result, static_cast<size_t>(capacity)),
+ capacity, error);
DCHECK(U_SUCCESS(error));
return result;
}
diff --git a/chromium/ui/base/linux/linux_desktop.cc b/chromium/ui/base/linux/linux_desktop.cc
index 6721512f9f1..18dae5989c0 100644
--- a/chromium/ui/base/linux/linux_desktop.cc
+++ b/chromium/ui/base/linux/linux_desktop.cc
@@ -14,21 +14,21 @@
namespace ui {
-std::vector<base::Value> GetDesktopEnvironmentInfo() {
- std::vector<base::Value> result;
+base::Value::List GetDesktopEnvironmentInfo() {
+ base::Value::List result;
auto env(base::Environment::Create());
std::string value;
if (env->GetVar(base::nix::kXdgCurrentDesktopEnvVar, &value)) {
- result.push_back(
+ result.Append(
display::BuildGpuInfoEntry(base::nix::kXdgCurrentDesktopEnvVar, value));
}
if (env->GetVar(base::nix::kXdgSessionTypeEnvVar, &value)) {
- result.push_back(
+ result.Append(
display::BuildGpuInfoEntry(base::nix::kXdgSessionTypeEnvVar, value));
}
constexpr char kGDMSession[] = "GDMSESSION";
if (env->GetVar(kGDMSession, &value))
- result.push_back(display::BuildGpuInfoEntry(kGDMSession, value));
+ result.Append(display::BuildGpuInfoEntry(kGDMSession, value));
return result;
}
diff --git a/chromium/ui/base/linux/linux_desktop.h b/chromium/ui/base/linux/linux_desktop.h
index c4dd042c2d6..ea9270020bb 100644
--- a/chromium/ui/base/linux/linux_desktop.h
+++ b/chromium/ui/base/linux/linux_desktop.h
@@ -5,15 +5,13 @@
#ifndef UI_BASE_LINUX_LINUX_DESKTOP_H_
#define UI_BASE_LINUX_LINUX_DESKTOP_H_
-#include <vector>
-
#include "base/component_export.h"
#include "base/values.h"
namespace ui {
// Returns desktop environment info as list of values.
-COMPONENT_EXPORT(UI_BASE) std::vector<base::Value> GetDesktopEnvironmentInfo();
+COMPONENT_EXPORT(UI_BASE) base::Value::List GetDesktopEnvironmentInfo();
} // namespace ui
diff --git a/chromium/ui/base/models/button_menu_item_model.cc b/chromium/ui/base/models/button_menu_item_model.cc
index 6368f454a36..01937d41a95 100644
--- a/chromium/ui/base/models/button_menu_item_model.cc
+++ b/chromium/ui/base/models/button_menu_item_model.cc
@@ -73,67 +73,59 @@ void ButtonMenuItemModel::AddSpace() {
items_.push_back(item);
}
-int ButtonMenuItemModel::GetItemCount() const {
- return static_cast<int>(items_.size());
+size_t ButtonMenuItemModel::GetItemCount() const {
+ return items_.size();
}
ButtonMenuItemModel::ButtonType ButtonMenuItemModel::GetTypeAt(
- int index) const {
+ size_t index) const {
return items_[index].type;
}
-int ButtonMenuItemModel::GetCommandIdAt(int index) const {
+int ButtonMenuItemModel::GetCommandIdAt(size_t index) const {
return items_[index].command_id;
}
-bool ButtonMenuItemModel::IsItemDynamicAt(int index) const {
- if (delegate_)
- return delegate_->IsItemForCommandIdDynamic(GetCommandIdAt(index));
- return false;
+bool ButtonMenuItemModel::IsItemDynamicAt(size_t index) const {
+ return delegate_ &&
+ delegate_->IsItemForCommandIdDynamic(GetCommandIdAt(index));
}
-bool ButtonMenuItemModel::GetAcceleratorAt(int index,
+bool ButtonMenuItemModel::GetAcceleratorAt(size_t index,
ui::Accelerator* accelerator) const {
- if (delegate_) {
- return delegate_->GetAcceleratorForCommandId(GetCommandIdAt(index),
- accelerator);
- }
- return false;
+ return delegate_ && delegate_->GetAcceleratorForCommandId(
+ GetCommandIdAt(index), accelerator);
}
-std::u16string ButtonMenuItemModel::GetLabelAt(int index) const {
- if (IsItemDynamicAt(index))
- return delegate_->GetLabelForCommandId(GetCommandIdAt(index));
- return items_[index].label;
+std::u16string ButtonMenuItemModel::GetLabelAt(size_t index) const {
+ return IsItemDynamicAt(index)
+ ? delegate_->GetLabelForCommandId(GetCommandIdAt(index))
+ : items_[index].label;
}
-bool ButtonMenuItemModel::PartOfGroup(int index) const {
+bool ButtonMenuItemModel::PartOfGroup(size_t index) const {
return items_[index].part_of_group;
}
-void ButtonMenuItemModel::ActivatedAt(int index) {
+void ButtonMenuItemModel::ActivatedAt(size_t index) {
if (delegate_)
delegate_->ExecuteCommand(GetCommandIdAt(index), 0);
}
-bool ButtonMenuItemModel::IsEnabledAt(int index) const {
+bool ButtonMenuItemModel::IsEnabledAt(size_t index) const {
return IsCommandIdEnabled(items_[index].command_id);
}
-bool ButtonMenuItemModel::DismissesMenuAt(int index) const {
+bool ButtonMenuItemModel::DismissesMenuAt(size_t index) const {
return DoesCommandIdDismissMenu(items_[index].command_id);
}
bool ButtonMenuItemModel::IsCommandIdEnabled(int command_id) const {
- if (delegate_)
- return delegate_->IsCommandIdEnabled(command_id);
- return true;
+ return !delegate_ || delegate_->IsCommandIdEnabled(command_id);
}
bool ButtonMenuItemModel::DoesCommandIdDismissMenu(int command_id) const {
- if (delegate_)
- return delegate_->DoesCommandIdDismissMenu(command_id);
- return true;
+ return !delegate_ || delegate_->DoesCommandIdDismissMenu(command_id);
}
diff --git a/chromium/ui/base/models/button_menu_item_model.h b/chromium/ui/base/models/button_menu_item_model.h
index da600e890e6..7fd1bbf0ad2 100644
--- a/chromium/ui/base/models/button_menu_item_model.h
+++ b/chromium/ui/base/models/button_menu_item_model.h
@@ -72,36 +72,36 @@ class COMPONENT_EXPORT(UI_BASE) ButtonMenuItemModel {
void AddSpace();
// Returns the number of items for iteration.
- int GetItemCount() const;
+ size_t GetItemCount() const;
// Returns what kind of item is at |index|.
- ButtonType GetTypeAt(int index) const;
+ ButtonType GetTypeAt(size_t index) const;
// Changes a position into a command ID.
- int GetCommandIdAt(int index) const;
+ int GetCommandIdAt(size_t index) const;
// Whether the label for item |index| changes.
- bool IsItemDynamicAt(int index) const;
+ bool IsItemDynamicAt(size_t index) const;
// Gets the accelerator information for the specified index, returning true if
// there is a shortcut accelerator for the item, false otherwise.
- bool GetAcceleratorAt(int index, ui::Accelerator* accelerator) const;
+ bool GetAcceleratorAt(size_t index, ui::Accelerator* accelerator) const;
// Returns the current label value for the button at |index|.
- std::u16string GetLabelAt(int index) const;
+ std::u16string GetLabelAt(size_t index) const;
// If the button at |index| should have its size equalized along with all
// other items that have their PartOfGroup bit set.
- bool PartOfGroup(int index) const;
+ bool PartOfGroup(size_t index) const;
// Called when the item at the specified index has been activated.
- void ActivatedAt(int index);
+ void ActivatedAt(size_t index);
// Returns the enabled state of the button at |index|.
- bool IsEnabledAt(int index) const;
+ bool IsEnabledAt(size_t index) const;
// Returns whether clicking on the button at |index| dismisses the menu.
- bool DismissesMenuAt(int index) const;
+ bool DismissesMenuAt(size_t index) const;
// Returns the enabled state of the command specified by |command_id|.
bool IsCommandIdEnabled(int command_id) const;
diff --git a/chromium/ui/base/models/combobox_model.cc b/chromium/ui/base/models/combobox_model.cc
index 413adebd034..6cadeec2ce2 100644
--- a/chromium/ui/base/models/combobox_model.cc
+++ b/chromium/ui/base/models/combobox_model.cc
@@ -16,31 +16,31 @@ ComboboxModel::~ComboboxModel() {
observer.OnComboboxModelDestroying(this);
}
-std::u16string ComboboxModel::GetDropDownTextAt(int index) const {
+std::u16string ComboboxModel::GetDropDownTextAt(size_t index) const {
return GetItemAt(index);
}
-std::u16string ComboboxModel::GetDropDownSecondaryTextAt(int index) const {
+std::u16string ComboboxModel::GetDropDownSecondaryTextAt(size_t index) const {
return std::u16string();
}
-ImageModel ComboboxModel::GetIconAt(int index) const {
+ImageModel ComboboxModel::GetIconAt(size_t index) const {
return ui::ImageModel();
}
-ImageModel ComboboxModel::GetDropDownIconAt(int index) const {
+ImageModel ComboboxModel::GetDropDownIconAt(size_t index) const {
return GetIconAt(index);
}
-bool ComboboxModel::IsItemSeparatorAt(int index) const {
+bool ComboboxModel::IsItemSeparatorAt(size_t index) const {
return false;
}
-int ComboboxModel::GetDefaultIndex() const {
- return 0;
+absl::optional<size_t> ComboboxModel::GetDefaultIndex() const {
+ return size_t{0};
}
-bool ComboboxModel::IsItemEnabledAt(int index) const {
+bool ComboboxModel::IsItemEnabledAt(size_t index) const {
return true;
}
diff --git a/chromium/ui/base/models/combobox_model.h b/chromium/ui/base/models/combobox_model.h
index eeff7dc8444..30a6c34f00f 100644
--- a/chromium/ui/base/models/combobox_model.h
+++ b/chromium/ui/base/models/combobox_model.h
@@ -9,6 +9,7 @@
#include "base/component_export.h"
#include "base/observer_list.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
namespace ui {
@@ -22,37 +23,37 @@ class COMPONENT_EXPORT(UI_BASE) ComboboxModel {
virtual ~ComboboxModel();
// Returns the number of items in the combo box.
- virtual int GetItemCount() const = 0;
+ virtual size_t GetItemCount() const = 0;
// Returns the string at the specified index.
- virtual std::u16string GetItemAt(int index) const = 0;
+ virtual std::u16string GetItemAt(size_t index) const = 0;
// Returns the string to be shown in the dropdown for the item at |index|. By
// default, it returns GetItemAt(index).
- virtual std::u16string GetDropDownTextAt(int index) const;
+ virtual std::u16string GetDropDownTextAt(size_t index) const;
// Returns the secondary string at the specified index. Secondary strings are
// displayed in a second line inside every menu item.
- virtual std::u16string GetDropDownSecondaryTextAt(int index) const;
+ virtual std::u16string GetDropDownSecondaryTextAt(size_t index) const;
// Gets the icon for the item at the specified index. ImageModel is empty if
// there is no icon.
- virtual ImageModel GetIconAt(int index) const;
+ virtual ImageModel GetIconAt(size_t index) const;
// Gets the icon for the item at |index|. ImageModel is empty if there is no
// icon. By default, it returns GetIconAt(index).
- virtual ImageModel GetDropDownIconAt(int index) const;
+ virtual ImageModel GetDropDownIconAt(size_t index) const;
// Should return true if the item at |index| is a non-selectable separator
// item.
- virtual bool IsItemSeparatorAt(int index) const;
+ virtual bool IsItemSeparatorAt(size_t index) const;
// The index of the item that is selected by default (before user
// interaction).
- virtual int GetDefaultIndex() const;
+ virtual absl::optional<size_t> GetDefaultIndex() const;
// Returns true if the item at |index| is enabled.
- virtual bool IsItemEnabledAt(int index) const;
+ virtual bool IsItemEnabledAt(size_t index) const;
// Adds/removes an observer.
void AddObserver(ComboboxModelObserver* observer);
diff --git a/chromium/ui/base/models/dialog_model.h b/chromium/ui/base/models/dialog_model.h
index e29e73a71be..3ab29e71f0c 100644
--- a/chromium/ui/base/models/dialog_model.h
+++ b/chromium/ui/base/models/dialog_model.h
@@ -40,7 +40,7 @@ class COMPONENT_EXPORT(UI_BASE) DialogModelDelegate {
friend class DialogModel;
void set_dialog_model(DialogModel* model) { dialog_model_ = model; }
- DialogModel* dialog_model_ = nullptr;
+ raw_ptr<DialogModel> dialog_model_ = nullptr;
};
// DialogModel represents a platform-and-toolkit agnostic data + behavior
@@ -149,6 +149,11 @@ class COMPONENT_EXPORT(UI_BASE) DialogModel final {
return *this;
}
+ Builder& SetMainImage(ImageModel main_image) {
+ model_->main_image_ = std::move(main_image);
+ return *this;
+ }
+
// Make screen readers announce the contents of the dialog as it appears.
// See |ax::mojom::Role::kAlertDialog|.
Builder& SetIsAlertDialog() {
@@ -372,6 +377,10 @@ class COMPONENT_EXPORT(UI_BASE) DialogModel final {
return title_;
}
+ const ImageModel& main_image(base::PassKey<DialogModelHost>) const {
+ return main_image_;
+ }
+
const ImageModel& icon(base::PassKey<DialogModelHost>) const { return icon_; }
const ImageModel& dark_mode_icon(base::PassKey<DialogModelHost>) const {
@@ -440,6 +449,8 @@ class COMPONENT_EXPORT(UI_BASE) DialogModel final {
ImageModel icon_;
ImageModel dark_mode_icon_;
+ ImageModel main_image_;
+
ImageModel banner_;
ImageModel dark_mode_banner_;
diff --git a/chromium/ui/base/models/dialog_model_field.cc b/chromium/ui/base/models/dialog_model_field.cc
index 5b1e9e34e16..9cd3a52669e 100644
--- a/chromium/ui/base/models/dialog_model_field.cc
+++ b/chromium/ui/base/models/dialog_model_field.cc
@@ -234,14 +234,14 @@ DialogModelCombobox::DialogModelCombobox(
: DialogModelField(pass_key, model, kCombobox, id, params.accelerators_),
label_(std::move(label)),
accessible_name_(params.accessible_name_),
- selected_index_(combobox_model->GetDefaultIndex()),
+ selected_index_(combobox_model->GetDefaultIndex().value()),
combobox_model_(std::move(combobox_model)),
callback_(params.callback_) {}
DialogModelCombobox::~DialogModelCombobox() = default;
void DialogModelCombobox::OnSelectedIndexChanged(base::PassKey<DialogModelHost>,
- int selected_index) {
+ size_t selected_index) {
selected_index_ = selected_index;
}
diff --git a/chromium/ui/base/models/dialog_model_field.h b/chromium/ui/base/models/dialog_model_field.h
index 9d7097ed725..37bded46a40 100644
--- a/chromium/ui/base/models/dialog_model_field.h
+++ b/chromium/ui/base/models/dialog_model_field.h
@@ -338,7 +338,7 @@ class COMPONENT_EXPORT(UI_BASE) DialogModelCombobox : public DialogModelField {
DialogModelCombobox& operator=(const DialogModelCombobox&) = delete;
~DialogModelCombobox() override;
- int selected_index() const { return selected_index_; }
+ size_t selected_index() const { return selected_index_; }
ui::ComboboxModel* combobox_model() { return combobox_model_.get(); }
// Methods with base::PassKey<DialogModelHost> are only intended to be called
@@ -350,7 +350,7 @@ class COMPONENT_EXPORT(UI_BASE) DialogModelCombobox : public DialogModelField {
return accessible_name_;
}
void OnSelectedIndexChanged(base::PassKey<DialogModelHost>,
- int selected_index);
+ size_t selected_index);
void OnPerformAction(base::PassKey<DialogModelHost>);
private:
@@ -358,7 +358,7 @@ class COMPONENT_EXPORT(UI_BASE) DialogModelCombobox : public DialogModelField {
const std::u16string label_;
const std::u16string accessible_name_;
- int selected_index_;
+ size_t selected_index_;
std::unique_ptr<ui::ComboboxModel> combobox_model_;
base::RepeatingClosure callback_;
};
diff --git a/chromium/ui/base/models/dialog_model_menu_model_adapter.cc b/chromium/ui/base/models/dialog_model_menu_model_adapter.cc
index a8e5fab3049..f76f801309d 100644
--- a/chromium/ui/base/models/dialog_model_menu_model_adapter.cc
+++ b/chromium/ui/base/models/dialog_model_menu_model_adapter.cc
@@ -36,96 +36,94 @@ bool DialogModelMenuModelAdapter::HasIcons() const {
return false;
}
-int DialogModelMenuModelAdapter::GetItemCount() const {
- return static_cast<int>(model_->fields(GetPassKey()).size());
+size_t DialogModelMenuModelAdapter::GetItemCount() const {
+ return model_->fields(GetPassKey()).size();
}
-MenuModel::ItemType DialogModelMenuModelAdapter::GetTypeAt(int index) const {
+MenuModel::ItemType DialogModelMenuModelAdapter::GetTypeAt(size_t index) const {
return GetField(index)->type(GetPassKey()) == DialogModelField::kSeparator
? TYPE_SEPARATOR
: TYPE_COMMAND;
}
MenuSeparatorType DialogModelMenuModelAdapter::GetSeparatorTypeAt(
- int index) const {
+ size_t index) const {
NOTREACHED();
return MenuSeparatorType::NORMAL_SEPARATOR;
}
-int DialogModelMenuModelAdapter::GetCommandIdAt(int index) const {
+int DialogModelMenuModelAdapter::GetCommandIdAt(size_t index) const {
// TODO(pbos): Figure out what this should be. Combobox seems to offset by
// 1000. Dunno why.
- return index + 1234;
+ return static_cast<int>(index + 1234);
}
-std::u16string DialogModelMenuModelAdapter::GetLabelAt(int index) const {
+std::u16string DialogModelMenuModelAdapter::GetLabelAt(size_t index) const {
return GetField(index)->AsMenuItem(GetPassKey())->label(GetPassKey());
}
-bool DialogModelMenuModelAdapter::IsItemDynamicAt(int index) const {
+bool DialogModelMenuModelAdapter::IsItemDynamicAt(size_t index) const {
return false;
}
bool DialogModelMenuModelAdapter::GetAcceleratorAt(
- int index,
+ size_t index,
ui::Accelerator* accelerator) const {
// TODO(pbos): Add support for accelerators.
return false;
}
-bool DialogModelMenuModelAdapter::IsItemCheckedAt(int index) const {
+bool DialogModelMenuModelAdapter::IsItemCheckedAt(size_t index) const {
// TODO(pbos): Add support for checkbox items.
return false;
}
-int DialogModelMenuModelAdapter::GetGroupIdAt(int index) const {
+int DialogModelMenuModelAdapter::GetGroupIdAt(size_t index) const {
NOTREACHED();
return -1;
}
-ImageModel DialogModelMenuModelAdapter::GetIconAt(int index) const {
+ImageModel DialogModelMenuModelAdapter::GetIconAt(size_t index) const {
return GetField(index)->AsMenuItem(GetPassKey())->icon(GetPassKey());
}
ButtonMenuItemModel* DialogModelMenuModelAdapter::GetButtonMenuItemAt(
- int index) const {
+ size_t index) const {
NOTREACHED();
return nullptr;
}
-bool DialogModelMenuModelAdapter::IsEnabledAt(int index) const {
+bool DialogModelMenuModelAdapter::IsEnabledAt(size_t index) const {
DCHECK_LT(index, GetItemCount());
const DialogModelField* const field = GetField(index);
- if (field->type(GetPassKey()) == DialogModelField::kSeparator)
- return false;
-
- return field->AsMenuItem(GetPassKey())->is_enabled(GetPassKey());
+ return field->type(GetPassKey()) != DialogModelField::kSeparator &&
+ field->AsMenuItem(GetPassKey())->is_enabled(GetPassKey());
}
-MenuModel* DialogModelMenuModelAdapter::GetSubmenuModelAt(int index) const {
+MenuModel* DialogModelMenuModelAdapter::GetSubmenuModelAt(size_t index) const {
NOTREACHED();
return nullptr;
}
-void DialogModelMenuModelAdapter::ActivatedAt(int index) {
+void DialogModelMenuModelAdapter::ActivatedAt(size_t index) {
// If this flags investigate why the ActivatedAt(index, event_flags) isn't
// being called.
NOTREACHED();
}
-void DialogModelMenuModelAdapter::ActivatedAt(int index, int event_flags) {
+void DialogModelMenuModelAdapter::ActivatedAt(size_t index, int event_flags) {
DialogModelMenuItem* menu_item = GetField(index)->AsMenuItem(GetPassKey());
menu_item->OnActivated(GetPassKey(), event_flags);
}
-const DialogModelField* DialogModelMenuModelAdapter::GetField(int index) const {
- DCHECK_GE(index, 0);
+const DialogModelField* DialogModelMenuModelAdapter::GetField(
+ size_t index) const {
DCHECK_LT(index, GetItemCount());
return model_->fields(GetPassKey())[index].get();
}
-DialogModelField* DialogModelMenuModelAdapter::GetField(int index) {
+DialogModelField* DialogModelMenuModelAdapter::GetField(size_t index) {
return const_cast<DialogModelField*>(
const_cast<const DialogModelMenuModelAdapter*>(this)->GetField(index));
}
diff --git a/chromium/ui/base/models/dialog_model_menu_model_adapter.h b/chromium/ui/base/models/dialog_model_menu_model_adapter.h
index c4ad50b1498..01a663d310f 100644
--- a/chromium/ui/base/models/dialog_model_menu_model_adapter.h
+++ b/chromium/ui/base/models/dialog_model_menu_model_adapter.h
@@ -27,25 +27,26 @@ class COMPONENT_EXPORT(UI_BASE) DialogModelMenuModelAdapter final
// MenuModel:
bool HasIcons() const override;
- int GetItemCount() const override;
- ItemType GetTypeAt(int index) const override;
- ui::MenuSeparatorType GetSeparatorTypeAt(int index) const override;
- int GetCommandIdAt(int index) const override;
- std::u16string GetLabelAt(int index) const override;
- bool IsItemDynamicAt(int index) const override;
- bool GetAcceleratorAt(int index, ui::Accelerator* accelerator) const override;
- bool IsItemCheckedAt(int index) const override;
- int GetGroupIdAt(int index) const override;
- ImageModel GetIconAt(int index) const override;
- ButtonMenuItemModel* GetButtonMenuItemAt(int index) const override;
- bool IsEnabledAt(int index) const override;
- MenuModel* GetSubmenuModelAt(int index) const override;
- void ActivatedAt(int index) override;
- void ActivatedAt(int index, int event_flags) override;
+ size_t GetItemCount() const override;
+ ItemType GetTypeAt(size_t index) const override;
+ ui::MenuSeparatorType GetSeparatorTypeAt(size_t index) const override;
+ int GetCommandIdAt(size_t index) const override;
+ std::u16string GetLabelAt(size_t index) const override;
+ bool IsItemDynamicAt(size_t index) const override;
+ bool GetAcceleratorAt(size_t index,
+ ui::Accelerator* accelerator) const override;
+ bool IsItemCheckedAt(size_t index) const override;
+ int GetGroupIdAt(size_t index) const override;
+ ImageModel GetIconAt(size_t index) const override;
+ ButtonMenuItemModel* GetButtonMenuItemAt(size_t index) const override;
+ bool IsEnabledAt(size_t index) const override;
+ MenuModel* GetSubmenuModelAt(size_t index) const override;
+ void ActivatedAt(size_t index) override;
+ void ActivatedAt(size_t index, int event_flags) override;
private:
- const DialogModelField* GetField(int index) const;
- DialogModelField* GetField(int index);
+ const DialogModelField* GetField(size_t index) const;
+ DialogModelField* GetField(size_t index);
std::unique_ptr<DialogModel> model_;
};
diff --git a/chromium/ui/base/models/list_selection_model.cc b/chromium/ui/base/models/list_selection_model.cc
index 0138856da32..154b70a1afe 100644
--- a/chromium/ui/base/models/list_selection_model.cc
+++ b/chromium/ui/base/models/list_selection_model.cc
@@ -9,33 +9,42 @@
#include "base/check_op.h"
#include "base/containers/contains.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_util.h"
namespace ui {
namespace {
-void IncrementFromImpl(int index, int* value) {
+void IncrementFromImpl(size_t index, size_t* value) {
if (*value >= index)
(*value)++;
}
+void IncrementFromImpl(size_t index, absl::optional<size_t>* value) {
+ if (value->has_value())
+ IncrementFromImpl(index, &value->value());
+}
+
// Returns true if |value| should be erased from its container.
-bool DecrementFromImpl(int index, int* value) {
- if (*value == index) {
- *value = ListSelectionModel::kUnselectedIndex;
+bool DecrementFromImpl(size_t index, size_t* value) {
+ if (*value == index)
return true;
- }
if (*value > index)
(*value)--;
return false;
}
-void MoveToLowerIndexImpl(int old_start,
- int new_start,
- int length,
- int* value) {
+void DecrementFromImpl(size_t index, absl::optional<size_t>* value) {
+ if (value->has_value() && DecrementFromImpl(index, &value->value()))
+ *value = absl::nullopt;
+}
+
+void MoveToLowerIndexImpl(size_t old_start,
+ size_t new_start,
+ size_t length,
+ size_t* value) {
DCHECK_LE(new_start, old_start);
- DCHECK_GE(length, 0);
// When a range of items moves to a lower index, the only affected indices
// are those in the interval [new_start, old_start + length).
if (new_start <= *value && *value < old_start + length) {
@@ -66,24 +75,23 @@ ListSelectionModel& ListSelectionModel::operator=(ListSelectionModel&&) =
default;
bool ListSelectionModel::operator==(const ListSelectionModel& other) const {
- return active() == other.active() && anchor() == other.anchor() &&
- selected_indices() == other.selected_indices();
+ return std::tie(active_, anchor_, selected_indices_) ==
+ std::tie(other.active_, other.anchor_, other.selected_indices_);
}
bool ListSelectionModel::operator!=(const ListSelectionModel& other) const {
return !operator==(other);
}
-void ListSelectionModel::IncrementFrom(int index) {
+void ListSelectionModel::IncrementFrom(size_t index) {
// Shift the selection to account for a newly inserted item at |index|.
- for (auto i = selected_indices_.begin(); i != selected_indices_.end(); ++i) {
- IncrementFromImpl(index, &(*i));
- }
+ for (size_t& selected_index : selected_indices_)
+ IncrementFromImpl(index, &selected_index);
IncrementFromImpl(index, &anchor_);
IncrementFromImpl(index, &active_);
}
-void ListSelectionModel::DecrementFrom(int index) {
+void ListSelectionModel::DecrementFrom(size_t index) {
for (auto i = selected_indices_.begin(); i != selected_indices_.end();) {
if (DecrementFromImpl(index, &(*i))) {
i = selected_indices_.erase(i);
@@ -95,55 +103,58 @@ void ListSelectionModel::DecrementFrom(int index) {
DecrementFromImpl(index, &active_);
}
-void ListSelectionModel::SetSelectedIndex(int index) {
+void ListSelectionModel::SetSelectedIndex(absl::optional<size_t> index) {
anchor_ = active_ = index;
selected_indices_.clear();
- if (index != kUnselectedIndex)
- selected_indices_.insert(index);
+ if (index.has_value())
+ selected_indices_.insert(index.value());
}
-bool ListSelectionModel::IsSelected(int index) const {
+bool ListSelectionModel::IsSelected(size_t index) const {
return base::Contains(selected_indices_, index);
}
-void ListSelectionModel::AddIndexToSelection(int index) {
+void ListSelectionModel::AddIndexToSelection(size_t index) {
selected_indices_.insert(index);
}
-void ListSelectionModel::AddIndexRangeToSelection(int index_start,
- int index_end) {
+void ListSelectionModel::AddIndexRangeToSelection(size_t index_start,
+ size_t index_end) {
DCHECK_LE(index_start, index_end);
if (index_start == index_end)
return AddIndexToSelection(index_start);
- for (int i = index_start; i <= index_end; ++i) {
+ for (size_t i = index_start; i <= index_end; ++i) {
selected_indices_.insert(i);
}
}
-void ListSelectionModel::RemoveIndexFromSelection(int index) {
+void ListSelectionModel::RemoveIndexFromSelection(size_t index) {
selected_indices_.erase(index);
}
-void ListSelectionModel::SetSelectionFromAnchorTo(int index) {
- if (anchor_ == kUnselectedIndex) {
+void ListSelectionModel::SetSelectionFromAnchorTo(size_t index) {
+ if (!anchor_.has_value()) {
SetSelectedIndex(index);
} else {
- int delta = std::abs(index - anchor_);
SelectedIndices new_selection;
- for (int i = 0, min = std::min(index, anchor_); i <= delta; ++i)
- new_selection.insert(i + min);
+ for (size_t min = std::min(index, anchor_.value()),
+ delta = std::max(index, anchor_.value()) - min, i = min;
+ i <= min + delta; ++i) {
+ new_selection.insert(i);
+ }
selected_indices_.swap(new_selection);
active_ = index;
}
}
-void ListSelectionModel::AddSelectionFromAnchorTo(int index) {
- if (anchor_ == kUnselectedIndex) {
+void ListSelectionModel::AddSelectionFromAnchorTo(size_t index) {
+ if (!anchor_.has_value()) {
SetSelectedIndex(index);
} else {
- for (int i = std::min(index, anchor_), end = std::max(index, anchor_);
+ for (size_t i = std::min(index, anchor_.value()),
+ end = std::max(index, anchor_.value());
i <= end; ++i) {
selected_indices_.insert(i);
}
@@ -151,10 +162,12 @@ void ListSelectionModel::AddSelectionFromAnchorTo(int index) {
}
}
-void ListSelectionModel::Move(int old_index, int new_index, int length) {
+void ListSelectionModel::Move(size_t old_index,
+ size_t new_index,
+ size_t length) {
// |length| many items are moving from index |old_index| to index |new_index|.
DCHECK_NE(old_index, new_index);
- DCHECK_GT(length, 0);
+ DCHECK_GT(length, 0u);
// Remap move-to-higher-index operations to the equivalent move-to-lower-index
// operation. As an example, the permutation "ABCDEFG" -> "CDEFABG" can be
@@ -167,8 +180,10 @@ void ListSelectionModel::Move(int old_index, int new_index, int length) {
// We know that |old_index| > |new_index|, so this is a move to a lower index.
// Start by transforming |anchor_| and |active_|.
- MoveToLowerIndexImpl(old_index, new_index, length, &anchor_);
- MoveToLowerIndexImpl(old_index, new_index, length, &active_);
+ if (anchor_.has_value())
+ MoveToLowerIndexImpl(old_index, new_index, length, &anchor_.value());
+ if (active_.has_value())
+ MoveToLowerIndexImpl(old_index, new_index, length, &active_.value());
// When a range of items moves to a lower index, the affected items are those
// in the interval [new_index, old_index + length). Search within
@@ -181,10 +196,11 @@ void ListSelectionModel::Move(int old_index, int new_index, int length) {
// The items originally in the interval [new_index, old_index) will see
// |length| many items inserted before them, so their indices increase.
auto middle = std::lower_bound(low, high, old_index);
- int pivot_value = new_index + length;
+ size_t pivot_value = new_index + length;
for (auto it = low; it != middle; ++it) {
(*it) += length;
- DCHECK(pivot_value <= (*it) && (*it) < (old_index + length));
+ DCHECK_LE(pivot_value, *it);
+ DCHECK_LT(*it, old_index + length);
}
// The items originally in the interval [old_index, old_index + length) are
@@ -192,7 +208,8 @@ void ListSelectionModel::Move(int old_index, int new_index, int length) {
// decrease.
for (auto it = middle; it != high; ++it) {
(*it) -= (old_index - new_index);
- DCHECK(new_index <= (*it) && (*it) < pivot_value);
+ DCHECK_LE(new_index, *it);
+ DCHECK_LT(*it, pivot_value);
}
// Reorder the ranges [low, middle), and [middle, high) so that the elements
@@ -204,8 +221,22 @@ void ListSelectionModel::Move(int old_index, int new_index, int length) {
}
void ListSelectionModel::Clear() {
- anchor_ = active_ = kUnselectedIndex;
+ anchor_ = active_ = absl::nullopt;
selected_indices_.clear();
}
+std::string ListSelectionModel::ToString() const {
+ const auto optional_to_string = [](const auto& opt) {
+ return opt.has_value() ? base::NumberToString(opt.value())
+ : std::string("<none>");
+ };
+ std::vector<std::string> index_strings;
+ base::ranges::transform(
+ selected_indices_, std::back_inserter(index_strings),
+ [](const auto& index) { return base::NumberToString(index); });
+ return "active=" + optional_to_string(active_) +
+ " anchor=" + optional_to_string(anchor_) +
+ " selection=" + base::JoinString(index_strings, " ");
+}
+
} // namespace ui
diff --git a/chromium/ui/base/models/list_selection_model.h b/chromium/ui/base/models/list_selection_model.h
index 7c672f9006f..87192afe048 100644
--- a/chromium/ui/base/models/list_selection_model.h
+++ b/chromium/ui/base/models/list_selection_model.h
@@ -9,27 +9,25 @@
#include "base/component_export.h"
#include "base/containers/flat_set.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
namespace ui {
-// Selection model represented as a list of ints. In addition to the set of
+// Selection model represented as a list of indexes. In addition to the set of
// selected indices ListSelectionModel maintains the following:
//
// active: The index of the currently visible item in the list. This will be
-// kUnselectedIndex if nothing is selected.
+// nullopt if nothing is selected.
//
// anchor: The index of the last item the user clicked on. Extending the
-// selection extends it from this index. This will be kUnselectedIndex
-// if nothing is selected.
+// selection extends it from this index. This will be nullopt if nothing
+// is selected.
//
// Typically there is only one selected item, in which case the anchor and
// active index correspond to the same thing.
class COMPONENT_EXPORT(UI_BASE) ListSelectionModel {
public:
- using SelectedIndices = base::flat_set<int>;
-
- // Used to identify no selection.
- static constexpr int kUnselectedIndex = -1;
+ using SelectedIndices = base::flat_set<size_t>;
ListSelectionModel();
ListSelectionModel(const ListSelectionModel& other);
@@ -44,12 +42,12 @@ class COMPONENT_EXPORT(UI_BASE) ListSelectionModel {
bool operator!=(const ListSelectionModel& other) const;
// See class description for details of the anchor.
- void set_anchor(int anchor) { anchor_ = anchor; }
- int anchor() const { return anchor_; }
+ void set_anchor(absl::optional<size_t> anchor) { anchor_ = anchor; }
+ absl::optional<size_t> anchor() const { return anchor_; }
// See class description for details of active.
- void set_active(int active) { active_ = active; }
- int active() const { return active_; }
+ void set_active(absl::optional<size_t> active) { active_ = active; }
+ absl::optional<size_t> active() const { return active_; }
// True if nothing is selected.
bool empty() const { return selected_indices_.empty(); }
@@ -61,39 +59,39 @@ class COMPONENT_EXPORT(UI_BASE) ListSelectionModel {
// of [0, 1, 5] and this is invoked with 1, it results in [0, 2, 6]. This also
// updates the anchor and active indices.
// This is used when a new item is inserted into the model.
- void IncrementFrom(int index);
+ void IncrementFrom(size_t index);
// Shifts all indices > |index| down by 1. If |index| is selected, it is
// removed. For example, if the selection consists of [0, 1, 5] and this is
// invoked with 1, it results in [0, 4]. This is used when an item is
// removed.
- void DecrementFrom(int index);
+ void DecrementFrom(size_t index);
// Sets the anchor, active and selection to |index|.
- void SetSelectedIndex(int index);
+ void SetSelectedIndex(absl::optional<size_t> index);
// Returns true if |index| is selected.
- bool IsSelected(int index) const;
+ bool IsSelected(size_t index) const;
// Adds |index| to the selection. This does not change the active or anchor
// indices.
- void AddIndexToSelection(int index);
+ void AddIndexToSelection(size_t index);
// Adds indices between |index_start| and |index_end|, inclusive.
// This does not change the active or anchor indices.
- void AddIndexRangeToSelection(int index_start, int index_end);
+ void AddIndexRangeToSelection(size_t index_start, size_t index_end);
// Removes |index| from the selection. This does not change the active or
// anchor indices.
- void RemoveIndexFromSelection(int index);
+ void RemoveIndexFromSelection(size_t index);
// Extends the selection from the anchor to |index|. If the anchor is empty,
// this sets the anchor, selection and active indices to |index|.
- void SetSelectionFromAnchorTo(int index);
+ void SetSelectionFromAnchorTo(size_t index);
// Makes sure the indices from the anchor to |index| are selected. This only
// adds to the selection.
- void AddSelectionFromAnchorTo(int index);
+ void AddSelectionFromAnchorTo(size_t index);
// Invoked when an item moves. |old_index| is the original index, |new_index|
// is the target index, and |length| is the number of items that are moving.
@@ -102,7 +100,7 @@ class COMPONENT_EXPORT(UI_BASE) ListSelectionModel {
// removing the elements at the index range [old_index, old_index + length).
// For example, consider three list items 'A B C', to move A to the end of
// the list, this should be invoked with '0, 2, 1'.
- void Move(int old_index, int new_index, int length);
+ void Move(size_t old_index, size_t new_index, size_t length);
// Sets the anchor and active to kUnselectedIndex, and removes all the
// selected indices.
@@ -112,12 +110,14 @@ class COMPONENT_EXPORT(UI_BASE) ListSelectionModel {
// order.
const SelectedIndices& selected_indices() const { return selected_indices_; }
+ // Returns the state of the selection model as a string. The format is:
+ // 'active=X anchor=X selection=X X X...'.
+ std::string ToString() const;
+
private:
SelectedIndices selected_indices_;
-
- int active_ = kUnselectedIndex;
-
- int anchor_ = kUnselectedIndex;
+ absl::optional<size_t> active_ = absl::nullopt;
+ absl::optional<size_t> anchor_ = absl::nullopt;
};
} // namespace ui
diff --git a/chromium/ui/base/models/list_selection_model_unittest.cc b/chromium/ui/base/models/list_selection_model_unittest.cc
index 898ae5ee8ca..aaf37982c78 100644
--- a/chromium/ui/base/models/list_selection_model_unittest.cc
+++ b/chromium/ui/base/models/list_selection_model_unittest.cc
@@ -16,43 +16,23 @@ namespace ui {
typedef testing::Test ListSelectionModelTest;
-// Returns the state of the selection model as a string. The format is:
-// 'active=X anchor=X selection=X X X...'.
-static std::string StateAsString(const ListSelectionModel& model) {
- std::string result = "active=" + base::NumberToString(model.active()) +
- " anchor=" + base::NumberToString(model.anchor()) +
- " selection=";
- const ListSelectionModel::SelectedIndices& selection(
- model.selected_indices());
- bool first = true;
- for (int index : selection) {
- if (first) {
- first = false;
- } else {
- result += " ";
- }
- result += base::NumberToString(index);
- }
- return result;
-}
-
TEST_F(ListSelectionModelTest, InitialState) {
ListSelectionModel model;
- EXPECT_EQ("active=-1 anchor=-1 selection=", StateAsString(model));
+ EXPECT_EQ("active=<none> anchor=<none> selection=", model.ToString());
EXPECT_TRUE(model.empty());
}
TEST_F(ListSelectionModelTest, SetSelectedIndex) {
ListSelectionModel model;
model.SetSelectedIndex(2);
- EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model));
+ EXPECT_EQ("active=2 anchor=2 selection=2", model.ToString());
EXPECT_FALSE(model.empty());
}
TEST_F(ListSelectionModelTest, SetSelectedIndexToEmpty) {
ListSelectionModel model;
- model.SetSelectedIndex(-1);
- EXPECT_EQ("active=-1 anchor=-1 selection=", StateAsString(model));
+ model.SetSelectedIndex(absl::nullopt);
+ EXPECT_EQ("active=<none> anchor=<none> selection=", model.ToString());
EXPECT_TRUE(model.empty());
}
@@ -60,30 +40,30 @@ TEST_F(ListSelectionModelTest, IncrementFrom) {
ListSelectionModel model;
model.SetSelectedIndex(1);
model.IncrementFrom(1);
- EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model));
+ EXPECT_EQ("active=2 anchor=2 selection=2", model.ToString());
// Increment from 4. This shouldn't effect the selection as its past the
// end of the selection.
model.IncrementFrom(4);
- EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model));
+ EXPECT_EQ("active=2 anchor=2 selection=2", model.ToString());
}
TEST_F(ListSelectionModelTest, DecrementFrom) {
ListSelectionModel model;
model.SetSelectedIndex(2);
model.DecrementFrom(0);
- EXPECT_EQ("active=1 anchor=1 selection=1", StateAsString(model));
+ EXPECT_EQ("active=1 anchor=1 selection=1", model.ToString());
// Shift down from 1. As the selection as the index being removed, this should
// clear the selection.
model.DecrementFrom(1);
- EXPECT_EQ("active=-1 anchor=-1 selection=", StateAsString(model));
+ EXPECT_EQ("active=<none> anchor=<none> selection=", model.ToString());
// Reset the selection to 2, and shift down from 4. This shouldn't do
// anything.
model.SetSelectedIndex(2);
model.DecrementFrom(4);
- EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model));
+ EXPECT_EQ("active=2 anchor=2 selection=2", model.ToString());
}
TEST_F(ListSelectionModelTest, IsSelected) {
@@ -96,51 +76,52 @@ TEST_F(ListSelectionModelTest, IsSelected) {
TEST_F(ListSelectionModelTest, AddIndexToSelected) {
ListSelectionModel model;
model.AddIndexToSelection(2);
- EXPECT_EQ("active=-1 anchor=-1 selection=2", StateAsString(model));
+ EXPECT_EQ("active=<none> anchor=<none> selection=2", model.ToString());
model.AddIndexToSelection(4);
- EXPECT_EQ("active=-1 anchor=-1 selection=2 4", StateAsString(model));
+ EXPECT_EQ("active=<none> anchor=<none> selection=2 4", model.ToString());
}
TEST_F(ListSelectionModelTest, AddIndexRangeToSelection) {
ListSelectionModel model;
model.AddIndexRangeToSelection(2, 3);
- EXPECT_EQ("active=-1 anchor=-1 selection=2 3", StateAsString(model));
+ EXPECT_EQ("active=<none> anchor=<none> selection=2 3", model.ToString());
model.AddIndexRangeToSelection(4, 5);
- EXPECT_EQ("active=-1 anchor=-1 selection=2 3 4 5", StateAsString(model));
+ EXPECT_EQ("active=<none> anchor=<none> selection=2 3 4 5", model.ToString());
model.AddIndexRangeToSelection(1, 1);
- EXPECT_EQ("active=-1 anchor=-1 selection=1 2 3 4 5", StateAsString(model));
+ EXPECT_EQ("active=<none> anchor=<none> selection=1 2 3 4 5",
+ model.ToString());
}
TEST_F(ListSelectionModelTest, RemoveIndexFromSelection) {
ListSelectionModel model;
model.SetSelectedIndex(2);
model.AddIndexToSelection(4);
- EXPECT_EQ("active=2 anchor=2 selection=2 4", StateAsString(model));
+ EXPECT_EQ("active=2 anchor=2 selection=2 4", model.ToString());
model.RemoveIndexFromSelection(4);
- EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model));
+ EXPECT_EQ("active=2 anchor=2 selection=2", model.ToString());
model.RemoveIndexFromSelection(2);
- EXPECT_EQ("active=2 anchor=2 selection=", StateAsString(model));
+ EXPECT_EQ("active=2 anchor=2 selection=", model.ToString());
}
TEST_F(ListSelectionModelTest, SetSelectionFromAnchorTo) {
ListSelectionModel model;
model.SetSelectedIndex(2);
model.SetSelectionFromAnchorTo(7);
- EXPECT_EQ("active=7 anchor=2 selection=2 3 4 5 6 7", StateAsString(model));
+ EXPECT_EQ("active=7 anchor=2 selection=2 3 4 5 6 7", model.ToString());
model.Clear();
model.SetSelectedIndex(7);
model.SetSelectionFromAnchorTo(2);
- EXPECT_EQ("active=2 anchor=7 selection=2 3 4 5 6 7", StateAsString(model));
+ EXPECT_EQ("active=2 anchor=7 selection=2 3 4 5 6 7", model.ToString());
model.Clear();
model.SetSelectionFromAnchorTo(7);
- EXPECT_EQ("active=7 anchor=7 selection=7", StateAsString(model));
+ EXPECT_EQ("active=7 anchor=7 selection=7", model.ToString());
}
TEST_F(ListSelectionModelTest, Clear) {
@@ -148,7 +129,7 @@ TEST_F(ListSelectionModelTest, Clear) {
model.SetSelectedIndex(2);
model.Clear();
- EXPECT_EQ("active=-1 anchor=-1 selection=", StateAsString(model));
+ EXPECT_EQ("active=<none> anchor=<none> selection=", model.ToString());
}
TEST_F(ListSelectionModelTest, MoveToLeft) {
@@ -158,33 +139,32 @@ TEST_F(ListSelectionModelTest, MoveToLeft) {
model.AddIndexToSelection(10);
model.set_anchor(4);
model.set_active(4);
- EXPECT_EQ("active=4 anchor=4 selection=0 4 10", StateAsString(model));
+ EXPECT_EQ("active=4 anchor=4 selection=0 4 10", model.ToString());
model.Move(4, 0, 1);
- EXPECT_EQ("active=0 anchor=0 selection=0 1 10", StateAsString(model));
+ EXPECT_EQ("active=0 anchor=0 selection=0 1 10", model.ToString());
model.Move(25, 1, 5);
- EXPECT_EQ("active=0 anchor=0 selection=0 6 15", StateAsString(model));
+ EXPECT_EQ("active=0 anchor=0 selection=0 6 15", model.ToString());
model.Move(5, 1, 2);
- EXPECT_EQ("active=0 anchor=0 selection=0 2 15", StateAsString(model));
+ EXPECT_EQ("active=0 anchor=0 selection=0 2 15", model.ToString());
model.Move(2, 0, 4);
- EXPECT_EQ("active=4 anchor=4 selection=0 4 15", StateAsString(model));
+ EXPECT_EQ("active=4 anchor=4 selection=0 4 15", model.ToString());
model.Move(1, 2, 1);
- EXPECT_EQ("active=4 anchor=4 selection=0 4 15", StateAsString(model));
+ EXPECT_EQ("active=4 anchor=4 selection=0 4 15", model.ToString());
model.Move(100, 5, 100000);
- EXPECT_EQ("active=4 anchor=4 selection=0 4 100015", StateAsString(model));
+ EXPECT_EQ("active=4 anchor=4 selection=0 4 100015", model.ToString());
model.Move(4, 0, 200000);
- EXPECT_EQ("active=0 anchor=0 selection=0 100011 200000",
- StateAsString(model));
+ EXPECT_EQ("active=0 anchor=0 selection=0 100011 200000", model.ToString());
model.Move(100011, 1, 1);
- EXPECT_EQ("active=0 anchor=0 selection=0 1 200000", StateAsString(model));
+ EXPECT_EQ("active=0 anchor=0 selection=0 1 200000", model.ToString());
model.Move(200000, 1, 1);
- EXPECT_EQ("active=0 anchor=0 selection=0 1 2", StateAsString(model));
+ EXPECT_EQ("active=0 anchor=0 selection=0 1 2", model.ToString());
model.AddIndexToSelection(4);
model.AddIndexToSelection(3);
- EXPECT_EQ("active=0 anchor=0 selection=0 1 2 3 4", StateAsString(model));
+ EXPECT_EQ("active=0 anchor=0 selection=0 1 2 3 4", model.ToString());
model.Move(3, 0, 3);
- EXPECT_EQ("active=3 anchor=3 selection=0 1 3 4 5", StateAsString(model));
+ EXPECT_EQ("active=3 anchor=3 selection=0 1 3 4 5", model.ToString());
model.Move(3, 1, 10);
- EXPECT_EQ("active=1 anchor=1 selection=0 1 2 3 11", StateAsString(model));
+ EXPECT_EQ("active=1 anchor=1 selection=0 1 2 3 11", model.ToString());
}
TEST_F(ListSelectionModelTest, MoveToRight) {
@@ -194,37 +174,34 @@ TEST_F(ListSelectionModelTest, MoveToRight) {
model.AddIndexToSelection(10);
model.set_anchor(0);
model.set_active(0);
- EXPECT_EQ("active=0 anchor=0 selection=0 4 10", StateAsString(model));
+ EXPECT_EQ("active=0 anchor=0 selection=0 4 10", model.ToString());
model.Move(0, 3, 1);
- EXPECT_EQ("active=3 anchor=3 selection=3 4 10", StateAsString(model));
+ EXPECT_EQ("active=3 anchor=3 selection=3 4 10", model.ToString());
model.Move(2, 4, 4);
- EXPECT_EQ("active=5 anchor=5 selection=5 6 10", StateAsString(model));
+ EXPECT_EQ("active=5 anchor=5 selection=5 6 10", model.ToString());
model.Move(5, 6, 1);
- EXPECT_EQ("active=6 anchor=6 selection=5 6 10", StateAsString(model));
+ EXPECT_EQ("active=6 anchor=6 selection=5 6 10", model.ToString());
model.Move(5, 6, 2);
- EXPECT_EQ("active=7 anchor=7 selection=6 7 10", StateAsString(model));
+ EXPECT_EQ("active=7 anchor=7 selection=6 7 10", model.ToString());
model.Move(1, 2, 3);
- EXPECT_EQ("active=7 anchor=7 selection=6 7 10", StateAsString(model));
+ EXPECT_EQ("active=7 anchor=7 selection=6 7 10", model.ToString());
model.Move(1, 6, 4);
- EXPECT_EQ("active=3 anchor=3 selection=2 3 10", StateAsString(model));
+ EXPECT_EQ("active=3 anchor=3 selection=2 3 10", model.ToString());
model.Move(0, 7000000, 3);
- EXPECT_EQ("active=0 anchor=0 selection=0 7 7000002", StateAsString(model));
+ EXPECT_EQ("active=0 anchor=0 selection=0 7 7000002", model.ToString());
model.Move(10, 30, 7000000);
- EXPECT_EQ("active=0 anchor=0 selection=0 7 7000022", StateAsString(model));
+ EXPECT_EQ("active=0 anchor=0 selection=0 7 7000022", model.ToString());
model.AddIndexToSelection(10);
model.AddIndexToSelection(20);
model.AddIndexToSelection(21);
EXPECT_EQ("active=0 anchor=0 selection=0 7 10 20 21 7000022",
- StateAsString(model));
+ model.ToString());
model.Move(22, 9000000, 7000000);
- EXPECT_EQ("active=0 anchor=0 selection=0 7 10 20 21 22",
- StateAsString(model));
+ EXPECT_EQ("active=0 anchor=0 selection=0 7 10 20 21 22", model.ToString());
model.Move(0, 10, 10);
- EXPECT_EQ("active=10 anchor=10 selection=0 10 17 20 21 22",
- StateAsString(model));
+ EXPECT_EQ("active=10 anchor=10 selection=0 10 17 20 21 22", model.ToString());
model.Move(1, 10, 10);
- EXPECT_EQ("active=19 anchor=19 selection=0 7 19 20 21 22",
- StateAsString(model));
+ EXPECT_EQ("active=19 anchor=19 selection=0 7 19 20 21 22", model.ToString());
}
TEST_F(ListSelectionModelTest, Copy) {
@@ -232,10 +209,10 @@ TEST_F(ListSelectionModelTest, Copy) {
model.SetSelectedIndex(0);
model.AddIndexToSelection(4);
model.AddIndexToSelection(10);
- EXPECT_EQ("active=0 anchor=0 selection=0 4 10", StateAsString(model));
+ EXPECT_EQ("active=0 anchor=0 selection=0 4 10", model.ToString());
ListSelectionModel model2;
model2 = model;
- EXPECT_EQ("active=0 anchor=0 selection=0 4 10", StateAsString(model2));
+ EXPECT_EQ("active=0 anchor=0 selection=0 4 10", model2.ToString());
}
TEST_F(ListSelectionModelTest, AddSelectionFromAnchorTo) {
@@ -243,10 +220,10 @@ TEST_F(ListSelectionModelTest, AddSelectionFromAnchorTo) {
model.SetSelectedIndex(2);
model.AddSelectionFromAnchorTo(4);
- EXPECT_EQ("active=4 anchor=2 selection=2 3 4", StateAsString(model));
+ EXPECT_EQ("active=4 anchor=2 selection=2 3 4", model.ToString());
model.AddSelectionFromAnchorTo(0);
- EXPECT_EQ("active=0 anchor=2 selection=0 1 2 3 4", StateAsString(model));
+ EXPECT_EQ("active=0 anchor=2 selection=0 1 2 3 4", model.ToString());
}
TEST_F(ListSelectionModelTest, Equals) {
diff --git a/chromium/ui/base/models/menu_model.cc b/chromium/ui/base/models/menu_model.cc
index 765db4a01bf..8ab63272a5f 100644
--- a/chromium/ui/base/models/menu_model.cc
+++ b/chromium/ui/base/models/menu_model.cc
@@ -15,29 +15,29 @@ MenuModel::~MenuModel() {
menu_model_delegate_->OnMenuClearingDelegate();
}
-bool MenuModel::IsVisibleAt(int index) const {
+bool MenuModel::IsVisibleAt(size_t index) const {
return true;
}
-bool MenuModel::IsAlertedAt(int index) const {
+bool MenuModel::IsAlertedAt(size_t index) const {
return false;
}
-bool MenuModel::IsNewFeatureAt(int index) const {
+bool MenuModel::IsNewFeatureAt(size_t index) const {
return false;
}
-ElementIdentifier MenuModel::GetElementIdentifierAt(int index) const {
+ElementIdentifier MenuModel::GetElementIdentifierAt(size_t index) const {
return ElementIdentifier();
}
// static
bool MenuModel::GetModelAndIndexForCommandId(int command_id,
MenuModel** model,
- int* index) {
- const int item_count = (*model)->GetItemCount();
- for (int i = 0; i < item_count; ++i) {
- const int candidate_index = i;
+ size_t* index) {
+ const size_t item_count = (*model)->GetItemCount();
+ for (size_t i = 0; i < item_count; ++i) {
+ const size_t candidate_index = i;
// Actionable submenus have commands.
if ((*model)->GetTypeAt(candidate_index) == TYPE_ACTIONABLE_SUBMENU &&
(*model)->GetCommandIdAt(candidate_index) == command_id) {
@@ -60,32 +60,32 @@ bool MenuModel::GetModelAndIndexForCommandId(int command_id,
return false;
}
-std::u16string MenuModel::GetMinorTextAt(int index) const {
+std::u16string MenuModel::GetMinorTextAt(size_t index) const {
return std::u16string();
}
-std::u16string MenuModel::GetSecondaryLabelAt(int index) const {
+std::u16string MenuModel::GetSecondaryLabelAt(size_t index) const {
return std::u16string();
}
-ImageModel MenuModel::GetMinorIconAt(int index) const {
+ImageModel MenuModel::GetMinorIconAt(size_t index) const {
return ImageModel();
}
-bool MenuModel::MayHaveMnemonicsAt(int index) const {
+bool MenuModel::MayHaveMnemonicsAt(size_t index) const {
return true;
}
-std::u16string MenuModel::GetAccessibleNameAt(int index) const {
+std::u16string MenuModel::GetAccessibleNameAt(size_t index) const {
return std::u16string();
}
-const gfx::FontList* MenuModel::GetLabelFontListAt(int index) const {
+const gfx::FontList* MenuModel::GetLabelFontListAt(size_t index) const {
return nullptr;
}
// Default implementation ignores the event flags.
-void MenuModel::ActivatedAt(int index, int event_flags) {
+void MenuModel::ActivatedAt(size_t index, int event_flags) {
ActivatedAt(index);
}
diff --git a/chromium/ui/base/models/menu_model.h b/chromium/ui/base/models/menu_model.h
index 11f1421cc79..016a06e5187 100644
--- a/chromium/ui/base/models/menu_model.h
+++ b/chromium/ui/base/models/menu_model.h
@@ -55,97 +55,97 @@ class COMPONENT_EXPORT(UI_BASE) MenuModel
virtual bool HasIcons() const = 0;
// Returns the number of items in the menu.
- virtual int GetItemCount() const = 0;
+ virtual size_t GetItemCount() const = 0;
// Returns the type of item at the specified index.
- virtual ItemType GetTypeAt(int index) const = 0;
+ virtual ItemType GetTypeAt(size_t index) const = 0;
// Returns the separator type at the specified index.
- virtual ui::MenuSeparatorType GetSeparatorTypeAt(int index) const = 0;
+ virtual ui::MenuSeparatorType GetSeparatorTypeAt(size_t index) const = 0;
// Returns the command id of the item at the specified index.
- virtual int GetCommandIdAt(int index) const = 0;
+ virtual int GetCommandIdAt(size_t index) const = 0;
// Returns the label of the item at the specified index.
- virtual std::u16string GetLabelAt(int index) const = 0;
+ virtual std::u16string GetLabelAt(size_t index) const = 0;
// Returns the secondary label of the item at the specified index. Secondary
// label is shown below the label.
- virtual std::u16string GetSecondaryLabelAt(int index) const;
+ virtual std::u16string GetSecondaryLabelAt(size_t index) const;
// Returns the minor text of the item at the specified index. The minor text
// is rendered to the right of the label and using the font GetLabelFontAt().
- virtual std::u16string GetMinorTextAt(int index) const;
+ virtual std::u16string GetMinorTextAt(size_t index) const;
// Returns the minor icon of the item at the specified index. The minor icon
// is rendered to the left of the minor text.
- virtual ImageModel GetMinorIconAt(int index) const;
+ virtual ImageModel GetMinorIconAt(size_t index) const;
// Returns true if the menu item (label/sublabel/icon) at the specified
// index can change over the course of the menu's lifetime. If this function
// returns true, the label, sublabel and icon of the menu item will be
// updated each time the menu is shown.
- virtual bool IsItemDynamicAt(int index) const = 0;
+ virtual bool IsItemDynamicAt(size_t index) const = 0;
// Returns whether the menu item at the specified index has a user-set title,
// in which case it should always be treated as plain text.
- virtual bool MayHaveMnemonicsAt(int index) const;
+ virtual bool MayHaveMnemonicsAt(size_t index) const;
// Returns the accessible name for the menu item at the specified index.
- virtual std::u16string GetAccessibleNameAt(int index) const;
+ virtual std::u16string GetAccessibleNameAt(size_t index) const;
// Returns the font list used for the label at the specified index.
// If NULL, then the default font list should be used.
- virtual const gfx::FontList* GetLabelFontListAt(int index) const;
+ virtual const gfx::FontList* GetLabelFontListAt(size_t index) const;
// Gets the accelerator information for the specified index, returning true if
// there is a shortcut accelerator for the item, false otherwise.
- virtual bool GetAcceleratorAt(int index,
+ virtual bool GetAcceleratorAt(size_t index,
ui::Accelerator* accelerator) const = 0;
// Returns the checked state of the item at the specified index.
- virtual bool IsItemCheckedAt(int index) const = 0;
+ virtual bool IsItemCheckedAt(size_t index) const = 0;
// Returns the id of the group of radio items that the item at the specified
// index belongs to.
- virtual int GetGroupIdAt(int index) const = 0;
+ virtual int GetGroupIdAt(size_t index) const = 0;
// Gets the icon for the item at the specified index. ImageModel is empty if
// there is no icon.
- virtual ImageModel GetIconAt(int index) const = 0;
+ virtual ImageModel GetIconAt(size_t index) const = 0;
// Returns the model for a menu item with a line of buttons at |index|.
- virtual ButtonMenuItemModel* GetButtonMenuItemAt(int index) const = 0;
+ virtual ButtonMenuItemModel* GetButtonMenuItemAt(size_t index) const = 0;
// Returns the enabled state of the item at the specified index.
- virtual bool IsEnabledAt(int index) const = 0;
+ virtual bool IsEnabledAt(size_t index) const = 0;
// Returns true if the menu item is visible.
- virtual bool IsVisibleAt(int index) const;
+ virtual bool IsVisibleAt(size_t index) const;
// Returns true if the item is rendered specially to draw attention
// for in-product help.
- virtual bool IsAlertedAt(int index) const;
+ virtual bool IsAlertedAt(size_t index) const;
// Returns true if the menu item grants access to a new feature that we want
// to show off to users (items marked as new will receive a "New" badge when
// the appropriate flag is enabled).
- virtual bool IsNewFeatureAt(int index) const;
+ virtual bool IsNewFeatureAt(size_t index) const;
// Returns an application-window-unique identifier that can be used to track
// the menu item irrespective of menu-specific command IDs.
- virtual ElementIdentifier GetElementIdentifierAt(int index) const;
+ virtual ElementIdentifier GetElementIdentifierAt(size_t index) const;
// Returns the model for the submenu at the specified index.
- virtual MenuModel* GetSubmenuModelAt(int index) const = 0;
+ virtual MenuModel* GetSubmenuModelAt(size_t index) const = 0;
// Called when the item at the specified index has been activated.
- virtual void ActivatedAt(int index) = 0;
+ virtual void ActivatedAt(size_t index) = 0;
// Called when the item has been activated with given event flags.
// (for the case where the activation involves a navigation).
// |event_flags| is a bit mask of ui::EventFlags.
- virtual void ActivatedAt(int index, int event_flags);
+ virtual void ActivatedAt(size_t index, int event_flags);
// Called when the menu is about to be shown.
virtual void MenuWillShow() {}
@@ -169,7 +169,7 @@ class COMPONENT_EXPORT(UI_BASE) MenuModel
// and specifies the model to start searching from.
static bool GetModelAndIndexForCommandId(int command_id,
MenuModel** model,
- int* index);
+ size_t* index);
private:
// MenuModelDelegate. Weak. Could be null.
diff --git a/chromium/ui/base/models/simple_combobox_model.cc b/chromium/ui/base/models/simple_combobox_model.cc
index fd2ef3ed090..593a5c4ee6d 100644
--- a/chromium/ui/base/models/simple_combobox_model.cc
+++ b/chromium/ui/base/models/simple_combobox_model.cc
@@ -34,29 +34,29 @@ SimpleComboboxModel::SimpleComboboxModel(std::vector<Item> items)
SimpleComboboxModel::~SimpleComboboxModel() = default;
-int SimpleComboboxModel::GetItemCount() const {
+size_t SimpleComboboxModel::GetItemCount() const {
return items_.size();
}
-std::u16string SimpleComboboxModel::GetItemAt(int index) const {
+std::u16string SimpleComboboxModel::GetItemAt(size_t index) const {
return items_[index].text;
}
std::u16string SimpleComboboxModel::GetDropDownSecondaryTextAt(
- int index) const {
+ size_t index) const {
return items_[index].dropdown_secondary_text;
}
-ui::ImageModel SimpleComboboxModel::GetIconAt(int index) const {
+ui::ImageModel SimpleComboboxModel::GetIconAt(size_t index) const {
return items_[index].icon;
}
-bool SimpleComboboxModel::IsItemSeparatorAt(int index) const {
+bool SimpleComboboxModel::IsItemSeparatorAt(size_t index) const {
return items_[index].text.empty();
}
-int SimpleComboboxModel::GetDefaultIndex() const {
- return 0;
+absl::optional<size_t> SimpleComboboxModel::GetDefaultIndex() const {
+ return size_t{0};
}
} // namespace ui
diff --git a/chromium/ui/base/models/simple_combobox_model.h b/chromium/ui/base/models/simple_combobox_model.h
index 4f29cc9d44c..451cca66bc9 100644
--- a/chromium/ui/base/models/simple_combobox_model.h
+++ b/chromium/ui/base/models/simple_combobox_model.h
@@ -44,12 +44,12 @@ class COMPONENT_EXPORT(UI_BASE) SimpleComboboxModel : public ComboboxModel {
~SimpleComboboxModel() override;
// ui::ComboboxModel:
- int GetItemCount() const override;
- std::u16string GetItemAt(int index) const override;
- std::u16string GetDropDownSecondaryTextAt(int index) const override;
- ui::ImageModel GetIconAt(int index) const override;
- bool IsItemSeparatorAt(int index) const override;
- int GetDefaultIndex() const override;
+ size_t GetItemCount() const override;
+ std::u16string GetItemAt(size_t index) const override;
+ std::u16string GetDropDownSecondaryTextAt(size_t index) const override;
+ ui::ImageModel GetIconAt(size_t index) const override;
+ bool IsItemSeparatorAt(size_t index) const override;
+ absl::optional<size_t> GetDefaultIndex() const override;
private:
const std::vector<Item> items_;
diff --git a/chromium/ui/base/models/simple_menu_model.cc b/chromium/ui/base/models/simple_menu_model.cc
index a787411f89e..6e1ed6b05b9 100644
--- a/chromium/ui/base/models/simple_menu_model.cc
+++ b/chromium/ui/base/models/simple_menu_model.cc
@@ -225,18 +225,19 @@ void SimpleMenuModel::AddActionableSubmenuWithStringIdAndIcon(
AppendItem(std::move(item));
}
-void SimpleMenuModel::InsertItemAt(int index,
+void SimpleMenuModel::InsertItemAt(size_t index,
int command_id,
const std::u16string& label) {
InsertItemAtIndex(Item(command_id, TYPE_COMMAND, label), index);
}
-void SimpleMenuModel::InsertItemWithStringIdAt(
- int index, int command_id, int string_id) {
+void SimpleMenuModel::InsertItemWithStringIdAt(size_t index,
+ int command_id,
+ int string_id) {
InsertItemAt(index, command_id, l10n_util::GetStringUTF16(string_id));
}
-void SimpleMenuModel::InsertSeparatorAt(int index,
+void SimpleMenuModel::InsertSeparatorAt(size_t index,
MenuSeparatorType separator_type) {
#if !defined(USE_AURA)
if (separator_type != NORMAL_SEPARATOR) {
@@ -248,18 +249,19 @@ void SimpleMenuModel::InsertSeparatorAt(int index,
InsertItemAtIndex(std::move(item), index);
}
-void SimpleMenuModel::InsertCheckItemAt(int index,
+void SimpleMenuModel::InsertCheckItemAt(size_t index,
int command_id,
const std::u16string& label) {
InsertItemAtIndex(Item(command_id, TYPE_CHECK, label), index);
}
-void SimpleMenuModel::InsertCheckItemWithStringIdAt(
- int index, int command_id, int string_id) {
+void SimpleMenuModel::InsertCheckItemWithStringIdAt(size_t index,
+ int command_id,
+ int string_id) {
InsertCheckItemAt(index, command_id, l10n_util::GetStringUTF16(string_id));
}
-void SimpleMenuModel::InsertRadioItemAt(int index,
+void SimpleMenuModel::InsertRadioItemAt(size_t index,
int command_id,
const std::u16string& label,
int group_id) {
@@ -268,13 +270,15 @@ void SimpleMenuModel::InsertRadioItemAt(int index,
InsertItemAtIndex(std::move(item), index);
}
-void SimpleMenuModel::InsertRadioItemWithStringIdAt(
- int index, int command_id, int string_id, int group_id) {
+void SimpleMenuModel::InsertRadioItemWithStringIdAt(size_t index,
+ int command_id,
+ int string_id,
+ int group_id) {
InsertRadioItemAt(
index, command_id, l10n_util::GetStringUTF16(string_id), group_id);
}
-void SimpleMenuModel::InsertSubMenuAt(int index,
+void SimpleMenuModel::InsertSubMenuAt(size_t index,
int command_id,
const std::u16string& label,
MenuModel* model) {
@@ -283,68 +287,71 @@ void SimpleMenuModel::InsertSubMenuAt(int index,
InsertItemAtIndex(std::move(item), index);
}
-void SimpleMenuModel::InsertSubMenuWithStringIdAt(
- int index, int command_id, int string_id, MenuModel* model) {
+void SimpleMenuModel::InsertSubMenuWithStringIdAt(size_t index,
+ int command_id,
+ int string_id,
+ MenuModel* model) {
InsertSubMenuAt(index, command_id, l10n_util::GetStringUTF16(string_id),
model);
}
-void SimpleMenuModel::RemoveItemAt(int index) {
- items_.erase(items_.begin() + ValidateItemIndex(index));
+void SimpleMenuModel::RemoveItemAt(size_t index) {
+ items_.erase(items_.begin() +
+ static_cast<ptrdiff_t>(ValidateItemIndex(index)));
MenuItemsChanged();
}
-void SimpleMenuModel::SetIcon(int index, const ui::ImageModel& icon) {
+void SimpleMenuModel::SetIcon(size_t index, const ui::ImageModel& icon) {
items_[ValidateItemIndex(index)].icon = icon;
MenuItemsChanged();
}
-void SimpleMenuModel::SetLabel(int index, const std::u16string& label) {
+void SimpleMenuModel::SetLabel(size_t index, const std::u16string& label) {
items_[ValidateItemIndex(index)].label = label;
MenuItemsChanged();
}
-void SimpleMenuModel::SetMinorText(int index,
+void SimpleMenuModel::SetMinorText(size_t index,
const std::u16string& minor_text) {
items_[ValidateItemIndex(index)].minor_text = minor_text;
}
-void SimpleMenuModel::SetMinorIcon(int index,
+void SimpleMenuModel::SetMinorIcon(size_t index,
const ui::ImageModel& minor_icon) {
items_[ValidateItemIndex(index)].minor_icon = minor_icon;
}
-void SimpleMenuModel::SetEnabledAt(int index, bool enabled) {
+void SimpleMenuModel::SetEnabledAt(size_t index, bool enabled) {
if (items_[ValidateItemIndex(index)].enabled == enabled)
return;
- items_[ValidateItemIndex(index)].enabled = enabled;
+ items_[index].enabled = enabled;
MenuItemsChanged();
}
-void SimpleMenuModel::SetVisibleAt(int index, bool visible) {
+void SimpleMenuModel::SetVisibleAt(size_t index, bool visible) {
if (items_[ValidateItemIndex(index)].visible == visible)
return;
- items_[ValidateItemIndex(index)].visible = visible;
+ items_[index].visible = visible;
MenuItemsChanged();
}
-void SimpleMenuModel::SetIsNewFeatureAt(int index, bool is_new_feature) {
+void SimpleMenuModel::SetIsNewFeatureAt(size_t index, bool is_new_feature) {
items_[ValidateItemIndex(index)].is_new_feature = is_new_feature;
}
-void SimpleMenuModel::SetMayHaveMnemonicsAt(int index,
+void SimpleMenuModel::SetMayHaveMnemonicsAt(size_t index,
bool may_have_mnemonics) {
items_[ValidateItemIndex(index)].may_have_mnemonics = may_have_mnemonics;
}
-void SimpleMenuModel::SetAccessibleNameAt(int index,
+void SimpleMenuModel::SetAccessibleNameAt(size_t index,
std::u16string accessible_name) {
items_[ValidateItemIndex(index)].accessible_name = std::move(accessible_name);
}
-void SimpleMenuModel::SetElementIdentifierAt(int index,
+void SimpleMenuModel::SetElementIdentifierAt(size_t index,
ElementIdentifier unique_id) {
items_[ValidateItemIndex(index)].unique_id = unique_id;
}
@@ -354,19 +361,20 @@ void SimpleMenuModel::Clear() {
MenuItemsChanged();
}
-int SimpleMenuModel::GetIndexOfCommandId(int command_id) const {
+absl::optional<size_t> SimpleMenuModel::GetIndexOfCommandId(
+ int command_id) const {
for (auto i = items_.begin(); i != items_.end(); ++i) {
if (i->command_id == command_id)
- return static_cast<int>(std::distance(items_.begin(), i));
+ return static_cast<size_t>(std::distance(items_.begin(), i));
}
- return -1;
+ return absl::nullopt;
}
////////////////////////////////////////////////////////////////////////////////
// SimpleMenuModel, MenuModel implementation:
bool SimpleMenuModel::HasIcons() const {
- for (int i = 0; i < GetItemCount(); ++i) {
+ for (size_t i = 0; i < GetItemCount(); ++i) {
if (!GetIconAt(i).IsEmpty())
return true;
}
@@ -374,76 +382,70 @@ bool SimpleMenuModel::HasIcons() const {
return false;
}
-int SimpleMenuModel::GetItemCount() const {
- return static_cast<int>(items_.size());
+size_t SimpleMenuModel::GetItemCount() const {
+ return items_.size();
}
-MenuModel::ItemType SimpleMenuModel::GetTypeAt(int index) const {
+MenuModel::ItemType SimpleMenuModel::GetTypeAt(size_t index) const {
return items_[ValidateItemIndex(index)].type;
}
-ui::MenuSeparatorType SimpleMenuModel::GetSeparatorTypeAt(int index) const {
+ui::MenuSeparatorType SimpleMenuModel::GetSeparatorTypeAt(size_t index) const {
return items_[ValidateItemIndex(index)].separator_type;
}
-int SimpleMenuModel::GetCommandIdAt(int index) const {
+int SimpleMenuModel::GetCommandIdAt(size_t index) const {
return items_[ValidateItemIndex(index)].command_id;
}
-std::u16string SimpleMenuModel::GetLabelAt(int index) const {
+std::u16string SimpleMenuModel::GetLabelAt(size_t index) const {
if (IsItemDynamicAt(index))
return delegate_->GetLabelForCommandId(GetCommandIdAt(index));
return items_[ValidateItemIndex(index)].label;
}
-std::u16string SimpleMenuModel::GetMinorTextAt(int index) const {
+std::u16string SimpleMenuModel::GetMinorTextAt(size_t index) const {
return items_[ValidateItemIndex(index)].minor_text;
}
-ImageModel SimpleMenuModel::GetMinorIconAt(int index) const {
+ImageModel SimpleMenuModel::GetMinorIconAt(size_t index) const {
return items_[ValidateItemIndex(index)].minor_icon;
}
-bool SimpleMenuModel::IsItemDynamicAt(int index) const {
- if (delegate_)
- return delegate_->IsItemForCommandIdDynamic(GetCommandIdAt(index));
- return false;
+bool SimpleMenuModel::IsItemDynamicAt(size_t index) const {
+ return delegate_ &&
+ delegate_->IsItemForCommandIdDynamic(GetCommandIdAt(index));
}
-bool SimpleMenuModel::GetAcceleratorAt(int index,
+bool SimpleMenuModel::GetAcceleratorAt(size_t index,
ui::Accelerator* accelerator) const {
- if (delegate_) {
- return delegate_->GetAcceleratorForCommandId(GetCommandIdAt(index),
- accelerator);
- }
- return false;
+ return delegate_ && delegate_->GetAcceleratorForCommandId(
+ GetCommandIdAt(index), accelerator);
}
-bool SimpleMenuModel::IsItemCheckedAt(int index) const {
+bool SimpleMenuModel::IsItemCheckedAt(size_t index) const {
if (!delegate_)
return false;
MenuModel::ItemType item_type = GetTypeAt(index);
- return (item_type == TYPE_CHECK || item_type == TYPE_RADIO) ?
- delegate_->IsCommandIdChecked(GetCommandIdAt(index)) : false;
+ return (item_type == TYPE_CHECK || item_type == TYPE_RADIO) &&
+ delegate_->IsCommandIdChecked(GetCommandIdAt(index));
}
-int SimpleMenuModel::GetGroupIdAt(int index) const {
+int SimpleMenuModel::GetGroupIdAt(size_t index) const {
return items_[ValidateItemIndex(index)].group_id;
}
-ImageModel SimpleMenuModel::GetIconAt(int index) const {
+ImageModel SimpleMenuModel::GetIconAt(size_t index) const {
if (IsItemDynamicAt(index))
return delegate_->GetIconForCommandId(GetCommandIdAt(index));
-
- ValidateItemIndex(index);
- return items_[index].icon;
+ return items_[ValidateItemIndex(index)].icon;
}
-ButtonMenuItemModel* SimpleMenuModel::GetButtonMenuItemAt(int index) const {
+ButtonMenuItemModel* SimpleMenuModel::GetButtonMenuItemAt(size_t index) const {
return items_[ValidateItemIndex(index)].button_model;
}
-bool SimpleMenuModel::IsEnabledAt(int index) const {
+bool SimpleMenuModel::IsEnabledAt(size_t index) const {
int command_id = GetCommandIdAt(index);
if (!delegate_ || command_id == kSeparatorId || GetButtonMenuItemAt(index))
@@ -453,7 +455,7 @@ bool SimpleMenuModel::IsEnabledAt(int index) const {
items_[ValidateItemIndex(index)].enabled;
}
-bool SimpleMenuModel::IsVisibleAt(int index) const {
+bool SimpleMenuModel::IsVisibleAt(size_t index) const {
int command_id = GetCommandIdAt(index);
if (!delegate_ || command_id == kSeparatorId || command_id == kTitleId ||
GetButtonMenuItemAt(index)) {
@@ -464,7 +466,7 @@ bool SimpleMenuModel::IsVisibleAt(int index) const {
items_[ValidateItemIndex(index)].visible;
}
-bool SimpleMenuModel::IsAlertedAt(int index) const {
+bool SimpleMenuModel::IsAlertedAt(size_t index) const {
const int command_id = GetCommandIdAt(index);
if (!delegate_ || command_id == kSeparatorId || command_id == kTitleId)
return false;
@@ -472,7 +474,7 @@ bool SimpleMenuModel::IsAlertedAt(int index) const {
// This method needs to be recursive, because if the highlighted command is
// in a submenu then the submenu item should also be highlighted.
if (auto* const submenu = GetSubmenuModelAt(index)) {
- for (int i = 0; i < submenu->GetItemCount(); ++i) {
+ for (size_t i = 0; i < submenu->GetItemCount(); ++i) {
if (submenu->IsAlertedAt(i))
return true;
}
@@ -481,32 +483,32 @@ bool SimpleMenuModel::IsAlertedAt(int index) const {
return delegate_->IsCommandIdAlerted(command_id);
}
-bool SimpleMenuModel::IsNewFeatureAt(int index) const {
+bool SimpleMenuModel::IsNewFeatureAt(size_t index) const {
return items_[ValidateItemIndex(index)].is_new_feature;
}
-bool SimpleMenuModel::MayHaveMnemonicsAt(int index) const {
+bool SimpleMenuModel::MayHaveMnemonicsAt(size_t index) const {
return items_[ValidateItemIndex(index)].may_have_mnemonics;
}
-std::u16string SimpleMenuModel::GetAccessibleNameAt(int index) const {
+std::u16string SimpleMenuModel::GetAccessibleNameAt(size_t index) const {
return items_[ValidateItemIndex(index)].accessible_name;
}
-ElementIdentifier SimpleMenuModel::GetElementIdentifierAt(int index) const {
+ElementIdentifier SimpleMenuModel::GetElementIdentifierAt(size_t index) const {
return items_[ValidateItemIndex(index)].unique_id;
}
-void SimpleMenuModel::ActivatedAt(int index) {
+void SimpleMenuModel::ActivatedAt(size_t index) {
ActivatedAt(index, 0);
}
-void SimpleMenuModel::ActivatedAt(int index, int event_flags) {
+void SimpleMenuModel::ActivatedAt(size_t index, int event_flags) {
if (delegate_)
delegate_->ExecuteCommand(GetCommandIdAt(index), event_flags);
}
-MenuModel* SimpleMenuModel::GetSubmenuModelAt(int index) const {
+MenuModel* SimpleMenuModel::GetSubmenuModelAt(size_t index) const {
return items_[ValidateItemIndex(index)].submenu;
}
@@ -544,9 +546,8 @@ SimpleMenuModel::Item::Item(int command_id, ItemType type, std::u16string label)
SimpleMenuModel::Item& SimpleMenuModel::Item::operator=(Item&&) = default;
SimpleMenuModel::Item::~Item() = default;
-int SimpleMenuModel::ValidateItemIndex(int index) const {
- CHECK_GE(index, 0);
- CHECK_LT(static_cast<size_t>(index), items_.size());
+size_t SimpleMenuModel::ValidateItemIndex(size_t index) const {
+ CHECK_LT(index, items_.size());
return index;
}
@@ -556,9 +557,10 @@ void SimpleMenuModel::AppendItem(Item item) {
MenuItemsChanged();
}
-void SimpleMenuModel::InsertItemAtIndex(Item item, int index) {
+void SimpleMenuModel::InsertItemAtIndex(Item item, size_t index) {
ValidateItem(item);
- items_.insert(items_.begin() + index, std::move(item));
+ items_.insert(items_.begin() + static_cast<ptrdiff_t>(index),
+ std::move(item));
MenuItemsChanged();
}
diff --git a/chromium/ui/base/models/simple_menu_model.h b/chromium/ui/base/models/simple_menu_model.h
index bd2ebaf9f84..7ecb2f6cae7 100644
--- a/chromium/ui/base/models/simple_menu_model.h
+++ b/chromium/ui/base/models/simple_menu_model.h
@@ -11,6 +11,7 @@
#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/base/accelerators/accelerator.h"
#include "ui/base/models/image_model.h"
#include "ui/base/models/menu_model.h"
@@ -131,92 +132,99 @@ class COMPONENT_EXPORT(UI_BASE) SimpleMenuModel : public MenuModel {
const ui::ImageModel& icon);
// Methods for inserting items into the model.
- void InsertItemAt(int index, int command_id, const std::u16string& label);
- void InsertItemWithStringIdAt(int index, int command_id, int string_id);
- void InsertSeparatorAt(int index, MenuSeparatorType separator_type);
- void InsertCheckItemAt(int index,
+ void InsertItemAt(size_t index, int command_id, const std::u16string& label);
+ void InsertItemWithStringIdAt(size_t index, int command_id, int string_id);
+ void InsertSeparatorAt(size_t index, MenuSeparatorType separator_type);
+ void InsertCheckItemAt(size_t index,
int command_id,
const std::u16string& label);
- void InsertCheckItemWithStringIdAt(int index, int command_id, int string_id);
- void InsertRadioItemAt(int index,
+ void InsertCheckItemWithStringIdAt(size_t index,
+ int command_id,
+ int string_id);
+ void InsertRadioItemAt(size_t index,
int command_id,
const std::u16string& label,
int group_id);
- void InsertRadioItemWithStringIdAt(
- int index, int command_id, int string_id, int group_id);
- void InsertSubMenuAt(int index,
+ void InsertRadioItemWithStringIdAt(size_t index,
+ int command_id,
+ int string_id,
+ int group_id);
+ void InsertSubMenuAt(size_t index,
int command_id,
const std::u16string& label,
MenuModel* model);
- void InsertSubMenuWithStringIdAt(
- int index, int command_id, int string_id, MenuModel* model);
+ void InsertSubMenuWithStringIdAt(size_t index,
+ int command_id,
+ int string_id,
+ MenuModel* model);
// Remove item at specified index from the model.
- void RemoveItemAt(int index);
+ void RemoveItemAt(size_t index);
// Sets the icon for the item at |index|.
- void SetIcon(int index, const ui::ImageModel& icon);
+ void SetIcon(size_t index, const ui::ImageModel& icon);
// Sets the label for the item at |index|.
- void SetLabel(int index, const std::u16string& label);
+ void SetLabel(size_t index, const std::u16string& label);
// Sets the minor text for the item at |index|.
- void SetMinorText(int index, const std::u16string& minor_text);
+ void SetMinorText(size_t index, const std::u16string& minor_text);
// Sets the minor icon for the item at |index|.
- void SetMinorIcon(int index, const ui::ImageModel& minor_icon);
+ void SetMinorIcon(size_t index, const ui::ImageModel& minor_icon);
// Sets whether the item at |index| is enabled.
- void SetEnabledAt(int index, bool enabled);
+ void SetEnabledAt(size_t index, bool enabled);
// Sets whether the item at |index| is visible.
- void SetVisibleAt(int index, bool visible);
+ void SetVisibleAt(size_t index, bool visible);
// Sets whether the item at |index| is new.
- void SetIsNewFeatureAt(int index, bool is_new_feature);
+ void SetIsNewFeatureAt(size_t index, bool is_new_feature);
// Sets whether the item at |index| is may have mnemonics.
- void SetMayHaveMnemonicsAt(int index, bool may_have_mnemonics);
+ void SetMayHaveMnemonicsAt(size_t index, bool may_have_mnemonics);
// Sets the accessible name of item at |index|.
- void SetAccessibleNameAt(int index, std::u16string accessible_name);
+ void SetAccessibleNameAt(size_t index, std::u16string accessible_name);
// Sets an application-window unique identifier associated with this menu item
// allowing it to be tracked without knowledge of menu-specific command IDs.
- void SetElementIdentifierAt(int index, ElementIdentifier unique_id);
+ void SetElementIdentifierAt(size_t index, ElementIdentifier unique_id);
// Clears all items. Note that it does not free MenuModel of submenu.
void Clear();
// Returns the index of the item that has the given |command_id|. Returns
- // -1 if not found.
- int GetIndexOfCommandId(int command_id) const;
+ // nullopt if not found.
+ absl::optional<size_t> GetIndexOfCommandId(int command_id) const;
// Overridden from MenuModel:
bool HasIcons() const override;
- int GetItemCount() const override;
- ItemType GetTypeAt(int index) const override;
- ui::MenuSeparatorType GetSeparatorTypeAt(int index) const override;
- int GetCommandIdAt(int index) const override;
- std::u16string GetLabelAt(int index) const override;
- std::u16string GetMinorTextAt(int index) const override;
- ImageModel GetMinorIconAt(int index) const override;
- bool IsItemDynamicAt(int index) const override;
- bool GetAcceleratorAt(int index, ui::Accelerator* accelerator) const override;
- bool IsItemCheckedAt(int index) const override;
- int GetGroupIdAt(int index) const override;
- ImageModel GetIconAt(int index) const override;
- ui::ButtonMenuItemModel* GetButtonMenuItemAt(int index) const override;
- bool IsEnabledAt(int index) const override;
- bool IsVisibleAt(int index) const override;
- bool IsAlertedAt(int index) const override;
- bool IsNewFeatureAt(int index) const override;
- bool MayHaveMnemonicsAt(int index) const override;
- std::u16string GetAccessibleNameAt(int index) const override;
- ElementIdentifier GetElementIdentifierAt(int index) const override;
- void ActivatedAt(int index) override;
- void ActivatedAt(int index, int event_flags) override;
- MenuModel* GetSubmenuModelAt(int index) const override;
+ size_t GetItemCount() const override;
+ ItemType GetTypeAt(size_t index) const override;
+ ui::MenuSeparatorType GetSeparatorTypeAt(size_t index) const override;
+ int GetCommandIdAt(size_t index) const override;
+ std::u16string GetLabelAt(size_t index) const override;
+ std::u16string GetMinorTextAt(size_t index) const override;
+ ImageModel GetMinorIconAt(size_t index) const override;
+ bool IsItemDynamicAt(size_t index) const override;
+ bool GetAcceleratorAt(size_t index,
+ ui::Accelerator* accelerator) const override;
+ bool IsItemCheckedAt(size_t index) const override;
+ int GetGroupIdAt(size_t index) const override;
+ ImageModel GetIconAt(size_t index) const override;
+ ui::ButtonMenuItemModel* GetButtonMenuItemAt(size_t index) const override;
+ bool IsEnabledAt(size_t index) const override;
+ bool IsVisibleAt(size_t index) const override;
+ bool IsAlertedAt(size_t index) const override;
+ bool IsNewFeatureAt(size_t index) const override;
+ bool MayHaveMnemonicsAt(size_t index) const override;
+ std::u16string GetAccessibleNameAt(size_t index) const override;
+ ElementIdentifier GetElementIdentifierAt(size_t index) const override;
+ void ActivatedAt(size_t index) override;
+ void ActivatedAt(size_t index, int event_flags) override;
+ MenuModel* GetSubmenuModelAt(size_t index) const override;
void MenuWillShow() override;
void MenuWillClose() override;
@@ -253,14 +261,14 @@ class COMPONENT_EXPORT(UI_BASE) SimpleMenuModel : public MenuModel {
ElementIdentifier unique_id;
};
- typedef std::vector<Item> ItemVector;
+ using ItemVector = std::vector<Item>;
// Returns |index|.
- int ValidateItemIndex(int index) const;
+ size_t ValidateItemIndex(size_t index) const;
// Functions for inserting items into |items_|.
void AppendItem(Item item);
- void InsertItemAtIndex(Item item, int index);
+ void InsertItemAtIndex(Item item, size_t index);
void ValidateItem(const Item& item);
// Notify the delegate that the menu is closed.
diff --git a/chromium/ui/base/models/table_model.cc b/chromium/ui/base/models/table_model.cc
index 42a19cab4b0..3b443737420 100644
--- a/chromium/ui/base/models/table_model.cc
+++ b/chromium/ui/base/models/table_model.cc
@@ -46,18 +46,16 @@ TableColumn& TableColumn::operator=(const TableColumn& other) = default;
// Used for sorting.
static icu::Collator* g_collator = nullptr;
-ui::ImageModel TableModel::GetIcon(int row) {
+ui::ImageModel TableModel::GetIcon(size_t row) {
return ui::ImageModel();
}
-std::u16string TableModel::GetTooltip(int row) {
+std::u16string TableModel::GetTooltip(size_t row) {
return std::u16string();
}
-int TableModel::CompareValues(int row1, int row2, int column_id) {
- DCHECK_GE(row1, 0);
+int TableModel::CompareValues(size_t row1, size_t row2, int column_id) {
DCHECK_LT(row1, RowCount());
- DCHECK_GE(row2, 0);
DCHECK_LT(row2, RowCount());
std::u16string value1 = GetText(row1, column_id);
diff --git a/chromium/ui/base/models/table_model.h b/chromium/ui/base/models/table_model.h
index f32af401f8a..e503d103ddd 100644
--- a/chromium/ui/base/models/table_model.h
+++ b/chromium/ui/base/models/table_model.h
@@ -27,21 +27,21 @@ class COMPONENT_EXPORT(UI_BASE) TableModel {
static constexpr int kIconSize = 16;
// Number of rows in the model.
- virtual int RowCount() = 0;
+ virtual size_t RowCount() = 0;
// Returns the value at a particular location in text.
- virtual std::u16string GetText(int row, int column_id) = 0;
+ virtual std::u16string GetText(size_t row, int column_id) = 0;
// Returns the small icon (|kIconSize| x |kIconSize|) that should be displayed
// in the first column before the text. This is only used when the TableView
// was created with the ICON_AND_TEXT table type. An empty ImageModel if there
// is no image.
- virtual ui::ImageModel GetIcon(int row);
+ virtual ui::ImageModel GetIcon(size_t row);
// Returns the tooltip, if any, to show for a particular row. If there are
// multiple columns in the row, this will only be shown when hovering over
// column zero.
- virtual std::u16string GetTooltip(int row);
+ virtual std::u16string GetTooltip(size_t row);
// Sets the observer for the model. The TableView should NOT take ownership
// of the observer.
@@ -53,7 +53,7 @@ class COMPONENT_EXPORT(UI_BASE) TableModel {
//
// This implementation does a case insensitive locale specific string
// comparison.
- virtual int CompareValues(int row1, int row2, int column_id);
+ virtual int CompareValues(size_t row1, size_t row2, int column_id);
// Reset the collator.
void ClearCollator();
diff --git a/chromium/ui/base/models/table_model_observer.h b/chromium/ui/base/models/table_model_observer.h
index eaff0750819..ecb04afb17d 100644
--- a/chromium/ui/base/models/table_model_observer.h
+++ b/chromium/ui/base/models/table_model_observer.h
@@ -17,19 +17,20 @@ class COMPONENT_EXPORT(UI_BASE) TableModelObserver {
virtual void OnModelChanged() = 0;
// Invoked when a range of items has changed.
- virtual void OnItemsChanged(int start, int length) = 0;
+ virtual void OnItemsChanged(size_t start, size_t length) = 0;
// Invoked when new items have been added.
- virtual void OnItemsAdded(int start, int length) = 0;
+ virtual void OnItemsAdded(size_t start, size_t length) = 0;
// Invoked when a range of items has been removed.
- virtual void OnItemsRemoved(int start, int length) = 0;
+ virtual void OnItemsRemoved(size_t start, size_t length) = 0;
// Invoked when a range of items has been moved to a different position.
- virtual void OnItemsMoved(int old_start, int length, int new_start) {}
+ virtual void OnItemsMoved(size_t old_start, size_t length, size_t new_start) {
+ }
protected:
- virtual ~TableModelObserver() {}
+ virtual ~TableModelObserver() = default;
};
} // namespace ui
diff --git a/chromium/ui/base/models/tree_model.cc b/chromium/ui/base/models/tree_model.cc
index 1111970bb08..9f5bbceaf62 100644
--- a/chromium/ui/base/models/tree_model.cc
+++ b/chromium/ui/base/models/tree_model.cc
@@ -12,8 +12,8 @@ void TreeModel::SetTitle(TreeModelNode* node, const std::u16string& title) {
NOTREACHED();
}
-int TreeModel::GetIconIndex(TreeModelNode* node) {
- return -1;
+absl::optional<size_t> TreeModel::GetIconIndex(TreeModelNode* node) {
+ return absl::nullopt;
}
} // namespace ui
diff --git a/chromium/ui/base/models/tree_model.h b/chromium/ui/base/models/tree_model.h
index 7b907a4a9e2..0952d928da0 100644
--- a/chromium/ui/base/models/tree_model.h
+++ b/chromium/ui/base/models/tree_model.h
@@ -9,6 +9,7 @@
#include <vector>
#include "base/component_export.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
namespace ui {
@@ -26,6 +27,9 @@ class TreeModelNode {
// Returns the title for the node.
virtual const std::u16string& GetTitle() const = 0;
+ // Returns the accessible title for the node.
+ virtual const std::u16string& GetAccessibleTitle() const = 0;
+
protected:
virtual ~TreeModelNode() {}
};
@@ -70,7 +74,8 @@ class COMPONENT_EXPORT(UI_BASE) TreeModel {
virtual Nodes GetChildren(const TreeModelNode* parent) const = 0;
// Returns the index of |child| in |parent|.
- virtual int GetIndexOf(TreeModelNode* parent, TreeModelNode* child) const = 0;
+ virtual absl::optional<size_t> GetIndexOf(TreeModelNode* parent,
+ TreeModelNode* child) const = 0;
// Returns the parent of |node|, or NULL if |node| is the root.
virtual TreeModelNode* GetParent(TreeModelNode* node) const = 0;
@@ -89,10 +94,10 @@ class COMPONENT_EXPORT(UI_BASE) TreeModel {
// this if you don't want to use the default folder icons.
virtual void GetIcons(std::vector<ui::ImageModel>* icons) {}
- // Returns the index of the icon to use for |node|. Return -1 to use the
+ // Returns the index of the icon to use for |node|. Return nullopt to use the
// default icon. The index is relative to the list of icons returned from
// GetIcons.
- virtual int GetIconIndex(TreeModelNode* node);
+ virtual absl::optional<size_t> GetIconIndex(TreeModelNode* node);
protected:
virtual ~TreeModel() {}
diff --git a/chromium/ui/base/models/tree_node_model.h b/chromium/ui/base/models/tree_node_model.h
index 1737baeb426..c66e3066815 100644
--- a/chromium/ui/base/models/tree_node_model.h
+++ b/chromium/ui/base/models/tree_node_model.h
@@ -93,7 +93,8 @@ class TreeNode : public TreeModelNode {
DCHECK(!node->parent_);
node->parent_ = static_cast<NodeType*>(this);
NodeType* node_ptr = node.get();
- children_.insert(children_.begin() + index, std::move(node));
+ children_.insert(children_.begin() + static_cast<ptrdiff_t>(index),
+ std::move(node));
return node_ptr;
}
@@ -107,7 +108,7 @@ class TreeNode : public TreeModelNode {
DCHECK_LT(index, children_.size());
children_[index]->parent_ = nullptr;
std::unique_ptr<NodeType> ptr = std::move(children_[index]);
- children_.erase(children_.begin() + index);
+ children_.erase(children_.begin() + static_cast<ptrdiff_t>(index));
return ptr;
}
@@ -125,21 +126,23 @@ class TreeNode : public TreeModelNode {
// Returns the number of all nodes in the subtree rooted at this node,
// including this node.
- int GetTotalNodeCount() const {
- int count = 1; // Start with one to include the node itself.
+ size_t GetTotalNodeCount() const {
+ size_t count = 1; // Start with one to include the node itself.
for (const auto& child : children_)
count += child->GetTotalNodeCount();
return count;
}
- // Returns the index of |node|, or -1 if |node| is not a child of this.
- int GetIndexOf(const NodeType* node) const {
+ // Returns the index of |node|, or nullopt if |node| is not a child of this.
+ absl::optional<size_t> GetIndexOf(const NodeType* node) const {
DCHECK(node);
auto i = std::find_if(children_.begin(), children_.end(),
[node](const std::unique_ptr<NodeType>& ptr) {
return ptr.get() == node;
});
- return i != children_.end() ? static_cast<int>(i - children_.begin()) : -1;
+ return i != children_.end()
+ ? absl::make_optional(static_cast<size_t>(i - children_.begin()))
+ : absl::nullopt;
}
// Sets the title of the node.
@@ -148,6 +151,15 @@ class TreeNode : public TreeModelNode {
// TreeModelNode:
const std::u16string& GetTitle() const override { return title_; }
+ const std::u16string& GetAccessibleTitle() const override {
+ return title_.empty() ? placeholder_accessible_title_ : title_;
+ }
+
+ void SetPlaceholderAccessibleTitle(
+ std::u16string placeholder_accessible_title) {
+ placeholder_accessible_title_ = placeholder_accessible_title;
+ }
+
// Returns true if this == ancestor, or one of this nodes parents is
// ancestor.
bool HasAncestor(const NodeType* ancestor) const {
@@ -188,6 +200,10 @@ class TreeNode : public TreeModelNode {
// Title displayed in the tree.
std::u16string title_;
+ // If set, a placeholder accessible title to fall back to if there is no
+ // title.
+ std::u16string placeholder_accessible_title_;
+
// This node's parent.
raw_ptr<NodeType> parent_;
@@ -267,7 +283,7 @@ class TreeNodeModel : public TreeModel {
std::unique_ptr<NodeType> Remove(NodeType* parent, NodeType* node) {
DCHECK(parent);
- return Remove(parent, static_cast<size_t>(parent->GetIndexOf(node)));
+ return Remove(parent, parent->GetIndexOf(node).value());
}
void NotifyObserverTreeNodesAdded(NodeType* parent,
@@ -314,7 +330,8 @@ class TreeNodeModel : public TreeModel {
return nodes;
}
- int GetIndexOf(TreeModelNode* parent, TreeModelNode* child) const override {
+ absl::optional<size_t> GetIndexOf(TreeModelNode* parent,
+ TreeModelNode* child) const override {
DCHECK(parent);
return AsNode(parent)->GetIndexOf(AsNode(child));
}
diff --git a/chromium/ui/base/models/tree_node_model_unittest.cc b/chromium/ui/base/models/tree_node_model_unittest.cc
index f0909897a0c..fe8b289b211 100644
--- a/chromium/ui/base/models/tree_node_model_unittest.cc
+++ b/chromium/ui/base/models/tree_node_model_unittest.cc
@@ -154,20 +154,20 @@ TEST_F(TreeNodeModelTest, GetIndexOf) {
TestNode* child2 = root.Add(std::make_unique<TestNode>(), 1);
TestNode* foo1 = child1->Add(std::make_unique<TestNode>(), 0);
- EXPECT_EQ(-1, root.GetIndexOf(&root));
- EXPECT_EQ(0, root.GetIndexOf(child1));
- EXPECT_EQ(1, root.GetIndexOf(child2));
- EXPECT_EQ(-1, root.GetIndexOf(foo1));
-
- EXPECT_EQ(-1, child1->GetIndexOf(&root));
- EXPECT_EQ(-1, child1->GetIndexOf(child1));
- EXPECT_EQ(-1, child1->GetIndexOf(child2));
- EXPECT_EQ(0, child1->GetIndexOf(foo1));
-
- EXPECT_EQ(-1, child2->GetIndexOf(&root));
- EXPECT_EQ(-1, child2->GetIndexOf(child2));
- EXPECT_EQ(-1, child2->GetIndexOf(child1));
- EXPECT_EQ(-1, child2->GetIndexOf(foo1));
+ EXPECT_FALSE(root.GetIndexOf(&root).has_value());
+ EXPECT_EQ(0u, root.GetIndexOf(child1));
+ EXPECT_EQ(1u, root.GetIndexOf(child2));
+ EXPECT_FALSE(root.GetIndexOf(foo1).has_value());
+
+ EXPECT_FALSE(child1->GetIndexOf(&root).has_value());
+ EXPECT_FALSE(child1->GetIndexOf(child1).has_value());
+ EXPECT_FALSE(child1->GetIndexOf(child2).has_value());
+ EXPECT_EQ(0u, child1->GetIndexOf(foo1));
+
+ EXPECT_FALSE(child2->GetIndexOf(&root).has_value());
+ EXPECT_FALSE(child2->GetIndexOf(child2).has_value());
+ EXPECT_FALSE(child2->GetIndexOf(child1).has_value());
+ EXPECT_FALSE(child2->GetIndexOf(foo1).has_value());
}
// Verifies whether a specified node has or not an ancestor.
@@ -237,11 +237,11 @@ TEST_F(TreeNodeModelTest, GetTotalNodeCount) {
TestNode* bar1 = root.Add(std::make_unique<TestNode>(), 2);
- EXPECT_EQ(9, root.GetTotalNodeCount());
- EXPECT_EQ(3, child1->GetTotalNodeCount());
- EXPECT_EQ(2, child2->GetTotalNodeCount());
- EXPECT_EQ(2, foo2->GetTotalNodeCount());
- EXPECT_EQ(1, bar1->GetTotalNodeCount());
+ EXPECT_EQ(9u, root.GetTotalNodeCount());
+ EXPECT_EQ(3u, child1->GetTotalNodeCount());
+ EXPECT_EQ(2u, child2->GetTotalNodeCount());
+ EXPECT_EQ(2u, foo2->GetTotalNodeCount());
+ EXPECT_EQ(1u, bar1->GetTotalNodeCount());
}
// Makes sure that we are notified when the node is renamed,
diff --git a/chromium/ui/base/prediction/OWNERS b/chromium/ui/base/prediction/OWNERS
index e1fbf38f49a..343711b35e9 100644
--- a/chromium/ui/base/prediction/OWNERS
+++ b/chromium/ui/base/prediction/OWNERS
@@ -1,2 +1 @@
flackr@chromium.org
-sadrul@chromium.org \ No newline at end of file
diff --git a/chromium/ui/base/resource/resource_bundle.cc b/chromium/ui/base/resource/resource_bundle.cc
index 2222f4adfbe..44d03908480 100644
--- a/chromium/ui/base/resource/resource_bundle.cc
+++ b/chromium/ui/base/resource/resource_bundle.cc
@@ -637,7 +637,7 @@ base::RefCountedMemory* ResourceBundle::LoadDataResourceBytesForScale(
auto* event =
ctx.event<perfetto::protos::pbzero::ChromeTrackEvent>();
auto* data = event->set_resource_bundle();
- data->set_resource_id(resource_id);
+ data->set_resource_id(static_cast<uint32_t>(resource_id));
});
if (delegate_) {
diff --git a/chromium/ui/base/theme_provider.h b/chromium/ui/base/theme_provider.h
index a728a0ea8b3..f554197a7c3 100644
--- a/chromium/ui/base/theme_provider.h
+++ b/chromium/ui/base/theme_provider.h
@@ -40,9 +40,6 @@ class COMPONENT_EXPORT(UI_BASE) ThemeProvider {
// have its own source of ids (e.g. an enum, or external resource bundle).
virtual gfx::ImageSkia* GetImageSkiaNamed(int id) const = 0;
- // Get the color specified by |id|.
- virtual SkColor GetColor(int id) const = 0;
-
// Get the HSL shift specified by |id|.
virtual color_utils::HSL GetTint(int id) const = 0;
diff --git a/chromium/ui/base/ui_base_features.cc b/chromium/ui/base/ui_base_features.cc
index d35ff2a6c75..7feb8675bd1 100644
--- a/chromium/ui/base/ui_base_features.cc
+++ b/chromium/ui/base/ui_base_features.cc
@@ -95,22 +95,27 @@ const base::Feature kLacrosResourcesFileSharing = {
"LacrosResourcesFileSharing", base::FEATURE_DISABLED_BY_DEFAULT};
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
-// Enable or disable multitouch for virtual keyboard on ChromeOS.
-const base::Feature kVirtualKeyboardMultitouch{
- "VirtualKeyboardMultitouch", base::FEATURE_DISABLED_BY_DEFAULT};
-
// Update of the virtual keyboard settings UI as described in
// https://crbug.com/876901.
const base::Feature kInputMethodSettingsUiUpdate = {
"InputMethodSettingsUiUpdate", base::FEATURE_DISABLED_BY_DEFAULT};
// Enables percent-based scrolling for mousewheel and keyboard initiated
-// scrolls.
-const base::Feature kPercentBasedScrolling = {
- "PercentBasedScrolling", base::FEATURE_DISABLED_BY_DEFAULT};
+// scrolls and impulse curve animations.
+const enum base::FeatureState kWindowsScrollingPersonalityDefaultStatus =
+ base::FEATURE_DISABLED_BY_DEFAULT;
+static_assert(!BUILDFLAG(IS_MAC) ||
+ (BUILDFLAG(IS_MAC) &&
+ kWindowsScrollingPersonalityDefaultStatus ==
+ base::FEATURE_DISABLED_BY_DEFAULT),
+ "Do not enable this on the Mac. The animation does not match the "
+ "system scroll animation curve to such an extent that it makes "
+ "Chromium stand out in a bad way.");
+const base::Feature kWindowsScrollingPersonality = {
+ "WindowsScrollingPersonality", kWindowsScrollingPersonalityDefaultStatus};
bool IsPercentBasedScrollingEnabled() {
- return base::FeatureList::IsEnabled(features::kPercentBasedScrolling);
+ return base::FeatureList::IsEnabled(features::kWindowsScrollingPersonality);
}
// Allows requesting unadjusted movement when entering pointerlock.
diff --git a/chromium/ui/base/ui_base_features.h b/chromium/ui/base/ui_base_features.h
index 0735a721aa1..2584490d310 100644
--- a/chromium/ui/base/ui_base_features.h
+++ b/chromium/ui/base/ui_base_features.h
@@ -28,7 +28,7 @@ extern const base::Feature kSettingsShowsPerKeyboardSettings;
COMPONENT_EXPORT(UI_BASE_FEATURES)
extern const base::Feature kInputMethodSettingsUiUpdate;
COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kPercentBasedScrolling;
+extern const base::Feature kWindowsScrollingPersonality;
COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsPercentBasedScrollingEnabled();
COMPONENT_EXPORT(UI_BASE_FEATURES)
extern const base::Feature kPointerLockOptions;
@@ -38,8 +38,6 @@ COMPONENT_EXPORT(UI_BASE_FEATURES)
extern const base::Feature kSystemKeyboardLock;
COMPONENT_EXPORT(UI_BASE_FEATURES)
extern const base::Feature kUiCompositorScrollWithLayers;
-COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kVirtualKeyboardMultitouch;
COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsUiGpuRasterizationEnabled();
diff --git a/chromium/ui/base/ui_base_types.h b/chromium/ui/base/ui_base_types.h
index aea5069ca17..de4a1a49901 100644
--- a/chromium/ui/base/ui_base_types.h
+++ b/chromium/ui/base/ui_base_types.h
@@ -21,6 +21,9 @@ class Event;
// changed or removed.
//
// Window "show" state.
+// TODO: Add snapped window state to immersive fullscreen state to
+// WindowShowState. Those are ChromeOS specific window states but we should make
+// it available here as well as Lacros also needs to know those states.
enum WindowShowState {
// A default un-set state.
SHOW_STATE_DEFAULT = 0,
@@ -43,9 +46,9 @@ enum DialogButton {
// Specifies the type of modality applied to a window. Different modal
// treatments may be handled differently by the window manager.
enum ModalType {
- MODAL_TYPE_NONE = 0, // Window is not modal.
+ MODAL_TYPE_NONE = 0, // Window is not modal.
MODAL_TYPE_WINDOW = 1, // Window is modal to its transient parent.
- MODAL_TYPE_CHILD = 2, // Window is modal to a child of its transient parent.
+ MODAL_TYPE_CHILD = 2, // Window is modal to a child of its transient parent.
MODAL_TYPE_SYSTEM = 3 // Window is modal to all other windows.
};
diff --git a/chromium/ui/base/ui_features.gni b/chromium/ui/base/ui_features.gni
index 5b824a3b109..f0bcdf21c48 100644
--- a/chromium/ui/base/ui_features.gni
+++ b/chromium/ui/base/ui_features.gni
@@ -28,6 +28,8 @@ declare_args() {
# Whether the message center should be included for displaying notifications.
enable_message_center =
is_win || is_mac || is_linux || is_chromeos || is_fuchsia
+
+ enable_hidpi = !is_android
}
# Android does have platform accessibility support that's implemented using
@@ -35,5 +37,3 @@ declare_args() {
# AXPlatformNode to implement a native C++ API, instead it bridges to a Java API.
has_platform_accessibility_support =
has_native_accessibility || is_android || is_fuchsia
-
-enable_hidpi = !is_android
diff --git a/chromium/ui/base/wayland/wayland_input_types_unittest.cc b/chromium/ui/base/wayland/wayland_input_types_unittest.cc
index c9673206e1e..93fa3395c39 100644
--- a/chromium/ui/base/wayland/wayland_input_types_unittest.cc
+++ b/chromium/ui/base/wayland/wayland_input_types_unittest.cc
@@ -17,7 +17,7 @@ TEST(WaylandInputTypesTest, TextInputType) {
}
// Passing the invalid value returns nullopt.
- constexpr auto kInvalidValue =
+ auto kInvalidValue =
static_cast<zcr_extended_text_input_v1_input_type>(0xFFFFFFFF);
EXPECT_FALSE(ConvertToTextInputType(kInvalidValue).has_value());
}
@@ -31,7 +31,7 @@ TEST(WaylandInputTypesTest, TextInputMode) {
}
// Passing the invalid value returns nullopt.
- constexpr auto kInvalidValue =
+ auto kInvalidValue =
static_cast<zcr_extended_text_input_v1_input_mode>(0xFFFFFFFF);
EXPECT_FALSE(ConvertToTextInputMode(kInvalidValue).has_value());
}
diff --git a/chromium/ui/base/webui/i18n_source_stream.cc b/chromium/ui/base/webui/i18n_source_stream.cc
index 9aa3589988e..de274f10c17 100644
--- a/chromium/ui/base/webui/i18n_source_stream.cc
+++ b/chromium/ui/base/webui/i18n_source_stream.cc
@@ -35,12 +35,13 @@ std::string I18nSourceStream::GetTypeAsString() const {
return "i18n";
}
-int I18nSourceStream::FilterData(net::IOBuffer* output_buffer,
- int output_buffer_size,
- net::IOBuffer* input_buffer,
- int input_buffer_size,
- int* consumed_bytes,
- bool upstream_end_reached) {
+base::expected<size_t, net::Error> I18nSourceStream::FilterData(
+ net::IOBuffer* output_buffer,
+ size_t output_buffer_size,
+ net::IOBuffer* input_buffer,
+ size_t input_buffer_size,
+ size_t* consumed_bytes,
+ bool upstream_end_reached) {
// |input_| is often empty (or it may have something from the prior call).
input_.append(input_buffer->data(), input_buffer_size);
*consumed_bytes = input_buffer_size;
@@ -61,8 +62,7 @@ int I18nSourceStream::FilterData(net::IOBuffer* output_buffer,
}
output_.append(ReplaceTemplateExpressions(to_process, *replacements_));
- int bytes_out =
- std::min(output_.size(), static_cast<size_t>(output_buffer_size));
+ size_t bytes_out = std::min(output_.size(), output_buffer_size);
output_.copy(output_buffer->data(), bytes_out);
output_.erase(0, bytes_out);
return bytes_out;
diff --git a/chromium/ui/base/webui/i18n_source_stream.h b/chromium/ui/base/webui/i18n_source_stream.h
index 177d3365e92..b797575e2dc 100644
--- a/chromium/ui/base/webui/i18n_source_stream.h
+++ b/chromium/ui/base/webui/i18n_source_stream.h
@@ -37,12 +37,13 @@ class COMPONENT_EXPORT(UI_BASE) I18nSourceStream
// SourceStream implementation.
std::string GetTypeAsString() const override;
- int FilterData(net::IOBuffer* output_buffer,
- int output_buffer_size,
- net::IOBuffer* input_buffer,
- int input_buffer_size,
- int* consumed_bytes,
- bool upstream_end_reached) override;
+ base::expected<size_t, net::Error> FilterData(
+ net::IOBuffer* output_buffer,
+ size_t output_buffer_size,
+ net::IOBuffer* input_buffer,
+ size_t input_buffer_size,
+ size_t* consumed_bytes,
+ bool upstream_end_reached) override;
// Keep split $i18n tags (wait for the whole tag). This is expected to vary
// in size from 0 to a few KB and should never be larger than the input file
diff --git a/chromium/ui/base/webui/jstemplate_builder.cc b/chromium/ui/base/webui/jstemplate_builder.cc
index b1cff77cb9b..02b3f3db10a 100644
--- a/chromium/ui/base/webui/jstemplate_builder.cc
+++ b/chromium/ui/base/webui/jstemplate_builder.cc
@@ -23,7 +23,7 @@ namespace {
// Appends a script tag with a variable name |templateData| that has the JSON
// assigned to it.
-void AppendJsonHtml(const base::Value* json, std::string* output) {
+void AppendJsonHtml(const base::Value::Dict& json, std::string* output) {
std::string javascript_string;
AppendJsonJS(json, &javascript_string, /*from_js_module=*/false);
@@ -72,12 +72,12 @@ void AppendJsTemplateSourceHtml(std::string* output) {
// Appends the code that processes the JsTemplate with the JSON. You should
// call AppendJsTemplateSourceHtml and AppendLoadTimeData before calling this.
-void AppendJsTemplateProcessHtml(const base::Value* json,
- const base::StringPiece& template_id,
+void AppendJsTemplateProcessHtml(const base::Value::Dict& json,
+ base::StringPiece template_id,
std::string* output) {
std::string jstext;
JSONStringValueSerializer serializer(&jstext);
- serializer.Serialize(*json);
+ serializer.Serialize(json);
output->append("<script>");
output->append("const pageData = ");
@@ -93,10 +93,10 @@ void AppendJsTemplateProcessHtml(const base::Value* json,
} // namespace
-std::string GetI18nTemplateHtml(const base::StringPiece& html_template,
- const base::Value* json) {
+std::string GetI18nTemplateHtml(base::StringPiece html_template,
+ const base::Value::Dict& json) {
ui::TemplateReplacements replacements;
- ui::TemplateReplacementsFromDictionaryValue(json->GetDict(), &replacements);
+ ui::TemplateReplacementsFromDictionaryValue(json, &replacements);
std::string output =
ui::ReplaceTemplateExpressions(html_template, replacements);
@@ -106,11 +106,11 @@ std::string GetI18nTemplateHtml(const base::StringPiece& html_template,
return output;
}
-std::string GetTemplatesHtml(const base::StringPiece& html_template,
- const base::Value* json,
- const base::StringPiece& template_id) {
+std::string GetTemplatesHtml(base::StringPiece html_template,
+ const base::Value::Dict& json,
+ base::StringPiece template_id) {
ui::TemplateReplacements replacements;
- ui::TemplateReplacementsFromDictionaryValue(json->GetDict(), &replacements);
+ ui::TemplateReplacementsFromDictionaryValue(json, &replacements);
std::string output =
ui::ReplaceTemplateExpressions(html_template, replacements);
@@ -120,12 +120,9 @@ std::string GetTemplatesHtml(const base::StringPiece& html_template,
return output;
}
-void AppendJsonJS(const base::Value* json,
+void AppendJsonJS(const base::Value::Dict& json,
std::string* output,
bool from_js_module) {
- // Convert the template data to a json string.
- DCHECK(json) << "must include json data structure";
-
if (from_js_module) {
// If the script is being imported as a module, import |loadTimeData| in
// order to allow assigning the localized strings to loadTimeData.data.
@@ -135,7 +132,7 @@ void AppendJsonJS(const base::Value* json,
std::string jstext;
JSONStringValueSerializer serializer(&jstext);
- serializer.Serialize(*json);
+ serializer.Serialize(json);
output->append("loadTimeData.data = ");
output->append(jstext);
output->append(";");
diff --git a/chromium/ui/base/webui/jstemplate_builder.h b/chromium/ui/base/webui/jstemplate_builder.h
index 7d2613bc467..d4561b95c51 100644
--- a/chromium/ui/base/webui/jstemplate_builder.h
+++ b/chromium/ui/base/webui/jstemplate_builder.h
@@ -17,10 +17,7 @@
#include "base/component_export.h"
#include "base/strings/string_piece.h"
-
-namespace base {
-class Value;
-}
+#include "base/values.h"
namespace webui {
@@ -28,20 +25,20 @@ namespace webui {
// string includes the HTML and the javascript code necessary to generate the
// full page with support for i18n Templates.
COMPONENT_EXPORT(UI_BASE)
-std::string GetI18nTemplateHtml(const base::StringPiece& html_template,
- const base::Value* json);
+std::string GetI18nTemplateHtml(base::StringPiece html_template,
+ const base::Value::Dict& json);
// A helper function that generates a string of HTML to be loaded. The
// string includes the HTML and the javascript code necessary to generate the
// full page with support for both i18n Templates and JsTemplates.
COMPONENT_EXPORT(UI_BASE)
-std::string GetTemplatesHtml(const base::StringPiece& html_template,
- const base::Value* json,
- const base::StringPiece& template_id);
+std::string GetTemplatesHtml(base::StringPiece html_template,
+ const base::Value::Dict& json,
+ base::StringPiece template_id);
// Assigns the given json data into |loadTimeData|, without a <script> tag.
COMPONENT_EXPORT(UI_BASE)
-void AppendJsonJS(const base::Value* json,
+void AppendJsonJS(const base::Value::Dict& json,
std::string* output,
bool from_js_module);
diff --git a/chromium/ui/base/webui/web_ui_util.cc b/chromium/ui/base/webui/web_ui_util.cc
index 03f700c0ea5..d94c4632764 100644
--- a/chromium/ui/base/webui/web_ui_util.cc
+++ b/chromium/ui/base/webui/web_ui_util.cc
@@ -71,9 +71,8 @@ std::string GetPngDataUrl(const unsigned char* data, size_t size) {
return output;
}
-WindowOpenDisposition GetDispositionFromClick(const base::ListValue* args,
- int start_index) {
- base::Value::ConstListView list = args->GetListDeprecated();
+WindowOpenDisposition GetDispositionFromClick(const base::Value::List& list,
+ size_t start_index) {
double button = list[start_index].GetDouble();
bool alt_key = list[start_index + 1].GetBool();
bool ctrl_key = list[start_index + 2].GetBool();
diff --git a/chromium/ui/base/webui/web_ui_util.h b/chromium/ui/base/webui/web_ui_util.h
index dcc88ae8b47..b45ec192a72 100644
--- a/chromium/ui/base/webui/web_ui_util.h
+++ b/chromium/ui/base/webui/web_ui_util.h
@@ -37,8 +37,8 @@ std::string GetPngDataUrl(const unsigned char* data, size_t size);
// an integer button and booleans alt key, ctrl key, meta key, and shift key
// (in that order), starting at |start_index|.
COMPONENT_EXPORT(UI_BASE)
-WindowOpenDisposition GetDispositionFromClick(const base::ListValue* args,
- int start_index);
+WindowOpenDisposition GetDispositionFromClick(const base::Value::List& args,
+ size_t start_index);
// Parse a formatted scale factor string into float and sets to |scale_factor|.
COMPONENT_EXPORT(UI_BASE)
diff --git a/chromium/ui/base/win/event_creation_utils.cc b/chromium/ui/base/win/event_creation_utils.cc
index 636608e76ce..23fc4216f12 100644
--- a/chromium/ui/base/win/event_creation_utils.cc
+++ b/chromium/ui/base/win/event_creation_utils.cc
@@ -36,7 +36,7 @@ bool SendMouseEvent(const gfx::Point& point, int flags) {
1.0, std::ceil(screen_x * (kNormalizedScreenSize / screen_width))));
input.mi.dy = static_cast<LONG>(std::max(
1.0, std::ceil(screen_y * (kNormalizedScreenSize / screen_height))));
- input.mi.dwFlags = flags;
+ input.mi.dwFlags = static_cast<DWORD>(flags);
return ::SendInput(1, &input, sizeof(input)) == 1;
}
diff --git a/chromium/ui/base/win/session_change_observer.cc b/chromium/ui/base/win/session_change_observer.cc
index 1b9df320c84..9d033c55f1d 100644
--- a/chromium/ui/base/win/session_change_observer.cc
+++ b/chromium/ui/base/win/session_change_observer.cc
@@ -34,9 +34,10 @@ class SessionChangeObserver::WtsRegistrationNotificationManager {
base::BindRepeating(&WtsRegistrationNotificationManager::OnWndProc,
base::Unretained(this)));
- base::OnceClosure wts_register = base::BindOnce(
- base::IgnoreResult(&WTSRegisterSessionNotification),
- gfx::SingletonHwnd::GetInstance()->hwnd(), NOTIFY_FOR_THIS_SESSION);
+ base::OnceClosure wts_register =
+ base::BindOnce(base::IgnoreResult(&WTSRegisterSessionNotification),
+ gfx::SingletonHwnd::GetInstance()->hwnd(),
+ DWORD{NOTIFY_FOR_THIS_SESSION});
base::ThreadPool::CreateCOMSTATaskRunner({})->PostTask(
FROM_HERE, std::move(wts_register));
diff --git a/chromium/ui/base/x/BUILD.gn b/chromium/ui/base/x/BUILD.gn
index 0815385dbd2..f3377bec874 100644
--- a/chromium/ui/base/x/BUILD.gn
+++ b/chromium/ui/base/x/BUILD.gn
@@ -64,7 +64,6 @@ component("x") {
public_deps = [
"//ui/base/cursor",
- "//ui/base/cursor:theme_manager",
"//ui/base/cursor/mojom:cursor_type_shared",
]
deps = [
@@ -93,6 +92,9 @@ component("x") {
"//ui/strings:ui_strings_grit",
]
+ if (is_linux) {
+ public_deps += [ "//ui/linux:linux_ui" ]
+ }
if (is_linux || is_chromeos) {
sources += [
"selection_owner.cc",
diff --git a/chromium/ui/base/x/DEPS b/chromium/ui/base/x/DEPS
index 4a0553fdd96..f8670caed58 100644
--- a/chromium/ui/base/x/DEPS
+++ b/chromium/ui/base/x/DEPS
@@ -1,5 +1,6 @@
include_rules = [
- "+ui/platform_window/common/platform_window_defaults.h",
- "+ui/gl/gl_surface_egl.h",
"+third_party/khronos/EGL/egl.h",
+ "+ui/gl/gl_surface_egl.h",
+ "+ui/linux",
+ "+ui/platform_window/common/platform_window_defaults.h",
]
diff --git a/chromium/ui/base/x/selection_requestor.h b/chromium/ui/base/x/selection_requestor.h
index 3d318f6a62c..83dfc03af3e 100644
--- a/chromium/ui/base/x/selection_requestor.h
+++ b/chromium/ui/base/x/selection_requestor.h
@@ -9,6 +9,7 @@
#include <vector>
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted_memory.h"
#include "base/time/time.h"
#include "ui/gfx/x/connection.h"
@@ -114,7 +115,7 @@ class COMPONENT_EXPORT(UI_BASE_X) SelectionRequestor {
const x11::Window x_window_;
// Not owned.
- XClipboardHelper* const helper_;
+ const raw_ptr<XClipboardHelper> helper_;
// The property on |x_window_| set by the selection owner with the value of
// the selection.
diff --git a/chromium/ui/base/x/selection_requestor_unittest.cc b/chromium/ui/base/x/selection_requestor_unittest.cc
index 975301a959f..7ea30c60aee 100644
--- a/chromium/ui/base/x/selection_requestor_unittest.cc
+++ b/chromium/ui/base/x/selection_requestor_unittest.cc
@@ -8,6 +8,7 @@
#include <memory>
#include "base/bind.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted_memory.h"
#include "base/task/single_thread_task_runner.h"
#include "base/test/task_environment.h"
@@ -66,13 +67,13 @@ class SelectionRequestorTest : public testing::Test {
connection_->DestroyWindow({x_window_});
}
- x11::Connection* connection_;
+ raw_ptr<x11::Connection> connection_;
// |requestor_|'s window.
x11::Window x_window_ = x11::Window::None;
std::unique_ptr<XClipboardHelper> helper_;
- SelectionRequestor* requestor_ = nullptr;
+ raw_ptr<SelectionRequestor> requestor_ = nullptr;
base::test::SingleThreadTaskEnvironment task_environment_{
base::test::SingleThreadTaskEnvironment::MainThreadType::UI};
diff --git a/chromium/ui/base/x/visual_picker_glx.h b/chromium/ui/base/x/visual_picker_glx.h
index e3880bb4d90..336b7d98387 100644
--- a/chromium/ui/base/x/visual_picker_glx.h
+++ b/chromium/ui/base/x/visual_picker_glx.h
@@ -7,6 +7,7 @@
#include "base/component_export.h"
#include "base/containers/flat_map.h"
+#include "base/memory/raw_ptr.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/glx.h"
@@ -54,7 +55,7 @@ class COMPONENT_EXPORT(UI_BASE_X) VisualPickerGlx {
void FillConfigMap();
- x11::Connection* const connection_;
+ const raw_ptr<x11::Connection> connection_;
x11::VisualId system_visual_{};
x11::VisualId rgba_visual_{};
diff --git a/chromium/ui/base/x/x11_clipboard_helper.cc b/chromium/ui/base/x/x11_clipboard_helper.cc
index 98cda92dca3..6dc78358c8b 100644
--- a/chromium/ui/base/x/x11_clipboard_helper.cc
+++ b/chromium/ui/base/x/x11_clipboard_helper.cc
@@ -195,16 +195,14 @@ SelectionData XClipboardHelper::Read(ClipboardBuffer buffer,
if (format_map_it != format_map.end())
return SelectionData(format_map_it->first, format_map_it->second);
}
- } else {
- auto targets = GetTargetList(buffer);
-
- x11::Atom selection_name = LookupSelectionForClipboardBuffer(buffer);
- std::vector<x11::Atom> intersection;
- GetAtomIntersection(types, targets.target_list(), &intersection);
- return selection_requestor_->RequestAndWaitForTypes(selection_name,
- intersection);
+ return SelectionData();
}
- return SelectionData();
+
+ auto targets = GetTargetList(buffer);
+ std::vector<x11::Atom> intersection;
+ GetAtomIntersection(types, targets.target_list(), &intersection);
+ return selection_requestor_->RequestAndWaitForTypes(selection_name,
+ intersection);
}
std::vector<std::string> XClipboardHelper::GetAvailableTypes(
diff --git a/chromium/ui/base/x/x11_clipboard_helper.h b/chromium/ui/base/x/x11_clipboard_helper.h
index 98f5b6e9825..f08fb2bbb3a 100644
--- a/chromium/ui/base/x/x11_clipboard_helper.h
+++ b/chromium/ui/base/x/x11_clipboard_helper.h
@@ -12,6 +12,7 @@
#include "base/callback_forward.h"
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted_memory.h"
#include "base/memory/scoped_refptr.h"
#include "ui/base/clipboard/clipboard_buffer.h"
@@ -116,7 +117,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XClipboardHelper : public x11::EventObserver {
const SelectionFormatMap& LookupStorageForAtom(x11::Atom atom);
// Our X11 state.
- x11::Connection* const connection_;
+ const raw_ptr<x11::Connection> connection_;
const x11::Window x_root_window_;
// Input-only window used as a selection owner.
diff --git a/chromium/ui/base/x/x11_cursor_factory.cc b/chromium/ui/base/x/x11_cursor_factory.cc
index 46c0560bea4..80f36b022c0 100644
--- a/chromium/ui/base/x/x11_cursor_factory.cc
+++ b/chromium/ui/base/x/x11_cursor_factory.cc
@@ -56,9 +56,11 @@ scoped_refptr<PlatformCursor> X11CursorFactory::CreateAnimatedCursor(
}
void X11CursorFactory::ObserveThemeChanges() {
- auto* cursor_theme_manager = CursorThemeManager::GetInstance();
- DCHECK(cursor_theme_manager);
- cursor_theme_observation_.Observe(cursor_theme_manager);
+#if BUILDFLAG(IS_LINUX)
+ auto* linux_ui = LinuxUi::instance();
+ DCHECK(linux_ui);
+ cursor_theme_observation_.Observe(linux_ui);
+#endif
}
void X11CursorFactory::OnCursorThemeNameChanged(
diff --git a/chromium/ui/base/x/x11_cursor_factory.h b/chromium/ui/base/x/x11_cursor_factory.h
index bf93252c18c..4ee960bebb9 100644
--- a/chromium/ui/base/x/x11_cursor_factory.h
+++ b/chromium/ui/base/x/x11_cursor_factory.h
@@ -13,9 +13,12 @@
#include "base/memory/scoped_refptr.h"
#include "base/scoped_observation.h"
#include "ui/base/cursor/cursor_factory.h"
-#include "ui/base/cursor/cursor_theme_manager.h"
-#include "ui/base/cursor/cursor_theme_manager_observer.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
+#include "ui/linux/cursor_theme_manager_observer.h"
+
+#if BUILDFLAG(IS_LINUX)
+#include "ui/linux/linux_ui.h"
+#endif
namespace ui {
class X11Cursor;
@@ -56,8 +59,13 @@ class COMPONENT_EXPORT(UI_BASE_X) X11CursorFactory
std::map<mojom::CursorType, scoped_refptr<X11Cursor>> default_cursors_;
- base::ScopedObservation<CursorThemeManager, CursorThemeManagerObserver>
+#if BUILDFLAG(IS_LINUX)
+ base::ScopedObservation<LinuxUi,
+ CursorThemeManagerObserver,
+ &LinuxUi::AddCursorThemeObserver,
+ &LinuxUi::RemoveCursorThemeObserver>
cursor_theme_observation_{this};
+#endif
};
} // namespace ui
diff --git a/chromium/ui/base/x/x11_cursor_loader.cc b/chromium/ui/base/x/x11_cursor_loader.cc
index abdae888bd6..f6acf609326 100644
--- a/chromium/ui/base/x/x11_cursor_loader.cc
+++ b/chromium/ui/base/x/x11_cursor_loader.cc
@@ -27,13 +27,16 @@
#include "base/task/task_traits.h"
#include "base/task/thread_pool.h"
#include "base/time/time.h"
-#include "ui/base/cursor/cursor_theme_manager.h"
#include "ui/base/x/x11_util.h"
#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/x11_atom_cache.h"
#include "ui/gfx/x/xproto.h"
#include "ui/gfx/x/xproto_util.h"
+#if BUILDFLAG(IS_LINUX)
+#include "ui/linux/linux_ui.h"
+#endif
+
extern "C" {
const char* XcursorLibraryPath(void);
}
@@ -247,16 +250,17 @@ scoped_refptr<base::RefCountedMemory> ReadCursorFile(
const std::string& rm_xcursor_theme) {
constexpr const char kDefaultTheme[] = "default";
std::string themes[] = {
- // The toolkit theme has the highest priority.
- CursorThemeManager::GetInstance()
- ? CursorThemeManager::GetInstance()->GetCursorThemeName()
- : std::string(),
+#if BUILDFLAG(IS_LINUX)
+ // The toolkit theme has the highest priority.
+ LinuxUi::instance() ? LinuxUi::instance()->GetCursorThemeName()
+ : std::string(),
+#endif
- // Next try Xcursor.theme.
- rm_xcursor_theme,
+ // Next try Xcursor.theme.
+ rm_xcursor_theme,
- // As a last resort, use the default theme.
- kDefaultTheme,
+ // As a last resort, use the default theme.
+ kDefaultTheme,
};
for (const std::string& theme : themes) {
@@ -440,11 +444,13 @@ uint32_t XCursorLoader::GetPreferredCursorSize() const {
if (base::StringToInt(GetEnv(kXcursorSizeEnv), &size) && size > 0)
return size;
+#if BUILDFLAG(IS_LINUX)
// Let the toolkit have the next say.
- auto* manager = CursorThemeManager::GetInstance();
- size = manager ? manager->GetCursorThemeSize() : 0;
+ auto* linux_ui = LinuxUi::instance();
+ size = linux_ui ? linux_ui->GetCursorThemeSize() : 0;
if (size > 0)
return size;
+#endif
// Use Xcursor.size from RESOURCE_MANAGER if available.
if (rm_xcursor_size_)
diff --git a/chromium/ui/base/x/x11_cursor_loader.h b/chromium/ui/base/x/x11_cursor_loader.h
index 6b723b82603..f154e99d54d 100644
--- a/chromium/ui/base/x/x11_cursor_loader.h
+++ b/chromium/ui/base/x/x11_cursor_loader.h
@@ -8,6 +8,7 @@
#include <unordered_map>
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted_memory.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
@@ -63,7 +64,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XCursorLoader {
bool SupportsCreateCursor() const;
bool SupportsCreateAnimCursor() const;
- x11::Connection* connection_ = nullptr;
+ raw_ptr<x11::Connection> connection_ = nullptr;
x11::Font cursor_font_ = x11::Font::None;
diff --git a/chromium/ui/base/x/x11_desktop_window_move_client.h b/chromium/ui/base/x/x11_desktop_window_move_client.h
index 9ec14ee03f3..29a57cd85eb 100644
--- a/chromium/ui/base/x/x11_desktop_window_move_client.h
+++ b/chromium/ui/base/x/x11_desktop_window_move_client.h
@@ -7,6 +7,7 @@
#include "base/callback.h"
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
#include "ui/base/x/x11_move_loop_delegate.h"
#include "ui/base/x/x11_whole_screen_move_loop.h"
#include "ui/gfx/geometry/point.h"
@@ -53,7 +54,7 @@ class COMPONENT_EXPORT(UI_BASE_X) X11DesktopWindowMoveClient
// We need to keep track of this so we can actually move it when reacting to
// mouse events.
- Delegate* const window_;
+ const raw_ptr<Delegate> window_;
// Our cursor offset from the top left window origin when the drag
// started. Used to calculate the window's new bounds relative to the current
diff --git a/chromium/ui/base/x/x11_display_manager.h b/chromium/ui/base/x/x11_display_manager.h
index a0cbd9f4f3a..05e7a644a69 100644
--- a/chromium/ui/base/x/x11_display_manager.h
+++ b/chromium/ui/base/x/x11_display_manager.h
@@ -10,6 +10,7 @@
#include "base/cancelable_callback.h"
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
#include "ui/base/x/x11_workspace_handler.h"
#include "ui/display/display.h"
#include "ui/display/display_change_notifier.h"
@@ -75,11 +76,11 @@ class COMPONENT_EXPORT(UI_BASE_X) XDisplayManager
// X11WorkspaceHandler override:
void OnCurrentWorkspaceChanged(const std::string& new_workspace) override;
- Delegate* const delegate_;
+ const raw_ptr<Delegate> delegate_;
std::vector<display::Display> displays_;
display::DisplayChangeNotifier change_notifier_;
- x11::Connection* const connection_;
+ const raw_ptr<x11::Connection> connection_;
x11::Window x_root_window_;
int64_t primary_display_index_ = 0;
diff --git a/chromium/ui/base/x/x11_drag_context.h b/chromium/ui/base/x/x11_drag_context.h
index ae7cacc1b78..d30e3bf3c48 100644
--- a/chromium/ui/base/x/x11_drag_context.h
+++ b/chromium/ui/base/x/x11_drag_context.h
@@ -9,6 +9,7 @@
#include <vector>
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
#include "ui/base/x/selection_utils.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/x/event.h"
@@ -71,7 +72,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XDragContext {
x11::Window source_window_;
// The client we inform once we're done with requesting data.
- XDragDropClient* drag_drop_client_ = nullptr;
+ raw_ptr<XDragDropClient> drag_drop_client_ = nullptr;
// Whether we're blocking the handling of an XdndPosition message by waiting
// for |unfetched_targets_| to be fetched.
diff --git a/chromium/ui/base/x/x11_drag_drop_client.h b/chromium/ui/base/x/x11_drag_drop_client.h
index 38e6d1980a6..c99a5cd2456 100644
--- a/chromium/ui/base/x/x11_drag_drop_client.h
+++ b/chromium/ui/base/x/x11_drag_drop_client.h
@@ -8,6 +8,7 @@
#include <vector>
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
#include "base/timer/timer.h"
#include "ui/base/dragdrop/mojom/drag_drop_types.mojom-shared.h"
#include "ui/base/x/selection_utils.h"
@@ -203,7 +204,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XDragDropClient {
void EndMoveLoop();
- Delegate* const delegate_;
+ const raw_ptr<Delegate> delegate_;
const x11::Window xwindow_;
@@ -213,7 +214,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XDragDropClient {
// Source side information.
SourceState source_state_ = SourceState::kOther;
- const XOSExchangeDataProvider* source_provider_ = nullptr;
+ raw_ptr<const XOSExchangeDataProvider> source_provider_ = nullptr;
// The operation bitfield as requested by StartDragAndDrop.
int allowed_operations_ = 0;
diff --git a/chromium/ui/base/x/x11_gl_egl_utility.cc b/chromium/ui/base/x/x11_gl_egl_utility.cc
index e625e27f54b..2aca7171806 100644
--- a/chromium/ui/base/x/x11_gl_egl_utility.cc
+++ b/chromium/ui/base/x/x11_gl_egl_utility.cc
@@ -59,7 +59,7 @@ void ChoosePlatformCustomAlphaAndBufferSize(EGLint* alpha_size,
EGLint* buffer_size) {
// If we're using ANGLE_NULL, we may not have a display, in which case we
// can't use XVisualManager.
- if (gl::GLSurfaceEGL::GetGLDisplayEGL()->GetNativeDisplay() !=
+ if (gl::GLSurfaceEGL::GetGLDisplayEGL()->GetNativeDisplay().GetDisplay() !=
EGL_DEFAULT_DISPLAY) {
uint8_t depth;
XVisualManager::GetInstance()->ChooseVisualForWindow(true, nullptr, &depth,
diff --git a/chromium/ui/base/x/x11_global_shortcut_listener.h b/chromium/ui/base/x/x11_global_shortcut_listener.h
index 9e472d76423..bfb82e38a9c 100644
--- a/chromium/ui/base/x/x11_global_shortcut_listener.h
+++ b/chromium/ui/base/x/x11_global_shortcut_listener.h
@@ -9,6 +9,7 @@
#include <set>
+#include "base/memory/raw_ptr.h"
#include "ui/events/keycodes/keyboard_codes.h"
#include "ui/events/platform/platform_event_dispatcher.h"
#include "ui/gfx/x/xproto.h"
@@ -72,7 +73,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XGlobalShortcutListener
std::set<Accelerator> registered_combinations_;
// The x11 default display and the native root window.
- x11::Connection* connection_;
+ raw_ptr<x11::Connection> connection_;
x11::Window x_root_window_;
};
diff --git a/chromium/ui/base/x/x11_idle_query.h b/chromium/ui/base/x/x11_idle_query.h
index 1553a3c8843..70c78622d0f 100644
--- a/chromium/ui/base/x/x11_idle_query.h
+++ b/chromium/ui/base/x/x11_idle_query.h
@@ -6,6 +6,7 @@
#define UI_BASE_X_X11_IDLE_QUERY_H_
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
namespace x11 {
class Connection;
@@ -25,7 +26,7 @@ class COMPONENT_EXPORT(UI_BASE_X) IdleQueryX11 {
int IdleTime();
private:
- x11::Connection* connection_;
+ raw_ptr<x11::Connection> connection_;
};
} // namespace ui
diff --git a/chromium/ui/base/x/x11_keyboard_hook.h b/chromium/ui/base/x/x11_keyboard_hook.h
index f08b865c073..b6f0179a148 100644
--- a/chromium/ui/base/x/x11_keyboard_hook.h
+++ b/chromium/ui/base/x/x11_keyboard_hook.h
@@ -8,6 +8,7 @@
#include <vector>
#include "base/containers/flat_set.h"
+#include "base/memory/raw_ptr.h"
#include "base/threading/thread_checker.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/native_widget_types.h"
@@ -44,7 +45,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XKeyboardHook {
std::vector<int> grabbed_keys_;
// The x11 default connection and the owner's native window.
- x11::Connection* const connection_ = nullptr;
+ const raw_ptr<x11::Connection> connection_ = nullptr;
const x11::Window x_window_ = x11::Window::None;
};
diff --git a/chromium/ui/base/x/x11_os_exchange_data_provider.h b/chromium/ui/base/x/x11_os_exchange_data_provider.h
index 823dd878aff..e513aa12ee5 100644
--- a/chromium/ui/base/x/x11_os_exchange_data_provider.h
+++ b/chromium/ui/base/x/x11_os_exchange_data_provider.h
@@ -10,6 +10,7 @@
#include "base/component_export.h"
#include "base/files/file_path.h"
+#include "base/memory/raw_ptr.h"
#include "base/pickle.h"
#include "ui/base/dragdrop/os_exchange_data_provider.h"
#include "ui/base/x/selection_owner.h"
@@ -132,7 +133,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XOSExchangeDataProvider
gfx::Vector2d drag_image_offset_;
// Our X11 state.
- x11::Connection* connection_;
+ raw_ptr<x11::Connection> connection_;
x11::Window x_root_window_;
// In X11, because the IPC parts of drag operations are implemented by
diff --git a/chromium/ui/base/x/x11_shm_image_pool.h b/chromium/ui/base/x/x11_shm_image_pool.h
index 5dd062f97e0..7b4b893ec2b 100644
--- a/chromium/ui/base/x/x11_shm_image_pool.h
+++ b/chromium/ui/base/x/x11_shm_image_pool.h
@@ -11,6 +11,7 @@
#include "base/callback_forward.h"
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/sequence_checker.h"
#include "third_party/skia/include/core/SkBitmap.h"
@@ -64,7 +65,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XShmImagePool : public x11::EventObserver {
x11::Shm::Seg shmseg{};
int shmid = 0;
- void* shmaddr = nullptr;
+ raw_ptr<void> shmaddr = nullptr;
bool shmem_attached_to_server = false;
SkBitmap bitmap;
std::unique_ptr<SkCanvas> canvas;
@@ -83,7 +84,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XShmImagePool : public x11::EventObserver {
void Cleanup();
- x11::Connection* const connection_;
+ const raw_ptr<x11::Connection> connection_;
const x11::Drawable drawable_;
const x11::VisualId visual_;
const int depth_;
diff --git a/chromium/ui/base/x/x11_software_bitmap_presenter.cc b/chromium/ui/base/x/x11_software_bitmap_presenter.cc
index ab101728077..d91d59d6117 100644
--- a/chromium/ui/base/x/x11_software_bitmap_presenter.cc
+++ b/chromium/ui/base/x/x11_software_bitmap_presenter.cc
@@ -14,6 +14,7 @@
#include "base/bind.h"
#include "base/logging.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted_memory.h"
#include "skia/ext/legacy_display_globals.h"
#include "third_party/skia/include/core/SkCanvas.h"
@@ -48,7 +49,7 @@ class ScopedPixmap {
}
private:
- x11::Connection* const connection_;
+ const raw_ptr<x11::Connection> connection_;
x11::Pixmap pixmap_;
};
@@ -91,12 +92,12 @@ bool X11SoftwareBitmapPresenter::CompositeBitmap(x11::Connection* connection,
connection->ChangeGC(x11::ChangeGCRequest{
.gc = gc, .subwindow_mode = x11::SubwindowMode::ClipByChildren});
- auto req = connection->GetImage(
+ auto pix_req = connection->GetImage(
{x11::ImageFormat::ZPixmap, pixmap_id, 0, 0, w_u16, h_u16, kAllPlanes});
- if (auto reply = req.Sync())
- bg = reply->data;
- else
+ auto pix_reply = pix_req.Sync();
+ if (!pix_reply)
return false;
+ bg = pix_reply->data;
}
SkBitmap bg_bitmap;
diff --git a/chromium/ui/base/x/x11_software_bitmap_presenter.h b/chromium/ui/base/x/x11_software_bitmap_presenter.h
index 35f35a024fe..367749ff1c6 100644
--- a/chromium/ui/base/x/x11_software_bitmap_presenter.h
+++ b/chromium/ui/base/x/x11_software_bitmap_presenter.h
@@ -6,6 +6,7 @@
#define UI_BASE_X_X11_SOFTWARE_BITMAP_PRESENTER_H_
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/sequence_checker.h"
#include "base/task/sequenced_task_runner.h"
@@ -59,7 +60,7 @@ class COMPONENT_EXPORT(UI_BASE_X) X11SoftwareBitmapPresenter {
bool ShmPoolReady() const;
x11::Window widget_;
- x11::Connection* connection_;
+ raw_ptr<x11::Connection> connection_;
x11::GraphicsContext gc_{};
x11::VisualId visual_{};
int depth_ = 0;
diff --git a/chromium/ui/base/x/x11_util.h b/chromium/ui/base/x/x11_util.h
index bf36efe170f..db40653c6a4 100644
--- a/chromium/ui/base/x/x11_util.h
+++ b/chromium/ui/base/x/x11_util.h
@@ -16,6 +16,7 @@
#include "base/component_export.h"
#include "base/containers/flat_set.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted_memory.h"
#include "base/memory/scoped_refptr.h"
#include "base/synchronization/lock.h"
@@ -337,7 +338,9 @@ COMPONENT_EXPORT(UI_BASE_X) bool IsCompositingManagerPresent();
COMPONENT_EXPORT(UI_BASE_X) bool IsX11WindowFullScreen(x11::Window window);
// Suspends or resumes the X screen saver, and returns whether the operation was
-// successful. Must be called on the UI thread.
+// successful. Must be called on the UI thread. If called multiple times with
+// |suspend| set to true, the screen saver is not un-suspended until this method
+// is called an equal number of times with |suspend| set to false.
COMPONENT_EXPORT(UI_BASE_X) bool SuspendX11ScreenSaver(bool suspend);
// Returns true if the window manager supports the given hint.
@@ -415,7 +418,7 @@ class COMPONENT_EXPORT(UI_BASE_X) XVisualManager {
x11::ColorMap GetColormap();
const uint8_t depth;
- const x11::VisualType* const info;
+ const raw_ptr<const x11::VisualType> info;
private:
x11::ColorMap colormap_{};
diff --git a/chromium/ui/base/x/x11_whole_screen_move_loop.h b/chromium/ui/base/x/x11_whole_screen_move_loop.h
index 0ae70b2a95c..5058b4a96c8 100644
--- a/chromium/ui/base/x/x11_whole_screen_move_loop.h
+++ b/chromium/ui/base/x/x11_whole_screen_move_loop.h
@@ -11,6 +11,7 @@
#include "base/callback.h"
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "ui/base/x/x11_move_loop.h"
#include "ui/base/x/x11_move_loop_delegate.h"
@@ -64,7 +65,7 @@ class COMPONENT_EXPORT(UI_BASE_X) X11WholeScreenMoveLoop
void PostDispatchIfNeeded(const ui::MouseEvent& event);
- X11MoveLoopDelegate* delegate_;
+ raw_ptr<X11MoveLoopDelegate> delegate_;
// Are we running a nested run loop from RunMoveLoop()?
bool in_move_loop_;
diff --git a/chromium/ui/base/x/x11_workspace_handler.h b/chromium/ui/base/x/x11_workspace_handler.h
index 2a4e7935013..ba766809239 100644
--- a/chromium/ui/base/x/x11_workspace_handler.h
+++ b/chromium/ui/base/x/x11_workspace_handler.h
@@ -8,6 +8,7 @@
#include <memory>
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/event.h"
@@ -54,7 +55,7 @@ class COMPONENT_EXPORT(UI_BASE_X) X11WorkspaceHandler
std::string workspace_;
- Delegate* const delegate_;
+ const raw_ptr<Delegate> delegate_;
base::WeakPtrFactory<X11WorkspaceHandler> weak_factory_{this};
};
diff --git a/chromium/ui/chromeos/BUILD.gn b/chromium/ui/chromeos/BUILD.gn
index db5e0f66575..1baebd51710 100644
--- a/chromium/ui/chromeos/BUILD.gn
+++ b/chromium/ui/chromeos/BUILD.gn
@@ -32,9 +32,9 @@ component("chromeos") {
deps += [
"//ash/constants",
"//base/third_party/dynamic_annotations",
+ "//chromeos/ash/components/network",
"//chromeos/dbus/power",
"//chromeos/dbus/power:power_manager_proto",
- "//chromeos/network:network",
"//components/device_event_log",
"//mojo/public/cpp/bindings",
"//services/device/public/mojom",
diff --git a/chromium/ui/chromeos/strings/BUILD.gn b/chromium/ui/chromeos/strings/BUILD.gn
index e3cfd32847a..44505aa55c5 100644
--- a/chromium/ui/chromeos/strings/BUILD.gn
+++ b/chromium/ui/chromeos/strings/BUILD.gn
@@ -21,8 +21,8 @@ if (is_chromeos_ash) {
]
deps = [
"//ash/constants",
+ "//chromeos/ash/components/network",
"//chromeos/login/login_state:login_state",
- "//chromeos/network:network",
"//chromeos/strings:strings_grit",
"//components/login:login",
"//components/strings:components_strings",
diff --git a/chromium/ui/chromeos/styles/BUILD.gn b/chromium/ui/chromeos/styles/BUILD.gn
index 8c459f79933..800763fe0ef 100644
--- a/chromium/ui/chromeos/styles/BUILD.gn
+++ b/chromium/ui/chromeos/styles/BUILD.gn
@@ -12,4 +12,28 @@ style_variable_generator("cros_styles") {
"cros_shadows.json5",
"cros_typography.json5",
]
+
+ cpp_namespace = "cros_styles"
+}
+
+style_variable_generator("cros_tokens") {
+ # If you change the sources, also change the paths in presubmit_support.py
+ sources = [
+ "cros_colors.json5",
+ "cros_palette.json5",
+ "cros_ref_colors.json5",
+ "cros_sys_colors.json5",
+ ]
+
+ cpp_namespace = "cros_tokens"
+ color_id_start_value = "0x4000"
+}
+
+style_variable_generator("color_internals_tokens") {
+ # If you change the sources, also change the paths in presubmit_support.py
+ sources = [
+ "cros_ref_colors.json5",
+ "cros_sys_colors.json5",
+ ]
+ cpp_namespace = "color_internals_tokens"
}
diff --git a/chromium/ui/color/chromeos/native_color_mixers_chromeos.cc b/chromium/ui/color/chromeos/native_color_mixers_chromeos.cc
index 80f5f58ca70..5d16ffff39a 100644
--- a/chromium/ui/color/chromeos/native_color_mixers_chromeos.cc
+++ b/chromium/ui/color/chromeos/native_color_mixers_chromeos.cc
@@ -23,7 +23,32 @@ void AddNativeCoreColorMixer(ColorProvider* provider,
mixer[kColorAshSystemUIMenuItemBackgroundSelected] = {
kColorMenuItemBackgroundSelected};
mixer[kColorAshSystemUIMenuSeparator] = {kColorMenuSeparator};
- if (key.color_mode == ColorProviderManager::ColorMode::kDark) {
+ bool dark_mode = key.color_mode == ColorProviderManager::ColorMode::kDark;
+
+ // Add color initializations for highlight border.
+ {
+ const ui::ColorTransform light_border = {SkColorSetA(SK_ColorBLACK, 0x0F)};
+ const auto default_background_color =
+ ui::GetEndpointColorWithMinContrast({ui::kColorPrimaryBackground});
+ const auto background_color =
+ key.user_color.has_value() ? ui::ColorTransform(key.user_color.value())
+ : default_background_color;
+ mixer[kColorHighlightBorderBorder1] =
+ dark_mode ? SetAlpha(background_color, SK_AlphaOPAQUE * 0.8f)
+ : light_border;
+ mixer[kColorHighlightBorderBorder2] =
+ dark_mode ? SetAlpha(background_color, SK_AlphaOPAQUE * 0.6f)
+ : light_border;
+ mixer[kColorHighlightBorderBorder3] = light_border;
+
+ mixer[kColorHighlightBorderHighlight1] = {
+ SkColorSetA(SK_ColorWHITE, dark_mode ? 0x14 : 0x4C)};
+ mixer[kColorHighlightBorderHighlight2] = {
+ SkColorSetA(SK_ColorWHITE, dark_mode ? 0x0F : 0x33)};
+ mixer[kColorHighlightBorderHighlight3] = {kColorHighlightBorderHighlight1};
+ }
+
+ if (dark_mode) {
const bool high_elevation =
key.elevation_mode == ColorProviderManager::ElevationMode::kHigh;
const SkColor base_color =
diff --git a/chromium/ui/color/color_id.h b/chromium/ui/color/color_id.h
index e7b5202d87d..401c319799f 100644
--- a/chromium/ui/color/color_id.h
+++ b/chromium/ui/color/color_id.h
@@ -128,12 +128,15 @@
E_CPONLY(kColorOverlayScrollbarStrokeHoveredDark) \
E_CPONLY(kColorOverlayScrollbarStrokeHoveredLight) \
E_CPONLY(kColorProgressBar) \
+ E_CPONLY(kColorProgressBarPaused) \
E_CPONLY(kColorSeparator) \
E_CPONLY(kColorShadowBase) \
E_CPONLY(kColorShadowValueAmbientShadowElevationSixteen) \
E_CPONLY(kColorShadowValueAmbientShadowElevationThree) \
E_CPONLY(kColorShadowValueKeyShadowElevationSixteen) \
E_CPONLY(kColorShadowValueKeyShadowElevationThree) \
+ E_CPONLY(kColorSidePanelComboboxBorder) \
+ E_CPONLY(kColorSidePanelComboboxBackground) \
E_CPONLY(kColorSliderThumb) \
E_CPONLY(kColorSliderThumbMinimal) \
E_CPONLY(kColorSliderTrack) \
@@ -184,10 +187,30 @@
#if BUILDFLAG(IS_CHROMEOS)
#define PLATFORM_SPECIFIC_COLOR_IDS \
- E_CPONLY(kColorAshSystemUIBorderColor1) \
- E_CPONLY(kColorAshSystemUIBorderColor2) \
- E_CPONLY(kColorAshSystemUIHighlightColor1) \
- E_CPONLY(kColorAshSystemUIHighlightColor2) \
+ /* NOTE: Nearly all of the following CrOS color ids will need to be re- */ \
+ /* evaluated once CrOS fully supports the color pipeline. */ \
+ E_CPONLY(kColorAshActionLabelFocusRingEdit) \
+ E_CPONLY(kColorAshActionLabelFocusRingError) \
+ E_CPONLY(kColorAshActionLabelFocusRingHover) \
+ \
+ /* TODO(skau): Remove Compat value when dark/light mode launches. */ \
+ E_CPONLY(kColorAshAppListFocusRingCompat) \
+ E_CPONLY(kColorAshAppListFocusRingNoKeyboard) \
+ E_CPONLY(kColorAshAppListSeparator) \
+ E_CPONLY(kColorAshAppListSeparatorLight) \
+ E_CPONLY(kColorAshArcInputMenuSeparator) \
+ E_CPONLY(kColorAshFocusRing) \
+ /* TODO(kylixrd): Determine whether this special color should follow */ \
+ /* light/dark mode. Remove if it should equal kColorAshFocusRing. */ \
+ E_CPONLY(kColorAshEditFinishFocusRing) \
+ E_CPONLY(kColorAshIconInOobe) \
+ \
+ /* TODO(crbug/1319917): Remove these when dark light mode is launched. */ \
+ E_CPONLY(kColorAshLightFocusRing) \
+ \
+ E_CPONLY(kColorAshOnboardingFocusRing) \
+ \
+ E_CPONLY(kColorAshPrivacyIndicatorsBackground) \
\
/* TODO(crbug/1319917): Remove these when dark light mode is launched. */ \
E_CPONLY(kColorAshSystemUILightBorderColor1) \
@@ -199,6 +222,14 @@
E_CPONLY(kColorAshSystemUIMenuIcon) \
E_CPONLY(kColorAshSystemUIMenuItemBackgroundSelected) \
E_CPONLY(kColorAshSystemUIMenuSeparator) \
+ \
+ E_CPONLY(kColorHighlightBorderBorder1) \
+ E_CPONLY(kColorHighlightBorderBorder2) \
+ E_CPONLY(kColorHighlightBorderBorder3) \
+ E_CPONLY(kColorHighlightBorderHighlight1) \
+ E_CPONLY(kColorHighlightBorderHighlight2) \
+ E_CPONLY(kColorHighlightBorderHighlight3) \
+ \
E_CPONLY(kColorNativeColor1) \
E_CPONLY(kColorNativeColor1Shade1) \
E_CPONLY(kColorNativeColor1Shade2) \
@@ -289,6 +320,8 @@ enum ColorIds : ColorId {
};
// clang-format on
+// Note that this second include is not redundant. The second inclusion of the
+// .inc file serves to undefine the macros the first inclusion defined.
#include "ui/color/color_id_macros.inc"
} // namespace ui
diff --git a/chromium/ui/color/color_provider_manager.cc b/chromium/ui/color/color_provider_manager.cc
index 8718e888bf9..c66b9d478e3 100644
--- a/chromium/ui/color/color_provider_manager.cc
+++ b/chromium/ui/color/color_provider_manager.cc
@@ -8,7 +8,6 @@
#include "base/bind.h"
#include "base/check.h"
-#include "base/logging.h"
#include "base/no_destructor.h"
#include "build/build_config.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
@@ -23,9 +22,13 @@ namespace ui {
namespace {
+// Cache at most 5 ColorProviders to prevent unbounded storage from user_color.
+constexpr size_t kCacheSize = 5;
+
class GlobalManager : public ColorProviderManager {
public:
- GlobalManager() = default;
+ explicit GlobalManager(size_t cache_size = kCacheSize)
+ : ColorProviderManager(cache_size) {}
GlobalManager(const GlobalManager&) = delete;
GlobalManager& operator=(const GlobalManager&) = delete;
~GlobalManager() override = default;
@@ -55,6 +58,7 @@ ColorProviderManager::Key::Key()
ContrastMode::kNormal,
SystemTheme::kDefault,
FrameType::kChromium,
+ absl::nullopt,
nullptr) {}
ColorProviderManager::Key::Key(
@@ -62,12 +66,14 @@ ColorProviderManager::Key::Key(
ContrastMode contrast_mode,
SystemTheme system_theme,
FrameType frame_type,
+ absl::optional<SkColor> user_color,
scoped_refptr<ThemeInitializerSupplier> custom_theme)
: color_mode(color_mode),
contrast_mode(contrast_mode),
elevation_mode(ElevationMode::kLow),
system_theme(system_theme),
frame_type(frame_type),
+ user_color(user_color),
custom_theme(std::move(custom_theme)) {}
ColorProviderManager::Key::Key(const Key&) = default;
@@ -77,7 +83,8 @@ ColorProviderManager::Key& ColorProviderManager::Key::operator=(const Key&) =
ColorProviderManager::Key::~Key() = default;
-ColorProviderManager::ColorProviderManager() {
+ColorProviderManager::ColorProviderManager(size_t cache_size)
+ : color_providers_(cache_size) {
ResetColorProviderInitializerList();
}
@@ -98,10 +105,10 @@ ColorProviderManager& ColorProviderManager::Get() {
}
// static
-ColorProviderManager& ColorProviderManager::GetForTesting() {
+ColorProviderManager& ColorProviderManager::GetForTesting(size_t cache_size) {
absl::optional<GlobalManager>& manager = GetGlobalManager();
if (!manager.has_value())
- manager.emplace();
+ manager.emplace(cache_size);
return manager.value();
}
@@ -118,7 +125,7 @@ void ColorProviderManager::ResetColorProviderInitializerList() {
void ColorProviderManager::ResetColorProviderCache() {
if (!color_providers_.empty())
- color_providers_.clear();
+ color_providers_.Clear();
}
void ColorProviderManager::AppendColorProviderInitializer(
@@ -131,7 +138,7 @@ void ColorProviderManager::AppendColorProviderInitializer(
}
ColorProvider* ColorProviderManager::GetColorProviderFor(Key key) {
- auto iter = color_providers_.find(key);
+ auto iter = color_providers_.Get(key);
if (iter == color_providers_.end()) {
auto provider = std::make_unique<ColorProvider>();
DCHECK(initializer_list_);
@@ -139,7 +146,7 @@ ColorProvider* ColorProviderManager::GetColorProviderFor(Key key) {
initializer_list_->Notify(provider.get(), key);
provider->GenerateColorMap();
- iter = color_providers_.emplace(key, std::move(provider)).first;
+ iter = color_providers_.Put(key, std::move(provider));
}
ColorProvider* provider = iter->second.get();
DCHECK(provider);
diff --git a/chromium/ui/color/color_provider_manager.h b/chromium/ui/color/color_provider_manager.h
index 58b3cc29328..d346abe3258 100644
--- a/chromium/ui/color/color_provider_manager.h
+++ b/chromium/ui/color/color_provider_manager.h
@@ -7,12 +7,14 @@
#include <memory>
#include <tuple>
+#include <vector>
#include "base/callback.h"
#include "base/callback_list.h"
#include "base/component_export.h"
-#include "base/containers/flat_map.h"
+#include "base/containers/lru_cache.h"
#include "base/memory/weak_ptr.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/gfx/color_utils.h"
@@ -62,15 +64,8 @@ class COMPONENT_EXPORT(COLOR) ColorProviderManager {
virtual void AddColorMixers(ColorProvider* provider,
const Key& key) const = 0;
- base::WeakPtr<InitializerSupplier> get_weak_ref() {
- return weak_factory_.GetWeakPtr();
- }
-
protected:
virtual ~InitializerSupplier();
-
- private:
- base::WeakPtrFactory<InitializerSupplier> weak_factory_{this};
};
// Threadsafe not because ColorProviderManager requires it but because a
@@ -82,7 +77,6 @@ class COMPONENT_EXPORT(COLOR) ColorProviderManager {
enum class ThemeType {
kExtension,
kAutogenerated,
- kIncreasedContrast,
kNativeX11,
};
@@ -110,7 +104,8 @@ class COMPONENT_EXPORT(COLOR) ColorProviderManager {
ContrastMode contrast_mode,
SystemTheme system_theme,
FrameType frame_type,
- scoped_refptr<ThemeInitializerSupplier> custom_theme);
+ absl::optional<SkColor> user_color = absl::nullopt,
+ scoped_refptr<ThemeInitializerSupplier> custom_theme = nullptr);
Key(const Key&);
Key& operator=(const Key&);
~Key();
@@ -119,17 +114,26 @@ class COMPONENT_EXPORT(COLOR) ColorProviderManager {
ElevationMode elevation_mode;
SystemTheme system_theme;
FrameType frame_type;
+ absl::optional<SkColor> user_color;
scoped_refptr<ThemeInitializerSupplier> custom_theme;
- base::WeakPtr<InitializerSupplier> app_controller;
+ // Only dereferenced when populating the ColorMixer. After that, used to
+ // compare addresses during lookup.
+ //
+ // TODO(crbug.com/1298696): browser_tests breaks with MTECheckedPtr
+ // enabled. Triage.
+ raw_ptr<InitializerSupplier, DegradeToNoOpWhenMTE> app_controller =
+ nullptr; // unowned
bool operator<(const Key& other) const {
auto* lhs_app_controller = app_controller.get();
auto* rhs_app_controller = other.app_controller.get();
return std::tie(color_mode, contrast_mode, elevation_mode, system_theme,
- frame_type, custom_theme, lhs_app_controller) <
+ frame_type, user_color, custom_theme,
+ lhs_app_controller) <
std::tie(other.color_mode, other.contrast_mode,
other.elevation_mode, other.system_theme,
- other.frame_type, other.custom_theme, rhs_app_controller);
+ other.frame_type, other.user_color, other.custom_theme,
+ rhs_app_controller);
}
};
@@ -140,7 +144,7 @@ class COMPONENT_EXPORT(COLOR) ColorProviderManager {
ColorProviderManager& operator=(const ColorProviderManager&) = delete;
static ColorProviderManager& Get();
- static ColorProviderManager& GetForTesting();
+ static ColorProviderManager& GetForTesting(size_t cache_size = 1);
static void ResetForTesting();
// Resets the current `initializer_list_`.
@@ -157,7 +161,9 @@ class COMPONENT_EXPORT(COLOR) ColorProviderManager {
ColorProvider* GetColorProviderFor(Key key);
protected:
- ColorProviderManager();
+ // Creates a ColorProviderManager that stores at most |cache_size|
+ // ColorProviders.
+ explicit ColorProviderManager(size_t cache_size);
virtual ~ColorProviderManager();
private:
@@ -167,7 +173,7 @@ class COMPONENT_EXPORT(COLOR) ColorProviderManager {
// Holds the subscriptions for initializers in the `initializer_list_`.
std::vector<base::CallbackListSubscription> initializer_subscriptions_;
- base::flat_map<Key, std::unique_ptr<ColorProvider>> color_providers_;
+ base::LRUCache<Key, std::unique_ptr<ColorProvider>> color_providers_;
};
} // namespace ui
diff --git a/chromium/ui/color/color_provider_manager_unittest.cc b/chromium/ui/color/color_provider_manager_unittest.cc
index a32144e71c3..2a3bd9f9b75 100644
--- a/chromium/ui/color/color_provider_manager_unittest.cc
+++ b/chromium/ui/color/color_provider_manager_unittest.cc
@@ -4,8 +4,11 @@
#include "ui/color/color_provider_manager.h"
+#include <vector>
+
#include "base/bind.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/color/color_mixer.h"
#include "ui/color/color_provider.h"
@@ -32,9 +35,24 @@ ColorProvider* GetLightNormalColorProvider() {
{ColorProviderManager::ColorMode::kLight,
ColorProviderManager::ContrastMode::kNormal,
ColorProviderManager::SystemTheme::kDefault,
- ColorProviderManager::FrameType::kChromium, nullptr});
+ ColorProviderManager::FrameType::kChromium, absl::nullopt, nullptr});
+}
+
+// Returns a Key where |color| is the user_color value.
+ColorProviderManager::Key UserColorKey(SkColor color) {
+ return ColorProviderManager::Key(ColorProviderManager::ColorMode::kLight,
+ ColorProviderManager::ContrastMode::kNormal,
+ ColorProviderManager::SystemTheme::kDefault,
+ ColorProviderManager::FrameType::kChromium,
+ color, nullptr);
}
+class TestInitializerSupplier
+ : public ColorProviderManager::InitializerSupplier {
+ void AddColorMixers(ColorProvider* provider,
+ const ColorProviderManager::Key& key) const override {}
+};
+
} // namespace
// Verifies that color providers endure for each call to GetColorProviderFor().
@@ -74,4 +92,81 @@ TEST_F(ColorProviderManagerTest, Reset) {
GetLightNormalColorProvider()->GetColor(kColorTest0));
}
+TEST_F(ColorProviderManagerTest, LookupWithDeletedMember) {
+ ColorProviderManager& manager = ColorProviderManager::GetForTesting();
+ ColorProviderManager::Key key;
+
+ {
+ TestInitializerSupplier supplier;
+ key.app_controller = &supplier;
+
+ EXPECT_TRUE(manager.GetColorProviderFor(key));
+ key.app_controller = &supplier;
+ }
+
+ // key.app_controller is now invalid but shouldn't be dereferenced so the key
+ // is still safe to use.
+ EXPECT_TRUE(manager.GetColorProviderFor(key));
+}
+
+TEST_F(ColorProviderManagerTest, KeyOrderIsStable) {
+ ColorProviderManager::Key keys[2];
+
+ // Allocate two suppliers.
+ std::vector<TestInitializerSupplier> supplier(2);
+ keys[0].app_controller = &supplier[0];
+ keys[1].app_controller = &supplier[1];
+
+ // Validate order.
+ ASSERT_LT(keys[0], keys[1]);
+
+ // Delete the higher of the two suppliers.
+ supplier.pop_back();
+
+ // Verify that the order hasn't changed.
+ EXPECT_LT(keys[0], keys[1]);
+}
+
+TEST_F(ColorProviderManagerTest, CacheLimits) {
+ // Count each time colors are generated.
+ int counter = 0;
+ auto initializer = base::BindRepeating(
+ [](int* inc, ColorProvider* provider, const ColorProviderManager::Key&) {
+ provider->AddMixer()[kColorTest0] = {SK_ColorBLUE};
+ (*inc)++;
+ },
+ &counter);
+
+ // Only keep 4 color providers.
+ ColorProviderManager& manager = ColorProviderManager::GetForTesting(4U);
+ manager.AppendColorProviderInitializer(initializer);
+
+ // We need 5 keys to test this.
+ ColorProviderManager::Key keys[5] = {
+ UserColorKey(SK_ColorGRAY), UserColorKey(SK_ColorWHITE),
+ UserColorKey(SK_ColorRED), UserColorKey(SK_ColorBLUE),
+ UserColorKey(SK_ColorMAGENTA)};
+
+ for (const ColorProviderManager::Key& key : keys) {
+ manager.GetColorProviderFor(key);
+ }
+ // 5 requests for different keys yields 5 runs of the initializer.
+ EXPECT_EQ(5, counter);
+
+ counter = 0;
+ // Magenta is the most recent so it should not result in an evaluation.
+ manager.GetColorProviderFor(keys[4]);
+ EXPECT_EQ(0, counter);
+
+ // Gray should have been evicted so it causes an evaluation.
+ manager.GetColorProviderFor(keys[0]);
+ EXPECT_EQ(1, counter);
+
+ counter = 0;
+ // The most recently used keys are grey, magenta, blue and red. Magenta should
+ // not result in an evaluation.
+ manager.GetColorProviderFor(keys[4]);
+ EXPECT_EQ(0, counter);
+}
+
} // namespace ui
diff --git a/chromium/ui/color/color_provider_utils.cc b/chromium/ui/color/color_provider_utils.cc
index 96fd5477ef8..c7c07425e31 100644
--- a/chromium/ui/color/color_provider_utils.cc
+++ b/chromium/ui/color/color_provider_utils.cc
@@ -96,6 +96,8 @@ base::StringPiece SystemThemeName(
}
}
+// Note that this second include is not redundant. The second inclusion of the
+// .inc file serves to undefine the macros the first inclusion defined.
#include "ui/color/color_id_map_macros.inc"
std::string ColorIdName(ColorId color_id) {
diff --git a/chromium/ui/color/color_provider_utils.h b/chromium/ui/color/color_provider_utils.h
index 9d5575b816f..68ef9b51056 100644
--- a/chromium/ui/color/color_provider_utils.h
+++ b/chromium/ui/color/color_provider_utils.h
@@ -9,6 +9,7 @@
#include "base/callback.h"
#include "base/component_export.h"
+#include "base/containers/flat_map.h"
#include "base/strings/string_piece.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/color/color_id.h"
diff --git a/chromium/ui/color/color_transform.cc b/chromium/ui/color/color_transform.cc
index 8bee7e49c20..0b232d60588 100644
--- a/chromium/ui/color/color_transform.cc
+++ b/chromium/ui/color/color_transform.cc
@@ -205,6 +205,21 @@ ColorTransform GetColorWithMaxContrast(ColorTransform transform) {
return base::BindRepeating(generator, std::move(transform));
}
+ColorTransform GetEndpointColorWithMinContrast(ColorTransform transform) {
+ const auto generator = [](ColorTransform transform, SkColor input_color,
+ const ColorMixer& mixer) {
+ const SkColor transform_color = transform.Run(input_color, mixer);
+ const SkColor result_color =
+ color_utils::GetEndpointColorWithMinContrast(transform_color);
+ DVLOG(2) << "ColorTransform GetEndPointColorWithMinContrast:"
+ << " Input Color: " << SkColorName(input_color)
+ << " Transform Color: " << SkColorName(transform_color)
+ << " Result Color: " << SkColorName(result_color);
+ return result_color;
+ };
+ return base::BindRepeating(generator, std::move(transform));
+}
+
ColorTransform GetResultingPaintColor(ColorTransform foreground_transform,
ColorTransform background_transform) {
const auto generator = [](ColorTransform foreground_transform,
diff --git a/chromium/ui/color/color_transform.h b/chromium/ui/color/color_transform.h
index c3a49d7c259..4057e4bbfce 100644
--- a/chromium/ui/color/color_transform.h
+++ b/chromium/ui/color/color_transform.h
@@ -95,6 +95,11 @@ COMPONENT_EXPORT(COLOR) ColorTransform FromTransformInput();
COMPONENT_EXPORT(COLOR)
ColorTransform GetColorWithMaxContrast(ColorTransform transform);
+// A transform which returns the end point color with min contrast against the
+// result of |transform|.
+COMPONENT_EXPORT(COLOR)
+ColorTransform GetEndpointColorWithMinContrast(ColorTransform transform);
+
// A transform which returns the resulting paint color of the result of
// |foreground_transform| over the result of |background_transform|.
COMPONENT_EXPORT(COLOR)
diff --git a/chromium/ui/color/ui_color_mixer.cc b/chromium/ui/color/ui_color_mixer.cc
index 8b5b8c6321a..ca33acaffdb 100644
--- a/chromium/ui/color/ui_color_mixer.cc
+++ b/chromium/ui/color/ui_color_mixer.cc
@@ -5,6 +5,7 @@
#include "ui/color/ui_color_mixer.h"
#include "build/build_config.h"
+#include "ui/color/color_id.h"
#include "ui/color/color_mixer.h"
#include "ui/color/color_provider.h"
#include "ui/color/color_provider_manager.h"
@@ -148,6 +149,7 @@ void AddUiColorMixer(ColorProvider* provider,
mixer[kColorOverlayScrollbarStrokeHoveredLight] =
SetAlpha(GetColorWithMaxContrast(kColorOverlayScrollbarFillHoveredLight),
gfx::kGoogleGreyAlpha500);
+ mixer[kColorProgressBarPaused] = {kColorDisabledForeground};
mixer[kColorProgressBar] = {kColorAccent};
mixer[kColorSeparator] = {kColorMidground};
mixer[kColorShadowBase] = {dark_mode ? SK_ColorBLACK : gfx::kGoogleGrey800};
@@ -159,6 +161,8 @@ void AddUiColorMixer(ColorProvider* provider,
SetAlpha(kColorShadowBase, 0x3d);
mixer[kColorShadowValueKeyShadowElevationSixteen] =
SetAlpha(kColorShadowBase, 0x1a);
+ mixer[kColorSidePanelComboboxBorder] = {SK_ColorTRANSPARENT};
+ mixer[kColorSidePanelComboboxBackground] = {kColorPrimaryBackground};
mixer[kColorSliderThumb] = {kColorAccent};
mixer[kColorSliderThumbMinimal] = {kColorSecondaryForeground};
mixer[kColorSliderTrack] = {kColorSubtleAccent};
diff --git a/chromium/ui/compositor/BUILD.gn b/chromium/ui/compositor/BUILD.gn
index f102584d789..6f43d267163 100644
--- a/chromium/ui/compositor/BUILD.gn
+++ b/chromium/ui/compositor/BUILD.gn
@@ -266,12 +266,14 @@ test("compositor_unittests") {
}
if (is_fuchsia) {
- use_cfv2 = false
- additional_manifest_fragments = [
- # TODO(crbug.com/1185811): Figure out why jit_capabilities is needed.
- "//build/config/fuchsia/test/jit_capabilities.test-cmx",
+ use_cfv1 = false
- "//build/config/fuchsia/test/present_view_capabilities.test-cmx",
+ # TODO(https://crbug.com/1185811): Investigate removing the requirement for
+ # job_policy_ambient_mark_vmo_exec for the sake of V8's allocator in tests.
+ test_runner_shard = "//build/config/fuchsia/test/elf_test_ambient_exec_runner.shard.test-cml"
+ additional_manifest_fragments = [
+ "//build/config/fuchsia/test/present_view.shard.test-cml",
+ "//third_party/fuchsia-sdk/sdk/pkg/vulkan/client.shard.cml",
]
}
}
diff --git a/chromium/ui/compositor/compositor.cc b/chromium/ui/compositor/compositor.cc
index 39771c38101..9bb69f75642 100644
--- a/chromium/ui/compositor/compositor.cc
+++ b/chromium/ui/compositor/compositor.cc
@@ -455,14 +455,6 @@ void Compositor::SetScaleAndSize(float scale,
bool device_scale_factor_changed = device_scale_factor_ != scale;
device_scale_factor_ = scale;
-#if DCHECK_IS_ON()
- if (size_ != size_in_pixel && local_surface_id.is_valid()) {
- // A new LocalSurfaceId must be set when the compositor size changes.
- DCHECK_NE(local_surface_id, host_->local_surface_id_from_parent());
- DCHECK_NE(local_surface_id, host_->local_surface_id_from_parent());
- }
-#endif // DECHECK_IS_ON()
-
// cc requires the size to be non-empty (meaning DCHECKs if size is empty).
if (!size_in_pixel.IsEmpty()) {
bool size_changed = size_ != size_in_pixel;
@@ -508,7 +500,8 @@ void Compositor::SetDisplayTransformHint(gfx::OverlayTransform hint) {
}
void Compositor::SetBackgroundColor(SkColor color) {
- host_->set_background_color(color);
+ // TODO(crbug/1308932): Remove FromColor and make all SkColor4f.
+ host_->set_background_color(SkColor4f::FromColor(color));
ScheduleDraw();
}
@@ -665,8 +658,8 @@ ThroughputTracker Compositor::RequestNewThroughputTracker() {
weak_ptr_factory_.GetWeakPtr());
}
-uint32_t Compositor::GetAverageThroughput() const {
- return host_->GetAverageThroughput();
+double Compositor::GetPercentDroppedFrames() const {
+ return host_->GetPercentDroppedFrames();
}
std::unique_ptr<cc::EventsMetricsManager::ScopedMonitor>
@@ -736,7 +729,7 @@ void Compositor::DidCommit(base::TimeTicks, base::TimeTicks) {
std::unique_ptr<cc::BeginMainFrameMetrics>
Compositor::GetBeginMainFrameMetrics() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
auto metrics_data = std::make_unique<cc::BeginMainFrameMetrics>();
metrics_data->should_measure_smoothness = true;
return metrics_data;
diff --git a/chromium/ui/compositor/compositor.h b/chromium/ui/compositor/compositor.h
index 2f6d2ee4160..5dee5932ce9 100644
--- a/chromium/ui/compositor/compositor.h
+++ b/chromium/ui/compositor/compositor.h
@@ -337,8 +337,8 @@ class COMPOSITOR_EXPORT Compositor : public base::PowerSuspendObserver,
// Creates a ThroughputTracker for tracking this Compositor.
ThroughputTracker RequestNewThroughputTracker();
- // Returns a percentage representing average throughput of last X seconds.
- uint32_t GetAverageThroughput() const;
+ // Returns a percentage of dropped frames of the last second.
+ double GetPercentDroppedFrames() const;
// Activates a scoped monitor for the current event to track its metrics.
// `done_callback` is called when the monitor goes out of scope.
@@ -350,7 +350,10 @@ class COMPOSITOR_EXPORT Compositor : public base::PowerSuspendObserver,
void WillBeginMainFrame() override {}
void DidBeginMainFrame() override {}
void OnDeferMainFrameUpdatesChanged(bool) override {}
- void OnDeferCommitsChanged(bool, cc::PaintHoldingReason) override {}
+ void OnDeferCommitsChanged(
+ bool,
+ cc::PaintHoldingReason,
+ absl::optional<cc::PaintHoldingCommitTrigger>) override {}
void WillUpdateLayers() override {}
void DidUpdateLayers() override;
void BeginMainFrame(const viz::BeginFrameArgs& args) override;
@@ -472,7 +475,8 @@ class COMPOSITOR_EXPORT Compositor : public base::PowerSuspendObserver,
//
// These pointers are owned by |context_factory_|, and must be reset before
// calling RemoveCompositor();
- raw_ptr<viz::mojom::DisplayPrivate> display_private_ = nullptr;
+ raw_ptr<viz::mojom::DisplayPrivate, DanglingUntriaged> display_private_ =
+ nullptr;
raw_ptr<viz::mojom::ExternalBeginFrameController>
external_begin_frame_controller_ = nullptr;
diff --git a/chromium/ui/compositor/layer.cc b/chromium/ui/compositor/layer.cc
index 7b5519ceade..b582922a2d2 100644
--- a/chromium/ui/compositor/layer.cc
+++ b/chromium/ui/compositor/layer.cc
@@ -1095,10 +1095,6 @@ void Layer::UpdateNinePatchLayerImage(const gfx::ImageSkia& image) {
DCHECK(nine_patch_layer_.get());
nine_patch_layer_image_ = image;
- // TODO(estade): we don't clean up old bitmaps in the UIResourceManager when
- // the scale factor changes. Currently for the way NinePatchLayers are used,
- // we don't need/want to, but we should address this in the future if it
- // becomes an issue.
nine_patch_layer_->SetBitmap(
image.GetRepresentation(device_scale_factor_).GetBitmap());
}
@@ -1600,7 +1596,7 @@ gfx::RoundedCornersF Layer::GetRoundedCornersForAnimation() const {
return rounded_corner_radii();
}
-gfx::LinearGradient Layer::GetGradientMaskForAnimation() const {
+const gfx::LinearGradient& Layer::GetGradientMaskForAnimation() const {
return gradient_mask();
}
diff --git a/chromium/ui/compositor/layer.h b/chromium/ui/compositor/layer.h
index c0cd7072cf2..3ea74c830f5 100644
--- a/chromium/ui/compositor/layer.h
+++ b/chromium/ui/compositor/layer.h
@@ -328,7 +328,7 @@ class COMPOSITOR_EXPORT Layer : public LayerAnimationDelegate,
// Gets/sets a gradient mask that is applied to the clip bounds on the layer
void SetGradientMask(const gfx::LinearGradient& linear_gradient);
- const gfx::LinearGradient gradient_mask() const {
+ const gfx::LinearGradient& gradient_mask() const {
return cc_layer_->gradient_mask();
}
@@ -601,7 +601,7 @@ class COMPOSITOR_EXPORT Layer : public LayerAnimationDelegate,
SkColor GetColorForAnimation() const override;
gfx::Rect GetClipRectForAnimation() const override;
gfx::RoundedCornersF GetRoundedCornersForAnimation() const override;
- gfx::LinearGradient GetGradientMaskForAnimation() const override;
+ const gfx::LinearGradient& GetGradientMaskForAnimation() const override;
float GetDeviceScaleFactor() const override;
Layer* GetLayer() override;
cc::Layer* GetCcLayer() const override;
diff --git a/chromium/ui/compositor/layer_animation_delegate.h b/chromium/ui/compositor/layer_animation_delegate.h
index 79088f31ab1..1107a595609 100644
--- a/chromium/ui/compositor/layer_animation_delegate.h
+++ b/chromium/ui/compositor/layer_animation_delegate.h
@@ -59,7 +59,7 @@ class COMPOSITOR_EXPORT LayerAnimationDelegate {
virtual SkColor GetColorForAnimation() const = 0;
virtual gfx::Rect GetClipRectForAnimation() const = 0;
virtual gfx::RoundedCornersF GetRoundedCornersForAnimation() const = 0;
- virtual gfx::LinearGradient GetGradientMaskForAnimation() const = 0;
+ virtual const gfx::LinearGradient& GetGradientMaskForAnimation() const = 0;
virtual float GetDeviceScaleFactor() const = 0;
virtual ui::Layer* GetLayer() = 0;
virtual cc::Layer* GetCcLayer() const = 0;
diff --git a/chromium/ui/compositor/layer_animation_element.cc b/chromium/ui/compositor/layer_animation_element.cc
index 1b070f923f5..82bfcc56ba5 100644
--- a/chromium/ui/compositor/layer_animation_element.cc
+++ b/chromium/ui/compositor/layer_animation_element.cc
@@ -385,10 +385,10 @@ class GradientMaskTransition : public LayerAnimationElement {
DCHECK_EQ(start_.step_count(), target_.step_count());
for (auto i = 0; i < static_cast<int>(start_.step_count()); ++i) {
gradient_mask.AddStep(
- gfx::Tween::FloatValueBetween(t, start_.steps()[i].percent,
- target_.steps()[i].percent),
+ gfx::Tween::FloatValueBetween(t, start_.steps()[i].fraction,
+ target_.steps()[i].fraction),
gfx::Tween::IntValueBetween(t, start_.steps()[i].alpha,
- target_.steps()[i].alpha));
+ target_.steps()[i].alpha));
}
delegate->SetGradientMaskFromAnimation(
@@ -404,7 +404,7 @@ class GradientMaskTransition : public LayerAnimationElement {
private:
gfx::LinearGradient start_;
- gfx::LinearGradient target_;
+ const gfx::LinearGradient target_;
};
// ThreadedLayerAnimationElement -----------------------------------------------
@@ -521,6 +521,9 @@ class ThreadedOpacityTransition : public ThreadedLayerAnimationElement {
}
std::unique_ptr<cc::KeyframeModel> CreateCCKeyframeModel() override {
+ // Ensures that we don't remove and add a model with the same id in a single
+ // frame.
+ UpdateKeyframeModelId();
std::unique_ptr<gfx::AnimationCurve> animation_curve(
new FloatAnimationCurveAdapter(tween_type(), start_, target_,
duration()));
@@ -594,6 +597,9 @@ class ThreadedTransformTransition : public ThreadedLayerAnimationElement {
}
std::unique_ptr<cc::KeyframeModel> CreateCCKeyframeModel() override {
+ // Ensures that we don't remove and add a model with the same id in a single
+ // frame.
+ UpdateKeyframeModelId();
std::unique_ptr<gfx::AnimationCurve> animation_curve(
new TransformAnimationCurveAdapter(tween_type(), start_, target_,
duration()));
@@ -766,6 +772,10 @@ std::string LayerAnimationElement::ToString() const {
last_progressed_fraction_);
}
+void LayerAnimationElement::UpdateKeyframeModelId() {
+ keyframe_model_id_ = cc::AnimationIdProvider::NextKeyframeModelId();
+}
+
std::string LayerAnimationElement::DebugName() const {
return "Default";
}
diff --git a/chromium/ui/compositor/layer_animation_element.h b/chromium/ui/compositor/layer_animation_element.h
index afded4a7863..3008bbec2bd 100644
--- a/chromium/ui/compositor/layer_animation_element.h
+++ b/chromium/ui/compositor/layer_animation_element.h
@@ -229,6 +229,7 @@ class COMPOSITOR_EXPORT LayerAnimationElement {
std::string ToString() const;
protected:
+ void UpdateKeyframeModelId();
virtual std::string DebugName() const;
// Called once each time the animation element is run before any call to
@@ -258,7 +259,7 @@ class COMPOSITOR_EXPORT LayerAnimationElement {
const base::TimeDelta duration_;
gfx::Tween::Type tween_type_;
- const int keyframe_model_id_;
+ int keyframe_model_id_;
int animation_group_id_;
double last_progressed_fraction_;
diff --git a/chromium/ui/compositor/layer_animation_element_unittest.cc b/chromium/ui/compositor/layer_animation_element_unittest.cc
index c412c9ee57d..3d1fe60c24f 100644
--- a/chromium/ui/compositor/layer_animation_element_unittest.cc
+++ b/chromium/ui/compositor/layer_animation_element_unittest.cc
@@ -475,9 +475,9 @@ TEST(LayerAnimationElementTest, GradientMaskElement) {
gfx::LinearGradient start(45);
start.AddStep(0, 0);
gfx::LinearGradient target(135);
- target.AddStep(50, 255);
+ target.AddStep(.5, 255);
gfx::LinearGradient middle(90);
- middle.AddStep(25, 127);
+ middle.AddStep(.25, 127);
base::TimeTicks start_time;
base::TimeDelta delta = base::Seconds(1);
diff --git a/chromium/ui/compositor/layer_animator.cc b/chromium/ui/compositor/layer_animator.cc
index 19dc007026a..84c614d0fa1 100644
--- a/chromium/ui/compositor/layer_animator.cc
+++ b/chromium/ui/compositor/layer_animator.cc
@@ -289,7 +289,8 @@ void LayerAnimator::StartTogether(
bool wait_for_group_start = false;
for (iter = animations.begin(); iter != animations.end(); ++iter)
- wait_for_group_start |= (*iter)->IsFirstElementThreaded(delegate_);
+ wait_for_group_start |=
+ delegate_ && (*iter)->IsFirstElementThreaded(delegate_);
int group_id = cc::AnimationIdProvider::NextGroupId();
// These animations (provided they don't animate any common properties) will
@@ -326,7 +327,8 @@ void LayerAnimator::ScheduleTogether(
bool wait_for_group_start = false;
for (iter = animations.begin(); iter != animations.end(); ++iter)
- wait_for_group_start |= (*iter)->IsFirstElementThreaded(delegate_);
+ wait_for_group_start |=
+ delegate_ && (*iter)->IsFirstElementThreaded(delegate_);
int group_id = cc::AnimationIdProvider::NextGroupId();
diff --git a/chromium/ui/compositor/layer_animator_collection.cc b/chromium/ui/compositor/layer_animator_collection.cc
index fd9873e6104..5e997fb921b 100644
--- a/chromium/ui/compositor/layer_animator_collection.cc
+++ b/chromium/ui/compositor/layer_animator_collection.cc
@@ -14,6 +14,10 @@ namespace ui {
LayerAnimatorCollection::LayerAnimatorCollection(Compositor* compositor)
: compositor_(compositor), last_tick_time_(base::TimeTicks::Now()) {
+ // Do not check the active duration for the LayerAnimationCollection because
+ // new animation can be added while running existing animation, which
+ // extends the duration.
+ set_check_active_duration(false);
}
LayerAnimatorCollection::~LayerAnimatorCollection() {
diff --git a/chromium/ui/compositor/layer_owner.cc b/chromium/ui/compositor/layer_owner.cc
index 0ddca216e7b..71bf9065a1e 100644
--- a/chromium/ui/compositor/layer_owner.cc
+++ b/chromium/ui/compositor/layer_owner.cc
@@ -4,11 +4,6 @@
#include "ui/compositor/layer_owner.h"
-// layer_owner.h is a widely included header and its size impacts build
-// time. Try not to raise this limit unless necessary. See
-// https://chromium.googlesource.com/chromium/src/+/HEAD/docs/wmax_tokens.md
-#pragma clang max_tokens_here 480000
-
#include <utility>
#include "base/observer_list.h"
diff --git a/chromium/ui/compositor/layer_unittest.cc b/chromium/ui/compositor/layer_unittest.cc
index 6497d7d1239..fc4de27ee86 100644
--- a/chromium/ui/compositor/layer_unittest.cc
+++ b/chromium/ui/compositor/layer_unittest.cc
@@ -773,7 +773,7 @@ TEST_F(LayerWithDelegateTest, Cloning) {
gfx::Rect clip_rect(1, 1, 2, 2);
gfx::LinearGradient gradient_mask(45);
- gradient_mask.AddStep(50, 50);
+ gradient_mask.AddStep(.5, 50);
layer->SetTransform(transform);
layer->SetColor(SK_ColorRED);
@@ -816,7 +816,7 @@ TEST_F(LayerWithDelegateTest, Cloning) {
layer->SetRoundedCornerRadius({3, 6, 9, 12});
gradient_mask.set_angle(90);
- gradient_mask.AddStep(90, 30);
+ gradient_mask.AddStep(.9, 30);
layer->SetGradientMask(gradient_mask);
// The clone is an independent copy, so state changes do not propagate.
@@ -1064,7 +1064,7 @@ TEST_F(LayerWithNullDelegateTest, SwitchLayerPreservesCCLayerState) {
constexpr viz::SubtreeCaptureId kSubtreeCaptureId(22);
l1->SetSubtreeCaptureId(kSubtreeCaptureId);
gfx::LinearGradient gradient_mask(45);
- gradient_mask.AddStep(50, 50);
+ gradient_mask.AddStep(.5, 50);
l1->SetGradientMask(gradient_mask);
EXPECT_EQ(gfx::Point3F(), l1->cc_layer_for_testing()->transform_origin());
@@ -1348,7 +1348,7 @@ TEST_F(LayerWithDelegateTest, RoundedCorner) {
TEST_F(LayerWithDelegateTest, GradientMask) {
gfx::Rect layer_bounds(10, 20, 100, 100);
gfx::LinearGradient gradient_mask;
- gradient_mask.AddStep(50, 50);
+ gradient_mask.AddStep(.5, 50);
auto layer = std::make_unique<Layer>(LAYER_TEXTURED);
diff --git a/chromium/ui/compositor/recyclable_compositor_mac.cc b/chromium/ui/compositor/recyclable_compositor_mac.cc
index a2c1e7dcc46..fbedebe5e63 100644
--- a/chromium/ui/compositor/recyclable_compositor_mac.cc
+++ b/chromium/ui/compositor/recyclable_compositor_mac.cc
@@ -17,9 +17,6 @@ namespace ui {
namespace {
-// The number of RecyclableCompositorMacs in existence.
-size_t g_recyclable_compositor_count = 0;
-
// Returns a task runner for creating a ui::Compositor. This allows compositor
// tasks to be funneled through ui::WindowResizeHelper's task runner to allow
// resize operations to coordinate with frames provided by the GPU process.
@@ -44,7 +41,6 @@ RecyclableCompositorMac::RecyclableCompositorMac(
context_factory,
GetCompositorTaskRunner(),
ui::IsPixelCanvasRecordingEnabled()) {
- g_recyclable_compositor_count += 1;
compositor_.SetAcceleratedWidget(
accelerated_widget_mac_->accelerated_widget());
Suspend();
@@ -53,7 +49,6 @@ RecyclableCompositorMac::RecyclableCompositorMac(
RecyclableCompositorMac::~RecyclableCompositorMac() {
compositor_.RemoveObserver(this);
- g_recyclable_compositor_count -= 1;
}
void RecyclableCompositorMac::Suspend() {
@@ -102,78 +97,4 @@ void RecyclableCompositorMac::OnCompositingDidCommit(
accelerated_widget_mac_->SetSuspended(false);
}
-////////////////////////////////////////////////////////////////////////////////
-// RecyclableCompositorMacFactory
-
-// static
-RecyclableCompositorMacFactory* RecyclableCompositorMacFactory::Get() {
- static base::NoDestructor<RecyclableCompositorMacFactory> factory;
- return factory.get();
-}
-
-std::unique_ptr<RecyclableCompositorMac>
-RecyclableCompositorMacFactory::CreateCompositor(
- ui::ContextFactory* context_factory,
- bool force_new_compositor) {
- if (!compositors_.empty() && !force_new_compositor) {
- std::unique_ptr<RecyclableCompositorMac> result;
- result = std::move(compositors_.back());
- compositors_.pop_back();
- if (result->compositor()->context_factory() == context_factory) {
- return result;
- }
- }
- return std::make_unique<RecyclableCompositorMac>(context_factory);
-}
-
-void RecyclableCompositorMacFactory::RecycleCompositor(
- std::unique_ptr<RecyclableCompositorMac> compositor) {
- if (recycling_disabled_)
- return;
-
- // Invalidate the surface before suspending it.
- compositor->InvalidateSurface();
- compositor->accelerated_widget_mac_->SetSuspended(true);
-
- // Make this RecyclableCompositorMac recyclable for future instances.
- compositors_.push_back(std::move(compositor));
-
- // When we get to zero active compositors in use, destroy all spare
- // compositors. This is done to appease tests that rely on compositors being
- // destroyed immediately (if the compositor is recycled and continues to
- // exist, its subsequent initialization will crash).
- if (g_recyclable_compositor_count == compositors_.size()) {
- compositors_.clear();
- return;
- }
-
- // Post a task to free up the spare ui::Compositors when needed. Post this
- // to the browser main thread so that we won't free any compositors while
- // in a nested loop waiting to put up a new frame.
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::BindOnce(&RecyclableCompositorMacFactory::ReduceSpareCompositors,
- weak_factory_.GetWeakPtr()));
-}
-
-RecyclableCompositorMacFactory::RecyclableCompositorMacFactory()
- : weak_factory_(this) {
- // TODO(crbug.com/1247756): This class probably isn't needed anymore since
- // recycling is always disabled.
- recycling_disabled_ = true;
-}
-
-RecyclableCompositorMacFactory::~RecyclableCompositorMacFactory() = default;
-
-void RecyclableCompositorMacFactory::ReduceSpareCompositors() {
- // Allow at most one spare recyclable compositor.
- while (compositors_.size() > 1)
- compositors_.pop_front();
-}
-
-void RecyclableCompositorMacFactory::DisableRecyclingForShutdown() {
- recycling_disabled_ = true;
- compositors_.clear();
-}
-
} // namespace ui
diff --git a/chromium/ui/compositor/recyclable_compositor_mac.h b/chromium/ui/compositor/recyclable_compositor_mac.h
index b6110433460..a026b8ee0bc 100644
--- a/chromium/ui/compositor/recyclable_compositor_mac.h
+++ b/chromium/ui/compositor/recyclable_compositor_mac.h
@@ -52,8 +52,6 @@ class COMPOSITOR_EXPORT RecyclableCompositorMac
const gfx::DisplayColorSpaces& display_color_spaces);
private:
- friend class RecyclableCompositorMacFactory;
-
// Invalidate the compositor's surface information.
void InvalidateSurface();
@@ -72,38 +70,6 @@ class COMPOSITOR_EXPORT RecyclableCompositorMac
std::unique_ptr<ui::CompositorLock> compositor_suspended_lock_;
};
-////////////////////////////////////////////////////////////////////////////////
-// RecyclableCompositorMacFactory
-//
-// The factory through which RecyclableCompositorMacs are created and recycled.
-
-class COMPOSITOR_EXPORT RecyclableCompositorMacFactory {
- public:
- static RecyclableCompositorMacFactory* Get();
-
- // Create a compositor, or recycle a preexisting one.
- std::unique_ptr<RecyclableCompositorMac> CreateCompositor(
- ui::ContextFactory* context_factory,
- bool force_new_compositor = false);
-
- // Delete a compositor, or allow it to be recycled.
- void RecycleCompositor(std::unique_ptr<RecyclableCompositorMac> compositor);
-
- // Destroy any compositors that are being kept around for recycling.
- void DisableRecyclingForShutdown();
-
- private:
- friend class base::NoDestructor<ui::RecyclableCompositorMacFactory>;
- friend class RecyclableCompositorMac;
- RecyclableCompositorMacFactory();
- ~RecyclableCompositorMacFactory();
- void ReduceSpareCompositors();
-
- bool recycling_disabled_ = false;
- std::list<std::unique_ptr<RecyclableCompositorMac>> compositors_;
- base::WeakPtrFactory<RecyclableCompositorMacFactory> weak_factory_;
-};
-
} // namespace ui
#endif // UI_COMPOSITOR_RECYCLABLE_COMPOSITOR_MAC_H_
diff --git a/chromium/ui/display/BUILD.gn b/chromium/ui/display/BUILD.gn
index 18cce0ccb28..c18d9399c28 100644
--- a/chromium/ui/display/BUILD.gn
+++ b/chromium/ui/display/BUILD.gn
@@ -184,6 +184,8 @@ static_library("test_support") {
sources += [
"mac/test/test_screen_mac.h",
"mac/test/test_screen_mac.mm",
+ "mac/test/virtual_display_mac_util.h",
+ "mac/test/virtual_display_mac_util.mm",
]
}
@@ -279,3 +281,19 @@ test("display_unittests") {
]
}
}
+
+# This target is added as a dependency of browser interactive_ui_tests. It must
+# be source_set, otherwise the linker will drop the tests as dead code.
+source_set("display_interactive_ui_tests") {
+ testonly = true
+ if (is_mac) {
+ sources = [ "mac/test/virtual_display_mac_util_interactive_uitest.mm" ]
+
+ deps = [
+ ":display",
+ ":test_support",
+ "//base/test:test_support",
+ "//testing/gtest",
+ ]
+ }
+}
diff --git a/chromium/ui/display/display.cc b/chromium/ui/display/display.cc
index 3c3c6595156..4a9b5d7a507 100644
--- a/chromium/ui/display/display.cc
+++ b/chromium/ui/display/display.cc
@@ -218,6 +218,17 @@ int Display::RotationAsDegree() const {
return 0;
}
+void Display::set_color_spaces(const gfx::DisplayColorSpaces& color_spaces) {
+ color_spaces_ = color_spaces;
+ if (color_spaces.SupportsHDR()) {
+ color_depth_ = kHDR10BitsPerPixel;
+ depth_per_component_ = kHDR10BitsPerComponent;
+ } else {
+ color_depth_ = kDefaultBitsPerPixel;
+ depth_per_component_ = kDefaultBitsPerComponent;
+ }
+}
+
void Display::SetRotationAsDegree(int rotation) {
switch (rotation) {
case 0:
diff --git a/chromium/ui/display/display.h b/chromium/ui/display/display.h
index 3d0c27f2427..ba01a3c70b7 100644
--- a/chromium/ui/display/display.h
+++ b/chromium/ui/display/display.h
@@ -214,10 +214,9 @@ class DISPLAY_EXPORT Display final {
}
// The color spaces used by the display.
+ // TODO(b/226163383): Rename to SetColorSpaces
const gfx::DisplayColorSpaces& color_spaces() const { return color_spaces_; }
- void set_color_spaces(const gfx::DisplayColorSpaces& color_spaces) {
- color_spaces_ = color_spaces;
- }
+ void set_color_spaces(const gfx::DisplayColorSpaces& color_spaces);
// Return true if the display orientation is landscape.
bool is_landscape() const { return bounds_.width() >= bounds_.height(); }
diff --git a/chromium/ui/display/display_features.cc b/chromium/ui/display/display_features.cc
index 762239d56bb..bd0acae93d1 100644
--- a/chromium/ui/display/display_features.cc
+++ b/chromium/ui/display/display_features.cc
@@ -4,6 +4,7 @@
#include "ui/display/display_features.h"
+#include "base/feature_list.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
@@ -11,6 +12,15 @@ namespace display {
namespace features {
#if BUILDFLAG(IS_CHROMEOS_ASH)
+
+// Enables the rounded corners for the internal display.
+const base::Feature kRoundedDisplay{"RoundedDisplay",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+
+bool IsRoundedDisplayEnabled() {
+ return base::FeatureList::IsEnabled(kRoundedDisplay);
+}
+
// Enables using HDR transfer function if the monitor says it supports it.
const base::Feature kUseHDRTransferFunction {
"UseHDRTransferFunction",
@@ -21,6 +31,7 @@ const base::Feature kUseHDRTransferFunction {
base::FEATURE_ENABLED_BY_DEFAULT
#endif
};
+
#endif
// This features allows listing all display modes of external displays in the
@@ -51,9 +62,5 @@ bool IsHdcpKeyProvisioningRequired() {
return base::FeatureList::IsEnabled(kRequireHdcpKeyProvisioning);
}
-#if BUILDFLAG(IS_MAC)
-const base::Feature kForce60Hz{"Force60Hz", base::FEATURE_DISABLED_BY_DEFAULT};
-#endif
-
} // namespace features
} // namespace display
diff --git a/chromium/ui/display/display_features.h b/chromium/ui/display/display_features.h
index 265f136bb20..c278d076c78 100644
--- a/chromium/ui/display/display_features.h
+++ b/chromium/ui/display/display_features.h
@@ -13,6 +13,10 @@ namespace display {
namespace features {
#if BUILDFLAG(IS_CHROMEOS_ASH)
+DISPLAY_EXPORT extern const base::Feature kRoundedDisplay;
+
+DISPLAY_EXPORT bool IsRoundedDisplayEnabled();
+
DISPLAY_EXPORT extern const base::Feature kUseHDRTransferFunction;
#endif
@@ -27,11 +31,6 @@ DISPLAY_EXPORT bool IsHardwareMirrorModeEnabled();
DISPLAY_EXPORT extern const base::Feature kRequireHdcpKeyProvisioning;
DISPLAY_EXPORT bool IsHdcpKeyProvisioningRequired();
-#if BUILDFLAG(IS_MAC)
-// If enabled, vsync of 120 is forced to 60.
-DISPLAY_EXPORT extern const base::Feature kForce60Hz;
-#endif
-
} // namespace features
} // namespace display
diff --git a/chromium/ui/display/display_list.cc b/chromium/ui/display/display_list.cc
index dcf81a47b1e..c0ff86eac82 100644
--- a/chromium/ui/display/display_list.cc
+++ b/chromium/ui/display/display_list.cc
@@ -92,6 +92,10 @@ uint32_t DisplayList::UpdateDisplay(const Display& display, Type type) {
local_display->set_color_depth(display.color_depth());
changed_values |= DisplayObserver::DISPLAY_METRIC_COLOR_SPACE;
}
+ if (local_display->label() != display.label()) {
+ local_display->set_label(display.label());
+ changed_values |= DisplayObserver::DISPLAY_METRIC_LABEL;
+ }
if (local_display->GetSizeInPixel() != display.GetSizeInPixel()) {
local_display->set_size_in_pixels(display.GetSizeInPixel());
}
diff --git a/chromium/ui/display/display_list_unittest.cc b/chromium/ui/display/display_list_unittest.cc
index c84b12bffed..6840e06c395 100644
--- a/chromium/ui/display/display_list_unittest.cc
+++ b/chromium/ui/display/display_list_unittest.cc
@@ -65,6 +65,7 @@ class DisplayObserverImpl : public DisplayObserver {
"scale_factor", &parts);
AddPartChange(changed_metrics, DISPLAY_METRIC_ROTATION, "rotation", &parts);
AddPartChange(changed_metrics, DISPLAY_METRIC_PRIMARY, "primary", &parts);
+ AddPartChange(changed_metrics, DISPLAY_METRIC_LABEL, "label", &parts);
AddChange("Changed id=" + base::NumberToString(display.id()) + parts);
}
@@ -88,6 +89,15 @@ TEST(DisplayListTest, AddUpdateRemove) {
EXPECT_EQ("Changed id=2 bounds", observer.GetAndClearChanges());
}
+ // Update the label.
+ {
+ Display updated_display = *(display_list.displays().begin());
+ updated_display.set_label("new_label");
+ display_list.UpdateDisplay(updated_display, DisplayList::Type::PRIMARY);
+ EXPECT_EQ("Changed id=2 label", observer.GetAndClearChanges());
+ EXPECT_EQ("new_label", display_list.FindDisplayById(2)->label());
+ }
+
// Add another.
display_list.AddDisplay(Display(3, gfx::Rect(0, 0, 809, 802)),
DisplayList::Type::NOT_PRIMARY);
diff --git a/chromium/ui/display/display_observer.h b/chromium/ui/display/display_observer.h
index 57db4c4b229..e63102cf8ab 100644
--- a/chromium/ui/display/display_observer.h
+++ b/chromium/ui/display/display_observer.h
@@ -28,6 +28,7 @@ class DISPLAY_EXPORT DisplayObserver : public base::CheckedObserver {
DISPLAY_METRIC_COLOR_SPACE = 1 << 6,
DISPLAY_METRIC_REFRESH_RATE = 1 << 7,
DISPLAY_METRIC_INTERLACED = 1 << 8,
+ DISPLAY_METRIC_LABEL = 1 << 9,
};
// This may be called before other methods to signal changes are about to
diff --git a/chromium/ui/display/fake/fake_display_delegate.cc b/chromium/ui/display/fake/fake_display_delegate.cc
index 220aa120fe7..88cf0aaf17d 100644
--- a/chromium/ui/display/fake/fake_display_delegate.cc
+++ b/chromium/ui/display/fake/fake_display_delegate.cc
@@ -130,7 +130,8 @@ void FakeDisplayDelegate::GetDisplays(GetDisplaysCallback callback) {
void FakeDisplayDelegate::Configure(
const std::vector<display::DisplayConfigurationParams>& config_requests,
- ConfigureCallback callback) {
+ ConfigureCallback callback,
+ uint32_t modeset_flag) {
bool config_success = true;
for (const auto& config : config_requests) {
bool request_success = false;
diff --git a/chromium/ui/display/fake/fake_display_delegate.h b/chromium/ui/display/fake/fake_display_delegate.h
index d1e6998be52..431873eef16 100644
--- a/chromium/ui/display/fake/fake_display_delegate.h
+++ b/chromium/ui/display/fake/fake_display_delegate.h
@@ -88,7 +88,8 @@ class FAKE_DISPLAY_EXPORT FakeDisplayDelegate : public NativeDisplayDelegate,
void GetDisplays(GetDisplaysCallback callback) override;
void Configure(
const std::vector<display::DisplayConfigurationParams>& config_requests,
- ConfigureCallback callback) override;
+ ConfigureCallback callback,
+ uint32_t modeset_flag) override;
void GetHDCPState(const DisplaySnapshot& output,
GetHDCPStateCallback callback) override;
void SetHDCPState(const DisplaySnapshot& output,
diff --git a/chromium/ui/display/mac/display_link_mac.cc b/chromium/ui/display/mac/display_link_mac.cc
index 977939e2252..564cf8677fc 100644
--- a/chromium/ui/display/mac/display_link_mac.cc
+++ b/chromium/ui/display/mac/display_link_mac.cc
@@ -7,7 +7,6 @@
#include <stdint.h>
#include "base/bind.h"
-#include "base/command_line.h"
#include "base/location.h"
#include "base/logging.h"
#include "base/no_destructor.h"
@@ -15,7 +14,6 @@
#include "base/task/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h"
-#include "ui/display/display_features.h"
namespace base {
@@ -162,9 +160,7 @@ bool DisplayLinkMac::IsVSyncPotentiallyStale() const {
DisplayLinkMac::DisplayLinkMac(
CGDirectDisplayID display_id,
base::ScopedTypeRef<CVDisplayLinkRef> display_link)
- : display_id_(display_id),
- display_link_(display_link),
- force_60hz_(base::FeatureList::IsEnabled(display::features::kForce60Hz)) {
+ : display_id_(display_id), display_link_(display_link) {
DisplayLinkMap& all_display_links = GetAllDisplayLinks();
DCHECK(all_display_links.find(display_id) == all_display_links.end());
if (all_display_links.empty()) {
@@ -236,11 +232,6 @@ void DisplayLinkMac::UpdateVSyncParameters(const CVTimeStamp& cv_time) {
timebase_ = base::TimeTicks::FromMachAbsoluteTime(cv_time.hostTime);
interval_ = base::Microseconds(int64_t{interval_us.ValueOrDie()});
- // Use a range as interval is not always exactly 120.
- if (force_60hz_ && interval_ <= base::Hertz(115) &&
- interval_ >= base::Hertz(125)) {
- interval_ *= 2;
- }
timebase_and_interval_valid_ = true;
// Don't restart the display link for 10 seconds.
diff --git a/chromium/ui/display/mac/display_link_mac.h b/chromium/ui/display/mac/display_link_mac.h
index 8b56dfe6284..6a4d7e23d24 100644
--- a/chromium/ui/display/mac/display_link_mac.h
+++ b/chromium/ui/display/mac/display_link_mac.h
@@ -95,9 +95,6 @@ class DISPLAY_EXPORT DisplayLinkMac
base::TimeTicks recalculate_time_;
std::vector<VSyncUpdatedCallback> vsync_updated_callbacks_;
-
- // TODO(sky): temporary, will remove after doing some analysis.
- const bool force_60hz_;
};
} // namespace ui
diff --git a/chromium/ui/display/manager/BUILD.gn b/chromium/ui/display/manager/BUILD.gn
index da5d0c7be92..72b6e985e7c 100644
--- a/chromium/ui/display/manager/BUILD.gn
+++ b/chromium/ui/display/manager/BUILD.gn
@@ -5,7 +5,7 @@
import("//build/config/chromeos/ui_mode.gni")
import("//build/config/ui.gni")
-assert(is_chromeos_ash || enable_cast_receiver)
+assert(is_chromeos_ash || is_castos || is_cast_android)
component("manager") {
sources = [
diff --git a/chromium/ui/display/manager/configure_displays_task.cc b/chromium/ui/display/manager/configure_displays_task.cc
index 292e721d02c..e7b15dbc50e 100644
--- a/chromium/ui/display/manager/configure_displays_task.cc
+++ b/chromium/ui/display/manager/configure_displays_task.cc
@@ -231,9 +231,11 @@ DisplayConfigureRequest::DisplayConfigureRequest(DisplaySnapshot* display,
ConfigureDisplaysTask::ConfigureDisplaysTask(
NativeDisplayDelegate* delegate,
const std::vector<DisplayConfigureRequest>& requests,
- ResponseCallback callback)
+ ResponseCallback callback,
+ ConfigurationType configuration_type)
: delegate_(delegate),
requests_(requests),
+ configuration_type_(configuration_type),
callback_(std::move(callback)),
task_status_(SUCCESS) {
delegate_->AddObserver(this);
@@ -270,9 +272,13 @@ void ConfigureDisplaysTask::Run() {
is_first_attempt ? &ConfigureDisplaysTask::OnFirstAttemptConfigured
: &ConfigureDisplaysTask::OnRetryConfigured;
+ uint32_t modeset_flags = display::kTestModeset;
+ if (configuration_type_ == kConfigurationTypeSeamless)
+ modeset_flags |= display::kSeamlessModeset;
delegate_->Configure(
config_requests,
- base::BindOnce(on_configured, weak_ptr_factory_.GetWeakPtr()));
+ base::BindOnce(on_configured, weak_ptr_factory_.GetWeakPtr()),
+ modeset_flags);
}
void ConfigureDisplaysTask::OnConfigurationChanged() {}
@@ -303,15 +309,22 @@ void ConfigureDisplaysTask::OnFirstAttemptConfigured(bool config_success) {
}
// This code execute only when the first modeset attempt fully succeeds.
- // Update the displays' status and report success.
- for (const DisplayConfigureRequest& request : requests_) {
- request.display->set_current_mode(request.mode);
- request.display->set_origin(request.origin);
- final_requests_status_.emplace_back(std::make_pair(&request, true));
+ // Submit the current |requests_| for modeset.
+ std::vector<display::DisplayConfigurationParams> config_requests;
+ for (const auto& request : requests_) {
+ final_requests_status_.emplace_back(&request, true);
+
+ config_requests.emplace_back(request.display->display_id(), request.origin,
+ request.mode);
}
- UpdateFinalStatusUma(final_requests_status_);
- std::move(callback_).Run(task_status_);
+ uint32_t modeset_flags = display::kCommitModeset;
+ if (configuration_type_ == kConfigurationTypeSeamless)
+ modeset_flags |= display::kSeamlessModeset;
+ delegate_->Configure(config_requests,
+ base::BindOnce(&ConfigureDisplaysTask::OnConfigured,
+ weak_ptr_factory_.GetWeakPtr()),
+ modeset_flags);
}
void ConfigureDisplaysTask::OnRetryConfigured(bool config_success) {
@@ -333,19 +346,21 @@ void ConfigureDisplaysTask::OnRetryConfigured(bool config_success) {
pair.request->mode = nullptr;
task_status_ = ERROR;
}
+ } else {
+ // This configuration attempt passed test-modeset. Cache it so we can use it
+ // to modeset the displays once we are done testing, or if no other future
+ // attempts succeed.
+ last_successful_config_parameters_.clear();
+ for (const auto& request : requests_) {
+ last_successful_config_parameters_.emplace_back(
+ request.display->display_id(), request.origin, request.mode);
+ }
}
// This code executes only when this display group request fully succeeds or
// fails to modeset. Update the final status of this group.
- for (const auto& pair : pending_display_group_requests_.front()) {
- const DisplayConfigureRequest* request = pair.request;
- final_requests_status_.emplace_back(
- std::make_pair(request, config_success));
- if (config_success) {
- request->display->set_current_mode(request->mode);
- request->display->set_origin(request->origin);
- }
- }
+ for (const auto& pair : pending_display_group_requests_.front())
+ final_requests_status_.emplace_back(pair.request, config_success);
// Subsequent modeset attempts will be done on the next pending display group,
// if one exists.
@@ -358,7 +373,38 @@ void ConfigureDisplaysTask::OnRetryConfigured(bool config_success) {
return;
}
- // No more display groups to retry.
+ if (task_status_ == ERROR) {
+ LOG(WARNING) << "One or more of the connected display groups failed to "
+ "pass test-modeset entirely and will be disabled.";
+
+ if (last_successful_config_parameters_.empty()) {
+ LOG(ERROR) << "Display configuration failed. No modeset was attempted.";
+
+ UpdateFinalStatusUma(final_requests_status_);
+ std::move(callback_).Run(task_status_);
+ return;
+ }
+ }
+
+ // Configure the displays using the last successful configuration parameter
+ // list.
+ uint32_t modeset_flags = display::kCommitModeset;
+ if (configuration_type_ == kConfigurationTypeSeamless)
+ modeset_flags |= display::kSeamlessModeset;
+ delegate_->Configure(last_successful_config_parameters_,
+ base::BindOnce(&ConfigureDisplaysTask::OnConfigured,
+ weak_ptr_factory_.GetWeakPtr()),
+ modeset_flags);
+}
+
+void ConfigureDisplaysTask::OnConfigured(bool config_success) {
+ if (config_success) {
+ for (const DisplayConfigureRequest& request : requests_) {
+ request.display->set_current_mode(request.mode);
+ request.display->set_origin(request.origin);
+ }
+ }
+
UpdateFinalStatusUma(final_requests_status_);
std::move(callback_).Run(task_status_);
}
diff --git a/chromium/ui/display/manager/configure_displays_task.h b/chromium/ui/display/manager/configure_displays_task.h
index 50ebdb9c115..08abd4552d8 100644
--- a/chromium/ui/display/manager/configure_displays_task.h
+++ b/chromium/ui/display/manager/configure_displays_task.h
@@ -14,6 +14,8 @@
#include "base/containers/queue.h"
#include "base/memory/weak_ptr.h"
#include "ui/display/manager/display_manager_export.h"
+#include "ui/display/types/display_configuration_params.h"
+#include "ui/display/types/display_constants.h"
#include "ui/display/types/native_display_observer.h"
#include "ui/gfx/geometry/point.h"
@@ -69,9 +71,11 @@ class DISPLAY_MANAGER_EXPORT ConfigureDisplaysTask
using ResponseCallback = base::OnceCallback<void(Status)>;
- ConfigureDisplaysTask(NativeDisplayDelegate* delegate,
- const std::vector<DisplayConfigureRequest>& requests,
- ResponseCallback callback);
+ ConfigureDisplaysTask(
+ NativeDisplayDelegate* delegate,
+ const std::vector<DisplayConfigureRequest>& requests,
+ ResponseCallback callback,
+ ConfigurationType configuration_type = kConfigurationTypeFull);
ConfigureDisplaysTask(const ConfigureDisplaysTask&) = delete;
ConfigureDisplaysTask& operator=(const ConfigureDisplaysTask&) = delete;
@@ -101,7 +105,7 @@ class DISPLAY_MANAGER_EXPORT ConfigureDisplaysTask
// Upon failure, partitions the original request from Ash into smaller
// requests where the displays are grouped by the physical connector they
// connect to and initiates the retry sequence.
- void OnFirstAttemptConfigured(bool config_status);
+ void OnFirstAttemptConfigured(bool config_success);
// Deals with the aftermath of a configuration retry, which attempts to
// configure a subset of the displays grouped together by the physical
@@ -112,7 +116,11 @@ class DISPLAY_MANAGER_EXPORT ConfigureDisplaysTask
// If any of the display groups entirely fail to modeset (i.e. exhaust all
// available modes during retry), the configuration will fail as a whole, but
// will continue to try to modeset the remaining display groups.
- void OnRetryConfigured(bool config_status);
+ void OnRetryConfigured(bool config_success);
+
+ // Finalizes the configuration after a modeset attempt was made (as opposed to
+ // test-modeset).
+ void OnConfigured(bool config_success);
// Partition |requests_| by their base connector id (i.e. the physical
// connector the displays are connected to) and populate the result in
@@ -130,12 +138,21 @@ class DISPLAY_MANAGER_EXPORT ConfigureDisplaysTask
// Holds the next configuration request to attempt modeset.
std::vector<DisplayConfigureRequest> requests_;
+ // Whether this request should be seamless or not (i.e. should a full modeset
+ // be permitted or not).
+ const ConfigurationType configuration_type_;
+
// A queue of display requests grouped by their
// |requests_[index]->display->base_connector_id()|. These request groups are
// used to downgrade displays' modes stored in |requests_| when the original
// request fails to modeset and a the fallback logic is triggered.
PartitionedRequestsQueue pending_display_group_requests_;
+ // The last configuration parameter request list that passed modeset test
+ // during retry, which will be used for modeset once we are done testing.
+ std::vector<display::DisplayConfigurationParams>
+ last_successful_config_parameters_;
+
// The final requests and their configuration status for UMA.
std::vector<RequestAndStatusList> final_requests_status_;
diff --git a/chromium/ui/display/manager/configure_displays_task_unittest.cc b/chromium/ui/display/manager/configure_displays_task_unittest.cc
index fe9cbb7cafd..aea6e2b94c5 100644
--- a/chromium/ui/display/manager/configure_displays_task_unittest.cc
+++ b/chromium/ui/display/manager/configure_displays_task_unittest.cc
@@ -116,8 +116,15 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureInternalDisplay) {
EXPECT_TRUE(callback_called_);
EXPECT_EQ(ConfigureDisplaysTask::SUCCESS, status_);
- EXPECT_EQ(GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
- displays_[0]->native_mode()}),
+ EXPECT_EQ(JoinActions(kTestModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_.GetActionsAndClear());
}
@@ -137,13 +144,21 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureInternalAndOneExternalDisplays) {
EXPECT_TRUE(callback_called_);
EXPECT_EQ(ConfigureDisplaysTask::SUCCESS, status_);
- EXPECT_EQ(JoinActions(GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ EXPECT_EQ(JoinActions(kTestModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetCrtcAction({displays_[1]->display_id(), gfx::Point(),
+ &big_mode_60hz_})
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetCrtcAction({displays_[1]->display_id(), gfx::Point(),
&big_mode_60hz_})
.c_str(),
- nullptr),
+ kModesetOutcomeSuccess, nullptr),
log_.GetActionsAndClear());
}
@@ -162,8 +177,15 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureOneExternalDisplay) {
EXPECT_TRUE(callback_called_);
EXPECT_EQ(ConfigureDisplaysTask::SUCCESS, status_);
- EXPECT_EQ(GetCrtcAction({displays_[1]->display_id(), gfx::Point(),
- displays_[1]->native_mode()}),
+ EXPECT_EQ(JoinActions(kTestModesetStr,
+ GetCrtcAction({displays_[1]->display_id(), gfx::Point(),
+ displays_[1]->native_mode()})
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcAction({displays_[1]->display_id(), gfx::Point(),
+ displays_[1]->native_mode()})
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_.GetActionsAndClear());
}
@@ -201,13 +223,21 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureTwoMstDisplays) {
EXPECT_TRUE(callback_called_);
EXPECT_EQ(ConfigureDisplaysTask::SUCCESS, status_);
- EXPECT_EQ(JoinActions(GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ EXPECT_EQ(JoinActions(kTestModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ &big_mode_60hz_})
+ .c_str(),
+ GetCrtcAction({displays_[1]->display_id(), gfx::Point(),
+ &big_mode_60hz_})
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
&big_mode_60hz_})
.c_str(),
GetCrtcAction({displays_[1]->display_id(), gfx::Point(),
&big_mode_60hz_})
.c_str(),
- nullptr),
+ kModesetOutcomeSuccess, nullptr),
log_.GetActionsAndClear());
}
@@ -249,7 +279,8 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureInternalAndTwoMstAndHdmiDisplays) {
EXPECT_TRUE(callback_called_);
EXPECT_EQ(ConfigureDisplaysTask::SUCCESS, status_);
- EXPECT_EQ(JoinActions(GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ EXPECT_EQ(JoinActions(kTestModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetCrtcAction({displays_[1]->display_id(), gfx::Point(),
@@ -261,7 +292,20 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureInternalAndTwoMstAndHdmiDisplays) {
GetCrtcAction({displays_[3]->display_id(), gfx::Point(),
&big_mode_60hz_})
.c_str(),
- nullptr),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetCrtcAction({displays_[1]->display_id(), gfx::Point(),
+ &big_mode_60hz_})
+ .c_str(),
+ GetCrtcAction({displays_[2]->display_id(), gfx::Point(),
+ &big_mode_60hz_})
+ .c_str(),
+ GetCrtcAction({displays_[3]->display_id(), gfx::Point(),
+ &big_mode_60hz_})
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_.GetActionsAndClear());
}
@@ -283,13 +327,16 @@ TEST_F(ConfigureDisplaysTaskTest, DisableInternalDisplayFails) {
EXPECT_TRUE(callback_called_);
EXPECT_EQ(ConfigureDisplaysTask::ERROR, status_);
- EXPECT_EQ(JoinActions(
- // Initial modeset fails. Initiate retry logic.
- GetDisableCrtcAction(displays_[0]).c_str(),
- // There is no way to downgrade a disable request. Configuration
- // fails.
- GetDisableCrtcAction(displays_[0]).c_str(), nullptr),
- log_.GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(kTestModesetStr,
+ // Initial test-modeset fails. Initiate retry logic.
+ GetDisableCrtcAction(displays_[0]).c_str(),
+ kModesetOutcomeFailure,
+ // There is no way to downgrade a disable request.
+ // Configuration fails.
+ kTestModesetStr, GetDisableCrtcAction(displays_[0]).c_str(),
+ kModesetOutcomeFailure, nullptr),
+ log_.GetActionsAndClear());
}
// Tests that the internal display does not attempt to fallback to alternative
@@ -309,17 +356,20 @@ TEST_F(ConfigureDisplaysTaskTest, NoModeChangeAttemptWhenInternalDisplayFails) {
EXPECT_TRUE(callback_called_);
EXPECT_EQ(ConfigureDisplaysTask::ERROR, status_);
EXPECT_EQ(JoinActions(
- // Initial modeset fails. Initiate retry logic.
+ kTestModesetStr,
+ // Initial test-modeset fails. Initiate retry logic.
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
+ kModesetOutcomeFailure,
// Retry logic fails to modeset internal display. Since internal
// displays are restricted to their preferred mode, there are no
// other modes to try. The configuration fails completely.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
- nullptr),
+ kModesetOutcomeFailure, nullptr),
log_.GetActionsAndClear());
}
@@ -343,24 +393,30 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureOneExternalNoInternalDisplayFails) {
EXPECT_EQ(ConfigureDisplaysTask::ERROR, status_);
EXPECT_EQ(
JoinActions(
+ kTestModesetStr,
// Initial modeset fails. Initiate retry logic.
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
// External display will fail, downgrade twice, and fail completely.
+ kTestModesetStr,
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_29_97hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &small_mode_30hz_})
.c_str(),
- nullptr),
+ kModesetOutcomeFailure, nullptr),
log_.GetActionsAndClear());
}
@@ -402,6 +458,7 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureTwoNoneMstDisplaysNoInternalFail) {
EXPECT_EQ(ConfigureDisplaysTask::ERROR, status_);
EXPECT_EQ(
JoinActions(
+ kTestModesetStr,
// All displays will fail to modeset together. Initiate retry logic.
GetCrtcAction(
{displays_[0]->display_id(), gfx::Point(), &big_mode_60hz_})
@@ -409,29 +466,41 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureTwoNoneMstDisplaysNoInternalFail) {
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- // We first modeset the |displays_[0] with all other displays
+ kModesetOutcomeFailure,
+ // We first test-modeset |displays_[0] with all other displays
// disabled. It will fail and downgrade once before passing.
+ kTestModesetStr,
GetCrtcAction(
{displays_[0]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- GetDisableCrtcAction(displays_[1]).c_str(),
+ GetDisableCrtcAction(displays_[1]).c_str(), kModesetOutcomeFailure,
+ kTestModesetStr,
GetCrtcAction(
{displays_[0]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
- GetDisableCrtcAction(displays_[1]).c_str(),
+ GetDisableCrtcAction(displays_[1]).c_str(), kModesetOutcomeSuccess,
// |displays_[1]| will fail, downgrade once, and fail completely.
+ kTestModesetStr,
GetCrtcAction(
{displays_[0]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction(
{displays_[0]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &medium_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
+ // We commit the last passing test-modeset configuration.
+ kCommitModesetStr,
+ GetCrtcAction(
+ {displays_[0]->display_id(), gfx::Point(), &small_mode_60hz_})
+ .c_str(),
+ GetDisableCrtcAction(displays_[1]).c_str(), kModesetOutcomeSuccess,
nullptr),
log_.GetActionsAndClear());
}
@@ -477,42 +546,51 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureTwoMstDisplaysNoInternalFail) {
EXPECT_EQ(
JoinActions(
// All displays will fail to modeset together. Initiate retry logic.
+ kTestModesetStr,
GetCrtcAction(
{displays_[0]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
// MST displays will be tested (and fail) together.
+ kTestModesetStr,
GetCrtcAction(
{displays_[0]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
// |displays_[0]| will downgrade first. Configuration will fail.
+ kTestModesetStr,
GetCrtcAction(
{displays_[0]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
// |displays_[1] will downgrade next. Configuration still fails.
+ kTestModesetStr,
GetCrtcAction(
{displays_[0]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &medium_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
// Since |displays_[1]| is still the largest and has one more mode, it
// downgrades again. Configuration fails completely.
+ kTestModesetStr,
GetCrtcAction(
{displays_[0]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
- nullptr),
+ kModesetOutcomeFailure, nullptr),
log_.GetActionsAndClear());
}
@@ -540,39 +618,45 @@ TEST_F(ConfigureDisplaysTaskTest,
EXPECT_EQ(
JoinActions(
// All displays will fail to modeset together. Initiate retry logic.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
// We first attempt to modeset the internal display with all other
// displays disabled, which will fail.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
- GetDisableCrtcAction(displays_[1]).c_str(),
+ GetDisableCrtcAction(displays_[1]).c_str(), kModesetOutcomeFailure,
// Since internal displays are restricted to their preferred mode,
// there are no other modes to try. Disable the internal display so we
// can attempt to modeset displays that are connected to other
// connectors. Next, the external display will attempt to modeset.
- GetDisableCrtcAction(displays_[0]).c_str(),
+ kTestModesetStr, GetDisableCrtcAction(displays_[0]).c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetDisableCrtcAction(displays_[0]).c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_29_97hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetDisableCrtcAction(displays_[0]).c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetDisableCrtcAction(displays_[0]).c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &small_mode_30hz_})
.c_str(),
- nullptr),
+ kModesetOutcomeFailure, nullptr),
log_.GetActionsAndClear());
}
@@ -616,31 +700,43 @@ TEST_F(ConfigureDisplaysTaskTest,
EXPECT_EQ(
JoinActions(
// All displays will fail to modeset together. Initiate retry logic.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- // We first attempt to modeset the internal display with all other
- // displays disabled, which will succeed.
+ kModesetOutcomeFailure,
+ // We first test-modeset the internal display with all other displays
+ // disabled, which will succeed.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
- GetDisableCrtcAction(displays_[1]).c_str(),
+ GetDisableCrtcAction(displays_[1]).c_str(), kModesetOutcomeSuccess,
// External display fails, downgrades once, and fails completely.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &medium_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
+ // We commit the last passing test-modeset configuration.
+ kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetDisableCrtcAction(displays_[1]).c_str(), kModesetOutcomeSuccess,
nullptr),
log_.GetActionsAndClear());
}
@@ -678,6 +774,7 @@ TEST_F(ConfigureDisplaysTaskTest,
EXPECT_EQ(
JoinActions(
// All displays will fail to modeset together. Initiate retry logic.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -687,25 +784,28 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
// We first attempt to modeset the internal display with all other
// displays disabled, which will fail.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetDisableCrtcAction(displays_[1]).c_str(),
- GetDisableCrtcAction(displays_[2]).c_str(),
+ GetDisableCrtcAction(displays_[2]).c_str(), kModesetOutcomeFailure,
// Since internal displays are restricted to their preferred mode,
// there are no other modes to try. Disable the internal display so we
// can attempt to modeset displays that are connected to other
// connectors. Next, modeset the external displays which are connected
// to the same port via MST.
- GetDisableCrtcAction(displays_[0]).c_str(),
+ kTestModesetStr, GetDisableCrtcAction(displays_[0]).c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
// |displays_[1] & displays_[2] will cycle through all available
// modes, but configuration will eventually completely fail.
GetDisableCrtcAction(displays_[0]).c_str(),
@@ -715,6 +815,7 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetDisableCrtcAction(displays_[0]).c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_29_97hz_})
@@ -722,6 +823,7 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetDisableCrtcAction(displays_[0]).c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &small_mode_60hz_})
@@ -729,6 +831,7 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetDisableCrtcAction(displays_[0]).c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &small_mode_30hz_})
@@ -736,7 +839,7 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
- nullptr),
+ kModesetOutcomeFailure, nullptr),
log_.GetActionsAndClear());
}
@@ -788,6 +891,7 @@ TEST_F(ConfigureDisplaysTaskTest,
EXPECT_EQ(
JoinActions(
// All displays will fail to modeset together. Initiate retry logic.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -797,15 +901,18 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- // We first attempt to modeset the internal display with all other
- // displays disabled, which will succeed.
+ kModesetOutcomeFailure,
+ // We first test-modeset the internal display with all other displays
+ // disabled, which will succeed.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetDisableCrtcAction(displays_[1]).c_str(),
- GetDisableCrtcAction(displays_[2]).c_str(),
- // Next, MST displays will attempt to modeset, downgrade, and
- // eventually fail completely.
+ GetDisableCrtcAction(displays_[2]).c_str(), kModesetOutcomeSuccess,
+ // Next, MST displays will test-modeset, downgrade, and eventually
+ // fail completely.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -815,6 +922,7 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -824,6 +932,7 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -833,6 +942,14 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &medium_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
+ // We commit the last successful test-modeset configuration.
+ kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetDisableCrtcAction(displays_[1]).c_str(),
+ GetDisableCrtcAction(displays_[2]).c_str(), kModesetOutcomeSuccess,
nullptr),
log_.GetActionsAndClear());
}
@@ -884,6 +1001,7 @@ TEST_F(ConfigureDisplaysTaskTest,
EXPECT_EQ(
JoinActions(
// All displays will fail to modeset together. Initiate retry logic.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -896,98 +1014,105 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
// We first attempt to modeset the internal display with all other
// displays disabled, which will fail.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetDisableCrtcAction(displays_[1]).c_str(),
GetDisableCrtcAction(displays_[2]).c_str(),
- GetDisableCrtcAction(displays_[3]).c_str(),
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeFailure,
// Since internal displays are restricted to their preferred mode,
// there are no other modes to try. Disable the internal display so we
// can attempt to modeset displays that are connected to other
// connectors. Next, the two displays connected via MST will attempt
// to modeset and fail.
- GetDisableCrtcAction(displays_[0]).c_str(),
+ kTestModesetStr, GetDisableCrtcAction(displays_[0]).c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- GetDisableCrtcAction(displays_[3]).c_str(),
- GetDisableCrtcAction(displays_[0]).c_str(),
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeFailure,
+ kTestModesetStr, GetDisableCrtcAction(displays_[0]).c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_29_97hz_})
.c_str(),
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- GetDisableCrtcAction(displays_[3]).c_str(),
- GetDisableCrtcAction(displays_[0]).c_str(),
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeFailure,
+ kTestModesetStr, GetDisableCrtcAction(displays_[0]).c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_29_97hz_})
.c_str(),
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
- GetDisableCrtcAction(displays_[3]).c_str(),
- GetDisableCrtcAction(displays_[0]).c_str(),
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeFailure,
+ kTestModesetStr, GetDisableCrtcAction(displays_[0]).c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
- GetDisableCrtcAction(displays_[3]).c_str(),
- GetDisableCrtcAction(displays_[0]).c_str(),
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeFailure,
+ kTestModesetStr, GetDisableCrtcAction(displays_[0]).c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &small_mode_30hz_})
.c_str(),
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
- GetDisableCrtcAction(displays_[3]).c_str(),
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeFailure,
// Next, the HDMI display will attempt to modeset and cycle through
// its six available modes.
- GetDisableCrtcAction(displays_[0]).c_str(),
+ kTestModesetStr, GetDisableCrtcAction(displays_[0]).c_str(),
GetDisableCrtcAction(displays_[1]).c_str(),
GetDisableCrtcAction(displays_[2]).c_str(),
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetDisableCrtcAction(displays_[0]).c_str(),
GetDisableCrtcAction(displays_[1]).c_str(),
GetDisableCrtcAction(displays_[2]).c_str(),
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &big_mode_29_97hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetDisableCrtcAction(displays_[0]).c_str(),
GetDisableCrtcAction(displays_[1]).c_str(),
GetDisableCrtcAction(displays_[2]).c_str(),
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &medium_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetDisableCrtcAction(displays_[0]).c_str(),
GetDisableCrtcAction(displays_[1]).c_str(),
GetDisableCrtcAction(displays_[2]).c_str(),
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &medium_mode_29_98hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetDisableCrtcAction(displays_[0]).c_str(),
GetDisableCrtcAction(displays_[1]).c_str(),
GetDisableCrtcAction(displays_[2]).c_str(),
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetDisableCrtcAction(displays_[0]).c_str(),
GetDisableCrtcAction(displays_[1]).c_str(),
GetDisableCrtcAction(displays_[2]).c_str(),
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &small_mode_30hz_})
.c_str(),
- nullptr),
+ kModesetOutcomeFailure, nullptr),
log_.GetActionsAndClear());
}
@@ -1037,6 +1162,7 @@ TEST_F(ConfigureDisplaysTaskTest,
EXPECT_EQ(
JoinActions(
// All displays will fail to modeset together. Initiate retry logic.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1049,16 +1175,19 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- // We first attempt to modeset the internal display with all other
- // displays disabled, which will pass.
+ kModesetOutcomeFailure,
+ // We first test-modeset the internal display with all other displays
+ // disabled, which will pass.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetDisableCrtcAction(displays_[1]).c_str(),
GetDisableCrtcAction(displays_[2]).c_str(),
- GetDisableCrtcAction(displays_[3]).c_str(),
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeSuccess,
// MST displays will be tested next with the HDMI display disabled.
// They will fail.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1068,7 +1197,8 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- GetDisableCrtcAction(displays_[3]).c_str(),
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeFailure,
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1078,7 +1208,8 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- GetDisableCrtcAction(displays_[3]).c_str(),
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeFailure,
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1088,7 +1219,8 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- GetDisableCrtcAction(displays_[3]).c_str(),
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeFailure,
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1098,9 +1230,10 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- GetDisableCrtcAction(displays_[3]).c_str(),
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeFailure,
// HDMI display attempts to modeset, fails, downgrades twice, and
// passes modeset.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1109,6 +1242,7 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1117,6 +1251,7 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &big_mode_29_97hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1125,7 +1260,19 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &medium_mode_60hz_})
.c_str(),
- nullptr),
+ kModesetOutcomeSuccess,
+ // We commit the last successful test-modeset configuration, which
+ // enables the internal display together with the HDMI display.
+ kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetDisableCrtcAction(displays_[1]).c_str(),
+ GetDisableCrtcAction(displays_[2]).c_str(),
+ GetCrtcAction(
+ {displays_[3]->display_id(), gfx::Point(), &medium_mode_60hz_})
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_.GetActionsAndClear());
}
@@ -1177,6 +1324,7 @@ TEST_F(ConfigureDisplaysTaskTest,
EXPECT_EQ(
JoinActions(
// All displays will fail to modeset together. Initiate retry logic.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1189,15 +1337,18 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- // We first attempt to modeset the internal display with all other
- // displays disabled, which will succeed.
+ kModesetOutcomeFailure,
+ // We first test-modeset the internal display with all other displays
+ // disabled, which will succeed.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetDisableCrtcAction(displays_[1]).c_str(),
GetDisableCrtcAction(displays_[2]).c_str(),
- GetDisableCrtcAction(displays_[3]).c_str(),
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeSuccess,
// MST displays will be tested and pass together.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1207,9 +1358,10 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &medium_mode_60hz_})
.c_str(),
- GetDisableCrtcAction(displays_[3]).c_str(),
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeSuccess,
// HDMI display will fail modeset, but since there are no other modes
// available for fallback configuration fails completely.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1222,6 +1374,20 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
+ // We commit the last successful test-modeset configuration, which
+ // enables the internal display together with the two MST displays.
+ kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetCrtcAction(
+ {displays_[1]->display_id(), gfx::Point(), &medium_mode_60hz_})
+ .c_str(),
+ GetCrtcAction(
+ {displays_[2]->display_id(), gfx::Point(), &medium_mode_60hz_})
+ .c_str(),
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeSuccess,
nullptr),
log_.GetActionsAndClear());
}
@@ -1267,6 +1433,7 @@ TEST_F(ConfigureDisplaysTaskTest,
EXPECT_EQ(
JoinActions(
// All displays will fail to modeset together. Initiate retry logic.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1276,16 +1443,19 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- // We first attempt to modeset the internal display with all other
- // displays disabled, which will succeed.
+ kModesetOutcomeFailure,
+ // We first test-modeset the internal display with all other displays
+ // disabled, which will succeed.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetDisableCrtcAction(displays_[1]).c_str(),
- GetDisableCrtcAction(displays_[2]).c_str(),
+ GetDisableCrtcAction(displays_[2]).c_str(), kModesetOutcomeSuccess,
// displays_[1] and displays_[2] will be tested and fail together
// under connector kInvalidConnectorId. Since neither expose any
// alternative modes to try, configuration completely fails.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1295,6 +1465,15 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
+ // We commit the last successful test-modeset configuration, which
+ // only enables the internal display.
+ kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetDisableCrtcAction(displays_[1]).c_str(),
+ GetDisableCrtcAction(displays_[2]).c_str(), kModesetOutcomeSuccess,
nullptr),
log_.GetActionsAndClear());
}
@@ -1360,6 +1539,7 @@ TEST_F(ConfigureDisplaysTaskTest,
EXPECT_EQ(
JoinActions(
// All displays will fail to modeset together. Initiate retry logic.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1375,17 +1555,20 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[4]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- // We first attempt to modeset the internal display with all other
- // displays disabled, which will succeed.
+ kModesetOutcomeFailure,
+ // We first test-modeset the internal display with all other displays
+ // disabled, which will succeed.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetDisableCrtcAction(displays_[1]).c_str(),
GetDisableCrtcAction(displays_[2]).c_str(),
GetDisableCrtcAction(displays_[3]).c_str(),
- GetDisableCrtcAction(displays_[4]).c_str(),
+ GetDisableCrtcAction(displays_[4]).c_str(), kModesetOutcomeSuccess,
// displays_[1-4] will be tested and downgraded as a group, since they
// share kInvalidConnectorId due to bad MST hubs.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1401,8 +1584,10 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[4]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
// displays_[2] will downgrade first, since it is the next largest
// display with available alternative modes.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1418,7 +1603,9 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[4]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
// displays_[3] will downgrade next, and fail.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1434,8 +1621,10 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[4]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
// Same downgrade process as above will repeat for displays_[2] and
// displays_[3] before failing completely.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1451,6 +1640,7 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[4]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1466,6 +1656,17 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[4]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
+ // We commit the last successful test-modeset configuration, which
+ // only enables the internal display.
+ kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetDisableCrtcAction(displays_[1]).c_str(),
+ GetDisableCrtcAction(displays_[2]).c_str(),
+ GetDisableCrtcAction(displays_[3]).c_str(),
+ GetDisableCrtcAction(displays_[4]).c_str(), kModesetOutcomeSuccess,
nullptr),
log_.GetActionsAndClear());
}
@@ -1495,38 +1696,53 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureLastDisplayPartialSuccess) {
EXPECT_EQ(
JoinActions(
// All displays will fail to modeset together. Initiate retry logic.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
// We first attempt to modeset the internal display with all other
// displays disabled, which will succeed.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
- GetDisableCrtcAction(displays_[1]).c_str(),
+ GetDisableCrtcAction(displays_[1]).c_str(), kModesetOutcomeSuccess,
// Last display will fail, downgrade twice, and pass.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_29_97hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
- nullptr),
+ kModesetOutcomeSuccess,
+ // Commit the last successful test-modeset configuration.
+ kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetCrtcAction(
+ {displays_[1]->display_id(), gfx::Point(), &small_mode_60hz_})
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_.GetActionsAndClear());
}
@@ -1559,6 +1775,7 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureMiddleDisplayPartialSuccess) {
EXPECT_EQ(
JoinActions(
// All displays will fail to modeset together. Initiate retry logic.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1568,36 +1785,42 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureMiddleDisplayPartialSuccess) {
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
- // We first attempt to modeset the internal display with all other
- // displays disabled, which will succeed.
+ kModesetOutcomeFailure,
+ // We first test-modeset the internal display with all other displays
+ // disabled, which will succeed.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetDisableCrtcAction(displays_[1]).c_str(),
- GetDisableCrtcAction(displays_[2]).c_str(),
+ GetDisableCrtcAction(displays_[2]).c_str(), kModesetOutcomeSuccess,
// Second display will downgrade twice and pass.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- GetDisableCrtcAction(displays_[2]).c_str(),
+ GetDisableCrtcAction(displays_[2]).c_str(), kModesetOutcomeFailure,
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &big_mode_29_97hz_})
.c_str(),
- GetDisableCrtcAction(displays_[2]).c_str(),
+ GetDisableCrtcAction(displays_[2]).c_str(), kModesetOutcomeFailure,
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetCrtcAction(
{displays_[1]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
- GetDisableCrtcAction(displays_[2]).c_str(),
+ GetDisableCrtcAction(displays_[2]).c_str(), kModesetOutcomeSuccess,
// Third external display will succeed to modeset on first attempt.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1607,7 +1830,19 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureMiddleDisplayPartialSuccess) {
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
- nullptr),
+ kModesetOutcomeSuccess,
+ // Commit the last successful test-modeset configuration.
+ kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetCrtcAction(
+ {displays_[1]->display_id(), gfx::Point(), &small_mode_60hz_})
+ .c_str(),
+ GetCrtcAction(
+ {displays_[2]->display_id(), gfx::Point(), &small_mode_60hz_})
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_.GetActionsAndClear());
}
@@ -1643,6 +1878,7 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureTwoMstDisplaysPartialSuccess) {
EXPECT_EQ(
JoinActions(
// All displays will fail to modeset together. Initiate retry logic.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1652,14 +1888,17 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureTwoMstDisplaysPartialSuccess) {
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- // We first attempt to modeset the internal display with all other
+ kModesetOutcomeFailure,
+ // We first test-modeset the internal display with all other
// displays disabled, which will succeed.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetDisableCrtcAction(displays_[1]).c_str(),
- GetDisableCrtcAction(displays_[2]).c_str(),
+ GetDisableCrtcAction(displays_[2]).c_str(), kModesetOutcomeSuccess,
// MST displays will be tested (and fail) together.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1669,7 +1908,9 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureTwoMstDisplaysPartialSuccess) {
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
// |displays_[1]| will downgrade first. Configuration will fail.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1679,7 +1920,9 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureTwoMstDisplaysPartialSuccess) {
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
// |displays_[2] will downgrade next. Configuration will fail.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1689,7 +1932,9 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureTwoMstDisplaysPartialSuccess) {
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
- // |displays_[1]| will downgrade again. Configuration succeeds.
+ kModesetOutcomeFailure,
+ // |displays_[1]| will downgrade again and pass test-modeset.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1699,7 +1944,19 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureTwoMstDisplaysPartialSuccess) {
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
- nullptr),
+ kModesetOutcomeSuccess,
+ // Commit the last successful test-modeset configuration.
+ kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetCrtcAction(
+ {displays_[1]->display_id(), gfx::Point(), &small_mode_60hz_})
+ .c_str(),
+ GetCrtcAction(
+ {displays_[2]->display_id(), gfx::Point(), &small_mode_60hz_})
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_.GetActionsAndClear());
}
@@ -1747,6 +2004,7 @@ TEST_F(ConfigureDisplaysTaskTest,
EXPECT_EQ(
JoinActions(
// All displays will fail to modeset together. Initiate retry logic.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1759,15 +2017,18 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- // We first attempt to modeset the internal display with all other
- // displays disabled, which will succeed.
+ kModesetOutcomeFailure,
+ // We first test-modeset the internal display with all other displays
+ // disabled, which will succeed.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetDisableCrtcAction(displays_[1]).c_str(),
GetDisableCrtcAction(displays_[2]).c_str(),
- GetDisableCrtcAction(displays_[3]).c_str(),
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeSuccess,
// Both MST displays will be tested (and fail) together.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1777,8 +2038,9 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- GetDisableCrtcAction(displays_[3]).c_str(),
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeFailure,
// |displays_[1]| will downgrade first. Configuration will fail.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1788,8 +2050,9 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- GetDisableCrtcAction(displays_[3]).c_str(),
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeFailure,
// |displays_[2] will downgrade next. Configuration still fails.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1799,8 +2062,9 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
- GetDisableCrtcAction(displays_[3]).c_str(),
- // |displays_[1]| will downgrade again. Configuration succeeds.
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeFailure,
+ // |displays_[1]| will downgrade again and pass test-modeset.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1810,9 +2074,9 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[2]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
- GetDisableCrtcAction(displays_[3]).c_str(),
- // HDMI display will fail modeset and downgrade once. Configuration
- // will then succeed.
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeSuccess,
+ // HDMI display will fail test-modeset, downgrade once and pass.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1825,6 +2089,7 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1837,7 +2102,22 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &medium_mode_60hz_})
.c_str(),
- nullptr),
+ kModesetOutcomeSuccess,
+ // Commit the last successful test-modeset configuration.
+ kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetCrtcAction(
+ {displays_[1]->display_id(), gfx::Point(), &small_mode_60hz_})
+ .c_str(),
+ GetCrtcAction(
+ {displays_[2]->display_id(), gfx::Point(), &small_mode_60hz_})
+ .c_str(),
+ GetCrtcAction(
+ {displays_[3]->display_id(), gfx::Point(), &medium_mode_60hz_})
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_.GetActionsAndClear());
}
@@ -1876,7 +2156,8 @@ TEST_F(ConfigureDisplaysTaskTest,
EXPECT_TRUE(callback_called_);
EXPECT_EQ(ConfigureDisplaysTask::SUCCESS, status_);
EXPECT_EQ(
- JoinActions(GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ JoinActions(kTestModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetCrtcAction({displays_[1]->display_id(), gfx::Point(),
@@ -1885,7 +2166,17 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction({displays_[2]->display_id(), gfx::Point(),
&big_mode_60hz_})
.c_str(),
- nullptr),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetCrtcAction({displays_[1]->display_id(), gfx::Point(),
+ &big_mode_60hz_})
+ .c_str(),
+ GetCrtcAction({displays_[2]->display_id(), gfx::Point(),
+ &big_mode_60hz_})
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_.GetActionsAndClear());
}
@@ -1925,6 +2216,7 @@ TEST_F(ConfigureDisplaysTaskTest,
EXPECT_EQ(
JoinActions(
// All displays will fail to modeset together. Initiate retry logic.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1937,15 +2229,18 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
- // We first attempt to modeset the internal display with all other
+ kModesetOutcomeFailure,
+ // We first test-modeset the internal display with all other
// displays disabled, which will succeed.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
GetDisableCrtcAction(displays_[1]).c_str(),
GetDisableCrtcAction(displays_[2]).c_str(),
- GetDisableCrtcAction(displays_[3]).c_str(),
- // All MST displays will fail modeset together.
+ GetDisableCrtcAction(displays_[3]).c_str(), kModesetOutcomeSuccess,
+ // All MST displays will fail test-modeset together.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1958,9 +2253,11 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
// displays_[1] will downgrade first, then displays_[2], followed by
// displays_[3], and finally displays_[1] will downgrade one last
- // time. Then the configuration will pass modeset.
+ // time. Then the configuration will pass test-modeset.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1973,6 +2270,7 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1985,6 +2283,7 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -1997,6 +2296,7 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
displays_[0]->native_mode()})
.c_str(),
@@ -2009,7 +2309,22 @@ TEST_F(ConfigureDisplaysTaskTest,
GetCrtcAction(
{displays_[3]->display_id(), gfx::Point(), &small_mode_60hz_})
.c_str(),
- nullptr),
+ kModesetOutcomeSuccess,
+ // Commit the last successful test-modeset configuration.
+ kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetCrtcAction(
+ {displays_[1]->display_id(), gfx::Point(), &small_mode_60hz_})
+ .c_str(),
+ GetCrtcAction(
+ {displays_[2]->display_id(), gfx::Point(), &small_mode_60hz_})
+ .c_str(),
+ GetCrtcAction(
+ {displays_[3]->display_id(), gfx::Point(), &small_mode_60hz_})
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_.GetActionsAndClear());
}
}
@@ -2036,41 +2351,57 @@ TEST_F(ConfigureDisplaysTaskTest, AsyncConfigureWithTwoDisplaysPartialSuccess) {
EXPECT_TRUE(callback_called_);
EXPECT_EQ(ConfigureDisplaysTask::PARTIAL_SUCCESS, status_);
- EXPECT_EQ(JoinActions(
- // All displays will fail to modeset together.
- GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
- displays_[0]->native_mode()})
- .c_str(),
- GetCrtcAction(
- {displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
- .c_str(),
- // We first attempt to modeset the internal display with all
- // other displays disabled, which will succeed.
- GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
- displays_[0]->native_mode()})
- .c_str(),
- GetDisableCrtcAction(displays_[1]).c_str(),
- // External display will fail twice, downgrade, and pass.
- GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
- displays_[0]->native_mode()})
- .c_str(),
- GetCrtcAction(
- {displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
- .c_str(),
- GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
- displays_[0]->native_mode()})
- .c_str(),
- GetCrtcAction({displays_[1]->display_id(), gfx::Point(),
- &big_mode_29_97hz_})
- .c_str(),
- GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
- displays_[0]->native_mode()})
- .c_str(),
- GetCrtcAction({displays_[1]->display_id(), gfx::Point(),
- &small_mode_60hz_})
- .c_str(),
- nullptr),
- log_.GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(
+ // All displays will fail to modeset together.
+ kTestModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetCrtcAction(
+ {displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
+ .c_str(),
+ kModesetOutcomeFailure,
+ // We first test-modeset the internal display with all other
+ // displays disabled, which will succeed.
+ kTestModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetDisableCrtcAction(displays_[1]).c_str(), kModesetOutcomeSuccess,
+ // External display will fail twice, downgrade, and pass.
+ kTestModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetCrtcAction(
+ {displays_[1]->display_id(), gfx::Point(), &big_mode_60hz_})
+ .c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetCrtcAction(
+ {displays_[1]->display_id(), gfx::Point(), &big_mode_29_97hz_})
+ .c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetCrtcAction(
+ {displays_[1]->display_id(), gfx::Point(), &small_mode_60hz_})
+ .c_str(),
+ kModesetOutcomeSuccess,
+ // Commit the last successful test-modeset configuration.
+ kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ displays_[0]->native_mode()})
+ .c_str(),
+ GetCrtcAction(
+ {displays_[1]->display_id(), gfx::Point(), &small_mode_60hz_})
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_.GetActionsAndClear());
}
// Tests requiring a resources cleanup for an internal display to succeed after
@@ -2148,14 +2479,23 @@ TEST_F(ConfigureDisplaysTaskTest, CloseLidThenOpenLid) {
ConfigureDisplaysTask close_lid(&delegate_, requests, std::move(callback));
close_lid.Run();
EXPECT_EQ(ConfigureDisplaysTask::SUCCESS, status_);
- EXPECT_EQ(JoinActions(GetDisableCrtcAction(internal_display).c_str(),
+ EXPECT_EQ(JoinActions(kTestModesetStr,
+ GetDisableCrtcAction(internal_display).c_str(),
+ GetCrtcAction({external_display1->display_id(),
+ gfx::Point(), &big_mode_60hz_})
+ .c_str(),
+ GetCrtcAction({external_display2->display_id(),
+ gfx::Point(), &big_mode_60hz_})
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetDisableCrtcAction(internal_display).c_str(),
GetCrtcAction({external_display1->display_id(),
gfx::Point(), &big_mode_60hz_})
.c_str(),
GetCrtcAction({external_display2->display_id(),
gfx::Point(), &big_mode_60hz_})
.c_str(),
- nullptr),
+ kModesetOutcomeSuccess, nullptr),
log_.GetActionsAndClear());
// Simulate opening the lid as the 2 external displays are already running at
@@ -2174,6 +2514,7 @@ TEST_F(ConfigureDisplaysTaskTest, CloseLidThenOpenLid) {
ASSERT_EQ(ConfigureDisplaysTask::PARTIAL_SUCCESS, status_);
EXPECT_EQ(JoinActions(
// Attempt to turn everything on with the highest mode.
+ kTestModesetStr,
GetCrtcAction({internal_display->display_id(), gfx::Point(),
&big_mode_60hz_})
.c_str(),
@@ -2183,14 +2524,18 @@ TEST_F(ConfigureDisplaysTaskTest, CloseLidThenOpenLid) {
GetCrtcAction({external_display2->display_id(), gfx::Point(),
&big_mode_60hz_})
.c_str(),
- // We first attempt to modeset the internal display with all
- // other displays disabled, which will succeed.
+ kModesetOutcomeFailure,
+ // We first test-modeset the internal display with all other
+ // displays disabled, which will succeed.
+ kTestModesetStr,
GetCrtcAction({internal_display->display_id(), gfx::Point(),
&big_mode_60hz_})
.c_str(),
GetDisableCrtcAction(external_display1).c_str(),
GetDisableCrtcAction(external_display2).c_str(),
+ kModesetOutcomeSuccess,
// External displays will attempt to be turned on at big mode.
+ kTestModesetStr,
GetCrtcAction({internal_display->display_id(), gfx::Point(),
&big_mode_60hz_})
.c_str(),
@@ -2200,7 +2545,9 @@ TEST_F(ConfigureDisplaysTaskTest, CloseLidThenOpenLid) {
GetCrtcAction({external_display2->display_id(), gfx::Point(),
&big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure,
// Fallback until success as small mode.
+ kTestModesetStr,
GetCrtcAction({internal_display->display_id(), gfx::Point(),
&big_mode_60hz_})
.c_str(),
@@ -2210,6 +2557,19 @@ TEST_F(ConfigureDisplaysTaskTest, CloseLidThenOpenLid) {
GetCrtcAction({external_display2->display_id(), gfx::Point(),
&big_mode_60hz_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
+ GetCrtcAction({internal_display->display_id(), gfx::Point(),
+ &big_mode_60hz_})
+ .c_str(),
+ GetCrtcAction({external_display1->display_id(), gfx::Point(),
+ &small_mode_60hz_})
+ .c_str(),
+ GetCrtcAction({external_display2->display_id(), gfx::Point(),
+ &small_mode_60hz_})
+ .c_str(),
+ kModesetOutcomeSuccess,
+ // Commit the last successful test-modeset configuration.
+ kCommitModesetStr,
GetCrtcAction({internal_display->display_id(), gfx::Point(),
&big_mode_60hz_})
.c_str(),
@@ -2219,7 +2579,7 @@ TEST_F(ConfigureDisplaysTaskTest, CloseLidThenOpenLid) {
GetCrtcAction({external_display2->display_id(), gfx::Point(),
&small_mode_60hz_})
.c_str(),
- nullptr),
+ kModesetOutcomeSuccess, nullptr),
log_.GetActionsAndClear());
}
diff --git a/chromium/ui/display/manager/content_protection_manager.h b/chromium/ui/display/manager/content_protection_manager.h
index a4ecc947ed4..f8f7b643531 100644
--- a/chromium/ui/display/manager/content_protection_manager.h
+++ b/chromium/ui/display/manager/content_protection_manager.h
@@ -11,6 +11,7 @@
#include "base/callback.h"
#include "base/containers/flat_map.h"
#include "base/containers/queue.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/timer/timer.h"
@@ -172,8 +173,9 @@ class DISPLAY_MANAGER_EXPORT ContentProtectionManager
void QueueContentProtectionTask(ApplyContentProtectionCallback callback,
ClientId client_id);
- DisplayLayoutManager* const layout_manager_; // Not owned.
- NativeDisplayDelegate* native_display_delegate_ = nullptr; // Not owned.
+ const raw_ptr<DisplayLayoutManager> layout_manager_; // Not owned.
+ raw_ptr<NativeDisplayDelegate> native_display_delegate_ =
+ nullptr; // Not owned.
const ConfigurationDisabledCallback config_disabled_callback_;
diff --git a/chromium/ui/display/manager/display_change_observer.cc b/chromium/ui/display/manager/display_change_observer.cc
index 11c6642b70c..344b2a7016e 100644
--- a/chromium/ui/display/manager/display_change_observer.cc
+++ b/chromium/ui/display/manager/display_change_observer.cc
@@ -37,6 +37,9 @@
namespace display {
namespace {
+// TODO(crbug/1262970): Delete when we can read radius from command line.
+const float kRoundedDisplayRadius = 16.0;
+
// The DPI threshold to determine the device scale factor.
// DPI higher than |dpi| will use |device_scale_factor|.
struct DeviceScaleFactorDPIThreshold {
@@ -342,6 +345,7 @@ ManagedDisplayInfo DisplayChangeObserver::CreateManagedDisplayInfo(
new_info.set_display_color_spaces(
CreateDisplayColorSpaces(snapshot->color_space(), allow_high_bit_depth,
snapshot->hdr_static_metadata()));
+ new_info.SetSnapshotColorSpace(snapshot->color_space());
constexpr int32_t kNormalBitDepth = 8;
new_info.set_bits_per_channel(
allow_high_bit_depth ? snapshot->bits_per_channel() : kNormalBitDepth);
@@ -357,6 +361,12 @@ ManagedDisplayInfo DisplayChangeObserver::CreateManagedDisplayInfo(
new_info.SetManagedDisplayModes(display_modes);
new_info.set_maximum_cursor_size(snapshot->maximum_cursor_size());
+ // Temporary adding rounded corners to the internal display info.
+ if (display::features::IsRoundedDisplayEnabled() &&
+ snapshot->type() == DISPLAY_CONNECTION_TYPE_INTERNAL) {
+ new_info.set_rounded_corners_radii(
+ gfx::RoundedCornersF(kRoundedDisplayRadius));
+ }
return new_info;
}
diff --git a/chromium/ui/display/manager/display_configurator.cc b/chromium/ui/display/manager/display_configurator.cc
index 483aac84907..76e8df0f4a3 100644
--- a/chromium/ui/display/manager/display_configurator.cc
+++ b/chromium/ui/display/manager/display_configurator.cc
@@ -127,6 +127,7 @@ class DisplayConfigurator::DisplayLayoutManagerImpl
const std::vector<DisplaySnapshot*>& displays,
MultipleDisplayState new_display_state,
chromeos::DisplayPowerState new_power_state,
+ RefreshRateThrottleState new_throttle_state,
std::vector<DisplayConfigureRequest>* requests) const override;
DisplayStateList GetDisplayStates() const override;
bool IsMirroring() const override;
@@ -251,6 +252,7 @@ bool DisplayConfigurator::DisplayLayoutManagerImpl::GetDisplayLayout(
const std::vector<DisplaySnapshot*>& displays,
MultipleDisplayState new_display_state,
chromeos::DisplayPowerState new_power_state,
+ RefreshRateThrottleState new_throttle_state,
std::vector<DisplayConfigureRequest>* requests) const {
std::vector<DisplayState> states = ParseDisplays(displays);
std::vector<bool> display_power;
@@ -375,6 +377,24 @@ bool DisplayConfigurator::DisplayLayoutManagerImpl::GetDisplayLayout(
break;
}
}
+
+ // DisplayConfigureRequest for internal displays should already be configured
+ // to request their native modes, which should be the highest refresh rate.
+ if (new_throttle_state == kRefreshRateThrottleEnabled) {
+ for (DisplayConfigureRequest& request : *requests) {
+ if (request.display->type() != DISPLAY_CONNECTION_TYPE_INTERNAL)
+ continue;
+
+ std::vector<const DisplayMode*> modes =
+ GetSeamlessRefreshRateModes(*request.display, *request.mode);
+ if (modes.size() < 2)
+ break;
+
+ DCHECK_GT(request.mode->refresh_rate(), (*modes.begin())->refresh_rate());
+ request.mode = (*modes.begin());
+ }
+ }
+
DCHECK(new_display_state == MULTIPLE_DISPLAY_STATE_HEADLESS ||
!size.IsEmpty());
return true;
@@ -554,8 +574,8 @@ const DisplayMode* DisplayConfigurator::FindDisplayModeMatchingSize(
}
DisplayConfigurator::DisplayConfigurator()
- : state_controller_(NULL),
- mirroring_controller_(NULL),
+ : state_controller_(nullptr),
+ mirroring_controller_(nullptr),
is_panel_fitting_enabled_(false),
configure_display_(chromeos::IsRunningAsSystemCompositor()),
current_display_state_(MULTIPLE_DISPLAY_STATE_INVALID),
@@ -744,7 +764,8 @@ void DisplayConfigurator::ForceInitialConfigure() {
configuration_task_ = std::make_unique<UpdateDisplayConfigurationTask>(
native_display_delegate_.get(), layout_manager_.get(),
requested_display_state_, GetRequestedPowerState(),
- kSetDisplayPowerForceProbe, /*force_configure=*/true,
+ kSetDisplayPowerForceProbe, kRefreshRateThrottleDisabled,
+ /*force_configure=*/true, kConfigurationTypeFull,
base::BindOnce(&DisplayConfigurator::OnConfigured,
weak_ptr_factory_.GetWeakPtr()));
configuration_task_->Run();
@@ -898,6 +919,44 @@ void DisplayConfigurator::RemoveObserver(Observer* observer) {
observers_.RemoveObserver(observer);
}
+void DisplayConfigurator::MaybeSetRefreshRateThrottleState(
+ int64_t display_id,
+ RefreshRateThrottleState state) {
+ DisplaySnapshot* display = nullptr;
+ for (DisplaySnapshot* cached_display : cached_displays_) {
+ if (cached_display->display_id() == display_id) {
+ display = cached_display;
+ break;
+ }
+ }
+ if (display == nullptr) {
+ LOG(ERROR) << "Did not find display with id: " << display_id;
+ return;
+ }
+ if (display->type() != DISPLAY_CONNECTION_TYPE_INTERNAL) {
+ LOG(ERROR) << "Can't throttle refresh rate for non-internal display: "
+ << display_id;
+ return;
+ }
+ if (display->current_mode() == nullptr) {
+ VLOG(4) << "Mode not set for display.";
+ return;
+ }
+
+ std::vector<const DisplayMode*> matching_modes =
+ GetSeamlessRefreshRateModes(*display, *display->current_mode());
+ if (matching_modes.size() < 2) {
+ VLOG(4) << "No mode candidates for seamless refresh rate change.";
+ return;
+ }
+
+ if ((state == kRefreshRateThrottleEnabled) !=
+ (display->current_mode() == *matching_modes.begin())) {
+ pending_refresh_rate_throttle_state_ = state;
+ RunPendingConfiguration();
+ }
+}
+
void DisplayConfigurator::SuspendDisplays(ConfigurationCallback callback) {
if (configurator_disabled()) {
std::move(callback).Run(false);
@@ -967,11 +1026,18 @@ void DisplayConfigurator::RunPendingConfiguration() {
CallAndClearQueuedCallbacks(true);
return;
}
+ ConfigurationType configuration_type = kConfigurationTypeFull;
+ if (!HasPendingFullConfiguration()) {
+ DCHECK(HasPendingSeamlessConfiguration());
+ configuration_type = kConfigurationTypeSeamless;
+ }
configuration_task_ = std::make_unique<UpdateDisplayConfigurationTask>(
native_display_delegate_.get(), layout_manager_.get(),
requested_display_state_, pending_power_state_, pending_power_flags_,
- force_configure_,
+ pending_refresh_rate_throttle_state_.value_or(
+ kRefreshRateThrottleDisabled),
+ force_configure_, configuration_type,
base::BindOnce(&DisplayConfigurator::OnConfigured,
weak_ptr_factory_.GetWeakPtr()));
@@ -981,6 +1047,7 @@ void DisplayConfigurator::RunPendingConfiguration() {
pending_power_flags_ = kSetDisplayPowerNoFlags;
has_pending_power_state_ = false;
requested_display_state_ = MULTIPLE_DISPLAY_STATE_INVALID;
+ pending_refresh_rate_throttle_state_ = absl::nullopt;
DCHECK(in_progress_configuration_callbacks_.empty());
in_progress_configuration_callbacks_.swap(queued_configuration_callbacks_);
@@ -1043,6 +1110,10 @@ void DisplayConfigurator::UpdatePowerState(
}
bool DisplayConfigurator::ShouldRunConfigurationTask() const {
+ return HasPendingSeamlessConfiguration() || HasPendingFullConfiguration();
+}
+
+bool DisplayConfigurator::HasPendingFullConfiguration() const {
if (force_configure_)
return true;
@@ -1058,6 +1129,11 @@ bool DisplayConfigurator::ShouldRunConfigurationTask() const {
return false;
}
+bool DisplayConfigurator::HasPendingSeamlessConfiguration() const {
+ // Schedule if there is a pending request to change the refresh rate.
+ return pending_refresh_rate_throttle_state_.has_value();
+}
+
void DisplayConfigurator::CallAndClearInProgressCallbacks(bool success) {
for (auto& callback : in_progress_configuration_callbacks_)
std::move(callback).Run(success);
diff --git a/chromium/ui/display/manager/display_configurator.h b/chromium/ui/display/manager/display_configurator.h
index 0d13944ddc1..a904aa3911b 100644
--- a/chromium/ui/display/manager/display_configurator.h
+++ b/chromium/ui/display/manager/display_configurator.h
@@ -9,6 +9,7 @@
#include <memory>
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/timer/timer.h"
@@ -124,7 +125,7 @@ class DISPLAY_MANAGER_EXPORT DisplayConfigurator
base::TimeDelta GetConfigureDelay() const;
private:
- DisplayConfigurator* configurator_; // not owned
+ raw_ptr<DisplayConfigurator> configurator_; // not owned
};
// Flags that can be passed to SetDisplayPower().
@@ -237,6 +238,12 @@ class DISPLAY_MANAGER_EXPORT DisplayConfigurator
// current set of connected displays).
void SetDisplayMode(MultipleDisplayState new_state);
+ // Request the display's refresh rate to be throttled. Currently
+ // only supports internal displays. If the underlying panel/display driver
+ // do not support this, it is a no-op.
+ void MaybeSetRefreshRateThrottleState(int64_t display_id,
+ RefreshRateThrottleState state);
+
// NativeDisplayDelegate::Observer overrides:
void OnConfigurationChanged() override;
void OnDisplaySnapshotsInvalidated() override;
@@ -342,6 +349,14 @@ class DISPLAY_MANAGER_EXPORT DisplayConfigurator
// otherwise.
bool ShouldRunConfigurationTask() const;
+ // Returns true if there are pending configuration changes that should be done
+ // seamlessly.
+ bool HasPendingSeamlessConfiguration() const;
+
+ // Returns true if there are pending configuration changes that require a full
+ // modeset.
+ bool HasPendingFullConfiguration() const;
+
// Helper functions which will call the callbacks in
// |in_progress_configuration_callbacks_| and
// |queued_configuration_callbacks_| and clear the lists after. |success| is
@@ -362,8 +377,8 @@ class DISPLAY_MANAGER_EXPORT DisplayConfigurator
void SendRelinquishDisplayControl(DisplayControlCallback callback,
bool success);
- StateController* state_controller_;
- SoftwareMirroringController* mirroring_controller_;
+ raw_ptr<StateController> state_controller_;
+ raw_ptr<SoftwareMirroringController> mirroring_controller_;
std::unique_ptr<NativeDisplayDelegate> native_display_delegate_;
// Used to enable modes which rely on panel fitting.
@@ -397,6 +412,9 @@ class DISPLAY_MANAGER_EXPORT DisplayConfigurator
// Bitwise-or value of the |kSetDisplayPower*| flags defined above.
int pending_power_flags_;
+ // Stores the requested refresh rate throttle state.
+ absl::optional<RefreshRateThrottleState> pending_refresh_rate_throttle_state_;
+
// List of callbacks from callers waiting for the display configuration to
// start/finish. Note these callbacks belong to the pending request, not a
// request currently active.
diff --git a/chromium/ui/display/manager/display_configurator_unittest.cc b/chromium/ui/display/manager/display_configurator_unittest.cc
index 9a717294b3f..ae3544fbc70 100644
--- a/chromium/ui/display/manager/display_configurator_unittest.cc
+++ b/chromium/ui/display/manager/display_configurator_unittest.cc
@@ -327,9 +327,15 @@ class DisplayConfiguratorTest : public testing::Test {
EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
configurator_.ForceInitialConfigure();
std::string actions = GetCrtcActions(DisplayConfig::kStack, modes...);
- EXPECT_EQ(
- actions.empty() ? kInit : JoinActions(kInit, actions.c_str(), nullptr),
- log_->GetActionsAndClear());
+ EXPECT_EQ(actions.empty()
+ ? kInit
+ : JoinActions(
+ kInit, kTestModesetStr,
+ GetCrtcActions(DisplayConfig::kStack, modes...).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(DisplayConfig::kStack, modes...).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
}
template <typename... Modes>
@@ -467,22 +473,38 @@ TEST_F(DisplayConfiguratorTest, ConnectSecondOutput) {
state_controller_.set_state(MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED);
UpdateOutputs(2, true);
- EXPECT_EQ(GetCrtcActions(&small_mode_, &big_mode_),
+ EXPECT_EQ(JoinActions(kTestModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_->GetActionsAndClear());
EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
EXPECT_EQ(1, observer_.num_changes());
observer_.Reset();
configurator_.SetDisplayMode(MULTIPLE_DISPLAY_STATE_MULTI_MIRROR);
- EXPECT_EQ(GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_),
- log_->GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(
+ kTestModesetStr,
+ GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_)
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_)
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
EXPECT_EQ(1, observer_.num_changes());
// Disconnect the second output.
observer_.Reset();
UpdateOutputs(1, true);
- EXPECT_EQ(GetCrtcActions(&small_mode_), log_->GetActionsAndClear());
+ EXPECT_EQ(JoinActions(kTestModesetStr, GetCrtcActions(&small_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
EXPECT_EQ(1, observer_.num_changes());
@@ -497,7 +519,11 @@ TEST_F(DisplayConfiguratorTest, ConnectSecondOutput) {
state_controller_.set_state(MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED);
UpdateOutputs(2, true);
- EXPECT_EQ(GetCrtcActions(&small_mode_, &big_mode_),
+ EXPECT_EQ(JoinActions(kTestModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_->GetActionsAndClear());
EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
@@ -529,7 +555,11 @@ TEST_F(DisplayConfiguratorTest, ConnectSecondOutput) {
// Disconnect the second output.
observer_.Reset();
UpdateOutputs(1, true);
- EXPECT_EQ(GetCrtcActions(&small_mode_), log_->GetActionsAndClear());
+ EXPECT_EQ(JoinActions(kTestModesetStr, GetCrtcActions(&small_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
EXPECT_EQ(1, observer_.num_changes());
}
@@ -540,8 +570,16 @@ TEST_F(DisplayConfiguratorTest, SetDisplayPower) {
state_controller_.set_state(MULTIPLE_DISPLAY_STATE_MULTI_MIRROR);
observer_.Reset();
UpdateOutputs(2, true);
- EXPECT_EQ(GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_),
- log_->GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(
+ kTestModesetStr,
+ GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_)
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_)
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
EXPECT_EQ(1, observer_.num_changes());
@@ -555,7 +593,12 @@ TEST_F(DisplayConfiguratorTest, SetDisplayPower) {
config_waiter_.on_configuration_callback());
EXPECT_EQ(kNoDelay, config_waiter_.Wait());
EXPECT_EQ(CALLBACK_SUCCESS, config_waiter_.callback_result());
- EXPECT_EQ(GetCrtcActions(nullptr, &big_mode_), log_->GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(kTestModesetStr, GetCrtcActions(nullptr, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(nullptr, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
EXPECT_EQ(MULTIPLE_DISPLAY_STATE_SINGLE, configurator_.display_state());
EXPECT_EQ(1, observer_.num_changes());
@@ -568,8 +611,13 @@ TEST_F(DisplayConfiguratorTest, SetDisplayPower) {
config_waiter_.on_configuration_callback());
EXPECT_EQ(kNoDelay, config_waiter_.Wait());
EXPECT_EQ(CALLBACK_SUCCESS, config_waiter_.callback_result());
- EXPECT_EQ(GetCrtcActions(DisplayConfig::kOff, nullptr, nullptr),
- log_->GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(kTestModesetStr,
+ GetCrtcActions(DisplayConfig::kOff, nullptr, nullptr).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(DisplayConfig::kOff, nullptr, nullptr).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
EXPECT_EQ(MULTIPLE_DISPLAY_STATE_MULTI_MIRROR, configurator_.display_state());
EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
EXPECT_EQ(1, observer_.num_changes());
@@ -582,8 +630,16 @@ TEST_F(DisplayConfiguratorTest, SetDisplayPower) {
config_waiter_.on_configuration_callback());
EXPECT_EQ(kNoDelay, config_waiter_.Wait());
EXPECT_EQ(CALLBACK_SUCCESS, config_waiter_.callback_result());
- EXPECT_EQ(GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_),
- log_->GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(
+ kTestModesetStr,
+ GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_)
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_)
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
EXPECT_EQ(MULTIPLE_DISPLAY_STATE_MULTI_MIRROR, configurator_.display_state());
EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
EXPECT_EQ(1, observer_.num_changes());
@@ -601,7 +657,11 @@ TEST_F(DisplayConfiguratorTest, SetDisplayPower) {
observer_.Reset();
UpdateOutputs(2, true);
- EXPECT_EQ(GetCrtcActions(&small_mode_, &big_mode_),
+ EXPECT_EQ(JoinActions(kTestModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_->GetActionsAndClear());
EXPECT_EQ(MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED,
configurator_.display_state());
@@ -618,7 +678,12 @@ TEST_F(DisplayConfiguratorTest, SetDisplayPower) {
config_waiter_.on_configuration_callback());
EXPECT_EQ(kNoDelay, config_waiter_.Wait());
EXPECT_EQ(CALLBACK_SUCCESS, config_waiter_.callback_result());
- EXPECT_EQ(GetCrtcActions(nullptr, &big_mode_), log_->GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(kTestModesetStr, GetCrtcActions(nullptr, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(nullptr, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
EXPECT_EQ(MULTIPLE_DISPLAY_STATE_SINGLE, configurator_.display_state());
EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
EXPECT_EQ(1, observer_.num_changes());
@@ -632,8 +697,14 @@ TEST_F(DisplayConfiguratorTest, SetDisplayPower) {
config_waiter_.on_configuration_callback());
EXPECT_EQ(kNoDelay, config_waiter_.Wait());
EXPECT_EQ(CALLBACK_SUCCESS, config_waiter_.callback_result());
- EXPECT_EQ(GetCrtcActions(DisplayConfig::kOff, &small_mode_, &big_mode_),
- log_->GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(
+ kTestModesetStr,
+ GetCrtcActions(DisplayConfig::kOff, &small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(DisplayConfig::kOff, &small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
EXPECT_EQ(MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED,
configurator_.display_state());
EXPECT_TRUE(mirroring_controller_.SoftwareMirroringEnabled());
@@ -647,7 +718,11 @@ TEST_F(DisplayConfiguratorTest, SetDisplayPower) {
config_waiter_.on_configuration_callback());
EXPECT_EQ(kNoDelay, config_waiter_.Wait());
EXPECT_EQ(CALLBACK_SUCCESS, config_waiter_.callback_result());
- EXPECT_EQ(GetCrtcActions(&small_mode_, &big_mode_),
+ EXPECT_EQ(JoinActions(kTestModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_->GetActionsAndClear());
EXPECT_EQ(MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED,
configurator_.display_state());
@@ -671,14 +746,22 @@ TEST_F(DisplayConfiguratorTest, SuspendAndResume) {
configurator_.SuspendDisplays(config_waiter_.on_configuration_callback());
EXPECT_EQ(kNoDelay, config_waiter_.Wait());
EXPECT_EQ(CALLBACK_SUCCESS, config_waiter_.callback_result());
- EXPECT_EQ(GetCrtcActions(nullptr), log_->GetActionsAndClear());
+ EXPECT_EQ(JoinActions(kTestModesetStr, GetCrtcActions(nullptr).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(nullptr).c_str(), kModesetOutcomeSuccess,
+ nullptr),
+ log_->GetActionsAndClear());
// No resume delay in single display mode.
config_waiter_.Reset();
configurator_.ResumeDisplays();
// The timer should not be running.
EXPECT_EQ(base::TimeDelta::Max(), config_waiter_.Wait());
- EXPECT_EQ(GetCrtcActions(&small_mode_), log_->GetActionsAndClear());
+ EXPECT_EQ(JoinActions(kTestModesetStr, GetCrtcActions(&small_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
// Now turn the display off before suspending and check that the
// configurator turns it back on and syncs with the server.
@@ -688,7 +771,11 @@ TEST_F(DisplayConfiguratorTest, SuspendAndResume) {
config_waiter_.on_configuration_callback());
EXPECT_EQ(kNoDelay, config_waiter_.Wait());
EXPECT_EQ(CALLBACK_SUCCESS, config_waiter_.callback_result());
- EXPECT_EQ(GetCrtcActions(nullptr), log_->GetActionsAndClear());
+ EXPECT_EQ(JoinActions(kTestModesetStr, GetCrtcActions(nullptr).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(nullptr).c_str(), kModesetOutcomeSuccess,
+ nullptr),
+ log_->GetActionsAndClear());
config_waiter_.Reset();
configurator_.SuspendDisplays(config_waiter_.on_configuration_callback());
@@ -708,12 +795,24 @@ TEST_F(DisplayConfiguratorTest, SuspendAndResume) {
config_waiter_.on_configuration_callback());
EXPECT_EQ(kNoDelay, config_waiter_.Wait());
EXPECT_EQ(CALLBACK_SUCCESS, config_waiter_.callback_result());
- EXPECT_EQ(GetCrtcActions(&small_mode_), log_->GetActionsAndClear());
+ EXPECT_EQ(JoinActions(kTestModesetStr, GetCrtcActions(&small_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
state_controller_.set_state(MULTIPLE_DISPLAY_STATE_MULTI_MIRROR);
UpdateOutputs(2, true);
- EXPECT_EQ(GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_),
- log_->GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(
+ kTestModesetStr,
+ GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_)
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_)
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
config_waiter_.Reset();
configurator_.SetDisplayPower(chromeos::DISPLAY_POWER_ALL_OFF,
@@ -722,8 +821,13 @@ TEST_F(DisplayConfiguratorTest, SuspendAndResume) {
EXPECT_EQ(kNoDelay, config_waiter_.Wait());
EXPECT_EQ(CALLBACK_SUCCESS, config_waiter_.callback_result());
EXPECT_EQ(MULTIPLE_DISPLAY_STATE_MULTI_MIRROR, configurator_.display_state());
- EXPECT_EQ(GetCrtcActions(DisplayConfig::kOff, nullptr, nullptr),
- log_->GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(kTestModesetStr,
+ GetCrtcActions(DisplayConfig::kOff, nullptr, nullptr).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(DisplayConfig::kOff, nullptr, nullptr).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
// No delay in suspend.
config_waiter_.Reset();
@@ -752,7 +856,11 @@ TEST_F(DisplayConfiguratorTest, SuspendAndResume) {
EXPECT_EQ(CALLBACK_NOT_CALLED, config_waiter_.callback_result());
EXPECT_EQ(kLongDelay, config_waiter_.Wait());
EXPECT_EQ(CALLBACK_SUCCESS, config_waiter_.callback_result());
- EXPECT_EQ(GetCrtcActions(&small_mode_), log_->GetActionsAndClear());
+ EXPECT_EQ(JoinActions(kTestModesetStr, GetCrtcActions(&small_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
}
TEST_F(DisplayConfiguratorTest, Headless) {
@@ -786,7 +894,11 @@ TEST_F(DisplayConfiguratorTest, Headless) {
.Build();
UpdateOutputs(1, true);
- EXPECT_EQ(GetCrtcActions(&big_mode_), log_->GetActionsAndClear());
+ EXPECT_EQ(JoinActions(kTestModesetStr, GetCrtcActions(&big_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&big_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
UpdateOutputs(0, true);
EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
@@ -800,12 +912,16 @@ TEST_F(DisplayConfiguratorTest, StartWithTwoOutputs) {
state_controller_.set_state(MULTIPLE_DISPLAY_STATE_MULTI_MIRROR);
configurator_.ForceInitialConfigure();
- EXPECT_EQ(JoinActions(kInit,
- GetCrtcActions(DisplayConfig::kMirror, &small_mode_,
- &small_mode_)
- .c_str(),
- nullptr),
- log_->GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(
+ kInit, kTestModesetStr,
+ GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_)
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_)
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
}
TEST_F(DisplayConfiguratorTest, InvalidMultipleDisplayStates) {
@@ -900,7 +1016,11 @@ TEST_F(DisplayConfiguratorTest, DoNotConfigureWithSuspendedDisplays) {
configurator_.SuspendDisplays(config_waiter_.on_configuration_callback());
EXPECT_EQ(kNoDelay, config_waiter_.Wait());
EXPECT_EQ(CALLBACK_SUCCESS, config_waiter_.callback_result());
- EXPECT_EQ(GetCrtcActions(nullptr), log_->GetActionsAndClear());
+ EXPECT_EQ(JoinActions(kTestModesetStr, GetCrtcActions(nullptr).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(nullptr).c_str(), kModesetOutcomeSuccess,
+ nullptr),
+ log_->GetActionsAndClear());
// The configuration timer should not be started when the displays
// are suspended.
@@ -923,12 +1043,24 @@ TEST_F(DisplayConfiguratorTest, DoNotConfigureWithSuspendedDisplays) {
config_waiter_.on_configuration_callback());
EXPECT_EQ(kNoDelay, config_waiter_.Wait());
EXPECT_EQ(CALLBACK_SUCCESS, config_waiter_.callback_result());
- EXPECT_EQ(GetCrtcActions(&small_mode_), log_->GetActionsAndClear());
+ EXPECT_EQ(JoinActions(kTestModesetStr, GetCrtcActions(&small_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
UpdateOutputs(2, false);
configurator_.SetDisplayMode(MULTIPLE_DISPLAY_STATE_MULTI_MIRROR);
- EXPECT_EQ(GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_),
- log_->GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(
+ kTestModesetStr,
+ GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_)
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_)
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
// The DisplayConfigurator should do nothing at resume time if there is no
// state change.
@@ -945,7 +1077,11 @@ TEST_F(DisplayConfiguratorTest, DoNotConfigureWithSuspendedDisplays) {
configurator_.SuspendDisplays(config_waiter_.on_configuration_callback());
EXPECT_EQ(kNoDelay, config_waiter_.Wait());
EXPECT_EQ(CALLBACK_SUCCESS, config_waiter_.callback_result());
- EXPECT_EQ(GetCrtcActions(nullptr), log_->GetActionsAndClear());
+ EXPECT_EQ(JoinActions(kTestModesetStr, GetCrtcActions(nullptr).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(nullptr).c_str(), kModesetOutcomeSuccess,
+ nullptr),
+ log_->GetActionsAndClear());
EXPECT_FALSE(test_api_.TriggerConfigureTimeout());
EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
@@ -953,7 +1089,11 @@ TEST_F(DisplayConfiguratorTest, DoNotConfigureWithSuspendedDisplays) {
configurator_.ResumeDisplays();
// The timer should not be running.
EXPECT_EQ(base::TimeDelta::Max(), config_waiter_.Wait());
- EXPECT_EQ(GetCrtcActions(&small_mode_), log_->GetActionsAndClear());
+ EXPECT_EQ(JoinActions(kTestModesetStr, GetCrtcActions(&small_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
}
TEST_F(DisplayConfiguratorTest, HandleConfigureCrtcFailure) {
@@ -992,15 +1132,18 @@ TEST_F(DisplayConfiguratorTest, HandleConfigureCrtcFailure) {
EXPECT_EQ(JoinActions(
// Initial attempt fails.
+ kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0),
outputs_[0]->native_mode()})
.c_str(),
+ kModesetOutcomeFailure,
// Initiate retry logic, which fails since it cannot downgrade
// the internal display.
+ kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0),
outputs_[0]->native_mode()})
.c_str(),
- nullptr),
+ kModesetOutcomeFailure, nullptr),
log_->GetActionsAndClear());
outputs_[0] = FakeDisplaySnapshot::Builder()
@@ -1023,24 +1166,37 @@ TEST_F(DisplayConfiguratorTest, HandleConfigureCrtcFailure) {
EXPECT_EQ(JoinActions(
// Initial attempt fails.
+ kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0),
modes[0].get()})
.c_str(),
+ kModesetOutcomeFailure,
// Initiate retry logic.
+ kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0),
modes[0].get()})
.c_str(),
+ kModesetOutcomeFailure,
// Retry attempts trying all available modes.
+ kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0),
modes[3].get()})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0),
modes[4].get()})
.c_str(),
+ kModesetOutcomeFailure,
+ // Test-modeset passes for this mode.
+ kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0),
modes[2].get()})
.c_str(),
- nullptr),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0),
+ modes[2].get()})
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_->GetActionsAndClear());
outputs_[0] = FakeDisplaySnapshot::Builder()
@@ -1079,52 +1235,71 @@ TEST_F(DisplayConfiguratorTest, HandleConfigureCrtcFailure) {
EXPECT_EQ(
JoinActions(
// Initial attempt fails. Initiate retry logic.
+ kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0),
outputs_[0]->native_mode()})
.c_str(),
GetCrtcAction(
{outputs_[1]->display_id(), gfx::Point(0, 0), modes[0].get()})
.c_str(),
- // We first attempt to modeset the internal display with all
- // other displays disabled, which will fail.
+ kModesetOutcomeFailure,
+ // We first test-modeset the internal display with all other displays
+ // disabled, which will fail.
+ kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0),
outputs_[0]->native_mode()})
.c_str(),
GetCrtcAction({outputs_[1]->display_id(), gfx::Point(0, 0), nullptr})
.c_str(),
+ kModesetOutcomeFailure,
// Since internal displays are restricted to their preferred mode,
// there are no other modes to try. Disable the internal display so we
// can attempt to modeset displays that are connected to other
// connectors. Next, the external display will cycle through all its
// available modes before failing completely.
+ kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), nullptr})
.c_str(),
GetCrtcAction(
{outputs_[1]->display_id(), gfx::Point(0, 0), modes[0].get()})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), nullptr})
.c_str(),
GetCrtcAction(
{outputs_[1]->display_id(), gfx::Point(0, 0), modes[3].get()})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), nullptr})
.c_str(),
GetCrtcAction(
{outputs_[1]->display_id(), gfx::Point(0, 0), modes[4].get()})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), nullptr})
.c_str(),
GetCrtcAction(
{outputs_[1]->display_id(), gfx::Point(0, 0), modes[2].get()})
.c_str(),
+ kModesetOutcomeFailure,
+ // This configuration still passes intermediate test-modeset.
+ kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), nullptr})
.c_str(),
GetCrtcAction(
{outputs_[1]->display_id(), gfx::Point(0, 0), modes[1].get()})
.c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), nullptr})
+ .c_str(),
+ GetCrtcAction(
+ {outputs_[1]->display_id(), gfx::Point(0, 0), modes[1].get()})
+ .c_str(),
+ kModesetOutcomeSuccess,
// Since mirror mode configuration failed it should now attempt to
// configure in extended mode. However, initial attempt fails.
// Initiate retry logic.
+ kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0),
outputs_[0]->native_mode()})
.c_str(),
@@ -1133,8 +1308,10 @@ TEST_F(DisplayConfiguratorTest, HandleConfigureCrtcFailure) {
DisplayConfigurator::kVerticalGap),
modes[0].get()})
.c_str(),
- // We first attempt to modeset the internal display with all
- // other displays disabled, which will fail.
+ kModesetOutcomeFailure,
+ // We first test-modeset the internal display with all other displays
+ // disabled, which will fail.
+ kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0),
outputs_[0]->native_mode()})
.c_str(),
@@ -1143,8 +1320,10 @@ TEST_F(DisplayConfiguratorTest, HandleConfigureCrtcFailure) {
DisplayConfigurator::kVerticalGap),
nullptr})
.c_str(),
+ kModesetOutcomeFailure,
// The configuration fails completely but still attempts to modeset
// the external display.
+ kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), nullptr})
.c_str(),
GetCrtcAction({outputs_[1]->display_id(),
@@ -1152,6 +1331,7 @@ TEST_F(DisplayConfiguratorTest, HandleConfigureCrtcFailure) {
DisplayConfigurator::kVerticalGap),
modes[0].get()})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), nullptr})
.c_str(),
GetCrtcAction({outputs_[1]->display_id(),
@@ -1159,6 +1339,7 @@ TEST_F(DisplayConfiguratorTest, HandleConfigureCrtcFailure) {
DisplayConfigurator::kVerticalGap),
modes[3].get()})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), nullptr})
.c_str(),
GetCrtcAction({outputs_[1]->display_id(),
@@ -1166,6 +1347,7 @@ TEST_F(DisplayConfiguratorTest, HandleConfigureCrtcFailure) {
DisplayConfigurator::kVerticalGap),
modes[4].get()})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), nullptr})
.c_str(),
GetCrtcAction({outputs_[1]->display_id(),
@@ -1173,6 +1355,17 @@ TEST_F(DisplayConfiguratorTest, HandleConfigureCrtcFailure) {
DisplayConfigurator::kVerticalGap),
modes[2].get()})
.c_str(),
+ kModesetOutcomeFailure,
+ // This configuration passes test-modeset.
+ kTestModesetStr,
+ GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), nullptr})
+ .c_str(),
+ GetCrtcAction({outputs_[1]->display_id(),
+ gfx::Point(0, modes[0]->size().height() +
+ DisplayConfigurator::kVerticalGap),
+ modes[1].get()})
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), nullptr})
.c_str(),
GetCrtcAction({outputs_[1]->display_id(),
@@ -1180,7 +1373,7 @@ TEST_F(DisplayConfiguratorTest, HandleConfigureCrtcFailure) {
DisplayConfigurator::kVerticalGap),
modes[1].get()})
.c_str(),
- nullptr),
+ kModesetOutcomeSuccess, nullptr),
log_->GetActionsAndClear());
}
@@ -1224,7 +1417,11 @@ TEST_F(DisplayConfiguratorTest, SaveDisplayPowerStateOnConfigFailure) {
// than the earlier DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON state.
native_display_delegate_->set_max_configurable_pixels(0);
UpdateOutputs(1, true);
- EXPECT_EQ(GetCrtcActions(&small_mode_), log_->GetActionsAndClear());
+ EXPECT_EQ(JoinActions(kTestModesetStr, GetCrtcActions(&small_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
}
// Tests that the SetDisplayPowerState() task posted by HandleResume() doesn't
@@ -1247,8 +1444,14 @@ TEST_F(DisplayConfiguratorTest, DontRestoreStalePowerStateAfterResume) {
EXPECT_EQ(CALLBACK_SUCCESS, config_waiter_.callback_result());
EXPECT_EQ(1, observer_.num_changes());
EXPECT_EQ(0, observer_.num_failures());
- EXPECT_EQ(GetCrtcActions(DisplayConfig::kMirror, nullptr, &big_mode_),
- log_->GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(
+ kTestModesetStr,
+ GetCrtcActions(DisplayConfig::kMirror, nullptr, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(DisplayConfig::kMirror, nullptr, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
// Suspend and resume the system. Resuming should restore the previous power
// state and force a probe. Suspend should turn off the displays since an
@@ -1258,8 +1461,13 @@ TEST_F(DisplayConfiguratorTest, DontRestoreStalePowerStateAfterResume) {
EXPECT_EQ(kNoDelay, config_waiter_.Wait());
EXPECT_EQ(CALLBACK_SUCCESS, config_waiter_.callback_result());
EXPECT_EQ(2, observer_.num_changes());
- EXPECT_EQ(GetCrtcActions(DisplayConfig::kOff, nullptr, nullptr),
- log_->GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(kTestModesetStr,
+ GetCrtcActions(DisplayConfig::kOff, nullptr, nullptr).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(DisplayConfig::kOff, nullptr, nullptr).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
// Before the task runs, exit docked mode.
config_waiter_.Reset();
@@ -1270,8 +1478,16 @@ TEST_F(DisplayConfiguratorTest, DontRestoreStalePowerStateAfterResume) {
EXPECT_EQ(CALLBACK_SUCCESS, config_waiter_.callback_result());
EXPECT_EQ(3, observer_.num_changes());
EXPECT_EQ(0, observer_.num_failures());
- EXPECT_EQ(GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_),
- log_->GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(
+ kTestModesetStr,
+ GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_)
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_)
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
// Check that the display states are not changed after resuming.
config_waiter_.Reset();
@@ -1284,8 +1500,16 @@ TEST_F(DisplayConfiguratorTest, DontRestoreStalePowerStateAfterResume) {
EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
// Now trigger that delayed configuration.
EXPECT_EQ(kLongDelay, config_waiter_.Wait());
- EXPECT_EQ(GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_),
- log_->GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(
+ kTestModesetStr,
+ GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_)
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(DisplayConfig::kMirror, &small_mode_, &small_mode_)
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
}
TEST_F(DisplayConfiguratorTest, ExternalControl) {
@@ -1303,16 +1527,21 @@ TEST_F(DisplayConfiguratorTest, ExternalControl) {
base::BindOnce(&DisplayConfiguratorTest::OnDisplayControlUpdated,
base::Unretained(this)));
EXPECT_EQ(CALLBACK_SUCCESS, PopDisplayControlResult());
- EXPECT_EQ(JoinActions(GetCrtcActions(nullptr).c_str(),
+ EXPECT_EQ(JoinActions(kTestModesetStr, GetCrtcActions(nullptr).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(nullptr).c_str(), kModesetOutcomeSuccess,
kRelinquishDisplayControl, nullptr),
log_->GetActionsAndClear());
configurator_.TakeControl(
base::BindOnce(&DisplayConfiguratorTest::OnDisplayControlUpdated,
base::Unretained(this)));
EXPECT_EQ(CALLBACK_SUCCESS, PopDisplayControlResult());
- EXPECT_EQ(JoinActions(kTakeDisplayControl,
- GetCrtcActions(&small_mode_).c_str(), nullptr),
- log_->GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(kTakeDisplayControl, kTestModesetStr,
+ GetCrtcActions(&small_mode_).c_str(), kModesetOutcomeSuccess,
+ kCommitModesetStr, GetCrtcActions(&small_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
}
TEST_F(DisplayConfiguratorTest,
@@ -1342,8 +1571,14 @@ TEST_F(DisplayConfiguratorTest,
EXPECT_EQ(1, observer_.num_changes());
EXPECT_EQ(0, observer_.num_failures());
- EXPECT_EQ(GetCrtcActions(DisplayConfig::kOff, &small_mode_, &big_mode_),
- log_->GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(
+ kTestModesetStr,
+ GetCrtcActions(DisplayConfig::kOff, &small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(DisplayConfig::kOff, &small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
config_waiter_.Reset();
EXPECT_EQ(base::Milliseconds(DisplayConfigurator::kConfigureDelayMs),
@@ -1354,7 +1589,11 @@ TEST_F(DisplayConfiguratorTest,
EXPECT_EQ(2, observer_.num_changes());
EXPECT_EQ(0, observer_.num_failures());
- EXPECT_EQ(GetCrtcActions(&small_mode_, &big_mode_),
+ EXPECT_EQ(JoinActions(kTestModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_->GetActionsAndClear());
}
@@ -1381,10 +1620,13 @@ TEST_F(DisplayConfiguratorTest,
EXPECT_EQ(
JoinActions(
+ kTestModesetStr,
GetCrtcActions(DisplayConfig::kOff, &small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcActions(DisplayConfig::kOff, &small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcActions(DisplayConfig::kOff, &small_mode_, &big_mode_).c_str(),
- nullptr),
+ kModesetOutcomeFailure, nullptr),
log_->GetActionsAndClear());
// This configuration should trigger a display configuration since the
@@ -1399,19 +1641,22 @@ TEST_F(DisplayConfiguratorTest,
EXPECT_EQ(2, observer_.num_failures());
EXPECT_EQ(
JoinActions(
- GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kTestModesetStr, GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeFailure,
// We first attempt to modeset the internal display with all
// other displays disabled, which will fail.
- GetCrtcActions(&small_mode_).c_str(),
+ kTestModesetStr, GetCrtcActions(&small_mode_).c_str(),
GetCrtcAction({outputs_[1]->display_id(),
gfx::Point(0, small_mode_.size().height() +
DisplayConfigurator::kVerticalGap),
nullptr})
.c_str(),
+ kModesetOutcomeFailure,
// Since internal displays are restricted to their preferred mode,
// there are no other modes to try. Disable the internal display while
// we attempt to modeset displays that are connected to other
// connectors. Configuration will fail.
+ kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), nullptr})
.c_str(),
GetCrtcAction({outputs_[1]->display_id(),
@@ -1419,6 +1664,7 @@ TEST_F(DisplayConfiguratorTest,
DisplayConfigurator::kVerticalGap),
&big_mode_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), nullptr})
.c_str(),
GetCrtcAction({outputs_[1]->display_id(),
@@ -1426,7 +1672,7 @@ TEST_F(DisplayConfiguratorTest,
DisplayConfigurator::kVerticalGap),
&small_mode_})
.c_str(),
- nullptr),
+ kModesetOutcomeFailure, nullptr),
log_->GetActionsAndClear());
// Allow configuration to succeed.
@@ -1440,7 +1686,11 @@ TEST_F(DisplayConfiguratorTest,
EXPECT_EQ(1, observer_.num_changes());
EXPECT_EQ(2, observer_.num_failures());
- EXPECT_EQ(GetCrtcActions(&small_mode_, &big_mode_),
+ EXPECT_EQ(JoinActions(kTestModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_->GetActionsAndClear());
}
@@ -1455,7 +1705,12 @@ TEST_F(DisplayConfiguratorTest, TestWithThreeDisplays) {
UpdateOutputs(3, true);
state_controller_.set_state(MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED);
- EXPECT_EQ(GetCrtcActions(&small_mode_, &big_mode_, &small_mode_),
+ EXPECT_EQ(JoinActions(
+ kTestModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_, &small_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_, &small_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_->GetActionsAndClear());
// Verify that turning the power off works.
@@ -1465,8 +1720,15 @@ TEST_F(DisplayConfiguratorTest, TestWithThreeDisplays) {
config_waiter_.on_configuration_callback());
EXPECT_EQ(kNoDelay, config_waiter_.Wait());
EXPECT_EQ(CALLBACK_SUCCESS, config_waiter_.callback_result());
- EXPECT_EQ(GetCrtcActions(DisplayConfig::kOff, &small_mode_, &big_mode_,
- &small_mode_),
+ EXPECT_EQ(JoinActions(kTestModesetStr,
+ GetCrtcActions(DisplayConfig::kOff, &small_mode_,
+ &big_mode_, &small_mode_)
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(DisplayConfig::kOff, &small_mode_,
+ &big_mode_, &small_mode_)
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_->GetActionsAndClear());
config_waiter_.Reset();
@@ -1475,14 +1737,23 @@ TEST_F(DisplayConfiguratorTest, TestWithThreeDisplays) {
config_waiter_.on_configuration_callback());
EXPECT_EQ(kNoDelay, config_waiter_.Wait());
EXPECT_EQ(CALLBACK_SUCCESS, config_waiter_.callback_result());
- EXPECT_EQ(GetCrtcActions(&small_mode_, &big_mode_, &small_mode_),
+ EXPECT_EQ(JoinActions(
+ kTestModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_, &small_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_, &small_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_->GetActionsAndClear());
// Disconnect the third output.
observer_.Reset();
state_controller_.set_state(MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED);
UpdateOutputs(2, true);
- EXPECT_EQ(GetCrtcActions(&small_mode_, &big_mode_),
+ EXPECT_EQ(JoinActions(kTestModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_->GetActionsAndClear());
}
@@ -1506,7 +1777,11 @@ TEST_F(DisplayConfiguratorTest, SuspendResumeWithMultipleDisplays) {
EXPECT_EQ(chromeos::DISPLAY_POWER_ALL_ON,
configurator_.current_power_state());
- EXPECT_EQ(GetCrtcActions(&small_mode_, &big_mode_),
+ EXPECT_EQ(JoinActions(kTestModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_->GetActionsAndClear());
// Suspending displays should result in an immediate configuration without
@@ -1519,8 +1794,14 @@ TEST_F(DisplayConfiguratorTest, SuspendResumeWithMultipleDisplays) {
configurator_.current_power_state());
EXPECT_EQ(MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED,
configurator_.display_state());
- EXPECT_EQ(GetCrtcActions(DisplayConfig::kOff, &small_mode_, &big_mode_),
- log_->GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(
+ kTestModesetStr,
+ GetCrtcActions(DisplayConfig::kOff, &small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(DisplayConfig::kOff, &small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
// Resuming from suspend with dual displays. Configuration should be done
// after a long delay. Afterwards, we should still expect to be in a dual
@@ -1532,7 +1813,11 @@ TEST_F(DisplayConfiguratorTest, SuspendResumeWithMultipleDisplays) {
configurator_.current_power_state());
EXPECT_EQ(MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED,
configurator_.display_state());
- EXPECT_EQ(GetCrtcActions(&small_mode_, &big_mode_),
+ EXPECT_EQ(JoinActions(kTestModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_->GetActionsAndClear());
// Suspend displays and disconnect one of them while in suspend.
@@ -1544,8 +1829,14 @@ TEST_F(DisplayConfiguratorTest, SuspendResumeWithMultipleDisplays) {
configurator_.display_state());
EXPECT_EQ(chromeos::DISPLAY_POWER_ALL_OFF,
configurator_.current_power_state());
- EXPECT_EQ(GetCrtcActions(DisplayConfig::kOff, &small_mode_, &big_mode_),
- log_->GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(
+ kTestModesetStr,
+ GetCrtcActions(DisplayConfig::kOff, &small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(DisplayConfig::kOff, &small_mode_, &big_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
UpdateOutputs(1, false);
EXPECT_EQ(kNoActions, log_->GetActionsAndClear());
@@ -1558,7 +1849,11 @@ TEST_F(DisplayConfiguratorTest, SuspendResumeWithMultipleDisplays) {
EXPECT_EQ(chromeos::DISPLAY_POWER_ALL_ON,
configurator_.current_power_state());
EXPECT_EQ(MULTIPLE_DISPLAY_STATE_SINGLE, configurator_.display_state());
- EXPECT_EQ(GetCrtcActions(&small_mode_), log_->GetActionsAndClear());
+ EXPECT_EQ(JoinActions(kTestModesetStr, GetCrtcActions(&small_mode_).c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(&small_mode_).c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_->GetActionsAndClear());
// Verify that the above is the exact same behavior for 3+ displays.
UpdateOutputs(3, true);
@@ -1661,8 +1956,17 @@ class DisplayConfiguratorMultiMirroringTest : public DisplayConfiguratorTest {
observer_.Reset();
configurator_.SetDisplayMode(MULTIPLE_DISPLAY_STATE_MULTI_MIRROR);
EXPECT_EQ(
- GetCrtcActions(DisplayConfig::kMirror, expected_mirror_mode.get(),
- expected_mirror_mode.get(), expected_mirror_mode.get()),
+ JoinActions(kTestModesetStr,
+ GetCrtcActions(
+ DisplayConfig::kMirror, expected_mirror_mode.get(),
+ expected_mirror_mode.get(), expected_mirror_mode.get())
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcActions(
+ DisplayConfig::kMirror, expected_mirror_mode.get(),
+ expected_mirror_mode.get(), expected_mirror_mode.get())
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_->GetActionsAndClear());
EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
EXPECT_EQ(1, observer_.num_changes());
diff --git a/chromium/ui/display/manager/display_layout_manager.h b/chromium/ui/display/manager/display_layout_manager.h
index ae7c492dbea..b1cdf399f95 100644
--- a/chromium/ui/display/manager/display_layout_manager.h
+++ b/chromium/ui/display/manager/display_layout_manager.h
@@ -39,6 +39,7 @@ class DisplayLayoutManager {
const std::vector<DisplaySnapshot*>& displays,
MultipleDisplayState new_display_state,
chromeos::DisplayPowerState new_power_state,
+ RefreshRateThrottleState new_throttle_state,
std::vector<DisplayConfigureRequest>* requests) const = 0;
virtual std::vector<DisplaySnapshot*> GetDisplayStates() const = 0;
diff --git a/chromium/ui/display/manager/display_manager.cc b/chromium/ui/display/manager/display_manager.cc
index 121b2793c46..6653b26dd42 100644
--- a/chromium/ui/display/manager/display_manager.cc
+++ b/chromium/ui/display/manager/display_manager.cc
@@ -72,6 +72,11 @@ const char kMirrorModeTypesHistogram[] = "DisplayManager.MirrorModeTypes";
const char kMirroringDisplayCountRangesHistogram[] =
"DisplayManager.MirroringDisplayCountRanges";
+// The UMA histogram that logs whether mirroring is done in hardware or
+// software.
+const char kMirroringImplementationHistogram[] =
+ "DisplayManager.MirroringImplementation";
+
#if BUILDFLAG(IS_CHROMEOS_ASH)
// The UMA historgram that logs the zoom percentage level of the intenral
// display.
@@ -277,6 +282,21 @@ DisplayCountRange GetDisplayCountRange(int display_count) {
return DisplayCountRange::kGreaterThan8Displays;
}
+// Describes the way mirror mode is implemented as reported by UMA.
+//
+// WARNING: These values are persisted to logs. Entries should not be renumbered
+// and numeric values should never be reused.
+enum class MirroringImplementation {
+ // Software mirroring, where the same content is rendered for each display
+ // independently.
+ kSoftware = 0,
+ // Hardware mirroring, where a display is rendered once and shared across
+ // multiple displays.
+ kHardware = 1,
+
+ kMaxValue = kHardware,
+};
+
// Defines the types of mirror mode in which the displays connected to the
// device are in as reported by UMA.
//
@@ -989,6 +1009,9 @@ void DisplayManager::UpdateDisplaysWith(
metrics |= DisplayObserver::DISPLAY_METRIC_INTERLACED;
}
+ if (current_display.label() != new_display.label())
+ metrics |= DisplayObserver::DISPLAY_METRIC_LABEL;
+
if (metrics != DisplayObserver::DISPLAY_METRIC_NONE) {
display_changes.insert(
std::pair<size_t, uint32_t>(new_displays.size(), metrics));
@@ -1121,6 +1144,10 @@ void DisplayManager::UpdateDisplaysWith(
kMirroringDisplayCountRangesHistogram,
GetDisplayCountRange(GetMirroringDestinationDisplayIdList().size() + 1),
DisplayCountRange::kCount);
+ UMA_HISTOGRAM_ENUMERATION(kMirroringImplementationHistogram,
+ IsInSoftwareMirrorMode()
+ ? MirroringImplementation::kSoftware
+ : MirroringImplementation::kHardware);
UMA_HISTOGRAM_ENUMERATION(kMirrorModeTypesHistogram,
mixed_mirror_mode_params_
? MirrorModeTypes::kMixed
@@ -2085,6 +2112,9 @@ Display DisplayManager::CreateDisplayFromDisplayInfoById(int64_t id) {
new_display.set_touch_support(display_info.touch_support());
new_display.set_maximum_cursor_size(display_info.maximum_cursor_size());
new_display.set_color_spaces(display_info.display_color_spaces());
+ new_display.set_display_frequency(display_info.refresh_rate());
+ new_display.set_label(display_info.name());
+
constexpr uint32_t kNormalBitDepthNumBitsPerChannel = 8u;
if (display_info.bits_per_channel() > kNormalBitDepthNumBitsPerChannel) {
new_display.set_depth_per_component(display_info.bits_per_channel());
@@ -2092,8 +2122,6 @@ Display DisplayManager::CreateDisplayFromDisplayInfoById(int64_t id) {
new_display.set_color_depth(display_info.bits_per_channel() *
kRGBNumChannels);
}
- new_display.set_display_frequency(display_info.refresh_rate());
-
if (internal_display_has_accelerometer_ && IsInternalDisplayId(id)) {
new_display.set_accelerometer_support(
Display::AccelerometerSupport::AVAILABLE);
@@ -2119,6 +2147,7 @@ Display DisplayManager::CreateMirroringDisplayFromDisplayInfoById(
new_display.set_maximum_cursor_size(display_info.maximum_cursor_size());
new_display.set_rotation(display_info.GetActiveRotation());
new_display.set_panel_rotation(display_info.GetLogicalActiveRotation());
+ new_display.set_label(display_info.name());
return new_display;
}
diff --git a/chromium/ui/display/manager/display_manager_util.cc b/chromium/ui/display/manager/display_manager_util.cc
index 2e413365c69..4ae7692e672 100644
--- a/chromium/ui/display/manager/display_manager_util.cc
+++ b/chromium/ui/display/manager/display_manager_util.cc
@@ -34,6 +34,18 @@ std::string DisplayPowerStateToString(chromeos::DisplayPowerState state) {
}
}
+std::string RefreshRateThrottleStateToString(RefreshRateThrottleState state) {
+ switch (state) {
+ case kRefreshRateThrottleEnabled:
+ return "THROTTLE_ENABLED";
+ case kRefreshRateThrottleDisabled:
+ return "THROTTLE_DISABLED";
+ }
+ NOTREACHED();
+ return "unknown refresh rate throttle state (" + base::NumberToString(state) +
+ ")";
+}
+
int GetDisplayPower(const std::vector<DisplaySnapshot*>& displays,
chromeos::DisplayPowerState state,
std::vector<bool>* display_power) {
@@ -56,6 +68,36 @@ int GetDisplayPower(const std::vector<DisplaySnapshot*>& displays,
return num_on_displays;
}
+std::vector<const DisplayMode*> GetSeamlessRefreshRateModes(
+ const DisplaySnapshot& display,
+ const DisplayMode& matching_mode) {
+ const float kMinRefreshRate = 60.f;
+ const float kEpsilon = 0.01f;
+
+ std::vector<const DisplayMode*> matching_modes;
+ for (const std::unique_ptr<const display::DisplayMode>& mode :
+ display.modes()) {
+ if (matching_mode.is_interlaced() != mode->is_interlaced())
+ continue;
+ // Filter out modes that are less than 60 Hz. Account for floating point
+ // inaccuracies so we don't filter out 59.997 mistakenly.
+ if (mode->refresh_rate() < (kMinRefreshRate - kEpsilon))
+ continue;
+
+ // Filter out modes whose refresh rate is quicker than the preferred mode.
+ if (display.native_mode()->refresh_rate() < mode->refresh_rate())
+ continue;
+
+ if (matching_mode.size() == mode->size())
+ matching_modes.push_back(mode.get());
+ }
+ auto refresh_lt = [](const DisplayMode* a, const DisplayMode* b) -> bool {
+ return a->refresh_rate() < b->refresh_rate();
+ };
+ std::sort(matching_modes.begin(), matching_modes.end(), refresh_lt);
+ return matching_modes;
+}
+
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
bool WithinEpsilon(float a, float b) {
diff --git a/chromium/ui/display/manager/display_manager_util.h b/chromium/ui/display/manager/display_manager_util.h
index c37a695d312..77a0f51b769 100644
--- a/chromium/ui/display/manager/display_manager_util.h
+++ b/chromium/ui/display/manager/display_manager_util.h
@@ -18,6 +18,7 @@
namespace display {
+class DisplayMode;
class DisplaySnapshot;
class ManagedDisplayMode;
@@ -25,6 +26,9 @@ class ManagedDisplayMode;
// Returns a string describing |state|.
std::string DisplayPowerStateToString(chromeos::DisplayPowerState state);
+// Returns a string describing |state|.
+std::string RefreshRateThrottleStateToString(RefreshRateThrottleState state);
+
// Returns the number of displays in |displays| that should be turned on, per
// |state|. If |display_power| is non-NULL, it is updated to contain the
// on/off state of each corresponding entry in |displays|.
@@ -33,6 +37,15 @@ GetDisplayPower(const std::vector<DisplaySnapshot*>& displays,
chromeos::DisplayPowerState state,
std::vector<bool>* display_power);
+// Get a vector of DisplayMode pointers from |display|'s set of modes that
+// should be considered for seamless refresh rate switching. These will have the
+// same refresh rate as |matching_mode|, be no slower than 60 Hz, and no faster
+// than the display's native mode. The vector will be ordered by refresh rate,
+// with the slowest refresh rate at index 0.
+std::vector<const DisplayMode*> GetSeamlessRefreshRateModes(
+ const DisplaySnapshot& display,
+ const DisplayMode& matching_mode);
+
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
// Determines whether |a| is within an epsilon of |b|.
diff --git a/chromium/ui/display/manager/json_converter.cc b/chromium/ui/display/manager/json_converter.cc
index 54a670a30b2..94bb90af7a3 100644
--- a/chromium/ui/display/manager/json_converter.cc
+++ b/chromium/ui/display/manager/json_converter.cc
@@ -27,14 +27,12 @@ const char kOffsetKey[] = "offset";
const char kDisplayPlacementDisplayIdKey[] = "display_id";
const char kDisplayPlacementParentDisplayIdKey[] = "parent_display_id";
-bool AddLegacyValuesFromValue(const base::Value& value, DisplayLayout* layout) {
- if (!value.is_dict())
- return false;
-
- absl::optional<int> optional_offset = value.FindIntKey(kOffsetKey);
+bool AddLegacyValuesFromValue(const base::Value::Dict& dict,
+ DisplayLayout* layout) {
+ absl::optional<int> optional_offset = dict.FindInt(kOffsetKey);
if (optional_offset) {
DisplayPlacement::Position position;
- const std::string* position_str = value.FindStringKey(kPositionKey);
+ const std::string* position_str = dict.FindString(kPositionKey);
if (!position_str)
return false;
DisplayPlacement::StringToPosition(*position_str, &position);
@@ -45,11 +43,11 @@ bool AddLegacyValuesFromValue(const base::Value& value, DisplayLayout* layout) {
// Returns true if
// The key is missing - output is left unchanged
-// The key matches the type - output is updated to the value.
-bool UpdateFromDict(const base::Value& value,
+// The key matches the type - output is updated to the dict.
+bool UpdateFromDict(const base::Value::Dict& dict,
const std::string& field_name,
bool* output) {
- const base::Value* field = value.FindKey(field_name);
+ const base::Value* field = dict.Find(field_name);
if (!field) {
LOG(WARNING) << "Missing field: " << field_name;
return true;
@@ -65,11 +63,11 @@ bool UpdateFromDict(const base::Value& value,
// Returns true if
// The key is missing - output is left unchanged
-// The key matches the type - output is updated to the value.
-bool UpdateFromDict(const base::Value& value,
+// The key matches the type - output is updated to the dict.
+bool UpdateFromDict(const base::Value::Dict& dict,
const std::string& field_name,
int* output) {
- const base::Value* field = value.FindKey(field_name);
+ const base::Value* field = dict.Find(field_name);
if (!field) {
LOG(WARNING) << "Missing field: " << field_name;
return true;
@@ -85,11 +83,11 @@ bool UpdateFromDict(const base::Value& value,
// Returns true if
// The key is missing - output is left unchanged
-// The key matches the type - output is updated to the value.
-bool UpdateFromDict(const base::Value& value,
+// The key matches the type - output is updated to the dict.
+bool UpdateFromDict(const base::Value::Dict& dict,
const std::string& field_name,
DisplayPlacement::Position* output) {
- const base::Value* field = value.FindKey(field_name);
+ const base::Value* field = dict.Find(field_name);
if (!field) {
LOG(WARNING) << "Missing field: " << field_name;
return true;
@@ -106,11 +104,11 @@ bool UpdateFromDict(const base::Value& value,
// Returns true if
// The key is missing - output is left unchanged
-// The key matches the type - output is updated to the value.
-bool UpdateFromDict(const base::Value& value,
+// The key matches the type - output is updated to the dict.
+bool UpdateFromDict(const base::Value::Dict& dict,
const std::string& field_name,
int64_t* output) {
- const base::Value* field = value.FindKey(field_name);
+ const base::Value* field = dict.Find(field_name);
if (!field) {
LOG(WARNING) << "Missing field: " << field_name;
return true;
@@ -126,11 +124,11 @@ bool UpdateFromDict(const base::Value& value,
// Returns true if
// The key is missing - output is left unchanged
-// The key matches the type - output is updated to the value.
-bool UpdateFromDict(const base::Value& value,
+// The key matches the type - output is updated to the dict.
+bool UpdateFromDict(const base::Value::Dict& dict,
const std::string& field_name,
std::vector<DisplayPlacement>* output) {
- const base::Value* field = value.FindKey(field_name);
+ const base::Value* field = dict.Find(field_name);
if (!field) {
LOG(WARNING) << "Missing field: " << field_name;
return true;
@@ -147,11 +145,12 @@ bool UpdateFromDict(const base::Value& value,
return false;
DisplayPlacement item;
- if (!UpdateFromDict(list_item, kOffsetKey, &item.offset) ||
- !UpdateFromDict(list_item, kPositionKey, &item.position) ||
- !UpdateFromDict(list_item, kDisplayPlacementDisplayIdKey,
+ if (!UpdateFromDict(list_item.GetDict(), kOffsetKey, &item.offset) ||
+ !UpdateFromDict(list_item.GetDict(), kPositionKey, &item.position) ||
+ !UpdateFromDict(list_item.GetDict(), kDisplayPlacementDisplayIdKey,
&item.display_id) ||
- !UpdateFromDict(list_item, kDisplayPlacementParentDisplayIdKey,
+ !UpdateFromDict(list_item.GetDict(),
+ kDisplayPlacementParentDisplayIdKey,
&item.parent_display_id)) {
return false;
}
@@ -164,46 +163,44 @@ bool UpdateFromDict(const base::Value& value,
} // namespace
bool JsonToDisplayLayout(const base::Value& value, DisplayLayout* layout) {
- layout->placement_list.clear();
if (!value.is_dict())
return false;
+ return JsonToDisplayLayout(value.GetDict(), layout);
+}
- if (!UpdateFromDict(value, kDefaultUnifiedKey, &layout->default_unified) ||
- !UpdateFromDict(value, kPrimaryIdKey, &layout->primary_id)) {
+bool JsonToDisplayLayout(const base::Value::Dict& dict, DisplayLayout* layout) {
+ layout->placement_list.clear();
+
+ if (!UpdateFromDict(dict, kDefaultUnifiedKey, &layout->default_unified) ||
+ !UpdateFromDict(dict, kPrimaryIdKey, &layout->primary_id)) {
return false;
}
- UpdateFromDict(value, kDisplayPlacementKey, &layout->placement_list);
+ UpdateFromDict(dict, kDisplayPlacementKey, &layout->placement_list);
if (layout->placement_list.size() != 0u)
return true;
// For compatibility with old format.
- return AddLegacyValuesFromValue(value, layout);
+ return AddLegacyValuesFromValue(dict, layout);
}
-bool DisplayLayoutToJson(const DisplayLayout& layout, base::Value* value) {
- if (!value->is_dict())
- return false;
-
- value->SetBoolKey(kDefaultUnifiedKey, layout.default_unified);
- value->SetStringKey(kPrimaryIdKey, base::NumberToString(layout.primary_id));
+void DisplayLayoutToJson(const DisplayLayout& layout, base::Value::Dict& dict) {
+ dict.Set(kDefaultUnifiedKey, layout.default_unified);
+ dict.Set(kPrimaryIdKey, base::NumberToString(layout.primary_id));
- base::Value::ListStorage placement_list;
+ base::Value::List placement_list;
for (const auto& placement : layout.placement_list) {
- base::Value placement_value(base::Value::Type::DICTIONARY);
- placement_value.SetStringKey(
- kPositionKey, DisplayPlacement::PositionToString(placement.position));
- placement_value.SetIntKey(kOffsetKey, placement.offset);
- placement_value.SetStringKey(kDisplayPlacementDisplayIdKey,
- base::NumberToString(placement.display_id));
- placement_value.SetStringKey(
- kDisplayPlacementParentDisplayIdKey,
- base::NumberToString(placement.parent_display_id));
- placement_list.push_back(std::move(placement_value));
+ base::Value::Dict placement_value;
+ placement_value.Set(kPositionKey,
+ DisplayPlacement::PositionToString(placement.position));
+ placement_value.Set(kOffsetKey, placement.offset);
+ placement_value.Set(kDisplayPlacementDisplayIdKey,
+ base::NumberToString(placement.display_id));
+ placement_value.Set(kDisplayPlacementParentDisplayIdKey,
+ base::NumberToString(placement.parent_display_id));
+ placement_list.Append(std::move(placement_value));
}
- value->SetKey(kDisplayPlacementKey, base::Value(std::move(placement_list)));
-
- return true;
+ dict.Set(kDisplayPlacementKey, std::move(placement_list));
}
} // namespace display
diff --git a/chromium/ui/display/manager/json_converter.h b/chromium/ui/display/manager/json_converter.h
index 5082e761c01..90c8d1c029b 100644
--- a/chromium/ui/display/manager/json_converter.h
+++ b/chromium/ui/display/manager/json_converter.h
@@ -5,20 +5,23 @@
#ifndef UI_DISPLAY_MANAGER_JSON_CONVERTER_H_
#define UI_DISPLAY_MANAGER_JSON_CONVERTER_H_
+#include "base/values.h"
#include "ui/display/manager/display_manager_export.h"
-namespace base {
-class Value;
-}
-
namespace display {
class DisplayLayout;
+DISPLAY_MANAGER_EXPORT bool JsonToDisplayLayout(const base::Value::Dict& dict,
+ DisplayLayout* layout);
+
+// This will return false if `value` is not a dict.
+// Otherwise this will call the overload above.
DISPLAY_MANAGER_EXPORT bool JsonToDisplayLayout(const base::Value& value,
DisplayLayout* layout);
-DISPLAY_MANAGER_EXPORT bool DisplayLayoutToJson(const DisplayLayout& layout,
- base::Value* value);
+// This will modify `dict` in place.
+DISPLAY_MANAGER_EXPORT void DisplayLayoutToJson(const DisplayLayout& layout,
+ base::Value::Dict& dict);
} // namespace display
diff --git a/chromium/ui/display/manager/json_converter_unittest.cc b/chromium/ui/display/manager/json_converter_unittest.cc
index 8ddeba20f04..4b36613ae2e 100644
--- a/chromium/ui/display/manager/json_converter_unittest.cc
+++ b/chromium/ui/display/manager/json_converter_unittest.cc
@@ -28,8 +28,8 @@ TEST(JsonConverterTest, JsonFromToDisplayLayout) {
layout.placement_list[1].position = DisplayPlacement::LEFT;
layout.placement_list[1].offset = 30;
- base::Value value(base::Value::Type::DICTIONARY);
- DisplayLayoutToJson(layout, &value);
+ base::Value::Dict value;
+ DisplayLayoutToJson(layout, value);
const char data[] =
"{\n"
@@ -47,14 +47,14 @@ TEST(JsonConverterTest, JsonFromToDisplayLayout) {
" \"offset\": 30\n"
" }]\n"
"}";
- base::JSONReader::ValueWithError result =
- base::JSONReader::ReadAndReturnValueWithError(data, 0);
- ASSERT_TRUE(result.value) << result.error_message << " at "
- << result.error_line << ":" << result.error_column;
- EXPECT_EQ(value, result.value.value());
+ auto result = base::JSONReader::ReadAndReturnValueWithError(data, 0);
+ ASSERT_TRUE(result.has_value())
+ << result.error().message << " at " << result.error().line << ":"
+ << result.error().column;
+ EXPECT_EQ(base::Value(std::move(value)), *result);
DisplayLayout read_layout;
- EXPECT_TRUE(JsonToDisplayLayout(result.value.value(), &read_layout));
+ EXPECT_TRUE(JsonToDisplayLayout(*result, &read_layout));
EXPECT_EQ(read_layout.primary_id, layout.primary_id);
EXPECT_EQ(read_layout.default_unified, layout.default_unified);
EXPECT_TRUE(read_layout.HasSamePlacementList(layout));
@@ -68,13 +68,13 @@ TEST(JsonConverterTest, OldJsonToDisplayLayout) {
" \"position\": \"bottom\",\n"
" \"offset\": 20\n"
"}";
- base::JSONReader::ValueWithError result =
- base::JSONReader::ReadAndReturnValueWithError(data, 0);
- ASSERT_TRUE(result.value) << result.error_message << " at "
- << result.error_line << ":" << result.error_column;
+ auto result = base::JSONReader::ReadAndReturnValueWithError(data, 0);
+ ASSERT_TRUE(result.has_value())
+ << result.error().message << " at " << result.error().line << ":"
+ << result.error().column;
DisplayLayout read_layout;
- EXPECT_TRUE(JsonToDisplayLayout(result.value.value(), &read_layout));
+ EXPECT_TRUE(JsonToDisplayLayout(*result, &read_layout));
EXPECT_EQ(1, read_layout.primary_id);
EXPECT_FALSE(read_layout.default_unified);
ASSERT_EQ(1u, read_layout.placement_list.size());
diff --git a/chromium/ui/display/manager/managed_display_info.cc b/chromium/ui/display/manager/managed_display_info.cc
index 306b0196d23..755a503cfe7 100644
--- a/chromium/ui/display/manager/managed_display_info.cc
+++ b/chromium/ui/display/manager/managed_display_info.cc
@@ -13,6 +13,7 @@
#include "base/format_macros.h"
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_piece_forward.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
@@ -26,6 +27,7 @@
#include "ui/gfx/display_color_spaces.h"
#include "ui/gfx/geometry/dip_util.h"
#include "ui/gfx/geometry/insets_conversions.h"
+#include "ui/gfx/geometry/rounded_corners_f.h"
#include "ui/gfx/geometry/size_conversions.h"
#include "ui/gfx/geometry/size_f.h"
@@ -168,11 +170,37 @@ ManagedDisplayInfo ManagedDisplayInfo::CreateFromSpecWithID(
const int kDefaultHostWindowHeight = 768;
gfx::Rect bounds_in_native(kDefaultHostWindowX, kDefaultHostWindowY,
kDefaultHostWindowWidth, kDefaultHostWindowHeight);
- std::string main_spec = spec;
+ base::StringPiece main_spec = spec;
+
+ gfx::RoundedCornersF rounded_corners_radii;
+ std::vector<base::StringPiece> parts = base::SplitStringPiece(
+ main_spec, "~", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+ if (parts.size() == 2) {
+ std::vector<base::StringPiece> radii_part = base::SplitStringPiece(
+ parts[1], "|", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+
+ DCHECK(radii_part.size() == 1 || radii_part.size() == 4);
+
+ float radii[4];
+ int radius_in_int = 0;
+ for (size_t idx = 0; idx < radii_part.size(); ++idx) {
+ const base::StringPiece& radius = radii_part[idx];
+ bool conversion_success = base::StringToInt(radius, &radius_in_int);
+ DCHECK(conversion_success);
+ radii[idx] = static_cast<float>(radius_in_int);
+ }
+
+ rounded_corners_radii =
+ (radii_part.size() == 1)
+ ? gfx::RoundedCornersF{radii[0]}
+ : gfx::RoundedCornersF{radii[0], radii[1], radii[2], radii[3]};
+
+ main_spec = parts[0];
+ }
float zoom_factor = 1.0f;
- std::vector<std::string> parts = base::SplitString(
- main_spec, "@", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+ parts = base::SplitStringPiece(main_spec, "@", base::KEEP_WHITESPACE,
+ base::SPLIT_WANT_NONEMPTY);
if (parts.size() == 2) {
double scale_in_double = 0;
if (base::StringToDouble(parts[1], &scale_in_double))
@@ -180,17 +208,16 @@ ManagedDisplayInfo ManagedDisplayInfo::CreateFromSpecWithID(
main_spec = parts[0];
}
- parts = base::SplitString(main_spec, "/", base::KEEP_WHITESPACE,
- base::SPLIT_WANT_NONEMPTY);
+ parts = base::SplitStringPiece(main_spec, "/", base::KEEP_WHITESPACE,
+ base::SPLIT_WANT_NONEMPTY);
Display::Rotation rotation(Display::ROTATE_0);
bool has_overscan = false;
bool has_hdr = false;
if (!parts.empty()) {
main_spec = parts[0];
if (parts.size() >= 2) {
- std::string options = parts[1];
- for (size_t i = 0; i < options.size(); ++i) {
- char c = options[i];
+ base::StringPiece options = parts[1];
+ for (char c : options) {
switch (c) {
case 'o':
has_overscan = true;
@@ -216,32 +243,37 @@ ManagedDisplayInfo ManagedDisplayInfo::CreateFromSpecWithID(
ManagedDisplayModeList display_modes;
if (!main_spec.empty()) {
- GetDisplayBounds(main_spec, &bounds_in_native, &device_scale_factor);
+ GetDisplayBounds(std::string(main_spec), &bounds_in_native,
+ &device_scale_factor);
- parts = base::SplitString(main_spec, "#", base::KEEP_WHITESPACE,
- base::SPLIT_WANT_NONEMPTY);
+ parts = base::SplitStringPiece(main_spec, "#", base::KEEP_WHITESPACE,
+ base::SPLIT_WANT_NONEMPTY);
if (parts.size() == 2) {
size_t native_mode = 0;
int largest_area = -1;
float highest_refresh_rate = -1.0f;
main_spec = parts[0];
- std::string resolution_list = parts[1];
- parts = base::SplitString(resolution_list, "|", base::KEEP_WHITESPACE,
- base::SPLIT_WANT_NONEMPTY);
+ base::StringPiece resolution_list = parts[1];
+ parts =
+ base::SplitStringPiece(resolution_list, "|", base::KEEP_WHITESPACE,
+ base::SPLIT_WANT_NONEMPTY);
for (size_t i = 0; i < parts.size(); ++i) {
gfx::Size size;
float refresh_rate = 60.0f;
bool is_interlaced = false;
gfx::Rect mode_bounds;
- std::vector<std::string> resolution = base::SplitString(
+ std::vector<base::StringPiece> resolution = base::SplitStringPiece(
parts[i], "%", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
float device_scale_factor_for_mode = device_scale_factor;
- GetDisplayBounds(resolution[0], &mode_bounds,
+ GetDisplayBounds(std::string(resolution[0]), &mode_bounds,
&device_scale_factor_for_mode);
size = mode_bounds.size();
- if (resolution.size() > 1)
- sscanf(resolution[1].c_str(), "%f", &refresh_rate);
+ if (resolution.size() > 1) {
+ double refresh_rate_in_double = 0.0;
+ if (base::StringToDouble(resolution[1], &refresh_rate_in_double))
+ refresh_rate = refresh_rate_in_double;
+ }
if (size.GetArea() >= largest_area &&
refresh_rate > highest_refresh_rate) {
// Use mode with largest area and highest refresh rate as native.
@@ -271,6 +303,7 @@ ManagedDisplayInfo ManagedDisplayInfo::CreateFromSpecWithID(
display_info.SetRotation(rotation, Display::RotationSource::USER);
display_info.set_zoom_factor(zoom_factor);
display_info.SetBounds(bounds_in_native);
+ display_info.set_rounded_corners_radii(rounded_corners_radii);
if (!display_modes.size()) {
display_modes.push_back(ManagedDisplayMode(
@@ -386,10 +419,16 @@ void ManagedDisplayInfo::Copy(const ManagedDisplayInfo& native_info) {
display_modes_ = native_info.display_modes_;
maximum_cursor_size_ = native_info.maximum_cursor_size_;
display_color_spaces_ = native_info.display_color_spaces_;
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+ snapshot_color_space_ = native_info.snapshot_color_space_;
+#endif
+
bits_per_channel_ = native_info.bits_per_channel_;
refresh_rate_ = native_info.refresh_rate_;
is_interlaced_ = native_info.is_interlaced_;
native_ = native_info.native_;
+ rounded_corners_radii_ = native_info.rounded_corners_radii_;
// Rotation, color_profile and overscan are given by preference,
// or unit tests. Don't copy if this native_info came from
@@ -458,6 +497,17 @@ gfx::Insets ManagedDisplayInfo::GetOverscanInsetsInPixel() const {
overscan_insets_in_dip_, device_scale_factor_));
}
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+void ManagedDisplayInfo::SetSnapshotColorSpace(
+ const gfx::ColorSpace& snapshot_color) {
+ snapshot_color_space_ = snapshot_color;
+}
+
+gfx::ColorSpace ManagedDisplayInfo::GetSnapshotColorSpace() const {
+ return snapshot_color_space_;
+}
+#endif
+
void ManagedDisplayInfo::SetManagedDisplayModes(
const ManagedDisplayModeList& display_modes) {
display_modes_ = display_modes;
@@ -478,14 +528,15 @@ std::string ManagedDisplayInfo::ToString() const {
std::string result = base::StringPrintf(
"ManagedDisplayInfo[%lld] native bounds=%s, size=%s, device-scale=%g, "
- "display-zoom=%g, overscan=%s, rotation=%d, touchscreen=%s",
+ "display-zoom=%g, overscan=%s, rotation=%d, touchscreen=%s, "
+ "corner_radii=%s",
static_cast<long long int>(id_), bounds_in_native_.ToString().c_str(),
size_in_pixel_.ToString().c_str(), device_scale_factor_, zoom_factor_,
overscan_insets_in_dip_.ToString().c_str(), rotation_degree,
- touch_support_ == Display::TouchSupport::AVAILABLE
- ? "yes"
- : touch_support_ == Display::TouchSupport::UNAVAILABLE ? "no"
- : "unknown");
+ touch_support_ == Display::TouchSupport::AVAILABLE ? "yes"
+ : touch_support_ == Display::TouchSupport::UNAVAILABLE ? "no"
+ : "unknown",
+ rounded_corners_radii_.ToString().c_str());
return result;
}
diff --git a/chromium/ui/display/manager/managed_display_info.h b/chromium/ui/display/manager/managed_display_info.h
index aa264948ab7..2e8e11b3fdc 100644
--- a/chromium/ui/display/manager/managed_display_info.h
+++ b/chromium/ui/display/manager/managed_display_info.h
@@ -12,11 +12,13 @@
#include <vector>
#include "base/files/file_path.h"
+#include "build/chromeos_buildflags.h"
#include "ui/display/display.h"
#include "ui/display/manager/display_manager_export.h"
#include "ui/display/types/display_constants.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/geometry/rounded_corners_f.h"
namespace display {
@@ -85,7 +87,7 @@ class DISPLAY_MANAGER_EXPORT ManagedDisplayInfo {
// The format is
//
// [origin-]widthxheight[*device_scale_factor][#resolutions list]
- // [/<properties>][@zoom-factor]
+ // [/<properties>][@zoom-factor][~rounded-display-radius]
//
// where [] are optional:
// - |origin| is given in x+y- format.
@@ -100,21 +102,34 @@ class DISPLAY_MANAGER_EXPORT ManagedDisplayInfo {
// - |zoom-factor| is floating value, e.g. @1.5 or @1.25.
// - |resolution list| is the list of size that is given in
// |width x height [% refresh_rate]| separated by '|'.
- //
+ // - |rounded_display_radii| is a list of integer values separated by '|'
+ // that specifies the radius of each corner of display with format:
+ // upper_left|upper_right|lower_right|lower_left
+ // If only one radius is specified, |radius|, it is the radius for all four
+ // corners.
// A couple of examples:
// "100x100"
// 100x100 window at 0,0 origin. 1x device scale factor. no overscan.
- // no rotation. 1.0 zoom factor.
+ // no rotation. 1.0 zoom factor. no rounded display.
+ // "100x100~16|16|10|10"
+ // 100x100 window at 0,0 origin. 1x device scale factor. no overscan.
+ // no rotation. 1.0 zoom factor. display with rounded
+ // corners of radii (16,16,10,10).
+ // "5+5-300x200~18"
+ // 300x200 window at 5,5 origin. 2x device scale factor.
+ // no overscan, no rotation. 1.0 zoom factor. display with rounded
+ // corners of radii (18,18,18,18).
// "5+5-300x200*2"
// 300x200 window at 5,5 origin. 2x device scale factor.
- // no overscan, no rotation. 1.0 zoom factor.
+ // no overscan, no rotation. 1.0 zoom factor. no rounded display.
// "300x200/ol"
// 300x200 window at 0,0 origin. 1x device scale factor.
// with 5% overscan. rotated to left (90 degree counter clockwise).
- // 1.0 zoom factor.
+ // 1.0 zoom factor. no rounded display.
// "10+20-300x200/u@1.5"
// 300x200 window at 10,20 origin. 1x device scale factor.
// no overscan. flipped upside-down (180 degree) and 1.5 zoom factor.
+ // no rounded display.
// "200x100#300x200|200x100%59.0|100x100%60"
// 200x100 window at 0,0 origin, with 3 possible resolutions,
// 300x200, 200x100 at 59 Hz, and 100x100 at 60 Hz.
@@ -227,6 +242,12 @@ class DISPLAY_MANAGER_EXPORT ManagedDisplayInfo {
void SetOverscanInsets(const gfx::Insets& insets_in_dip);
gfx::Insets GetOverscanInsetsInPixel() const;
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+ // Snapshot ColorSpace is only valid for Ash Chrome.
+ void SetSnapshotColorSpace(const gfx::ColorSpace& snapshot_color);
+ gfx::ColorSpace GetSnapshotColorSpace() const;
+#endif
+
// Sets/Gets the flag to clear overscan insets.
bool clear_overscan_insets() const { return clear_overscan_insets_; }
void set_clear_overscan_insets(bool clear) { clear_overscan_insets_ = clear; }
@@ -284,6 +305,13 @@ class DISPLAY_MANAGER_EXPORT ManagedDisplayInfo {
int32_t year_of_manufacture() const { return year_of_manufacture_; }
void set_year_of_manufacture(int32_t year) { year_of_manufacture_ = year; }
+ const gfx::RoundedCornersF& rounded_corners_radii() const {
+ return rounded_corners_radii_;
+ }
+ void set_rounded_corners_radii(const gfx::RoundedCornersF radii) {
+ rounded_corners_radii_ = radii;
+ }
+
// Returns a string representation of the ManagedDisplayInfo, excluding
// display modes.
std::string ToString() const;
@@ -363,10 +391,18 @@ class DISPLAY_MANAGER_EXPORT ManagedDisplayInfo {
// Colorimetry information of the Display.
gfx::DisplayColorSpaces display_color_spaces_;
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+ // Color Space information as generated from the display EDID.
+ gfx::ColorSpace snapshot_color_space_;
+#endif
+
// Bit depth of every channel, extracted from its EDID, usually 8, but can be
// 0 if EDID says so or if the EDID (retrieval) was faulty.
uint32_t bits_per_channel_;
+ // Radii for the corners of the display. The default radii is (0, 0, 0, 0).
+ gfx::RoundedCornersF rounded_corners_radii_;
+
// If you add a new member, you need to update Copy().
};
diff --git a/chromium/ui/display/manager/managed_display_info_unittest.cc b/chromium/ui/display/manager/managed_display_info_unittest.cc
index 77feb13e5e5..86048f6b96c 100644
--- a/chromium/ui/display/manager/managed_display_info_unittest.cc
+++ b/chromium/ui/display/manager/managed_display_info_unittest.cc
@@ -4,10 +4,12 @@
#include "ui/display/manager/managed_display_info.h"
+#include "base/test/gtest_util.h"
#include "build/chromeos_buildflags.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/display/display_switches.h"
#include "ui/gfx/display_color_spaces.h"
+#include "ui/gfx/geometry/rounded_corners_f.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "ui/display/manager/touch_device_manager.h"
@@ -26,6 +28,7 @@ TEST_F(DisplayInfoTest, CreateFromSpec) {
EXPECT_EQ(Display::ROTATE_0, info.GetActiveRotation());
EXPECT_EQ(gfx::DisplayColorSpaces(), info.display_color_spaces());
EXPECT_EQ(gfx::Insets(), info.overscan_insets_in_dip());
+ EXPECT_EQ(gfx::RoundedCornersF(0.0), info.rounded_corners_radii());
info = ManagedDisplayInfo::CreateFromSpecWithID("10+20-300x400*2/o", 10);
EXPECT_EQ(gfx::Rect(10, 20, 300, 400), info.bounds_in_native());
@@ -33,6 +36,7 @@ TEST_F(DisplayInfoTest, CreateFromSpec) {
EXPECT_EQ(Display::ROTATE_0, info.GetActiveRotation());
EXPECT_EQ(gfx::DisplayColorSpaces(), info.display_color_spaces());
EXPECT_EQ(gfx::Insets::TLBR(5, 3, 5, 3), info.overscan_insets_in_dip());
+ EXPECT_EQ(gfx::RoundedCornersF(0.0), info.rounded_corners_radii());
info = ManagedDisplayInfo::CreateFromSpecWithID("10+20-300x400*2/oh", 10);
EXPECT_EQ(gfx::Rect(10, 20, 300, 400), info.bounds_in_native());
@@ -58,19 +62,24 @@ TEST_F(DisplayInfoTest, CreateFromSpec) {
// TODO(oshima): This should be rotated too. Fix this.
EXPECT_EQ(gfx::Insets::TLBR(5, 3, 5, 3), info.overscan_insets_in_dip());
- info = ManagedDisplayInfo::CreateFromSpecWithID("10+20-300x400*2/or@1.5", 10);
+ info =
+ ManagedDisplayInfo::CreateFromSpecWithID("10+20-300x400*2/or@1.5~16", 10);
EXPECT_EQ(gfx::Rect(10, 20, 300, 400), info.bounds_in_native());
EXPECT_EQ(gfx::Size(380, 288), info.size_in_pixel());
EXPECT_EQ(Display::ROTATE_90, info.GetActiveRotation());
EXPECT_EQ(gfx::DisplayColorSpaces(), info.display_color_spaces());
EXPECT_EQ(gfx::Insets::TLBR(5, 3, 5, 3), info.overscan_insets_in_dip());
EXPECT_EQ(gfx::Insets::TLBR(10, 6, 10, 6), info.GetOverscanInsetsInPixel());
+ EXPECT_EQ(gfx::RoundedCornersF(16.0), info.rounded_corners_radii());
- info = ManagedDisplayInfo::CreateFromSpecWithID("10+20-300x400*2/l@1.5", 10);
+ info = ManagedDisplayInfo::CreateFromSpecWithID(
+ "10+20-300x400*2/l@1.5~16|16|10|10", 10);
EXPECT_EQ(gfx::Rect(10, 20, 300, 400), info.bounds_in_native());
EXPECT_EQ(Display::ROTATE_270, info.GetActiveRotation());
EXPECT_EQ(1.5f, info.zoom_factor());
EXPECT_EQ(gfx::DisplayColorSpaces(), info.display_color_spaces());
+ EXPECT_EQ(gfx::RoundedCornersF(16.0, 16.0, 10.0, 10.0),
+ info.rounded_corners_radii());
info = ManagedDisplayInfo::CreateFromSpecWithID(
"250x200#300x200|250x200%59.9|150x100%60|150x100*2|200x150*1.25%30", 10);
@@ -111,6 +120,51 @@ TEST_F(DisplayInfoTest, CreateFromSpec) {
EXPECT_EQ(2.0f, info.display_modes()[0].device_scale_factor());
EXPECT_EQ(2.0f, info.display_modes()[1].device_scale_factor());
EXPECT_EQ(1.25f, info.display_modes()[2].device_scale_factor());
+
+ info = ManagedDisplayInfo::CreateFromSpecWithID(
+ "250x200*2#300x200|250x200*1.25|150x100~16|16|10|10", 10);
+ EXPECT_EQ(gfx::Size(150, 100), info.display_modes()[0].size());
+ EXPECT_EQ(gfx::Size(300, 200), info.display_modes()[1].size());
+ EXPECT_EQ(gfx::Size(250, 200), info.display_modes()[2].size());
+ EXPECT_EQ(2.0f, info.display_modes()[0].device_scale_factor());
+ EXPECT_EQ(2.0f, info.display_modes()[1].device_scale_factor());
+ EXPECT_EQ(1.25f, info.display_modes()[2].device_scale_factor());
+ EXPECT_EQ(gfx::RoundedCornersF(16.0, 16.0, 10.0, 10.0),
+ info.rounded_corners_radii());
+}
+
+TEST_F(DisplayInfoTest, ExpectDeathWhenInvalidNumberOfRadiiProvided) {
+ EXPECT_DCHECK_DEATH(
+ ManagedDisplayInfo::CreateFromSpecWithID("200x100~10|15", 10));
+
+ EXPECT_DCHECK_DEATH(
+ ManagedDisplayInfo::CreateFromSpecWithID("200x100~10|10|15", 10));
+}
+
+TEST_F(DisplayInfoTest, ExpectDeathWhenInvalidDisplayRadiusProvided) {
+ EXPECT_DCHECK_DEATH(
+ ManagedDisplayInfo::CreateFromSpecWithID("200x100~1f", 10));
+
+ EXPECT_DCHECK_DEATH(
+ ManagedDisplayInfo::CreateFromSpecWithID("200x100~10.5", 10));
+}
+
+TEST_F(DisplayInfoTest, TestToStringFormat) {
+ ManagedDisplayInfo info =
+ ManagedDisplayInfo::CreateFromSpecWithID("200x100", 10);
+
+ EXPECT_EQ(
+ info.ToString(),
+ "ManagedDisplayInfo[10] native bounds=0,0 200x100, size=200x100, "
+ "device-scale=1, display-zoom=1, overscan=x:0,0 y:0,0, rotation=0, "
+ "touchscreen=unknown, corner_radii=0.000000,0.000000,0.000000,0.000000");
+
+ EXPECT_EQ(
+ info.ToFullString(),
+ "ManagedDisplayInfo[10] native bounds=0,0 200x100, size=200x100, "
+ "device-scale=1, display-zoom=1, overscan=x:0,0 y:0,0, rotation=0, "
+ "touchscreen=unknown, corner_radii=0.000000,0.000000,0.000000,0.000000, "
+ "display_modes==(200x100@60P(N) 1)");
}
} // namespace display
diff --git a/chromium/ui/display/manager/update_display_configuration_task.cc b/chromium/ui/display/manager/update_display_configuration_task.cc
index 75df3bb5082..21cf3d18086 100644
--- a/chromium/ui/display/manager/update_display_configuration_task.cc
+++ b/chromium/ui/display/manager/update_display_configuration_task.cc
@@ -16,6 +16,28 @@
#include "ui/display/types/native_display_delegate.h"
namespace display {
+namespace {
+bool InternalDisplayThrottled(
+ const std::vector<DisplaySnapshot*>& cached_displays) {
+ for (const DisplaySnapshot* display : cached_displays) {
+ if (display->type() == DISPLAY_CONNECTION_TYPE_INTERNAL) {
+ if (!display->current_mode())
+ return false;
+
+ std::vector<const DisplayMode*> modes =
+ GetSeamlessRefreshRateModes(*display, *display->current_mode());
+
+ // Can't be throttled if there are not multiple candidate modes.
+ if (modes.size() < 2)
+ return false;
+
+ return display->current_mode() == *modes.begin();
+ }
+ }
+ // No internal displays
+ return false;
+}
+} // namespace
UpdateDisplayConfigurationTask::UpdateDisplayConfigurationTask(
NativeDisplayDelegate* delegate,
@@ -23,14 +45,18 @@ UpdateDisplayConfigurationTask::UpdateDisplayConfigurationTask(
MultipleDisplayState new_display_state,
chromeos::DisplayPowerState new_power_state,
int power_flags,
+ RefreshRateThrottleState refresh_rate_throttle_state,
bool force_configure,
+ ConfigurationType configuration_type,
ResponseCallback callback)
: delegate_(delegate),
layout_manager_(layout_manager),
new_display_state_(new_display_state),
new_power_state_(new_power_state),
power_flags_(power_flags),
+ refresh_rate_throttle_state_(refresh_rate_throttle_state),
force_configure_(force_configure),
+ configuration_type_(configuration_type),
callback_(std::move(callback)),
requesting_displays_(false) {
delegate_->AddObserver(this);
@@ -73,7 +99,8 @@ void UpdateDisplayConfigurationTask::OnDisplaysUpdated(
VLOG(1) << "OnDisplaysUpdated: new_display_state="
<< MultipleDisplayStateToString(new_display_state_)
<< " new_power_state=" << DisplayPowerStateToString(new_power_state_)
- << " flags=" << power_flags_
+ << " flags=" << power_flags_ << " refresh_rate_throttle_state_="
+ << RefreshRateThrottleStateToString(refresh_rate_throttle_state_)
<< " force_configure=" << force_configure_
<< " display_count=" << cached_displays_.size();
if (ShouldConfigure()) {
@@ -91,14 +118,15 @@ void UpdateDisplayConfigurationTask::EnterState(
ConfigureDisplaysTask::ResponseCallback callback) {
VLOG(2) << "EnterState";
std::vector<DisplayConfigureRequest> requests;
- if (!layout_manager_->GetDisplayLayout(cached_displays_, new_display_state_,
- new_power_state_, &requests)) {
+ if (!layout_manager_->GetDisplayLayout(
+ cached_displays_, new_display_state_, new_power_state_,
+ refresh_rate_throttle_state_, &requests)) {
std::move(callback).Run(ConfigureDisplaysTask::ERROR);
return;
}
if (!requests.empty()) {
configure_task_ = std::make_unique<ConfigureDisplaysTask>(
- delegate_, requests, std::move(callback));
+ delegate_, requests, std::move(callback), configuration_type_);
configure_task_->Run();
} else {
VLOG(2) << "No displays";
@@ -184,6 +212,10 @@ bool UpdateDisplayConfigurationTask::ShouldConfigure() const {
if (new_display_state_ != layout_manager_->GetDisplayState())
return true;
+ if ((refresh_rate_throttle_state_ == kRefreshRateThrottleEnabled) !=
+ InternalDisplayThrottled(cached_displays_))
+ return true;
+
return false;
}
diff --git a/chromium/ui/display/manager/update_display_configuration_task.h b/chromium/ui/display/manager/update_display_configuration_task.h
index e9fe25e07ee..deff9c6c3c8 100644
--- a/chromium/ui/display/manager/update_display_configuration_task.h
+++ b/chromium/ui/display/manager/update_display_configuration_task.h
@@ -32,13 +32,16 @@ class DISPLAY_MANAGER_EXPORT UpdateDisplayConfigurationTask
/*new_display_state=*/MultipleDisplayState,
/*new_power_state=*/chromeos::DisplayPowerState)>;
- UpdateDisplayConfigurationTask(NativeDisplayDelegate* delegate,
- DisplayLayoutManager* layout_manager,
- MultipleDisplayState new_display_state,
- chromeos::DisplayPowerState new_power_state,
- int power_flags,
- bool force_configure,
- ResponseCallback callback);
+ UpdateDisplayConfigurationTask(
+ NativeDisplayDelegate* delegate,
+ DisplayLayoutManager* layout_manager,
+ MultipleDisplayState new_display_state,
+ chromeos::DisplayPowerState new_power_state,
+ int power_flags,
+ RefreshRateThrottleState refresh_rate_throttle_state,
+ bool force_configure,
+ ConfigurationType configuration_type,
+ ResponseCallback callback);
UpdateDisplayConfigurationTask(const UpdateDisplayConfigurationTask&) =
delete;
@@ -96,8 +99,16 @@ class DISPLAY_MANAGER_EXPORT UpdateDisplayConfigurationTask
// DisplayConfigurator.
int power_flags_;
+ // Whether the configuration task should select a low refresh rate
+ // for the internal display.
+ RefreshRateThrottleState refresh_rate_throttle_state_;
+
bool force_configure_;
+ // Whether the configuration task should be done without blanking the
+ // displays.
+ const ConfigurationType configuration_type_;
+
// Used to signal that the task has finished.
ResponseCallback callback_;
diff --git a/chromium/ui/display/manager/update_display_configuration_task_unittest.cc b/chromium/ui/display/manager/update_display_configuration_task_unittest.cc
index 71628b829f6..a012a629bfe 100644
--- a/chromium/ui/display/manager/update_display_configuration_task_unittest.cc
+++ b/chromium/ui/display/manager/update_display_configuration_task_unittest.cc
@@ -95,6 +95,7 @@ class TestDisplayLayoutManager : public DisplayLayoutManager {
const std::vector<DisplaySnapshot*>& displays,
MultipleDisplayState new_display_state,
chromeos::DisplayPowerState new_power_state,
+ RefreshRateThrottleState new_throttle_state,
std::vector<DisplayConfigureRequest>* requests) const override {
gfx::Point origin;
for (DisplaySnapshot* display : displays) {
@@ -233,7 +234,8 @@ TEST_F(UpdateDisplayConfigurationTaskTest, HeadlessConfiguration) {
{
UpdateDisplayConfigurationTask task(
&delegate_, &layout_manager_, MULTIPLE_DISPLAY_STATE_HEADLESS,
- chromeos::DISPLAY_POWER_ALL_ON, 0, false,
+ chromeos::DISPLAY_POWER_ALL_ON, 0, kRefreshRateThrottleEnabled, false,
+ kConfigurationTypeFull,
base::BindOnce(&UpdateDisplayConfigurationTaskTest::ResponseCallback,
base::Unretained(this)));
task.Run();
@@ -252,7 +254,8 @@ TEST_F(UpdateDisplayConfigurationTaskTest, SingleConfiguration) {
{
UpdateDisplayConfigurationTask task(
&delegate_, &layout_manager_, MULTIPLE_DISPLAY_STATE_SINGLE,
- chromeos::DISPLAY_POWER_ALL_ON, 0, false,
+ chromeos::DISPLAY_POWER_ALL_ON, 0, kRefreshRateThrottleEnabled, false,
+ kConfigurationTypeFull,
base::BindOnce(&UpdateDisplayConfigurationTaskTest::ResponseCallback,
base::Unretained(this)));
task.Run();
@@ -262,10 +265,15 @@ TEST_F(UpdateDisplayConfigurationTaskTest, SingleConfiguration) {
EXPECT_TRUE(configuration_status_);
EXPECT_EQ(MULTIPLE_DISPLAY_STATE_SINGLE, display_state_);
EXPECT_EQ(chromeos::DISPLAY_POWER_ALL_ON, power_state_);
- EXPECT_EQ(JoinActions(GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ EXPECT_EQ(JoinActions(kTestModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
&small_mode_})
.c_str(),
- nullptr),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ &small_mode_})
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_.GetActionsAndClear());
}
@@ -275,7 +283,8 @@ TEST_F(UpdateDisplayConfigurationTaskTest, ExtendedConfiguration) {
{
UpdateDisplayConfigurationTask task(
&delegate_, &layout_manager_, MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED,
- chromeos::DISPLAY_POWER_ALL_ON, 0, false,
+ chromeos::DISPLAY_POWER_ALL_ON, 0, kRefreshRateThrottleEnabled, false,
+ kConfigurationTypeFull,
base::BindOnce(&UpdateDisplayConfigurationTaskTest::ResponseCallback,
base::Unretained(this)));
task.Run();
@@ -286,14 +295,23 @@ TEST_F(UpdateDisplayConfigurationTaskTest, ExtendedConfiguration) {
EXPECT_EQ(MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED, display_state_);
EXPECT_EQ(chromeos::DISPLAY_POWER_ALL_ON, power_state_);
EXPECT_EQ(
- JoinActions(GetCrtcAction(
+ JoinActions(kTestModesetStr,
+ GetCrtcAction(
+ {displays_[0]->display_id(), gfx::Point(), &small_mode_})
+ .c_str(),
+ GetCrtcAction({displays_[1]->display_id(),
+ gfx::Point(0, small_mode_.size().height()),
+ &big_mode_})
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcAction(
{displays_[0]->display_id(), gfx::Point(), &small_mode_})
.c_str(),
GetCrtcAction({displays_[1]->display_id(),
gfx::Point(0, small_mode_.size().height()),
&big_mode_})
.c_str(),
- nullptr),
+ kModesetOutcomeSuccess, nullptr),
log_.GetActionsAndClear());
}
@@ -303,7 +321,8 @@ TEST_F(UpdateDisplayConfigurationTaskTest, MirrorConfiguration) {
{
UpdateDisplayConfigurationTask task(
&delegate_, &layout_manager_, MULTIPLE_DISPLAY_STATE_MULTI_MIRROR,
- chromeos::DISPLAY_POWER_ALL_ON, 0, false,
+ chromeos::DISPLAY_POWER_ALL_ON, 0, kRefreshRateThrottleEnabled, false,
+ kConfigurationTypeFull,
base::BindOnce(&UpdateDisplayConfigurationTaskTest::ResponseCallback,
base::Unretained(this)));
task.Run();
@@ -313,13 +332,21 @@ TEST_F(UpdateDisplayConfigurationTaskTest, MirrorConfiguration) {
EXPECT_TRUE(configuration_status_);
EXPECT_EQ(MULTIPLE_DISPLAY_STATE_MULTI_MIRROR, display_state_);
EXPECT_EQ(chromeos::DISPLAY_POWER_ALL_ON, power_state_);
- EXPECT_EQ(JoinActions(GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ EXPECT_EQ(JoinActions(kTestModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
&small_mode_})
.c_str(),
GetCrtcAction({displays_[1]->display_id(), gfx::Point(),
&small_mode_})
.c_str(),
- nullptr),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ &small_mode_})
+ .c_str(),
+ GetCrtcAction({displays_[1]->display_id(), gfx::Point(),
+ &small_mode_})
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
log_.GetActionsAndClear());
}
@@ -330,7 +357,8 @@ TEST_F(UpdateDisplayConfigurationTaskTest, FailMirrorConfiguration) {
{
UpdateDisplayConfigurationTask task(
&delegate_, &layout_manager_, MULTIPLE_DISPLAY_STATE_MULTI_MIRROR,
- chromeos::DISPLAY_POWER_ALL_ON, 0, false,
+ chromeos::DISPLAY_POWER_ALL_ON, 0, kRefreshRateThrottleEnabled, false,
+ kConfigurationTypeFull,
base::BindOnce(&UpdateDisplayConfigurationTaskTest::ResponseCallback,
base::Unretained(this)));
task.Run();
@@ -348,7 +376,8 @@ TEST_F(UpdateDisplayConfigurationTaskTest, FailExtendedConfiguration) {
{
UpdateDisplayConfigurationTask task(
&delegate_, &layout_manager_, MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED,
- chromeos::DISPLAY_POWER_ALL_ON, 0, false,
+ chromeos::DISPLAY_POWER_ALL_ON, 0, kRefreshRateThrottleEnabled, false,
+ kConfigurationTypeFull,
base::BindOnce(&UpdateDisplayConfigurationTaskTest::ResponseCallback,
base::Unretained(this)));
task.Run();
@@ -359,6 +388,7 @@ TEST_F(UpdateDisplayConfigurationTaskTest, FailExtendedConfiguration) {
EXPECT_EQ(
JoinActions(
// All displays will fail to modeset together. Initiate retry logic.
+ kTestModesetStr,
GetCrtcAction(
{displays_[0]->display_id(), gfx::Point(), &small_mode_})
.c_str(),
@@ -366,33 +396,38 @@ TEST_F(UpdateDisplayConfigurationTaskTest, FailExtendedConfiguration) {
gfx::Point(0, small_mode_.size().height()),
&big_mode_})
.c_str(),
+ kModesetOutcomeFailure,
// We first attempt to modeset the internal display with all
// other displays disabled, which will fail.
+ kTestModesetStr,
GetCrtcAction(
{displays_[0]->display_id(), gfx::Point(), &small_mode_})
.c_str(),
GetCrtcAction({displays_[1]->display_id(),
gfx::Point(0, small_mode_.size().height()), nullptr})
.c_str(),
+ kModesetOutcomeFailure,
// Since internal displays are restricted to their preferred mode,
// there are no other modes to try. Disable the internal display when
// we attempt to modeset displays that are connected to other
// connectors. Regardless of what happens next, the configuration will
// still fail completely. External display fail modeset, downgrade
// once, and then fail completely.
+ kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(), nullptr})
.c_str(),
GetCrtcAction({displays_[1]->display_id(),
gfx::Point(0, small_mode_.size().height()),
&big_mode_})
.c_str(),
+ kModesetOutcomeFailure, kTestModesetStr,
GetCrtcAction({displays_[0]->display_id(), gfx::Point(), nullptr})
.c_str(),
GetCrtcAction({displays_[1]->display_id(),
gfx::Point(0, small_mode_.size().height()),
&small_mode_})
.c_str(),
- nullptr),
+ kModesetOutcomeFailure, nullptr),
log_.GetActionsAndClear());
}
@@ -402,7 +437,8 @@ TEST_F(UpdateDisplayConfigurationTaskTest, SingleChangePowerConfiguration) {
{
UpdateDisplayConfigurationTask task(
&delegate_, &layout_manager_, MULTIPLE_DISPLAY_STATE_SINGLE,
- chromeos::DISPLAY_POWER_ALL_ON, 0, false,
+ chromeos::DISPLAY_POWER_ALL_ON, 0, kRefreshRateThrottleEnabled, false,
+ kConfigurationTypeFull,
base::BindOnce(&UpdateDisplayConfigurationTaskTest::ResponseCallback,
base::Unretained(this)));
task.Run();
@@ -412,17 +448,23 @@ TEST_F(UpdateDisplayConfigurationTaskTest, SingleChangePowerConfiguration) {
EXPECT_TRUE(configuration_status_);
EXPECT_EQ(MULTIPLE_DISPLAY_STATE_SINGLE, display_state_);
EXPECT_EQ(chromeos::DISPLAY_POWER_ALL_ON, power_state_);
- EXPECT_EQ(JoinActions(GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ EXPECT_EQ(JoinActions(kTestModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ &small_mode_})
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
&small_mode_})
.c_str(),
- nullptr),
+ kModesetOutcomeSuccess, nullptr),
log_.GetActionsAndClear());
// Turn power off
{
UpdateDisplayConfigurationTask task(
&delegate_, &layout_manager_, MULTIPLE_DISPLAY_STATE_SINGLE,
- chromeos::DISPLAY_POWER_ALL_OFF, 0, false,
+ chromeos::DISPLAY_POWER_ALL_OFF, 0, kRefreshRateThrottleEnabled, false,
+ kConfigurationTypeFull,
base::BindOnce(&UpdateDisplayConfigurationTaskTest::ResponseCallback,
base::Unretained(this)));
task.Run();
@@ -431,11 +473,16 @@ TEST_F(UpdateDisplayConfigurationTaskTest, SingleChangePowerConfiguration) {
EXPECT_TRUE(configuration_status_);
EXPECT_EQ(MULTIPLE_DISPLAY_STATE_SINGLE, display_state_);
EXPECT_EQ(chromeos::DISPLAY_POWER_ALL_OFF, power_state_);
- EXPECT_EQ(JoinActions(GetCrtcAction(
- {displays_[0]->display_id(), gfx::Point(), nullptr})
- .c_str(),
- nullptr),
- log_.GetActionsAndClear());
+ EXPECT_EQ(
+ JoinActions(
+ kTestModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(), nullptr})
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(), nullptr})
+ .c_str(),
+ kModesetOutcomeSuccess, nullptr),
+ log_.GetActionsAndClear());
}
TEST_F(UpdateDisplayConfigurationTaskTest, NoopSoftwareMirrorConfiguration) {
@@ -447,7 +494,8 @@ TEST_F(UpdateDisplayConfigurationTaskTest, NoopSoftwareMirrorConfiguration) {
{
UpdateDisplayConfigurationTask task(
&delegate_, &layout_manager_, MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED,
- chromeos::DISPLAY_POWER_ALL_ON, 0, false,
+ chromeos::DISPLAY_POWER_ALL_ON, 0, kRefreshRateThrottleEnabled, false,
+ kConfigurationTypeFull,
base::BindOnce(&UpdateDisplayConfigurationTaskTest::ResponseCallback,
base::Unretained(this)));
task.Run();
@@ -458,7 +506,8 @@ TEST_F(UpdateDisplayConfigurationTaskTest, NoopSoftwareMirrorConfiguration) {
{
UpdateDisplayConfigurationTask task(
&delegate_, &layout_manager_, MULTIPLE_DISPLAY_STATE_MULTI_MIRROR,
- chromeos::DISPLAY_POWER_ALL_ON, 0, false,
+ chromeos::DISPLAY_POWER_ALL_ON, 0, kRefreshRateThrottleEnabled, false,
+ kConfigurationTypeFull,
base::BindOnce(&UpdateDisplayConfigurationTaskTest::ResponseCallback,
base::Unretained(this)));
task.Run();
@@ -481,7 +530,8 @@ TEST_F(UpdateDisplayConfigurationTaskTest,
{
UpdateDisplayConfigurationTask task(
&delegate_, &layout_manager_, MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED,
- chromeos::DISPLAY_POWER_ALL_ON, 0, false,
+ chromeos::DISPLAY_POWER_ALL_ON, 0, kRefreshRateThrottleEnabled, false,
+ kConfigurationTypeFull,
base::BindOnce(&UpdateDisplayConfigurationTaskTest::ResponseCallback,
base::Unretained(this)));
task.Run();
@@ -492,7 +542,8 @@ TEST_F(UpdateDisplayConfigurationTaskTest,
{
UpdateDisplayConfigurationTask task(
&delegate_, &layout_manager_, MULTIPLE_DISPLAY_STATE_MULTI_MIRROR,
- chromeos::DISPLAY_POWER_ALL_ON, 0, true /* force_configure */,
+ chromeos::DISPLAY_POWER_ALL_ON, 0, kRefreshRateThrottleEnabled,
+ true /* force_configure */, kConfigurationTypeFull,
base::BindOnce(&UpdateDisplayConfigurationTaskTest::ResponseCallback,
base::Unretained(this)));
task.Run();
@@ -503,14 +554,23 @@ TEST_F(UpdateDisplayConfigurationTaskTest,
EXPECT_TRUE(layout_manager_.GetSoftwareMirroringController()
->SoftwareMirroringEnabled());
EXPECT_EQ(
- JoinActions(GetCrtcAction(
+ JoinActions(kTestModesetStr,
+ GetCrtcAction(
+ {displays_[0]->display_id(), gfx::Point(), &small_mode_})
+ .c_str(),
+ GetCrtcAction({displays_[1]->display_id(),
+ gfx::Point(0, small_mode_.size().height()),
+ &big_mode_})
+ .c_str(),
+ kModesetOutcomeSuccess, kCommitModesetStr,
+ GetCrtcAction(
{displays_[0]->display_id(), gfx::Point(), &small_mode_})
.c_str(),
GetCrtcAction({displays_[1]->display_id(),
gfx::Point(0, small_mode_.size().height()),
&big_mode_})
.c_str(),
- nullptr),
+ kModesetOutcomeSuccess, nullptr),
log_.GetActionsAndClear());
}
diff --git a/chromium/ui/display/screen.cc b/chromium/ui/display/screen.cc
index b9723889cef..1ad4d11c675 100644
--- a/chromium/ui/display/screen.cc
+++ b/chromium/ui/display/screen.cc
@@ -85,26 +85,11 @@ void Screen::SetDisplayForNewWindows(int64_t display_id) {
}
#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
-std::unique_ptr<Screen::ScreenSaverSuspender> Screen::SuspendScreenSaver() {
- SetScreenSaverSuspended(true);
- screen_saver_suspension_count_++;
- return base::WrapUnique(new Screen::ScreenSaverSuspender(this));
-}
-
-Screen::ScreenSaverSuspender::~ScreenSaverSuspender() {
- // Check that this suspender still refers to the active screen. Particularly
- // in tests, the screen might be destructed before the suspender.
- if (screen_ == GetScreen()) {
- screen_->screen_saver_suspension_count_--;
- if (screen_->screen_saver_suspension_count_ == 0) {
- screen_->SetScreenSaverSuspended(false);
- }
- }
-}
+Screen::ScreenSaverSuspender::~ScreenSaverSuspender() = default;
-bool Screen::SetScreenSaverSuspended(bool suspend) {
+std::unique_ptr<Screen::ScreenSaverSuspender> Screen::SuspendScreenSaver() {
NOTIMPLEMENTED_LOG_ONCE();
- return false;
+ return nullptr;
}
#endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
@@ -152,9 +137,9 @@ std::string Screen::GetCurrentWorkspace() {
return {};
}
-std::vector<base::Value> Screen::GetGpuExtraInfo(
+base::Value::List Screen::GetGpuExtraInfo(
const gfx::GpuExtraInfo& gpu_extra_info) {
- return std::vector<base::Value>();
+ return base::Value::List();
}
void Screen::SetScopedDisplayForNewWindows(int64_t display_id) {
diff --git a/chromium/ui/display/screen.h b/chromium/ui/display/screen.h
index a86c5b63cca..f168ea2775f 100644
--- a/chromium/ui/display/screen.h
+++ b/chromium/ui/display/screen.h
@@ -10,6 +10,7 @@
#include <vector>
#include "base/location.h"
+#include "base/memory/raw_ptr.h"
#include "base/values.h"
#include "build/build_config.h"
#include "ui/display/display.h"
@@ -133,28 +134,22 @@ class DISPLAY_EXPORT Screen {
// its existence.
class ScreenSaverSuspender {
public:
- ScreenSaverSuspender(const Screen&) = delete;
- ScreenSaverSuspender& operator=(const Screen&) = delete;
+ ScreenSaverSuspender() = default;
- // Notifies |screen_| that this instance is being destructed, and causes its
- // platform-specific screensaver to be un-suspended if this is the last such
- // remaining instance.
- ~ScreenSaverSuspender();
+ ScreenSaverSuspender(const ScreenSaverSuspender&) = delete;
+ ScreenSaverSuspender& operator=(const ScreenSaverSuspender&) = delete;
- private:
- friend class Screen;
-
- explicit ScreenSaverSuspender(Screen* screen) : screen_(screen) {}
-
- Screen* screen_;
+ // Causes the platform-specific screensaver to be un-suspended iff this is
+ // the last remaining instance.
+ virtual ~ScreenSaverSuspender() = 0;
};
// Suspends the platform-specific screensaver until the returned
- // |ScreenSaverSuspender| is destructed. This method allows stacking multiple
- // overlapping calls, such that the platform-specific screensaver will not be
- // un-suspended until all returned |SreenSaverSuspender| instances have been
- // destructed.
- std::unique_ptr<ScreenSaverSuspender> SuspendScreenSaver();
+ // |ScreenSaverSuspender| is destructed, or returns nullptr if suspension
+ // failed. This method allows stacking multiple overlapping calls, such that
+ // the platform-specific screensaver will not be un-suspended until all
+ // returned |ScreenSaverSuspender| instances have been destructed.
+ virtual std::unique_ptr<ScreenSaverSuspender> SuspendScreenSaver();
#endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
// Returns whether the screensaver is currently running.
@@ -196,16 +191,10 @@ class DISPLAY_EXPORT Screen {
// Returns human readable description of the window manager, desktop, and
// other system properties related to the compositing.
- virtual std::vector<base::Value> GetGpuExtraInfo(
+ virtual base::Value::List GetGpuExtraInfo(
const gfx::GpuExtraInfo& gpu_extra_info);
protected:
-#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
- // Suspends or un-suspends the platform-specific screensaver, and returns
- // whether the operation was successful.
- virtual bool SetScreenSaverSuspended(bool suspend);
-#endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
-
void set_shutdown(bool shutdown) { shutdown_ = shutdown; }
private:
diff --git a/chromium/ui/display/types/display_constants.h b/chromium/ui/display/types/display_constants.h
index 608c96000ed..abc5be90b11 100644
--- a/chromium/ui/display/types/display_constants.h
+++ b/chromium/ui/display/types/display_constants.h
@@ -117,6 +117,33 @@ enum PrivacyScreenState {
kPrivacyScreenStateLast = kNotSupported,
};
+// The requested state for refresh rate throttling.
+enum RefreshRateThrottleState {
+ kRefreshRateThrottleEnabled,
+ kRefreshRateThrottleDisabled,
+};
+
+// Whether a configuration should be seamless or full. Full configuration may
+// result in visible artifacts such as blanking to achieve the specified
+// configuration. Seamless configuration requests will fail if the system cannot
+// achieve it without visible artifacts.
+enum ConfigurationType {
+ kConfigurationTypeFull,
+ kConfigurationTypeSeamless,
+};
+
+// A flag to allow ui/display and ozone to adjust the behavior of display
+// configurations.
+enum ModesetFlag {
+ // At least one of kTestModeset and kCommitModeset must be set.
+ kTestModeset = 1 << 0,
+ kCommitModeset = 1 << 1,
+ // When |kSeamlessModeset| is set, the commit (or test) will succeed only if
+ // the submitted configuration can be completed without visual artifacts such
+ // as blanking.
+ kSeamlessModeset = 1 << 2,
+};
+
// Defines the float values closest to repeating decimal scale factors.
constexpr float kDsf_1_777 = 1.77777779102325439453125f;
constexpr float kDsf_2_252 = 2.2522523403167724609375f;
diff --git a/chromium/ui/display/types/native_display_delegate.h b/chromium/ui/display/types/native_display_delegate.h
index eddfe5adda1..0e3e78a5eee 100644
--- a/chromium/ui/display/types/native_display_delegate.h
+++ b/chromium/ui/display/types/native_display_delegate.h
@@ -53,13 +53,14 @@ class DISPLAY_TYPES_EXPORT NativeDisplayDelegate {
// Note the query operation may be expensive and take over 60 milliseconds.
virtual void GetDisplays(GetDisplaysCallback callback) = 0;
- // Configures the display represented by |output| to use |mode| and positions
- // the display to |origin| in the framebuffer. |mode| can be NULL, which
- // represents disabling the display. The callback will return the status of
- // the operation.
+ // Configures the displays represented by |config_requests| to use |mode| and
+ // positions the display to |origin| in the framebuffer. The callback will
+ // return the status of the operation. Adjusts the behavior of the commit
+ // according to |modeset_flag| (see display::ModesetFlag).
virtual void Configure(
const std::vector<display::DisplayConfigurationParams>& config_requests,
- ConfigureCallback callback) = 0;
+ ConfigureCallback callback,
+ uint32_t modeset_flag) = 0;
// Gets HDCP state of output.
virtual void GetHDCPState(const DisplaySnapshot& output,
diff --git a/chromium/ui/display/win/display_info.cc b/chromium/ui/display/win/display_info.cc
index 91bc0872fa5..6d392b76df4 100644
--- a/chromium/ui/display/win/display_info.cc
+++ b/chromium/ui/display/win/display_info.cc
@@ -17,7 +17,8 @@ DisplayInfo::DisplayInfo(
Display::Rotation rotation,
int display_frequency,
const gfx::Vector2dF& pixels_per_inch,
- DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY output_technology)
+ DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY output_technology,
+ const std::string& label)
: id_(DeviceIdFromDeviceName(monitor_info.szDevice)),
screen_rect_(monitor_info.rcMonitor),
screen_work_rect_(monitor_info.rcWork),
@@ -26,7 +27,21 @@ DisplayInfo::DisplayInfo(
rotation_(rotation),
display_frequency_(display_frequency),
pixels_per_inch_(pixels_per_inch),
- output_technology_(output_technology) {}
+ output_technology_(output_technology),
+ label_(label) {}
+
+DisplayInfo::DisplayInfo(const DisplayInfo& other) {
+ id_ = other.id_;
+ screen_rect_ = other.screen_rect_;
+ screen_work_rect_ = other.screen_work_rect_;
+ device_scale_factor_ = other.device_scale_factor_;
+ sdr_white_level_ = other.sdr_white_level_;
+ rotation_ = other.rotation_;
+ display_frequency_ = other.display_frequency_;
+ pixels_per_inch_ = other.pixels_per_inch_;
+ output_technology_ = other.output_technology_;
+ label_ = other.label_;
+}
DisplayInfo::~DisplayInfo() = default;
@@ -35,5 +50,16 @@ int64_t DisplayInfo::DeviceIdFromDeviceName(const wchar_t* device_name) {
return static_cast<int64_t>(base::Hash(base::WideToUTF8(device_name)));
}
+bool DisplayInfo::operator==(const DisplayInfo& rhs) const {
+ return id_ == rhs.id_ && screen_rect_ == rhs.screen_rect_ &&
+ screen_work_rect_ == rhs.screen_work_rect_ &&
+ device_scale_factor_ == rhs.device_scale_factor_ &&
+ sdr_white_level_ == rhs.sdr_white_level_ &&
+ rotation_ == rhs.rotation_ &&
+ display_frequency_ == rhs.display_frequency_ &&
+ pixels_per_inch_ == rhs.pixels_per_inch_ &&
+ output_technology_ == rhs.output_technology_ && label_ == rhs.label_;
+}
+
} // namespace win
} // namespace display
diff --git a/chromium/ui/display/win/display_info.h b/chromium/ui/display/win/display_info.h
index f6c689b9a8f..1c1727d9d4f 100644
--- a/chromium/ui/display/win/display_info.h
+++ b/chromium/ui/display/win/display_info.h
@@ -23,7 +23,9 @@ class DISPLAY_EXPORT DisplayInfo final {
Display::Rotation rotation,
int display_frequency,
const gfx::Vector2dF& pixels_per_inch,
- DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY output_technology);
+ DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY output_technology,
+ const std::string& label);
+ DisplayInfo(const DisplayInfo& other);
~DisplayInfo();
static int64_t DeviceIdFromDeviceName(const wchar_t* device_name);
@@ -39,6 +41,10 @@ class DISPLAY_EXPORT DisplayInfo final {
DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY output_technology() const {
return output_technology_;
}
+ const std::string& label() const { return label_; }
+
+ bool operator==(const DisplayInfo& rhs) const;
+ bool operator!=(const DisplayInfo& rhs) const { return !(*this == rhs); }
private:
int64_t id_;
@@ -52,6 +58,7 @@ class DISPLAY_EXPORT DisplayInfo final {
// monitors. In non-touch cases, it will be set to Zero.
gfx::Vector2dF pixels_per_inch_;
DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY output_technology_;
+ std::string label_;
};
} // namespace win
diff --git a/chromium/ui/display/win/scaling_util_unittest.cc b/chromium/ui/display/win/scaling_util_unittest.cc
index 79c1a04bb10..d74b611bdc9 100644
--- a/chromium/ui/display/win/scaling_util_unittest.cc
+++ b/chromium/ui/display/win/scaling_util_unittest.cc
@@ -21,7 +21,8 @@ DisplayInfo CreateDisplayInfo(int x, int y, int width, int height,
gfx::Rect(x, y, width, height),
kFakeDisplayName);
return DisplayInfo(monitor_info, scale_factor, 1.0f, Display::ROTATE_0, 60,
- gfx::Vector2dF(), DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER);
+ gfx::Vector2dF(), DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER,
+ std::string());
}
::testing::AssertionResult AssertOffsetsEqual(
diff --git a/chromium/ui/display/win/screen_win.cc b/chromium/ui/display/win/screen_win.cc
index 848b104d6a8..7a1fb26dffa 100644
--- a/chromium/ui/display/win/screen_win.cc
+++ b/chromium/ui/display/win/screen_win.cc
@@ -129,6 +129,24 @@ absl::optional<DISPLAYCONFIG_PATH_INFO> GetPathInfo(HMONITOR monitor) {
return absl::nullopt;
}
+// Gets a user-friendly name for a given display using EDID data. Returns an
+// empty string if the provided path is unset/nullopt or EDID data is not
+// available for the device.
+std::string GetFriendlyDeviceName(
+ const absl::optional<DISPLAYCONFIG_PATH_INFO>& path) {
+ if (!path)
+ return std::string();
+ DISPLAYCONFIG_TARGET_DEVICE_NAME targetName = {};
+ targetName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;
+ targetName.header.size = sizeof(targetName);
+ targetName.header.adapterId = path->targetInfo.adapterId;
+ targetName.header.id = path->targetInfo.id;
+ LONG result = DisplayConfigGetDeviceInfo(&targetName.header);
+ if (result == ERROR_SUCCESS && targetName.flags.friendlyNameFromEdid)
+ return base::WideToUTF8(targetName.monitorFriendlyDeviceName);
+ return std::string();
+}
+
float GetSDRWhiteLevel(const absl::optional<DISPLAYCONFIG_PATH_INFO>& path) {
if (path) {
DISPLAYCONFIG_SDR_WHITE_LEVEL white_level = {};
@@ -289,6 +307,7 @@ Display CreateDisplayFromDisplayInfo(
display_info.screen_work_rect(), 1.0f / scale_factor));
display.set_rotation(display_info.rotation());
display.set_display_frequency(display_info.display_frequency());
+ display.set_label(display_info.label());
// DisplayColorSpaces is created using the forced color profile if present, or
// from the ICC profile provided by |color_profile_reader| for SDR content,
@@ -477,7 +496,7 @@ BOOL CALLBACK EnumMonitorForDisplayInfoCallback(HMONITOR monitor,
display_infos->emplace_back(
monitor_info, GetMonitorScaleFactor(monitor), GetSDRWhiteLevel(path_info),
display_settings.rotation, display_settings.frequency, pixels_per_inch,
- GetOutputTechnology(path_info));
+ GetOutputTechnology(path_info), GetFriendlyDeviceName(path_info));
return TRUE;
}
@@ -932,7 +951,9 @@ ScreenWinDisplay ScreenWin::GetPrimaryScreenWinDisplay() const {
const ScreenWinDisplay screen_win_display = GetScreenWinDisplay(
MonitorInfoFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY));
// The Windows primary monitor is defined to have an origin of (0, 0).
- DCHECK(screen_win_display.display().bounds().origin().IsOrigin());
+ // Don't DCHECK if GetScreenWinDisplay returns the default monitor.
+ DCHECK(screen_win_display.display().bounds().origin().IsOrigin() ||
+ !screen_win_display.display().is_valid());
return screen_win_display;
}
diff --git a/chromium/ui/display/win/screen_win_display.cc b/chromium/ui/display/win/screen_win_display.cc
index 322c470ef6a..5e272b53aaf 100644
--- a/chromium/ui/display/win/screen_win_display.cc
+++ b/chromium/ui/display/win/screen_win_display.cc
@@ -20,6 +20,7 @@ Display CreateDisplayFromDisplayInfo(const DisplayInfo& display_info) {
1.0f / scale_factor));
display.set_rotation(display_info.rotation());
display.set_display_frequency(display_info.display_frequency());
+ display.set_label(display_info.label());
return display;
}
diff --git a/chromium/ui/display/win/screen_win_unittest.cc b/chromium/ui/display/win/screen_win_unittest.cc
index ea12f4a4c5c..5a1210e96c2 100644
--- a/chromium/ui/display/win/screen_win_unittest.cc
+++ b/chromium/ui/display/win/screen_win_unittest.cc
@@ -165,9 +165,9 @@ class TestScreenWinManager final : public TestScreenWinInitializer {
MONITORINFOEX monitor_info =
win::test::CreateMonitorInfo(pixel_bounds, pixel_work, device_name);
monitor_infos_.push_back(monitor_info);
- display_infos_.push_back(DisplayInfo(monitor_info, device_scale_factor,
- 1.0f, Display::ROTATE_0, 60,
- gfx::Vector2dF(), tech));
+ display_infos_.push_back(
+ DisplayInfo(monitor_info, device_scale_factor, 1.0f, Display::ROTATE_0,
+ 60, gfx::Vector2dF(), tech, std::string()));
}
HWND CreateFakeHwnd(const gfx::Rect& bounds) override {
diff --git a/chromium/ui/events/BUILD.gn b/chromium/ui/events/BUILD.gn
index 62b4dd632d6..43216a5eb90 100644
--- a/chromium/ui/events/BUILD.gn
+++ b/chromium/ui/events/BUILD.gn
@@ -19,7 +19,7 @@ if (is_ios) {
static_library("dom_keycode_converter") {
public = [
"keycodes/dom/dom_code.h",
- "keycodes/dom/dom_codes.h",
+ "keycodes/dom/dom_codes_array.h",
"keycodes/dom/dom_key.h",
"keycodes/dom/keycode_converter.h",
]
@@ -516,6 +516,8 @@ static_library("test_support") {
"test/motion_event_test_utils.h",
"test/platform_event_source_test_api.cc",
"test/platform_event_source_test_api.h",
+ "test/test_event.cc",
+ "test/test_event.h",
"test/test_event_handler.cc",
"test/test_event_handler.h",
"test/test_event_processor.cc",
diff --git a/chromium/ui/events/OWNERS b/chromium/ui/events/OWNERS
index 7c6fd6febf5..ff88de754f4 100644
--- a/chromium/ui/events/OWNERS
+++ b/chromium/ui/events/OWNERS
@@ -1,4 +1,3 @@
-sadrul@chromium.org
# If you're doing structural changes get a review from one of the OWNERS.
per-file BUILD.gn=*
diff --git a/chromium/ui/events/blink/web_input_event.cc b/chromium/ui/events/blink/web_input_event.cc
index 1b7d11a6362..340c42f49f2 100644
--- a/chromium/ui/events/blink/web_input_event.cc
+++ b/chromium/ui/events/blink/web_input_event.cc
@@ -473,7 +473,9 @@ blink::WebMouseWheelEvent MakeWebMouseWheelEventFromUiEvent(
// TODO(yshalivskyy) Currently, for page based scrolling we always scroll
// by one page dismissing delta_y/delta_x values. https://crbug.com/1196092
if (features::IsPercentBasedScrollingEnabled() &&
- webkit_event.delta_units != ui::ScrollGranularity::kScrollByPage) {
+ webkit_event.delta_units != ui::ScrollGranularity::kScrollByPage &&
+ webkit_event.delta_units !=
+ ui::ScrollGranularity::kScrollByPrecisePixel) {
webkit_event.delta_units = ui::ScrollGranularity::kScrollByPercentage;
webkit_event.delta_y *=
(kScrollPercentPerLineOrChar / MouseWheelEvent::kWheelDelta);
diff --git a/chromium/ui/events/blink/web_input_event_builders_win_unittest.cc b/chromium/ui/events/blink/web_input_event_builders_win_unittest.cc
index 9013363bbee..4345611ee42 100644
--- a/chromium/ui/events/blink/web_input_event_builders_win_unittest.cc
+++ b/chromium/ui/events/blink/web_input_event_builders_win_unittest.cc
@@ -54,7 +54,8 @@ TEST(WebInputEventBuilderTest, TestMouseEventScale) {
TEST(WebInputEventBuilderTest, TestPercentMouseWheelScroll) {
base::test::ScopedFeatureList scoped_feature_list;
- scoped_feature_list.InitAndEnableFeature(features::kPercentBasedScrolling);
+ scoped_feature_list.InitAndEnableFeature(
+ features::kWindowsScrollingPersonality);
// We must discount the system scroll settings from the test, as we don't them
// failing if the test machine has different settings.
diff --git a/chromium/ui/events/blink/web_input_event_unittest.cc b/chromium/ui/events/blink/web_input_event_unittest.cc
index 046e3178980..f49908eb255 100644
--- a/chromium/ui/events/blink/web_input_event_unittest.cc
+++ b/chromium/ui/events/blink/web_input_event_unittest.cc
@@ -382,7 +382,8 @@ TEST(WebInputEventTest, TestMakeWebMouseWheelEvent) {
#if !BUILDFLAG(IS_MAC)
TEST(WebInputEventTest, TestPercentMouseWheelScroll) {
base::test::ScopedFeatureList scoped_feature_list;
- scoped_feature_list.InitAndEnableFeature(features::kPercentBasedScrolling);
+ scoped_feature_list.InitAndEnableFeature(
+ features::kWindowsScrollingPersonality);
base::TimeTicks timestamp = EventTimeForNow();
MouseWheelEvent ui_event(gfx::Vector2d(0, -MouseWheelEvent::kWheelDelta),
@@ -427,6 +428,9 @@ TEST(WebInputEventTest, KeyEvent) {
}
TEST(WebInputEventTest, WheelEvent) {
+ base::test::ScopedFeatureList scoped_feature_list;
+ scoped_feature_list.InitAndDisableFeature(
+ features::kWindowsScrollingPersonality);
const int kDeltaX = 14;
const int kDeltaY = -3;
ui::MouseWheelEvent ui_event(
diff --git a/chromium/ui/events/event.cc b/chromium/ui/events/event.cc
index 55636136213..4b3edab8577 100644
--- a/chromium/ui/events/event.cc
+++ b/chromium/ui/events/event.cc
@@ -163,38 +163,6 @@ bool IsNearZero(const float num) {
////////////////////////////////////////////////////////////////////////////////
// Event
-// static
-std::unique_ptr<Event> Event::Clone(const Event& event) {
- if (event.IsKeyEvent()) {
- return std::make_unique<KeyEvent>(static_cast<const KeyEvent&>(event));
- }
-
- if (event.IsMouseEvent()) {
- if (event.IsMouseWheelEvent()) {
- return std::make_unique<MouseWheelEvent>(
- static_cast<const MouseWheelEvent&>(event));
- }
-
- return std::make_unique<MouseEvent>(static_cast<const MouseEvent&>(event));
- }
-
- if (event.IsTouchEvent()) {
- return std::make_unique<TouchEvent>(static_cast<const TouchEvent&>(event));
- }
-
- if (event.IsGestureEvent()) {
- return std::make_unique<GestureEvent>(
- static_cast<const GestureEvent&>(event));
- }
-
- if (event.IsScrollEvent()) {
- return std::make_unique<ScrollEvent>(
- static_cast<const ScrollEvent&>(event));
- }
-
- return base::WrapUnique(new Event(event));
-}
-
Event::~Event() {
if (delete_native_event_)
ReleaseCopiedNativeEvent(native_event_);
@@ -400,6 +368,10 @@ CancelModeEvent::CancelModeEvent()
CancelModeEvent::~CancelModeEvent() = default;
+std::unique_ptr<Event> CancelModeEvent::Clone() const {
+ return std::make_unique<CancelModeEvent>(*this);
+}
+
////////////////////////////////////////////////////////////////////////////////
// LocatedEvent
@@ -625,6 +597,10 @@ std::string MouseEvent::ToString() const {
" | ")});
}
+std::unique_ptr<Event> MouseEvent::Clone() const {
+ return std::make_unique<MouseEvent>(*this);
+}
+
////////////////////////////////////////////////////////////////////////////////
// MouseWheelEvent
@@ -700,6 +676,10 @@ MouseWheelEvent::MouseWheelEvent(const gfx::Vector2d& offset,
MouseWheelEvent::~MouseWheelEvent() = default;
+std::unique_ptr<Event> MouseWheelEvent::Clone() const {
+ return std::make_unique<MouseWheelEvent>(*this);
+}
+
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)
// This value matches Windows and Fuchsia WHEEL_DELTA.
// static
@@ -819,6 +799,10 @@ float TouchEvent::ComputeRotationAngle() const {
return rotation_angle;
}
+std::unique_ptr<Event> TouchEvent::Clone() const {
+ return std::make_unique<TouchEvent>(*this);
+}
+
////////////////////////////////////////////////////////////////////////////////
// KeyEvent
@@ -1157,6 +1141,10 @@ std::string KeyEvent::ToString() const {
base::JoinString(base::make_span(KeyEventFlagsNames(flags())), " | ")});
}
+std::unique_ptr<Event> KeyEvent::Clone() const {
+ return std::make_unique<KeyEvent>(*this);
+}
+
KeyboardCode KeyEvent::GetLocatedWindowsKeyboardCode() const {
return NonLocatedToLocatedKeyboardCode(key_code_, code_);
}
@@ -1269,6 +1257,10 @@ std::string ScrollEvent::ToString() const {
ScrollEventPhaseToString(scroll_event_phase_).c_str());
}
+std::unique_ptr<Event> ScrollEvent::Clone() const {
+ return std::make_unique<ScrollEvent>(*this);
+}
+
////////////////////////////////////////////////////////////////////////////////
// GestureEvent
@@ -1303,4 +1295,8 @@ std::string GestureEvent::ToString() const {
unique_touch_event_id_);
}
+std::unique_ptr<Event> GestureEvent::Clone() const {
+ return std::make_unique<GestureEvent>(*this);
+}
+
} // namespace ui
diff --git a/chromium/ui/events/event.h b/chromium/ui/events/event.h
index ae5e40ab11e..0d8d8bc2762 100644
--- a/chromium/ui/events/event.h
+++ b/chromium/ui/events/event.h
@@ -44,14 +44,13 @@ class TouchEvent;
enum class DomCode;
+// Note: In order for Clone() to work properly, every concrete class
+// transitively inheriting Event must implement Clone() explicitly, even if any
+// ancestors have provided an implementation.
class EVENTS_EXPORT Event {
public:
using Properties = base::flat_map<std::string, std::vector<uint8_t>>;
- // Copies an arbitrary event. If you have a typed event (e.g. a MouseEvent)
- // just use its copy constructor.
- static std::unique_ptr<Event> Clone(const Event& event);
-
virtual ~Event();
class DispatcherApi {
@@ -70,7 +69,7 @@ class EVENTS_EXPORT Event {
void set_time_stamp(base::TimeTicks time) { event_->time_stamp_ = time; }
private:
- raw_ptr<Event> event_;
+ raw_ptr<Event, DanglingUntriaged> event_;
};
void SetNativeEvent(const PlatformEvent& event);
@@ -226,7 +225,7 @@ class EVENTS_EXPORT Event {
bool IsLocatedEvent() const {
return IsMouseEvent() || IsScrollEvent() || IsTouchEvent() ||
- IsGestureEvent();
+ IsGestureEvent() || type_ == ET_DROP_TARGET_EVENT;
}
// Convenience methods to cast |this| to a CancelModeEvent.
@@ -292,6 +291,13 @@ class EVENTS_EXPORT Event {
// For debugging. Not a stable serialization format.
virtual std::string ToString() const;
+ // Copies an arbitrary event. If you have a typed event (e.g. a MouseEvent)
+ // just use its copy constructor.
+ //
+ // Every concrete class transitively inheriting Event must implement this
+ // method, even if any ancestors have provided an implementation.
+ virtual std::unique_ptr<Event> Clone() const = 0;
+
protected:
Event(EventType type, base::TimeTicks time_stamp, int flags);
Event(const PlatformEvent& native_event, EventType type, int flags);
@@ -316,7 +322,9 @@ class EVENTS_EXPORT Event {
// Neither Event copy constructor nor the assignment operator copies
// `target_`, as `target_` should be explicitly set so the setter will be
// responsible for tracking it.
- raw_ptr<EventTarget> target_ = nullptr;
+ //
+ // TODO(crbug.com/1298696): Breaks events_unittests.
+ raw_ptr<EventTarget, DegradeToNoOpWhenMTE> target_ = nullptr;
EventPhase phase_ = EP_PREDISPATCH;
EventResult result_ = ER_UNHANDLED;
@@ -331,6 +339,9 @@ class EVENTS_EXPORT CancelModeEvent : public Event {
public:
CancelModeEvent();
~CancelModeEvent() override;
+
+ // Event:
+ std::unique_ptr<Event> Clone() const override;
};
class EVENTS_EXPORT LocatedEvent : public Event {
@@ -379,7 +390,7 @@ class EVENTS_EXPORT LocatedEvent : public Event {
location_ = location_ - diff;
}
- // Event overrides.
+ // Event:
std::string ToString() const override;
protected:
@@ -553,8 +564,9 @@ class EVENTS_EXPORT MouseEvent : public LocatedEvent {
const PointerDetails& pointer_details() const { return pointer_details_; }
- // Event overides.
+ // Event:
std::string ToString() const override;
+ std::unique_ptr<Event> Clone() const override;
private:
FRIEND_TEST_ALL_PREFIXES(EventTest, DoubleClickRequiresUniqueTimestamp);
@@ -633,6 +645,9 @@ class EVENTS_EXPORT MouseWheelEvent : public MouseEvent {
// The amount the wheel(s) moved, in 120ths of a tick.
const gfx::Vector2d& tick_120ths() const { return tick_120ths_; }
+ // Event:
+ std::unique_ptr<Event> Clone() const override;
+
private:
gfx::Vector2d offset_;
gfx::Vector2d tick_120ths_;
@@ -699,6 +714,9 @@ class EVENTS_EXPORT TouchEvent : public LocatedEvent {
float ComputeRotationAngle() const;
+ // Event:
+ std::unique_ptr<Event> Clone() const override;
+
private:
// A unique identifier for the touch event.
// NOTE: this is *not* serialized over mojom, as the number is unique to
@@ -885,8 +903,9 @@ class EVENTS_EXPORT KeyEvent : public Event {
// (Native X11 event flags describe the state before the event.)
void NormalizeFlags();
- // Event overrides.
+ // Event:
std::string ToString() const override;
+ std::unique_ptr<Event> Clone() const override;
protected:
friend class KeyEventTestApi;
@@ -1001,8 +1020,9 @@ class EVENTS_EXPORT ScrollEvent : public MouseEvent {
EventMomentumPhase momentum_phase() const { return momentum_phase_; }
ScrollEventPhase scroll_event_phase() const { return scroll_event_phase_; }
- // Event overrides.
+ // Event:
std::string ToString() const override;
+ std::unique_ptr<Event> Clone() const override;
private:
// Potential accelerated offsets.
@@ -1046,8 +1066,9 @@ class EVENTS_EXPORT GestureEvent : public LocatedEvent {
uint32_t unique_touch_event_id() const { return unique_touch_event_id_; }
- // Event overrides.
+ // Event:
std::string ToString() const override;
+ std::unique_ptr<Event> Clone() const override;
private:
GestureEventDetails details_;
diff --git a/chromium/ui/events/event_processor.cc b/chromium/ui/events/event_processor.cc
index 219ce8d6f1a..c4b21f1ca09 100644
--- a/chromium/ui/events/event_processor.cc
+++ b/chromium/ui/events/event_processor.cc
@@ -23,7 +23,7 @@ EventDispatchDetails EventProcessor::OnEventFromSource(Event* event) {
Event* event_to_dispatch = event;
std::unique_ptr<Event> event_copy;
if (!dispatch_original_event) {
- event_copy = Event::Clone(*event);
+ event_copy = event->Clone();
event_to_dispatch = event_copy.get();
}
@@ -45,6 +45,13 @@ EventDispatchDetails EventProcessor::OnEventFromSource(Event* event) {
}
DCHECK(targeter);
+ // FindTargetForEvent may dispatch event, which may delete the event
+ // processor.
+ if (!weak_this) {
+ details.dispatcher_destroyed = true;
+ return details;
+ }
+
while (target) {
details = DispatchEvent(target, event_to_dispatch);
diff --git a/chromium/ui/events/event_processor_unittest.cc b/chromium/ui/events/event_processor_unittest.cc
index f676e53ba2d..4cbe2016a86 100644
--- a/chromium/ui/events/event_processor_unittest.cc
+++ b/chromium/ui/events/event_processor_unittest.cc
@@ -24,43 +24,6 @@ typedef std::vector<std::string> HandlerSequenceRecorder;
namespace ui {
namespace test {
-class SelfDestroyingEventProcessor : public TestEventProcessor {
- public:
- SelfDestroyingEventProcessor() {}
-
- SelfDestroyingEventProcessor(const SelfDestroyingEventProcessor&) = delete;
- SelfDestroyingEventProcessor& operator=(const SelfDestroyingEventProcessor&) =
- delete;
-
- protected:
- EventDispatchDetails PostDispatchEvent(EventTarget* target,
- const Event& event) override;
-};
-
-class SelfDestroyingTestEventTarget : public TestEventTarget {
- public:
- SelfDestroyingTestEventTarget()
- : processor_(new SelfDestroyingEventProcessor()) {}
-
- SelfDestroyingTestEventTarget(const SelfDestroyingTestEventTarget&) = delete;
- SelfDestroyingTestEventTarget& operator=(
- const SelfDestroyingTestEventTarget&) = delete;
-
- TestEventProcessor* processor() { return processor_.get(); }
-
- void DestroyProcessor() { processor_.reset(); }
-
- private:
- std::unique_ptr<SelfDestroyingEventProcessor> processor_;
-};
-
-EventDispatchDetails SelfDestroyingEventProcessor::PostDispatchEvent(
- EventTarget* target,
- const Event& event) {
- static_cast<SelfDestroyingTestEventTarget*>(target)->DestroyProcessor();
- return EventDispatchDetails();
-}
-
class EventProcessorTest : public testing::Test {
public:
EventProcessorTest() {}
@@ -419,6 +382,47 @@ TEST_F(EventProcessorTest, HandlerSequence) {
grandchild_r->RemovePreTargetHandler(&pre_grandchild);
}
+namespace {
+
+class SelfDestroyingEventProcessor : public TestEventProcessor {
+ public:
+ SelfDestroyingEventProcessor() = default;
+ SelfDestroyingEventProcessor(const SelfDestroyingEventProcessor&) = delete;
+ SelfDestroyingEventProcessor& operator=(const SelfDestroyingEventProcessor&) =
+ delete;
+ ~SelfDestroyingEventProcessor() override = default;
+
+ protected:
+ EventDispatchDetails PostDispatchEvent(EventTarget* target,
+ const Event& event) override;
+};
+
+class SelfDestroyingTestEventTarget : public TestEventTarget {
+ public:
+ SelfDestroyingTestEventTarget()
+ : processor_(new SelfDestroyingEventProcessor()) {}
+
+ SelfDestroyingTestEventTarget(const SelfDestroyingTestEventTarget&) = delete;
+ SelfDestroyingTestEventTarget& operator=(
+ const SelfDestroyingTestEventTarget&) = delete;
+
+ TestEventProcessor* processor() { return processor_.get(); }
+
+ void DestroyProcessor() { processor_.reset(); }
+
+ private:
+ std::unique_ptr<SelfDestroyingEventProcessor> processor_;
+};
+
+EventDispatchDetails SelfDestroyingEventProcessor::PostDispatchEvent(
+ EventTarget* target,
+ const Event& event) {
+ static_cast<SelfDestroyingTestEventTarget*>(target)->DestroyProcessor();
+ return EventDispatchDetails();
+}
+
+} // namespace
+
TEST(EventProcessorCrashTest, Basic) {
std::unique_ptr<TestEventTarget> root(new TestEventTarget());
std::unique_ptr<SelfDestroyingTestEventTarget> target(
@@ -433,5 +437,47 @@ TEST(EventProcessorCrashTest, Basic) {
EXPECT_TRUE(processor->OnEventFromSource(&mouse).dispatcher_destroyed);
}
+namespace {
+
+class SelfDestroyingTestEventTargeter : public TestEventTargeter {
+ public:
+ explicit SelfDestroyingTestEventTargeter(std::unique_ptr<EventTarget> root)
+ : TestEventTargeter(nullptr, false),
+ processor_(new TestEventProcessor()) {
+ processor_->SetRoot(std::move(root));
+ }
+ SelfDestroyingTestEventTargeter(const SelfDestroyingTestEventTarget&) =
+ delete;
+ SelfDestroyingTestEventTargeter& operator=(
+ const SelfDestroyingTestEventTargeter&) = delete;
+ ~SelfDestroyingTestEventTargeter() override = default;
+
+ // EventTargeter:
+ EventTarget* FindTargetForEvent(EventTarget* root, Event* event) override {
+ processor_.reset();
+ return nullptr;
+ }
+
+ EventProcessor* processor() { return processor_.get(); }
+
+ private:
+ std::unique_ptr<TestEventProcessor> processor_;
+};
+
+} // namespace
+
+TEST(EventProcessorCrashTest, DestroyDuringFindTarget) {
+ std::unique_ptr<TestEventTarget> root(new TestEventTarget());
+ auto* root_ptr = root.get();
+ auto event_targeter =
+ std::make_unique<SelfDestroyingTestEventTargeter>(std::move(root));
+ auto* processor = event_targeter->processor();
+ root_ptr->SetEventTargeter(std::move(event_targeter));
+
+ MouseEvent mouse(ET_MOUSE_MOVED, gfx::Point(10, 10), gfx::Point(10, 10),
+ EventTimeForNow(), EF_NONE, EF_NONE);
+ EXPECT_TRUE(processor->OnEventFromSource(&mouse).dispatcher_destroyed);
+}
+
} // namespace test
} // namespace ui
diff --git a/chromium/ui/events/event_source.cc b/chromium/ui/events/event_source.cc
index 0e4e835b89b..2f88466b22f 100644
--- a/chromium/ui/events/event_source.cc
+++ b/chromium/ui/events/event_source.cc
@@ -127,7 +127,7 @@ EventDispatchDetails EventSource::SendEventToSinkFromRewriter(
// EventRewriters don't expect an event with differing location and
// root-location (because they don't honor the target). Provide such an
// event.
- event_for_rewriting_ptr = ui::Event::Clone(*event);
+ event_for_rewriting_ptr = event->Clone();
event_for_rewriting_ptr->AsLocatedEvent()->set_location_f(
event_for_rewriting_ptr->AsLocatedEvent()->root_location_f());
event_for_rewriting = event_for_rewriting_ptr.get();
diff --git a/chromium/ui/events/event_switches.cc b/chromium/ui/events/event_switches.cc
index a28b059cbba..1dbd4511c77 100644
--- a/chromium/ui/events/event_switches.cc
+++ b/chromium/ui/events/event_switches.cc
@@ -40,6 +40,12 @@ const char kEdgeTouchFiltering[] = "edge-touch-filtering";
// Disable CancelAllTouches() function for the implementation on cancel single
// touches.
const char kDisableCancelAllTouches[] = "disable-cancel-all-touches";
+
+// Enables logic to detect microphone mute switch device state, which disables
+// internal audio input when toggled.
+constexpr char kEnableMicrophoneMuteSwitchDeviceSwitch[] =
+ "enable-microphone-mute-switch-device";
+
#endif
} // namespace switches
diff --git a/chromium/ui/events/event_switches.h b/chromium/ui/events/event_switches.h
index 08a45c39642..8347fd3da2c 100644
--- a/chromium/ui/events/event_switches.h
+++ b/chromium/ui/events/event_switches.h
@@ -21,6 +21,9 @@ EVENTS_BASE_EXPORT extern const char kPenDevices[];
#if defined(USE_OZONE)
EVENTS_BASE_EXPORT extern const char kEdgeTouchFiltering[];
EVENTS_BASE_EXPORT extern const char kDisableCancelAllTouches[];
+EVENTS_BASE_EXPORT
+extern const char kEnableMicrophoneMuteSwitchDeviceSwitch[];
+
#endif
} // namespace switches
diff --git a/chromium/ui/events/event_target.h b/chromium/ui/events/event_target.h
index d18f0297f65..0eb43faade0 100644
--- a/chromium/ui/events/event_target.h
+++ b/chromium/ui/events/event_target.h
@@ -130,7 +130,8 @@ class EVENTS_EXPORT EventTarget {
EventHandlerPriorityList pre_target_list_;
EventHandlerList post_target_list_;
- raw_ptr<EventHandler> target_handler_ = nullptr;
+ // TODO(crbug.com/1298696): Breaks content_unittests.
+ raw_ptr<EventHandler, DegradeToNoOpWhenMTE> target_handler_ = nullptr;
};
} // namespace ui
diff --git a/chromium/ui/events/fuchsia/fakes/pointer_event_utility.cc b/chromium/ui/events/fuchsia/fakes/pointer_event_utility.cc
index 59d8bcff5b3..9896361a021 100644
--- a/chromium/ui/events/fuchsia/fakes/pointer_event_utility.cc
+++ b/chromium/ui/events/fuchsia/fakes/pointer_event_utility.cc
@@ -100,7 +100,9 @@ MouseEventBuilder& MouseEventBuilder::AddSample(
uint32_t id,
std::array<float, 2> position,
std::vector<uint8_t> pressed_buttons,
- std::array<int64_t, 2> scroll) {
+ std::array<int64_t, 2> scroll,
+ std::array<int64_t, 2> scroll_in_physical_pixel,
+ bool is_precision_scroll) {
sample_ = absl::make_optional<fup::MousePointerSample>();
sample_->set_device_id(id);
if (!pressed_buttons.empty()) {
@@ -113,6 +115,13 @@ MouseEventBuilder& MouseEventBuilder::AddSample(
if (scroll[1] != 0) {
sample_->set_scroll_v(scroll[1]);
}
+ if (scroll_in_physical_pixel[0] != 0) {
+ sample_->set_scroll_h_physical_pixel(scroll_in_physical_pixel[0]);
+ }
+ if (scroll_in_physical_pixel[1] != 0) {
+ sample_->set_scroll_v_physical_pixel(scroll_in_physical_pixel[1]);
+ }
+ sample_->set_is_precision_scroll(is_precision_scroll);
return *this;
}
diff --git a/chromium/ui/events/fuchsia/fakes/pointer_event_utility.h b/chromium/ui/events/fuchsia/fakes/pointer_event_utility.h
index 627e2d8a682..8d690b7761b 100644
--- a/chromium/ui/events/fuchsia/fakes/pointer_event_utility.h
+++ b/chromium/ui/events/fuchsia/fakes/pointer_event_utility.h
@@ -53,7 +53,9 @@ class MouseEventBuilder {
MouseEventBuilder& AddSample(uint32_t id,
std::array<float, 2> position,
std::vector<uint8_t> pressed_buttons,
- std::array<int64_t, 2> scroll);
+ std::array<int64_t, 2> scroll,
+ std::array<int64_t, 2> scroll_in_physical_pixel,
+ bool is_precision_scroll);
MouseEventBuilder& AddViewParameters(
std::array<std::array<float, 2>, 2> view,
std::array<std::array<float, 2>, 2> viewport,
diff --git a/chromium/ui/events/fuchsia/input_event_dispatcher_unittest.cc b/chromium/ui/events/fuchsia/input_event_dispatcher_unittest.cc
index f97db947d0e..6fa94759a4d 100644
--- a/chromium/ui/events/fuchsia/input_event_dispatcher_unittest.cc
+++ b/chromium/ui/events/fuchsia/input_event_dispatcher_unittest.cc
@@ -30,7 +30,7 @@ class InputEventDispatcherTest : public testing::Test, public InputEventSink {
void DispatchEvent(Event* event) override {
DCHECK(!captured_event_);
- captured_event_ = Event::Clone(*event);
+ captured_event_ = event->Clone();
}
protected:
diff --git a/chromium/ui/events/fuchsia/pointer_events_handler.cc b/chromium/ui/events/fuchsia/pointer_events_handler.cc
index c26a72e6bff..81a7a36bf60 100644
--- a/chromium/ui/events/fuchsia/pointer_events_handler.cc
+++ b/chromium/ui/events/fuchsia/pointer_events_handler.cc
@@ -233,20 +233,43 @@ std::unique_ptr<MouseEvent> CreateMouseEventDraft(
if (event_type == ET_MOUSEWHEEL) {
// TODO(fxbug.dev/92938): Maybe also support ctrl+wheel event here.
- // Fuchsia reports wheel rotated ticks, multiple |kWheelDelta| for pixel
- // offset.
- const int offset_x = sample.has_scroll_h()
- ? static_cast<int>(sample.scroll_h()) * kWheelDelta
- : 0;
- const int offset_y = sample.has_scroll_v()
- ? static_cast<int>(sample.scroll_v()) * kWheelDelta
- : 0;
-
- // TODO(fxbug.dev/85388): If mouse wheel has by detent(tick) scroll offset,
- // we can fill them into |tick_120ths|.
+ const int tick_x_120ths =
+ sample.has_scroll_h()
+ ? static_cast<int>(sample.scroll_h()) * kWheelDelta
+ : 0;
+ const int tick_y_120ths =
+ sample.has_scroll_v()
+ ? static_cast<int>(sample.scroll_v()) * kWheelDelta
+ : 0;
+
+ // Fuchsia reports suggested scroll pixel in physical, but for old version,
+ // Fuchsia reports wheel rotated ticks need to multiple |kWheelDelta| for
+ // pixel offset.
+ const float offset_x =
+ sample.has_scroll_h_physical_pixel()
+ ? static_cast<float>(sample.scroll_h_physical_pixel())
+ : static_cast<float>(tick_x_120ths);
+ const float offset_y =
+ sample.has_scroll_v_physical_pixel()
+ ? static_cast<float>(sample.scroll_v_physical_pixel())
+ : static_cast<float>(tick_y_120ths);
+
+ if (sample.has_is_precision_scroll() && sample.is_precision_scroll()) {
+ // For precision scroll device, mostly are touchpads for now, need to use
+ // ScrollEvent instead of MouseWheelEvent to prevent animation
+ // interpolation in smooth scrolling.
+ // Because we only support touchpad as precision scroll device now,
+ // finger_count is 2. Maybe need to use different number when we support
+ // precision wheel mouse.
+ return std::make_unique<ScrollEvent>(
+ ui::ET_SCROLL, location, root_location, timestamp,
+ pressed_buttons_flags, offset_x, offset_y, offset_x, offset_y,
+ /*finger_count=*/2);
+ }
return std::make_unique<MouseWheelEvent>(
- gfx::Vector2d(offset_x, offset_y), location, root_location, timestamp,
- pressed_buttons_flags, changed_buttons_flags);
+ gfx::Vector2d(static_cast<int>(offset_x), static_cast<int>(offset_y)),
+ location, root_location, timestamp, pressed_buttons_flags,
+ changed_buttons_flags, gfx::Vector2d(tick_x_120ths, tick_y_120ths));
}
return std::make_unique<MouseEvent>(event_type, location, root_location,
timestamp, pressed_buttons_flags,
@@ -382,8 +405,10 @@ void PointerEventsHandler::OnMouseSourceWatchResult(
// Update mouse_down_ for the next Fuchsia event.
mouse_down_[id] = pressed_buttons;
- const bool is_wheel_event =
- sample.has_scroll_v() || sample.has_scroll_h();
+ const bool is_wheel_event = sample.has_scroll_v() ||
+ sample.has_scroll_h() ||
+ sample.has_scroll_h_physical_pixel() ||
+ sample.has_scroll_v_physical_pixel();
// Do not filterout mouse wheel here, because the wheel event may be
// bundled with button down and button up event. Chromium will need to
// split it to 2 events.
diff --git a/chromium/ui/events/fuchsia/pointer_events_handler_unittest.cc b/chromium/ui/events/fuchsia/pointer_events_handler_unittest.cc
index e6f4ddb93f0..229dac36669 100644
--- a/chromium/ui/events/fuchsia/pointer_events_handler_unittest.cc
+++ b/chromium/ui/events/fuchsia/pointer_events_handler_unittest.cc
@@ -38,6 +38,11 @@ constexpr fup::TouchInteractionId kIxnOne = {.device_id = 1u,
.interaction_id = 2u};
constexpr uint32_t kMouseDeviceId = 123;
+constexpr std::array<int64_t, 2> kNoScrollDelta = {0, 0};
+constexpr std::array<int64_t, 2> kNoScrollInPhysicalPixelDelta = {0, 0};
+const bool kNotPrecisionScroll = false;
+const bool kPrecisionScroll = true;
+
// Fixture to exercise the implementation for fuchsia.ui.pointer.TouchSource and
// fuchsia.ui.pointer.MouseSource.
class PointerEventsHandlerTest : public ::testing::Test {
@@ -67,7 +72,7 @@ class PointerEventsHandlerTest : public ::testing::Test {
TEST_F(PointerEventsHandlerTest, Watch_EventCallbacksAreIndependent) {
std::vector<std::unique_ptr<Event>> events;
pointer_handler_->StartWatching(base::BindLambdaForTesting(
- [&events](Event* event) { events.push_back(Event::Clone(*event)); }));
+ [&events](Event* event) { events.push_back(event->Clone()); }));
RunLoopUntilIdle(); // Server gets watch call.
std::vector<fup::TouchEvent> touch_events =
@@ -90,7 +95,8 @@ TEST_F(PointerEventsHandlerTest, Watch_EventCallbacksAreIndependent) {
MouseEventBuilder()
.AddTime(1111789u)
.AddViewParameters(kRect, kRect, kIdentity)
- .AddSample(kMouseDeviceId, {10.f, 10.f}, {0}, {0, 0})
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {0}, kNoScrollDelta,
+ kNoScrollInPhysicalPixelDelta, kNotPrecisionScroll)
.AddMouseDeviceInfo(kMouseDeviceId, {0, 1, 2})
.BuildAsVector();
mouse_source_->ScheduleCallback(std::move(mouse_events));
@@ -139,7 +145,9 @@ TEST_F(PointerEventsHandlerTest, Phase_ChromeMouseEventTypesAreSynthesized) {
MouseEventBuilder()
.AddTime(1111789u)
.AddViewParameters(kRect, kRect, kIdentity)
- .AddSample(kMouseDeviceId, {10.f, 10.f}, {0 /*button id*/}, {0, 0})
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {0 /*button id*/},
+ kNoScrollDelta, kNoScrollInPhysicalPixelDelta,
+ kNotPrecisionScroll)
.AddMouseDeviceInfo(kMouseDeviceId,
{2 /*first button id*/, 0 /*second button id*/,
1 /*third button id*/})
@@ -154,11 +162,12 @@ TEST_F(PointerEventsHandlerTest, Phase_ChromeMouseEventTypesAreSynthesized) {
// Keep Fuchsia button press -> Chrome ET_MOUSE_DRAGGED and
// EF_RIGHT_MOUSE_BUTTON
- events =
- MouseEventBuilder()
- .AddTime(1111789u)
- .AddSample(kMouseDeviceId, {10.f, 10.f}, {0 /*button id*/}, {0, 0})
- .BuildAsVector();
+ events = MouseEventBuilder()
+ .AddTime(1111789u)
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {0 /*button id*/},
+ kNoScrollDelta, kNoScrollInPhysicalPixelDelta,
+ kNotPrecisionScroll)
+ .BuildAsVector();
mouse_source_->ScheduleCallback(std::move(events));
RunLoopUntilIdle();
@@ -170,7 +179,8 @@ TEST_F(PointerEventsHandlerTest, Phase_ChromeMouseEventTypesAreSynthesized) {
// Release Fuchsia button -> Chrome ET_MOUSE_RELEASED
events = MouseEventBuilder()
.AddTime(1111789u)
- .AddSample(kMouseDeviceId, {10.f, 10.f}, {}, {0, 0})
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {}, kNoScrollDelta,
+ kNoScrollInPhysicalPixelDelta, kNotPrecisionScroll)
.BuildAsVector();
mouse_source_->ScheduleCallback(std::move(events));
RunLoopUntilIdle();
@@ -183,7 +193,8 @@ TEST_F(PointerEventsHandlerTest, Phase_ChromeMouseEventTypesAreSynthesized) {
// Release Fuchsia button -> Chrome ET_MOUSE_MOVED
events = MouseEventBuilder()
.AddTime(1111789u)
- .AddSample(kMouseDeviceId, {10.f, 10.f}, {}, {0, 0})
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {}, kNoScrollDelta,
+ kNoScrollInPhysicalPixelDelta, kNotPrecisionScroll)
.BuildAsVector();
mouse_source_->ScheduleCallback(std::move(events));
RunLoopUntilIdle();
@@ -207,7 +218,8 @@ TEST_F(PointerEventsHandlerTest, Phase_ChromeMouseEventFlagsAreSynthesized) {
MouseEventBuilder()
.AddTime(1111789u)
.AddViewParameters(kRect, kRect, kIdentity)
- .AddSample(kMouseDeviceId, {10.f, 10.f}, {0}, {0, 0})
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {0}, kNoScrollDelta,
+ kNoScrollInPhysicalPixelDelta, kNotPrecisionScroll)
.AddMouseDeviceInfo(kMouseDeviceId, {2, 0, 1})
.BuildAsVector();
mouse_source_->ScheduleCallback(std::move(events));
@@ -222,7 +234,8 @@ TEST_F(PointerEventsHandlerTest, Phase_ChromeMouseEventFlagsAreSynthesized) {
// EF_LEFT_MOUSE_BUTTON
events = MouseEventBuilder()
.AddTime(1111789u)
- .AddSample(kMouseDeviceId, {10.f, 10.f}, {2}, {0, 0})
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {2}, kNoScrollDelta,
+ kNoScrollInPhysicalPixelDelta, kNotPrecisionScroll)
.BuildAsVector();
mouse_source_->ScheduleCallback(std::move(events));
RunLoopUntilIdle();
@@ -249,7 +262,8 @@ TEST_F(PointerEventsHandlerTest, Phase_ChromeMouseEventFlagCombo) {
MouseEventBuilder()
.AddTime(1111789u)
.AddViewParameters(kRect, kRect, kIdentity)
- .AddSample(kMouseDeviceId, {10.f, 10.f}, {0, 1}, {0, 0})
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {0, 1}, kNoScrollDelta,
+ kNoScrollInPhysicalPixelDelta, kNotPrecisionScroll)
.AddMouseDeviceInfo(kMouseDeviceId, {0, 1, 2})
.BuildAsVector();
mouse_source_->ScheduleCallback(std::move(events));
@@ -276,38 +290,50 @@ TEST_F(PointerEventsHandlerTest, MouseMultiButtonDrag) {
events.push_back(MouseEventBuilder()
.AddTime(1111789u)
.AddViewParameters(kRect, kRect, kIdentity)
- .AddSample(kMouseDeviceId, {10.f, 10.f}, {0, 1}, {0, 0})
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {0, 1},
+ kNoScrollDelta, kNoScrollInPhysicalPixelDelta,
+ kNotPrecisionScroll)
.AddMouseDeviceInfo(kMouseDeviceId, {0, 1, 2})
.Build());
// drag with left, right button pressing.
events.push_back(MouseEventBuilder()
.AddTime(1111790u)
.AddViewParameters(kRect, kRect, kIdentity)
- .AddSample(kMouseDeviceId, {11.f, 10.f}, {0, 1}, {0, 0})
+ .AddSample(kMouseDeviceId, {11.f, 10.f}, {0, 1},
+ kNoScrollDelta, kNoScrollInPhysicalPixelDelta,
+ kNotPrecisionScroll)
.Build());
// right button up.
events.push_back(MouseEventBuilder()
.AddTime(1111791u)
.AddViewParameters(kRect, kRect, kIdentity)
- .AddSample(kMouseDeviceId, {11.f, 10.f}, {0}, {0, 0})
+ .AddSample(kMouseDeviceId, {11.f, 10.f}, {0},
+ kNoScrollDelta, kNoScrollInPhysicalPixelDelta,
+ kNotPrecisionScroll)
.Build());
// drag with left button pressing.
events.push_back(MouseEventBuilder()
.AddTime(1111792u)
.AddViewParameters(kRect, kRect, kIdentity)
- .AddSample(kMouseDeviceId, {11.f, 11.f}, {0}, {0, 0})
+ .AddSample(kMouseDeviceId, {11.f, 11.f}, {0},
+ kNoScrollDelta, kNoScrollInPhysicalPixelDelta,
+ kNotPrecisionScroll)
.Build());
// left button up.
events.push_back(MouseEventBuilder()
.AddTime(11117913u)
.AddViewParameters(kRect, kRect, kIdentity)
- .AddSample(kMouseDeviceId, {11.f, 11.f}, {}, {0, 0})
+ .AddSample(kMouseDeviceId, {11.f, 11.f}, {},
+ kNoScrollDelta, kNoScrollInPhysicalPixelDelta,
+ kNotPrecisionScroll)
.Build());
// mouse move.
events.push_back(MouseEventBuilder()
.AddTime(1111794u)
.AddViewParameters(kRect, kRect, kIdentity)
- .AddSample(kMouseDeviceId, {12.f, 11.f}, {}, {0, 0})
+ .AddSample(kMouseDeviceId, {12.f, 11.f}, {},
+ kNoScrollDelta, kNoScrollInPhysicalPixelDelta,
+ kNotPrecisionScroll)
.Build());
mouse_source_->ScheduleCallback(std::move(events));
@@ -346,7 +372,8 @@ TEST_F(PointerEventsHandlerTest, MouseWheelEvent) {
MouseEventBuilder()
.AddTime(1111789u)
.AddViewParameters(kRect, kRect, kIdentity)
- .AddSample(kMouseDeviceId, {10.f, 10.f}, {}, {0, 1})
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {}, {0, 1},
+ kNoScrollInPhysicalPixelDelta, kNotPrecisionScroll)
.AddMouseDeviceInfo(kMouseDeviceId, {0, 1, 2})
.BuildAsVector();
mouse_source_->ScheduleCallback(std::move(events));
@@ -363,7 +390,8 @@ TEST_F(PointerEventsHandlerTest, MouseWheelEvent) {
events = MouseEventBuilder()
.AddTime(1111789u)
.AddViewParameters(kRect, kRect, kIdentity)
- .AddSample(kMouseDeviceId, {10.f, 10.f}, {}, {1, 0})
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {}, {1, 0},
+ kNoScrollInPhysicalPixelDelta, kNotPrecisionScroll)
.AddMouseDeviceInfo(kMouseDeviceId, {0, 1, 2})
.BuildAsVector();
mouse_source_->ScheduleCallback(std::move(events));
@@ -377,16 +405,157 @@ TEST_F(PointerEventsHandlerTest, MouseWheelEvent) {
mouse_events.clear();
}
+TEST_F(PointerEventsHandlerTest, MouseWheelEventDeltaInPhysicalPixel) {
+ std::vector<MouseWheelEvent> mouse_events;
+ pointer_handler_->StartWatching(
+ base::BindLambdaForTesting([&mouse_events](Event* event) {
+ ASSERT_EQ(event->type(), ET_MOUSEWHEEL);
+ mouse_events.push_back(*event->AsMouseWheelEvent());
+ }));
+ RunLoopUntilIdle(); // Server gets watch call.
+
+ // receive a vertical scroll
+ std::vector<fup::MouseEvent> events =
+ MouseEventBuilder()
+ .AddTime(1111789u)
+ .AddViewParameters(kRect, kRect, kIdentity)
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {}, {0, 1}, {0, 100},
+ kNotPrecisionScroll)
+ .AddMouseDeviceInfo(kMouseDeviceId, {0, 1, 2})
+ .BuildAsVector();
+ mouse_source_->ScheduleCallback(std::move(events));
+ RunLoopUntilIdle();
+
+ ASSERT_EQ(mouse_events.size(), 1u);
+ EXPECT_EQ(mouse_events[0].type(), ET_MOUSEWHEEL);
+ EXPECT_EQ(mouse_events[0].flags(), EF_NONE);
+ EXPECT_EQ(mouse_events[0].AsMouseWheelEvent()->x_offset(), 0);
+ EXPECT_EQ(mouse_events[0].AsMouseWheelEvent()->y_offset(), 100);
+ mouse_events.clear();
+
+ // receive a horizontal scroll
+ events = MouseEventBuilder()
+ .AddTime(1111789u)
+ .AddViewParameters(kRect, kRect, kIdentity)
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {}, {1, 0}, {100, 0},
+ kNotPrecisionScroll)
+ .AddMouseDeviceInfo(kMouseDeviceId, {0, 1, 2})
+ .BuildAsVector();
+ mouse_source_->ScheduleCallback(std::move(events));
+ RunLoopUntilIdle();
+
+ ASSERT_EQ(mouse_events.size(), 1u);
+ EXPECT_EQ(mouse_events[0].type(), ET_MOUSEWHEEL);
+ EXPECT_EQ(mouse_events[0].flags(), EF_NONE);
+ EXPECT_EQ(mouse_events[0].AsMouseWheelEvent()->x_offset(), 100);
+ EXPECT_EQ(mouse_events[0].AsMouseWheelEvent()->y_offset(), 0);
+ mouse_events.clear();
+}
+
+TEST_F(PointerEventsHandlerTest, ScrollEventDeltaInPhysicalPixel) {
+ std::vector<ScrollEvent> mouse_events;
+ pointer_handler_->StartWatching(
+ base::BindLambdaForTesting([&mouse_events](Event* event) {
+ ASSERT_EQ(event->type(), ET_SCROLL);
+ mouse_events.push_back(*event->AsScrollEvent());
+ }));
+ RunLoopUntilIdle(); // Server gets watch call.
+
+ // receive a vertical scroll
+ std::vector<fup::MouseEvent> events =
+ MouseEventBuilder()
+ .AddTime(1111789u)
+ .AddViewParameters(kRect, kRect, kIdentity)
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {}, {0, 1}, {0, 100},
+ kPrecisionScroll)
+ .AddMouseDeviceInfo(kMouseDeviceId, {0, 1, 2})
+ .BuildAsVector();
+ mouse_source_->ScheduleCallback(std::move(events));
+ RunLoopUntilIdle();
+
+ ASSERT_EQ(mouse_events.size(), 1u);
+ EXPECT_EQ(mouse_events[0].type(), ET_SCROLL);
+ EXPECT_EQ(mouse_events[0].flags(), EF_NONE);
+ EXPECT_EQ(mouse_events[0].AsScrollEvent()->x_offset(), 0);
+ EXPECT_EQ(mouse_events[0].AsScrollEvent()->y_offset(), 100);
+ mouse_events.clear();
+
+ // receive a horizontal scroll
+ events = MouseEventBuilder()
+ .AddTime(1111789u)
+ .AddViewParameters(kRect, kRect, kIdentity)
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {}, {1, 0}, {100, 0},
+ kPrecisionScroll)
+ .AddMouseDeviceInfo(kMouseDeviceId, {0, 1, 2})
+ .BuildAsVector();
+ mouse_source_->ScheduleCallback(std::move(events));
+ RunLoopUntilIdle();
+
+ ASSERT_EQ(mouse_events.size(), 1u);
+ EXPECT_EQ(mouse_events[0].type(), ET_SCROLL);
+ EXPECT_EQ(mouse_events[0].flags(), EF_NONE);
+ EXPECT_EQ(mouse_events[0].AsScrollEvent()->x_offset(), 100);
+ EXPECT_EQ(mouse_events[0].AsScrollEvent()->y_offset(), 0);
+ mouse_events.clear();
+}
+
+TEST_F(PointerEventsHandlerTest, ScrollEventDeltaInPhysicalPixelNoTickDelta) {
+ std::vector<ScrollEvent> mouse_events;
+ pointer_handler_->StartWatching(
+ base::BindLambdaForTesting([&mouse_events](Event* event) {
+ ASSERT_EQ(event->type(), ET_SCROLL);
+ mouse_events.push_back(*event->AsScrollEvent());
+ }));
+ RunLoopUntilIdle(); // Server gets watch call.
+
+ // receive a vertical scroll
+ std::vector<fup::MouseEvent> events =
+ MouseEventBuilder()
+ .AddTime(1111789u)
+ .AddViewParameters(kRect, kRect, kIdentity)
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {}, kNoScrollDelta, {0, 100},
+ kPrecisionScroll)
+ .AddMouseDeviceInfo(kMouseDeviceId, {0, 1, 2})
+ .BuildAsVector();
+ mouse_source_->ScheduleCallback(std::move(events));
+ RunLoopUntilIdle();
+
+ ASSERT_EQ(mouse_events.size(), 1u);
+ EXPECT_EQ(mouse_events[0].type(), ET_SCROLL);
+ EXPECT_EQ(mouse_events[0].flags(), EF_NONE);
+ EXPECT_EQ(mouse_events[0].AsScrollEvent()->x_offset(), 0);
+ EXPECT_EQ(mouse_events[0].AsScrollEvent()->y_offset(), 100);
+ mouse_events.clear();
+
+ // receive a horizontal scroll
+ events = MouseEventBuilder()
+ .AddTime(1111789u)
+ .AddViewParameters(kRect, kRect, kIdentity)
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {}, kNoScrollDelta,
+ {100, 0}, kPrecisionScroll)
+ .AddMouseDeviceInfo(kMouseDeviceId, {0, 1, 2})
+ .BuildAsVector();
+ mouse_source_->ScheduleCallback(std::move(events));
+ RunLoopUntilIdle();
+
+ ASSERT_EQ(mouse_events.size(), 1u);
+ EXPECT_EQ(mouse_events[0].type(), ET_SCROLL);
+ EXPECT_EQ(mouse_events[0].flags(), EF_NONE);
+ EXPECT_EQ(mouse_events[0].AsScrollEvent()->x_offset(), 100);
+ EXPECT_EQ(mouse_events[0].AsScrollEvent()->y_offset(), 0);
+ mouse_events.clear();
+}
+
TEST_F(PointerEventsHandlerTest, MouseWheelEventWithButtonPressed) {
std::vector<std::unique_ptr<Event>> mouse_events;
pointer_handler_->StartWatching(
base::BindLambdaForTesting([&mouse_events](Event* event) {
ASSERT_TRUE(event->IsMouseEvent());
if (event->IsMouseWheelEvent()) {
- auto e = Event::Clone(*event->AsMouseWheelEvent());
+ auto e = event->AsMouseWheelEvent()->Clone();
mouse_events.push_back(std::move(e));
} else if (event->IsMouseEvent()) {
- auto e = Event::Clone(*event->AsMouseEvent());
+ auto e = event->AsMouseEvent()->Clone();
mouse_events.push_back(std::move(e));
} else {
NOTREACHED();
@@ -399,7 +568,8 @@ TEST_F(PointerEventsHandlerTest, MouseWheelEventWithButtonPressed) {
MouseEventBuilder()
.AddTime(1111000u)
.AddViewParameters(kRect, kRect, kIdentity)
- .AddSample(kMouseDeviceId, {10.f, 10.f}, {0}, {0, 0})
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {0}, kNoScrollDelta,
+ kNoScrollInPhysicalPixelDelta, kNotPrecisionScroll)
.AddMouseDeviceInfo(kMouseDeviceId, {0, 1, 2})
.BuildAsVector();
@@ -407,7 +577,9 @@ TEST_F(PointerEventsHandlerTest, MouseWheelEventWithButtonPressed) {
events.push_back(MouseEventBuilder()
.AddTime(1111789u)
.AddViewParameters(kRect, kRect, kIdentity)
- .AddSample(kMouseDeviceId, {10.f, 10.f}, {0}, {0, 1})
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {0}, {0, 1},
+ kNoScrollInPhysicalPixelDelta,
+ kNotPrecisionScroll)
.Build());
mouse_source_->ScheduleCallback(std::move(events));
@@ -430,10 +602,10 @@ TEST_F(PointerEventsHandlerTest, MouseWheelEventWithButtonDownBundled) {
base::BindLambdaForTesting([&mouse_events](Event* event) {
ASSERT_TRUE(event->IsMouseEvent());
if (event->IsMouseWheelEvent()) {
- auto e = Event::Clone(*event->AsMouseWheelEvent());
+ auto e = event->AsMouseWheelEvent()->Clone();
mouse_events.push_back(std::move(e));
} else if (event->IsMouseEvent()) {
- auto e = Event::Clone(*event->AsMouseEvent());
+ auto e = event->AsMouseEvent()->Clone();
mouse_events.push_back(std::move(e));
} else {
NOTREACHED();
@@ -446,7 +618,8 @@ TEST_F(PointerEventsHandlerTest, MouseWheelEventWithButtonDownBundled) {
MouseEventBuilder()
.AddTime(1111000u)
.AddViewParameters(kRect, kRect, kIdentity)
- .AddSample(kMouseDeviceId, {10.f, 10.f}, {0}, {0, 1})
+ .AddSample(kMouseDeviceId, {10.f, 10.f}, {0}, {0, 1},
+ kNoScrollInPhysicalPixelDelta, kNotPrecisionScroll)
.AddMouseDeviceInfo(kMouseDeviceId, {0, 1, 2})
.BuildAsVector();
diff --git a/chromium/ui/events/gestures/blink/BUILD.gn b/chromium/ui/events/gestures/blink/BUILD.gn
index d4373485671..eb8b6075fd0 100644
--- a/chromium/ui/events/gestures/blink/BUILD.gn
+++ b/chromium/ui/events/gestures/blink/BUILD.gn
@@ -10,8 +10,7 @@ source_set("blink") {
"web_gesture_curve_impl.h",
]
- # TODO(crbug.com/1314528): Should not need the is_android check.
- if (is_castos && !is_android) {
+ if (is_castos) {
defines = [ "USE_MOBILE_FLING_CURVE" ]
}
diff --git a/chromium/ui/events/keycodes/dom/dom_code.h b/chromium/ui/events/keycodes/dom/dom_code.h
index 3f53f7534ca..372b4614464 100644
--- a/chromium/ui/events/keycodes/dom/dom_code.h
+++ b/chromium/ui/events/keycodes/dom/dom_code.h
@@ -7,6 +7,7 @@
namespace ui {
+// Declares named values for each of the recognized DOM Code values.
#define DOM_CODE(usb, evdev, xkb, win, mac, code, id) id = usb
#define DOM_CODE_DECLARATION enum class DomCode
#include "ui/events/keycodes/dom/dom_code_data.inc"
diff --git a/chromium/ui/events/keycodes/dom/dom_codes.h b/chromium/ui/events/keycodes/dom/dom_codes_array.h
index 7428fd1c251..8088418eab8 100644
--- a/chromium/ui/events/keycodes/dom/dom_codes.h
+++ b/chromium/ui/events/keycodes/dom/dom_codes_array.h
@@ -2,16 +2,17 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_EVENTS_KEYCODES_DOM_DOM_CODES_H_
-#define UI_EVENTS_KEYCODES_DOM_DOM_CODES_H_
+#ifndef UI_EVENTS_KEYCODES_DOM_DOM_CODES_ARRAY_H_
+#define UI_EVENTS_KEYCODES_DOM_DOM_CODES_ARRAY_H_
#include "ui/events/keycodes/dom/dom_code.h"
namespace ui {
+// Declares an array containing all the currently defined DomCode values.
#define DOM_CODE_TYPE(x) static_cast<DomCode>(x)
#define DOM_CODE(usb, evdev, xkb, win, mac, code, id) DOM_CODE_TYPE(usb)
-#define DOM_CODE_DECLARATION constexpr DomCode dom_codes[] =
+#define DOM_CODE_DECLARATION constexpr DomCode kDomCodesArray[] =
#include "ui/events/keycodes/dom/dom_code_data.inc"
#undef DOM_CODE_TYPE
#undef DOM_CODE
@@ -19,4 +20,4 @@ namespace ui {
} // namespace ui
-#endif // UI_EVENTS_KEYCODES_DOM_DOM_CODES_H_
+#endif // UI_EVENTS_KEYCODES_DOM_DOM_CODES_ARRAY_H_
diff --git a/chromium/ui/events/keycodes/dom/keycode_converter.cc b/chromium/ui/events/keycodes/dom/keycode_converter.cc
index d0f8c2abc91..f5d61aadc83 100644
--- a/chromium/ui/events/keycodes/dom/keycode_converter.cc
+++ b/chromium/ui/events/keycodes/dom/keycode_converter.cc
@@ -336,8 +336,8 @@ DomKey KeycodeConverter::KeyStringToDomKey(base::StringPiece key) {
}
// Otherwise, if the string contains a single Unicode character,
// the key value is that character.
- const auto key_length = static_cast<int32_t>(key.length());
- int32_t char_index = 0;
+ const size_t key_length = key.length();
+ size_t char_index = 0;
base_icu::UChar32 character;
if (base::ReadUnicodeCharacter(key.data(), key_length, &char_index,
&character) &&
diff --git a/chromium/ui/events/keycodes/keyboard_code_conversion_fuchsia.cc b/chromium/ui/events/keycodes/keyboard_code_conversion_fuchsia.cc
index 0a75fbbe91e..7535bc25824 100644
--- a/chromium/ui/events/keycodes/keyboard_code_conversion_fuchsia.cc
+++ b/chromium/ui/events/keycodes/keyboard_code_conversion_fuchsia.cc
@@ -27,8 +27,15 @@ DomKey DomKeyFromFuchsiaNonPrintableKey(
DomKey DomKeyFromFuchsiaKeyMeaning(
const fuchsia::ui::input3::KeyMeaning& key_meaning) {
- if (key_meaning.is_codepoint())
+ if (key_meaning.is_codepoint()) {
+ // TODO(fxbug.dev/106600): Remove this check for codepoint zero, once the
+ // platform provides non-printable key meanings consistently.
+ if (key_meaning.codepoint() == 0)
+ return DomKey::UNIDENTIFIED;
+
return DomKey::FromCharacter(key_meaning.codepoint());
+ }
+
if (key_meaning.is_non_printable_key())
return DomKeyFromFuchsiaNonPrintableKey(key_meaning.non_printable_key());
diff --git a/chromium/ui/events/mojom/mojom_traits_unittest.cc b/chromium/ui/events/mojom/mojom_traits_unittest.cc
index 5f7a444e432..11a0f0156dd 100644
--- a/chromium/ui/events/mojom/mojom_traits_unittest.cc
+++ b/chromium/ui/events/mojom/mojom_traits_unittest.cc
@@ -111,7 +111,7 @@ TEST(StructTraitsTest, KeyEvent) {
};
for (size_t i = 0; i < std::size(kTestData); i++) {
- std::unique_ptr<Event> expected_copy = Event::Clone(kTestData[i]);
+ std::unique_ptr<Event> expected_copy = kTestData[i].Clone();
std::unique_ptr<Event> output;
ASSERT_TRUE(mojo::test::SerializeAndDeserialize<mojom::Event>(expected_copy,
output));
@@ -150,7 +150,7 @@ TEST(StructTraitsTest, MouseEvent) {
};
for (size_t i = 0; i < std::size(kTestData); i++) {
- std::unique_ptr<Event> expected_copy = Event::Clone(kTestData[i]);
+ std::unique_ptr<Event> expected_copy = kTestData[i].Clone();
std::unique_ptr<Event> output;
ASSERT_TRUE(mojo::test::SerializeAndDeserialize<mojom::Event>(expected_copy,
output));
@@ -176,7 +176,7 @@ TEST(StructTraitsTest, MouseWheelEvent) {
};
for (size_t i = 0; i < std::size(kTestData); i++) {
- std::unique_ptr<Event> expected_copy = Event::Clone(kTestData[i]);
+ std::unique_ptr<Event> expected_copy = kTestData[i].Clone();
std::unique_ptr<Event> output;
ASSERT_TRUE(mojo::test::SerializeAndDeserialize<mojom::Event>(expected_copy,
output));
@@ -206,7 +206,7 @@ TEST(StructTraitsTest, FloatingPointLocations) {
// Serialize and deserialize does not round or truncate the locations.
for (Event* event : test_data) {
- std::unique_ptr<Event> event_copy = Event::Clone(*event);
+ std::unique_ptr<Event> event_copy = event->Clone();
std::unique_ptr<Event> output;
ASSERT_TRUE(
mojo::test::SerializeAndDeserialize<mojom::Event>(event_copy, output));
@@ -225,7 +225,7 @@ TEST(StructTraitsTest, KeyEventPropertiesSerialized) {
properties[key] = value;
key_event.SetProperties(properties);
- std::unique_ptr<Event> event_ptr = Event::Clone(key_event);
+ std::unique_ptr<Event> event_ptr = key_event.Clone();
std::unique_ptr<Event> deserialized;
ASSERT_TRUE(mojom::Event::Deserialize(mojom::Event::Serialize(&event_ptr),
&deserialized));
@@ -257,7 +257,7 @@ TEST(StructTraitsTest, GestureEvent) {
};
for (size_t i = 0; i < std::size(kTestData); i++) {
- std::unique_ptr<Event> expected_copy = Event::Clone(kTestData[i]);
+ std::unique_ptr<Event> expected_copy = kTestData[i].Clone();
std::unique_ptr<Event> output;
ASSERT_TRUE(mojo::test::SerializeAndDeserialize<mojom::Event>(expected_copy,
output));
@@ -303,7 +303,7 @@ TEST(StructTraitsTest, ScrollEvent) {
};
for (size_t i = 0; i < std::size(kTestData); i++) {
- std::unique_ptr<Event> expected_copy = Event::Clone(kTestData[i]);
+ std::unique_ptr<Event> expected_copy = kTestData[i].Clone();
std::unique_ptr<Event> output;
ASSERT_TRUE(mojo::test::SerializeAndDeserialize<mojom::Event>(expected_copy,
output));
@@ -356,7 +356,7 @@ TEST(StructTraitsTest, TouchEvent) {
{ET_TOUCH_CANCELLED, {1, 2}, base::TimeTicks::Now(), {}, EF_NONE},
};
for (size_t i = 0; i < std::size(kTestData); i++) {
- std::unique_ptr<Event> expected_copy = Event::Clone(kTestData[i]);
+ std::unique_ptr<Event> expected_copy = kTestData[i].Clone();
std::unique_ptr<Event> output;
ASSERT_TRUE(mojo::test::SerializeAndDeserialize<mojom::Event>(expected_copy,
output));
diff --git a/chromium/ui/events/ozone/evdev/BUILD.gn b/chromium/ui/events/ozone/evdev/BUILD.gn
index ffb0749e886..8b49af50ac2 100644
--- a/chromium/ui/events/ozone/evdev/BUILD.gn
+++ b/chromium/ui/events/ozone/evdev/BUILD.gn
@@ -82,8 +82,6 @@ component("evdev") {
"mouse_button_map_evdev.h",
"stylus_button_event_converter_evdev.cc",
"stylus_button_event_converter_evdev.h",
- "switches.cc",
- "switches.h",
"tablet_event_converter_evdev.cc",
"tablet_event_converter_evdev.h",
"touch_evdev_debug_buffer.cc",
@@ -116,8 +114,6 @@ component("evdev") {
"touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.h",
"touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_beta.cc",
"touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_beta.h",
- "touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.cc",
- "touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.h",
"touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc",
"touch_filter/palm_model/onedevice_train_palm_detection_filter_model.h",
"touch_filter/shared_palm_detection_filter_state.h",
@@ -149,7 +145,7 @@ component("evdev") {
"numberpad_metrics.cc",
"numberpad_metrics.h",
]
- deps += [ "//chromeos/components/feature_usage" ]
+ deps += [ "//chromeos/ash/components/feature_usage" ]
}
public_configs = [ ":evdev_config" ]
@@ -215,7 +211,7 @@ source_set("event_device_info") {
visibility += [
"//ash/webui/diagnostics_ui/backend:*",
- "//chromeos/services/cros_healthd/*",
+ "//chromeos/ash/services/cros_healthd/*",
"//ui/chromeos/*",
]
}
@@ -286,7 +282,7 @@ source_set("unittests") {
if (is_chromeos_ash) {
sources += [ "numberpad_metrics_unittest.cc" ]
- deps += [ "//chromeos/components/feature_usage" ]
+ deps += [ "//chromeos/ash/components/feature_usage" ]
}
visibility += [ "//ui/events/ozone:unittests" ]
diff --git a/chromium/ui/events/ozone/evdev/DEPS b/chromium/ui/events/ozone/evdev/DEPS
index d2fc9dbc303..784355d10c9 100644
--- a/chromium/ui/events/ozone/evdev/DEPS
+++ b/chromium/ui/events/ozone/evdev/DEPS
@@ -1,3 +1,3 @@
include_rules = [
- "+chromeos/components/feature_usage/feature_usage_metrics.h"
+ "+chromeos/ash/components/feature_usage/feature_usage_metrics.h"
]
diff --git a/chromium/ui/events/ozone/evdev/event_converter_evdev_impl.cc b/chromium/ui/events/ozone/evdev/event_converter_evdev_impl.cc
index 60835c6af80..0613ae6c4eb 100644
--- a/chromium/ui/events/ozone/evdev/event_converter_evdev_impl.cc
+++ b/chromium/ui/events/ozone/evdev/event_converter_evdev_impl.cc
@@ -67,7 +67,7 @@ EventConverterEvdevImpl::EventConverterEvdevImpl(
#endif
// Converts unsigned long to uint64_t.
const auto key_bits = devinfo.GetKeyBits();
- key_bits_.resize(key_bits.size());
+ key_bits_.resize(EVDEV_BITS_TO_INT64(KEY_CNT));
for (int i = 0; i < KEY_CNT; i++) {
if (EvdevBitIsSet(key_bits.data(), i)) {
EvdevSetUint64Bit(key_bits_.data(), i);
diff --git a/chromium/ui/events/ozone/evdev/event_converter_evdev_impl.h b/chromium/ui/events/ozone/evdev/event_converter_evdev_impl.h
index 12c4e37f64e..55561e8f7f3 100644
--- a/chromium/ui/events/ozone/evdev/event_converter_evdev_impl.h
+++ b/chromium/ui/events/ozone/evdev/event_converter_evdev_impl.h
@@ -10,6 +10,7 @@
#include "base/component_export.h"
#include "base/files/file_path.h"
#include "base/files/scoped_file.h"
+#include "base/memory/raw_ptr.h"
#include "base/message_loop/message_pump_libevent.h"
#include "ui/events/devices/input_device.h"
#include "ui/events/devices/stylus_state.h"
@@ -121,10 +122,10 @@ class COMPONENT_EXPORT(EVDEV) EventConverterEvdevImpl
std::bitset<kMouseButtonCount> mouse_button_state_;
// Shared cursor state.
- CursorDelegateEvdev* const cursor_;
+ const raw_ptr<CursorDelegateEvdev> cursor_;
// Callbacks for dispatching events.
- DeviceEventDispatcherEvdev* const dispatcher_;
+ const raw_ptr<DeviceEventDispatcherEvdev> dispatcher_;
// Callback to update keyboard devices when valid input is received.
ReceivedValidInputCallback received_valid_input_callback_;
diff --git a/chromium/ui/events/ozone/evdev/event_converter_evdev_impl_unittest.cc b/chromium/ui/events/ozone/evdev/event_converter_evdev_impl_unittest.cc
index 0ceac82f6cd..f90a86ef18d 100644
--- a/chromium/ui/events/ozone/evdev/event_converter_evdev_impl_unittest.cc
+++ b/chromium/ui/events/ozone/evdev/event_converter_evdev_impl_unittest.cc
@@ -132,7 +132,7 @@ class EventConverterEvdevImplTest : public testing::Test {
private:
void DispatchEventForTest(ui::Event* event) {
- std::unique_ptr<ui::Event> cloned_event = ui::Event::Clone(*event);
+ std::unique_ptr<ui::Event> cloned_event = event->Clone();
dispatched_events_.push_back(std::move(cloned_event));
}
diff --git a/chromium/ui/events/ozone/evdev/event_converter_test_util.cc b/chromium/ui/events/ozone/evdev/event_converter_test_util.cc
index 604e07d386e..081a1894f7a 100644
--- a/chromium/ui/events/ozone/evdev/event_converter_test_util.cc
+++ b/chromium/ui/events/ozone/evdev/event_converter_test_util.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "ui/events/ozone/evdev/event_converter_test_util.h"
+#include "base/memory/raw_ptr.h"
#include <stdint.h>
@@ -110,7 +111,7 @@ class TestDeviceEventDispatcherEvdev : public DeviceEventDispatcherEvdev {
}
private:
- EventFactoryEvdev* event_factory_evdev_;
+ raw_ptr<EventFactoryEvdev> event_factory_evdev_;
};
class TestEventFactoryEvdev : public EventFactoryEvdev {
diff --git a/chromium/ui/events/ozone/evdev/event_device_info.cc b/chromium/ui/events/ozone/evdev/event_device_info.cc
index d728dba3a3e..df5600273af 100644
--- a/chromium/ui/events/ozone/evdev/event_device_info.cc
+++ b/chromium/ui/events/ozone/evdev/event_device_info.cc
@@ -53,6 +53,7 @@ constexpr auto kKeyboardBlocklist = base::MakeFixedFlatSet<DeviceId>({
{0x045e, 0x0821}, // Microsoft Surface Precision Mouse
{0x045e, 0x082a}, // Microsoft Pro IntelliMouse
{0x045e, 0x082f}, // Microsoft Bluetooth Mouse
+ {0x045e, 0x0845}, // Microsoft Ocean Plastic Mouse
{0x045e, 0x095d}, // Microsoft Surface Mobile Mouse
{0x045e, 0x0b05}, // Xbox One Elite Series 2 gamepad
{0x046d, 0x4026}, // Logitech T400
@@ -274,10 +275,9 @@ bool IsForceLibinput(const EventDeviceInfo& devinfo) {
return false;
}
-// Note: this is not SteelSeries's actual VID; the Stratus Duo just reports it
-// incorrectly over Bluetooth.
-const uint16_t kSteelSeriesStratusDuoBluetoothVendorId = 0x0111;
+const uint16_t kSteelSeriesBluetoothVendorId = 0x0111;
const uint16_t kSteelSeriesStratusDuoBluetoothProductId = 0x1431;
+const uint16_t kSteelSeriesStratusPlusBluetoothProductId = 0x1434;
bool GetEventBits(int fd,
const base::FilePath& path,
@@ -766,8 +766,9 @@ bool EventDeviceInfo::HasMouse() const {
// The SteelSeries Stratus Duo claims to be a mouse over Bluetooth, preventing
// it from being set up as a gamepad correctly, so check for its vendor and
// product ID. (b/189491809)
- if (input_id_.vendor == kSteelSeriesStratusDuoBluetoothVendorId &&
- input_id_.product == kSteelSeriesStratusDuoBluetoothProductId) {
+ if (input_id_.vendor == kSteelSeriesBluetoothVendorId &&
+ (input_id_.product == kSteelSeriesStratusDuoBluetoothProductId ||
+ input_id_.product == kSteelSeriesStratusPlusBluetoothProductId)) {
return false;
}
diff --git a/chromium/ui/events/ozone/evdev/event_factory_evdev.h b/chromium/ui/events/ozone/evdev/event_factory_evdev.h
index f3980da6f92..1d993977001 100644
--- a/chromium/ui/events/ozone/evdev/event_factory_evdev.h
+++ b/chromium/ui/events/ozone/evdev/event_factory_evdev.h
@@ -8,6 +8,7 @@
#include "base/callback.h"
#include "base/component_export.h"
#include "base/containers/flat_map.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/task/task_runner.h"
#include "ui/events/event_modifiers.h"
@@ -127,10 +128,10 @@ class COMPONENT_EXPORT(EVDEV) EventFactoryEvdev : public DeviceEventObserver,
int last_device_id_ = 0;
// Interface for scanning & monitoring input devices.
- DeviceManager* const device_manager_; // Not owned.
+ const raw_ptr<DeviceManager> device_manager_; // Not owned.
// Gamepad provider to dispatch gamepad events.
- GamepadProviderOzone* const gamepad_provider_;
+ const raw_ptr<GamepadProviderOzone> gamepad_provider_;
// Proxy for input device factory (manages device I/O objects).
// The real object lives on a different thread.
@@ -149,7 +150,7 @@ class COMPONENT_EXPORT(EVDEV) EventFactoryEvdev : public DeviceEventObserver,
KeyboardEvdev keyboard_;
// Cursor movement.
- CursorDelegateEvdev* const cursor_;
+ const raw_ptr<CursorDelegateEvdev> cursor_;
// Object for controlling input devices.
InputControllerEvdev input_controller_;
diff --git a/chromium/ui/events/ozone/evdev/event_thread_evdev.cc b/chromium/ui/events/ozone/evdev/event_thread_evdev.cc
index 591b071c4cb..1c78ca02ac1 100644
--- a/chromium/ui/events/ozone/evdev/event_thread_evdev.cc
+++ b/chromium/ui/events/ozone/evdev/event_thread_evdev.cc
@@ -10,6 +10,7 @@
#include "base/bind.h"
#include "base/callback.h"
#include "base/logging.h"
+#include "base/memory/raw_ptr.h"
#include "base/message_loop/message_pump_type.h"
#include "base/threading/thread.h"
#include "base/threading/thread_task_runner_handle.h"
@@ -62,12 +63,12 @@ class EvdevThread : public base::Thread {
private:
// Initialization bits passed from main thread.
std::unique_ptr<DeviceEventDispatcherEvdev> dispatcher_;
- CursorDelegateEvdev* cursor_;
+ raw_ptr<CursorDelegateEvdev> cursor_;
EventThreadStartCallback init_callback_;
scoped_refptr<base::SingleThreadTaskRunner> init_runner_;
// Thread-internal state.
- InputDeviceFactoryEvdev* input_device_factory_ = nullptr;
+ raw_ptr<InputDeviceFactoryEvdev> input_device_factory_ = nullptr;
};
} // namespace
@@ -87,7 +88,7 @@ void EventThreadEvdev::Start(
std::move(callback));
base::Thread::Options thread_options;
thread_options.message_pump_type = base::MessagePumpType::UI;
- thread_options.priority = base::ThreadPriority::DISPLAY;
+ thread_options.thread_type = base::ThreadType::kDisplayCritical;
if (!thread_->StartWithOptions(std::move(thread_options)))
LOG(FATAL) << "Failed to create input thread";
}
diff --git a/chromium/ui/events/ozone/evdev/fake_keyboard_heuristic_metrics.cc b/chromium/ui/events/ozone/evdev/fake_keyboard_heuristic_metrics.cc
index 5bef3c9b59a..68d960b3f7a 100644
--- a/chromium/ui/events/ozone/evdev/fake_keyboard_heuristic_metrics.cc
+++ b/chromium/ui/events/ozone/evdev/fake_keyboard_heuristic_metrics.cc
@@ -25,4 +25,4 @@ void FakeKeyboardHeuristicMetrics::RecordUsage(bool success) {
feature_usage_metrics_.RecordUsage(success);
}
-} // namespace ui \ No newline at end of file
+} // namespace ui
diff --git a/chromium/ui/events/ozone/evdev/fake_keyboard_heuristic_metrics.h b/chromium/ui/events/ozone/evdev/fake_keyboard_heuristic_metrics.h
index b07112a9a71..869cb23669e 100644
--- a/chromium/ui/events/ozone/evdev/fake_keyboard_heuristic_metrics.h
+++ b/chromium/ui/events/ozone/evdev/fake_keyboard_heuristic_metrics.h
@@ -5,11 +5,12 @@
#ifndef UI_EVENTS_OZONE_EVDEV_FAKE_KEYBOARD_HEURISTIC_METRICS_H_
#define UI_EVENTS_OZONE_EVDEV_FAKE_KEYBOARD_HEURISTIC_METRICS_H_
-#include "chromeos/components/feature_usage/feature_usage_metrics.h"
+#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h"
namespace ui {
+
class FakeKeyboardHeuristicMetrics
- : public feature_usage::FeatureUsageMetrics::Delegate {
+ : public ash::feature_usage::FeatureUsageMetrics::Delegate {
public:
explicit FakeKeyboardHeuristicMetrics();
~FakeKeyboardHeuristicMetrics() override;
@@ -19,8 +20,9 @@ class FakeKeyboardHeuristicMetrics
void RecordUsage(bool success);
private:
- feature_usage::FeatureUsageMetrics feature_usage_metrics_;
+ ash::feature_usage::FeatureUsageMetrics feature_usage_metrics_;
};
+
} // namespace ui
#endif // UI_EVENTS_OZONE_EVDEV_FAKE_KEYBOARD_HEURISTIC_METRICS_H_
diff --git a/chromium/ui/events/ozone/evdev/gamepad_event_converter_evdev.cc b/chromium/ui/events/ozone/evdev/gamepad_event_converter_evdev.cc
index fec1d4fa814..56029fba62b 100644
--- a/chromium/ui/events/ozone/evdev/gamepad_event_converter_evdev.cc
+++ b/chromium/ui/events/ozone/evdev/gamepad_event_converter_evdev.cc
@@ -60,7 +60,7 @@ GamepadEventConverterEvdev::GamepadEventConverterEvdev(
supports_rumble_ = devinfo.SupportsRumble();
// Converts unsigned long to uint64_t.
const auto key_bits = devinfo.GetKeyBits();
- key_bits_.resize(key_bits.size());
+ key_bits_.resize(EVDEV_BITS_TO_INT64(KEY_CNT));
for (int i = 0; i < KEY_CNT; i++) {
if (EvdevBitIsSet(key_bits.data(), i)) {
EvdevSetUint64Bit(key_bits_.data(), i);
diff --git a/chromium/ui/events/ozone/evdev/gamepad_event_converter_evdev.h b/chromium/ui/events/ozone/evdev/gamepad_event_converter_evdev.h
index 9270c332e74..72180efab8c 100644
--- a/chromium/ui/events/ozone/evdev/gamepad_event_converter_evdev.h
+++ b/chromium/ui/events/ozone/evdev/gamepad_event_converter_evdev.h
@@ -11,6 +11,7 @@
#include "base/containers/flat_set.h"
#include "base/files/file_path.h"
#include "base/files/scoped_file.h"
+#include "base/memory/raw_ptr.h"
#include "ui/events/devices/input_device.h"
#include "ui/events/event.h"
#include "ui/events/ozone/evdev/event_converter_evdev.h"
@@ -120,7 +121,7 @@ class COMPONENT_EXPORT(EVDEV) GamepadEventConverterEvdev
const base::ScopedFD input_device_fd_;
// Callbacks for dispatching events.
- DeviceEventDispatcherEvdev* const dispatcher_;
+ const raw_ptr<DeviceEventDispatcherEvdev> dispatcher_;
// The effect id is needed to keep track of effects that are uploaded and
// stored in the gamepad device.
diff --git a/chromium/ui/events/ozone/evdev/input_controller_evdev.h b/chromium/ui/events/ozone/evdev/input_controller_evdev.h
index 6aa1b8bdf41..89c5ff94d8e 100644
--- a/chromium/ui/events/ozone/evdev/input_controller_evdev.h
+++ b/chromium/ui/events/ozone/evdev/input_controller_evdev.h
@@ -9,6 +9,7 @@
#include "base/component_export.h"
#include "base/gtest_prod_util.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "ui/events/devices/haptic_touchpad_effects.h"
@@ -147,19 +148,19 @@ class COMPONENT_EXPORT(EVDEV) InputControllerEvdev : public InputController {
bool settings_update_pending_ = false;
// Factory for devices. Needed to update device config.
- InputDeviceFactoryEvdevProxy* input_device_factory_ = nullptr;
+ raw_ptr<InputDeviceFactoryEvdevProxy> input_device_factory_ = nullptr;
// Keyboard state.
- KeyboardEvdev* const keyboard_;
+ const raw_ptr<KeyboardEvdev> keyboard_;
// Keyboard keybits.
base::flat_map<int, std::vector<uint64_t>> keyboard_key_bits_mapping_;
// Mouse button map.
- MouseButtonMapEvdev* const mouse_button_map_;
+ const raw_ptr<MouseButtonMapEvdev> mouse_button_map_;
// Pointing stick button map.
- MouseButtonMapEvdev* const pointing_stick_button_map_;
+ const raw_ptr<MouseButtonMapEvdev> pointing_stick_button_map_;
// Gamepad keybits.
base::flat_map<int, std::vector<uint64_t>> gamepad_key_bits_mapping_;
diff --git a/chromium/ui/events/ozone/evdev/input_device_factory_evdev.cc b/chromium/ui/events/ozone/evdev/input_device_factory_evdev.cc
index 59ceb06ca91..764b405d3b9 100644
--- a/chromium/ui/events/ozone/evdev/input_device_factory_evdev.cc
+++ b/chromium/ui/events/ozone/evdev/input_device_factory_evdev.cc
@@ -21,6 +21,7 @@
#include "ui/events/devices/device_data_manager.h"
#include "ui/events/devices/device_util_linux.h"
#include "ui/events/devices/stylus_state.h"
+#include "ui/events/event_switches.h"
#include "ui/events/ozone/evdev/device_event_dispatcher_evdev.h"
#include "ui/events/ozone/evdev/event_converter_evdev_impl.h"
#include "ui/events/ozone/evdev/event_device_info.h"
@@ -28,7 +29,6 @@
#include "ui/events/ozone/evdev/keyboard_imposter_checker_evdev.h"
#include "ui/events/ozone/evdev/microphone_mute_switch_event_converter_evdev.h"
#include "ui/events/ozone/evdev/stylus_button_event_converter_evdev.h"
-#include "ui/events/ozone/evdev/switches.h"
#include "ui/events/ozone/evdev/tablet_event_converter_evdev.h"
#include "ui/events/ozone/evdev/touch_evdev_types.h"
#include "ui/events/ozone/evdev/touch_event_converter_evdev.h"
diff --git a/chromium/ui/events/ozone/evdev/input_device_factory_evdev.h b/chromium/ui/events/ozone/evdev/input_device_factory_evdev.h
index c4256533453..5ee0b65aa45 100644
--- a/chromium/ui/events/ozone/evdev/input_device_factory_evdev.h
+++ b/chromium/ui/events/ozone/evdev/input_device_factory_evdev.h
@@ -13,6 +13,7 @@
#include "base/callback.h"
#include "base/component_export.h"
#include "base/files/file_path.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/task/sequenced_task_runner.h"
@@ -144,7 +145,7 @@ class COMPONENT_EXPORT(EVDEV) InputDeviceFactoryEvdev {
const scoped_refptr<base::SequencedTaskRunner> task_runner_;
// Cursor movement.
- CursorDelegateEvdev* const cursor_;
+ const raw_ptr<CursorDelegateEvdev> cursor_;
// Shared Palm state.
const std::unique_ptr<SharedPalmDetectionFilterState> shared_palm_state_;
diff --git a/chromium/ui/events/ozone/evdev/input_device_opener.h b/chromium/ui/events/ozone/evdev/input_device_opener.h
index 0bf94b45765..d0d2200f431 100644
--- a/chromium/ui/events/ozone/evdev/input_device_opener.h
+++ b/chromium/ui/events/ozone/evdev/input_device_opener.h
@@ -5,6 +5,7 @@
#ifndef UI_EVENTS_OZONE_EVDEV_INPUT_DEVICE_OPENER_H_
#define UI_EVENTS_OZONE_EVDEV_INPUT_DEVICE_OPENER_H_
+#include "base/memory/raw_ptr.h"
#include "ui/events/ozone/evdev/event_converter_evdev.h"
#include "ui/events/ozone/evdev/touch_filter/shared_palm_detection_filter_state.h"
@@ -25,14 +26,14 @@ struct OpenInputDeviceParams {
base::FilePath path;
// Dispatcher for events.
- DeviceEventDispatcherEvdev* dispatcher;
+ raw_ptr<DeviceEventDispatcherEvdev> dispatcher;
// State shared between devices.
- CursorDelegateEvdev* cursor;
+ raw_ptr<CursorDelegateEvdev> cursor;
#if defined(USE_EVDEV_GESTURES)
GesturePropertyProvider* gesture_property_provider;
#endif
- SharedPalmDetectionFilterState* shared_palm_state;
+ raw_ptr<SharedPalmDetectionFilterState> shared_palm_state;
};
class COMPONENT_EXPORT(EVDEV) InputDeviceOpener {
diff --git a/chromium/ui/events/ozone/evdev/input_device_opener_evdev.cc b/chromium/ui/events/ozone/evdev/input_device_opener_evdev.cc
index e91a33054c3..b1d477b5513 100644
--- a/chromium/ui/events/ozone/evdev/input_device_opener_evdev.cc
+++ b/chromium/ui/events/ozone/evdev/input_device_opener_evdev.cc
@@ -11,11 +11,11 @@
#include "base/files/scoped_file.h"
#include "base/memory/ptr_util.h"
#include "base/trace_event/trace_event.h"
+#include "ui/events/event_switches.h"
#include "ui/events/ozone/evdev/event_converter_evdev_impl.h"
#include "ui/events/ozone/evdev/gamepad_event_converter_evdev.h"
#include "ui/events/ozone/evdev/microphone_mute_switch_event_converter_evdev.h"
#include "ui/events/ozone/evdev/stylus_button_event_converter_evdev.h"
-#include "ui/events/ozone/evdev/switches.h"
#include "ui/events/ozone/evdev/tablet_event_converter_evdev.h"
#include "ui/events/ozone/evdev/touch_event_converter_evdev.h"
@@ -89,7 +89,7 @@ std::unique_ptr<EventConverterEvdev> CreateConverter(
}
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
- kEnableMicrophoneMuteSwitchDeviceSwitch) &&
+ switches::kEnableMicrophoneMuteSwitchDeviceSwitch) &&
devinfo.IsMicrophoneMuteSwitchDevice()) {
return base::WrapUnique<EventConverterEvdev>(
new MicrophoneMuteSwitchEventConverterEvdev(
diff --git a/chromium/ui/events/ozone/evdev/input_injector_evdev.h b/chromium/ui/events/ozone/evdev/input_injector_evdev.h
index d733fb9d2f1..7b70f51eb93 100644
--- a/chromium/ui/events/ozone/evdev/input_injector_evdev.h
+++ b/chromium/ui/events/ozone/evdev/input_injector_evdev.h
@@ -6,6 +6,7 @@
#define UI_EVENTS_OZONE_EVDEV_INPUT_INJECTOR_EVDEV_H_
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
#include "ui/events/event_constants.h"
#include "ui/events/ozone/evdev/event_dispatch_callback.h"
#include "ui/ozone/public/system_input_injector.h"
@@ -36,7 +37,7 @@ class COMPONENT_EXPORT(EVDEV) InputInjectorEvdev : public SystemInputInjector {
private:
// Shared cursor state.
- CursorDelegateEvdev* const cursor_;
+ const raw_ptr<CursorDelegateEvdev> cursor_;
int device_id_ = ED_UNKNOWN_DEVICE;
diff --git a/chromium/ui/events/ozone/evdev/keyboard_evdev.h b/chromium/ui/events/ozone/evdev/keyboard_evdev.h
index c7e0768099e..3fdd8622671 100644
--- a/chromium/ui/events/ozone/evdev/keyboard_evdev.h
+++ b/chromium/ui/events/ozone/evdev/keyboard_evdev.h
@@ -10,6 +10,7 @@
#include <bitset>
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "ui/events/ozone/evdev/event_device_util.h"
@@ -98,10 +99,10 @@ class COMPONENT_EXPORT(EVDEV) KeyboardEvdev
const EventDispatchCallback callback_;
// Shared modifier state.
- EventModifiers* const modifiers_;
+ const raw_ptr<EventModifiers> modifiers_;
// Shared layout engine.
- KeyboardLayoutEngine* const keyboard_layout_engine_;
+ const raw_ptr<KeyboardLayoutEngine> keyboard_layout_engine_;
// Key repeat handler.
EventAutoRepeatHandler auto_repeat_handler_;
diff --git a/chromium/ui/events/ozone/evdev/microphone_mute_switch_event_converter_evdev.h b/chromium/ui/events/ozone/evdev/microphone_mute_switch_event_converter_evdev.h
index c7b2d08df84..abeb22e6abc 100644
--- a/chromium/ui/events/ozone/evdev/microphone_mute_switch_event_converter_evdev.h
+++ b/chromium/ui/events/ozone/evdev/microphone_mute_switch_event_converter_evdev.h
@@ -8,6 +8,7 @@
#include "base/component_export.h"
#include "base/files/file_path.h"
#include "base/files/scoped_file.h"
+#include "base/memory/raw_ptr.h"
#include "ui/events/ozone/evdev/event_converter_evdev.h"
#include "ui/events/ozone/evdev/event_device_info.h"
@@ -42,7 +43,7 @@ class COMPONENT_EXPORT(EVDEV) MicrophoneMuteSwitchEventConverterEvdev
const base::ScopedFD input_device_fd_;
// Callbacks for dispatching events.
- DeviceEventDispatcherEvdev* const dispatcher_;
+ const raw_ptr<DeviceEventDispatcherEvdev> dispatcher_;
};
} // namespace ui
diff --git a/chromium/ui/events/ozone/evdev/numberpad_metrics.h b/chromium/ui/events/ozone/evdev/numberpad_metrics.h
index c52b0ccd61c..5a632def25e 100644
--- a/chromium/ui/events/ozone/evdev/numberpad_metrics.h
+++ b/chromium/ui/events/ozone/evdev/numberpad_metrics.h
@@ -7,15 +7,16 @@
#include "base/component_export.h"
#include "base/no_destructor.h"
-#include "chromeos/components/feature_usage/feature_usage_metrics.h"
+#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h"
#include "ui/events/devices/input_device.h"
namespace ui {
+
class NumberpadMetricsTest;
// Combine delegate callbacks and FeatureUsageMetrics state for each metric.
class COMPONENT_EXPORT(EVDEV) NumberpadMetricsDelegate final
- : public feature_usage::FeatureUsageMetrics::Delegate {
+ : public ash::feature_usage::FeatureUsageMetrics::Delegate {
public:
explicit NumberpadMetricsDelegate(const std::string& feature_name);
NumberpadMetricsDelegate(const NumberpadMetricsDelegate&) = delete;
@@ -26,14 +27,14 @@ class COMPONENT_EXPORT(EVDEV) NumberpadMetricsDelegate final
void SetState(bool now_eligible, bool now_enabled);
void SetState(bool now_eligible) { SetState(now_eligible, now_eligible); }
- // feature_usage::NumberpadMetricsDelegate::Delegate:
+ // ash::feature_usage::NumberpadMetricsDelegate::Delegate:
bool IsEligible() const final;
bool IsEnabled() const final;
private:
bool eligible_ = false;
bool enabled_ = false;
- feature_usage::FeatureUsageMetrics metrics_;
+ ash::feature_usage::FeatureUsageMetrics metrics_;
};
// A class that records number-pad related metrics.
diff --git a/chromium/ui/events/ozone/evdev/numberpad_metrics_unittest.cc b/chromium/ui/events/ozone/evdev/numberpad_metrics_unittest.cc
index a2b5c492dc5..f7883baf92f 100644
--- a/chromium/ui/events/ozone/evdev/numberpad_metrics_unittest.cc
+++ b/chromium/ui/events/ozone/evdev/numberpad_metrics_unittest.cc
@@ -17,6 +17,7 @@
#include "base/test/metrics/histogram_tester.h"
#include "base/test/task_environment.h"
#include "base/time/time.h"
+#include "chromeos/ash/components/feature_usage/feature_usage_metrics.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/events/ozone/device/device_manager.h"
@@ -29,8 +30,12 @@
#include "ui/events/ozone/evdev/testing/fake_cursor_delegate_evdev.h"
#include "ui/events/ozone/layout/stub/stub_keyboard_layout_engine.h"
+namespace ui {
+
namespace {
+using FeatureUsageEvent = ::ash::feature_usage::FeatureUsageMetrics::Event;
+
// TODO(b/202039817): Should not need internal detail of feature_usage_metrics
constexpr char kFeatureUsageMetricPrefix[] = "ChromeOS.FeatureUsage.";
@@ -49,10 +54,6 @@ constexpr char kFeatureUsageMetricPrefix[] = "ChromeOS.FeatureUsage.";
} // namespace
-namespace ui {
-
-using FeatureUsageEvent = feature_usage::FeatureUsageMetrics::Event;
-
class NumberpadMetricsTest : public ::testing::Test {
// Structures for keyword parameters to check utilities.
struct DynamicMetricsExpectations {
@@ -287,7 +288,7 @@ class NumberpadMetricsTest : public ::testing::Test {
// markers. Use is coupled with EXPECT_METRIC_*() above.
void DelayForPeriodicMetrics() {
task_environment_.AdvanceClock(
- feature_usage::FeatureUsageMetrics::kRepeatedInterval +
+ ash::feature_usage::FeatureUsageMetrics::kRepeatedInterval +
base::Seconds(30));
base::RunLoop().RunUntilIdle();
}
diff --git a/chromium/ui/events/ozone/evdev/stylus_button_event_converter_evdev.h b/chromium/ui/events/ozone/evdev/stylus_button_event_converter_evdev.h
index 700c1c46be5..e37d61aeebd 100644
--- a/chromium/ui/events/ozone/evdev/stylus_button_event_converter_evdev.h
+++ b/chromium/ui/events/ozone/evdev/stylus_button_event_converter_evdev.h
@@ -8,6 +8,7 @@
#include "base/component_export.h"
#include "base/files/file_path.h"
#include "base/files/scoped_file.h"
+#include "base/memory/raw_ptr.h"
#include "ui/events/ozone/evdev/event_converter_evdev.h"
#include "ui/events/ozone/evdev/event_device_info.h"
@@ -43,7 +44,7 @@ class COMPONENT_EXPORT(EVDEV) StylusButtonEventConverterEvdev
const base::ScopedFD input_device_fd_;
// Callbacks for dispatching events.
- DeviceEventDispatcherEvdev* const dispatcher_;
+ const raw_ptr<DeviceEventDispatcherEvdev> dispatcher_;
};
} // namespace ui
diff --git a/chromium/ui/events/ozone/evdev/stylus_button_event_converter_evdev_unittest.cc b/chromium/ui/events/ozone/evdev/stylus_button_event_converter_evdev_unittest.cc
index eea65213872..e3c981be278 100644
--- a/chromium/ui/events/ozone/evdev/stylus_button_event_converter_evdev_unittest.cc
+++ b/chromium/ui/events/ozone/evdev/stylus_button_event_converter_evdev_unittest.cc
@@ -153,7 +153,7 @@ class StylusButtonEventConverterEvdevTest : public testing::Test {
}
void DispatchEventForTest(ui::Event* event) {
- std::unique_ptr<ui::Event> cloned_event = ui::Event::Clone(*event);
+ std::unique_ptr<ui::Event> cloned_event = event->Clone();
dispatched_events_.push_back(std::move(cloned_event));
}
diff --git a/chromium/ui/events/ozone/evdev/switches.cc b/chromium/ui/events/ozone/evdev/switches.cc
deleted file mode 100644
index a83cb0c7a07..00000000000
--- a/chromium/ui/events/ozone/evdev/switches.cc
+++ /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.
-
-#include "ui/events/ozone/evdev/switches.h"
-
-namespace ui {
-
-// Enables logic to detect microphone mute switch device state, which disables
-// internal audio input when toggled.
-constexpr char kEnableMicrophoneMuteSwitchDeviceSwitch[] =
- "enable-microphone-mute-switch-device";
-
-} // namespace ui
diff --git a/chromium/ui/events/ozone/evdev/switches.h b/chromium/ui/events/ozone/evdev/switches.h
deleted file mode 100644
index 40965055a14..00000000000
--- a/chromium/ui/events/ozone/evdev/switches.h
+++ /dev/null
@@ -1,17 +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 UI_EVENTS_OZONE_EVDEV_SWITCHES_H_
-#define UI_EVENTS_OZONE_EVDEV_SWITCHES_H_
-
-#include "base/component_export.h"
-
-namespace ui {
-
-COMPONENT_EXPORT(EVDEV)
-extern const char kEnableMicrophoneMuteSwitchDeviceSwitch[];
-
-} // namespace ui
-
-#endif // UI_EVENTS_OZONE_EVDEV_SWITCHES_H_
diff --git a/chromium/ui/events/ozone/evdev/tablet_event_converter_evdev.h b/chromium/ui/events/ozone/evdev/tablet_event_converter_evdev.h
index 4a817d5005a..b37cdd36b0e 100644
--- a/chromium/ui/events/ozone/evdev/tablet_event_converter_evdev.h
+++ b/chromium/ui/events/ozone/evdev/tablet_event_converter_evdev.h
@@ -8,6 +8,7 @@
#include "base/component_export.h"
#include "base/files/file_path.h"
#include "base/files/scoped_file.h"
+#include "base/memory/raw_ptr.h"
#include "base/message_loop/message_pump_libevent.h"
#include "ui/events/event.h"
#include "ui/events/event_modifiers.h"
@@ -60,10 +61,10 @@ class COMPONENT_EXPORT(EVDEV) TabletEventConverterEvdev
base::MessagePumpLibevent::FdWatchController controller_;
// Shared cursor state.
- CursorDelegateEvdev* const cursor_;
+ const raw_ptr<CursorDelegateEvdev> cursor_;
// Dispatcher for events.
- DeviceEventDispatcherEvdev* const dispatcher_;
+ const raw_ptr<DeviceEventDispatcherEvdev> dispatcher_;
int y_abs_location_ = 0;
int x_abs_location_ = 0;
diff --git a/chromium/ui/events/ozone/evdev/tablet_event_converter_evdev_unittest.cc b/chromium/ui/events/ozone/evdev/tablet_event_converter_evdev_unittest.cc
index a37706d6e88..00e4c72964b 100644
--- a/chromium/ui/events/ozone/evdev/tablet_event_converter_evdev_unittest.cc
+++ b/chromium/ui/events/ozone/evdev/tablet_event_converter_evdev_unittest.cc
@@ -264,7 +264,7 @@ class TabletEventConverterEvdevTest : public testing::Test {
}
void DispatchEventForTest(ui::Event* event) {
- std::unique_ptr<ui::Event> cloned_event = ui::Event::Clone(*event);
+ std::unique_ptr<ui::Event> cloned_event = event->Clone();
dispatched_events_.push_back(std::move(cloned_event));
}
diff --git a/chromium/ui/events/ozone/evdev/touch_event_converter_evdev.h b/chromium/ui/events/ozone/evdev/touch_event_converter_evdev.h
index 93b81ebbd2d..76a0569c5a4 100644
--- a/chromium/ui/events/ozone/evdev/touch_event_converter_evdev.h
+++ b/chromium/ui/events/ozone/evdev/touch_event_converter_evdev.h
@@ -14,6 +14,8 @@
#include <queue>
// See if we compile against new enough headers and add missing definition
// if the headers are too old.
+#include "base/memory/raw_ptr.h"
+
#ifndef MT_TOOL_PALM
#define MT_TOOL_PALM 2
#endif
@@ -138,7 +140,7 @@ class COMPONENT_EXPORT(EVDEV) TouchEventConverterEvdev
const base::ScopedFD input_device_fd_;
// Dispatcher for events.
- DeviceEventDispatcherEvdev* const dispatcher_;
+ const raw_ptr<DeviceEventDispatcherEvdev> dispatcher_;
// Set if we drop events in kernel (SYN_DROPPED) or in process.
bool dropped_events_ = false;
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.cc b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.cc
index 85c7124b7b2..bf7de5700a3 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.cc
+++ b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.cc
@@ -146,11 +146,9 @@ void NeuralStylusPalmDetectionFilter::Filter(
DCHECK_NE(tracking_id, -1);
DCHECK(strokes_.count(tracking_id) == 0)
<< " Tracking id " << tracking_id;
- // Stroke new_stroke(model_->config().max_sample_count); // TODO:save the
- // constant here.
- strokes_.emplace(std::make_pair(
- tracking_id, PalmFilterStroke(model_->config().max_sample_count)));
- strokes_.find(tracking_id)->second.SetTrackingId(tracking_id);
+
+ strokes_.emplace(tracking_id,
+ PalmFilterStroke(model_->config(), tracking_id));
tracking_ids_[slot] = tracking_id;
is_palm_.set(slot, false);
is_delay_.set(slot, false);
@@ -192,8 +190,8 @@ void NeuralStylusPalmDetectionFilter::Filter(
}
// Add the sample to the stroke.
- stroke.AddSample(CreatePalmFilterSample(touch, time, model_->config(),
- palm_filter_dev_info_));
+ stroke.ProcessSample(CreatePalmFilterSample(touch, time, model_->config(),
+ palm_filter_dev_info_));
if (!is_palm_.test(slot) && ShouldDecideStroke(stroke)) {
// slots_to_decide will have is_delay_ set to false anyway, no need to do
// the delay detection.
@@ -232,7 +230,7 @@ void NeuralStylusPalmDetectionFilter::Filter(
LOG(DFATAL) << "Unable to find marked stroke.";
continue;
}
- auto& stroke = lookup->second;
+ const auto& stroke = lookup->second;
if (stroke.samples_seen() < model_->config().min_sample_count) {
// in very short strokes: we use a heuristic.
is_palm_.set(slot, IsHeuristicPalmStroke(stroke));
@@ -265,8 +263,7 @@ bool NeuralStylusPalmDetectionFilter::ShouldDecideStroke(
return false;
// Only inference at start.
- if (stroke.samples_seen() >
- config.max_sequence_start_count_for_inference + config.max_sample_count)
+ if (stroke.samples_seen() > config.max_sample_count)
return false;
return true;
}
@@ -370,15 +367,12 @@ void NeuralStylusPalmDetectionFilter::AppendFeatures(
std::vector<float>* features) const {
const int size = stroke.samples().size();
for (int i = 0; i < size; ++i) {
- const auto& sample = stroke.samples()[i];
+ const PalmFilterSample& sample = stroke.samples()[i];
features->push_back(sample.major_radius);
features->push_back(sample.minor_radius <= 0.0 ? sample.major_radius
: sample.minor_radius);
- float distance;
- if (i == 0) {
- distance = 0;
-
- } else {
+ float distance = 0;
+ if (i != 0) {
distance = EuclideanDistance(stroke.samples()[i - 1].point, sample.point);
}
features->push_back(distance);
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h
index c6c25888f11..7dda05e2573 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h
+++ b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h
@@ -11,6 +11,7 @@
#include "base/component_export.h"
#include "base/time/time.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
namespace ui {
@@ -40,8 +41,6 @@ struct COMPONENT_EXPORT(EVDEV) NeuralStylusPalmDetectionFilterModelConfig {
// Minimum count of samples for a stroke to be considered as a neighbor.
uint32_t neighbor_min_sample_count = 0;
- uint32_t max_sequence_start_count_for_inference = 0;
-
bool include_sequence_count_in_strokes = false;
// If this number is positive, short strokes with a touch major greater than
@@ -90,6 +89,12 @@ struct COMPONENT_EXPORT(EVDEV) NeuralStylusPalmDetectionFilterModelConfig {
// If a stroke has these numbers of samples, run an early stage detection to
// check if it's spurious and mark it held if so.
std::unordered_set<uint32_t> early_stage_sample_counts;
+
+ // If set, time between values to resample. Must match the value coded into
+ // model. Currently the model is developed for 120Hz touch devices, so this
+ // value must be set to "8 ms" if your device has a different refresh rate.
+ // If not set, no resampling is done.
+ absl::optional<base::TimeDelta> resample_period;
};
// An abstract model utilized by NueralStylusPalmDetectionFilter.
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_unittest.cc b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_unittest.cc
index 9bbfdf816db..11e2fedfce1 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_unittest.cc
+++ b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_unittest.cc
@@ -8,6 +8,7 @@
#include <utility>
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "base/test/gtest_util.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -64,7 +65,7 @@ class NeuralStylusPalmDetectionFilterTest : public testing::Test {
std::unique_ptr<SharedPalmDetectionFilterState> shared_palm_state;
EventDeviceInfo nocturne_touchscreen_;
// Owned by the filter.
- MockNeuralModel* model_;
+ raw_ptr<MockNeuralModel> model_;
NeuralStylusPalmDetectionFilterModelConfig model_config_;
std::unique_ptr<PalmDetectionFilter> palm_detection_filter_;
};
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.cc b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.cc
index 0c868728489..ffdf1fa2c8e 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.cc
+++ b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.cc
@@ -58,6 +58,48 @@ float ScaledRadius(
}
return return_value;
}
+
+float interpolate(float start_value, float end_value, float proportion) {
+ return start_value + (end_value - start_value) * proportion;
+}
+
+/**
+ * During resampling, the later events are used as a basis to populate
+ * non-resampled fields like major and minor. However, if the requested time is
+ * within this delay of the earlier event, the earlier event will be used as a
+ * basis instead.
+ */
+const static auto kPreferInitialEventDelay = base::Microseconds(1);
+
+/**
+ * Interpolate between the "before" and "after" events to get a resampled value
+ * at the timestamp 'time'. Not all fields are interpolated. For fields that are
+ * not interpolated, the values are taken from the 'after' sample unless the
+ * requested time is very close to the 'before' sample.
+ */
+PalmFilterSample getSampleAtTime(base::TimeTicks time,
+ const PalmFilterSample& before,
+ const PalmFilterSample& after) {
+ // Use the newest sample as the base, except when the requested time is very
+ // close to the 'before' sample.
+ PalmFilterSample result = after;
+ if (time - before.time < kPreferInitialEventDelay) {
+ result = before;
+ }
+ // Only the x and y values are interpolated. We could also interpolate the
+ // oval size and orientation, but it's not a simple computation, and would
+ // likely not provide much value.
+ const float proportion =
+ static_cast<float>((time - before.time).InNanoseconds()) /
+ (after.time - before.time).InNanoseconds();
+ result.edge = interpolate(before.edge, after.edge, proportion);
+ result.point.set_x(
+ interpolate(before.point.x(), after.point.x(), proportion));
+ result.point.set_y(
+ interpolate(before.point.y(), after.point.y(), proportion));
+ result.time = time;
+ return result;
+}
} // namespace
PalmFilterSample CreatePalmFilterSample(
@@ -72,21 +114,21 @@ PalmFilterSample CreatePalmFilterSample(
sample.time = time;
sample.major_radius = ScaledRadius(
- std::max(touch.major, touch.minor) * dev_info.major_radius_res,
+ std::max(touch.major, touch.minor) / dev_info.major_radius_res,
model_config);
if (dev_info.minor_radius_supported) {
sample.minor_radius = ScaledRadius(
- std::min(touch.major, touch.minor) * dev_info.minor_radius_res,
+ std::min(touch.major, touch.minor) / dev_info.minor_radius_res,
model_config);
} else {
sample.minor_radius = ScaledRadius(touch.major, model_config);
}
- // Nearest edge distance, in cm.
float nearest_x_edge = std::min(touch.x, dev_info.max_x - touch.x);
float nearest_y_edge = std::min(touch.y, dev_info.max_y - touch.y);
float normalized_x_edge = nearest_x_edge / dev_info.x_res;
float normalized_y_edge = nearest_y_edge / dev_info.y_res;
+ // Nearest edge distance, in mm.
sample.edge = std::min(normalized_x_edge, normalized_y_edge);
sample.point =
gfx::PointF(touch.x / dev_info.x_res, touch.y / dev_info.y_res);
@@ -96,25 +138,62 @@ PalmFilterSample CreatePalmFilterSample(
return sample;
}
-PalmFilterStroke::PalmFilterStroke(size_t max_length)
- : max_length_(max_length) {}
+PalmFilterStroke::PalmFilterStroke(
+ const NeuralStylusPalmDetectionFilterModelConfig& model_config,
+ int tracking_id)
+ : tracking_id_(tracking_id),
+ max_sample_count_(model_config.max_sample_count),
+ resample_period_(model_config.resample_period) {}
PalmFilterStroke::PalmFilterStroke(const PalmFilterStroke& other) = default;
PalmFilterStroke::PalmFilterStroke(PalmFilterStroke&& other) = default;
-PalmFilterStroke& PalmFilterStroke::operator=(const PalmFilterStroke& other) =
- default;
-PalmFilterStroke& PalmFilterStroke::operator=(PalmFilterStroke&& other) =
- default;
PalmFilterStroke::~PalmFilterStroke() {}
+void PalmFilterStroke::ProcessSample(const PalmFilterSample& sample) {
+ DCHECK_EQ(tracking_id_, sample.tracking_id);
+ if (resample_period_.has_value()) {
+ Resample(sample);
+ return;
+ }
+
+ AddSample(sample);
+
+ while (samples_.size() > max_sample_count_) {
+ AddToUnscaledCentroid(-samples_.front().point.OffsetFromOrigin());
+ samples_.pop_front();
+ }
+}
+
void PalmFilterStroke::AddSample(const PalmFilterSample& sample) {
+ AddToUnscaledCentroid(sample.point.OffsetFromOrigin());
+ samples_.push_back(sample);
samples_seen_++;
- if (samples_.empty()) {
- tracking_id_ = sample.tracking_id;
+}
+
+/**
+ * When resampling is enabled, we don't store all samples. Only the resampled
+ * values are stored into samples_. In addition, the last real event is stored
+ * into last_sample_, which is used to calculate the resampled values.
+ */
+void PalmFilterStroke::Resample(const PalmFilterSample& sample) {
+ if (samples_seen_ == 0) {
+ AddSample(sample);
+ last_sample_ = sample;
+ return;
}
- DCHECK_EQ(tracking_id_, sample.tracking_id);
- samples_.push_back(sample);
- AddToUnscaledCentroid(sample.point.OffsetFromOrigin());
- while (samples_.size() > max_length_) {
+
+ // We already have a valid last sample here.
+ DCHECK_LE(last_sample_.time, sample.time);
+ // Generate resampled values
+ base::TimeTicks next_sample_time = samples_.back().time + *resample_period_;
+ while (next_sample_time <= sample.time) {
+ AddSample(getSampleAtTime(next_sample_time, last_sample_, sample));
+ next_sample_time = samples_.back().time + (*resample_period_);
+ }
+ last_sample_ = sample;
+
+ // Prune the resampled collection
+ while ((samples_.back().time - samples_.front().time) >=
+ (*resample_period_) * max_sample_count_) {
AddToUnscaledCentroid(-samples_.front().point.OffsetFromOrigin());
samples_.pop_front();
}
@@ -148,10 +227,6 @@ uint64_t PalmFilterStroke::samples_seen() const {
return samples_seen_;
}
-void PalmFilterStroke::SetTrackingId(int tracking_id) {
- tracking_id_ = tracking_id;
-}
-
float PalmFilterStroke::MaxMajorRadius() const {
float maximum = 0.0;
for (const auto& sample : samples_) {
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.h b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.h
index b9d97e5493b..63e452f8cd5 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.h
+++ b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.h
@@ -39,6 +39,13 @@ struct COMPONENT_EXPORT(EVDEV) PalmFilterSample {
int tracking_id = 0;
gfx::PointF point;
base::TimeTicks time;
+
+ bool operator==(const PalmFilterSample& other) const {
+ return major_radius == other.major_radius &&
+ minor_radius == other.minor_radius && pressure == other.pressure &&
+ edge == other.edge && tracking_id == other.tracking_id &&
+ point == other.point && time == other.time;
+ }
};
COMPONENT_EXPORT(EVDEV)
@@ -50,30 +57,50 @@ PalmFilterSample CreatePalmFilterSample(
class COMPONENT_EXPORT(EVDEV) PalmFilterStroke {
public:
- explicit PalmFilterStroke(size_t max_length);
+ explicit PalmFilterStroke(
+ const NeuralStylusPalmDetectionFilterModelConfig& model_config,
+ int tracking_id);
PalmFilterStroke(const PalmFilterStroke& other);
PalmFilterStroke(PalmFilterStroke&& other);
- PalmFilterStroke& operator=(const PalmFilterStroke& other);
- PalmFilterStroke& operator=(PalmFilterStroke&& other);
~PalmFilterStroke();
- void AddSample(const PalmFilterSample& sample);
+ void ProcessSample(const PalmFilterSample& sample);
gfx::PointF GetCentroid() const;
float BiggestSize() const;
// If no elements in stroke, returns 0.0;
float MaxMajorRadius() const;
- void SetTrackingId(int tracking_id);
const std::deque<PalmFilterSample>& samples() const;
uint64_t samples_seen() const;
int tracking_id() const;
private:
void AddToUnscaledCentroid(const gfx::Vector2dF point);
+ void AddSample(const PalmFilterSample& sample);
+ /**
+ * Process the sample. Potentially store the resampled sample into samples_.
+ */
+ void Resample(const PalmFilterSample& sample);
std::deque<PalmFilterSample> samples_;
- int tracking_id_ = 0;
+ const int tracking_id_;
+ /**
+ * How many total samples have been reported for this stroke. This is
+ * different from samples_.size() because samples_ will get pruned to only
+ * keep a certain number of last samples.
+ * When resampling is enabled, this value will be equal to the number of
+ * resampled values that this stroke has received. It may not be equal to the
+ * number of times 'AddSample' has been called.
+ */
uint64_t samples_seen_ = 0;
- uint64_t max_length_;
+ /**
+ * The last sample seen by the model. Used when resampling is enabled in order
+ * to compute the resampled value.
+ */
+ PalmFilterSample last_sample_;
+
+ const uint64_t max_sample_count_;
+ const absl::optional<base::TimeDelta> resample_period_;
+
gfx::PointF unscaled_centroid_ = gfx::PointF(0., 0.);
// Used in part of the kahan summation.
gfx::Vector2dF unscaled_centroid_sum_error_ =
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util_unittest.cc b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util_unittest.cc
index d2c92c0600b..efbcb1cc3cf 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util_unittest.cc
+++ b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util_unittest.cc
@@ -9,15 +9,25 @@
#include <utility>
#include <vector>
+#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/events/ozone/evdev/event_device_test_util.h"
#include "ui/events/ozone/evdev/touch_evdev_types.h"
#include "ui/events/ozone/evdev/touch_filter/palm_detection_filter.h"
#include "ui/events/ozone/evdev/touch_filter/shared_palm_detection_filter_state.h"
+using ::testing::ElementsAre;
+using ::testing::IsEmpty;
+
namespace ui {
-class NeuralStylusPalmDetectionFilterUtilTest : public testing::Test {
+MATCHER_P(SampleTime, time, "Does the sample have given time.") {
+ *result_listener << "Sample time" << arg.time << " is not " << time;
+ return time == arg.time;
+}
+
+class NeuralStylusPalmDetectionFilterUtilTest
+ : public testing::TestWithParam<bool> {
public:
NeuralStylusPalmDetectionFilterUtilTest() = default;
@@ -35,6 +45,11 @@ class NeuralStylusPalmDetectionFilterUtilTest : public testing::Test {
touch_.tracking_id = 22;
touch_.x = 21;
touch_.y = 20;
+ model_config_.max_sample_count = 3;
+ const bool resample_touch = GetParam();
+ if (resample_touch) {
+ model_config_.resample_period = base::Milliseconds(8);
+ }
}
protected:
@@ -43,7 +58,15 @@ class NeuralStylusPalmDetectionFilterUtilTest : public testing::Test {
NeuralStylusPalmDetectionFilterModelConfig model_config_;
};
-TEST_F(NeuralStylusPalmDetectionFilterUtilTest, DistilledNocturneTest) {
+INSTANTIATE_TEST_SUITE_P(ParametricUtilTest,
+ NeuralStylusPalmDetectionFilterUtilTest,
+ ::testing::Bool(),
+ [](const auto& paramInfo) {
+ return paramInfo.param ? "ResamplingEnabled"
+ : "ResamplingDisabled";
+ });
+
+TEST_P(NeuralStylusPalmDetectionFilterUtilTest, DistilledNocturneTest) {
const PalmFilterDeviceInfo nocturne_distilled =
CreatePalmFilterDeviceInfo(nocturne_touchscreen_);
EXPECT_FLOAT_EQ(nocturne_distilled.max_x,
@@ -61,9 +84,9 @@ TEST_F(NeuralStylusPalmDetectionFilterUtilTest, DistilledNocturneTest) {
nocturne_touchscreen_.GetAbsResolution(ABS_MT_TOUCH_MINOR));
}
-TEST_F(NeuralStylusPalmDetectionFilterUtilTest, NoMinorResTest) {
- // Nocturne has minor resolution: but lets pretend it didnt. we should recover
- // "1" as the resolution.
+TEST_P(NeuralStylusPalmDetectionFilterUtilTest, NoMinorResTest) {
+ // Nocturne has minor resolution, but let's pretend it doesn't. we should
+ // recover "1" as the resolution.
auto abs_info = nocturne_touchscreen_.GetAbsInfoByCode(ABS_MT_TOUCH_MINOR);
abs_info.resolution = 0;
nocturne_touchscreen_.SetAbsInfo(ABS_MT_TOUCH_MINOR, abs_info);
@@ -73,7 +96,7 @@ TEST_F(NeuralStylusPalmDetectionFilterUtilTest, NoMinorResTest) {
EXPECT_EQ(1, nocturne_distilled.major_radius_res);
}
-TEST_F(NeuralStylusPalmDetectionFilterUtilTest, DistillerKohakuTest) {
+TEST_P(NeuralStylusPalmDetectionFilterUtilTest, DistillerKohakuTest) {
EventDeviceInfo kohaku_touchscreen;
ASSERT_TRUE(
CapabilitiesToDeviceInfo(kKohakuTouchscreen, &kohaku_touchscreen));
@@ -84,7 +107,7 @@ TEST_F(NeuralStylusPalmDetectionFilterUtilTest, DistillerKohakuTest) {
EXPECT_EQ(1, kohaku_distilled.y_res);
}
-TEST_F(NeuralStylusPalmDetectionFilterUtilTest, DistilledLinkTest) {
+TEST_P(NeuralStylusPalmDetectionFilterUtilTest, DistilledLinkTest) {
EventDeviceInfo link_touchscreen;
ASSERT_TRUE(CapabilitiesToDeviceInfo(kLinkTouchscreen, &link_touchscreen));
const PalmFilterDeviceInfo link_distilled =
@@ -95,7 +118,7 @@ TEST_F(NeuralStylusPalmDetectionFilterUtilTest, DistilledLinkTest) {
link_distilled.minor_radius_res);
}
-TEST_F(NeuralStylusPalmDetectionFilterUtilTest, PalmFilterSampleTest) {
+TEST_P(NeuralStylusPalmDetectionFilterUtilTest, PalmFilterSampleTest) {
base::TimeTicks time = base::TimeTicks() + base::Seconds(30);
const PalmFilterDeviceInfo nocturne_distilled =
CreatePalmFilterDeviceInfo(nocturne_touchscreen_);
@@ -110,7 +133,7 @@ TEST_F(NeuralStylusPalmDetectionFilterUtilTest, PalmFilterSampleTest) {
EXPECT_EQ(0.5, sample.edge);
}
-TEST_F(NeuralStylusPalmDetectionFilterUtilTest, LinkTouchscreenSampleTest) {
+TEST_P(NeuralStylusPalmDetectionFilterUtilTest, LinkTouchscreenSampleTest) {
EventDeviceInfo link_touchscreen;
base::TimeTicks time = base::TimeTicks() + base::Seconds(30);
ASSERT_TRUE(CapabilitiesToDeviceInfo(kLinkTouchscreen, &link_touchscreen));
@@ -126,9 +149,9 @@ TEST_F(NeuralStylusPalmDetectionFilterUtilTest, LinkTouchscreenSampleTest) {
EXPECT_FLOAT_EQ(12.5, sample.minor_radius);
}
-TEST_F(NeuralStylusPalmDetectionFilterUtilTest, PalmFilterStrokeTest) {
- PalmFilterStroke stroke(3); // maxsize: 3.
- EXPECT_EQ(0, stroke.tracking_id());
+TEST_P(NeuralStylusPalmDetectionFilterUtilTest, PalmFilterStrokeTest) {
+ PalmFilterStroke stroke(model_config_, /*tracking_id*/ 55);
+ touch_.tracking_id = 55;
// With no points, center is 0.
EXPECT_EQ(gfx::PointF(0., 0.), stroke.GetCentroid());
@@ -140,7 +163,8 @@ TEST_F(NeuralStylusPalmDetectionFilterUtilTest, PalmFilterStrokeTest) {
touch_.x = 15 + i;
PalmFilterSample sample =
CreatePalmFilterSample(touch_, time, model_config_, nocturne_distilled);
- stroke.AddSample(std::move(sample));
+ time += base::Milliseconds(8);
+ stroke.ProcessSample(std::move(sample));
EXPECT_EQ(touch_.tracking_id, stroke.tracking_id());
if (i < 3) {
if (i == 0) {
@@ -160,14 +184,13 @@ TEST_F(NeuralStylusPalmDetectionFilterUtilTest, PalmFilterStrokeTest) {
ASSERT_FLOAT_EQ(expected_centroid.x(), stroke.GetCentroid().x())
<< "failed at i " << i;
}
- stroke.SetTrackingId(55);
- EXPECT_EQ(55, stroke.tracking_id());
}
-TEST_F(NeuralStylusPalmDetectionFilterUtilTest,
+TEST_P(NeuralStylusPalmDetectionFilterUtilTest,
PalmFilterStrokeBiggestSizeTest) {
- PalmFilterStroke stroke(3);
- PalmFilterStroke no_minor_stroke(3); // maxsize: 3.
+ PalmFilterStroke stroke(model_config_, /*tracking_id*/ 0);
+ PalmFilterStroke no_minor_stroke(model_config_, /*tracking_id*/ 0);
+ touch_.tracking_id = stroke.tracking_id();
EXPECT_EQ(0, stroke.BiggestSize());
base::TimeTicks time = base::TimeTicks() + base::Seconds(30);
@@ -179,20 +202,40 @@ TEST_F(NeuralStylusPalmDetectionFilterUtilTest,
PalmFilterSample sample =
CreatePalmFilterSample(touch_, time, model_config_, nocturne_distilled);
EXPECT_EQ(static_cast<uint64_t>(i), stroke.samples_seen());
- stroke.AddSample(sample);
+ stroke.ProcessSample(sample);
EXPECT_FLOAT_EQ((1 + i) * (2 + i), stroke.BiggestSize());
PalmFilterSample second_sample =
CreatePalmFilterSample(touch_, time, model_config_, nocturne_distilled);
second_sample.minor_radius = 0;
- no_minor_stroke.AddSample(std::move(second_sample));
+ no_minor_stroke.ProcessSample(std::move(second_sample));
EXPECT_FLOAT_EQ((2 + i) * (2 + i), no_minor_stroke.BiggestSize());
- EXPECT_EQ(std::min(3ul, 1ul + i), stroke.samples().size());
+ ASSERT_EQ(std::min(3ul, 1ul + i), stroke.samples().size());
+ time += base::Milliseconds(8);
}
}
-TEST_F(NeuralStylusPalmDetectionFilterUtilTest, StrokeGetMaxMajorTest) {
- PalmFilterStroke stroke(3);
+TEST_P(NeuralStylusPalmDetectionFilterUtilTest, UnscaledMajorMinorResolution) {
+ model_config_.radius_polynomial_resize = {};
+ PalmFilterDeviceInfo device_info;
+ device_info.x_res = 2;
+ device_info.y_res = 5;
+ device_info.major_radius_res = 2;
+ device_info.minor_radius_res = 5;
+ device_info.minor_radius_supported = true;
+ touch_.major = 20;
+ touch_.minor = 10;
+ touch_.orientation = 0;
+ base::TimeTicks time = base::TimeTicks::UnixEpoch() + base::Seconds(30);
+ PalmFilterSample sample =
+ CreatePalmFilterSample(touch_, time, model_config_, device_info);
+ EXPECT_EQ(20 / 2, sample.major_radius);
+ EXPECT_EQ(10 / 5, sample.minor_radius);
+}
+
+TEST_P(NeuralStylusPalmDetectionFilterUtilTest, StrokeGetMaxMajorTest) {
+ PalmFilterStroke stroke(model_config_, /*tracking_id*/ 0);
+ touch_.tracking_id = stroke.tracking_id();
EXPECT_FLOAT_EQ(0, stroke.MaxMajorRadius());
base::TimeTicks time = base::TimeTicks::UnixEpoch() + base::Seconds(30);
const PalmFilterDeviceInfo nocturne_distilled =
@@ -204,12 +247,12 @@ TEST_F(NeuralStylusPalmDetectionFilterUtilTest, StrokeGetMaxMajorTest) {
CreatePalmFilterSample(touch_, time, model_config_, nocturne_distilled);
time += base::Milliseconds(8);
EXPECT_EQ(static_cast<uint64_t>(i - 1), stroke.samples_seen());
- stroke.AddSample(sample);
+ stroke.ProcessSample(sample);
EXPECT_FLOAT_EQ(i, stroke.MaxMajorRadius());
}
}
-TEST_F(NeuralStylusPalmDetectionFilterUtilTest, SampleRadiusConversion) {
+TEST_P(NeuralStylusPalmDetectionFilterUtilTest, SampleRadiusConversion) {
// A single number: a _constant_.
model_config_.radius_polynomial_resize = {71.3};
base::TimeTicks time = base::TimeTicks::UnixEpoch() + base::Seconds(30);
@@ -228,4 +271,152 @@ TEST_F(NeuralStylusPalmDetectionFilterUtilTest, SampleRadiusConversion) {
EXPECT_FLOAT_EQ(0.1 * 24 * 24 + 0.4 * 24 - 5.0, sample.minor_radius);
}
+TEST(PalmFilterStrokeTest, NumberOfResampledValues) {
+ NeuralStylusPalmDetectionFilterModelConfig model_config_;
+ model_config_.max_sample_count = 3;
+ model_config_.resample_period = base::Milliseconds(8);
+ base::TimeTicks down_time = base::TimeTicks::UnixEpoch() + base::Seconds(30);
+
+ PalmFilterStroke stroke(model_config_, /*tracking_id*/ 0);
+ const PalmFilterDeviceInfo device_info;
+
+ // Initially, no samples
+ ASSERT_THAT(stroke.samples(), IsEmpty());
+ ASSERT_EQ(0u, stroke.samples_seen());
+
+ // Add first sample at time = T
+ InProgressTouchEvdev touch_;
+ touch_.tracking_id = stroke.tracking_id();
+ PalmFilterSample sample =
+ CreatePalmFilterSample(touch_, down_time, model_config_, device_info);
+ stroke.ProcessSample(sample);
+ ASSERT_THAT(stroke.samples(), ElementsAre(SampleTime(down_time)));
+ ASSERT_EQ(1u, stroke.samples_seen());
+
+ // Add second sample at time = T + 2ms. It's not yet time for the new frame,
+ // so no new sample should be generated.
+ base::TimeTicks time = down_time + base::Milliseconds(4);
+ sample = CreatePalmFilterSample(touch_, time, model_config_, device_info);
+ stroke.ProcessSample(sample);
+ ASSERT_THAT(stroke.samples(), ElementsAre(SampleTime(down_time)));
+ ASSERT_EQ(1u, stroke.samples_seen());
+
+ // Add third sample at time = T + 10ms. An event at time = T + 8ms should be
+ // generated.
+ time = down_time + base::Milliseconds(10);
+ sample = CreatePalmFilterSample(touch_, time, model_config_, device_info);
+ stroke.ProcessSample(sample);
+ ASSERT_THAT(stroke.samples(),
+ ElementsAre(SampleTime(down_time),
+ SampleTime(down_time + base::Milliseconds(8))));
+ ASSERT_EQ(2u, stroke.samples_seen());
+}
+
+TEST(PalmFilterStrokeTest, ResamplingTest) {
+ NeuralStylusPalmDetectionFilterModelConfig model_config_;
+ model_config_.max_sample_count = 3;
+ model_config_.resample_period = base::Milliseconds(8);
+
+ PalmFilterStroke stroke(model_config_, /*tracking_id*/ 0);
+ PalmFilterDeviceInfo device_info;
+ device_info.minor_radius_supported = true;
+
+ // Add first sample at time = T
+ InProgressTouchEvdev touch_;
+ touch_.tracking_id = stroke.tracking_id();
+ touch_.x = 1;
+ touch_.y = 2;
+ touch_.major = 4;
+ touch_.minor = 3;
+ base::TimeTicks down_time = base::TimeTicks::UnixEpoch() + base::Seconds(30);
+ PalmFilterSample sample1 =
+ CreatePalmFilterSample(touch_, down_time, model_config_, device_info);
+ stroke.ProcessSample(sample1);
+ // First sample should not be modified
+ ASSERT_THAT(stroke.samples(), ElementsAre(sample1));
+
+ // Add second sample at time = T + 2ms. It's not yet time for the new frame,
+ // so no new sample should be generated.
+ base::TimeTicks time = down_time + base::Milliseconds(4);
+ touch_.x = 100;
+ touch_.y = 20;
+ touch_.major = 12;
+ touch_.minor = 11;
+ PalmFilterSample sample2 =
+ CreatePalmFilterSample(touch_, time, model_config_, device_info);
+ stroke.ProcessSample(sample2);
+ // The samples should remain unchanged
+ ASSERT_THAT(stroke.samples(), ElementsAre(sample1));
+
+ // Add third sample at time = T + 12ms. A resampled event at time = T + 8ms
+ // should be generated.
+ time = down_time + base::Milliseconds(12);
+ touch_.x = 200;
+ touch_.y = 24;
+ touch_.major = 14;
+ touch_.minor = 13;
+ PalmFilterSample sample3 =
+ CreatePalmFilterSample(touch_, time, model_config_, device_info);
+ stroke.ProcessSample(sample3);
+ ASSERT_THAT(
+ stroke.samples(),
+ ElementsAre(sample1, SampleTime(down_time + base::Milliseconds(8))));
+
+ EXPECT_EQ(150, stroke.samples().back().point.x());
+ EXPECT_EQ(22, stroke.samples().back().point.y());
+ EXPECT_EQ(14, stroke.samples().back().major_radius);
+ EXPECT_EQ(13, stroke.samples().back().minor_radius);
+}
+
+TEST(PalmFilterStrokeTest, MultipleResampledValues) {
+ NeuralStylusPalmDetectionFilterModelConfig model_config_;
+ model_config_.max_sample_count = 3;
+ model_config_.resample_period = base::Milliseconds(8);
+
+ PalmFilterStroke stroke(model_config_, /*tracking_id*/ 0);
+ PalmFilterDeviceInfo device_info;
+ device_info.minor_radius_supported = true;
+
+ // Add first sample at time = T
+ InProgressTouchEvdev touch_;
+ touch_.tracking_id = stroke.tracking_id();
+ touch_.x = 0;
+ touch_.y = 10;
+ touch_.major = 200;
+ touch_.minor = 100;
+ base::TimeTicks down_time = base::TimeTicks::UnixEpoch() + base::Seconds(30);
+ PalmFilterSample sample1 =
+ CreatePalmFilterSample(touch_, down_time, model_config_, device_info);
+ stroke.ProcessSample(sample1);
+ // First sample should go in as is
+ ASSERT_THAT(stroke.samples(), ElementsAre(sample1));
+
+ // Add second sample at time = T + 20ms. Two resampled values should be
+ // generated: 1) at time = T+8ms 2) at time = T+16ms
+ base::TimeTicks time = down_time + base::Milliseconds(20);
+ touch_.x = 20;
+ touch_.y = 30;
+ touch_.major = 220;
+ touch_.minor = 120;
+ PalmFilterSample sample2 =
+ CreatePalmFilterSample(touch_, time, model_config_, device_info);
+ stroke.ProcessSample(sample2);
+ ASSERT_THAT(stroke.samples(),
+ ElementsAre(SampleTime(down_time),
+ SampleTime(down_time + base::Milliseconds(8)),
+ SampleTime(down_time + base::Milliseconds(16))));
+
+ // First sample : time = T + 8ms
+ EXPECT_EQ(8, stroke.samples()[1].point.x());
+ EXPECT_EQ(18, stroke.samples()[1].point.y());
+ EXPECT_EQ(220, stroke.samples()[1].major_radius);
+ EXPECT_EQ(120, stroke.samples()[1].minor_radius);
+
+ // Second sample : time = T + 16ms
+ EXPECT_EQ(16, stroke.samples().back().point.x());
+ EXPECT_EQ(26, stroke.samples().back().point.y());
+ EXPECT_EQ(220, stroke.samples().back().major_radius);
+ EXPECT_EQ(120, stroke.samples().back().minor_radius);
+}
+
} // namespace ui
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter.h b/chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter.h
index d9f98de2637..3becec0f06e 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter.h
+++ b/chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter.h
@@ -8,6 +8,7 @@
#include <bitset>
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "ui/events/ozone/evdev/touch_evdev_types.h"
#include "ui/events/ozone/evdev/touch_filter/shared_palm_detection_filter_state.h"
@@ -46,7 +47,7 @@ class COMPONENT_EXPORT(EVDEV) PalmDetectionFilter {
protected:
// Not owned!
- SharedPalmDetectionFilterState* const shared_palm_state_;
+ const raw_ptr<SharedPalmDetectionFilterState> shared_palm_state_;
};
} // namespace ui
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.cc b/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.cc
index 5bb81b253e8..eef91c3e96a 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.cc
+++ b/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.cc
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.h"
@@ -1672,2201 +1672,13669 @@ void AddN(const int32_t rank,
// Note that for now, endianness of the target machine needs to match that of
// the one training was performed on.
// -----------------------------------------------------------------------------
-const int32_t dnn_hiddenlayer_0_bias__0__cf__0_shape[1] = {20};
+const int32_t dnn_hiddenlayer_0_bias__0__cf__0_shape[1] = {117};
const union {
- uint8_t bytes[80];
- float values[20];
+ uint8_t bytes[468];
+ float values[117];
} dnn_hiddenlayer_0_bias__0__cf__0 = {{
- 0x6d, 0x69, 0x23, 0xbe, 0x8f, 0xde, 0x7f, 0x3f, 0xc2, 0x0a, 0xb8, 0xbf,
- 0xcf, 0x0c, 0x23, 0x3e, 0x1c, 0xf8, 0x8c, 0xbf, 0x21, 0xb3, 0xf9, 0xbd,
- 0x6d, 0xae, 0xce, 0xbf, 0x6e, 0x72, 0xac, 0x3f, 0xcd, 0x1b, 0xba, 0x3f,
- 0x30, 0x1e, 0xdb, 0x3f, 0xdc, 0xb4, 0xbd, 0x3f, 0x99, 0x41, 0x12, 0x3f,
- 0x8f, 0x44, 0x25, 0xbf, 0x73, 0xf5, 0x0f, 0xbe, 0x56, 0x2a, 0xa6, 0x3f,
- 0xc1, 0xad, 0x0a, 0xc0, 0x96, 0x6d, 0xa2, 0xbd, 0xde, 0xce, 0xec, 0xbf,
- 0xd0, 0x44, 0x0e, 0xc0, 0x78, 0xef, 0xa6, 0x3f,
+ 0x6a, 0x8b, 0x40, 0xbe, 0x09, 0xc4, 0xd0, 0x3f, 0xe9, 0x26, 0xe7, 0x3d,
+ 0x98, 0x1c, 0x00, 0xbf, 0x24, 0x35, 0x2c, 0x3f, 0x5c, 0x46, 0x7e, 0xbe,
+ 0x66, 0xe7, 0x16, 0x3d, 0x62, 0x63, 0x48, 0x3f, 0xd9, 0xe5, 0x2a, 0xbf,
+ 0x5b, 0x67, 0x18, 0xc0, 0x6d, 0xfe, 0x13, 0xc0, 0xb0, 0xed, 0xb8, 0x3d,
+ 0x69, 0x75, 0x38, 0xbf, 0x1d, 0x41, 0x0b, 0x40, 0x2d, 0xf1, 0x94, 0xbe,
+ 0xa0, 0x2d, 0x05, 0xbe, 0xbd, 0x15, 0x89, 0x3f, 0xa4, 0x2b, 0x64, 0x3f,
+ 0xb7, 0x75, 0x18, 0xbf, 0xef, 0x9c, 0x29, 0x3f, 0x23, 0x65, 0x46, 0xc0,
+ 0x93, 0x47, 0x90, 0x3e, 0xfa, 0x73, 0x2d, 0xbd, 0xb2, 0xbe, 0x14, 0xbe,
+ 0xf5, 0x8a, 0x8a, 0xbf, 0x53, 0x2a, 0xc7, 0x3e, 0x99, 0x85, 0xd0, 0x3f,
+ 0x8f, 0x87, 0xc6, 0x3e, 0xe3, 0xdb, 0x38, 0xc0, 0x93, 0xa0, 0x8f, 0x3e,
+ 0x2a, 0xba, 0x7b, 0x3e, 0x38, 0x4b, 0xab, 0xbe, 0x6a, 0x4d, 0x5e, 0xbf,
+ 0x38, 0x95, 0xd8, 0x3e, 0x59, 0xae, 0xfb, 0x3e, 0x14, 0xc0, 0xa0, 0xbe,
+ 0x79, 0x17, 0xd0, 0xbe, 0x4f, 0xe6, 0xab, 0xbd, 0xbd, 0x40, 0x6a, 0xbf,
+ 0xfd, 0xd5, 0x81, 0xbe, 0x83, 0xa3, 0x0f, 0xbc, 0xa3, 0x8f, 0x3e, 0x40,
+ 0x97, 0xbf, 0x5e, 0xbe, 0xc1, 0x01, 0xcc, 0x3e, 0x74, 0x44, 0x5c, 0xbf,
+ 0xa1, 0xda, 0xf0, 0xbf, 0x9f, 0xa9, 0x8d, 0x3f, 0x7b, 0x46, 0xc1, 0xbe,
+ 0x9e, 0xd3, 0xb5, 0x3f, 0xdb, 0x4a, 0x0c, 0xbd, 0x94, 0xd6, 0x14, 0xbf,
+ 0x29, 0x8e, 0xe1, 0xbe, 0xca, 0x15, 0x2c, 0xbe, 0x52, 0x30, 0x38, 0x40,
+ 0xcb, 0x91, 0x1a, 0xc0, 0xa5, 0x17, 0xd9, 0xbe, 0x02, 0x0e, 0x33, 0x40,
+ 0x22, 0x53, 0x8f, 0xbe, 0xbb, 0x23, 0xcd, 0xbe, 0xbc, 0x45, 0x20, 0xbe,
+ 0x00, 0xfb, 0x9f, 0x3e, 0x8e, 0xba, 0xa6, 0x3e, 0xdd, 0x13, 0xe5, 0x3f,
+ 0xc6, 0x25, 0x70, 0xbf, 0xe8, 0xa7, 0x60, 0x3d, 0x74, 0xe6, 0xb3, 0x3f,
+ 0x3c, 0x7b, 0x23, 0xc0, 0xed, 0x1e, 0x04, 0x3d, 0xd9, 0x8a, 0x87, 0xbf,
+ 0x0f, 0xd5, 0xd2, 0xbf, 0x3f, 0x60, 0x80, 0xbe, 0x55, 0x35, 0xf1, 0xbf,
+ 0x7d, 0x40, 0xea, 0xbe, 0x78, 0x44, 0x31, 0x3e, 0x82, 0x1d, 0x31, 0x40,
+ 0xd9, 0x99, 0xb2, 0x3f, 0x2a, 0xf2, 0x81, 0x3f, 0xab, 0x29, 0x87, 0xbe,
+ 0x27, 0x14, 0xe4, 0xbe, 0x2b, 0x08, 0xa0, 0x3e, 0x62, 0xfd, 0xa3, 0x3e,
+ 0xc3, 0x85, 0x98, 0xbb, 0x7c, 0x94, 0x0f, 0x3e, 0x7f, 0x69, 0xaa, 0xbe,
+ 0x0d, 0xc8, 0xa6, 0x3f, 0xa5, 0x97, 0xe7, 0xbe, 0x48, 0x06, 0xa5, 0xbf,
+ 0x71, 0x92, 0x20, 0xbf, 0x49, 0x12, 0x08, 0x3f, 0x17, 0x42, 0x92, 0x3e,
+ 0xf1, 0xcf, 0x1b, 0x3f, 0x6e, 0x81, 0x41, 0xbd, 0xaf, 0x69, 0x4e, 0x3e,
+ 0x4d, 0x4d, 0x84, 0x3d, 0x7f, 0x8f, 0x8d, 0xbf, 0x4a, 0xb1, 0x2b, 0xbe,
+ 0xac, 0xae, 0x22, 0xc0, 0xce, 0x9a, 0x65, 0xbe, 0x4c, 0x14, 0x05, 0x40,
+ 0xdd, 0x53, 0x81, 0xbe, 0x1f, 0x54, 0x39, 0xbf, 0x40, 0x88, 0x28, 0x40,
+ 0x01, 0x6a, 0xd8, 0xbd, 0x25, 0x16, 0x30, 0xbf, 0x74, 0xfd, 0x1b, 0x40,
+ 0x3f, 0x1a, 0x46, 0xc0, 0x34, 0xc8, 0x0e, 0xc0, 0xbf, 0x85, 0x8e, 0xbf,
+ 0x5a, 0x75, 0x4c, 0xc0, 0xb4, 0xd5, 0xed, 0xbe, 0x09, 0xb6, 0x5c, 0x3e,
+ 0xf0, 0x6b, 0x7a, 0xbd, 0xb6, 0x49, 0x56, 0xbb, 0x8c, 0x08, 0x4c, 0x3d,
+ 0x42, 0x81, 0x0f, 0x40, 0xa0, 0x78, 0x6d, 0xbe, 0x95, 0x58, 0x06, 0xc0,
}};
-const int32_t dnn_hiddenlayer_0_kernel__1__cf__1_shape[2] = {323, 20};
+const int32_t dnn_hiddenlayer_0_kernel__1__cf__1_shape[2] = {173, 117};
const union {
- uint8_t bytes[25840];
- float values[6460];
+ uint8_t bytes[80964];
+ float values[20241];
} dnn_hiddenlayer_0_kernel__1__cf__1 = {{
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0xcc, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0xcc, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0x3e, 0x20, 0xbd, 0xcc, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0xc0, 0xdc, 0xee, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0xdc, 0xee, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x08, 0xbf,
- 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0xdc, 0xee, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe,
- 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0xc0, 0xdc, 0xee, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9d, 0xaa, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0xec, 0x7f, 0x3f, 0x50, 0x35, 0xc4, 0xbf, 0x20, 0x7e, 0x88, 0x3e,
- 0x80, 0xec, 0x7f, 0xbf, 0x40, 0xbd, 0x4c, 0xbe, 0x18, 0x45, 0xd5, 0xbf,
- 0xc8, 0x15, 0xa2, 0x3f, 0x50, 0x35, 0xc4, 0x3f, 0x30, 0xbd, 0xcc, 0x3f,
- 0x88, 0x25, 0xb3, 0x3f, 0xe0, 0x8d, 0x19, 0x3f, 0xb0, 0x9d, 0x2a, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0xe8, 0x8d, 0x99, 0x3f, 0x14, 0xc2, 0x0c, 0xc0,
- 0x40, 0x7e, 0x08, 0xbe, 0xf8, 0xcc, 0xdd, 0xbf, 0x14, 0xc2, 0x0c, 0xc0,
- 0xe8, 0x8d, 0x99, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x88, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0xcc, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0xec, 0x7f, 0x3f, 0x24, 0x01, 0x51, 0x40, 0xe0, 0x8d, 0x19, 0x3f,
- 0xa0, 0x9d, 0x2a, 0x3f, 0x40, 0xbd, 0x4c, 0x3e, 0x70, 0xad, 0x3b, 0xbf,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x8d, 0x25, 0xb3, 0xc0, 0x40, 0xbd, 0x4c, 0x3e,
- 0x88, 0x25, 0xb3, 0x3f, 0xc0, 0xdc, 0xee, 0xbe, 0x20, 0xbd, 0xcc, 0x3e,
- 0x14, 0xc2, 0x0c, 0xc0, 0x37, 0xac, 0x4b, 0xc1, 0xc8, 0x15, 0xa2, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x50, 0x35, 0xc4, 0x3f, 0xc8, 0x15, 0xa2, 0x3f,
- 0xba, 0x59, 0xa6, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0xcc, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x70, 0xad, 0x3b, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0xbe, 0xb0, 0xdc, 0x6e, 0x3f, 0x90, 0x25, 0xb3, 0xbf,
- 0x40, 0xbd, 0x4c, 0x3e, 0x28, 0x7e, 0x88, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x18, 0x45, 0xd5, 0xbf, 0xa8, 0x9d, 0xaa, 0x3f, 0x50, 0x35, 0xc4, 0x3f,
- 0x30, 0xbd, 0xcc, 0x3f, 0x30, 0xbd, 0xcc, 0x3f, 0xa0, 0x9d, 0x2a, 0x3f,
- 0xb0, 0x9d, 0x2a, 0xbf, 0x20, 0x7e, 0x88, 0xbe, 0xa8, 0x9d, 0xaa, 0x3f,
- 0x04, 0x06, 0x11, 0xc0, 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0xdc, 0xee, 0xbf,
- 0xf8, 0x49, 0x15, 0xc0, 0xa8, 0x9d, 0xaa, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x88, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e, 0x50, 0x35, 0x44, 0x40,
- 0xf0, 0x8d, 0x19, 0xbf, 0x20, 0xbd, 0xcc, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x06, 0x91, 0x3f, 0xc0, 0xdc, 0xee, 0xbe, 0x24, 0x01, 0x51, 0xc0,
- 0xe8, 0x8d, 0x99, 0xbf, 0x70, 0xad, 0x3b, 0x3f, 0xb0, 0xdc, 0x6e, 0x3f,
- 0xc0, 0x9d, 0xaa, 0xbe, 0xf8, 0xcc, 0xdd, 0xbf, 0xa6, 0x42, 0xf5, 0xc0,
- 0xe0, 0x8d, 0x19, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0xec, 0x7f, 0x3f,
- 0x20, 0x7e, 0x08, 0x3f, 0x80, 0xec, 0xff, 0xbf, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x30, 0xbd, 0x4c, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0xec, 0x7f, 0x3f,
- 0x70, 0xad, 0xbb, 0xbf, 0x20, 0x7e, 0x88, 0x3e, 0x08, 0x06, 0x91, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0x38, 0xbd, 0xcc, 0xbf, 0x70, 0xad, 0xbb, 0x3f,
- 0xa8, 0x9d, 0xaa, 0x3f, 0xd8, 0x54, 0xe6, 0x3f, 0x30, 0xbd, 0xcc, 0x3f,
- 0x20, 0x7e, 0x08, 0x3f, 0xf0, 0x8d, 0x19, 0xbf, 0x40, 0x7e, 0x08, 0xbe,
- 0x88, 0x25, 0xb3, 0x3f, 0x04, 0x06, 0x11, 0xc0, 0x00, 0x00, 0x00, 0x00,
- 0xd8, 0x54, 0xe6, 0xbf, 0x24, 0x7e, 0x08, 0xc0, 0xc8, 0x15, 0xa2, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x88, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x20, 0x7e, 0x88, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0xbd, 0xcc, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x08, 0xbf,
- 0x30, 0xbd, 0xcc, 0x3f, 0x30, 0xbd, 0x4c, 0xbf, 0x70, 0xad, 0xbb, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0xec, 0x7f, 0x3f, 0x00, 0x7e, 0x08, 0x3e,
- 0xf0, 0x8d, 0x19, 0xbf, 0xf0, 0x8d, 0x19, 0xbf, 0x20, 0x7e, 0x88, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x20, 0xbd, 0xcc, 0x3e, 0x70, 0xad, 0x3b, 0xbf,
- 0x18, 0x45, 0xd5, 0xbf, 0xf0, 0x8d, 0x19, 0xbf, 0x00, 0x7e, 0x88, 0x3d,
- 0xe8, 0x8d, 0x99, 0x3f, 0xf0, 0xcc, 0x5d, 0x3f, 0xe0, 0x8d, 0x19, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xf0, 0x8d, 0x19, 0xbf, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0xcc, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0xf0, 0xcc, 0x5d, 0x3f, 0x70, 0xad, 0xbb, 0xbf, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0xec, 0x7f, 0xbf, 0x40, 0x7e, 0x08, 0xbe, 0x38, 0xbd, 0xcc, 0xbf,
- 0xa8, 0x9d, 0xaa, 0x3f, 0xa8, 0x9d, 0xaa, 0x3f, 0x10, 0x45, 0xd5, 0x3f,
- 0x88, 0x25, 0xb3, 0x3f, 0xc0, 0xdc, 0xee, 0x3e, 0xf0, 0x8d, 0x19, 0xbf,
- 0x40, 0xbd, 0x4c, 0xbe, 0xc8, 0x15, 0xa2, 0x3f, 0x24, 0x7e, 0x08, 0xc0,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0xec, 0xff, 0xbf, 0x14, 0xc2, 0x0c, 0xc0,
- 0xc8, 0x15, 0xa2, 0x3f, 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x20, 0x7e, 0x08, 0x3f, 0x40, 0xbd, 0x4c, 0xbe, 0xc0, 0xdc, 0xee, 0x3e,
- 0x20, 0x7e, 0x88, 0xbe, 0x20, 0xbd, 0xcc, 0x3e, 0xf0, 0x8d, 0x19, 0xbf,
- 0xc0, 0xdc, 0xee, 0xbe, 0x20, 0x7e, 0x08, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x88, 0xbe, 0xe0, 0x8d, 0x19, 0x3f, 0x00, 0x7e, 0x88, 0x3d,
- 0xa0, 0x9d, 0x2a, 0x3f, 0xa0, 0x9d, 0xaa, 0x3e, 0x20, 0x7e, 0x08, 0xbf,
- 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0xdc, 0xee, 0xbe, 0x20, 0xbd, 0xcc, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0xdc, 0xee, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x20, 0x7e, 0x88, 0x3e, 0x30, 0xbd, 0x4c, 0xbf, 0xc0, 0xdc, 0xee, 0xbe,
- 0x40, 0xbd, 0xcc, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0xcc, 0xbe,
- 0xc0, 0xdc, 0xee, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x70, 0xad, 0x3b, 0x3f,
- 0xc0, 0xdc, 0xee, 0x3e, 0x20, 0x7e, 0x08, 0xbf, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xe8, 0x8d, 0x99, 0xbf, 0xc0, 0x9d, 0xaa, 0xbe,
- 0xc0, 0xdc, 0xee, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e, 0xc8, 0x15, 0xa2, 0x3f,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x08, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x08, 0x40,
- 0x20, 0xbd, 0xcc, 0x3e, 0xf0, 0x8d, 0x19, 0xbf, 0x20, 0x7e, 0x88, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xf0, 0xcc, 0x5d, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0xec, 0x7f, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0xcc, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0xf0, 0xcc, 0x5d, 0x3f, 0x90, 0x25, 0xb3, 0xbf,
- 0x00, 0x7e, 0x88, 0x3d, 0x28, 0x7e, 0x88, 0xbf, 0x40, 0x7e, 0x08, 0xbe,
- 0x38, 0xbd, 0xcc, 0xbf, 0xc8, 0x15, 0xa2, 0x3f, 0x50, 0x35, 0xc4, 0x3f,
- 0xf8, 0xcc, 0xdd, 0x3f, 0x70, 0xad, 0xbb, 0x3f, 0x20, 0x7e, 0x08, 0x3f,
- 0xf0, 0x8d, 0x19, 0xbf, 0x20, 0x7e, 0x88, 0xbe, 0xe8, 0x8d, 0x99, 0x3f,
- 0x24, 0x7e, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x80, 0xec, 0xff, 0xbf,
- 0xf8, 0x49, 0x15, 0xc0, 0xa8, 0x9d, 0xaa, 0x3f, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0xbd, 0xcc, 0x3e, 0x20, 0xbd, 0xcc, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x08, 0x3f, 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xb0, 0xdc, 0x6e, 0x3f, 0xa0, 0x9d, 0x2a, 0x3f, 0x20, 0x7e, 0x88, 0x3e,
- 0xf0, 0xcc, 0x5d, 0x3f, 0xb0, 0xdc, 0x6e, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0xcc, 0xbe,
- 0xf0, 0xcc, 0x5d, 0x3f, 0x20, 0x7e, 0x88, 0x3e, 0x40, 0xbd, 0xcc, 0xbe,
- 0xc0, 0xdc, 0xee, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x30, 0x3a, 0x04, 0x40,
- 0x08, 0x06, 0x91, 0xbf, 0x20, 0x7e, 0x08, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0xbd, 0xcc, 0x3e,
- 0xc8, 0x15, 0xa2, 0xbf, 0x00, 0x7e, 0x08, 0x3e, 0x18, 0x45, 0xd5, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0x70, 0xad, 0xbb, 0xbf, 0xc8, 0x15, 0xa2, 0x3f,
- 0x88, 0x25, 0xb3, 0x3f, 0x10, 0x45, 0xd5, 0x3f, 0xe8, 0x8d, 0x99, 0x3f,
- 0xc0, 0xdc, 0xee, 0x3e, 0x30, 0xbd, 0x4c, 0xbf, 0x20, 0x7e, 0x88, 0xbe,
- 0xc8, 0x15, 0xa2, 0x3f, 0x80, 0xec, 0xff, 0xbf, 0x40, 0x7e, 0x08, 0xbe,
- 0xd8, 0x54, 0xe6, 0xbf, 0x34, 0x3a, 0x04, 0xc0, 0x30, 0xbd, 0x4c, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e,
- 0x20, 0x7e, 0x08, 0x3f, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9d, 0x2a, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0xdc, 0xee, 0xbe,
- 0x20, 0x7e, 0x08, 0xbf, 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x70, 0xad, 0x3b, 0x3f, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x30, 0xbd, 0x4c, 0xbf, 0x40, 0xbd, 0xcc, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdc, 0xee, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0xec, 0x7f, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0xec, 0xff, 0x3f, 0x70, 0xad, 0x3b, 0x3f, 0xa0, 0x9d, 0x2a, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0xbd, 0xcc, 0x3e, 0xc8, 0x15, 0xa2, 0xbf, 0x40, 0xbd, 0x4c, 0x3e,
- 0x08, 0x06, 0x91, 0xbf, 0x40, 0xbd, 0x4c, 0x3e, 0x50, 0x35, 0xc4, 0xbf,
- 0xa0, 0x9d, 0x2a, 0x3f, 0x20, 0x7e, 0x88, 0x3f, 0x50, 0x35, 0xc4, 0x3f,
- 0xf0, 0xcc, 0x5d, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0xdc, 0x6e, 0xbf,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x06, 0x91, 0x3f, 0x50, 0x35, 0xc4, 0xbf,
- 0x40, 0xbd, 0x4c, 0xbe, 0x50, 0x35, 0xc4, 0xbf, 0xa0, 0x64, 0xf7, 0xbf,
- 0x20, 0x7e, 0x08, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0xbe,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x70, 0xad, 0x3b, 0xbf, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x70, 0xad, 0x3b, 0x3f, 0xe0, 0x8d, 0x19, 0x3f,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe,
- 0xe8, 0x8d, 0x99, 0xbf, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0xcc, 0xbe,
- 0x30, 0xbd, 0x4c, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0x30, 0xbd, 0x4c, 0x3f,
- 0x00, 0x7e, 0x88, 0x3d, 0xc8, 0x15, 0xa2, 0x3f, 0xe8, 0x8d, 0x99, 0x3f,
- 0x20, 0xbd, 0xcc, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x30, 0xbd, 0x4c, 0x3f, 0x90, 0x25, 0xb3, 0xbf,
- 0x00, 0x7e, 0x88, 0x3d, 0x30, 0xbd, 0x4c, 0xbf, 0x00, 0x7e, 0x88, 0x3d,
- 0x90, 0x25, 0xb3, 0xbf, 0x20, 0x7e, 0x08, 0x3f, 0xb0, 0xdc, 0x6e, 0x3f,
- 0x30, 0xbd, 0xcc, 0x3f, 0xe8, 0x8d, 0x99, 0x3f, 0x40, 0xbd, 0x4c, 0xbe,
- 0x28, 0x7e, 0x88, 0xbf, 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0x3f,
- 0xc8, 0x15, 0xa2, 0xbf, 0x40, 0x7e, 0x08, 0xbe, 0x70, 0xad, 0xbb, 0xbf,
- 0xf8, 0xcc, 0xdd, 0xbf, 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0x4c, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x06, 0x91, 0x3f, 0x20, 0x7e, 0x88, 0xbe, 0xf0, 0xcc, 0x5d, 0x3f,
- 0x40, 0xbd, 0xcc, 0xbe, 0x20, 0xbd, 0xcc, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0xe0, 0x8d, 0x19, 0x3f, 0xc0, 0xdc, 0xee, 0xbe,
- 0xe0, 0x8d, 0x19, 0x3f, 0x40, 0xbd, 0x4c, 0xbe, 0xe8, 0x8d, 0x99, 0x3f,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0xcc, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x70, 0xad, 0x3b, 0x3f,
- 0xc8, 0x15, 0xa2, 0xbf, 0x40, 0xbd, 0x4c, 0x3e, 0xb0, 0x9d, 0x2a, 0xbf,
- 0x40, 0xbd, 0x4c, 0x3e, 0x50, 0x35, 0xc4, 0xbf, 0x20, 0x7e, 0x08, 0x3f,
- 0x70, 0xad, 0x3b, 0x3f, 0x88, 0x25, 0xb3, 0x3f, 0xe8, 0x8d, 0x99, 0x3f,
- 0x20, 0x7e, 0x88, 0xbe, 0xe8, 0x8d, 0x99, 0xbf, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x06, 0x91, 0x3f, 0xb0, 0x9d, 0xaa, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x08, 0x06, 0x91, 0xbf, 0x18, 0x45, 0xd5, 0xbf, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0xcc, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0xcc, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0xcc, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0xcc, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe,
- 0xc0, 0xdc, 0x6e, 0xbf, 0x20, 0x7e, 0x08, 0x3f, 0x40, 0xbd, 0x4c, 0xbe,
- 0xc0, 0xdc, 0xee, 0x3e, 0xc0, 0xdc, 0xee, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e, 0x70, 0xad, 0x3b, 0xbf,
- 0x20, 0x7e, 0x08, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0x3e,
- 0x20, 0xbd, 0xcc, 0x3e, 0xf0, 0xcc, 0x5d, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0xa0, 0x9d, 0x2a, 0x3f, 0xa0, 0x9d, 0xaa, 0x3e, 0x20, 0x7e, 0x08, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x08, 0x3f, 0x90, 0x25, 0xb3, 0xbf, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0xbd, 0x4c, 0x3e, 0x18, 0x45, 0xd5, 0xbf,
- 0x40, 0xbd, 0x4c, 0x3e, 0xb0, 0xdc, 0x6e, 0x3f, 0x88, 0x25, 0xb3, 0x3f,
- 0x00, 0x06, 0x91, 0x3f, 0xc0, 0x9d, 0xaa, 0xbe, 0x50, 0x35, 0xc4, 0xbf,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0x3f, 0xe8, 0x8d, 0x99, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0xe8, 0x8d, 0x99, 0xbf, 0x38, 0xbd, 0xcc, 0xbf,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x88, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0xcc, 0xbe,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0xcc, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0xcc, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0xbd, 0xcc, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe,
+ 0x80, 0x76, 0x28, 0xbf, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x10, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0xc8, 0xb1, 0x7c, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x7e, 0xb4, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x48, 0x72, 0xa2, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x98, 0x58, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0xc8, 0xb1, 0x7c, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0x3e, 0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x80, 0x76, 0x28, 0xbf,
+ 0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x80, 0x76, 0x28, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x20, 0x5d, 0x04, 0x3f, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x7f, 0x34, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0xa0, 0x65, 0x10, 0x3f, 0x90, 0x65, 0x10, 0xbf, 0xd8, 0xa0, 0x64, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x7a, 0xae, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x84, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0x28, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0xd8, 0xa0, 0x64, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x90, 0x65, 0x10, 0xbf,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x7f, 0x34, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+ 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x50, 0xa9, 0x70, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+ 0x80, 0x87, 0x40, 0x3f, 0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x50, 0xa9, 0x70, 0xbf, 0x50, 0xa9, 0x70, 0xbf,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+ 0x50, 0xa9, 0x70, 0xbf, 0x4a, 0x72, 0x22, 0xc0, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0x60, 0x98, 0xd8, 0x3e, 0xa4, 0x78, 0xab, 0xc0, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x84, 0x08, 0xc2, 0xc0, 0x50, 0xa9, 0x70, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0xc8, 0xb1, 0xfc, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+ 0x28, 0x94, 0xd2, 0x3f, 0x90, 0x65, 0x10, 0xbf, 0x20, 0x5d, 0x84, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0x50, 0xa9, 0x70, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0xd8, 0x69, 0x96, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0xb6, 0x67, 0x13, 0xc0, 0x40, 0xa9, 0x70, 0xbe, 0x50, 0xa9, 0x70, 0x3f,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0x20, 0x5d, 0x84, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x50, 0xa9, 0x70, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f, 0x38, 0x83, 0xba, 0xbf,
+ 0x80, 0x76, 0x28, 0xbf, 0x50, 0xa9, 0x70, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x20, 0x5d, 0x04, 0xbf, 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x5c, 0x61, 0x8a, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x50, 0x72, 0xa2, 0x3f,
+ 0xa0, 0x65, 0x10, 0x3f, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x76, 0x28, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0x20, 0x5d, 0x04, 0xbf,
+ 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x9c, 0xde, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0xd4, 0x69, 0x96, 0xbf,
+ 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x70, 0x87, 0x40, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x9c, 0xde, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f, 0x70, 0x87, 0x40, 0xbf,
+ 0xf2, 0x6b, 0x19, 0xc0, 0x7a, 0x63, 0x0d, 0xc0, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x76, 0x28, 0xbf, 0x7c, 0x63, 0x0d, 0x40, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x84, 0x3f, 0xd0, 0xb1, 0x7c, 0x3f,
+ 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0xec, 0x8f, 0x4c, 0xc0,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0xd4, 0x69, 0x96, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x78, 0x87, 0xc0, 0x3f,
+ 0x80, 0x76, 0xa8, 0x3e, 0x76, 0x87, 0x40, 0xc0, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x58, 0x85, 0x3d, 0x40,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0xc8, 0xb1, 0xfc, 0xbf, 0x10, 0x6e, 0x9c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0x78, 0x87, 0xc0, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x58, 0x85, 0x3d, 0x40,
+ 0x2c, 0x70, 0x1f, 0xc0, 0x90, 0x65, 0x10, 0xbf, 0xc4, 0x7a, 0x2e, 0x40,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x9c, 0xde, 0x3f,
+ 0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x38, 0x83, 0xba, 0x3f,
+ 0x86, 0x76, 0x28, 0xc0, 0x80, 0x87, 0xc0, 0xbd, 0x50, 0xa9, 0x70, 0xbf,
+ 0x74, 0x87, 0xc0, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x18, 0xa5, 0xea, 0xbf,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x1c, 0x81, 0x37, 0x40,
+ 0x50, 0x72, 0xa2, 0x3f, 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+ 0x50, 0x72, 0xa2, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0xd4, 0x69, 0x96, 0xbf,
+ 0x70, 0x87, 0x40, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+ 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x10, 0x6e, 0x1c, 0xc0, 0x80, 0x87, 0x40, 0xbe, 0x90, 0xad, 0xf6, 0x3f,
+ 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xe0, 0x7c, 0x31, 0x40,
+ 0x00, 0x88, 0x40, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x4c, 0x72, 0x22, 0x40,
+ 0x94, 0x89, 0x43, 0xc0, 0x3e, 0x5f, 0x07, 0xc0, 0xc8, 0xb1, 0x7c, 0xbf,
+ 0xec, 0x8f, 0x4c, 0xc0, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x98, 0x65, 0x10, 0x40, 0x80, 0x76, 0xa8, 0xbe, 0x3e, 0x5f, 0x07, 0xc0,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x70, 0x87, 0x40, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x7f, 0x34, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x60, 0x98, 0xd8, 0xbe,
+ 0x60, 0x98, 0x58, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x60, 0x98, 0x58, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x3c, 0xf1, 0xa0, 0xc0, 0xc0, 0x65, 0x10, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x03, 0x5b, 0x81, 0xc0, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0xd8, 0xa0, 0x64, 0xbf,
+ 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x50, 0xa9, 0x70, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+ 0x60, 0x61, 0x8a, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0xb0, 0x8b, 0xc6, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3f,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x20, 0x5d, 0x04, 0xbf, 0x3e, 0x5f, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0xe0, 0x7c, 0xb1, 0xc0, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0x18, 0xa5, 0xea, 0xbf,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x7f, 0xb4, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x98, 0x58, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x20, 0x5d, 0x84, 0x3f, 0x70, 0x87, 0x40, 0xbf, 0x18, 0xa5, 0xea, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x10, 0x3f, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0x58, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0xe0, 0x7c, 0x31, 0xc0, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x48, 0x72, 0xa2, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0xb0, 0x8b, 0xc6, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
+ 0xd8, 0xa0, 0x64, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+ 0xc8, 0xb1, 0xfc, 0xbf, 0x20, 0x5d, 0x04, 0xc0, 0x60, 0xa9, 0xf0, 0x3e,
+ 0xc8, 0xb1, 0x7c, 0xbf, 0xb0, 0x8b, 0xc6, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x38, 0x83, 0xba, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
+ 0x00, 0x7f, 0x34, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0xc2, 0x7a, 0x2e, 0xc0,
+ 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xf0, 0x8f, 0xcc, 0x3f,
+ 0x60, 0x98, 0xd8, 0x3e, 0x4a, 0x72, 0x22, 0xc0, 0x00, 0x7f, 0x34, 0x3f,
+ 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x88, 0x76, 0x28, 0x40,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0x3f, 0xd8, 0xa0, 0x64, 0xbf,
+ 0x50, 0xa9, 0xf0, 0xbf, 0x78, 0x87, 0xc0, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0xf0, 0x8f, 0xcc, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0xb8, 0x67, 0x13, 0x40,
+ 0x98, 0x65, 0x10, 0xc0, 0x80, 0x76, 0xa8, 0xbe, 0xa4, 0x78, 0x2b, 0x40,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0xb0, 0x8b, 0xc6, 0x3f,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x28, 0x94, 0xd2, 0x3f,
+ 0xd4, 0x69, 0x16, 0xc0, 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x9c, 0xbf,
+ 0x48, 0x72, 0xa2, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x74, 0x87, 0xc0, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xf4, 0x6b, 0x19, 0x40,
+ 0x50, 0x72, 0xa2, 0x3f, 0x50, 0x72, 0xa2, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x20, 0x5d, 0x84, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
+ 0x80, 0x76, 0xa8, 0xbe, 0x50, 0xa9, 0x70, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x40, 0xa9, 0x70, 0x3e, 0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa4, 0x78, 0x2b, 0xc0, 0x80, 0x76, 0xa8, 0x3e, 0x90, 0xad, 0xf6, 0x3f,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x10, 0x6e, 0x1c, 0x40,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x7c, 0x63, 0x0d, 0x40,
+ 0xc2, 0x7a, 0x2e, 0xc0, 0x98, 0x65, 0x10, 0xc0, 0x90, 0x65, 0x10, 0xbf,
+ 0x46, 0x96, 0x55, 0xc0, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x28, 0x94, 0xd2, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xc8, 0xb1, 0xfc, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x90, 0x76, 0x28, 0x3f,
+ 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0x58, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+ 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0x58, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xe8, 0xb3, 0x7f, 0xc0, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x03, 0x5b, 0x81, 0xc0, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x76, 0x28, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x70, 0x87, 0x40, 0xbf,
+ 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x90, 0x76, 0x28, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0xec, 0x8f, 0xcc, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+ 0x7a, 0x63, 0x0d, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x74, 0x87, 0xc0, 0xbf,
+ 0x80, 0x76, 0x28, 0xbf, 0x78, 0x87, 0xc0, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x84, 0xbf, 0x90, 0x65, 0x10, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x3e, 0x5f, 0x07, 0xc0, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xb4, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0x28, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+ 0x20, 0x5d, 0x04, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+ 0x64, 0x98, 0xd8, 0xbf, 0xdc, 0xa0, 0xe4, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x10, 0x6e, 0x9c, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x98, 0x65, 0x90, 0x3f, 0x60, 0x98, 0x58, 0x3f,
+ 0x70, 0x87, 0x40, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0xf2, 0x6b, 0x19, 0xc0,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x88, 0x76, 0xa8, 0x3f,
+ 0x40, 0xa9, 0x70, 0x3e, 0xb6, 0x67, 0x13, 0xc0, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x70, 0x87, 0x40, 0xbf,
+ 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x30, 0x70, 0x1f, 0x40,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x74, 0x87, 0xc0, 0xbf, 0x10, 0x6e, 0x9c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0x88, 0x76, 0xa8, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x5c, 0x61, 0x0a, 0x40,
+ 0x8c, 0xad, 0xf6, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x10, 0x6e, 0x1c, 0x40,
+ 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0xc8, 0x7a, 0xae, 0x3f,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x84, 0x3f,
+ 0x5c, 0x61, 0x0a, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x69, 0x96, 0xbf,
+ 0x48, 0x72, 0xa2, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x10, 0x6e, 0x9c, 0xbf,
+ 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xb8, 0x67, 0x13, 0x40,
+ 0x60, 0x98, 0x58, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+ 0xd8, 0x69, 0x96, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf,
+ 0x60, 0x98, 0xd8, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+ 0x7a, 0x63, 0x0d, 0xc0, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0xb4, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x7c, 0x63, 0x0d, 0x40,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x9c, 0xde, 0x3f,
+ 0x7a, 0x63, 0x0d, 0xc0, 0xdc, 0xa0, 0xe4, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0xfe, 0x7e, 0x34, 0xc0, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x10, 0x6e, 0x9c, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0xb0, 0x8b, 0xc6, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x20, 0x5d, 0x04, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x98, 0x65, 0x90, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xe0, 0x7c, 0x31, 0xc0, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0xfa, 0xa2, 0x67, 0xc0, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0x98, 0x58, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x88, 0x76, 0xa8, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xc8, 0xb1, 0x7c, 0xbf,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0x98, 0x58, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x8c, 0xad, 0xf6, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x61, 0x8a, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x7a, 0xae, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0xd4, 0x69, 0x96, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0x28, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0xd8, 0x69, 0x96, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+ 0x98, 0x65, 0x90, 0xbf, 0x10, 0x6e, 0x9c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x61, 0x8a, 0x3f, 0x00, 0x7f, 0x34, 0x3f,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x02, 0x5b, 0x01, 0xc0,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f,
+ 0x40, 0xa9, 0x70, 0x3e, 0x28, 0x94, 0xd2, 0xbf, 0x20, 0x5d, 0x04, 0x3f,
+ 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x04, 0x5b, 0x01, 0x40,
+ 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+ 0x5c, 0x61, 0x8a, 0xbf, 0x20, 0x5d, 0x84, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x5d, 0x84, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x68, 0x98, 0xd8, 0x3f,
+ 0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x9c, 0xde, 0x3f,
+ 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x61, 0x8a, 0x3f,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x61, 0x8a, 0x3f,
+ 0xb0, 0x8b, 0xc6, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x98, 0x65, 0x90, 0xbf,
+ 0x20, 0x5d, 0x84, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x50, 0xa9, 0x70, 0xbf,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x58, 0xa9, 0xf0, 0x3f,
+ 0x00, 0x7f, 0x34, 0x3f, 0x60, 0x61, 0x8a, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+ 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
+ 0xa0, 0x65, 0x90, 0xbe, 0x50, 0xa9, 0x70, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0xec, 0x8f, 0xcc, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xd8, 0x69, 0x96, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x50, 0x72, 0xa2, 0x3f,
+ 0x18, 0xa5, 0xea, 0xbf, 0x98, 0x65, 0x90, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0x5c, 0x61, 0x0a, 0xc0, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0xe0, 0xa0, 0x64, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xfc, 0x7e, 0xb4, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0xdc, 0xee, 0xbe, 0x00, 0xcd, 0x5d, 0xbf, 0x20, 0xbd, 0xcc, 0x3e,
- 0x20, 0x7e, 0x08, 0x3f, 0x20, 0x7e, 0x88, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x80, 0xec, 0x7f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e,
- 0xe8, 0x8d, 0x99, 0xbf, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0xec, 0x7f, 0xbf, 0x30, 0xbd, 0x4c, 0x3f, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe, 0x20, 0xbd, 0xcc, 0x3e,
- 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x60, 0x98, 0xd8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0x58, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xc8, 0xb1, 0xfc, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0xfe, 0x7e, 0x34, 0xc0, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+ 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x98, 0x58, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x90, 0x65, 0x10, 0xbf, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x84, 0x76, 0xa8, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0xc8, 0xb1, 0x7c, 0xbf, 0x50, 0xa9, 0x70, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x10, 0x3f,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x74, 0x87, 0xc0, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0xfc, 0x7e, 0xb4, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xb0, 0x8b, 0xc6, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x98, 0x65, 0x90, 0x3f,
+ 0xd4, 0x69, 0x96, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0xcc, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3f,
+ 0x98, 0x65, 0x90, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x84, 0xbf,
+ 0x50, 0xa9, 0x70, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x9c, 0xde, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+ 0xfc, 0x7e, 0xb4, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0xe0, 0xa0, 0x64, 0x3f,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x84, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x84, 0x3f,
+ 0x10, 0x6e, 0x9c, 0xbf, 0xd8, 0xa0, 0x64, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x28, 0x94, 0xd2, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x50, 0xa9, 0x70, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0xf0, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x9c, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0x3e, 0xec, 0x8f, 0xcc, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+ 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0x58, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0xa8, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+ 0x80, 0x76, 0x28, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0x70, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x98, 0x65, 0x90, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f,
+ 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x84, 0x3f,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x90, 0x76, 0x28, 0x3f,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x84, 0x3f,
+ 0x20, 0x5d, 0x04, 0x3f, 0x10, 0x6e, 0x1c, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x98, 0xd8, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x98, 0x58, 0xbf, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x5c, 0x61, 0x8a, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x68, 0x98, 0xd8, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x7f, 0x34, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0x58, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+ 0x98, 0x65, 0x10, 0xc0, 0x02, 0x5b, 0x01, 0xc0, 0x40, 0xa9, 0x70, 0x3e,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x40, 0x5f, 0x07, 0x40, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x98, 0x65, 0x90, 0x3f, 0xd8, 0x69, 0x96, 0x3f,
+ 0x00, 0x7f, 0x34, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x58, 0x85, 0x3d, 0xc0,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x5c, 0x61, 0x8a, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0xe0, 0xa0, 0xe4, 0x3f,
+ 0x40, 0xa9, 0x70, 0x3e, 0x3a, 0x83, 0x3a, 0xc0, 0x10, 0x6e, 0x1c, 0x3f,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xf0, 0x8f, 0x4c, 0x40,
+ 0x80, 0x87, 0x40, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0xc8, 0xb1, 0xfc, 0xbf, 0xd8, 0x69, 0x96, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x88, 0x76, 0xa8, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xe0, 0x7c, 0x31, 0x40,
+ 0xb6, 0x67, 0x13, 0xc0, 0x40, 0xa9, 0xf0, 0xbe, 0x78, 0x87, 0x40, 0x40,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x28, 0x94, 0xd2, 0x3f,
+ 0x10, 0x6e, 0x1c, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x88, 0x76, 0xa8, 0x3f,
+ 0x86, 0x76, 0x28, 0xc0, 0x00, 0x88, 0x40, 0x3d, 0x48, 0x72, 0xa2, 0xbf,
+ 0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x02, 0x5b, 0x01, 0xc0,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x58, 0x85, 0x3d, 0x40,
+ 0x50, 0x72, 0xa2, 0x3f, 0x10, 0x6e, 0x9c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x00, 0x7f, 0xb4, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x48, 0x72, 0xa2, 0xbf,
+ 0x70, 0x87, 0x40, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+ 0xc0, 0x65, 0x10, 0x3e, 0x50, 0xa9, 0x70, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0xc2, 0x7a, 0x2e, 0xc0, 0x00, 0x87, 0x40, 0xbd, 0x04, 0x5b, 0x01, 0x40,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x10, 0x6e, 0x1c, 0x40,
+ 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x5c, 0x61, 0x0a, 0x40,
+ 0x3a, 0x83, 0x3a, 0xc0, 0x98, 0x65, 0x10, 0xc0, 0x10, 0x6e, 0x9c, 0xbf,
+ 0x0a, 0x92, 0x4f, 0xc0, 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x98, 0x65, 0x10, 0x40, 0x80, 0x87, 0x40, 0xbe, 0x5c, 0x61, 0x0a, 0xc0,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x50, 0xa9, 0x70, 0xbf, 0x60, 0x98, 0x58, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0xc5, 0xe8, 0x94, 0xc0, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0xf2, 0x6b, 0x99, 0xc0, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0x58, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x76, 0x28, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0x28, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0xd4, 0x69, 0x96, 0xbf,
+ 0x90, 0x65, 0x10, 0xbf, 0xe0, 0xa0, 0x64, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x9c, 0xde, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x50, 0xa9, 0x70, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0x58, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x87, 0x40, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xb1, 0x7c, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xd8, 0xa0, 0x64, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x48, 0x72, 0xa2, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0x48, 0x72, 0xa2, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x7f, 0x34, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0xfc, 0x7e, 0xb4, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x50, 0xa9, 0x70, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x48, 0x72, 0xa2, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x98, 0x58, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0xb0, 0x8b, 0xc6, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x98, 0xd8, 0xbe, 0xe0, 0xa0, 0x64, 0x3f, 0x70, 0x87, 0x40, 0xbf,
+ 0x80, 0x76, 0xa8, 0xbe, 0x50, 0xa9, 0xf0, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x61, 0x8a, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x20, 0x5d, 0x04, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x60, 0x98, 0xd8, 0xbe, 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x70, 0x87, 0x40, 0xbf,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x70, 0x87, 0x40, 0xbf,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+ 0xdc, 0xa0, 0xe4, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x98, 0x65, 0x90, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xd8, 0x69, 0x96, 0x3f,
+ 0x5c, 0x61, 0x0a, 0xc0, 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xc8, 0x7a, 0xae, 0x3f,
+ 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x38, 0x83, 0xba, 0xbf, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x84, 0x76, 0xa8, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x65, 0x10, 0xbf,
+ 0x50, 0x72, 0xa2, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+ 0x60, 0x98, 0xd8, 0x3e, 0x84, 0x76, 0xa8, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0x98, 0x58, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x88, 0x76, 0xa8, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0xd0, 0xb1, 0xfc, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x7c, 0x63, 0x0d, 0x40,
+ 0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+ 0x8c, 0xad, 0xf6, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xb0, 0x8b, 0xc6, 0xbf,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x76, 0x28, 0x3f,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0x58, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0xd0, 0xb1, 0x7c, 0x3f,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x98, 0x58, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0x20, 0x5d, 0x04, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x7f, 0x34, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0xbf,
+ 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0x28, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x70, 0x87, 0x40, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x50, 0xa9, 0x70, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3f,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x7f, 0x34, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x7f, 0x34, 0x3f,
+ 0x10, 0x6e, 0x1c, 0xbf, 0xdc, 0xa0, 0xe4, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0xbf, 0xa0, 0x65, 0x10, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x7f, 0x34, 0xbf,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x70, 0xab, 0x73, 0xc0, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x98, 0x65, 0x10, 0xc0, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x84, 0x76, 0xa8, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x84, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x48, 0x72, 0xa2, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9c, 0xde, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0xa0, 0x65, 0x10, 0x3f, 0x60, 0x61, 0x8a, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x90, 0x76, 0x28, 0x3f,
+ 0xc0, 0x7a, 0xae, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf,
+ 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x90, 0x76, 0x28, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+ 0xa2, 0x0a, 0xc5, 0xc0, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0x58, 0x3f,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xb0, 0x8b, 0xc6, 0xbf,
+ 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xc8, 0xb1, 0x7c, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0x50, 0xa9, 0xf0, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x98, 0xd8, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0xa0, 0x65, 0x90, 0xbe, 0xc8, 0xb1, 0xfc, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0xd0, 0xb1, 0x7c, 0x3f, 0x90, 0x76, 0x28, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x90, 0x76, 0x28, 0x3f,
+ 0x40, 0xa9, 0x70, 0xbe, 0xd4, 0x69, 0x96, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0x58, 0xbf,
+ 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+ 0xb0, 0x8b, 0xc6, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x50, 0x72, 0xa2, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x61, 0x8a, 0x3f,
+ 0x02, 0x5b, 0x01, 0xc0, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x78, 0x87, 0xc0, 0x3f,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+ 0xc0, 0x7a, 0xae, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x7f, 0xb4, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x76, 0x28, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x78, 0x87, 0xc0, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x58, 0xa9, 0xf0, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x40, 0x5f, 0x07, 0x40,
+ 0xb0, 0x8b, 0xc6, 0xbf, 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0xc8, 0xb1, 0xfc, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x90, 0x76, 0x28, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x94, 0xd2, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x7f, 0x34, 0x3f,
+ 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+ 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0x3e, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x48, 0x72, 0xa2, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0xc8, 0x7a, 0xae, 0x3f,
+ 0x80, 0x76, 0xa8, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x61, 0x8a, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x10, 0x6e, 0x1c, 0xbf, 0xb0, 0x8b, 0x46, 0xc0, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x50, 0xa9, 0x70, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0x70, 0x87, 0x40, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+ 0x20, 0x5d, 0x84, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x9c, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f, 0x60, 0x98, 0xd8, 0x3e,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x7a, 0x63, 0x0d, 0xc0, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0xf3, 0xa2, 0x0c, 0xc1, 0x80, 0x65, 0x10, 0xbe, 0x04, 0x5b, 0x01, 0x40,
+ 0xe0, 0xa0, 0x64, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xb6, 0x67, 0x13, 0xc0,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x98, 0x65, 0x90, 0x3f,
+ 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+ 0x8c, 0xad, 0xf6, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x20, 0x5d, 0x84, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x7f, 0x34, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0xd0, 0xb1, 0x7c, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x50, 0x72, 0xa2, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0xd4, 0x69, 0x96, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0x58, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xd8, 0xa0, 0x64, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x64, 0x98, 0xd8, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
+ 0x50, 0x72, 0xa2, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x50, 0x72, 0xa2, 0x3f,
+ 0xd4, 0x69, 0x16, 0xc0, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x88, 0x76, 0xa8, 0x3f,
+ 0x60, 0x98, 0x58, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x50, 0xa9, 0x70, 0x3f,
+ 0xfc, 0x7e, 0xb4, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+ 0xb0, 0x8b, 0xc6, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x50, 0x72, 0xa2, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x7f, 0xb4, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0xa0, 0x64, 0xbf,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0x58, 0x3f,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0xcc, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x5c, 0x61, 0x0a, 0x40,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0xb8, 0x67, 0x13, 0x40,
+ 0xfc, 0x7e, 0xb4, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0x28, 0xbf,
+ 0x20, 0x5d, 0x04, 0xc0, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0x98, 0x58, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x38, 0x83, 0xba, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+ 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x7f, 0x34, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x4a, 0x72, 0x22, 0xc0, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x74, 0x87, 0xc0, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
+ 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x61, 0x8a, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x98, 0x65, 0x90, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+ 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x10, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x50, 0xa9, 0x70, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0x58, 0x3f,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x84, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x3a, 0x83, 0x3a, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x8f, 0xcc, 0x3f,
+ 0x00, 0x7f, 0x34, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x90, 0x76, 0x28, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0x98, 0x58, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0x58, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0xd8, 0x69, 0x96, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x50, 0xa9, 0x70, 0x3f, 0x60, 0x98, 0x58, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x98, 0x65, 0x90, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x70, 0x87, 0x40, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f,
+ 0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0xbf,
+ 0x18, 0xa5, 0xea, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x50, 0x72, 0xa2, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xd8, 0x69, 0x96, 0x3f,
+ 0x3e, 0x5f, 0x07, 0xc0, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x38, 0x83, 0xba, 0x3f,
+ 0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x50, 0xa9, 0x70, 0x3f,
+ 0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+ 0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x7f, 0xb4, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x10, 0x6e, 0x9c, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
+ 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0x20, 0x5d, 0x84, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xb0, 0x8b, 0xc6, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x98, 0x65, 0x10, 0x40,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x98, 0x65, 0x10, 0x40,
+ 0xec, 0x8f, 0xcc, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x64, 0x98, 0xd8, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x28, 0x94, 0xd2, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x7f, 0x34, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x70, 0x87, 0x40, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0x3f, 0x90, 0x76, 0x28, 0x3f,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x70, 0x87, 0x40, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x50, 0xa9, 0x70, 0x3f,
+ 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x7f, 0x34, 0x3f,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x84, 0x76, 0xa8, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x3e, 0x5f, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0xa8, 0xbe, 0x3e, 0x5f, 0x07, 0xc0, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x98, 0xd8, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x20, 0x5d, 0x04, 0x3f,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0x98, 0x58, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x98, 0x58, 0x3f, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0xd0, 0xb1, 0x7c, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0xd0, 0xb1, 0x7c, 0x3f,
+ 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0xa0, 0x64, 0xbf,
+ 0x60, 0x98, 0x58, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x76, 0x28, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x98, 0x58, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x60, 0x98, 0x58, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xa0, 0x64, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x84, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f, 0x50, 0xa9, 0x70, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0x60, 0x98, 0x58, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x50, 0xa9, 0x70, 0xbf,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xd8, 0xa0, 0x64, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0x3f,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+ 0x28, 0x94, 0xd2, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x98, 0x65, 0x90, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xd8, 0x69, 0x96, 0x3f,
+ 0x5c, 0x61, 0x0a, 0xc0, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x68, 0x98, 0xd8, 0x3f,
+ 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f,
+ 0x38, 0x83, 0xba, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x38, 0x83, 0xba, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x50, 0x72, 0xa2, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0x61, 0x8a, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x5c, 0x61, 0x8a, 0xbf,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3f,
+ 0x90, 0x76, 0x28, 0x3f, 0x48, 0x72, 0xa2, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x58, 0xa9, 0xf0, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x90, 0xad, 0xf6, 0x3f,
+ 0xb0, 0x8b, 0xc6, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x18, 0xa5, 0xea, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xdc, 0xa0, 0xe4, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x90, 0x76, 0x28, 0x3f,
+ 0x80, 0x76, 0x28, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+ 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x76, 0x28, 0x3f,
+ 0x80, 0x76, 0x28, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x84, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x74, 0x87, 0xc0, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x8c, 0xad, 0xf6, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0xb6, 0x67, 0x13, 0xc0, 0xa0, 0x65, 0x90, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x98, 0x65, 0x90, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0x70, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x98, 0x65, 0x90, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0x28, 0xbf,
+ 0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x5d, 0x84, 0x3f, 0x10, 0x6e, 0x9c, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x76, 0x28, 0x3f,
+ 0x90, 0x65, 0x10, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x50, 0x72, 0xa2, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x10, 0x3f,
+ 0x10, 0x6e, 0x1c, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+ 0x98, 0x65, 0x90, 0x3f, 0x60, 0x98, 0x58, 0x3f, 0x5c, 0x61, 0x8a, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc8, 0xb1, 0x7c, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0x98, 0x65, 0x90, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x1c, 0x3f, 0x70, 0x87, 0x40, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0xc0, 0x40, 0xa9, 0x70, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0x69, 0x96, 0x3f, 0x98, 0x65, 0x90, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x60, 0x87, 0xc0, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0x98, 0x58, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x50, 0xa9, 0x70, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+ 0x8c, 0xad, 0xf6, 0xbf, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0x88, 0x76, 0xa8, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xd8, 0x69, 0x96, 0x3f,
+ 0x7a, 0x63, 0x0d, 0xc0, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xe0, 0xa0, 0xe4, 0x3f,
+ 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3f,
+ 0xb0, 0x8b, 0xc6, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0x98, 0x65, 0x90, 0xbf,
+ 0x38, 0x83, 0xba, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x38, 0x83, 0xba, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0xd8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x98, 0x65, 0x90, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xe0, 0xa0, 0x64, 0x3f,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x48, 0x72, 0xa2, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x58, 0xa9, 0xf0, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0x5f, 0x07, 0x40,
+ 0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x50, 0xa9, 0xf0, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e,
+ 0x60, 0x98, 0x58, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9c, 0xde, 0xbf,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0xa0, 0x65, 0x10, 0x3f,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x90, 0x76, 0x28, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x70, 0x87, 0x40, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0xa0, 0x65, 0x10, 0x3f,
+ 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x20, 0x5d, 0x04, 0x3f,
+ 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0x28, 0xbf,
+ 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0x40, 0x3f,
+ 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x9c, 0xde, 0xbf, 0x50, 0xa9, 0x70, 0x3f,
+ 0x80, 0x87, 0xc0, 0xbd, 0x58, 0x85, 0x3d, 0xc0, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0xf2, 0x6b, 0x99, 0xc0, 0x60, 0x98, 0x58, 0xbf,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xb1, 0xfc, 0xbf,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x50, 0xa9, 0x70, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0xfc, 0x7e, 0xb4, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0x28, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x20, 0x5d, 0x84, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0xec, 0x8f, 0x4c, 0xc0, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf, 0x90, 0x65, 0x10, 0xbf,
+ 0x50, 0xa9, 0x70, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0x98, 0x58, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+ 0x60, 0x98, 0x58, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x70, 0x87, 0x40, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0x58, 0x3f,
+ 0xc8, 0x7a, 0xae, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x28, 0x94, 0xd2, 0xbf,
+ 0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+ 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x76, 0x28, 0xbf,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x98, 0xd8, 0x3e, 0xe0, 0xa0, 0x64, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+ 0x20, 0x5d, 0x04, 0xbf, 0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x9c, 0x3f, 0x98, 0x65, 0x90, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f, 0x98, 0x65, 0x90, 0x3f,
+ 0x80, 0x87, 0xc0, 0xbd, 0x5c, 0x61, 0x8a, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x84, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x50, 0xa9, 0xf0, 0xbf, 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x8f, 0xcc, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x98, 0x65, 0x90, 0x3f,
+ 0xb6, 0x67, 0x13, 0xc0, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x9c, 0xde, 0x3f,
+ 0x10, 0x6e, 0x9c, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0x70, 0x3f,
+ 0x28, 0x94, 0xd2, 0xbf, 0x90, 0x76, 0x28, 0x3f, 0x20, 0x5d, 0x84, 0xbf,
+ 0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0xc8, 0x7a, 0xae, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x50, 0xa9, 0x70, 0xbf,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x10, 0x3f,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xf0, 0x8f, 0xcc, 0x3f,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x9c, 0xde, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x04, 0x5b, 0x01, 0x40,
+ 0x10, 0x6e, 0x9c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x9c, 0xde, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x18, 0xa5, 0xea, 0xbf,
+ 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x61, 0x8a, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x90, 0x76, 0x28, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x60, 0x87, 0xc0, 0xbe, 0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x98, 0x65, 0x90, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x5c, 0x61, 0x8a, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0x28, 0xbf,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+ 0xdc, 0xa0, 0xe4, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x7f, 0xb4, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x50, 0x72, 0xa2, 0x3f,
+ 0xd4, 0x69, 0x16, 0xc0, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x78, 0x87, 0xc0, 0x3f,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xd0, 0xb1, 0x7c, 0x3f,
+ 0x64, 0x98, 0xd8, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0x58, 0xbf,
+ 0xec, 0x8f, 0xcc, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x38, 0x83, 0xba, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x50, 0x72, 0xa2, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0xa0, 0x64, 0xbf,
+ 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f,
+ 0x20, 0x5d, 0x04, 0x3f, 0x10, 0x6e, 0x9c, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x04, 0x5b, 0x01, 0x40,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x04, 0x5b, 0x01, 0x40,
+ 0xfc, 0x7e, 0xb4, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+ 0x02, 0x5b, 0x01, 0xc0, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x9c, 0xde, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x7f, 0x34, 0x3f,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x10, 0x3f,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x84, 0x76, 0xa8, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x3a, 0x83, 0x3a, 0xc0, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0x86, 0x76, 0x28, 0xc0, 0x90, 0x65, 0x10, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0xa0, 0x64, 0xbf,
+ 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x84, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x9c, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x98, 0xd8, 0x3e, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+ 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
+ 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+ 0x60, 0x98, 0x58, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+ 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x20, 0x5d, 0x84, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0xc8, 0xb1, 0x7c, 0xbf,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x20, 0x5d, 0x84, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x48, 0x72, 0xa2, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x90, 0x76, 0x28, 0x3f,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x10, 0x6e, 0x9c, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0x58, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0xe0, 0xa0, 0x64, 0x3f, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x74, 0x87, 0xc0, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x84, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f,
+ 0x80, 0x76, 0xa8, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
+ 0xc0, 0x7a, 0xae, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x18, 0xa5, 0xea, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x20, 0x5d, 0x04, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x10, 0x6e, 0x9c, 0x3f,
+ 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+ 0x60, 0x98, 0x58, 0xbf, 0x10, 0x6e, 0x9c, 0x3f, 0x60, 0x98, 0xd8, 0xbe,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x60, 0x98, 0x58, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x5c, 0x61, 0x8a, 0xbf,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x5d, 0x84, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x78, 0x87, 0xc0, 0x3f,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x28, 0x94, 0xd2, 0x3f,
+ 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x9c, 0xde, 0x3f,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x76, 0x28, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
+ 0x48, 0x72, 0xa2, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xfc, 0x7e, 0xb4, 0xbf,
+ 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0x58, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3f,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0x28, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x90, 0x65, 0x10, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3f,
+ 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x65, 0x10, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0x90, 0x76, 0x28, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x10, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x9c, 0xde, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+ 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0xd0, 0xb1, 0x7c, 0x3f, 0xe0, 0x7c, 0xb1, 0xc0, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x38, 0x15, 0xd4, 0xc0, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x28, 0x94, 0xd2, 0xbf,
+ 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x7f, 0x34, 0xbf, 0x60, 0xa9, 0xf0, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x50, 0x72, 0xa2, 0x3f, 0x90, 0x76, 0x28, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x90, 0x76, 0x28, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x20, 0x5d, 0x84, 0x3f,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x3a, 0x83, 0xba, 0xc0, 0x00, 0x88, 0x40, 0x3d, 0x48, 0x72, 0xa2, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0xe0, 0xa0, 0x64, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0x3f,
+ 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0xb0, 0x8b, 0xc6, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0x58, 0xbf, 0x98, 0x65, 0x90, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xd4, 0x69, 0x96, 0xbf,
+ 0x90, 0x65, 0x10, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x5c, 0x61, 0x8a, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x60, 0x98, 0xd8, 0xbe, 0x64, 0x98, 0xd8, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0x58, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x60, 0x98, 0xd8, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0xc0, 0x7a, 0xae, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x64, 0x98, 0xd8, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x38, 0x83, 0xba, 0x3f,
+ 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x70, 0x87, 0x40, 0xbf, 0x60, 0x61, 0x8a, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+ 0x80, 0x76, 0x28, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x7f, 0x34, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x5c, 0x61, 0x8a, 0xbf,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x70, 0x87, 0x40, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x98, 0x65, 0x90, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0xc8, 0x7a, 0xae, 0x3f,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0xcc, 0x3f,
+ 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x68, 0x98, 0xd8, 0x3f,
+ 0x00, 0x7f, 0x34, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x84, 0x76, 0xa8, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x7f, 0x34, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x69, 0x96, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0x3f,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x7f, 0x34, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x70, 0x87, 0x40, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x90, 0x65, 0x10, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0x58, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x48, 0x72, 0xa2, 0xbf, 0x20, 0x5d, 0x04, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x7f, 0x34, 0x3f,
+ 0x20, 0x5d, 0x84, 0x3f, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0xe0, 0xa0, 0x64, 0x3f, 0x00, 0x7f, 0x34, 0x3f,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x3f, 0x5f, 0x87, 0xc0, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0xfe, 0x7e, 0xb4, 0xc0, 0xa0, 0x65, 0x90, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0x58, 0xbf,
+ 0x60, 0x98, 0xd8, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x88, 0x76, 0xa8, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0xd4, 0x69, 0x16, 0x40, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x20, 0x5d, 0x04, 0x3f, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x48, 0x72, 0xa2, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x35, 0xa7, 0xed, 0xc0, 0x80, 0x87, 0x40, 0xbe, 0x50, 0xa9, 0x70, 0xbf,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x78, 0x87, 0xc0, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0xce, 0x8d, 0x49, 0xc0,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xe0, 0xa0, 0xe4, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x90, 0x76, 0x28, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x76, 0xa8, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0xe0, 0xa0, 0x64, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x8c, 0xad, 0xf6, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x50, 0xa9, 0x70, 0x3f, 0x90, 0x76, 0x28, 0x3f,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0x00, 0x7f, 0x34, 0xbf, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+ 0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x64, 0x98, 0xd8, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x50, 0xa9, 0x70, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x20, 0x5d, 0x04, 0xc0, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x78, 0x87, 0xc0, 0x3f,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+ 0x60, 0x98, 0x58, 0xbf, 0x10, 0x6e, 0x9c, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
+ 0x5c, 0x61, 0x8a, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0x60, 0x98, 0xd8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xc8, 0xb1, 0x7c, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xd8, 0xa0, 0x64, 0xbf,
+ 0x50, 0xa9, 0x70, 0x3f, 0xc8, 0xb1, 0x7c, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x98, 0x65, 0x90, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x28, 0x94, 0xd2, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x28, 0x94, 0xd2, 0x3f,
+ 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x84, 0x76, 0xa8, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x7a, 0xae, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
+ 0xa0, 0x65, 0x90, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f, 0x20, 0x5d, 0x04, 0x3f,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf, 0x50, 0xa9, 0x70, 0x3f,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x76, 0x28, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+ 0x80, 0x87, 0x40, 0x3e, 0xdc, 0xa0, 0x64, 0xc0, 0x00, 0x87, 0x40, 0xbd,
+ 0x20, 0x5d, 0x04, 0xbf, 0x96, 0xf7, 0xa9, 0xc0, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x88, 0x76, 0xa8, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0x28, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x10, 0x6e, 0x1c, 0xc0, 0x80, 0x87, 0x40, 0xbe, 0x74, 0x87, 0xc0, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x84, 0x76, 0xa8, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xc8, 0xb1, 0x7c, 0xbf,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x10, 0x3f, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xc0, 0xc0, 0x65, 0x10, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0xd0, 0xb1, 0x7c, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x20, 0x5d, 0x04, 0xbf, 0x50, 0xa9, 0x70, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+ 0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+ 0x64, 0x98, 0xd8, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0xe0, 0xa0, 0x64, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3f,
+ 0x02, 0x5b, 0x01, 0xc0, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0xc8, 0x7a, 0xae, 0x3f,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x60, 0x61, 0x8a, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+ 0x98, 0x65, 0x90, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x98, 0x58, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x50, 0xa9, 0x70, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x90, 0x76, 0x28, 0x3f, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+ 0x60, 0x98, 0x58, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0xc8, 0x7a, 0xae, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x28, 0x94, 0xd2, 0x3f,
+ 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0xe0, 0xa0, 0xe4, 0x3f,
+ 0x00, 0x7f, 0x34, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x38, 0x83, 0xba, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0xd0, 0xb1, 0x7c, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x74, 0x87, 0xc0, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x10, 0x3f,
+ 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
+ 0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x1c, 0x81, 0x37, 0xc0, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x98, 0xd8, 0xbe, 0x46, 0x96, 0x55, 0xc0, 0x20, 0x5d, 0x04, 0x3f,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x70, 0x87, 0x40, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0xe0, 0xa0, 0x64, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x28, 0x94, 0xd2, 0xbf,
+ 0x80, 0x76, 0x28, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x90, 0x65, 0x10, 0xbf, 0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0xe0, 0xa0, 0x64, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xd4, 0x69, 0x96, 0xbf,
+ 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x20, 0x5d, 0x04, 0x3f, 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0xc8, 0xb1, 0xfc, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x61, 0x8a, 0x3f, 0x00, 0x7f, 0x34, 0x3f,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x00, 0x7f, 0x34, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x10, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+ 0x18, 0xa5, 0xea, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x10, 0x6e, 0x9c, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x7f, 0x34, 0x3f,
+ 0x02, 0x5b, 0x01, 0xc0, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0xb0, 0x8b, 0xc6, 0x3f,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x61, 0x8a, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
+ 0x50, 0xa9, 0x70, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x50, 0xa9, 0x70, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x7f, 0x34, 0x3f, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x38, 0x83, 0xba, 0x3f,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x68, 0x98, 0xd8, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xf0, 0x8f, 0xcc, 0x3f,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0xc0, 0x7a, 0xae, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x60, 0x98, 0x58, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xdc, 0xa0, 0xe4, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x70, 0x87, 0x40, 0xbf, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x70, 0x87, 0x40, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x2c, 0x70, 0x1f, 0xc0, 0x00, 0x88, 0x40, 0x3d,
+ 0x90, 0x65, 0x10, 0xbf, 0x70, 0xab, 0x73, 0xc0, 0x00, 0x7f, 0xb4, 0x3f,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x60, 0x98, 0x58, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
+ 0x38, 0x83, 0xba, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x90, 0x76, 0x28, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x98, 0x65, 0x90, 0xbf,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xd4, 0x69, 0x96, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x5c, 0x61, 0x8a, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x9c, 0xbf,
+ 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x70, 0x87, 0x40, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0xc8, 0xb1, 0xfc, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x61, 0x8a, 0x3f, 0x20, 0x5d, 0x04, 0x3f,
+ 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x10, 0x3f,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0x20, 0x5d, 0x04, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+ 0x80, 0x87, 0x40, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x50, 0xa9, 0x70, 0xbf,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xa0, 0x9c, 0xde, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0xd8, 0x69, 0x96, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+ 0x3e, 0x5f, 0x07, 0xc0, 0x80, 0x76, 0xa8, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x9c, 0xde, 0x3f,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0xd0, 0xb1, 0x7c, 0x3f, 0x70, 0x87, 0x40, 0xbf,
+ 0x98, 0x65, 0x90, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0xd0, 0xb1, 0x7c, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0x58, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x90, 0x76, 0x28, 0x3f, 0x20, 0x5d, 0x84, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x28, 0x94, 0xd2, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x7f, 0xb4, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x68, 0x98, 0xd8, 0x3f,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xc0, 0x7a, 0xae, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0xdc, 0xa0, 0xe4, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x90, 0x76, 0x28, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
+ 0x60, 0x98, 0xd8, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
+ 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0xe0, 0xa0, 0x64, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0xbf, 0x90, 0x65, 0x10, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x34, 0xa7, 0x6d, 0xc0, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x49, 0x04, 0xbc, 0xc0, 0x20, 0x5d, 0x04, 0x3f,
+ 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x90, 0x76, 0x28, 0x3f, 0x84, 0x76, 0xa8, 0xbf,
+ 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xd8, 0x69, 0x96, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x76, 0x28, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0xd0, 0xb1, 0x7c, 0x3f,
+ 0x74, 0x87, 0xc0, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x18, 0xa5, 0xea, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0x58, 0x3f,
+ 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+ 0x88, 0x76, 0xa8, 0x3f, 0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3f,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0xd0, 0xb1, 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x70, 0xab, 0x73, 0xc0,
+ 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x90, 0x76, 0x28, 0x3f,
+ 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x7f, 0x34, 0xbf,
+ 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0x58, 0x3f,
+ 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x9c, 0xbf,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+ 0xa0, 0x65, 0x90, 0xbe, 0xc8, 0xb1, 0xfc, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0x58, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+ 0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x50, 0xa9, 0x70, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
+ 0xc8, 0xb1, 0xfc, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x50, 0x72, 0xa2, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x98, 0x65, 0x10, 0xc0, 0x60, 0x87, 0xc0, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x58, 0xa9, 0xf0, 0x3f,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x76, 0x28, 0xbf, 0x50, 0xa9, 0x70, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0x20, 0x5d, 0x84, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0x20, 0x5d, 0x04, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x9c, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x7f, 0x34, 0x3f, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x78, 0x87, 0xc0, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x9c, 0xde, 0x3f,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x84, 0x76, 0xa8, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x7f, 0x34, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x64, 0x98, 0xd8, 0xbf,
+ 0x20, 0x5d, 0x04, 0x3f, 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0xc8, 0xb1, 0xfc, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xe0, 0xa0, 0x64, 0x3f, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0x20, 0x5d, 0x04, 0xbf, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x70, 0x87, 0x40, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xdc, 0xa0, 0xe4, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+ 0x8c, 0xad, 0xf6, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x78, 0x87, 0xc0, 0x3f,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0x50, 0xa9, 0x70, 0xbf, 0xe0, 0xa0, 0x64, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+ 0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0xd0, 0xb1, 0x7c, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x60, 0x98, 0x58, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x50, 0xa9, 0x70, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x70, 0x87, 0x40, 0xbf,
+ 0x60, 0x98, 0x58, 0x3f, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x38, 0x83, 0xba, 0x3f,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xb0, 0x8b, 0xc6, 0x3f,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x9c, 0xde, 0x3f,
+ 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0xc0, 0x7a, 0xae, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x64, 0x98, 0xd8, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0x3f,
+ 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x03, 0x5b, 0x81, 0xc0, 0x80, 0x87, 0xc0, 0xbd,
+ 0x20, 0x5d, 0x04, 0xbf, 0x0d, 0x00, 0xb6, 0xc0, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3f, 0x60, 0x98, 0xd8, 0xbe,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0x28, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x76, 0xa8, 0xbe, 0x98, 0x65, 0x90, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0x28, 0xbf,
+ 0x90, 0x76, 0x28, 0x3f, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0xb6, 0x67, 0x13, 0xc0,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x61, 0x8a, 0x3f,
+ 0x70, 0x87, 0x40, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xb0, 0x8b, 0xc6, 0x3f,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x70, 0x87, 0x40, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0x58, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0x58, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x7f, 0x34, 0x3f,
+ 0x98, 0x65, 0x90, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x60, 0x98, 0x58, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0x5c, 0x61, 0x8a, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x20, 0x5d, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x84, 0xbf, 0x70, 0x87, 0x40, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
+ 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x7f, 0x34, 0x3f, 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x5c, 0x61, 0x8a, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x7f, 0x34, 0x3f,
+ 0x20, 0x5d, 0x84, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x84, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x9c, 0x3f,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x61, 0x8a, 0x3f,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
+ 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x50, 0xa9, 0x70, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+ 0x10, 0x6e, 0x1c, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x84, 0xbf,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x20, 0x5d, 0x04, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x20, 0x5d, 0x04, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+ 0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0x3f,
+ 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x10, 0x3f,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0xd8, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
+ 0x80, 0x87, 0x40, 0x3f, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0xb0, 0x8b, 0xc6, 0xbf, 0x10, 0x6e, 0x9c, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x7f, 0x34, 0x3f,
+ 0x80, 0x76, 0xa8, 0xbe, 0x98, 0x65, 0x90, 0xbf, 0xe0, 0xa0, 0x64, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x7a, 0x63, 0x8d, 0xc0, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x3a, 0x83, 0xba, 0xc0, 0x20, 0x5d, 0x04, 0xbf,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x7a, 0x63, 0x0d, 0xc0,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x70, 0x87, 0x40, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0xe0, 0xa0, 0x64, 0x3f, 0x60, 0x61, 0x8a, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0xd8, 0x69, 0x96, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x61, 0x8a, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3f,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
+ 0xb0, 0x8b, 0x46, 0xc0, 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x76, 0x28, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+ 0x60, 0x98, 0x58, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0xa4, 0x78, 0x2b, 0xc0,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+ 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xd0, 0xb1, 0x7c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x5c, 0x61, 0x8a, 0xbf, 0x00, 0x7f, 0x34, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xd4, 0x69, 0x96, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x48, 0x72, 0xa2, 0xbf, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0x58, 0x3f,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x20, 0x5d, 0x04, 0x3f,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xc8, 0xb1, 0x7c, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x90, 0x76, 0x28, 0x3f, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x61, 0x8a, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x98, 0x65, 0x90, 0x3f,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x9c, 0xde, 0x3f,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x70, 0x87, 0x40, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
+ 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0x3f,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xd0, 0xb1, 0x7c, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x20, 0x5d, 0x84, 0x3f, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x10, 0x6e, 0x9c, 0xbf, 0x98, 0x65, 0x90, 0xbf, 0xa0, 0x65, 0x10, 0x3f,
+ 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x38, 0x83, 0xba, 0x3f, 0x00, 0x7f, 0x34, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0xca, 0xb1, 0x7c, 0xc0, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x98, 0xd8, 0xbe, 0xfe, 0x7e, 0xb4, 0xc0, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x50, 0xa9, 0x70, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x48, 0x72, 0xa2, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x98, 0x65, 0x90, 0x3f,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0x60, 0x98, 0x58, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0xf0, 0x8f, 0x4c, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x76, 0x28, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x90, 0x76, 0x28, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+ 0x20, 0x5d, 0x04, 0xbf, 0xd4, 0x69, 0x96, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+ 0x94, 0x89, 0xc3, 0xc0, 0x80, 0x87, 0xc0, 0x3d, 0xd8, 0x69, 0x96, 0x3f,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf,
+ 0xf0, 0x8f, 0xcc, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x5c, 0x61, 0x8a, 0xc0,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
+ 0x80, 0x87, 0x40, 0x3f, 0x50, 0xa9, 0x70, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xb0, 0x8b, 0xc6, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+ 0x38, 0x83, 0xba, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x84, 0x76, 0xa8, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+ 0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xc8, 0xb1, 0x7c, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
+ 0x50, 0xa9, 0x70, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x84, 0x3f,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x50, 0xa9, 0x70, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xb0, 0x8b, 0xc6, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x60, 0x98, 0x58, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+ 0x60, 0x98, 0x58, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x48, 0x72, 0xa2, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x90, 0x76, 0x28, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc8, 0xb1, 0x7c, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0x28, 0xbf,
+ 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x90, 0x76, 0x28, 0x3f,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0xec, 0x8f, 0x4c, 0xc0, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x69, 0x74, 0xa5, 0xc0, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x84, 0x3f,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0xd4, 0x69, 0x96, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xd8, 0x69, 0x96, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+ 0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0xe0, 0xa0, 0x64, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x70, 0xad, 0x3b, 0xbf,
- 0x00, 0x7e, 0x88, 0x3d, 0x70, 0xad, 0x3b, 0x3f, 0x70, 0xad, 0xbb, 0xbf,
- 0x20, 0x7e, 0x88, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0xc0, 0xdc, 0xee, 0xbf, 0xb0, 0xdc, 0x6e, 0x3f, 0xf0, 0xcc, 0x5d, 0x3f,
- 0x70, 0xad, 0xbb, 0x3f, 0x20, 0x7e, 0x88, 0x3f, 0x20, 0x7e, 0x88, 0xbe,
- 0x70, 0xad, 0xbb, 0xbf, 0x40, 0xbd, 0x4c, 0x3e, 0xc8, 0x15, 0xa2, 0x3f,
- 0xe8, 0x8d, 0x99, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x15, 0xa2, 0xbf,
- 0x18, 0x45, 0xd5, 0xbf, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0xbe,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x20, 0x7e, 0x88, 0x3f, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0xdc, 0xee, 0x3e, 0x00, 0xcd, 0x5d, 0xbf,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x20, 0x7e, 0x88, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0xe0, 0x8d, 0x19, 0x3f, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0xdc, 0xee, 0x3e,
- 0xe8, 0x8d, 0x99, 0xbf, 0x20, 0xbd, 0xcc, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x38, 0xbd, 0xcc, 0xbf, 0x20, 0x7e, 0x08, 0x3f,
- 0x20, 0x7e, 0x08, 0x3f, 0x50, 0x35, 0xc4, 0x3f, 0xe0, 0x8d, 0x19, 0x3f,
- 0x20, 0x7e, 0x88, 0xbe, 0xc8, 0x15, 0xa2, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0xa8, 0x9d, 0xaa, 0x3f, 0xc0, 0xdc, 0x6e, 0xbf, 0x40, 0xbd, 0x4c, 0xbe,
- 0x28, 0x7e, 0x88, 0xbf, 0xc8, 0x15, 0xa2, 0xbf, 0x40, 0xbd, 0x4c, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0xec, 0x7f, 0x3f, 0x50, 0x35, 0xc4, 0xbf,
- 0x20, 0x7e, 0x88, 0x3e, 0x28, 0x7e, 0x88, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x50, 0x35, 0xc4, 0xbf, 0xc8, 0x15, 0xa2, 0x3f, 0x88, 0x25, 0xb3, 0x3f,
- 0x10, 0x45, 0xd5, 0x3f, 0x70, 0xad, 0xbb, 0x3f, 0x20, 0x7e, 0x88, 0x3e,
- 0x30, 0xbd, 0x4c, 0xbf, 0x40, 0x7e, 0x08, 0xbe, 0xa8, 0x9d, 0xaa, 0x3f,
- 0x24, 0x7e, 0x08, 0xc0, 0x80, 0x7e, 0x88, 0xbd, 0xd8, 0x54, 0xe6, 0xbf,
- 0x24, 0x7e, 0x08, 0xc0, 0x20, 0x7e, 0x88, 0x3f, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x88, 0x3e, 0x80, 0xec, 0x7f, 0xbf, 0x70, 0xad, 0x3b, 0x3f,
- 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x88, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0xb0, 0xdc, 0x6e, 0x3f, 0x20, 0x7e, 0x08, 0x3f, 0x20, 0xbd, 0xcc, 0x3e,
- 0xe8, 0x8d, 0x99, 0x3f, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x88, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x08, 0x3f, 0x20, 0x7e, 0x08, 0xbf,
- 0x30, 0xbd, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0xa8, 0x9d, 0xaa, 0x3f, 0x08, 0x06, 0x91, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0xcc, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x28, 0x7e, 0x88, 0xbf, 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0xec, 0x7f, 0x3f,
- 0x10, 0x45, 0xd5, 0x3f, 0x70, 0xad, 0xbb, 0x3f, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0x3e, 0x70, 0xad, 0x3b, 0x3f,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0xb0, 0x9d, 0x2a, 0xbf,
- 0xc0, 0xdc, 0xee, 0xbe, 0x20, 0xbd, 0xcc, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0xb0, 0x9d, 0x2a, 0xbf,
- 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x08, 0x3f, 0x30, 0xbd, 0x4c, 0xbf,
- 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0xdc, 0xee, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x08, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9d, 0xaa, 0xbe, 0x20, 0x7e, 0x88, 0x3e,
- 0x40, 0xbd, 0xcc, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x20, 0xbd, 0xcc, 0x3e, 0xb0, 0x9d, 0x2a, 0xbf, 0x80, 0x7e, 0x88, 0xbd,
- 0xf0, 0x8d, 0x19, 0xbf, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x08, 0xbf, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0xbe,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0xe8, 0x8d, 0x99, 0x3f, 0xd8, 0xd1, 0x1d, 0xc0, 0x9c, 0xe1, 0x2e, 0xc0,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0xf0, 0xcc, 0x5d, 0x3f,
- 0x20, 0xbd, 0xcc, 0x3e, 0x88, 0x25, 0xb3, 0x3f, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0xcd, 0x5d, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0xdc, 0xee, 0xbf,
- 0x80, 0xec, 0x7f, 0x3f, 0xa0, 0x64, 0x77, 0xc0, 0xb0, 0x9d, 0x2a, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x38, 0xbd, 0xcc, 0xbf, 0x10, 0x45, 0xd5, 0x3f,
- 0xe0, 0x8d, 0x19, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0x20, 0x7e, 0x88, 0x3e, 0x20, 0x7e, 0x88, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xc8, 0x15, 0xa2, 0x3f, 0x08, 0x06, 0x91, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0xe8, 0x8d, 0x99, 0xbf, 0x40, 0x7e, 0x08, 0xbe, 0xe8, 0x8d, 0x99, 0x3f,
- 0x30, 0xbd, 0xcc, 0x3f, 0x50, 0x35, 0xc4, 0x3f, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e, 0xf0, 0xcc, 0x5d, 0x3f,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x70, 0xad, 0x3b, 0xbf,
- 0x40, 0xbd, 0xcc, 0xbe, 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x20, 0x7e, 0x88, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x70, 0xad, 0x3b, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x20, 0xbd, 0xcc, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x20, 0x7e, 0x88, 0xbe, 0x20, 0xbd, 0xcc, 0x3e, 0xf0, 0x8d, 0x19, 0xbf,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0xa8, 0x9d, 0xaa, 0x3f, 0xb8, 0xdc, 0xee, 0x3f,
- 0xc0, 0xdc, 0x6e, 0xbf, 0x20, 0x7e, 0x88, 0x3f, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0xec, 0xff, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9d, 0x2a, 0x3f, 0x40, 0xbd, 0x4c, 0x3e,
- 0x80, 0xec, 0x7f, 0xbf, 0xc0, 0xdc, 0xee, 0x3e, 0x9c, 0xe1, 0x2e, 0xc1,
- 0x22, 0x7e, 0x88, 0x40, 0x00, 0x00, 0x00, 0x00, 0x8c, 0xa8, 0x7b, 0x40,
- 0xc0, 0xdc, 0xee, 0x3e, 0xf9, 0x38, 0x14, 0xc1, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe, 0xc8, 0x15, 0xa2, 0x3f,
- 0x28, 0x7e, 0x88, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0xcc, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0xc8, 0x15, 0xa2, 0xbf, 0x40, 0xbd, 0x4c, 0xbe,
- 0x20, 0x7e, 0x88, 0x3f, 0x50, 0x35, 0xc4, 0x3f, 0x50, 0x35, 0xc4, 0x3f,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x70, 0xad, 0x3b, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0xf0, 0x8d, 0x19, 0xbf, 0xc0, 0x9d, 0xaa, 0xbe, 0x20, 0xbd, 0xcc, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xf0, 0x8d, 0x19, 0xbf, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0xb0, 0x9d, 0x2a, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0x3e, 0x30, 0xbd, 0xcc, 0x3f,
- 0x80, 0xec, 0xff, 0x3f, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0xcc, 0xbe,
- 0x14, 0xc2, 0x0c, 0xc0, 0xc0, 0xdc, 0xee, 0xbe, 0x20, 0x7e, 0x88, 0x3f,
- 0x00, 0x7e, 0x08, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe, 0x20, 0xbd, 0xcc, 0x3e,
- 0x16, 0x45, 0xd5, 0xc0, 0xa8, 0x9d, 0xaa, 0x3f, 0x00, 0x7e, 0x88, 0x3d,
- 0xac, 0x20, 0x73, 0x40, 0x30, 0xbd, 0x4c, 0x3f, 0x18, 0x45, 0x55, 0xc0,
- 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0x70, 0xad, 0xbb, 0x3f, 0x08, 0x06, 0x91, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x08, 0xbf, 0x20, 0x7e, 0x88, 0xbe, 0xe8, 0x8d, 0x99, 0xbf,
- 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0x3f, 0x10, 0x45, 0xd5, 0x3f,
- 0x50, 0x35, 0xc4, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0xb0, 0xdc, 0x6e, 0x3f, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x30, 0xbd, 0x4c, 0xbf, 0xc0, 0xdc, 0xee, 0xbe,
- 0x20, 0x7e, 0x08, 0x3f, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe,
- 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x30, 0xbd, 0x4c, 0xbf,
- 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x30, 0xbd, 0x4c, 0xbf, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0xbd, 0xcc, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0xdc, 0xee, 0xbe, 0x40, 0xbd, 0xcc, 0xbe,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0x4c, 0x3e, 0xb0, 0xdc, 0x6e, 0x3f,
- 0x40, 0xbd, 0xcc, 0xbe, 0xa0, 0x64, 0xf7, 0xbf, 0x30, 0xbd, 0x4c, 0xbf,
- 0x00, 0x7e, 0x88, 0x3d, 0x70, 0xad, 0xbb, 0x3f, 0xf4, 0x49, 0x15, 0x40,
- 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0xc8, 0x15, 0xa2, 0x3f, 0xe8, 0x8d, 0x99, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x08, 0xbf, 0x20, 0x7e, 0x88, 0xbe,
- 0x28, 0x7e, 0x88, 0xbf, 0x20, 0x7e, 0x88, 0xbe, 0x80, 0xec, 0x7f, 0x3f,
- 0x70, 0xad, 0xbb, 0x3f, 0xa8, 0x9d, 0xaa, 0x3f, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e, 0x30, 0xbd, 0x4c, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0xb0, 0x9d, 0x2a, 0xbf,
- 0x20, 0x7e, 0x08, 0xbf, 0x20, 0x7e, 0x08, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0xbe, 0xc0, 0xdc, 0xee, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9d, 0xaa, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x70, 0xad, 0x3b, 0xbf, 0x20, 0x7e, 0x08, 0xbf, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x20, 0x7e, 0x88, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0xcc, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xb0, 0x9d, 0x2a, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x70, 0xad, 0x3b, 0xbf,
- 0xf0, 0x8d, 0x19, 0xbf, 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0xbd, 0x4c, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x08, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0xa0, 0x9d, 0xaa, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x08, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xdc, 0x6e, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x60, 0xf1, 0x3f, 0x40, 0x20, 0xbd, 0xcc, 0x3e, 0x30, 0xbd, 0x4c, 0xbf,
- 0xa0, 0x64, 0xf7, 0xbf, 0x00, 0x7e, 0x08, 0x3e, 0xdf, 0xaf, 0x9b, 0xc0,
- 0x20, 0xbd, 0xcc, 0x3e, 0xb8, 0xdc, 0xee, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0xf0, 0x8d, 0x19, 0xbf,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x88, 0x25, 0xb3, 0x3f,
- 0xe8, 0x8d, 0x99, 0xbf, 0x40, 0xbd, 0x4c, 0xbe, 0xc0, 0xdc, 0xee, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0xe8, 0x8d, 0x99, 0xbf, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x06, 0x91, 0x3f, 0x50, 0x35, 0xc4, 0x3f, 0xc8, 0x15, 0xa2, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0x30, 0xbd, 0x4c, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x08, 0xbf, 0x20, 0x7e, 0x08, 0xbf, 0xe0, 0x8d, 0x19, 0x3f,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0xcc, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x08, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x20, 0x7e, 0x88, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0xc0, 0xdc, 0xee, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0x3e,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x70, 0xad, 0x3b, 0xbf,
- 0xa0, 0x9d, 0x2a, 0x3f, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0xa0, 0x9d, 0x2a, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x80, 0xec, 0xff, 0x3f, 0xc0, 0xdc, 0xee, 0x3e,
- 0xb0, 0x9d, 0x2a, 0xbf, 0x20, 0x7e, 0x08, 0x3f, 0x40, 0x7e, 0x08, 0xbe,
- 0xbc, 0xdc, 0x6e, 0xc0, 0x20, 0x7e, 0x08, 0xbf, 0xa0, 0x9d, 0x2a, 0x3f,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x70, 0xad, 0x3b, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0x50, 0x35, 0xc4, 0x3f, 0xc8, 0x15, 0xa2, 0xbf, 0x20, 0x7e, 0x88, 0xbe,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0xc8, 0x15, 0xa2, 0xbf,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x06, 0x91, 0x3f, 0xf8, 0xcc, 0xdd, 0x3f,
- 0xf0, 0xcc, 0x5d, 0x3f, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0xec, 0x7f, 0x3f, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0x4c, 0xbe, 0x70, 0xad, 0x3b, 0xbf, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0xbd, 0xcc, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x08, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x30, 0xbd, 0x4c, 0xbf, 0x20, 0x7e, 0x88, 0x3f, 0x40, 0xbd, 0xcc, 0xbe,
- 0xc0, 0xdc, 0xee, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9d, 0x2a, 0x3f,
- 0x20, 0x7e, 0x88, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x30, 0xbd, 0x4c, 0xbf, 0x00, 0x7e, 0x88, 0x3d, 0xe8, 0x8d, 0x99, 0xbf,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0xe8, 0x8d, 0x99, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0xf8, 0x49, 0x15, 0xc0, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x70, 0xad, 0x3b, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x50, 0x35, 0xc4, 0x3f, 0x70, 0xad, 0xbb, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0xe8, 0x8d, 0x99, 0xbf, 0x20, 0x7e, 0x88, 0x3e, 0x88, 0x25, 0xb3, 0x3f,
- 0xf8, 0xcc, 0xdd, 0x3f, 0x80, 0xec, 0x7f, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe, 0x88, 0x25, 0xb3, 0x3f,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x70, 0xad, 0x3b, 0xbf,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0x4c, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0xbd, 0x4c, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0xc0, 0x9d, 0xaa, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe, 0xc0, 0xdc, 0xee, 0xbe,
- 0xf0, 0x8d, 0x19, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x88, 0x3e, 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0xbd, 0xcc, 0xbe, 0x20, 0x7e, 0x08, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe, 0x10, 0x45, 0xd5, 0x3f,
- 0x40, 0xbd, 0xcc, 0xbe, 0x30, 0xbd, 0x4c, 0xbf, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0xdc, 0xee, 0x3e, 0xf0, 0x8d, 0x19, 0xbf,
- 0xa0, 0x9d, 0xaa, 0x3e, 0xb0, 0x9d, 0x2a, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x24, 0x7e, 0x08, 0xc0, 0xc0, 0xdc, 0xee, 0x3e, 0xc0, 0xdc, 0xee, 0xbe,
- 0x80, 0xec, 0x7f, 0x3f, 0x80, 0x7e, 0x88, 0xbd, 0xbc, 0x59, 0x26, 0xc0,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0xf0, 0x8d, 0x19, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x70, 0xad, 0xbb, 0x3f,
- 0x90, 0x25, 0xb3, 0xbf, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0xe8, 0x8d, 0x99, 0xbf, 0x40, 0xbd, 0x4c, 0x3e,
- 0x10, 0x45, 0xd5, 0x3f, 0xf8, 0xcc, 0xdd, 0x3f, 0x20, 0xbd, 0xcc, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0xbd, 0xcc, 0xbe,
- 0x20, 0x7e, 0x88, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x30, 0xbd, 0x4c, 0xbf, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0xbd, 0xcc, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x40, 0xbd, 0x4c, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0xc0, 0xdc, 0xee, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0x3e,
- 0x80, 0xec, 0x7f, 0x3f, 0x20, 0x7e, 0x88, 0x3e, 0xf0, 0xcc, 0x5d, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0xbd, 0xcc, 0x3e, 0xf0, 0xcc, 0x5d, 0x3f,
- 0x20, 0x7e, 0x08, 0x3f, 0xa0, 0x9d, 0x2a, 0x3f, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0x38, 0xbd, 0xcc, 0xbf, 0xf0, 0xcc, 0x5d, 0x3f,
- 0x00, 0x7e, 0x08, 0x3e, 0x20, 0xbd, 0xcc, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0xa0, 0x64, 0xf7, 0xbf, 0x30, 0xbd, 0x4c, 0xbf, 0x40, 0xbd, 0x4c, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x70, 0xad, 0x3b, 0xbf, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x50, 0x35, 0xc4, 0x3f, 0x38, 0xbd, 0xcc, 0xbf, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0xc8, 0x15, 0xa2, 0xbf,
- 0x20, 0xbd, 0xcc, 0x3e, 0x10, 0x45, 0xd5, 0x3f, 0x80, 0xec, 0xff, 0x3f,
- 0xc0, 0xdc, 0xee, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0xe0, 0x8d, 0x19, 0x3f,
- 0x20, 0x7e, 0x08, 0xbf, 0x20, 0x7e, 0x88, 0x3f, 0x40, 0xbd, 0xcc, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x08, 0xbf, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0xcc, 0xbe, 0x20, 0x7e, 0x08, 0xbf,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdc, 0xee, 0xbe,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x20, 0x7e, 0x08, 0xbf, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x08, 0xbf,
- 0xe0, 0x8d, 0x19, 0x3f, 0xc0, 0x9d, 0xaa, 0xbe, 0xf0, 0xcc, 0x5d, 0x3f,
- 0x70, 0xad, 0x3b, 0x3f, 0xe8, 0x8d, 0x99, 0x3f, 0x20, 0x7e, 0x08, 0x3f,
- 0xf0, 0x8d, 0x19, 0xbf, 0x40, 0xbd, 0x4c, 0x3e, 0xac, 0x9d, 0x2a, 0xc0,
- 0x00, 0x06, 0x91, 0x3f, 0x20, 0x7e, 0x08, 0x3f, 0xc0, 0xdc, 0xee, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0xac, 0x9d, 0x2a, 0xc0, 0x40, 0x7e, 0x08, 0xbe,
- 0xe0, 0x8d, 0x19, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xf8, 0xcc, 0xdd, 0x3f, 0xf8, 0xcc, 0xdd, 0xbf,
- 0x00, 0x7e, 0x08, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0x38, 0xbd, 0xcc, 0xbf, 0xe0, 0x8d, 0x19, 0x3f, 0xd8, 0x54, 0xe6, 0x3f,
- 0x20, 0x7e, 0x08, 0x40, 0x20, 0x7e, 0x08, 0x3f, 0x40, 0x7e, 0x08, 0xbe,
- 0xc0, 0xdc, 0xee, 0x3e, 0xf0, 0x8d, 0x19, 0xbf, 0x80, 0xec, 0x7f, 0x3f,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0xcc, 0xbe, 0xc0, 0xdc, 0xee, 0xbe,
- 0xb0, 0x9d, 0x2a, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0xcc, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x08, 0xbf, 0x20, 0x7e, 0x08, 0xbf,
- 0x00, 0xcd, 0x5d, 0xbf, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0xbe, 0xb0, 0x9d, 0x2a, 0xbf, 0xc0, 0xdc, 0xee, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0xdc, 0xee, 0xbe,
- 0x40, 0xbd, 0xcc, 0xbe, 0x20, 0x7e, 0x88, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x08, 0xbf, 0x40, 0xbd, 0xcc, 0xbe, 0xc0, 0xdc, 0x6e, 0xbf,
- 0x00, 0x7e, 0x88, 0x3d, 0x28, 0x7e, 0x88, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x08, 0xbf, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0xe8, 0x8d, 0x99, 0x3f, 0xf0, 0xcc, 0x5d, 0x3f, 0x40, 0x7e, 0x08, 0xbe,
- 0xf0, 0xcc, 0x5d, 0x3f, 0xf0, 0x8d, 0x19, 0xbf, 0x00, 0x7e, 0x88, 0x3d,
- 0xb0, 0x9d, 0xaa, 0xbf, 0xa0, 0x9d, 0x2a, 0x3f, 0x20, 0x7e, 0x88, 0x3f,
- 0x28, 0x7e, 0x88, 0xbf, 0x40, 0xbd, 0x4c, 0xbe, 0xf8, 0x49, 0x15, 0xc0,
- 0x30, 0xbd, 0x4c, 0x3f, 0xf8, 0xcc, 0xdd, 0x3f, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0xc0, 0xdc, 0xee, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0xdc, 0xee, 0xbe,
- 0xb0, 0x9d, 0x2a, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x30, 0xbd, 0xcc, 0x3f,
- 0x34, 0x3a, 0x04, 0xc0, 0x40, 0xbd, 0x4c, 0x3e, 0x20, 0xbd, 0xcc, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x38, 0xbd, 0xcc, 0xbf, 0x20, 0x7e, 0x08, 0x3f,
- 0x80, 0xec, 0xff, 0x3f, 0xb8, 0xdc, 0xee, 0x3f, 0x70, 0xad, 0x3b, 0x3f,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0xbd, 0xcc, 0x3e, 0xc0, 0xdc, 0xee, 0xbe,
- 0x88, 0x25, 0xb3, 0x3f, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x08, 0xbf, 0xb0, 0x9d, 0x2a, 0xbf, 0x00, 0xcd, 0x5d, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe,
- 0xc0, 0xdc, 0xee, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0xcc, 0xbe, 0x70, 0xad, 0x3b, 0xbf, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0xb0, 0x9d, 0x2a, 0xbf,
- 0xb0, 0x9d, 0x2a, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0x9d, 0xaa, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe, 0xc0, 0xdc, 0xee, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0xf0, 0x8d, 0x19, 0xbf,
- 0xb0, 0x9d, 0x2a, 0xbf, 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0xdc, 0xee, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x08, 0xbf, 0x20, 0x7e, 0x08, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x34, 0x3a, 0x04, 0xc0,
- 0xc8, 0x15, 0xa2, 0x3f, 0xe0, 0x8d, 0x19, 0x3f, 0x20, 0x7e, 0x08, 0xbf,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0x3e, 0xd8, 0x54, 0xe6, 0xbf,
- 0x24, 0x7e, 0x08, 0xc0, 0x70, 0xad, 0xbb, 0x3f, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x28, 0x7e, 0x88, 0xbf, 0x30, 0xbd, 0x4c, 0x3f,
- 0xb8, 0xdc, 0xee, 0x3f, 0x34, 0x3a, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xcd, 0x5d, 0xbf, 0x80, 0xec, 0x7f, 0x3f, 0x40, 0x7e, 0x08, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x08, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x10, 0x45, 0xd5, 0x3f, 0x04, 0x06, 0x11, 0xc0, 0x20, 0xbd, 0xcc, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xcc, 0xdd, 0xbf,
- 0x20, 0xbd, 0xcc, 0x3e, 0x04, 0x06, 0x11, 0x40, 0x20, 0x7e, 0x08, 0x40,
- 0x80, 0xec, 0x7f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x70, 0xad, 0x3b, 0xbf, 0xd8, 0x54, 0xe6, 0x3f, 0x20, 0x7e, 0x88, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0xf0, 0x8d, 0x19, 0xbf, 0x00, 0xcd, 0x5d, 0xbf,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x88, 0x25, 0xb3, 0x3f,
- 0xb0, 0x9d, 0xaa, 0xbf, 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0xc8, 0x15, 0xa2, 0xbf, 0x40, 0xbd, 0x4c, 0x3e,
- 0x70, 0xad, 0xbb, 0x3f, 0xd8, 0x54, 0xe6, 0x3f, 0x00, 0x06, 0x91, 0x3f,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x20, 0x7e, 0x88, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x08, 0xbf, 0xc0, 0x9d, 0xaa, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0x3e, 0xb0, 0x9d, 0x2a, 0xbf,
- 0x20, 0x7e, 0x08, 0x3f, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0xe0, 0x8d, 0x19, 0x3f,
- 0xa0, 0x9d, 0x2a, 0x3f, 0x30, 0xbd, 0x4c, 0x3f, 0x40, 0xbd, 0x4c, 0x3e,
- 0x20, 0x7e, 0x88, 0x3e, 0x20, 0x7e, 0x08, 0x3f, 0xe0, 0x8d, 0x19, 0x3f,
- 0x20, 0xbd, 0xcc, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x38, 0xbd, 0xcc, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0xdc, 0xee, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0xbe, 0xd8, 0x54, 0xe6, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0xbd, 0xcc, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0xe8, 0x8d, 0x99, 0xbf, 0x20, 0x7e, 0x88, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x20, 0xbd, 0xcc, 0x3e,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x08, 0x3f,
- 0x30, 0xbd, 0x4c, 0xbf, 0x40, 0xbd, 0x4c, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x08, 0x06, 0x91, 0xbf, 0x20, 0x7e, 0x88, 0xbe,
- 0xc0, 0xdc, 0xee, 0x3e, 0xf8, 0xcc, 0xdd, 0x3f, 0xe0, 0x8d, 0x19, 0x3f,
- 0x80, 0x7e, 0x88, 0xbd, 0x30, 0xbd, 0x4c, 0x3f, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x30, 0xbd, 0x4c, 0xbf, 0x40, 0xbd, 0x4c, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x70, 0xad, 0x3b, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x70, 0xad, 0x3b, 0xbf, 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0xc0, 0xdc, 0x6e, 0xbf, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0xcc, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x20, 0x7e, 0x08, 0x3f, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0xa0, 0x9d, 0xaa, 0x3e,
- 0xa0, 0x9d, 0xaa, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0x9d, 0xaa, 0xbe, 0xa0, 0x9d, 0x2a, 0x3f,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0x3e,
- 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x88, 0x3e, 0x40, 0xbd, 0xcc, 0xbe,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e,
- 0xc0, 0xdc, 0xee, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x9d, 0xaa, 0xbe, 0xe0, 0x8d, 0x19, 0x3f, 0x20, 0x7e, 0x88, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0xbd, 0xcc, 0x3e, 0x04, 0x06, 0x11, 0xc0,
- 0xb0, 0x9d, 0xaa, 0xbf, 0xc0, 0x9d, 0xaa, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0xa0, 0x9d, 0x2a, 0x3f, 0x20, 0xbd, 0xcc, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0xe0, 0x8d, 0x19, 0x3f, 0xb0, 0x9d, 0xaa, 0xbf,
- 0x40, 0xbd, 0xcc, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x24, 0x7e, 0x08, 0xc0,
- 0xd8, 0x54, 0xe6, 0x3f, 0xc0, 0xdc, 0xee, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x08, 0x3f,
- 0x70, 0xad, 0x3b, 0xbf, 0x20, 0x7e, 0x88, 0x3e, 0x40, 0xbd, 0xcc, 0xbe,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x80, 0xec, 0x7f, 0xbf, 0x40, 0xbd, 0xcc, 0xbe,
- 0x20, 0x7e, 0x88, 0x3e, 0x50, 0x35, 0xc4, 0x3f, 0xe0, 0x8d, 0x19, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x30, 0xbd, 0x4c, 0x3f, 0x40, 0xbd, 0x4c, 0x3e,
- 0x20, 0x7e, 0x88, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x70, 0xad, 0x3b, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0xdc, 0xee, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0xa0, 0x9d, 0xaa, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe, 0x20, 0x7e, 0x88, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x20, 0xbd, 0xcc, 0x3e, 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9d, 0xaa, 0xbe,
- 0xc0, 0xdc, 0xee, 0x3e, 0x40, 0xbd, 0x4c, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x40, 0xbd, 0xcc, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0x3e,
- 0x20, 0x7e, 0x88, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0xbd, 0x4c, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0xcc, 0xbe, 0xe0, 0x8d, 0x19, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e, 0xa0, 0x9d, 0x2a, 0x3f,
- 0xb8, 0xdc, 0xee, 0x3f, 0x00, 0x7e, 0x88, 0x3d, 0xc8, 0x15, 0xa2, 0x3f,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0x3e, 0x40, 0xbd, 0xcc, 0xbe,
- 0xa0, 0x64, 0x77, 0xc0, 0xb0, 0xdc, 0x6e, 0x3f, 0xc0, 0xdc, 0xee, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0xb8, 0xdc, 0xee, 0x3f, 0xb0, 0x9d, 0x2a, 0xbf,
- 0x1b, 0xa0, 0x0a, 0xc1, 0xf4, 0x49, 0x15, 0x40, 0x40, 0x7e, 0x08, 0xbe,
- 0x50, 0x35, 0xc4, 0x3f, 0x20, 0xbd, 0xcc, 0x3e, 0x1d, 0x23, 0xd3, 0xc0,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9d, 0xaa, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0xc0, 0xdc, 0xee, 0x3e, 0x70, 0xad, 0x3b, 0xbf, 0x40, 0xbd, 0x4c, 0x3e,
- 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x28, 0x7e, 0x88, 0xbf,
- 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0xbd, 0xcc, 0x3e, 0x50, 0x35, 0xc4, 0x3f,
- 0x20, 0x7e, 0x08, 0x3f, 0x00, 0x7e, 0x88, 0x3d, 0x70, 0xad, 0x3b, 0x3f,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x70, 0xad, 0x3b, 0xbf,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0xbd, 0xcc, 0x3e, 0x40, 0xbd, 0xcc, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0xbd, 0xcc, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0xe0, 0x8d, 0x19, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdc, 0xee, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0xbd, 0xcc, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0x3e, 0x20, 0x7e, 0x88, 0x3e, 0x20, 0x7e, 0x88, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0xa0, 0x9d, 0x2a, 0x3f, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0xb0, 0xdc, 0x6e, 0x3f, 0xd8, 0x54, 0xe6, 0x3f, 0xa0, 0x9d, 0xaa, 0x3e,
- 0xa0, 0x9d, 0x2a, 0x3f, 0x20, 0x7e, 0x88, 0x3e, 0x20, 0x7e, 0x08, 0x3f,
- 0x40, 0xbd, 0xcc, 0xbe, 0x8c, 0x25, 0x33, 0xc0, 0xe0, 0x8d, 0x19, 0x3f,
- 0xa0, 0x9d, 0x2a, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xcc, 0xdd, 0x3f,
- 0x00, 0xcd, 0x5d, 0xbf, 0x26, 0x6d, 0x07, 0xc1, 0x14, 0xc2, 0x0c, 0x40,
- 0x00, 0x7e, 0x88, 0x3d, 0xe8, 0x8d, 0x99, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0xf8, 0x49, 0x15, 0xc0, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0xbd, 0xcc, 0x3e, 0xb0, 0x9d, 0x2a, 0xbf,
- 0x20, 0x7e, 0x88, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0xec, 0x7f, 0xbf, 0xc0, 0x9d, 0xaa, 0xbe, 0xc0, 0xdc, 0xee, 0x3e,
- 0x70, 0xad, 0xbb, 0x3f, 0x20, 0x7e, 0x08, 0x3f, 0x00, 0x7e, 0x88, 0x3d,
- 0x70, 0xad, 0x3b, 0x3f, 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe,
- 0xf0, 0x8d, 0x19, 0xbf, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0xdc, 0xee, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x88, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x08, 0x3f,
- 0x40, 0xbd, 0xcc, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9d, 0xaa, 0x3e,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0xbd, 0xcc, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0xdc, 0xee, 0xbe,
- 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdc, 0xee, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0xa0, 0x9d, 0xaa, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0xbd, 0xcc, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe, 0xe8, 0x8d, 0x99, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0xe0, 0x8d, 0x19, 0x3f, 0x00, 0x7e, 0x08, 0x3e,
- 0xe8, 0x8d, 0x99, 0x3f, 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x08, 0xbf, 0x40, 0x7e, 0x08, 0xbe,
- 0x20, 0x7e, 0x88, 0x3e, 0xa0, 0x9d, 0x2a, 0x3f, 0x50, 0x35, 0x44, 0xc0,
- 0x00, 0x06, 0x91, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0xec, 0x7f, 0x3f,
- 0xe0, 0x8d, 0x19, 0x3f, 0x70, 0xad, 0xbb, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x30, 0xbd, 0x4c, 0xbf, 0x40, 0xbd, 0x4c, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0xe8, 0x8d, 0x99, 0xbf, 0x20, 0x7e, 0x88, 0xbe,
- 0x20, 0x7e, 0x88, 0x3e, 0x10, 0x45, 0xd5, 0x3f, 0x70, 0xad, 0x3b, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0x70, 0xad, 0x3b, 0x3f, 0x40, 0xbd, 0x4c, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x30, 0xbd, 0x4c, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0xdc, 0xee, 0xbe, 0xc0, 0xdc, 0xee, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe,
- 0xe0, 0x8d, 0x19, 0x3f, 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0xcc, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x20, 0x7e, 0x88, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xe0, 0x8d, 0x19, 0x3f, 0x20, 0x7e, 0x88, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0xc0, 0xdc, 0xee, 0xbe, 0x20, 0x7e, 0x08, 0x3f, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0xa0, 0x9d, 0x2a, 0x3f,
- 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xbd, 0xcc, 0x3e,
- 0x20, 0x7e, 0x88, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9d, 0x2a, 0x3f,
- 0x40, 0xbd, 0xcc, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdc, 0xee, 0x3e,
- 0xc0, 0xdc, 0xee, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0x70, 0xad, 0x3b, 0x3f,
- 0x40, 0xbd, 0x4c, 0x3e, 0x70, 0xad, 0x3b, 0x3f, 0x40, 0xbd, 0x4c, 0xbe,
- 0xa8, 0x9d, 0xaa, 0x3f, 0x20, 0x7e, 0x88, 0x3e, 0x70, 0xad, 0x3b, 0x3f,
- 0x80, 0x7e, 0x88, 0xbd, 0x60, 0xf1, 0x3f, 0xc0, 0xc0, 0xdc, 0xee, 0x3e,
- 0x70, 0xad, 0x3b, 0xbf, 0x70, 0xad, 0x3b, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0xac, 0x9d, 0x2a, 0xc0, 0x20, 0xbd, 0xcc, 0x3e, 0xb8, 0xdc, 0xee, 0x3f,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0xe0, 0x8d, 0x19, 0x3f, 0x20, 0x7e, 0x08, 0xbf, 0x00, 0x7e, 0x08, 0x3e,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0xec, 0x7f, 0xbf,
- 0x40, 0xbd, 0xcc, 0xbe, 0x20, 0x7e, 0x88, 0x3e, 0x70, 0xad, 0xbb, 0x3f,
- 0xe0, 0x8d, 0x19, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0x70, 0xad, 0x3b, 0x3f,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xad, 0x3b, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e, 0x20, 0x7e, 0x88, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe, 0x20, 0xbd, 0xcc, 0x3e,
- 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xb0, 0x9d, 0x2a, 0xbf, 0x04, 0x06, 0x11, 0xc0, 0x40, 0xbd, 0x4c, 0x3e,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0xbd, 0x4c, 0x3e, 0x50, 0x35, 0xc4, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e,
- 0xf0, 0x8d, 0x19, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x15, 0x22, 0xc0,
- 0x20, 0x7e, 0x08, 0x3f, 0xc0, 0xdc, 0x6e, 0xbf, 0x30, 0xbd, 0x4c, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0xb0, 0x9d, 0xaa, 0xbf, 0xe8, 0x8d, 0x99, 0x3f,
- 0xb0, 0x9d, 0x2a, 0xbf, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x08, 0x3f, 0xb0, 0x9d, 0x2a, 0xbf,
- 0xa0, 0x9d, 0xaa, 0x3e, 0xc0, 0xdc, 0xee, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0xb0, 0x9d, 0xaa, 0xbf, 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0x3e,
- 0x10, 0x45, 0xd5, 0x3f, 0x20, 0x7e, 0x08, 0x3f, 0x40, 0x7e, 0x08, 0xbe,
- 0x70, 0xad, 0x3b, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0xcd, 0x5d, 0xbf, 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0x3e,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0xcc, 0xbe,
- 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x08, 0xbf, 0xb0, 0x9d, 0xaa, 0xbf,
- 0xa0, 0x9d, 0xaa, 0x3e, 0xc0, 0xdc, 0xee, 0x3e, 0x40, 0xbd, 0x4c, 0x3e,
- 0xc8, 0x15, 0xa2, 0x3f, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x30, 0xbd, 0x4c, 0xbf, 0x80, 0x7e, 0x88, 0xbd,
- 0x14, 0xc2, 0x8c, 0xc0, 0x88, 0x25, 0xb3, 0x3f, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x50, 0x35, 0xc4, 0xbf, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0xc8, 0x15, 0xa2, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x30, 0xbd, 0x4c, 0x3f,
- 0x08, 0x06, 0x91, 0xbf, 0x40, 0xbd, 0x4c, 0x3e, 0xf0, 0x8d, 0x19, 0xbf,
- 0x40, 0xbd, 0x4c, 0xbe, 0x50, 0x35, 0xc4, 0xbf, 0x40, 0xbd, 0x4c, 0xbe,
- 0xa0, 0x9d, 0x2a, 0x3f, 0x10, 0x45, 0xd5, 0x3f, 0xc0, 0xdc, 0xee, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0xf0, 0xcc, 0x5d, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0xec, 0x7f, 0xbf, 0x70, 0xad, 0x3b, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe,
- 0x20, 0x7e, 0x88, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0xcc, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0xbd, 0xcc, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe,
- 0x38, 0xbd, 0xcc, 0xbf, 0x20, 0x7e, 0x88, 0x3e, 0x20, 0x7e, 0x08, 0xbf,
- 0x00, 0x7e, 0x88, 0x3d, 0x70, 0xad, 0x3b, 0x3f, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x30, 0xbd, 0x4c, 0x3f, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0xcc, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x04, 0x06, 0x91, 0xc0, 0x40, 0xbd, 0xcc, 0xbe,
- 0x10, 0x45, 0xd5, 0x3f, 0xe8, 0x8d, 0x99, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0x3f, 0x50, 0x35, 0xc4, 0x3f, 0x20, 0x7e, 0x88, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0xec, 0x7f, 0x3f, 0x28, 0x7e, 0x88, 0xbf, 0x20, 0x7e, 0x88, 0x3e,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x18, 0x45, 0xd5, 0xbf,
- 0x40, 0xbd, 0xcc, 0xbe, 0x30, 0xbd, 0x4c, 0x3f, 0xb8, 0xdc, 0xee, 0x3f,
- 0x30, 0xbd, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0x3f,
- 0x80, 0x7e, 0x88, 0xbd, 0xa0, 0x9d, 0xaa, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e, 0xe8, 0x8d, 0x99, 0xbf,
- 0x20, 0x7e, 0x08, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x88, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0xbd, 0xcc, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0xbd, 0xcc, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e, 0xc0, 0xdc, 0xee, 0x3e,
- 0x50, 0x35, 0xc4, 0xbf, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0xb0, 0xdc, 0x6e, 0x3f, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x20, 0x7e, 0x88, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0xac, 0x9d, 0x2a, 0xc0,
- 0x40, 0xbd, 0x4c, 0xbe, 0x70, 0xad, 0x3b, 0x3f, 0xf8, 0xcc, 0xdd, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x91, 0x3f, 0x30, 0xbd, 0xcc, 0x3f,
- 0x20, 0x7e, 0x88, 0x3f, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0xdc, 0xee, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xb0, 0xdc, 0x6e, 0x3f, 0x38, 0xbd, 0xcc, 0xbf,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0xa0, 0x64, 0xf7, 0xbf, 0x40, 0xbd, 0xcc, 0xbe, 0xe8, 0x8d, 0x99, 0x3f,
- 0x30, 0x3a, 0x04, 0x40, 0xf0, 0xcc, 0x5d, 0x3f, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0xec, 0x7f, 0x3f, 0x80, 0x7e, 0x88, 0xbd, 0x70, 0xad, 0x3b, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e,
- 0xc8, 0x15, 0xa2, 0xbf, 0xc0, 0xdc, 0x6e, 0xbf, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0xc0, 0xdc, 0x6e, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x70, 0xad, 0x3b, 0xbf,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0xa8, 0x9d, 0xaa, 0x3f,
- 0x00, 0x7e, 0x88, 0x3d, 0x38, 0xbd, 0xcc, 0xbf, 0x20, 0xbd, 0xcc, 0x3e,
- 0xc0, 0x9d, 0xaa, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe, 0xa0, 0x9d, 0x2a, 0x3f,
- 0x20, 0xbd, 0xcc, 0x3e, 0xc0, 0xdc, 0xee, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x70, 0xad, 0x3b, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0xdc, 0xee, 0xbf, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x06, 0x91, 0x3f, 0x00, 0x06, 0x91, 0x3f, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0xf0, 0x8d, 0x19, 0xbf,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0xf0, 0xcc, 0x5d, 0x3f,
- 0x18, 0x45, 0xd5, 0xbf, 0x20, 0x7e, 0x08, 0x3f, 0xc0, 0xdc, 0xee, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0xec, 0xff, 0xbf, 0x20, 0x7e, 0x88, 0xbe,
- 0x88, 0x25, 0xb3, 0x3f, 0x20, 0x7e, 0x08, 0x40, 0xa0, 0x9d, 0x2a, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0x30, 0xbd, 0x4c, 0x3f, 0x00, 0x7e, 0x08, 0x3e,
- 0xe8, 0x8d, 0x99, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x28, 0x7e, 0x88, 0xbf, 0x30, 0xbd, 0x4c, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0xc0, 0xdc, 0xee, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0x3e, 0x20, 0x7e, 0x88, 0x3e, 0x40, 0xbd, 0xcc, 0xbe,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0xe8, 0x8d, 0x99, 0xbf, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe,
- 0xf0, 0x8d, 0x19, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x20, 0x7e, 0x88, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0x3e,
- 0x28, 0x7e, 0x88, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0xc8, 0x15, 0xa2, 0x3f, 0x20, 0x7e, 0x88, 0x3e, 0xa0, 0x64, 0xf7, 0xbf,
- 0xa0, 0x9d, 0xaa, 0x3e, 0xa0, 0x9d, 0x2a, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0xf0, 0x8d, 0x19, 0xbf, 0xc0, 0xdc, 0xee, 0xbe, 0xc0, 0xdc, 0xee, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x88, 0x25, 0xb3, 0x3f, 0xe8, 0x8d, 0x19, 0xc0, 0x40, 0x7e, 0x08, 0xbe,
- 0xa0, 0x9d, 0xaa, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0xcc, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x80, 0xec, 0x7f, 0x3f, 0xf8, 0xcc, 0xdd, 0xbf, 0x20, 0x7e, 0x08, 0x3f,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x14, 0xc2, 0x0c, 0xc0,
- 0x40, 0xbd, 0x4c, 0xbe, 0x10, 0x45, 0xd5, 0x3f, 0xf4, 0x49, 0x15, 0x40,
- 0x20, 0xbd, 0xcc, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0xe0, 0x8d, 0x19, 0x3f,
- 0x20, 0xbd, 0xcc, 0x3e, 0x50, 0x35, 0xc4, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0xe8, 0x8d, 0x99, 0xbf,
- 0xc0, 0xdc, 0x6e, 0xbf, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0xa0, 0x9d, 0xaa, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0xa0, 0x9d, 0xaa, 0x3e, 0xc8, 0x15, 0xa2, 0xbf,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x20, 0x7e, 0x88, 0x3e, 0xc0, 0xdc, 0xee, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x70, 0xad, 0xbb, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0xdc, 0xee, 0x3e, 0x08, 0x06, 0x91, 0xbf, 0x70, 0xad, 0x3b, 0x3f,
- 0xc0, 0xdc, 0xee, 0xbf, 0x20, 0x7e, 0x88, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0xc8, 0x15, 0xa2, 0xbf, 0x20, 0x7e, 0x88, 0x3e,
- 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x30, 0xbd, 0x4c, 0xbf,
- 0xa8, 0x9d, 0xaa, 0x3f, 0x00, 0x06, 0x91, 0x3f, 0xe8, 0x8d, 0x19, 0xc0,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0xdc, 0xee, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0x9d, 0xaa, 0xbe, 0x20, 0x7e, 0x08, 0xbf,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0xa0, 0x9d, 0xaa, 0x3e, 0x08, 0x06, 0x91, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0xec, 0x7f, 0x3f, 0x34, 0x3a, 0x04, 0xc0,
- 0x30, 0xbd, 0x4c, 0x3f, 0xf0, 0x8d, 0x19, 0xbf, 0x20, 0x7e, 0x88, 0xbe,
- 0x04, 0x06, 0x11, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x14, 0xc2, 0x0c, 0x40,
- 0xb8, 0x59, 0x26, 0x40, 0xf0, 0xcc, 0x5d, 0x3f, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0xbd, 0xcc, 0x3e, 0x30, 0xbd, 0x4c, 0x3f, 0x04, 0x06, 0x11, 0x40,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xe8, 0x8d, 0x99, 0xbf, 0xc8, 0x15, 0xa2, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x9d, 0x2a, 0x3f, 0x08, 0x06, 0x91, 0xbf, 0x20, 0xbd, 0xcc, 0x3e,
- 0xc0, 0xdc, 0xee, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x18, 0x45, 0xd5, 0xbf,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x70, 0xad, 0x3b, 0x3f, 0x98, 0x64, 0xf7, 0x3f,
- 0xa0, 0x9d, 0x2a, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0xec, 0x7f, 0x3f,
- 0x40, 0xbd, 0x4c, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0xcd, 0x5d, 0xbf,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x18, 0x45, 0xd5, 0xbf, 0xa8, 0x9d, 0xaa, 0x3f, 0xa0, 0x9d, 0xaa, 0x3e,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0xcc, 0xbe,
- 0xe0, 0x8d, 0x19, 0x3f, 0x20, 0x7e, 0x08, 0x3f, 0x20, 0x7e, 0x08, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x28, 0x7e, 0x88, 0xbf, 0x00, 0x7e, 0x88, 0x3d,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0xbe, 0xe0, 0x8d, 0x19, 0x3f, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0x28, 0x7e, 0x88, 0xbf, 0x00, 0xcd, 0x5d, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x50, 0x35, 0xc4, 0xbf,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0xec, 0x7f, 0xbf, 0x40, 0x7e, 0x08, 0xbe,
- 0xc0, 0xdc, 0xee, 0x3e, 0x80, 0xec, 0x7f, 0xbf, 0x70, 0xad, 0x3b, 0x3f,
- 0xc0, 0xdc, 0xee, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x50, 0x35, 0xc4, 0xbf,
- 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0xdc, 0xee, 0x3e, 0xd8, 0x54, 0xe6, 0x3f,
- 0xe0, 0x8d, 0x19, 0x3f, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0xbd, 0xcc, 0x3e,
- 0xc0, 0x9d, 0xaa, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x08, 0x3f, 0xc0, 0xdc, 0xee, 0xbe,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe,
- 0x20, 0x7e, 0x88, 0x3e, 0x30, 0xbd, 0x4c, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x08, 0xbf, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0x9d, 0xaa, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x20, 0xbd, 0xcc, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0xe0, 0x8d, 0x19, 0x3f, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0x3e,
- 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x88, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x08, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9d, 0xaa, 0xbe,
- 0xa0, 0x9d, 0xaa, 0x3e, 0xc0, 0xdc, 0xee, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdc, 0xee, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0xbd, 0xcc, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e,
- 0x40, 0xbd, 0xcc, 0xbe, 0x20, 0x7e, 0x08, 0x3f, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe, 0xc0, 0xdc, 0xee, 0x3e,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0xf0, 0xcc, 0x5d, 0x3f,
- 0xf8, 0x49, 0x15, 0xc0, 0x24, 0x7e, 0x08, 0xc0, 0x40, 0xbd, 0x4c, 0x3e,
- 0xc0, 0xdc, 0xee, 0x3e, 0xc0, 0xdc, 0xee, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0xc8, 0x15, 0xa2, 0xbf, 0x00, 0x7e, 0x88, 0x3d, 0xb0, 0x9d, 0xaa, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0xe8, 0x8d, 0x99, 0x3f, 0x50, 0x35, 0xc4, 0x3f,
- 0xcc, 0x98, 0x6a, 0xc0, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x18, 0x45, 0xd5, 0xbf, 0xe0, 0x8d, 0x19, 0x3f, 0xd8, 0x54, 0xe6, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0x20, 0x7e, 0x08, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0xbd, 0xcc, 0x3e, 0x80, 0xec, 0x7f, 0xbf, 0x70, 0xad, 0x3b, 0x3f,
- 0xf0, 0x8d, 0x19, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0x18, 0x45, 0xd5, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x08, 0x3f, 0xd8, 0x54, 0xe6, 0x3f,
- 0xe0, 0x8d, 0x19, 0x3f, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0xbd, 0xcc, 0x3e,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0xbd, 0x4c, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0xdc, 0xee, 0x3e, 0xf0, 0x8d, 0x19, 0xbf,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0xf0, 0x8d, 0x19, 0xbf,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0xa0, 0x9d, 0x2a, 0x3f, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0xdc, 0xee, 0xbe,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0xdc, 0xee, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0xf0, 0x8d, 0x19, 0xbf, 0x40, 0xbd, 0x4c, 0xbe,
- 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x20, 0x7e, 0x08, 0x3f, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x08, 0x3f, 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0x3f, 0xf0, 0xcc, 0x5d, 0x3f, 0xf8, 0xcc, 0xdd, 0xbf,
- 0x20, 0x7e, 0x88, 0x3f, 0xa0, 0x9d, 0xaa, 0x3e, 0xc0, 0xdc, 0xee, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x69, 0x37, 0xc0, 0xc0, 0xdc, 0xee, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x06, 0x91, 0x3f,
- 0xf0, 0xcc, 0x5d, 0x3f, 0x13, 0xc2, 0x0c, 0xc1, 0x30, 0x3a, 0x04, 0x40,
- 0x00, 0x7e, 0x08, 0x3e, 0x70, 0xad, 0xbb, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0xf6, 0x49, 0x95, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0xcc, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0xe0, 0x8d, 0x19, 0x3f, 0x00, 0xcd, 0x5d, 0xbf,
- 0x20, 0x7e, 0x08, 0x3f, 0xc0, 0xdc, 0xee, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x50, 0x35, 0xc4, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0xdc, 0xee, 0x3e,
- 0xf8, 0xcc, 0xdd, 0x3f, 0xe0, 0x8d, 0x19, 0x3f, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0xbd, 0xcc, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe, 0x20, 0xbd, 0xcc, 0x3e,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0xdc, 0xee, 0x3e,
- 0x20, 0x7e, 0x08, 0xbf, 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x8d, 0x19, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0xbd, 0xcc, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0xcc, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdc, 0xee, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xe0, 0x8d, 0x19, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0x3e, 0x20, 0x7e, 0x88, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e, 0xc0, 0xdc, 0xee, 0xbe,
- 0x20, 0x7e, 0x88, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9d, 0xaa, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xe0, 0x8d, 0x19, 0x3f, 0xf0, 0xcc, 0x5d, 0x3f,
- 0x20, 0x7e, 0x08, 0xbf, 0x88, 0x25, 0xb3, 0x3f, 0xc0, 0xdc, 0xee, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0xe8, 0x8d, 0x19, 0xc0,
- 0x00, 0x7e, 0x88, 0x3d, 0xe0, 0x8d, 0x19, 0x3f, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x06, 0x91, 0x3f, 0x20, 0x7e, 0x88, 0x3e, 0x8f, 0xa8, 0xfb, 0xc0,
- 0xd8, 0x54, 0xe6, 0x3f, 0x00, 0x7e, 0x88, 0x3d, 0xf8, 0xcc, 0xdd, 0x3f,
- 0xb0, 0x9d, 0x2a, 0xbf, 0x14, 0xc2, 0x0c, 0xc0, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0xbd, 0xcc, 0x3e,
- 0x30, 0xbd, 0x4c, 0xbf, 0x20, 0x7e, 0x08, 0x3f, 0x40, 0xbd, 0xcc, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x38, 0xbd, 0xcc, 0xbf, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0xbd, 0xcc, 0x3e, 0xb8, 0xdc, 0xee, 0x3f, 0xc0, 0xdc, 0xee, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x20, 0xbd, 0xcc, 0x3e, 0xc0, 0xdc, 0xee, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x20, 0x7e, 0x08, 0x3f, 0xf0, 0x8d, 0x19, 0xbf, 0x20, 0x7e, 0x88, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x08, 0xbf, 0x40, 0xbd, 0x4c, 0x3e,
- 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0xe0, 0x8d, 0x19, 0x3f, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x08, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0xf0, 0x8d, 0x19, 0xbf, 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0xdc, 0xee, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0xe0, 0x8d, 0x19, 0x3f,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0xa0, 0x9d, 0x2a, 0x3f,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0xcc, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x88, 0x25, 0xb3, 0x3f, 0x20, 0x7e, 0x08, 0x3f,
- 0x80, 0x69, 0x37, 0xc0, 0x70, 0xad, 0x3b, 0x3f, 0x00, 0x7e, 0x08, 0x3e,
- 0xe0, 0x8d, 0x19, 0x3f, 0x90, 0x25, 0xb3, 0xbf, 0x04, 0x06, 0x11, 0x40,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0xc0, 0xdc, 0xee, 0x3e, 0x80, 0xec, 0x7f, 0xbf, 0x20, 0x7e, 0x08, 0x3f,
- 0x40, 0xbd, 0xcc, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x70, 0xad, 0xbb, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x08, 0x3f, 0x98, 0x64, 0xf7, 0x3f,
- 0xc0, 0xdc, 0xee, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0x3e,
- 0x20, 0x7e, 0x88, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0xbd, 0xcc, 0x3e, 0xf0, 0x8d, 0x19, 0xbf,
- 0x20, 0x7e, 0x88, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x08, 0xbf,
- 0x40, 0xbd, 0x4c, 0x3e, 0x20, 0x7e, 0x88, 0x3e, 0x20, 0x7e, 0x88, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x30, 0xbd, 0x4c, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe,
- 0x20, 0xbd, 0xcc, 0x3e, 0x20, 0x7e, 0x88, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xf0, 0x8d, 0x19, 0xbf, 0x20, 0x7e, 0x88, 0x3e,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x70, 0xad, 0x3b, 0x3f, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x88, 0x3e, 0x20, 0x7e, 0x88, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xe8, 0x8d, 0x99, 0x3f, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0xcd, 0x5d, 0xbf,
- 0x08, 0x06, 0x91, 0xbf, 0xa0, 0x9d, 0xaa, 0x3e, 0xe8, 0x8d, 0x99, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdc, 0x6e, 0xbf, 0xc0, 0xdc, 0xee, 0x3e,
- 0xe0, 0x8d, 0x19, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0xec, 0x7f, 0x3f,
- 0xa0, 0x9d, 0x2a, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0x5d, 0xbf,
- 0x00, 0x7e, 0x88, 0x3d, 0xdc, 0x54, 0x66, 0xc0, 0xf8, 0xcc, 0xdd, 0xbf,
- 0x20, 0x7e, 0x08, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x08, 0x3f, 0x30, 0xbd, 0x4c, 0xbf,
- 0xa0, 0x9d, 0x2a, 0x3f, 0xf0, 0x8d, 0x19, 0xbf, 0x80, 0x7e, 0x88, 0xbd,
- 0x90, 0x25, 0xb3, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x08, 0x3f,
- 0x98, 0x64, 0xf7, 0x3f, 0x20, 0x7e, 0x08, 0x3f, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0x4c, 0x3e, 0xc0, 0xdc, 0xee, 0xbe, 0x20, 0x7e, 0x88, 0x3e,
- 0x40, 0xbd, 0xcc, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0xa0, 0x9d, 0xaa, 0x3e,
- 0xc0, 0xdc, 0xee, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xb0, 0x9d, 0x2a, 0xbf, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0xbd, 0xcc, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x9d, 0x2a, 0xbf,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e,
- 0x20, 0x7e, 0x88, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0xb0, 0x9d, 0x2a, 0xbf, 0x80, 0xec, 0x7f, 0xbf,
- 0x20, 0x7e, 0x88, 0x3e, 0x38, 0xbd, 0xcc, 0xbf, 0xa0, 0x9d, 0xaa, 0x3e,
- 0xf0, 0xcc, 0x5d, 0x3f, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x08, 0x3f, 0x40, 0x7e, 0x08, 0xbe,
- 0x80, 0xec, 0x7f, 0x3f, 0xe0, 0x8d, 0x19, 0x3f, 0x00, 0x7e, 0x88, 0x3d,
- 0x90, 0x25, 0xb3, 0xbf, 0x40, 0x7e, 0x08, 0xbe, 0xf8, 0xcc, 0xdd, 0xbf,
- 0xc8, 0x15, 0xa2, 0xbf, 0x20, 0x7e, 0x88, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x08, 0x06, 0x91, 0xbf, 0x20, 0x7e, 0x08, 0x3f, 0x70, 0xad, 0x3b, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x18, 0x45, 0xd5, 0xbf, 0x00, 0x7e, 0x88, 0x3d,
- 0xe0, 0x8d, 0x19, 0x3f, 0x20, 0x7e, 0x08, 0x40, 0x30, 0xbd, 0x4c, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0xc0, 0xdc, 0xee, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0xbd, 0xcc, 0x3e, 0xf0, 0x8d, 0x19, 0xbf, 0xe0, 0x8d, 0x19, 0x3f,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0xb0, 0x9d, 0xaa, 0xbf,
- 0xf8, 0xcc, 0xdd, 0xbf, 0xe0, 0x8d, 0x19, 0x3f, 0x50, 0x35, 0xc4, 0xbf,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x70, 0xad, 0x3b, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0xbd, 0xcc, 0x3e,
- 0xf0, 0xcc, 0x5d, 0x3f, 0xc8, 0x15, 0x22, 0xc0, 0x80, 0x7e, 0x88, 0xbd,
- 0xc0, 0xdc, 0xee, 0xbf, 0xa8, 0x9d, 0xaa, 0x3f, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x30, 0xbd, 0x4c, 0x3f, 0xe8, 0x8d, 0x99, 0xbf, 0x70, 0xad, 0x3b, 0x3f,
- 0x20, 0x7e, 0x08, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x54, 0xe6, 0xbf,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0xbd, 0xcc, 0x3e, 0x80, 0xec, 0xff, 0x3f,
- 0xf0, 0xcc, 0x5d, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x08, 0xbf,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0xbd, 0xcc, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0xdc, 0xee, 0x3e, 0x30, 0xbd, 0x4c, 0xbf,
- 0xc0, 0xdc, 0xee, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x88, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe,
- 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x30, 0xbd, 0x4c, 0xbf, 0xc8, 0x15, 0xa2, 0xbf, 0x80, 0x7e, 0x88, 0xbd,
- 0xd8, 0x54, 0xe6, 0xbf, 0x20, 0x7e, 0x88, 0x3e, 0x20, 0xbd, 0xcc, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x06, 0x91, 0x3f, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x20, 0xbd, 0xcc, 0x3e, 0x20, 0x7e, 0x08, 0x3f, 0xac, 0x9d, 0x2a, 0xc0,
- 0x80, 0x7e, 0x88, 0xbd, 0x08, 0x06, 0x91, 0xbf, 0x00, 0x06, 0x91, 0x3f,
- 0xf0, 0xcc, 0x5d, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xf0, 0xcc, 0x5d, 0x3f, 0xe8, 0x8d, 0x99, 0xbf,
- 0xe0, 0x8d, 0x19, 0x3f, 0x40, 0xbd, 0xcc, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0xc0, 0xdc, 0xee, 0xbf, 0x00, 0x7e, 0x88, 0x3d, 0x70, 0xad, 0x3b, 0x3f,
- 0x20, 0x7e, 0x08, 0x40, 0x20, 0x7e, 0x88, 0x3f, 0x40, 0x7e, 0x08, 0xbe,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0xa0, 0x9d, 0x2a, 0x3f,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x20, 0xbd, 0xcc, 0x3e,
- 0x70, 0xad, 0x3b, 0xbf, 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0xbd, 0xcc, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0xdc, 0xee, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x08, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x9d, 0xaa, 0x3e, 0xa0, 0x64, 0xf7, 0xbf, 0x20, 0x7e, 0x88, 0x3e,
- 0xe0, 0x8d, 0x19, 0x3f, 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x88, 0x3f,
- 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x30, 0xbd, 0x4c, 0xbf, 0x40, 0xbd, 0x4c, 0x3e, 0x70, 0xad, 0x3b, 0x3f,
- 0x24, 0x01, 0x51, 0xc0, 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x64, 0xf7, 0xbf,
- 0x40, 0x7e, 0x08, 0xbe, 0x30, 0xbd, 0xcc, 0x3f, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0x3f,
- 0xc8, 0x15, 0xa2, 0xbf, 0xe0, 0x8d, 0x19, 0x3f, 0x40, 0xbd, 0xcc, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0xdc, 0xee, 0xbf, 0x40, 0x7e, 0x08, 0xbe,
- 0x20, 0x7e, 0x08, 0x3f, 0x98, 0x64, 0xf7, 0x3f, 0x80, 0xec, 0x7f, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0xf0, 0xcc, 0x5d, 0x3f, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xf0, 0x8d, 0x19, 0xbf, 0x20, 0x7e, 0x88, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0x3e, 0x20, 0x7e, 0x88, 0x3e,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0xcc, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdc, 0xee, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0xb0, 0x9d, 0x2a, 0xbf, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0xcc, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x08, 0xbf, 0x00, 0x7e, 0x88, 0x3d,
- 0xb0, 0x9d, 0x2a, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x08, 0xbf,
- 0xa0, 0x9d, 0x2a, 0x3f, 0xb0, 0xdc, 0x6e, 0x3f, 0xf8, 0xcc, 0xdd, 0xbf,
- 0xc0, 0xdc, 0xee, 0x3e, 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x20, 0xbd, 0xcc, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0xa0, 0x9d, 0xaa, 0x3e, 0x20, 0xbd, 0xcc, 0x3e,
- 0x80, 0xec, 0x7f, 0x3f, 0x70, 0xad, 0x3b, 0xc0, 0x40, 0x7e, 0x08, 0xbe,
- 0x90, 0x25, 0xb3, 0xbf, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x06, 0x91, 0x3f, 0x70, 0xad, 0xbb, 0xbf, 0xc8, 0x15, 0xa2, 0x3f,
- 0xc0, 0xdc, 0xee, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x80, 0xec, 0xff, 0xbf,
- 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x9d, 0x2a, 0x3f, 0x30, 0x3a, 0x04, 0x40,
- 0xc0, 0xdc, 0xee, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe, 0xb0, 0x9d, 0x2a, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0xcc, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0xcc, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x08, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0xbd, 0xcc, 0x3e, 0x20, 0x7e, 0x88, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0xcc, 0xbe,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0xdc, 0xee, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xf0, 0x8d, 0x19, 0xbf, 0x80, 0x7e, 0x88, 0xbd,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x70, 0xad, 0x3b, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x50, 0x35, 0xc4, 0xbf, 0x20, 0x7e, 0x88, 0x3e, 0x20, 0x7e, 0x88, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e, 0x20, 0x7e, 0x88, 0x3e,
- 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x20, 0xbd, 0xcc, 0x3e,
- 0x30, 0xbd, 0x4c, 0x3f, 0xf0, 0xcc, 0x5d, 0x3f, 0x14, 0xc2, 0x0c, 0xc0,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe, 0xf0, 0xcc, 0x5d, 0x3f,
- 0x20, 0x7e, 0x88, 0x3f, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0xcc, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xe8, 0x8d, 0x99, 0x3f, 0x50, 0x35, 0xc4, 0xbf,
- 0xe8, 0x8d, 0x99, 0x3f, 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0xec, 0xff, 0xbf, 0x00, 0x7e, 0x88, 0x3d, 0xf0, 0xcc, 0x5d, 0x3f,
- 0x30, 0x3a, 0x04, 0x40, 0x20, 0x7e, 0x08, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x91, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0xf0, 0x8d, 0x19, 0xbf, 0x20, 0x7e, 0x88, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x08, 0x3f, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0xec, 0x7f, 0xbf, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0xcc, 0xbe, 0x20, 0x7e, 0x88, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdc, 0xee, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x30, 0xbd, 0x4c, 0xbf, 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0xcc, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0xdc, 0xee, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0xcc, 0xbe, 0xa0, 0x64, 0xf7, 0xbf,
- 0xa0, 0x9d, 0x2a, 0x3f, 0xa0, 0x64, 0xf7, 0xbf, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x70, 0xad, 0x3b, 0x3f,
- 0xf0, 0xcc, 0x5d, 0x3f, 0x00, 0xcd, 0x5d, 0xbf, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x70, 0xad, 0xbb, 0x3f, 0xc8, 0x15, 0xa2, 0x3f,
- 0xd8, 0x54, 0xe6, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0xdc, 0xee, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0xb0, 0x9d, 0x2a, 0xbf, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe,
- 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x70, 0xad, 0xbb, 0x3f,
- 0xc0, 0xdc, 0xee, 0xbf, 0xc8, 0x15, 0xa2, 0x3f, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdc, 0xee, 0xbf, 0x00, 0x7e, 0x88, 0x3d,
- 0x30, 0xbd, 0x4c, 0x3f, 0x80, 0xec, 0xff, 0x3f, 0x20, 0xbd, 0xcc, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0x3e,
- 0x70, 0xad, 0xbb, 0x3f, 0xc0, 0xdc, 0xee, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0x4c, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe, 0xf0, 0xcc, 0x5d, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x30, 0xbd, 0x4c, 0x3f, 0x28, 0x7e, 0x88, 0xbf,
- 0xf0, 0xcc, 0x5d, 0x3f, 0xc0, 0xdc, 0xee, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0xf8, 0xcc, 0xdd, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0xdc, 0xee, 0x3e,
- 0x30, 0x3a, 0x04, 0x40, 0x70, 0xad, 0x3b, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x20, 0xbd, 0xcc, 0x3e,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdc, 0xee, 0x3e,
- 0xb0, 0x9d, 0x2a, 0xbf, 0xa0, 0x9d, 0xaa, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x08, 0x3e, 0x70, 0xad, 0xbb, 0xbf, 0xe0, 0x8d, 0x19, 0x3f,
- 0xc0, 0xdc, 0xee, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x08, 0x3f, 0x70, 0xad, 0x3b, 0x3f,
- 0xc0, 0xdc, 0xee, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0xec, 0x7f, 0x3f,
- 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0xcd, 0x5d, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0x70, 0xad, 0x3b, 0xbf, 0x40, 0xbd, 0x4c, 0xbe,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0xcd, 0x5d, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0xc8, 0x15, 0xa2, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0xdc, 0xee, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e,
- 0xc0, 0xdc, 0x6e, 0xbf, 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x38, 0xbd, 0xcc, 0xbf, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x88, 0x25, 0xb3, 0x3f, 0xa0, 0x9d, 0x2a, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0x4c, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0xbd, 0xcc, 0x3e,
- 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x08, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x20, 0x7e, 0x88, 0x3e, 0x20, 0x7e, 0x08, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0xdc, 0xee, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdc, 0xee, 0xbe,
- 0x20, 0x7e, 0x88, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe,
- 0xc0, 0xdc, 0xee, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e,
- 0x20, 0x7e, 0x88, 0xbe, 0x70, 0xad, 0x3b, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0x3e, 0x40, 0xbd, 0xcc, 0xbe, 0xa0, 0x9d, 0x2a, 0x3f,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0x3e, 0x20, 0x7e, 0x88, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x20, 0x7e, 0x08, 0xbf, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x08, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0xf0, 0xcc, 0x5d, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x20, 0x7e, 0x08, 0x3f, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0xf0, 0x8d, 0x19, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0xdc, 0xee, 0x3e, 0x80, 0xec, 0xff, 0xbf, 0x20, 0xbd, 0xcc, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x08, 0x3f, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0xec, 0xff, 0x3f, 0x30, 0xbd, 0x4c, 0x3f,
- 0x20, 0xbd, 0xcc, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xf0, 0x8d, 0x19, 0xbf, 0x90, 0x25, 0xb3, 0xbf,
- 0x00, 0x7e, 0x08, 0x3e, 0x80, 0xec, 0xff, 0xbf, 0xc0, 0xdc, 0x6e, 0xbf,
- 0x80, 0xec, 0xff, 0x3f, 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xf8, 0xcc, 0xdd, 0xbf, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x70, 0xad, 0xbb, 0x3f, 0xe0, 0x8d, 0x19, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0xbd, 0xcc, 0x3e,
- 0xc0, 0xdc, 0xee, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0xcc, 0xbe, 0x20, 0xbd, 0xcc, 0x3e, 0x20, 0x7e, 0x88, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe,
- 0xa0, 0x9d, 0x2a, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0x3e, 0x20, 0x7e, 0x88, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x20, 0xbd, 0xcc, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x88, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x08, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe, 0x20, 0x7e, 0x08, 0x3f,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x20, 0x7e, 0x88, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0x3e, 0x40, 0xbd, 0xcc, 0xbe,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x20, 0x7e, 0x08, 0x3f, 0x20, 0xbd, 0xcc, 0x3e,
- 0xf0, 0xcc, 0x5d, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x20, 0x7e, 0x08, 0x3f, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x08, 0x3f, 0x80, 0x7e, 0x88, 0xbd, 0xfe, 0x27, 0x93, 0xc0,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e, 0xf0, 0x8d, 0x19, 0xbf,
- 0xb0, 0x9d, 0x2a, 0xbf, 0xc0, 0xdc, 0x6e, 0xbf, 0x00, 0x7e, 0x88, 0x3d,
- 0xc0, 0xdc, 0xee, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0xf8, 0xcc, 0xdd, 0xbf, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0xc8, 0x15, 0xa2, 0x3f, 0xc0, 0xdc, 0xee, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0x3e, 0x20, 0x7e, 0x08, 0xbf, 0x20, 0x7e, 0x88, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0x9d, 0xaa, 0xbe, 0x20, 0x7e, 0x88, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x20, 0xbd, 0xcc, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0xbe, 0xc0, 0xdc, 0xee, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdc, 0xee, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0xcc, 0xbe,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0xdc, 0xee, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0xdc, 0xee, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0x3e, 0xa0, 0x9d, 0x2a, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0xb0, 0x9d, 0xaa, 0xbf, 0x20, 0x7e, 0x88, 0x3e, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0xf6, 0x49, 0x95, 0xc0, 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x88, 0x3f, 0xc0, 0xdc, 0xee, 0xbe, 0xb0, 0x9d, 0x2a, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0xf8, 0xcc, 0xdd, 0xbf,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0xa8, 0x9d, 0xaa, 0x3f,
- 0xa0, 0x9d, 0x2a, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0xdc, 0xee, 0xbe,
- 0xa0, 0x9d, 0x2a, 0x3f, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0xbd, 0xcc, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x08, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0xcc, 0xbe, 0x20, 0x7e, 0x08, 0x3f,
- 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0xdc, 0xee, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0xcc, 0xbe, 0xa0, 0x9d, 0x2a, 0x3f,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0xc0, 0xdc, 0xee, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0xc0, 0x9d, 0xaa, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x08, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0xa0, 0x9d, 0x2a, 0x3f, 0x00, 0x7e, 0x08, 0x3e,
- 0x30, 0xbd, 0x4c, 0xbf, 0xa0, 0x9d, 0xaa, 0x3e, 0xb0, 0xdc, 0x6e, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0xf0, 0x8d, 0x19, 0xbf, 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0xdc, 0xee, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0xdc, 0xee, 0xbf, 0xe0, 0x8d, 0x19, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0xbd, 0xcc, 0x3e, 0xc0, 0xdc, 0x6e, 0xbf,
- 0xc0, 0xdc, 0xee, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0xcc, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0xcc, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x38, 0xbd, 0xcc, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0xa8, 0x9d, 0xaa, 0x3f, 0xc0, 0xdc, 0xee, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0x3e,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0xcc, 0xbe, 0xa0, 0x9d, 0x2a, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x9d, 0x2a, 0x3f,
- 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0x9d, 0xaa, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x08, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x08, 0x3f,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe,
- 0xe0, 0x8d, 0x19, 0x3f, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x08, 0x3f,
- 0x40, 0xbd, 0x4c, 0xbe, 0x70, 0xad, 0x3b, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x08, 0x3f, 0x00, 0x7e, 0x88, 0x3d,
- 0xc0, 0x9d, 0xaa, 0xbe, 0xe0, 0x8d, 0x19, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9d, 0xaa, 0x3e,
- 0xb0, 0x9d, 0x2a, 0xbf, 0x38, 0xbd, 0xcc, 0xbf, 0xa0, 0x9d, 0xaa, 0x3e,
- 0xe8, 0x8d, 0x99, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0xbe,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x80, 0xec, 0x7f, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe, 0xd8, 0xd1, 0x1d, 0xc0,
- 0xc0, 0xdc, 0x6e, 0xbf, 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0xf8, 0xcc, 0xdd, 0xbf, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x08, 0x3e, 0xa8, 0x9d, 0xaa, 0x3f, 0x20, 0x7e, 0x08, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0xa0, 0x9d, 0xaa, 0x3e, 0xc0, 0xdc, 0xee, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0x3e, 0xc0, 0xdc, 0xee, 0x3e,
- 0xa0, 0x9d, 0xaa, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x08, 0x3f, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x08, 0x3f, 0x40, 0xbd, 0x4c, 0x3e,
- 0x20, 0xbd, 0xcc, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdc, 0xee, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0xdc, 0xee, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x08, 0x06, 0x91, 0xbf, 0x20, 0x7e, 0x88, 0xbe, 0xe8, 0x8d, 0x99, 0xbf,
- 0xa0, 0x9d, 0xaa, 0x3e, 0xb0, 0xdc, 0x6e, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0xb0, 0xdc, 0x6e, 0x3f, 0x30, 0xbd, 0x4c, 0xbf, 0x20, 0xbd, 0xcc, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0xec, 0x7f, 0x3f, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0xac, 0x9d, 0x2a, 0xc0, 0xc0, 0xdc, 0x6e, 0xbf, 0xf4, 0xcc, 0x5d, 0x40,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0xc0, 0xdc, 0xee, 0x3e, 0xc0, 0xdc, 0xee, 0xbe, 0x20, 0xbd, 0xcc, 0x3e,
- 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x64, 0xf7, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0xa0, 0x9d, 0xaa, 0x3e, 0xa8, 0x9d, 0xaa, 0x3f,
- 0xa0, 0x9d, 0x2a, 0x3f, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9d, 0xaa, 0x3e, 0x20, 0x7e, 0x08, 0xbf,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0xbd, 0xcc, 0x3e, 0xf0, 0x8d, 0x19, 0xbf,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9d, 0xaa, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x20, 0x7e, 0x88, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0xbd, 0xcc, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x88, 0x3e, 0x20, 0x7e, 0x88, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x88, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x08, 0xbf, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x80, 0xec, 0x7f, 0xbf, 0x20, 0xbd, 0xcc, 0x3e, 0x30, 0xbd, 0x4c, 0x3f,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x70, 0xad, 0x3b, 0x3f,
- 0x00, 0x7e, 0x88, 0x3d, 0xe0, 0x8d, 0x19, 0x3f, 0x40, 0xbd, 0x4c, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0xec, 0xff, 0xbf, 0xc8, 0x15, 0xa2, 0xbf,
- 0xc8, 0x15, 0xa2, 0x3f, 0x40, 0x7e, 0x08, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0xdc, 0xee, 0x3e, 0x28, 0x7e, 0x88, 0xbf,
- 0xa0, 0x9d, 0xaa, 0x3e, 0xf0, 0x8d, 0x19, 0xbf, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0xec, 0xff, 0xbf, 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x08, 0x3f,
- 0x30, 0xbd, 0xcc, 0x3f, 0x70, 0xad, 0x3b, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0xe0, 0x8d, 0x19, 0x3f,
- 0x00, 0xcd, 0x5d, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0xbd, 0xcc, 0x3e,
- 0xb0, 0x9d, 0x2a, 0xbf, 0x70, 0xad, 0x3b, 0x3f, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0xdc, 0xee, 0x3e,
- 0x20, 0x7e, 0x08, 0x3f, 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x08, 0x3f,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0x3e, 0x20, 0xbd, 0xcc, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0xcc, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x70, 0xad, 0x3b, 0x3f, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0xcd, 0x5d, 0xbf, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x20, 0x7e, 0x08, 0x3f, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0xbe,
- 0xf0, 0xcc, 0x5d, 0x3f, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x30, 0xbd, 0x4c, 0x3f,
- 0xc0, 0xdc, 0x6e, 0xbf, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x08, 0xbf,
- 0xc8, 0x15, 0xa2, 0xbf, 0x20, 0x7e, 0x08, 0xbf, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x88, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdc, 0xee, 0x3e,
- 0x50, 0x35, 0xc4, 0xbf, 0xa0, 0x9d, 0x2a, 0x3f, 0x40, 0xbd, 0xcc, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xf8, 0x49, 0x15, 0xc0, 0x80, 0x7e, 0x88, 0xbd,
- 0xa0, 0x9d, 0x2a, 0x3f, 0x70, 0xad, 0xbb, 0x3f, 0xf0, 0xcc, 0x5d, 0x3f,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0xb0, 0xdc, 0x6e, 0x3f, 0x70, 0xad, 0x3b, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0x3e, 0xb0, 0x9d, 0x2a, 0xbf, 0x00, 0x06, 0x91, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x08, 0x3f,
- 0x00, 0x7e, 0x88, 0x3d, 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0xbd, 0xcc, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e,
- 0x20, 0x7e, 0x88, 0x3e, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0xe0, 0x8d, 0x19, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x8d, 0x19, 0x3f,
- 0x20, 0x7e, 0x88, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe,
- 0xb0, 0x9d, 0x2a, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x08, 0x06, 0x91, 0xbf,
- 0xa0, 0x9d, 0xaa, 0x3e, 0xf0, 0xcc, 0x5d, 0x3f, 0x00, 0x7e, 0x88, 0x3d,
- 0x70, 0xad, 0x3b, 0x3f, 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0xe8, 0x8d, 0x19, 0xc0, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x40, 0xbd, 0x4c, 0x3e, 0xf8, 0xcc, 0xdd, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0xb0, 0x9d, 0x2a, 0xbf, 0x70, 0xad, 0xbb, 0xbf, 0xf0, 0x8d, 0x19, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0x3e, 0x08, 0x06, 0x91, 0xbf, 0x20, 0xbd, 0xcc, 0x3e,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x24, 0x7e, 0x08, 0xc0,
- 0x40, 0x7e, 0x08, 0xbe, 0x30, 0xbd, 0x4c, 0x3f, 0xc8, 0x15, 0xa2, 0x3f,
- 0xf0, 0xcc, 0x5d, 0x3f, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0xec, 0x7f, 0x3f, 0xf0, 0x8d, 0x19, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0x3e, 0x20, 0x7e, 0x08, 0xbf,
- 0xb0, 0xdc, 0x6e, 0x3f, 0x00, 0x7e, 0x88, 0x3d, 0x20, 0x7e, 0x08, 0xbf,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0xcc, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0xa0, 0x9d, 0xaa, 0x3e, 0x20, 0x7e, 0x88, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0xe0, 0x8d, 0x19, 0x3f, 0x00, 0x7e, 0x08, 0x3e, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0xc0, 0xdc, 0xee, 0xbe, 0x20, 0xbd, 0xcc, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x88, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x70, 0xad, 0x3b, 0x3f,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x08, 0xbf, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0xc8, 0x15, 0xa2, 0xbf, 0x20, 0xbd, 0xcc, 0x3e, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0xa0, 0x9d, 0xaa, 0x3e, 0x80, 0xec, 0x7f, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d, 0x90, 0x25, 0xb3, 0xbf,
- 0x00, 0x7e, 0x08, 0x3e, 0x40, 0xbd, 0x4c, 0xbe, 0x28, 0x7e, 0x88, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0xa0, 0x64, 0xf7, 0xbf, 0xb0, 0x9d, 0x2a, 0xbf,
- 0x20, 0x7e, 0x08, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x08, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xf0, 0x8d, 0x19, 0xbf, 0xb0, 0x9d, 0xaa, 0xbf,
- 0xa0, 0x9d, 0x2a, 0x3f, 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xf8, 0x49, 0x15, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9d, 0x2a, 0x3f,
- 0x88, 0x25, 0xb3, 0x3f, 0x20, 0x7e, 0x08, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0xcc, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0xec, 0x7f, 0x3f,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x30, 0xbd, 0x4c, 0x3f,
- 0x40, 0xbd, 0xcc, 0xbe, 0xa0, 0x9d, 0xaa, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0xbd, 0xcc, 0xbe, 0x20, 0x7e, 0x08, 0x3f, 0x20, 0x7e, 0x88, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0xdc, 0xee, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd, 0xa0, 0x9d, 0x2a, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdc, 0xee, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x20, 0x7e, 0x88, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x20, 0x7e, 0x08, 0x3f, 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0xcc, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0xbe, 0xe0, 0x8d, 0x19, 0x3f, 0x80, 0x7e, 0x88, 0xbd,
- 0xc0, 0xdc, 0xee, 0xbe, 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0xdc, 0xee, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0xa0, 0x9d, 0xaa, 0x3e, 0xa0, 0x64, 0xf7, 0xbf, 0xa0, 0x9d, 0xaa, 0x3e,
- 0xf8, 0xcc, 0xdd, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x20, 0xbd, 0xcc, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x08, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x70, 0xad, 0xbb, 0xbf, 0x00, 0x7e, 0x08, 0x3e, 0x04, 0x06, 0x11, 0x40,
- 0xc0, 0xdc, 0xee, 0xbf, 0x40, 0xbd, 0x4c, 0xbe, 0xf0, 0x8d, 0x19, 0xbf,
- 0x20, 0x7e, 0x88, 0xbe, 0x8c, 0x25, 0x33, 0x40, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x88, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x20, 0x7e, 0x88, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0xcc, 0xbe,
- 0xe8, 0x8d, 0x99, 0xbf, 0x70, 0xad, 0x3b, 0x3f, 0x20, 0x7e, 0x08, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0xec, 0xff, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x30, 0xbd, 0x4c, 0x3f, 0x50, 0x35, 0xc4, 0x3f, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdc, 0xee, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0xe8, 0x8d, 0x99, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0xbe, 0x70, 0xad, 0x3b, 0x3f,
- 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0xbd, 0x4c, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0xc0, 0xdc, 0xee, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x28, 0x7e, 0x88, 0xbf, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x88, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7e, 0x88, 0xbe,
- 0xa0, 0x9d, 0x2a, 0x3f, 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0x9d, 0xaa, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x88, 0xbe, 0x20, 0x7e, 0x88, 0x3e, 0x00, 0x7e, 0x08, 0x3e,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe, 0x20, 0x7e, 0x88, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0xf0, 0x8d, 0x19, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xcd, 0x5d, 0xbf, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0x7e, 0x08, 0xbe, 0xe0, 0x8d, 0x19, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdc, 0xee, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x8d, 0x19, 0xbf,
- 0xb0, 0x9d, 0xaa, 0xbf, 0xe0, 0x8d, 0x19, 0x3f, 0x70, 0xad, 0xbb, 0xbf,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x20, 0x7e, 0x08, 0xbf, 0x00, 0x7e, 0x88, 0x3d,
- 0xc0, 0x9d, 0xaa, 0xbe, 0xf8, 0xcc, 0xdd, 0x3f, 0x40, 0xbd, 0x4c, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x80, 0x69, 0x37, 0xc0, 0x80, 0x7e, 0x88, 0xbd,
- 0xd8, 0x54, 0xe6, 0x3f, 0x24, 0x7e, 0x08, 0xc0, 0x00, 0x7e, 0x88, 0x3d,
- 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbd, 0xcc, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xf0, 0x8d, 0x19, 0xbf, 0x00, 0x7e, 0x88, 0x3d,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x00, 0x7e, 0x08, 0x3e, 0x20, 0x7e, 0x88, 0xbe, 0x40, 0xbd, 0x4c, 0xbe,
- 0x20, 0x7e, 0x88, 0xbe, 0x50, 0x35, 0xc4, 0xbf, 0x70, 0xad, 0x3b, 0x3f,
- 0xf0, 0x8d, 0x19, 0xbf, 0x80, 0x7e, 0x88, 0xbd, 0x34, 0x3a, 0x04, 0xc0,
- 0x00, 0x7e, 0x88, 0x3d, 0x70, 0xad, 0x3b, 0x3f, 0x30, 0xbd, 0xcc, 0x3f,
- 0x40, 0xbd, 0xcc, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0xcc, 0xbe,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x06, 0x91, 0x3f, 0x40, 0xbd, 0x4c, 0x3e,
- 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0xbe, 0xc0, 0x9d, 0xaa, 0xbe,
- 0xb0, 0xdc, 0x6e, 0x3f, 0x80, 0x7e, 0x88, 0xbd, 0x80, 0x7e, 0x88, 0xbd,
- 0xf0, 0x8d, 0x19, 0xbf, 0xa0, 0x9d, 0xaa, 0x3e, 0x40, 0xbd, 0xcc, 0xbe,
- 0x40, 0xbd, 0x4c, 0xbe, 0x80, 0xec, 0xff, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x70, 0xad, 0xbb, 0x3f, 0xe0, 0x8d, 0x19, 0x3f,
- 0x00, 0x7e, 0x88, 0x3d, 0x40, 0xbd, 0x4c, 0x3e, 0x80, 0x7e, 0x88, 0xbd,
- 0x20, 0x7e, 0x88, 0x3e, 0x20, 0x7e, 0x88, 0xbe, 0x80, 0x7e, 0x88, 0xbd,
- 0xa0, 0x9d, 0xaa, 0x3e, 0x20, 0x7e, 0x08, 0xbf, 0x80, 0x7e, 0x88, 0xbd,
- 0x40, 0x7e, 0x08, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x70, 0xad, 0x3b, 0xbf,
- 0x80, 0x7e, 0x88, 0xbd, 0xb0, 0x9d, 0x2a, 0xbf, 0xa0, 0x9d, 0xaa, 0x3e,
- 0x20, 0xbd, 0xcc, 0x3e, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0xbd, 0xcc, 0x3e,
- 0x30, 0xbd, 0x4c, 0x3f, 0x30, 0xbd, 0x4c, 0x3f, 0x00, 0x7e, 0x88, 0x3d,
- 0x20, 0x7e, 0x88, 0xbe, 0x80, 0x7e, 0x88, 0xbd, 0x20, 0x7e, 0x88, 0x3e,
- 0xc0, 0x9d, 0xaa, 0xbe, 0x40, 0x7e, 0x08, 0xbe, 0x08, 0x06, 0x91, 0xbf,
- 0x80, 0xec, 0x7f, 0xbf, 0x00, 0x7e, 0x08, 0x3e, 0x00, 0x7e, 0x88, 0x3d,
- 0x80, 0x7e, 0x88, 0xbd, 0x40, 0xbd, 0x4c, 0xbe, 0xd8, 0x54, 0xe6, 0xbf,
- 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0x7e, 0x08, 0xbe,
- 0x80, 0x7e, 0x88, 0xbd, 0xc0, 0xdc, 0x6e, 0xbf, 0x20, 0x7e, 0x88, 0xbe,
- 0xc0, 0xdc, 0xee, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x70, 0xad, 0x3b, 0xbf,
- 0x40, 0x7e, 0x08, 0xbe, 0xb0, 0x9d, 0x2a, 0xbf, 0x00, 0x7e, 0x08, 0x3e,
- 0x40, 0x7e, 0x08, 0xbe, 0x40, 0xbd, 0x4c, 0x3e, 0x40, 0xbd, 0x4c, 0x3e,
- 0x20, 0x7e, 0x88, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x38, 0x83, 0xba, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x50, 0xa9, 0x70, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+ 0xc0, 0x7a, 0xae, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0x98, 0x58, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0xc0, 0x7a, 0xae, 0xbf, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f,
+ 0xd8, 0xa0, 0x64, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x9c, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+ 0x60, 0x98, 0x58, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x48, 0x72, 0xa2, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+ 0x70, 0x87, 0x40, 0xbf, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x70, 0x87, 0x40, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xd8, 0xa0, 0x64, 0xbf,
+ 0x60, 0x98, 0xd8, 0xbe, 0x86, 0x76, 0x28, 0xc0, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x21, 0x5d, 0x84, 0xc0, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0x28, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x98, 0x65, 0x90, 0x3f,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+ 0x00, 0x7f, 0x34, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x61, 0x8a, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x18, 0xa5, 0xea, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x70, 0x87, 0x40, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x50, 0x72, 0xa2, 0x3f,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0xd8, 0x69, 0x96, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x60, 0x98, 0x58, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x60, 0x61, 0x8a, 0x3f,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x76, 0x28, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0xec, 0x8f, 0xcc, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0x58, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+ 0x10, 0x6e, 0x9c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0xd8, 0x69, 0x96, 0x3f, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+ 0x38, 0x83, 0xba, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x50, 0xa9, 0x70, 0x3f,
+ 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+ 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x98, 0x65, 0x90, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0x40, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x9c, 0x3f,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xf0, 0x8f, 0xcc, 0x3f,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x50, 0xa9, 0x70, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xb0, 0x8b, 0xc6, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0x3f,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0xa0, 0x65, 0x10, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x76, 0x28, 0xbf, 0x00, 0x7f, 0x34, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
+ 0x90, 0x65, 0x10, 0xbf, 0x7a, 0x63, 0x0d, 0xc0, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x98, 0xd8, 0xbe, 0x12, 0xdc, 0x82, 0xc0, 0xe0, 0xa0, 0x64, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x7f, 0xb4, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x18, 0xa5, 0xea, 0x3f,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xc8, 0x7a, 0xae, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0xd8, 0x69, 0x96, 0x3f, 0x48, 0x72, 0xa2, 0xbf,
+ 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x9c, 0xde, 0xbf, 0xd8, 0xa0, 0x64, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x90, 0x65, 0x10, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+ 0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x76, 0x28, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0xad, 0xf6, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0xe0, 0xa0, 0x64, 0x3f,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x28, 0x94, 0xd2, 0xbf, 0x90, 0x65, 0x10, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
+ 0xc0, 0x7a, 0xae, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+ 0x98, 0x65, 0x90, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0x84, 0x76, 0xa8, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x84, 0x3f,
+ 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x90, 0x76, 0x28, 0x3f, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xd8, 0x69, 0x96, 0x3f,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x90, 0x76, 0x28, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x28, 0x94, 0xd2, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x70, 0x87, 0x40, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x38, 0x83, 0xba, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf,
+ 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x10, 0x3f,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x60, 0x61, 0x8a, 0x3f, 0x28, 0x94, 0xd2, 0xbf,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x28, 0x94, 0x52, 0xc0, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x94, 0x89, 0xc3, 0xc0, 0xa0, 0x65, 0x10, 0x3f,
+ 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x90, 0x76, 0x28, 0x3f, 0x84, 0x76, 0xa8, 0xbf,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x60, 0x61, 0x8a, 0x3f, 0x20, 0x5d, 0x04, 0xbf, 0xd0, 0xb1, 0xfc, 0x3f,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x46, 0x96, 0x55, 0xc0, 0x00, 0x7f, 0xb4, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x78, 0x87, 0xc0, 0x3f, 0x70, 0x87, 0x40, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x64, 0x98, 0xd8, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+ 0x10, 0x6e, 0x9c, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x20, 0x5d, 0x84, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0xc0, 0x7a, 0xae, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0xd8, 0x69, 0x96, 0x3f,
+ 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0x58, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0xc8, 0x7a, 0xae, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0xc8, 0xb1, 0x7c, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x10, 0x6e, 0x9c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0xcc, 0x3f,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x50, 0xa9, 0x70, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0xd0, 0xb1, 0x7c, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x28, 0x94, 0xd2, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+ 0x38, 0x83, 0xba, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x60, 0x61, 0x8a, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x98, 0x65, 0x90, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x98, 0x65, 0x90, 0x3f,
+ 0x00, 0x7f, 0x34, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x70, 0x87, 0x40, 0xbf,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xd8, 0xa0, 0x64, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0xe0, 0xa0, 0x64, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x88, 0x76, 0xa8, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x28, 0x94, 0xd2, 0x3f,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x7f, 0x34, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x7a, 0xae, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xec, 0x8f, 0xcc, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0xc0, 0x7a, 0xae, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x61, 0x8a, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x84, 0x76, 0xa8, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0xd0, 0xb1, 0x7c, 0x3f,
+ 0x80, 0x76, 0x28, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x98, 0x65, 0x90, 0x3f,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x50, 0xa9, 0x70, 0x3f,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x68, 0x98, 0xd8, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x50, 0xa9, 0x70, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x48, 0x72, 0xa2, 0xbf,
+ 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3f,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x18, 0xa5, 0x6a, 0xc0, 0xc0, 0x65, 0x10, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x3a, 0x83, 0xba, 0xc0, 0x40, 0xa9, 0x70, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0x58, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x50, 0x72, 0xa2, 0x3f,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x98, 0x65, 0x90, 0xbf, 0x60, 0x61, 0x8a, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x9c, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0xb0, 0x8b, 0xc6, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x70, 0x87, 0x40, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3f,
+ 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
+ 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x76, 0x28, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x90, 0x76, 0x28, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x84, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+ 0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x90, 0x76, 0x28, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0x50, 0xa9, 0x70, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x7f, 0x34, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x9c, 0xde, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x74, 0x87, 0xc0, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x48, 0x72, 0xa2, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x65, 0x10, 0xbf,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0x98, 0x58, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x98, 0x65, 0x90, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x98, 0x65, 0x90, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x70, 0x87, 0x40, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x76, 0x28, 0x3f,
+ 0x50, 0xa9, 0x70, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0x28, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0x28, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0x60, 0x98, 0xd8, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x98, 0xd8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x50, 0x72, 0xa2, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x76, 0x28, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x28, 0x94, 0xd2, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x7f, 0x34, 0x3f,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f, 0x70, 0x87, 0x40, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
+ 0x60, 0x98, 0x58, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x7f, 0x34, 0x3f,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xb1, 0x7c, 0x3f,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0x28, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x74, 0x87, 0xc0, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x84, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
+ 0x90, 0x76, 0x28, 0x3f, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0x58, 0x3f,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0xe0, 0xa0, 0x64, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0xd0, 0xb1, 0x7c, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x50, 0xa9, 0x70, 0x3f,
+ 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0xc8, 0xb1, 0x7c, 0xbf, 0x50, 0xa9, 0xf0, 0xbf, 0x00, 0x7f, 0x34, 0xbf,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x10, 0x3f,
+ 0x60, 0x98, 0x58, 0xbf, 0x20, 0x5d, 0x84, 0xbf, 0x20, 0x5d, 0x84, 0x3f,
+ 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x98, 0x65, 0x90, 0xbf,
+ 0x60, 0x98, 0xd8, 0x3e, 0xbe, 0x9e, 0x61, 0xc0, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x0b, 0x92, 0xcf, 0xc0, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x72, 0x22, 0xc0,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x10, 0x6e, 0x9c, 0xbf,
+ 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x76, 0x28, 0x3f,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xb4, 0x3f, 0x60, 0x98, 0x58, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0xb6, 0x67, 0x13, 0xc0, 0x80, 0x87, 0x40, 0x3f,
+ 0xc8, 0xb1, 0x7c, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0x28, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x60, 0x98, 0x58, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xd8, 0xa0, 0x64, 0xbf,
+ 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x86, 0x76, 0x28, 0xc0,
+ 0x80, 0x65, 0x10, 0xbe, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x9c, 0xde, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0xd4, 0x69, 0x96, 0xbf,
+ 0x90, 0x76, 0x28, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x50, 0xa9, 0x70, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x20, 0x5d, 0x04, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x98, 0x65, 0x90, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x74, 0x87, 0xc0, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x9c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0x58, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x70, 0x87, 0x40, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f,
+ 0x50, 0xa9, 0x70, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
+ 0x60, 0x98, 0x58, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xc8, 0x7a, 0xae, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0xd8, 0xa0, 0x64, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x5c, 0x61, 0x8a, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x76, 0x28, 0x3f,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0x3f,
+ 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x90, 0x76, 0x28, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x90, 0x76, 0x28, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x70, 0x87, 0x40, 0xbf, 0x38, 0x83, 0xba, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0x20, 0x5d, 0x04, 0x3f, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x88, 0x76, 0xa8, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xd8, 0x69, 0x96, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x03, 0x5b, 0x81, 0xc0, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x0c, 0xc8, 0xc0, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x8c, 0xad, 0xf6, 0xbf,
+ 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0x7a, 0xae, 0x3f, 0x80, 0x87, 0x40, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x98, 0x65, 0x10, 0xc0, 0x80, 0x76, 0xa8, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x88, 0x76, 0xa8, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
+ 0xfa, 0xa2, 0x67, 0xc0, 0xc0, 0x65, 0x10, 0x3e, 0x98, 0x65, 0x10, 0xc0,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0xd4, 0x69, 0x96, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x86, 0x76, 0x28, 0xc0,
+ 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x60, 0x98, 0x58, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0xd8, 0x69, 0x96, 0x3f,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf,
+ 0x20, 0x5d, 0x04, 0xbf, 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x76, 0x28, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x7a, 0xae, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0xc8, 0xb1, 0x7c, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0xf0, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0x70, 0x3f,
+ 0x84, 0x76, 0xa8, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x76, 0x28, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xc8, 0x7a, 0xae, 0x3f,
+ 0x00, 0x7f, 0x34, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x90, 0x65, 0x10, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e,
+ 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x70, 0x87, 0x40, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0x3f,
+ 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0x70, 0x87, 0x40, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x90, 0x65, 0x10, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0x58, 0x3f,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0x70, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x46, 0x96, 0x55, 0xc0, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x96, 0xf7, 0xa9, 0xc0, 0x40, 0xa9, 0x70, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x28, 0x94, 0xd2, 0xbf,
+ 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0x58, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0xdc, 0xa0, 0xe4, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0xb0, 0x8b, 0xc6, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xb1, 0xfc, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x74, 0x87, 0xc0, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x5c, 0x61, 0x8a, 0xbf,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x84, 0x3f, 0x60, 0x98, 0xd8, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x84, 0x3f,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0x28, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x28, 0x94, 0xd2, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
+ 0x50, 0xa9, 0x70, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0xe0, 0xa0, 0x64, 0x3f,
+ 0xd4, 0x69, 0x96, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x70, 0x87, 0x40, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x90, 0x65, 0x10, 0xbf,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x90, 0x76, 0x28, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x90, 0x76, 0x28, 0x3f,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x98, 0x65, 0x90, 0x3f,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x76, 0x28, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x84, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc8, 0xb1, 0x7c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x10, 0x3f,
+ 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x98, 0x58, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xd0, 0xb1, 0x7c, 0x3f,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x70, 0x87, 0x40, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x3a, 0x83, 0x3a, 0xc0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x52, 0xa9, 0x70, 0xc0, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xd8, 0xa0, 0x64, 0xbf,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x50, 0xa9, 0x70, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x98, 0x65, 0x90, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x28, 0x94, 0xd2, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x7f, 0x34, 0x3f, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0x3f,
+ 0x20, 0x5d, 0x84, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x61, 0x8a, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xd4, 0x69, 0x96, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x7f, 0x34, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x90, 0x65, 0x10, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0xb0, 0x8b, 0xc6, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x9c, 0xde, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x20, 0x5d, 0x04, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x60, 0x98, 0xd8, 0xbe,
+ 0x98, 0x65, 0x90, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3f,
+ 0x38, 0x83, 0xba, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+ 0x60, 0x98, 0x58, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x76, 0x28, 0x3f,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf,
+ 0x80, 0x76, 0xa8, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0x3f,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xb1, 0x7c, 0x3f,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0x69, 0x96, 0x3f,
+ 0x60, 0x98, 0x58, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x5c, 0x61, 0x8a, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0x58, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x61, 0x8a, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0xbf, 0x70, 0x87, 0x40, 0xbf,
+ 0x60, 0x87, 0xc0, 0xbe, 0x58, 0x85, 0x3d, 0xc0, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x12, 0xdc, 0x82, 0xc0, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0x58, 0xbf,
+ 0x50, 0x72, 0xa2, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0x58, 0x3f,
+ 0x58, 0xa9, 0xf0, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0xb0, 0x8b, 0xc6, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x76, 0xa8, 0xbe, 0x48, 0x72, 0xa2, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x7f, 0xb4, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x50, 0xa9, 0x70, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x48, 0x72, 0xa2, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0x10, 0x6e, 0x1c, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf, 0x98, 0x65, 0x90, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0x20, 0x5d, 0x84, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0xec, 0x8f, 0xcc, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x84, 0xbf, 0xa0, 0x65, 0x10, 0x3f,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0x28, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0x84, 0x76, 0xa8, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x20, 0x5d, 0x84, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
+ 0xc0, 0x7a, 0xae, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3f,
+ 0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x90, 0x76, 0x28, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x70, 0x87, 0x40, 0xbf,
+ 0x80, 0x76, 0xa8, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xb1, 0x7c, 0x3f,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
+ 0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xd4, 0x69, 0x96, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0x3f,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x70, 0x87, 0x40, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
+ 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
+ 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf,
+ 0xa0, 0x65, 0x10, 0x3f, 0x50, 0xa9, 0x70, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x80, 0x76, 0x28, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x80, 0x87, 0x40, 0x3e, 0x50, 0xa9, 0x70, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x64, 0x98, 0x58, 0xc0, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0xc2, 0x7a, 0xae, 0xc0, 0x10, 0x6e, 0x1c, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x7a, 0x63, 0x0d, 0xc0,
+ 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x88, 0x76, 0xa8, 0x3f, 0x90, 0x65, 0x10, 0xbf, 0x10, 0x6e, 0x1c, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
+ 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x8f, 0xcc, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x28, 0x94, 0xd2, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0x98, 0xd8, 0x3e, 0x98, 0x65, 0x90, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x50, 0xa9, 0x70, 0x3f,
+ 0x48, 0x72, 0xa2, 0xbf, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
+ 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0xf0, 0x8f, 0x4c, 0x3f,
+ 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x3a, 0x83, 0x3a, 0xc0,
+ 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
+ 0x80, 0x65, 0x10, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x70, 0x87, 0x40, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
+ 0x20, 0x5d, 0x04, 0x3f, 0x70, 0x87, 0x40, 0xbf, 0x10, 0x6e, 0x1c, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x84, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
+ 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
+ 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x87, 0xc0, 0x3d, 0x28, 0x94, 0xd2, 0xbf, 0x00, 0x88, 0x40, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x50, 0xa9, 0x70, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
+ 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0xd4, 0x69, 0x96, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0xd0, 0xb1, 0x7c, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
+ 0x64, 0x98, 0xd8, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0x3f,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
+ 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf,
+ 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
+ 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x98, 0x65, 0x90, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0x3f,
+ 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x50, 0xa9, 0x70, 0xbf,
+ 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
+ 0x10, 0x6e, 0x1c, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0xfc, 0x7e, 0xb4, 0xbf, 0x80, 0x87, 0x40, 0xbe,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
+ 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
+ 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x98, 0x65, 0x90, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f,
+ 0x48, 0x72, 0xa2, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
+ 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
+ 0x70, 0x87, 0x40, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
+ 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf,
+ 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
+ 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x90, 0x76, 0x28, 0x3f,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xe0, 0xa0, 0x64, 0x3f,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x61, 0x8a, 0x3f,
+ 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
+ 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x5c, 0x61, 0x8a, 0xbf,
+ 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
+ 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xd4, 0x69, 0x96, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x8e, 0xad, 0x76, 0xc0, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x76, 0x87, 0xc0, 0xc0, 0x90, 0x65, 0x10, 0xbf,
+ 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0xf0, 0xbf,
+ 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
+ 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x65, 0x10, 0xbe, 0x88, 0x76, 0xa8, 0x3f, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0xbe, 0x8c, 0xad, 0xf6, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0x40, 0x3e,
+ 0x50, 0xa9, 0x70, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
+ 0x60, 0x98, 0xd8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
+ 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
+ 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x69, 0x16, 0xc0,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x5c, 0x61, 0x8a, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
+ 0x60, 0x98, 0x58, 0xbf, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
+ 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
+ 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
+ 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x70, 0x87, 0x40, 0xbf,
+ 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
+ 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
+ 0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e,
+ 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
+ 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x76, 0x28, 0x3f,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
+ 0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x60, 0x98, 0x58, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
+ 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x5c, 0x61, 0x8a, 0xbf,
+ 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
+ 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
+ 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
+ 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
+ 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xb6, 0x67, 0x13, 0xc0,
+}};
+const int32_t dnn_hiddenlayer_1_bias__2__cf__2_shape[1] = {115};
+const union {
+ uint8_t bytes[460];
+ float values[115];
+} dnn_hiddenlayer_1_bias__2__cf__2 = {{
+ 0x79, 0x65, 0x22, 0x3d, 0x8e, 0xfa, 0x43, 0xbd, 0x8a, 0x89, 0xd4, 0xbf,
+ 0x5b, 0x33, 0xa7, 0x3c, 0x8a, 0x75, 0x40, 0xbe, 0xf7, 0x04, 0xbf, 0xbe,
+ 0x86, 0xfd, 0xb2, 0xbf, 0xaa, 0x80, 0x7b, 0xbe, 0x55, 0xab, 0xb4, 0xbf,
+ 0x64, 0x26, 0x82, 0xbe, 0x5d, 0x82, 0xcd, 0xbf, 0xf3, 0xd4, 0x38, 0xbf,
+ 0xc7, 0x76, 0xbf, 0x3f, 0x9f, 0x27, 0x3c, 0xbe, 0x7c, 0x3c, 0x9e, 0x3f,
+ 0x5e, 0x7f, 0x7c, 0x3e, 0x55, 0x54, 0x94, 0xbf, 0x86, 0x1b, 0x80, 0x3e,
+ 0x49, 0xe5, 0xef, 0xbf, 0xff, 0xca, 0xb9, 0xbf, 0x28, 0x5a, 0xfc, 0xbf,
+ 0xc0, 0xc4, 0x32, 0xbf, 0xba, 0xa1, 0x04, 0x3f, 0xc7, 0x1c, 0xf5, 0xbd,
+ 0x9f, 0xe0, 0x7f, 0xbf, 0xea, 0x2b, 0x5e, 0x3f, 0x64, 0x62, 0xcc, 0xbe,
+ 0x6b, 0x95, 0x0a, 0x3f, 0x0b, 0xaa, 0xb7, 0x3e, 0xab, 0xf1, 0x79, 0x3f,
+ 0x89, 0xe5, 0xf6, 0x3e, 0xb6, 0x96, 0xcc, 0x3e, 0xed, 0xd4, 0x25, 0x3f,
+ 0x8c, 0x85, 0xeb, 0xbd, 0x1d, 0x80, 0xb8, 0x3f, 0xf7, 0x3e, 0xce, 0xbe,
+ 0x8d, 0x25, 0x97, 0x3d, 0x70, 0xe2, 0xbe, 0xbd, 0x48, 0xd8, 0x40, 0xbe,
+ 0x66, 0xe1, 0x09, 0x3e, 0x92, 0xb0, 0x1a, 0x3f, 0x25, 0xe7, 0xb3, 0xbe,
+ 0x19, 0x90, 0xf4, 0x3f, 0xd8, 0xf2, 0xdf, 0xbf, 0xce, 0xee, 0x27, 0xbe,
+ 0x65, 0x9f, 0xc1, 0xbe, 0xc3, 0x91, 0x7a, 0xbf, 0x83, 0x9b, 0x4a, 0x3f,
+ 0x77, 0x7d, 0xab, 0x3d, 0xa0, 0x14, 0xa2, 0xbf, 0x88, 0xb8, 0x9f, 0x3c,
+ 0x53, 0x14, 0x12, 0xbe, 0xf2, 0x1c, 0x92, 0xbe, 0xba, 0xcf, 0x87, 0x3e,
+ 0x75, 0x16, 0x82, 0xbe, 0x30, 0x3d, 0xf2, 0xbd, 0x20, 0x12, 0x31, 0xbc,
+ 0x45, 0x9d, 0x90, 0xbf, 0xd4, 0x9a, 0x11, 0xc0, 0x47, 0xf8, 0x6c, 0x3e,
+ 0x94, 0xcb, 0x72, 0xbe, 0x7a, 0x2d, 0x20, 0xbf, 0x50, 0x8f, 0xac, 0x3e,
+ 0x5a, 0x80, 0x84, 0xbf, 0xf6, 0x3e, 0x89, 0xbf, 0x97, 0x93, 0xee, 0xbf,
+ 0x80, 0xc6, 0xb0, 0x3f, 0xe9, 0x3c, 0xe8, 0xbf, 0x6e, 0x21, 0x06, 0x3e,
+ 0x97, 0xf2, 0xcd, 0xbd, 0xf5, 0x2f, 0x62, 0xbf, 0x7f, 0xd7, 0xf1, 0xbd,
+ 0x35, 0x48, 0x83, 0x3e, 0xa1, 0xae, 0xcb, 0x3e, 0x00, 0x79, 0xac, 0xbd,
+ 0x63, 0xbd, 0x12, 0xbc, 0x67, 0xe3, 0xaf, 0x3f, 0xac, 0x51, 0xf0, 0xbd,
+ 0x39, 0x1a, 0xb9, 0xbf, 0xbd, 0xd8, 0x36, 0xc0, 0x80, 0xc8, 0x5c, 0x3f,
+ 0xec, 0xbd, 0x61, 0xbf, 0xce, 0xa6, 0x12, 0x3f, 0xad, 0x8a, 0xdd, 0x3e,
+ 0x53, 0xc4, 0x59, 0x3e, 0xfe, 0x7f, 0x81, 0xbf, 0x16, 0x55, 0x40, 0xbf,
+ 0x43, 0x30, 0xdf, 0x3c, 0xba, 0xf6, 0x5d, 0x3e, 0x13, 0xd8, 0x9d, 0xbe,
+ 0xee, 0x41, 0x7d, 0x3f, 0xf5, 0x2c, 0xfc, 0xbe, 0x46, 0xdf, 0x09, 0xbe,
+ 0xf3, 0x5a, 0x35, 0x40, 0x30, 0xb4, 0x1c, 0xbe, 0x3e, 0xbf, 0x30, 0x3f,
+ 0x86, 0x41, 0x1b, 0x3e, 0x3f, 0x4a, 0xcc, 0x3f, 0x81, 0xce, 0xb7, 0x3f,
+ 0xa9, 0xed, 0x55, 0x3f, 0x81, 0xe5, 0x7b, 0x3e, 0x95, 0xdd, 0x8d, 0x3e,
+ 0x86, 0x89, 0x77, 0x3f, 0xe6, 0x98, 0x2e, 0x3e, 0xca, 0x82, 0x15, 0xbf,
+ 0x3e, 0x96, 0x44, 0xbe, 0x9d, 0xb3, 0xc1, 0x3f, 0x7f, 0x4b, 0xbc, 0x3f,
+ 0x98, 0xd3, 0x18, 0x3d, 0xc7, 0xbb, 0x58, 0x3d, 0xb6, 0x7b, 0x8d, 0xbd,
+ 0xa9, 0xdf, 0x13, 0xbf, 0x38, 0x16, 0x87, 0xbf, 0x87, 0xaa, 0x35, 0x3f,
+ 0xb3, 0x28, 0x33, 0x3f,
+}};
+const int32_t dnn_hiddenlayer_1_kernel__3__cf__3_shape[2] = {117, 115};
+const union {
+ uint8_t bytes[53820];
+ float values[13455];
+} dnn_hiddenlayer_1_kernel__3__cf__3 = {{
+ 0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x08, 0xc2, 0x53, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0xd8, 0x1b, 0x35, 0xbf,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xf0, 0xbd, 0x05, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x20, 0xe5, 0xb7, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+ 0x08, 0xc2, 0x53, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x14, 0xe3, 0x90, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0xf2, 0x3e, 0x19, 0xbf, 0x80, 0x52, 0xb2, 0xbc,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x3c, 0x08, 0x9c, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0xb8, 0x77, 0xbd, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xe8, 0xbd, 0x05, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+ 0xa8, 0x75, 0x96, 0xbe, 0xc4, 0x79, 0xe4, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x9c, 0x54, 0xd9, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
+ 0xa8, 0x75, 0x96, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
+ 0x58, 0x0c, 0xea, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x80, 0x52, 0xb2, 0xbc, 0xb8, 0x77, 0x3d, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x80, 0x31, 0x75, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x05, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x14, 0xe3, 0x90, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x34, 0x87, 0x08, 0xbf, 0x65, 0x2d, 0x27, 0xbf, 0x30, 0x08, 0x9c, 0xbd,
+ 0x40, 0x08, 0x9c, 0x3d, 0x36, 0x87, 0x08, 0x3f, 0x60, 0x2d, 0x27, 0xbe,
+ 0x4a, 0x0a, 0x43, 0x3f, 0xc8, 0x19, 0x0e, 0xbf, 0x80, 0x31, 0xf5, 0xbd,
+ 0x40, 0x08, 0x1c, 0x3e, 0x46, 0x89, 0x2f, 0x3f, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xbf, 0xac, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+ 0xec, 0xbd, 0x85, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0x34, 0xe7, 0xde, 0x3e,
+ 0x90, 0x52, 0x32, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x52, 0x32, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x18, 0xe3, 0x10, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x1c, 0x3e,
+ 0x90, 0x52, 0xb2, 0x3d, 0xe8, 0xbd, 0x85, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x74, 0x2f, 0xce, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+ 0xa2, 0xf4, 0x02, 0x3f, 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0x30, 0x08, 0x9c, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0x29, 0x66, 0x4b, 0xbf,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0x48, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x58, 0x0c, 0xea, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x85, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
+ 0x88, 0x52, 0x32, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x58, 0x2b, 0x80, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+ 0x54, 0x2b, 0x80, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xea, 0xbd, 0x05, 0xbf, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x90, 0x31, 0xf5, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x5e, 0xac, 0x13, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+ 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xea, 0xbd, 0x05, 0xbf, 0x6c, 0xae, 0x3a, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+ 0xec, 0xbd, 0x85, 0x3e, 0x7e, 0x50, 0x0b, 0xbf, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+ 0x30, 0xe7, 0xde, 0x3d, 0x64, 0x2d, 0xa7, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x90, 0x31, 0xf5, 0x3d, 0xc4, 0x79, 0xe4, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x65, 0x2d, 0x27, 0xbf, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x31, 0xf5, 0xbd,
+ 0x00, 0xbe, 0x05, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
+ 0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0x3c,
+ 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0xde, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+ 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x68, 0x2d, 0x27, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0x3c, 0x30, 0x08, 0x9c, 0xbd,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x80, 0x50, 0x8b, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+ 0x38, 0x08, 0x1c, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x38, 0x08, 0x1c, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0xea, 0xbd, 0x05, 0x3f,
+ 0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x88, 0x31, 0x75, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+ 0x8c, 0x52, 0xb2, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+ 0x10, 0xe3, 0x10, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+ 0x08, 0xc2, 0x53, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x80, 0x31, 0xf5, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x5e, 0xac, 0x13, 0x3f,
+ 0x80, 0x52, 0x32, 0x3c, 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0xb4, 0x77, 0xbd, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7c, 0x50, 0x8b, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x18, 0xe3, 0x10, 0x3e,
+ 0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+ 0x80, 0x52, 0x32, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xa0, 0x52, 0x32, 0x3d,
+ 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x56, 0x2b, 0x00, 0x3f,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0x18, 0xe3, 0x10, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd,
+ 0x24, 0xe5, 0xb7, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+ 0x64, 0x2d, 0xa7, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x74, 0x2f, 0xce, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x80, 0x52, 0x32, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+ 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd, 0x84, 0x31, 0xf5, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x80, 0x52, 0xb2, 0xbc, 0x88, 0x31, 0x75, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+ 0x30, 0xe7, 0xde, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+ 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0x32, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x30, 0x08, 0x9c, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x80, 0x50, 0x8b, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x08, 0xc2, 0x53, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+ 0x60, 0x2d, 0x27, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+ 0x80, 0x52, 0x32, 0xbc, 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+ 0x40, 0x08, 0x1c, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xa8, 0x75, 0x96, 0x3e,
+ 0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x31, 0xf5, 0x3d,
+ 0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+ 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0xbc, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x90, 0x52, 0xb2, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x80, 0x31, 0xf5, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xd0, 0x9a, 0x21, 0xbf, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x02, 0x41, 0x40, 0x3f, 0x88, 0x52, 0x32, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+ 0x40, 0x08, 0x1c, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0xd2, 0x9a, 0x21, 0x3f,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x34, 0x87, 0x08, 0xbf, 0x14, 0xe3, 0x90, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x32, 0xe7, 0x5e, 0x3f, 0xc0, 0x52, 0xb2, 0x3c, 0x84, 0x31, 0xf5, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0x74, 0x2f, 0x4e, 0xbf,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0x75, 0xbe,
+ 0xca, 0x19, 0x0e, 0x3f, 0x80, 0x52, 0x32, 0xbd, 0x12, 0xe3, 0x10, 0xbf,
+ 0x40, 0x08, 0x9c, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0xfc, 0xbf, 0xac, 0x3e,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+ 0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0x68, 0x2d, 0x27, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+ 0x68, 0x2d, 0x27, 0x3e, 0xa2, 0xf4, 0x02, 0x3f, 0x08, 0xc2, 0x53, 0x3e,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x24, 0xe5, 0xb7, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x5d, 0xac, 0x93, 0x3f, 0x10, 0xe3, 0x10, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x0c, 0xea, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x10, 0xe3, 0x10, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0x34, 0xe7, 0xde, 0x3e, 0x56, 0x2b, 0x00, 0xbf,
+ 0x8d, 0x52, 0x32, 0xbf, 0x18, 0xc4, 0xfa, 0xbe, 0xb6, 0x77, 0x3d, 0xbf,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x3c, 0x08, 0x1c, 0xbf, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x30, 0xe7, 0x5e, 0x3e, 0xaa, 0x75, 0x16, 0x3f, 0x6c, 0xae, 0x3a, 0xbf,
+ 0x30, 0xe7, 0xde, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0xb8, 0x77, 0xbd, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x88, 0x52, 0x32, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0x86, 0xd1, 0x1e, 0xbf, 0x88, 0x31, 0x75, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+ 0x80, 0x31, 0x75, 0xbe, 0x1a, 0x64, 0x24, 0x3f, 0x90, 0x52, 0xb2, 0x3d,
+ 0x00, 0xbe, 0x05, 0x3d, 0xdf, 0x9c, 0x48, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x80, 0x31, 0x75, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x8c, 0x52, 0xb2, 0xbe,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+ 0x36, 0x87, 0x08, 0x3f, 0x40, 0x08, 0x1c, 0x3e, 0xb8, 0x77, 0xbd, 0x3e,
+ 0x68, 0x2d, 0x27, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x88, 0x52, 0x32, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x1c, 0xc4, 0xfa, 0x3e,
+ 0x54, 0x2b, 0x80, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+ 0x8d, 0x52, 0x32, 0xbf, 0xa8, 0x75, 0x96, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0xbd, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x4c, 0xda, 0x97, 0xbf, 0xb8, 0x77, 0xbd, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0xc4, 0x79, 0xe4, 0x3e,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x08, 0xc2, 0xd3, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x08, 0xc2, 0x53, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x9c, 0x54, 0xd9, 0x3e, 0xf2, 0x3e, 0x19, 0xbf,
+ 0xfc, 0xbf, 0xac, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0xa2, 0xf4, 0x02, 0x3f,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+ 0x30, 0xe7, 0xde, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+ 0x58, 0x2b, 0x80, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0x90, 0x52, 0xb2, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3e,
+ 0x90, 0x31, 0xf5, 0x3d, 0xb6, 0x77, 0x3d, 0xbf, 0x60, 0x2d, 0x27, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0xa0, 0xf4, 0x02, 0xbf, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x90, 0x52, 0xb2, 0xbd, 0x88, 0x31, 0x75, 0x3e, 0x9c, 0x54, 0xd9, 0x3e,
+ 0x54, 0x2b, 0x80, 0xbe, 0x65, 0x2d, 0x27, 0xbf, 0x54, 0x2b, 0x80, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x64, 0x2d, 0xa7, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x14, 0xe3, 0x90, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x3c, 0x08, 0x9c, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x4c, 0x0a, 0xc3, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0xb4, 0x77, 0xbd, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+ 0x80, 0x31, 0xf5, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x80, 0x50, 0x8b, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+ 0x38, 0x08, 0x1c, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x14, 0xe3, 0x90, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
+ 0x80, 0x52, 0x32, 0xbc, 0x00, 0xbe, 0x05, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x30, 0xe7, 0xde, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+ 0x80, 0x31, 0x75, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x52, 0x32, 0x3c,
+ 0x30, 0xe7, 0xde, 0x3d, 0x3c, 0x08, 0x9c, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x80, 0x52, 0x32, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x64, 0x2d, 0xa7, 0xbe,
+ 0x08, 0xc2, 0x53, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x9c, 0x54, 0xd9, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0x5e, 0xac, 0x13, 0xbf,
+ 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+ 0xa8, 0x75, 0x16, 0xbf, 0x88, 0x31, 0x75, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x30, 0xe7, 0xde, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x14, 0xe3, 0x90, 0x3e,
+ 0x30, 0xe7, 0x5e, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x64, 0x2d, 0xa7, 0xbe,
+ 0x90, 0x52, 0xb2, 0xbd, 0x6c, 0xae, 0x3a, 0xbf, 0x1a, 0x64, 0x24, 0xbf,
+ 0x80, 0x52, 0x32, 0xbd, 0x6c, 0xae, 0x3a, 0xbf, 0xc4, 0x79, 0xe4, 0xbe,
+ 0x08, 0xc2, 0x53, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x8c, 0x52, 0xb2, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xc5, 0x79, 0x64, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x31, 0x75, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x43, 0x89, 0x2f, 0xbf,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+ 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x31, 0x75, 0xbe,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+ 0xea, 0xbd, 0x05, 0xbf, 0xa0, 0x52, 0x32, 0x3d, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x08, 0xc2, 0x53, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+ 0xec, 0xbd, 0x85, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0xc4, 0x79, 0xe4, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0x8d, 0x52, 0x32, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
+ 0x74, 0x2f, 0xce, 0xbe, 0x18, 0xc4, 0xfa, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0xa8, 0x75, 0x96, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x74, 0x2f, 0x4e, 0xbf,
+ 0x38, 0x08, 0x1c, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xb4, 0x77, 0xbd, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+ 0x34, 0x87, 0x08, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+ 0x84, 0x31, 0xf5, 0x3e, 0xe8, 0xbd, 0x85, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xc8, 0x19, 0x0e, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+ 0xb6, 0x77, 0x3d, 0xbf, 0x20, 0xe5, 0xb7, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+ 0x88, 0x52, 0x32, 0xbe, 0x18, 0xc4, 0xfa, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x22, 0xe5, 0x37, 0xbf, 0xa8, 0x75, 0x96, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0x40, 0x08, 0x1c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x88, 0x52, 0x32, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
+ 0x80, 0x52, 0x32, 0x3c, 0x90, 0x31, 0xf5, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0xfc, 0xbf, 0xac, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0x58, 0x0c, 0xea, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x08, 0xc2, 0x53, 0xbe, 0x29, 0x66, 0x4b, 0xbf, 0x58, 0x0c, 0x6a, 0xbe,
+ 0xa8, 0x75, 0x96, 0xbe, 0xea, 0xbd, 0x05, 0xbf, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0x9c, 0x54, 0xd9, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0x4c, 0x0a, 0xc3, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0xf8, 0xbf, 0xac, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x34, 0xe7, 0xde, 0x3e,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x22, 0xe5, 0x37, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xf2, 0x3e, 0x19, 0xbf, 0x00, 0xbe, 0x05, 0x3d,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0xa8, 0x75, 0x96, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+ 0x30, 0xe7, 0xde, 0xbd, 0xc4, 0x79, 0xe4, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0xf9, 0xbf, 0x2c, 0xbf,
+ 0x80, 0x31, 0x75, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x88, 0x31, 0x75, 0x3e,
+ 0x80, 0x52, 0x32, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x31, 0xf5, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0xa0, 0xf4, 0x02, 0xbf, 0x38, 0x08, 0x1c, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0x5e, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x60, 0x2d, 0x27, 0xbe,
+ 0x7c, 0x50, 0x8b, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xca, 0x19, 0x0e, 0x3f,
+ 0x88, 0x31, 0x75, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0xb8, 0x77, 0x3d, 0x3e,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+ 0x18, 0xe3, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x08, 0xc2, 0x53, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x80, 0x52, 0x32, 0xbc, 0x46, 0x89, 0x2f, 0x3f, 0x40, 0x08, 0x9c, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0x32, 0x3e, 0x74, 0x2f, 0xce, 0xbe,
+ 0x86, 0xd1, 0x1e, 0xbf, 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xb4, 0x77, 0xbd, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xa8, 0x75, 0x96, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x68, 0x2d, 0x27, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+ 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x7e, 0x50, 0x0b, 0xbf, 0x58, 0x0c, 0x6a, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xb8, 0x77, 0xbd, 0x3e,
+ 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x50, 0x8b, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x30, 0x08, 0x9c, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xca, 0x19, 0x0e, 0x3f, 0x3c, 0x08, 0x9c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x3c, 0x08, 0x9c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x24, 0xe5, 0xb7, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+ 0x0c, 0xc2, 0xd3, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x56, 0x2b, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x50, 0x8b, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+ 0xa0, 0x52, 0x32, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0xe4, 0x9c, 0xc8, 0x3e,
+ 0x14, 0xe3, 0x90, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0x3d, 0xa8, 0x75, 0x96, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0xec, 0x9e, 0xef, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0xde, 0xbe,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0xea, 0xbd, 0x05, 0xbf, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x7e, 0x50, 0x0b, 0xbf, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x50, 0x8b, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0x30, 0xe7, 0xde, 0xbd, 0x4c, 0x0a, 0xc3, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x86, 0xd1, 0x1e, 0xbf, 0x80, 0x31, 0xf5, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x18, 0xe3, 0x10, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x58, 0x0c, 0xea, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+ 0x18, 0xc4, 0xfa, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0xc8, 0x19, 0x0e, 0xbf,
+ 0x20, 0xe5, 0xb7, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0xc4, 0x79, 0xe4, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x5a, 0x0c, 0x6a, 0xbf,
+ 0x80, 0x52, 0x32, 0xbc, 0xf0, 0xbd, 0x85, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x90, 0x52, 0x32, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x34, 0xe7, 0xde, 0x3e,
+ 0x20, 0xe5, 0xb7, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0x3d,
+ 0xa8, 0x75, 0x96, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x54, 0x2b, 0x80, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x85, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x38, 0x08, 0x1c, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xf8, 0xbf, 0xac, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x31, 0x75, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x8c, 0x52, 0xb2, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x34, 0x87, 0x08, 0xbf,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+ 0xf2, 0x3e, 0x19, 0xbf, 0xe8, 0xbd, 0x85, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+ 0x14, 0xe3, 0x90, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x54, 0x2b, 0x80, 0xbe,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x86, 0xd1, 0x1e, 0xbf, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x5a, 0x0c, 0x6a, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0xbd,
+ 0x30, 0xe7, 0xde, 0x3d, 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0x30, 0x08, 0x9c, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x31, 0x75, 0xbe,
+ 0xfa, 0xbf, 0x2c, 0x3f, 0x20, 0xe5, 0xb7, 0xbe, 0x5a, 0x0c, 0x6a, 0xbf,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x56, 0x2b, 0x00, 0xbf, 0x30, 0x08, 0x9c, 0xbd,
+ 0x7e, 0x50, 0x8b, 0xbf, 0xa8, 0x75, 0x96, 0x3e, 0xd2, 0x9a, 0x21, 0x3f,
+ 0x6c, 0xae, 0x3a, 0xbf, 0x08, 0xc2, 0x53, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xa8, 0x75, 0x96, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+ 0x3c, 0x08, 0x9c, 0xbf, 0x4c, 0x0a, 0xc3, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
+ 0x68, 0x2d, 0x27, 0x3e, 0xb4, 0x77, 0xbd, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x90, 0x31, 0xf5, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0xe4, 0x9c, 0xc8, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0x5e, 0x3e, 0xc8, 0x19, 0x0e, 0xbf,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x34, 0x87, 0x08, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0xd0, 0x9a, 0x21, 0xbf,
+ 0x30, 0xe7, 0x5e, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
+ 0x5e, 0xac, 0x13, 0xbf, 0x80, 0x31, 0xf5, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x12, 0xe3, 0x10, 0xbf, 0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0x10, 0xe3, 0x10, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x22, 0xe5, 0x37, 0xbf, 0x95, 0xd3, 0x45, 0xbf,
+ 0xec, 0x9e, 0xef, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xa8, 0x75, 0x96, 0xbe, 0xb8, 0x77, 0xbd, 0x3e, 0x29, 0x66, 0x4b, 0xbf,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x5c, 0x0c, 0xea, 0x3e,
+ 0x14, 0xe3, 0x90, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x24, 0xe5, 0xb7, 0x3e,
+ 0xc4, 0x79, 0xe4, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x31, 0xf5, 0x3d, 0x3c, 0x08, 0x9c, 0xbe,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x50, 0x8b, 0x3e,
+ 0x88, 0x31, 0x75, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x3c, 0x08, 0x1c, 0xbf, 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x54, 0x2b, 0x80, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0xb6, 0x77, 0x3d, 0xbf, 0x18, 0xe3, 0x10, 0x3e,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0x90, 0x52, 0xb2, 0x3e,
+ 0x90, 0x52, 0xb2, 0x3d, 0xb6, 0x77, 0x3d, 0xbf, 0x80, 0x31, 0xf5, 0xbd,
+ 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x88, 0x52, 0x32, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0xec, 0x9e, 0xef, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+ 0x90, 0x52, 0x32, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x30, 0xe7, 0x5e, 0x3e,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+ 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+ 0x80, 0x52, 0xb2, 0xbc, 0xe8, 0xbd, 0x85, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x60, 0x0c, 0x6a, 0x3e, 0xaf, 0xf6, 0x29, 0xbf, 0xf0, 0xbd, 0x05, 0x3e,
+ 0xf8, 0xbf, 0xac, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x7e, 0x50, 0x0b, 0x3f,
+ 0x90, 0x52, 0xb2, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0x68, 0x2d, 0xa7, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0x5e, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+ 0xa8, 0x75, 0x16, 0xbf, 0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0x68, 0x2d, 0xa7, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
+ 0x80, 0x52, 0x32, 0xbc, 0xd0, 0x9a, 0xa1, 0xbe, 0xea, 0xbd, 0x85, 0xbf,
+ 0x40, 0x08, 0x1c, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x74, 0x2f, 0xce, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x30, 0xe7, 0xde, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x9c, 0x3d,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x7e, 0x50, 0x0b, 0xbf, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0xa8, 0x75, 0x96, 0x3e,
+ 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0x8c, 0x52, 0xb2, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e,
+ 0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0xa8, 0x75, 0x96, 0xbe,
+ 0xec, 0xbd, 0x85, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0xb8, 0x77, 0xbd, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x14, 0xe3, 0x90, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+ 0xe0, 0x9c, 0x48, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+ 0x40, 0x08, 0x9c, 0x3d, 0x84, 0x31, 0xf5, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
+ 0x68, 0x2d, 0x27, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+ 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x84, 0x31, 0xf5, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x08, 0xc2, 0xd3, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x60, 0x2d, 0x27, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x68, 0x2d, 0xa7, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3e,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x31, 0x75, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x68, 0x2d, 0x27, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0x3c,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x0c, 0x6a, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x58, 0x0c, 0x6a, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x90, 0x52, 0xb2, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+ 0x60, 0x2d, 0x27, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+ 0x58, 0x2b, 0x80, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x90, 0x52, 0xb2, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x00, 0xbe, 0x05, 0x3d, 0x8c, 0x52, 0xb2, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x05, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+ 0x30, 0x08, 0x9c, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x77, 0x3d, 0x3e,
+ 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+ 0x80, 0x50, 0x8b, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x08, 0xc2, 0x53, 0xbe,
+ 0x08, 0xc2, 0x53, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x80, 0x52, 0x32, 0xbd, 0xf8, 0xbf, 0xac, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+ 0x9c, 0x54, 0xd9, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x74, 0x2f, 0xce, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+ 0x43, 0x89, 0x2f, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0xa8, 0x75, 0x16, 0xbf,
+ 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x17, 0xc4, 0x7a, 0xbf,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x74, 0x2f, 0xce, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0xde, 0xbd,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x88, 0x31, 0x75, 0x3e, 0xf2, 0x3e, 0x19, 0xbf, 0xb4, 0x77, 0xbd, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0x6c, 0xae, 0x3a, 0xbf, 0x80, 0x52, 0x32, 0xbc,
+ 0x00, 0xbe, 0x05, 0x3d, 0xa8, 0x75, 0x96, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xea, 0xbd, 0x05, 0xbf,
+ 0xec, 0xbd, 0x85, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x88, 0x31, 0x75, 0x3e,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x08, 0xc2, 0xd3, 0xbe,
+ 0x58, 0x2b, 0x80, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0xb4, 0x77, 0xbd, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xc0, 0x52, 0xb2, 0x3c, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0x48, 0x3e, 0xa8, 0x75, 0x16, 0xbf,
+ 0x90, 0x52, 0x32, 0x3e, 0xa8, 0x75, 0x16, 0xbf, 0x80, 0x31, 0x75, 0xbe,
+ 0x80, 0x50, 0x8b, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+ 0xb8, 0x77, 0xbd, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
+ 0x5e, 0xac, 0x13, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0x3c, 0x08, 0x1c, 0xbf, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x20, 0xe5, 0xb7, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
+ 0x9c, 0x54, 0xd9, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0x74, 0x2f, 0xce, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+ 0xe0, 0x9c, 0x48, 0xbe, 0xf2, 0x3e, 0x19, 0xbf, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x34, 0xe7, 0xde, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0xa2, 0xf4, 0x02, 0x3f,
+ 0x80, 0x52, 0xb2, 0xbc, 0x56, 0x2b, 0x00, 0x3f, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x80, 0x50, 0x8b, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0xc8, 0x19, 0x0e, 0xbf,
+ 0x80, 0x50, 0x8b, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+ 0x18, 0xc4, 0xfa, 0xbe, 0xa8, 0x75, 0x16, 0xbf, 0x40, 0x08, 0x9c, 0x3d,
+ 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xbe, 0xf8, 0x50, 0xbf, 0xbe, 0xf8, 0x50, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x08, 0xc2, 0x53, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+ 0x90, 0x52, 0x32, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+ 0xfc, 0xbf, 0xac, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0x08, 0xc2, 0x53, 0x3e,
+ 0xe4, 0x9c, 0xc8, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+ 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+ 0x74, 0x2f, 0xce, 0x3e, 0x68, 0x2d, 0xa7, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x68, 0x2d, 0xa7, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x68, 0x2d, 0x27, 0x3e,
+ 0x30, 0x08, 0x9c, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+ 0xec, 0xbd, 0x85, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xf2, 0x3e, 0x19, 0x3f, 0x80, 0x31, 0x75, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x14, 0xe3, 0x90, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+ 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+ 0xa2, 0xf4, 0x02, 0x3f, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+ 0x90, 0x31, 0xf5, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0x8c, 0x52, 0xb2, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+ 0x90, 0x52, 0xb2, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x74, 0x2f, 0xce, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+ 0x68, 0x2d, 0x27, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x30, 0x08, 0x9c, 0xbd,
+ 0x30, 0xe7, 0xde, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+ 0x08, 0xc2, 0x53, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
+ 0xa0, 0x52, 0x32, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
+ 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x40, 0x08, 0x9c, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
+ 0x34, 0x87, 0x08, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
+ 0x24, 0xe5, 0xb7, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
+ 0x14, 0xe3, 0x90, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0x3d,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
+ 0x30, 0xe7, 0xde, 0x3d, 0xec, 0xbd, 0x85, 0x3e, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x90, 0x31, 0xf5, 0x3d, 0xec, 0x9e, 0xef, 0xbe, 0x88, 0x31, 0x75, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
+ 0x88, 0x52, 0x32, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x80, 0x52, 0x32, 0xbc, 0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xa0, 0x52, 0x32, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0xca, 0x19, 0x0e, 0x3f, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0x90, 0x52, 0xb2, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x30, 0xe7, 0xde, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x24, 0xe5, 0xb7, 0x3e,
+ 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+ 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
+ 0xb8, 0x77, 0xbd, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+ 0x80, 0x31, 0xf5, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0xd0, 0x9a, 0xa1, 0x3e,
+ 0x40, 0x08, 0x9c, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x14, 0xe3, 0x90, 0x3e, 0x56, 0x2b, 0x00, 0xbf, 0x58, 0x0c, 0x6a, 0xbe,
+ 0xea, 0xbd, 0x05, 0xbf, 0x18, 0xc4, 0xfa, 0xbe, 0xea, 0xbd, 0x05, 0xbf,
+ 0x80, 0x52, 0x32, 0x3c, 0xec, 0xbd, 0x85, 0x3e, 0x6c, 0xae, 0x3a, 0xbf,
+ 0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+ 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x00, 0x00, 0x00, 0x00,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+ 0x80, 0x31, 0x75, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+ 0x38, 0x08, 0x1c, 0xbe, 0x86, 0xd1, 0x1e, 0xbf, 0x30, 0xe7, 0xde, 0x3d,
+ 0x08, 0xc2, 0xd3, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x14, 0xe3, 0x90, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0x3d,
+ 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x88, 0x31, 0x75, 0x3e,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0xc4, 0x79, 0xe4, 0xbe,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0xfc, 0xbf, 0xac, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xa0, 0x52, 0x32, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
+ 0xea, 0xbd, 0x05, 0xbf, 0x30, 0xe7, 0xde, 0xbd, 0x74, 0x2f, 0xce, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x80, 0x31, 0xf5, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x30, 0x08, 0x9c, 0xbd, 0xa8, 0x75, 0x96, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0x3c, 0x08, 0x1c, 0xbf, 0x30, 0x08, 0x9c, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x80, 0x31, 0xf5, 0xbd, 0x08, 0xc2, 0xd3, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x30, 0xe7, 0x5e, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x88, 0x31, 0x75, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0xb4, 0x77, 0xbd, 0xbe,
+ 0x3c, 0x08, 0x1c, 0xbf, 0x7e, 0x50, 0x0b, 0xbf, 0x90, 0x52, 0xb2, 0x3e,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x14, 0xe3, 0x90, 0xbe,
+ 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x74, 0x2f, 0x4e, 0xbf,
+ 0x88, 0x31, 0x75, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0xaf, 0xf6, 0x29, 0xbf,
+ 0x34, 0x87, 0x08, 0xbf, 0xec, 0xbd, 0x85, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x1a, 0x64, 0x24, 0xbf, 0x1a, 0x64, 0x24, 0x3f, 0xa8, 0x75, 0x96, 0xbe,
+ 0xc4, 0x79, 0xe4, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+ 0x80, 0x50, 0x8b, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0xec, 0x9e, 0xef, 0xbe,
+ 0x1a, 0x64, 0x24, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d, 0x74, 0x2f, 0xce, 0xbe,
+ 0x68, 0x2d, 0xa7, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x58, 0x2b, 0x80, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+ 0x38, 0x08, 0x1c, 0xbe, 0x08, 0xc2, 0x53, 0xbf, 0x29, 0x66, 0x4b, 0xbf,
+ 0x34, 0xe7, 0xde, 0x3e, 0x7b, 0xb0, 0x61, 0xbf, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x18, 0xc4, 0xfa, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+ 0x30, 0xe7, 0x5e, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+ 0x80, 0x52, 0x32, 0x3c, 0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+ 0x7c, 0x50, 0x8b, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x56, 0x2b, 0x00, 0xbf, 0x65, 0x2d, 0x27, 0xbf, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x18, 0xc4, 0xfa, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0xec, 0x9e, 0xef, 0xbe, 0xec, 0x9e, 0xef, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+ 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0xb2, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
+ 0x68, 0x2d, 0x27, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0x38, 0x68, 0x72, 0xbf,
+ 0x3c, 0x08, 0x9c, 0x3e, 0xf8, 0xbf, 0xac, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x4c, 0x0a, 0xc3, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
+ 0xa0, 0xf4, 0x02, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x00, 0x41, 0x40, 0xbf,
+ 0xa0, 0x52, 0x32, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x58, 0x0c, 0xea, 0xbe, 0x65, 0x2d, 0x27, 0xbf, 0x65, 0x2d, 0x27, 0xbf,
+ 0x80, 0x31, 0xf5, 0xbd, 0x68, 0x2d, 0xa7, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xec, 0x9e, 0xef, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x8d, 0x52, 0x32, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+ 0x74, 0x2f, 0xce, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x12, 0xe3, 0x10, 0xbf, 0xd0, 0x9a, 0x21, 0xbf, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x52, 0x32, 0xbc, 0x12, 0xe3, 0x10, 0xbf, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x80, 0x52, 0x32, 0xbc, 0x5e, 0xac, 0x13, 0x3f, 0xf9, 0xbf, 0x2c, 0xbf,
+ 0xa8, 0x75, 0x16, 0xbf, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x20, 0xe5, 0xb7, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0x18, 0xe3, 0x10, 0x3e, 0x9c, 0x54, 0xd9, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0xb8, 0x77, 0x3d, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+ 0x58, 0x0c, 0xea, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xa8, 0x75, 0x96, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xea, 0xbd, 0x05, 0xbf, 0x58, 0x0c, 0xea, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+ 0xc8, 0x19, 0x0e, 0xbf, 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x90, 0x31, 0xf5, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0x86, 0xd1, 0x1e, 0xbf,
+ 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x80, 0x52, 0x32, 0xbc, 0x40, 0xe7, 0x5e, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xa0, 0xf4, 0x02, 0xbf, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x60, 0x0c, 0x6a, 0x3e,
+ 0xe7, 0x1d, 0x5c, 0xbf, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0xbd,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x88, 0x31, 0x75, 0x3e,
+ 0x40, 0x08, 0x9c, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+ 0xf8, 0xbf, 0xac, 0xbe, 0xc4, 0x79, 0xe4, 0xbe, 0x7e, 0x50, 0x0b, 0xbf,
+ 0x3c, 0x08, 0x9c, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+ 0x40, 0x08, 0x1c, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+ 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x14, 0xe3, 0x90, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x84, 0x31, 0xf5, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x9c, 0x54, 0xd9, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xea, 0xbd, 0x05, 0x3f,
+ 0x08, 0xc2, 0x53, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xb4, 0x77, 0xbd, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+ 0x84, 0x31, 0xf5, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x5e, 0xac, 0x13, 0xbf, 0x08, 0xc2, 0x53, 0xbe,
+ 0xf2, 0x3e, 0x19, 0x3f, 0x80, 0x52, 0x32, 0x3c, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x80, 0x31, 0x75, 0xbe, 0x86, 0xd1, 0x1e, 0xbf, 0xf2, 0x3e, 0x19, 0xbf,
+ 0x22, 0xe5, 0x37, 0xbf, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0x32, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+ 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x30, 0xe7, 0xde, 0x3d, 0xb4, 0x77, 0xbd, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x5e, 0xac, 0x13, 0xbf, 0x68, 0x2d, 0xa7, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x60, 0x2d, 0x27, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+ 0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x3e, 0x08, 0x1c, 0x3f,
+ 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+ 0xc8, 0x19, 0x0e, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0xb4, 0x77, 0xbd, 0xbe,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xaf, 0xf6, 0x29, 0xbf, 0x90, 0x52, 0xb2, 0x3d,
+ 0x80, 0x31, 0xf5, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x14, 0xe3, 0x90, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0x36, 0x87, 0x08, 0x3f, 0x8d, 0x52, 0x32, 0xbf,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0xfc, 0xbf, 0xac, 0x3e,
+ 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
+ 0x7e, 0x50, 0x8b, 0xbf, 0xf2, 0x3e, 0x19, 0xbf, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x5c, 0x0c, 0xea, 0x3e,
+ 0x80, 0x31, 0x75, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x45, 0x59, 0x84, 0xbf, 0x08, 0xc2, 0xd3, 0xbe,
+ 0x74, 0x2f, 0xce, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
+ 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+ 0x08, 0xc2, 0x53, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
+ 0x08, 0xc2, 0x53, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0xc8, 0x19, 0x0e, 0xbf, 0x34, 0xe7, 0xde, 0x3e, 0x34, 0x87, 0x88, 0xbf,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0xe7, 0x5e, 0x3d, 0x58, 0x0c, 0x6a, 0xbe,
+ 0xa2, 0xf4, 0x02, 0x3f, 0x10, 0xe3, 0x10, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
+ 0xec, 0xbd, 0x85, 0x3e, 0xc4, 0x79, 0xe4, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+ 0x86, 0xd1, 0x1e, 0xbf, 0xec, 0x9e, 0xef, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x84, 0x31, 0xf5, 0x3e,
+ 0x58, 0x2b, 0x80, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0xbd, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x41, 0x40, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x24, 0xe5, 0xb7, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+ 0x88, 0x31, 0x75, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x68, 0x2d, 0xa7, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x68, 0x2d, 0x27, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x58, 0x0c, 0xea, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x5c, 0x0c, 0xea, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x86, 0xd1, 0x1e, 0x3f,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+ 0x14, 0xe3, 0x90, 0x3e, 0x43, 0x89, 0x2f, 0xbf, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x68, 0x2d, 0x27, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0xb4, 0x77, 0xbd, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e, 0xc5, 0x79, 0x64, 0xbf,
+ 0x30, 0xe7, 0xde, 0xbd, 0xc4, 0x79, 0xe4, 0x3e, 0x56, 0x2b, 0x00, 0x3f,
+ 0x3c, 0x08, 0x9c, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x12, 0xe3, 0x10, 0x3f, 0xe0, 0x9c, 0xc8, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xec, 0xbd, 0x85, 0x3e, 0x9c, 0x54, 0xd9, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+ 0x10, 0xe3, 0x10, 0xbe, 0x5c, 0x0c, 0xea, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x80, 0x31, 0xf5, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x56, 0x2b, 0x00, 0xbf,
+ 0x08, 0xc2, 0x53, 0x3e, 0x1a, 0x64, 0x24, 0xbf, 0x80, 0x52, 0x32, 0x3c,
+ 0x12, 0xe3, 0x10, 0xbf, 0x24, 0xe5, 0xb7, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3e, 0x90, 0x22, 0x87, 0xbf, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x08, 0xc2, 0x53, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+ 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x74, 0x2f, 0xce, 0x3e,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0xca, 0x19, 0x0e, 0x3f, 0xe0, 0x9c, 0xc8, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x80, 0x52, 0x32, 0x3c, 0x40, 0xe7, 0x5e, 0x3d, 0x95, 0xd3, 0x45, 0xbf,
+ 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+ 0x90, 0x52, 0xb2, 0xbd, 0xa8, 0x75, 0x96, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xea, 0xbd, 0x05, 0xbf, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x14, 0xe3, 0x90, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+ 0x08, 0xc2, 0x53, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+ 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x08, 0xc2, 0x53, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0xb2, 0x3e,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x66, 0x2d, 0x27, 0x3f, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xb8, 0x77, 0x3d, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x90, 0x31, 0xf5, 0x3d, 0xa8, 0x75, 0x96, 0x3e, 0x5c, 0x0c, 0xea, 0x3e,
+ 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x30, 0xe7, 0xde, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0xec, 0x9e, 0xef, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x80, 0x31, 0xf5, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+ 0xa8, 0x75, 0x96, 0x3e, 0xc4, 0x79, 0xe4, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+ 0x34, 0xe7, 0xde, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x24, 0xe5, 0xb7, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
+ 0xec, 0xbd, 0x85, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x88, 0x31, 0x75, 0x3e,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x58, 0x0c, 0xea, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x00, 0xbe, 0x05, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
+ 0xec, 0xbd, 0x85, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+ 0x60, 0x0c, 0x6a, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0xc4, 0x79, 0xe4, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x30, 0xe7, 0xde, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0xb8, 0x77, 0xbd, 0x3e,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x56, 0x2b, 0x00, 0x3f,
+ 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x9c, 0x54, 0xd9, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0xe8, 0xbd, 0x85, 0xbe,
+ 0xec, 0xbd, 0x85, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x90, 0x52, 0xb2, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x30, 0xe7, 0x5e, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+ 0x68, 0x2d, 0x27, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x50, 0x8b, 0x3e,
+ 0xe4, 0x9c, 0xc8, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+ 0x9c, 0x54, 0xd9, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x3c, 0x08, 0x9c, 0x3e,
+ 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0x14, 0xe3, 0x90, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0xa8, 0x75, 0x96, 0xbe, 0x58, 0x0c, 0xea, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0xf9, 0xbf, 0x2c, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x31, 0x75, 0xbe,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x80, 0x31, 0xf5, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x90, 0x52, 0x32, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x50, 0x8b, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x5e, 0xac, 0x13, 0xbf, 0x80, 0x52, 0x32, 0xbd,
+ 0x5e, 0xac, 0x13, 0xbf, 0x90, 0x52, 0xb2, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x52, 0x32, 0x3d,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xec, 0xbd, 0x85, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0x18, 0xe3, 0x10, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0xe8, 0xbd, 0x85, 0xbe,
+ 0xe0, 0x9c, 0x48, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+ 0xc4, 0x79, 0xe4, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xec, 0x9e, 0xef, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
+ 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xf9, 0xbf, 0x2c, 0xbf, 0x08, 0xc2, 0xd3, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+ 0xa0, 0x52, 0x32, 0x3d, 0xe8, 0xbd, 0x05, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+ 0x38, 0x08, 0x1c, 0xbe, 0x43, 0x89, 0x2f, 0xbf, 0x88, 0x52, 0x32, 0xbe,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
+ 0x7c, 0x50, 0x8b, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0xec, 0xbd, 0x85, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x12, 0xe3, 0x10, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+ 0x56, 0x2b, 0x80, 0xbf, 0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
+ 0x80, 0x52, 0x32, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+ 0xec, 0x9e, 0xef, 0x3e, 0x68, 0x2d, 0xa7, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+ 0x30, 0xe7, 0x5e, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x64, 0x2d, 0xa7, 0xbe,
+ 0x90, 0x31, 0xf5, 0x3d, 0x20, 0xe5, 0xb7, 0xbe, 0xd8, 0x1b, 0x35, 0xbf,
+ 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+ 0xb4, 0x77, 0xbd, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x90, 0x52, 0x32, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+ 0x80, 0x50, 0x8b, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x54, 0x2b, 0x80, 0xbe,
+ 0x90, 0x31, 0xf5, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+ 0xa8, 0x75, 0x96, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x14, 0xe3, 0x90, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x30, 0xe7, 0xde, 0xbd, 0x56, 0x2b, 0x00, 0xbf, 0x1a, 0x64, 0x24, 0x3f,
+ 0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0x9c, 0x54, 0xd9, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0xfc, 0xbf, 0xac, 0x3e,
+ 0x80, 0x52, 0x32, 0xbc, 0x80, 0x50, 0x8b, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0xe3, 0x10, 0xbe, 0x86, 0xd1, 0x1e, 0x3f, 0x80, 0x52, 0xb2, 0xbc,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+ 0x88, 0x52, 0x32, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0xf2, 0x3e, 0x19, 0x3f, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0xa8, 0x75, 0x96, 0x3e,
+ 0x0c, 0xc2, 0xd3, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x88, 0x31, 0x75, 0x3e,
+ 0x68, 0x2d, 0x27, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x68, 0x2d, 0xa7, 0x3e,
+ 0x80, 0x52, 0x32, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x12, 0xe3, 0x10, 0xbf,
+ 0x30, 0xe7, 0xde, 0x3d, 0x86, 0xd1, 0x1e, 0x3f, 0x88, 0x31, 0x75, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0x34, 0xe7, 0xde, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+ 0x58, 0x2b, 0x80, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
+ 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0x54, 0x2b, 0x80, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x34, 0xe7, 0xde, 0x3e,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x90, 0x52, 0x32, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
+ 0x80, 0x31, 0xf5, 0xbd, 0xea, 0xbd, 0x05, 0xbf, 0x30, 0xe7, 0x5e, 0x3e,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x14, 0xe3, 0x90, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xc4, 0x79, 0xe4, 0x3e, 0xfc, 0xbf, 0xac, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x08, 0xc2, 0x53, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0xbc, 0xa0, 0x52, 0x32, 0x3d,
+ 0xa8, 0x75, 0x96, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x46, 0x89, 0x2f, 0x3f, 0x18, 0xe3, 0x10, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0xc4, 0x79, 0xe4, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
+ 0xa8, 0x75, 0x96, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0xfc, 0xbf, 0xac, 0x3e,
+ 0xa8, 0x75, 0x16, 0xbf, 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x80, 0x31, 0xf5, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0xec, 0xbd, 0x85, 0x3e,
+ 0xf8, 0xbf, 0xac, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+ 0xe0, 0x9c, 0x48, 0x3e, 0xc4, 0x79, 0xe4, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x68, 0x2d, 0x27, 0x3e,
+ 0x40, 0x08, 0x1c, 0x3e, 0x86, 0xd1, 0x1e, 0xbf, 0xea, 0xbd, 0x05, 0xbf,
+ 0xa8, 0x75, 0x96, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0x75, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x30, 0xe7, 0xde, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x54, 0x2b, 0x80, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x08, 0xc2, 0x53, 0xbe,
+ 0xb4, 0x77, 0xbd, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xec, 0x9e, 0xef, 0xbe,
+ 0x58, 0x2b, 0x80, 0x3e, 0x9c, 0x54, 0xd9, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+ 0xe4, 0x9c, 0xc8, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0xea, 0xbd, 0x05, 0xbf, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x18, 0xe3, 0x10, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x12, 0xe3, 0x10, 0x3f, 0x80, 0x50, 0x8b, 0x3e,
+ 0xc4, 0x79, 0xe4, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x40, 0x08, 0x1c, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+ 0x10, 0xe3, 0x10, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xd0, 0x9a, 0xa1, 0x3e,
+ 0x4c, 0x0a, 0xc3, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+ 0x38, 0x08, 0x1c, 0xbe, 0xe7, 0x1d, 0x5c, 0xbf, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x30, 0x08, 0x9c, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0x5e, 0xac, 0x13, 0xbf,
+ 0x18, 0xc4, 0xfa, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0x80, 0x52, 0x32, 0xbc, 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x10, 0x43, 0x67, 0xbf, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0x3d,
+ 0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0x68, 0x2d, 0x27, 0x3e,
+ 0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0xde, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0x3d,
+ 0xf8, 0xbf, 0xac, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x24, 0xe5, 0xb7, 0x3e,
+ 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x0c, 0xc2, 0xd3, 0x3e,
+ 0x80, 0x50, 0x8b, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0xfc, 0xbf, 0xac, 0x3e,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xe4, 0x9c, 0xc8, 0x3e,
+ 0x30, 0x08, 0x9c, 0xbd, 0x95, 0xd3, 0x45, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x80, 0x52, 0x32, 0xbd, 0x86, 0xd1, 0x1e, 0xbf, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x24, 0xe5, 0xb7, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x5c, 0x0c, 0xea, 0x3e,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x7e, 0x50, 0x0b, 0xbf,
+ 0x90, 0x52, 0xb2, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
+ 0xa8, 0x75, 0x96, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x30, 0xe7, 0xde, 0xbd, 0xc5, 0x79, 0x64, 0xbf, 0x08, 0xc2, 0x53, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+ 0x61, 0x8d, 0x7d, 0xbf, 0x34, 0xe7, 0xde, 0x3e, 0xc4, 0x79, 0xe4, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0x43, 0x89, 0x2f, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x88, 0x52, 0x32, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x56, 0x2b, 0x00, 0xbf,
+ 0x12, 0xe3, 0x10, 0xbf, 0x4c, 0x0a, 0xc3, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0x32, 0x3e,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x31, 0xf5, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xc4, 0xfa, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
+ 0x80, 0x31, 0x75, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xa8, 0x75, 0x96, 0x3e,
+ 0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x3c, 0x08, 0x9c, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x3c, 0x08, 0x1c, 0xbf,
+ 0x90, 0x31, 0xf5, 0x3d, 0x90, 0x52, 0xb2, 0x3e, 0x65, 0x2d, 0x27, 0xbf,
+ 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0x3c, 0x08, 0x9c, 0x3e,
+ 0xec, 0xbd, 0x85, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x3c, 0x08, 0x9c, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xb4, 0x77, 0xbd, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0xa8, 0x75, 0x16, 0xbf, 0x88, 0x52, 0x32, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x12, 0xe3, 0x10, 0xbf, 0x90, 0x31, 0xf5, 0x3d,
+ 0xb8, 0x77, 0x3d, 0xbe, 0xa4, 0xd5, 0x6c, 0xbf, 0x86, 0xd1, 0x1e, 0x3f,
+ 0xec, 0x9e, 0xef, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
+ 0x90, 0x22, 0x87, 0xbf, 0x68, 0x2d, 0x27, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
+ 0xf8, 0xbf, 0xac, 0xbe, 0x43, 0x89, 0x2f, 0xbf, 0x18, 0xe3, 0x10, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xe4, 0x9c, 0xc8, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0x58, 0x2b, 0x80, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x18, 0xe3, 0x10, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x40, 0x08, 0x9c, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+ 0x8d, 0x52, 0x32, 0xbf, 0x88, 0x52, 0x32, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x68, 0x2d, 0xa7, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x52, 0x32, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x90, 0x52, 0xb2, 0x3e,
+ 0x18, 0xc4, 0xfa, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0xec, 0x9e, 0xef, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xec, 0x9e, 0xef, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x20, 0xe5, 0xb7, 0xbe, 0x61, 0x8d, 0x7d, 0xbf,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x24, 0xe5, 0xb7, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x30, 0x08, 0x9c, 0xbd, 0x56, 0x2b, 0x00, 0x3f, 0xfc, 0xbf, 0xac, 0x3e,
+ 0xb8, 0x77, 0x3d, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0xb2, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xfc, 0xbf, 0xac, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x14, 0xe3, 0x90, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
+ 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0xea, 0xbd, 0x05, 0x3f, 0x90, 0x31, 0xf5, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+ 0x9c, 0x54, 0xd9, 0x3e, 0x9c, 0x54, 0xd9, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+ 0xf8, 0xbf, 0xac, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+ 0x80, 0x52, 0x32, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x56, 0x2b, 0x00, 0x3f,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+ 0x54, 0x2b, 0x80, 0xbe, 0x7e, 0x50, 0x0b, 0xbf, 0x40, 0x08, 0x1c, 0x3e,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x65, 0x2d, 0x27, 0xbf, 0x58, 0x2b, 0x80, 0x3e,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+ 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x68, 0x2d, 0x27, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+ 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
+ 0xf9, 0xbf, 0x2c, 0xbf, 0x74, 0x2f, 0xce, 0x3e, 0x08, 0xc2, 0x53, 0x3e,
+ 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x9c, 0x54, 0xd9, 0xbe, 0x34, 0x87, 0x08, 0xbf,
+ 0x14, 0xe3, 0x90, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xc8, 0x19, 0x0e, 0xbf, 0x80, 0x50, 0x8b, 0x3e,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+ 0x80, 0x31, 0x75, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x7b, 0xb0, 0x61, 0xbf,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+ 0xec, 0xbd, 0x85, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+ 0xa0, 0x52, 0x32, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x31, 0xf5, 0xbd,
+ 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xb4, 0x77, 0xbd, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbd, 0x7e, 0x50, 0x0b, 0xbf, 0x90, 0x52, 0x32, 0x3e,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0xa0, 0xf4, 0x82, 0xbf,
+ 0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0x80, 0x52, 0xb2, 0xbc, 0x08, 0xc2, 0xd3, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x34, 0x87, 0x08, 0xbf,
+ 0x08, 0xc2, 0x53, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0xe5, 0xb7, 0xbe,
+ 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+ 0x18, 0xe3, 0x10, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x80, 0x52, 0x32, 0xbc, 0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x88, 0x52, 0x32, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+ 0x30, 0xe7, 0xde, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0x54, 0x2b, 0x80, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x00, 0x41, 0x40, 0xbf,
+ 0x6c, 0xae, 0x3a, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x52, 0x32, 0x3d,
+ 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+ 0xa8, 0x75, 0x96, 0xbe, 0x18, 0xc4, 0xfa, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x68, 0x2d, 0x27, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xc4, 0x79, 0xe4, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x3c, 0x08, 0x9c, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x3c, 0x08, 0x1c, 0xbf, 0xec, 0xbd, 0x85, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x60, 0x2d, 0x27, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x00, 0xbe, 0x05, 0x3d,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0xd0, 0x9a, 0x21, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x75, 0x96, 0xbe,
+ 0x80, 0x31, 0x75, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0xe4, 0x9c, 0xc8, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x60, 0x2d, 0x27, 0xbe, 0xf2, 0x3e, 0x19, 0xbf, 0xa8, 0x75, 0x96, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+ 0x80, 0x31, 0x75, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xf8, 0xbf, 0xac, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+ 0x08, 0xc2, 0x53, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+ 0x10, 0xe3, 0x10, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0xbe, 0x05, 0x3d,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
+ 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x60, 0x2d, 0x27, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x80, 0x31, 0xf5, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
+ 0x38, 0x08, 0x1c, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x88, 0x31, 0x75, 0x3e,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+ 0x20, 0xe5, 0xb7, 0xbe, 0xa0, 0xf4, 0x82, 0xbf, 0x64, 0x2d, 0xa7, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0x48, 0xbe, 0x34, 0xe7, 0xde, 0x3e,
+ 0x30, 0x08, 0x9c, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x83, 0x31, 0x75, 0xbf, 0x40, 0x08, 0x9c, 0x3d,
+ 0x34, 0x87, 0x08, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x30, 0x08, 0x9c, 0xbd, 0xd0, 0x9a, 0xa1, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+ 0x3c, 0x08, 0x9c, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
+ 0xaf, 0xf6, 0x29, 0xbf, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+ 0x80, 0x50, 0x8b, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0xc8, 0x3d, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0xf0, 0xbd, 0x85, 0x3d, 0x18, 0xc4, 0xfa, 0xbe,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
+ 0x88, 0x31, 0x75, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x08, 0xc2, 0xd3, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0xb2, 0xbc, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x90, 0x31, 0xf5, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+ 0x65, 0x2d, 0x27, 0xbf, 0xe0, 0x9c, 0x48, 0x3e, 0xb4, 0x77, 0xbd, 0xbe,
+ 0x90, 0x31, 0xf5, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x90, 0x31, 0xf5, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+ 0x60, 0x0c, 0x6a, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0xf8, 0xbf, 0xac, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x68, 0x2d, 0x27, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x3c, 0x08, 0x1c, 0xbf,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x40, 0x08, 0x9c, 0x3d, 0x43, 0x89, 0x2f, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xb8, 0x77, 0xbd, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0x14, 0xe3, 0x90, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0x30, 0xe7, 0xde, 0xbd, 0xd0, 0x9a, 0x21, 0xbf, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xa8, 0x75, 0x16, 0xbf,
+ 0x90, 0x52, 0xb2, 0x3d, 0x00, 0x41, 0x40, 0xbf, 0x38, 0x08, 0x1c, 0xbe,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+ 0x68, 0x2d, 0x27, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0xb2, 0xbc,
+ 0x4c, 0x0a, 0xc3, 0x3e, 0x08, 0xc2, 0xd3, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0x48, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x5c, 0x0c, 0xea, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e,
+ 0x80, 0x52, 0x32, 0x3c, 0xa0, 0x52, 0x32, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xec, 0xbd, 0x85, 0x3e,
+ 0xa0, 0x52, 0x32, 0x3d, 0xea, 0xbd, 0x05, 0xbf, 0x24, 0xe5, 0xb7, 0x3e,
+ 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0x3c, 0xec, 0xbd, 0x85, 0x3e,
+ 0x14, 0xe3, 0x90, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x1c, 0xc4, 0xfa, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+ 0x08, 0xc2, 0x53, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0x5e, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0xf9, 0xbf, 0x2c, 0xbf,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x38, 0x08, 0x1c, 0xbe, 0x5c, 0x0c, 0xea, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xa8, 0x75, 0x96, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xe4, 0x9c, 0xc8, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+ 0x90, 0x52, 0x32, 0x3e, 0x8c, 0x52, 0xb2, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+ 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x7e, 0x50, 0x0b, 0xbf,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xe8, 0xbd, 0x05, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0xbc, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x08, 0xc2, 0x53, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+ 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0x3d,
+ 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x74, 0x2f, 0xce, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+ 0x14, 0xe3, 0x90, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x56, 0x2b, 0x00, 0xbf,
+ 0x40, 0x08, 0x9c, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x90, 0x31, 0xf5, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
+ 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x88, 0x31, 0x75, 0x3e,
+ 0x80, 0x52, 0x32, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+ 0x74, 0x2f, 0xce, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0x86, 0xd1, 0x1e, 0xbf, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x74, 0x2f, 0xce, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0x3e,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xa0, 0xf4, 0x02, 0xbf, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xe0, 0x9c, 0x48, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+ 0x74, 0x2f, 0xce, 0x3e, 0x9c, 0x54, 0xd9, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
+ 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0xc8, 0x19, 0x0e, 0xbf,
+ 0x14, 0xe3, 0x90, 0xbe, 0x84, 0x31, 0xf5, 0x3e, 0x74, 0x2f, 0xce, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0xb2, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x34, 0xe7, 0xde, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+ 0x88, 0x31, 0x75, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0xec, 0x9e, 0xef, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0xf9, 0xbf, 0x2c, 0xbf, 0x80, 0x52, 0x32, 0xbc,
+ 0xd0, 0x9a, 0x21, 0xbf, 0x4c, 0x0a, 0xc3, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0xd3, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x80, 0x31, 0x75, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x18, 0xc4, 0xfa, 0xbe, 0x9c, 0x54, 0x59, 0xbf, 0x22, 0xe5, 0x37, 0xbf,
+ 0x3c, 0x08, 0x1c, 0xbf, 0x9c, 0x54, 0xd9, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0x17, 0xc4, 0x7a, 0xbf, 0xb8, 0x77, 0xbd, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
+ 0x88, 0x31, 0x75, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xa8, 0x75, 0x96, 0x3e,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x34, 0xe7, 0xde, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
+ 0xa8, 0x75, 0x96, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+ 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x9c, 0x54, 0x59, 0xbf,
+ 0x14, 0xe3, 0x90, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x0c, 0xc2, 0xd3, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+ 0x68, 0x2d, 0x27, 0x3e, 0x58, 0x0c, 0xea, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x14, 0xe3, 0x90, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0xc8, 0x19, 0x0e, 0xbf,
+ 0x88, 0x31, 0x75, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0xb4, 0x77, 0xbd, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x9c, 0x54, 0xd9, 0x3e,
+ 0x90, 0x52, 0xb2, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x58, 0x0c, 0xea, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0x88, 0x31, 0x75, 0x3e, 0x5c, 0x0c, 0xea, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x4b, 0x0a, 0x43, 0xbf,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0x3c,
+ 0xb4, 0x77, 0xbd, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x3c, 0x08, 0x1c, 0xbf,
+ 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x86, 0xd1, 0x1e, 0x3f, 0x83, 0x31, 0x75, 0xbf, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0xd0, 0x9a, 0x21, 0xbf,
+ 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x34, 0x87, 0x08, 0xbf,
+ 0x80, 0x52, 0x32, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x31, 0xf5, 0xbd,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0xb2, 0x3e,
+ 0x7e, 0x50, 0x0b, 0xbf, 0x80, 0x52, 0x32, 0xbd, 0xf8, 0xbf, 0xac, 0xbe,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+ 0x60, 0x2d, 0x27, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x80, 0x52, 0xb2, 0xbc, 0xaf, 0xf6, 0x29, 0xbf, 0x80, 0x31, 0xf5, 0xbd,
+ 0xa8, 0x75, 0x16, 0xbf, 0x80, 0x50, 0x8b, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+ 0x14, 0xe3, 0x90, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+ 0x30, 0xe7, 0xde, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x64, 0x2d, 0xa7, 0xbe,
+ 0xf2, 0x3e, 0x19, 0x3f, 0x30, 0xe7, 0x5e, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x52, 0x8b, 0x56, 0xbf, 0x3c, 0x08, 0x9c, 0xbe,
+ 0xd8, 0x1b, 0x35, 0xbf, 0xee, 0x9e, 0x6f, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
+ 0x88, 0x52, 0x32, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0xaf, 0xf6, 0x29, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x54, 0x2b, 0x80, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x3c, 0x08, 0x9c, 0x3e,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x36, 0x87, 0x08, 0x3f,
+ 0x80, 0x50, 0x8b, 0x3e, 0x4b, 0x0a, 0x43, 0xbf, 0xfc, 0xbf, 0xac, 0x3e,
+ 0x80, 0x52, 0x32, 0xbc, 0x7e, 0x50, 0x0b, 0xbf, 0x18, 0xc4, 0xfa, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x31, 0x75, 0x3e,
+ 0x08, 0xc2, 0x53, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0x90, 0x52, 0xb2, 0x3e,
+ 0x80, 0x52, 0x32, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xec, 0xbd, 0x85, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0xb8, 0x77, 0xbd, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
+ 0x90, 0x52, 0xb2, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
+ 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xa0, 0x52, 0x32, 0x3d,
+ 0x90, 0x52, 0x32, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x31, 0x75, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x74, 0x2f, 0xce, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x5a, 0x0c, 0x6a, 0xbf,
+ 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+ 0xa0, 0xf4, 0x02, 0xbf, 0x80, 0x52, 0xb2, 0xbc, 0x12, 0xe3, 0x10, 0xbf,
+ 0x40, 0x08, 0x1c, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x64, 0x2d, 0xa7, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0x80, 0x52, 0x32, 0xbc, 0x7c, 0x50, 0x8b, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x18, 0xc4, 0xfa, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0x80, 0x52, 0x32, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0xae, 0xf6, 0x29, 0x3f,
+ 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x68, 0x2d, 0x27, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0x4c, 0xda, 0x97, 0xbf,
+ 0x54, 0x2b, 0x80, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x74, 0x2f, 0xce, 0x3e,
+ 0x80, 0x50, 0x8b, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0xfb, 0x8f, 0x81, 0xbf,
+ 0xec, 0xbd, 0x85, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x74, 0x2f, 0xce, 0xbe, 0xc8, 0x19, 0x0e, 0xbf, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+ 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+ 0xf2, 0x3e, 0x19, 0x3f, 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0xbd,
+ 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0xb2, 0xbc,
+ 0x18, 0xe3, 0x10, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0x08, 0xc2, 0xd3, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
+ 0x60, 0x0c, 0x6a, 0x3e, 0xfc, 0xbf, 0xac, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x68, 0x2d, 0xa7, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x08, 0xc2, 0x53, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x24, 0xe5, 0xb7, 0x3e, 0x22, 0xe5, 0x37, 0xbf, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0x40, 0x08, 0x9c, 0x3d, 0x8c, 0x52, 0xb2, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+ 0x20, 0xe5, 0xb7, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x56, 0x2b, 0x00, 0xbf, 0x80, 0x52, 0x32, 0xbd,
+ 0x4c, 0x0a, 0xc3, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
+ 0x3c, 0x08, 0x9c, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0xb4, 0x77, 0xbd, 0xbe,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xa8, 0x75, 0x96, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x08, 0xc2, 0xd3, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xa0, 0x52, 0x32, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+ 0x40, 0x08, 0x9c, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+ 0x88, 0x52, 0x32, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+ 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+ 0x68, 0x2d, 0x27, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x18, 0xe3, 0x10, 0x3e,
+ 0x40, 0x08, 0x1c, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x80, 0x52, 0x32, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0x3c, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0xb2, 0x3d,
+ 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0xbe, 0x05, 0x3d,
+ 0x80, 0x52, 0xb2, 0xbc, 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0x3d,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x30, 0xe7, 0xde, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+ 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+ 0x60, 0x2d, 0x27, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x56, 0x2b, 0x00, 0x3f, 0xa0, 0x52, 0x32, 0x3d,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x86, 0xd1, 0x1e, 0x3f, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+ 0x60, 0x0c, 0x6a, 0x3e, 0xec, 0xbd, 0x85, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0x24, 0xe5, 0xb7, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x74, 0x2f, 0xce, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x10, 0xe3, 0x10, 0xbe,
+ 0x58, 0x0c, 0xea, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0xa0, 0x52, 0x32, 0x3d,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+ 0x80, 0x52, 0x32, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x80, 0x31, 0xf5, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+ 0x84, 0x31, 0xf5, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0xe8, 0xbd, 0x85, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0x48, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x68, 0x2d, 0x27, 0x3e, 0x20, 0xe5, 0xb7, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0xb2, 0xbc, 0x10, 0xe3, 0x10, 0xbe,
+ 0x5e, 0xac, 0x13, 0x3f, 0xe8, 0xbd, 0x05, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
+ 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+ 0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+ 0x90, 0x52, 0xb2, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x40, 0x08, 0x9c, 0x3d,
+ 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0xde, 0xbe,
+ 0x58, 0x2b, 0x80, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+ 0x6c, 0xae, 0x3a, 0xbf, 0xe8, 0xbd, 0x05, 0xbe, 0x30, 0xe7, 0xde, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x90, 0x52, 0xb2, 0xbd, 0x86, 0xd1, 0x1e, 0xbf, 0x5c, 0x0c, 0xea, 0x3e,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x38, 0x08, 0x1c, 0xbe, 0x29, 0x66, 0x4b, 0xbf, 0x68, 0x2d, 0xa7, 0x3e,
+ 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0x4c, 0x0a, 0xc3, 0xbe, 0x86, 0xd1, 0x1e, 0xbf,
+ 0x4b, 0x0a, 0x43, 0xbf, 0x86, 0xd1, 0x1e, 0xbf, 0xb8, 0x77, 0x3d, 0x3e,
+ 0xc9, 0x19, 0x8e, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+ 0xb4, 0x77, 0xbd, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x88, 0x52, 0x32, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x8d, 0x52, 0x32, 0xbf,
+ 0x80, 0x31, 0x75, 0xbe, 0xc4, 0x79, 0xe4, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0xf2, 0x3e, 0x19, 0xbf,
+ 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xa8, 0x75, 0x96, 0x3e, 0xb6, 0x77, 0x3d, 0xbf,
+ 0x68, 0x2d, 0xa7, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0xb4, 0x77, 0xbd, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0x30, 0xe7, 0xde, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x56, 0x2b, 0x00, 0x3f, 0x7e, 0x50, 0x0b, 0xbf, 0x60, 0x2d, 0x27, 0xbe,
+ 0x80, 0x50, 0x8b, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x24, 0xe5, 0xb7, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+ 0xa8, 0x75, 0x96, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x5c, 0x0c, 0xea, 0x3e, 0x56, 0x2b, 0x80, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+ 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x86, 0xd1, 0x1e, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x90, 0x52, 0xb2, 0x3d, 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+ 0x31, 0xe7, 0x5e, 0xbf, 0x64, 0x2d, 0xa7, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+ 0xaf, 0xf6, 0x29, 0xbf, 0x40, 0x08, 0x9c, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+ 0x90, 0x52, 0x32, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x30, 0xe7, 0xde, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x8d, 0x52, 0x32, 0xbf, 0xea, 0xbd, 0x05, 0xbf,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
+ 0x08, 0xc2, 0x53, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+ 0x54, 0x2b, 0x80, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x54, 0x5b, 0xab, 0xbf,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xf9, 0xbf, 0x2c, 0xbf, 0x52, 0x8b, 0x56, 0xbf,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0xbd, 0xec, 0x9e, 0xef, 0x3e,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0xa0, 0xf4, 0x02, 0xbf,
+ 0x19, 0x94, 0xcf, 0xbf, 0xe8, 0xbd, 0x85, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x14, 0xe3, 0x90, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x24, 0xb5, 0x8c, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0xa8, 0x75, 0x96, 0xbe,
+ 0x83, 0x31, 0x75, 0xbf, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x56, 0x2b, 0x80, 0xbf, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x50, 0x8b, 0x3e,
+ 0x84, 0x31, 0xf5, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xc7, 0x49, 0xb9, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x12, 0xe3, 0x10, 0xbf, 0x18, 0xe3, 0x10, 0x3e,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x12, 0xe3, 0x10, 0xbf, 0x7e, 0x50, 0x0b, 0xbf,
+ 0x24, 0xe5, 0xb7, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
+ 0x08, 0xc2, 0xd3, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0xfc, 0xbf, 0xac, 0x3e,
+ 0x6c, 0xae, 0x3a, 0xbf, 0x74, 0x2f, 0xce, 0xbe, 0xd8, 0x1b, 0x35, 0xbf,
+ 0x40, 0x08, 0x9c, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x3c, 0x08, 0x1c, 0xbf,
+ 0x3c, 0x08, 0x9c, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+ 0xd0, 0x9a, 0xa1, 0xbf, 0xec, 0xbd, 0x85, 0x3e, 0x01, 0x41, 0xc0, 0xbf,
+ 0x80, 0x52, 0x32, 0x3c, 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xfc, 0xbf, 0xac, 0x3e, 0x34, 0x87, 0x08, 0xbf,
+ 0xd8, 0x1b, 0x35, 0xbf, 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x80, 0x31, 0xf5, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0xfc, 0xbf, 0xac, 0x3e,
+ 0xa8, 0x75, 0x96, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0x80, 0x52, 0x32, 0x3c, 0x20, 0xe5, 0xb7, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xc5, 0x79, 0x64, 0xbf, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x41, 0x40, 0xbf,
+ 0xa0, 0x52, 0x32, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xb6, 0x77, 0x3d, 0xbf,
+ 0x80, 0x31, 0x75, 0xbe, 0x58, 0x0c, 0xea, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xc4, 0x79, 0xe4, 0x3e, 0x33, 0xb7, 0xb3, 0xbf, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xa8, 0x75, 0x96, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x56, 0x2b, 0x00, 0xbf, 0x52, 0x8b, 0x56, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0x02, 0x11, 0x95, 0xbf,
+ 0x24, 0xe5, 0xb7, 0x3e, 0xfb, 0x8f, 0x81, 0xbf, 0x58, 0x2b, 0x80, 0x3e,
+ 0xfc, 0xbf, 0xac, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x2d, 0x27, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x60, 0x0c, 0x6a, 0x3e,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0xc8, 0x3d, 0xd0, 0x9a, 0xa1, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0x5e, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+ 0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x52, 0xb2, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x30, 0xe7, 0xde, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x88, 0x52, 0x32, 0xbe,
+ 0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0x00, 0x00, 0x00, 0x00, 0x54, 0x2b, 0x80, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x18, 0xe3, 0x10, 0x3e,
+ 0x88, 0x52, 0x32, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xa8, 0x75, 0x96, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0xc2, 0x53, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x31, 0x75, 0x3e,
+ 0x10, 0xe3, 0x10, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xf0, 0xbd, 0x05, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0x18, 0xe3, 0x10, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+ 0x58, 0x2b, 0x80, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+ 0xb8, 0x77, 0xbd, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e,
+ 0xa8, 0x75, 0x96, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0xbd,
+ 0x68, 0x2d, 0x27, 0x3e, 0xa0, 0xf4, 0x02, 0xbf, 0x90, 0x31, 0xf5, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
+ 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x50, 0x8b, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+ 0x60, 0x2d, 0x27, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x40, 0x08, 0x9c, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0xa0, 0x52, 0x32, 0x3d,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xe4, 0x9c, 0xc8, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+ 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x00, 0xbe, 0x05, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+ 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+ 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0xbd,
+ 0x40, 0x08, 0x1c, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x52, 0x32, 0xbd,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0x30, 0x08, 0x9c, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0x08, 0x9c, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x05, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+ 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
+ 0x30, 0xe7, 0xde, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0x3d,
+ 0x30, 0x08, 0x9c, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+ 0x00, 0xbe, 0x05, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x84, 0x31, 0xf5, 0xbe,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x22, 0xe5, 0x37, 0xbf, 0xb6, 0x77, 0x3d, 0xbf,
+ 0x30, 0xe7, 0xde, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x84, 0x31, 0xf5, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xa8, 0x75, 0x96, 0x3e, 0x84, 0x31, 0xf5, 0x3e,
+ 0xec, 0x9e, 0xef, 0xbe, 0xb8, 0x77, 0xbd, 0x3e, 0x4b, 0x0a, 0x43, 0xbf,
+ 0x14, 0xe3, 0x90, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x34, 0x87, 0x08, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
+ 0x80, 0x50, 0x8b, 0x3e, 0x86, 0xd1, 0x1e, 0xbf, 0x34, 0xe7, 0xde, 0x3e,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xec, 0x9e, 0xef, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x0c, 0xc2, 0xd3, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x14, 0xe3, 0x90, 0xbe,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
+ 0xf8, 0xbf, 0xac, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+ 0xec, 0x9e, 0xef, 0xbe, 0x84, 0x31, 0xf5, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x56, 0x2b, 0x00, 0x3f, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xa0, 0x52, 0x32, 0x3d, 0x74, 0x2f, 0xce, 0xbe,
+ 0x8c, 0x52, 0xb2, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x7e, 0x50, 0x0b, 0xbf, 0x90, 0x52, 0xb2, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0xa8, 0x75, 0x16, 0xbf,
+ 0x3c, 0x08, 0x1c, 0xbf, 0xbe, 0xf8, 0x50, 0xbf, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x8d, 0x52, 0x32, 0xbf, 0x3c, 0x08, 0x1c, 0xbf, 0x10, 0xe3, 0x10, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x56, 0x2b, 0x00, 0xbf, 0x3e, 0x08, 0x1c, 0x3f,
+ 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+ 0x14, 0xe3, 0x90, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0xe4, 0x9c, 0xc8, 0x3e,
+ 0x58, 0x0c, 0xea, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+ 0x5c, 0x0c, 0xea, 0x3e, 0x9c, 0x54, 0xd9, 0xbe, 0x12, 0xe3, 0x10, 0x3f,
+ 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x9e, 0x54, 0x59, 0x3f,
+ 0x60, 0x2d, 0x27, 0xbe, 0x1a, 0x64, 0x24, 0xbf, 0x24, 0xe5, 0xb7, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x50, 0x8b, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x86, 0xd1, 0x1e, 0xbf, 0xe4, 0x9c, 0xc8, 0x3e,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x3c, 0x08, 0x9c, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
+ 0x5e, 0xac, 0x13, 0xbf, 0xec, 0x9e, 0xef, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x68, 0x2d, 0x27, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x00, 0xbe, 0x05, 0x3d, 0xe8, 0xbd, 0x85, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xb4, 0x77, 0xbd, 0xbe,
+ 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x31, 0x75, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0x48, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x14, 0xe3, 0x90, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x31, 0xf5, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0x3c, 0x08, 0x9c, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+ 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x31, 0x75, 0xbe,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x80, 0x31, 0xf5, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x52, 0x32, 0x3c, 0x68, 0x2d, 0x27, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x80, 0x52, 0x32, 0x3c, 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
+ 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+ 0x90, 0x52, 0xb2, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x30, 0x08, 0x9c, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x40, 0x08, 0x1c, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x60, 0x0c, 0x6a, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x50, 0x8b, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+ 0x88, 0x31, 0x75, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+ 0x80, 0x52, 0xb2, 0xbc, 0xa8, 0x75, 0x16, 0xbf, 0x80, 0x52, 0x32, 0x3c,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+ 0x8c, 0x52, 0xb2, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0x19, 0x0e, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+ 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0x74, 0x2f, 0xce, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0x3c,
+ 0x80, 0x52, 0x32, 0xbd, 0x88, 0x31, 0x75, 0x3e, 0x58, 0x0c, 0xea, 0xbe,
+ 0xea, 0xbd, 0x05, 0xbf, 0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+ 0xec, 0xbd, 0x85, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x9c, 0x3d,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
+ 0xb8, 0x77, 0x3d, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+ 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0x3c,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+ 0xec, 0xbd, 0x85, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0x14, 0xe3, 0x90, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+ 0x08, 0xc2, 0x53, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0x7e, 0x50, 0x0b, 0xbf, 0x60, 0x2d, 0x27, 0xbe,
+ 0xa8, 0x75, 0x16, 0xbf, 0xe8, 0xbd, 0x85, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x74, 0x2f, 0xce, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0x08, 0xc2, 0x53, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x9c, 0x54, 0xd9, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0x30, 0xe7, 0xde, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0x61, 0x8d, 0x7d, 0xbf,
+ 0xe8, 0xbd, 0x85, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x80, 0x31, 0x75, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0xd0, 0x9a, 0x21, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x3c, 0x08, 0x9c, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xea, 0xbd, 0x05, 0xbf,
+ 0x90, 0x52, 0xb2, 0xbd, 0x9c, 0x54, 0x59, 0xbf, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x90, 0x52, 0xb2, 0x3d, 0x3c, 0x08, 0x9c, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+ 0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x50, 0x8b, 0x3e,
+ 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x90, 0x31, 0xf5, 0x3d, 0xe8, 0xbd, 0x85, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+ 0x38, 0x08, 0x1c, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xa8, 0x75, 0x96, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+ 0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+ 0x3c, 0x08, 0x9c, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0xd8, 0x1b, 0x35, 0xbf, 0x40, 0xe7, 0x5e, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
+ 0xec, 0xbd, 0x85, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+ 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0xbe,
+ 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xcd, 0xfa, 0x77, 0xbf,
+ 0x80, 0x52, 0x32, 0x3c, 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x30, 0xe7, 0xde, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+ 0x80, 0x31, 0xf5, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0xf0, 0xbd, 0x85, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x4b, 0x0a, 0x43, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x74, 0x2f, 0xce, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x64, 0x2d, 0xa7, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x84, 0x31, 0xf5, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x58, 0x2b, 0x80, 0x3e, 0x68, 0x2d, 0xa7, 0x3e, 0xa8, 0x75, 0x16, 0xbf,
+ 0x68, 0x2d, 0xa7, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+ 0x36, 0x87, 0x08, 0x3f, 0x3c, 0x08, 0x9c, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+ 0x8d, 0x52, 0x32, 0xbf, 0xec, 0x9e, 0xef, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0xa4, 0xd5, 0x6c, 0xbf, 0x00, 0xbe, 0x05, 0x3d, 0x7e, 0x50, 0x0b, 0xbf,
+ 0xea, 0xbd, 0x05, 0x3f, 0x40, 0x08, 0x1c, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x56, 0x2b, 0x00, 0xbf,
+ 0x46, 0x89, 0x2f, 0x3f, 0xea, 0xbd, 0x85, 0xbf, 0x56, 0x2b, 0x80, 0xbf,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x6c, 0xae, 0x3a, 0xbf, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x58, 0x0c, 0xea, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x22, 0xe5, 0x37, 0xbf, 0x54, 0x2b, 0x80, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x12, 0xe3, 0x10, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
+ 0x88, 0x31, 0x75, 0x3e, 0x7b, 0xb0, 0x61, 0xbf, 0x40, 0x08, 0x9c, 0x3d,
+ 0x61, 0x8d, 0x7d, 0xbf, 0x38, 0x68, 0x72, 0xbf, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x31, 0x75, 0xbe,
+ 0xa4, 0xd5, 0x6c, 0xbf, 0x66, 0x2d, 0x27, 0x3f, 0xdf, 0x9c, 0x48, 0xbf,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+ 0x6e, 0xae, 0x3a, 0x3f, 0x24, 0xe5, 0xb7, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
+ 0x4c, 0x0a, 0xc3, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xaf, 0xf6, 0x29, 0xbf,
+ 0x12, 0xe3, 0x10, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
+ 0x65, 0x2d, 0x27, 0xbf, 0x76, 0xff, 0xa2, 0xbf, 0x38, 0x08, 0x1c, 0xbe,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+ 0x90, 0x52, 0x32, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x80, 0x52, 0x32, 0x3c, 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x36, 0x87, 0x08, 0x3f, 0xc4, 0x79, 0xe4, 0x3e, 0x14, 0xe3, 0x90, 0xbe,
+ 0x90, 0x52, 0xb2, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x46, 0x89, 0x2f, 0x3f, 0xe4, 0x9c, 0xc8, 0x3e,
+ 0xf8, 0xbf, 0xac, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+ 0xd8, 0x1b, 0x35, 0xbf, 0x90, 0x22, 0x87, 0xbf, 0x64, 0x2d, 0xa7, 0xbe,
+ 0x3c, 0x08, 0x1c, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0x84, 0x31, 0xf5, 0xbe,
+ 0xec, 0xbd, 0x85, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x34, 0x87, 0x08, 0xbf,
+ 0x34, 0x87, 0x88, 0xbf, 0x08, 0xc2, 0x53, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0x56, 0x2b, 0x00, 0xbf, 0x7e, 0x50, 0x0b, 0xbf, 0xf2, 0x3e, 0x19, 0xbf,
+ 0x08, 0xc2, 0x53, 0x3e, 0x8c, 0x52, 0xb2, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+ 0xd0, 0x9a, 0x21, 0xbf, 0x68, 0x2d, 0x27, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0x24, 0xb5, 0x8c, 0xbf, 0xdf, 0x9c, 0x48, 0xbf,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0xbc,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e,
+ 0x38, 0x08, 0x1c, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0x9c, 0x54, 0xd9, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x58, 0x0c, 0xea, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+ 0xec, 0xbd, 0x85, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+ 0x08, 0xc2, 0x53, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0xa0, 0x52, 0x32, 0x3d, 0x9c, 0x54, 0xd9, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xf8, 0xbf, 0xac, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0xa0, 0x52, 0x32, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x61, 0x8d, 0x7d, 0xbf, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+ 0x65, 0x2d, 0x27, 0xbf, 0xf0, 0xbd, 0x85, 0x3d, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x80, 0x50, 0x8b, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0x48, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0xe7, 0x1d, 0x5c, 0xbf,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0xb2, 0xbd,
+ 0xe0, 0x9c, 0x48, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x88, 0x31, 0x75, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
+ 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+ 0x24, 0xe5, 0xb7, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x84, 0x31, 0xf5, 0xbe,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x30, 0x08, 0x9c, 0xbd,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+ 0x90, 0x31, 0xf5, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xf8, 0xbf, 0xac, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x40, 0x08, 0x1c, 0x3e, 0x5e, 0xac, 0x13, 0xbf, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xc8, 0x19, 0x0e, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d, 0x7e, 0x50, 0x0b, 0xbf,
+ 0x54, 0x2b, 0x80, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
+ 0xe0, 0x9c, 0x48, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x00, 0xbe, 0x05, 0x3d, 0x08, 0xc2, 0xd3, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x80, 0x52, 0x32, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0x3c,
+ 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x7c, 0x50, 0x8b, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+ 0x7c, 0x50, 0x8b, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0x00, 0x00, 0x00,
+ 0x90, 0x52, 0x32, 0x3e, 0x68, 0x2d, 0xa7, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
+ 0xe0, 0x9c, 0x48, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x08, 0xc2, 0x53, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+ 0x54, 0x2b, 0x80, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x7e, 0x50, 0x0b, 0xbf,
+ 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x88, 0x31, 0x75, 0x3e,
+ 0x18, 0xc4, 0xfa, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+ 0x30, 0xe7, 0xde, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+ 0x86, 0xd1, 0x1e, 0xbf, 0x4c, 0x0a, 0xc3, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+ 0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0x00, 0xbe, 0x05, 0x3d, 0x56, 0x2b, 0x00, 0x3f, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x34, 0x87, 0x08, 0xbf, 0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0x53, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0x56, 0x2b, 0x00, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0x88, 0x52, 0x32, 0xbe,
+ 0x7e, 0x50, 0x0b, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0x68, 0x2d, 0x27, 0x3e,
+ 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xfc, 0xbf, 0xac, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+ 0x30, 0x08, 0x9c, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+ 0x3c, 0x08, 0x1c, 0xbf, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
+ 0x90, 0x52, 0xb2, 0xbd, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0x40, 0x08, 0x9c, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+ 0xa8, 0x75, 0x96, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x05, 0x3d,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xa8, 0x75, 0x16, 0xbf,
+ 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x65, 0x2d, 0x27, 0xbf, 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0x3c,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x43, 0x89, 0x2f, 0xbf, 0x20, 0xe7, 0x5e, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0x3d, 0x64, 0x2d, 0xa7, 0xbe,
+ 0xec, 0x9e, 0xef, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0xec, 0xbd, 0x85, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe, 0x17, 0xc4, 0x7a, 0xbf,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0xb2, 0x3e,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0xc8, 0x19, 0x0e, 0xbf,
+ 0xa0, 0x52, 0x32, 0x3d, 0x12, 0xe3, 0x10, 0xbf, 0x40, 0x08, 0x1c, 0x3e,
+ 0x08, 0xc2, 0x53, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0xa2, 0xf4, 0x02, 0x3f, 0x30, 0xe7, 0xde, 0xbd,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x29, 0x66, 0x4b, 0xbf, 0x00, 0xbe, 0x05, 0x3d,
+ 0x08, 0xc2, 0x53, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0xc4, 0x79, 0xe4, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x30, 0xe7, 0xde, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x9c, 0x54, 0x59, 0xbf,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+ 0xa0, 0x52, 0x32, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
+ 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x3c, 0x08, 0x9c, 0x3e,
+ 0x20, 0xe5, 0xb7, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x14, 0xe3, 0x90, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+ 0x38, 0x08, 0x1c, 0xbe, 0x1a, 0x64, 0x24, 0xbf, 0x80, 0x52, 0x32, 0xbd,
+ 0xa8, 0x75, 0x16, 0xbf, 0x80, 0x52, 0x32, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x88, 0x31, 0x75, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0x00, 0x00, 0x00, 0x00, 0x30, 0x08, 0x9c, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x30, 0x08, 0x9c, 0xbd, 0xea, 0xbd, 0x05, 0xbf,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x58, 0x0c, 0xea, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x7e, 0x50, 0x0b, 0xbf, 0x86, 0xd1, 0x1e, 0x3f, 0x88, 0x31, 0x75, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x31, 0x75, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x38, 0x08, 0x1c, 0xbe, 0x08, 0xc2, 0x53, 0xbf, 0x65, 0x2d, 0x27, 0xbf,
+ 0x30, 0xe7, 0xde, 0x3d, 0x64, 0x2d, 0xa7, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xf8, 0xbf, 0xac, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x31, 0x75, 0xbe, 0x34, 0xe7, 0xde, 0x3e,
+ 0xec, 0xbd, 0x85, 0x3e, 0xb4, 0x77, 0xbd, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x30, 0xe7, 0xde, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x22, 0xe5, 0x37, 0xbf, 0x74, 0x2f, 0xce, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0x3d, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x90, 0x52, 0x32, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0x80, 0x52, 0xb2, 0xbc, 0xe8, 0xbd, 0x85, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+ 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x08, 0xc2, 0x53, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x52, 0x8b, 0x56, 0xbf, 0x08, 0xc2, 0xd3, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+ 0x30, 0xe7, 0xde, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xfb, 0x8f, 0x81, 0xbf, 0x74, 0x2f, 0xce, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x86, 0xd1, 0x1e, 0xbf,
+ 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x24, 0xe5, 0xb7, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x6c, 0xae, 0x3a, 0xbf, 0xb8, 0x77, 0x3d, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+ 0x08, 0xc2, 0x53, 0x3e, 0x1a, 0x64, 0x24, 0xbf, 0x90, 0x52, 0xb2, 0x3d,
+ 0x90, 0x52, 0xb2, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x30, 0x08, 0x9c, 0xbd,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x1c, 0xc4, 0xfa, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbd, 0x8c, 0x52, 0xb2, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0x40, 0x08, 0x1c, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xc4, 0x79, 0xe4, 0xbe,
+ 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x88, 0x31, 0x75, 0x3e,
+ 0x58, 0x0c, 0xea, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0x5e, 0xac, 0x13, 0xbf, 0x90, 0x52, 0xb2, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xa2, 0xf4, 0x02, 0x3f, 0x90, 0x52, 0xb2, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0xa0, 0xf4, 0x02, 0xbf, 0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x08, 0xc2, 0x53, 0xbe, 0x56, 0x2b, 0x00, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x3c, 0x08, 0x9c, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x40, 0x08, 0x1c, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x1c, 0xc4, 0xfa, 0x3e,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0x18, 0xc4, 0xfa, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x31, 0x75, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x30, 0x08, 0x9c, 0xbd, 0x9c, 0x54, 0xd9, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0x3d,
+ 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+ 0x88, 0x31, 0x75, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x31, 0x75, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0xf8, 0xbf, 0xac, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x14, 0xe3, 0x90, 0x3e,
+ 0x80, 0x31, 0x75, 0xbe, 0x74, 0x2f, 0xce, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
+ 0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0xfb, 0x8f, 0x81, 0xbf, 0xea, 0xbd, 0x05, 0xbf,
+ 0x90, 0x52, 0x32, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+ 0x88, 0x52, 0x32, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x38, 0x08, 0x1c, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+ 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x31, 0x75, 0xbe,
+ 0x88, 0x52, 0x32, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0x34, 0xe7, 0xde, 0x3e, 0x74, 0x2f, 0xce, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x3c, 0x08, 0x9c, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0x5e, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xa0, 0x52, 0x32, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0xde, 0xbd,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0x00, 0xbe, 0x05, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0x88, 0x31, 0x75, 0x3e,
+ 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x38, 0x08, 0x1c, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0xae, 0xf6, 0x29, 0x3f,
+ 0x00, 0xbe, 0x05, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+ 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+ 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x85, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+ 0x38, 0x08, 0x1c, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xec, 0xbd, 0x85, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+ 0x18, 0xe3, 0x10, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x88, 0x31, 0x75, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+ 0x88, 0x31, 0x75, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x14, 0xe3, 0x90, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
+ 0x80, 0x52, 0xb2, 0xbc, 0xa8, 0x75, 0x96, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+ 0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+ 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+ 0x90, 0x52, 0xb2, 0x3d, 0x20, 0xe5, 0xb7, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+ 0x80, 0x50, 0x8b, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+ 0x90, 0x52, 0xb2, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x30, 0x08, 0x9c, 0xbd,
+ 0x90, 0x52, 0xb2, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x90, 0x52, 0xb2, 0x3d, 0x8c, 0x52, 0xb2, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+ 0xb8, 0x77, 0xbd, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0xc8, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x90, 0x52, 0xb2, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+ 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+ 0x80, 0x52, 0x32, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xa2, 0xf4, 0x02, 0x3f, 0x14, 0xe3, 0x90, 0x3e,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x80, 0x52, 0xb2, 0xbc, 0x30, 0x08, 0x9c, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x00, 0xbe, 0x05, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+ 0x30, 0xe7, 0x5e, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x88, 0x52, 0x32, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x80, 0x52, 0x32, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0xbd,
+ 0x60, 0x2d, 0x27, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+ 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x88, 0x31, 0x75, 0x3e,
+ 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x08, 0xc2, 0x53, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+ 0x68, 0x2d, 0x27, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0xe3, 0x10, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+ 0x00, 0xbe, 0x05, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
+ 0x40, 0x08, 0x1c, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x4c, 0x0a, 0xc3, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+ 0x90, 0x31, 0xf5, 0x3d, 0xb8, 0x77, 0x3d, 0x3e, 0x30, 0xe7, 0x5e, 0x3e,
+ 0xc8, 0x19, 0x0e, 0xbf, 0xe4, 0x9c, 0xc8, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0xd3, 0xbe, 0xaf, 0xf6, 0x29, 0xbf,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+ 0x0c, 0xc2, 0xd3, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0xf9, 0xbf, 0x2c, 0xbf,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x5c, 0x0c, 0xea, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+ 0x08, 0xc2, 0x53, 0xbe, 0xa8, 0x75, 0x96, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x50, 0x8b, 0x3e,
+ 0x00, 0x41, 0x40, 0xbf, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0xbd,
+ 0xb8, 0x77, 0x3d, 0xbe, 0xa8, 0x75, 0x96, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xfc, 0xbf, 0xac, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0x30, 0xe7, 0xde, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x14, 0xe3, 0x90, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0x34, 0x87, 0x08, 0xbf, 0x22, 0xe5, 0x37, 0xbf,
+ 0xa8, 0x75, 0x16, 0xbf, 0xf8, 0xbf, 0xac, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0x8d, 0x52, 0x32, 0xbf, 0x40, 0x08, 0x1c, 0x3e,
+ 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x3c, 0x08, 0x9c, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xa8, 0x75, 0x96, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x38, 0x08, 0x1c, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0xfc, 0xbf, 0xac, 0x3e,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+ 0xa8, 0x75, 0x16, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+ 0xa8, 0x75, 0x96, 0x3e, 0x20, 0xe5, 0xb7, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e,
+ 0x10, 0xe3, 0x10, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x4c, 0x0a, 0xc3, 0x3e,
+ 0x08, 0xc2, 0x53, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x40, 0x08, 0x1c, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x68, 0x2d, 0x27, 0x3e,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0x5a, 0x0c, 0x6a, 0xbf,
+ 0x90, 0x52, 0xb2, 0x3d, 0x54, 0x2b, 0x80, 0xbe, 0x9c, 0x54, 0xd9, 0x3e,
+ 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+ 0x22, 0xe5, 0x37, 0xbf, 0xa8, 0x75, 0x96, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
+ 0x4c, 0x0a, 0xc3, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x74, 0x2f, 0xce, 0x3e,
+ 0x34, 0x87, 0x08, 0xbf, 0x7e, 0x50, 0x0b, 0x3f, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x86, 0xd1, 0x1e, 0xbf, 0x9c, 0x54, 0xd9, 0xbe, 0x56, 0x2b, 0x00, 0xbf,
+ 0x9c, 0x54, 0xd9, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x9c, 0x54, 0xd9, 0x3e, 0x43, 0x89, 0x2f, 0xbf, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x88, 0x31, 0x75, 0x3e, 0x8d, 0x52, 0x32, 0xbf, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x88, 0x52, 0x32, 0xbe, 0x12, 0xe3, 0x10, 0xbf, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+ 0x90, 0x52, 0x32, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0xcd, 0xfa, 0x77, 0xbf,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0x08, 0x9c, 0xbd,
+ 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0xbd, 0xfc, 0xbf, 0xac, 0x3e,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x60, 0x2d, 0x27, 0xbe,
+ 0xfc, 0xbf, 0xac, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+ 0xa0, 0xf4, 0x02, 0xbf, 0xf8, 0xbf, 0xac, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x76, 0x2f, 0x4e, 0x3f, 0x38, 0x08, 0x1c, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0x00, 0x00, 0x00, 0x00, 0xb6, 0x77, 0x3d, 0xbf,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xea, 0xbd, 0x05, 0x3f, 0x74, 0x2f, 0x4e, 0xbf,
+ 0x90, 0x31, 0xf5, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0xde, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+ 0xec, 0xbd, 0x85, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xe4, 0x9c, 0xc8, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x68, 0x2d, 0x27, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+ 0xec, 0x9e, 0xef, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x34, 0x87, 0x08, 0xbf,
+ 0xec, 0x9e, 0xef, 0xbe, 0x34, 0xe7, 0xde, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
+ 0x14, 0xe3, 0x90, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+ 0x80, 0x52, 0x32, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x08, 0x9c, 0xbe,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
+ 0x30, 0xe7, 0x5e, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+ 0xa2, 0xf4, 0x02, 0x3f, 0x30, 0xe7, 0xde, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e,
+ 0x74, 0x2f, 0xce, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
+ 0x90, 0x31, 0xf5, 0x3d, 0x0c, 0xc2, 0xd3, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0x80, 0x31, 0xf5, 0xbd, 0x58, 0x0c, 0xea, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+ 0xa8, 0x75, 0x96, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+ 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0xbd,
+ 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x74, 0x2f, 0xce, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+ 0x38, 0x08, 0x1c, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x66, 0x2d, 0x27, 0x3f,
+ 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+ 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x40, 0x08, 0x1c, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x9c, 0x54, 0xd9, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
+ 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+ 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xd0, 0x9a, 0xa1, 0x3e, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x88, 0x52, 0x32, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xf8, 0xbf, 0xac, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+ 0x80, 0x50, 0x8b, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x5e, 0xac, 0x13, 0xbf,
+ 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0xbc, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x90, 0x52, 0xb2, 0x3e,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x0c, 0xc2, 0xd3, 0x3e,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+ 0x90, 0x31, 0xf5, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
+ 0xec, 0xbd, 0x85, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
+ 0xec, 0xbd, 0x85, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x80, 0x31, 0xf5, 0xbd, 0x5e, 0xac, 0x13, 0xbf, 0x68, 0x2d, 0x27, 0x3e,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x6c, 0xae, 0x3a, 0xbf, 0xa8, 0x75, 0x96, 0xbe,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0x3c,
+ 0x68, 0x2d, 0x27, 0x3e, 0xe4, 0x9c, 0xc8, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0xf2, 0x3e, 0x19, 0xbf, 0x74, 0x2f, 0xce, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
+ 0x74, 0x2f, 0xce, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x9c, 0x54, 0xd9, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x9c, 0x54, 0xd9, 0x3e, 0x9c, 0x54, 0xd9, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+ 0x10, 0xe3, 0x10, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+ 0x80, 0x52, 0x32, 0xbc, 0xec, 0xbd, 0x85, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+ 0x5c, 0x0c, 0xea, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0xe0, 0x9c, 0x48, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x5e, 0xac, 0x13, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+ 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0x32, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x64, 0x2d, 0xa7, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x95, 0xd3, 0x45, 0xbf,
+ 0x84, 0x31, 0xf5, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x74, 0x2f, 0x4e, 0xbf, 0xa8, 0x75, 0x16, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x3c, 0x08, 0x9c, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xa8, 0x75, 0x96, 0x3e,
+ 0xec, 0x9e, 0xef, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x56, 0x2b, 0x00, 0xbf, 0x80, 0x31, 0x75, 0xbe,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+ 0xb4, 0x77, 0xbd, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x36, 0x87, 0x08, 0x3f,
+ 0x90, 0x52, 0xb2, 0x3d, 0xb4, 0x77, 0xbd, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xf2, 0x3e, 0x19, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0x6c, 0xae, 0x3a, 0xbf,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x74, 0x2f, 0xce, 0x3e,
+ 0x34, 0x87, 0x08, 0xbf, 0x08, 0xc2, 0x53, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0x1c, 0xc4, 0xfa, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+ 0x90, 0x52, 0xb2, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0x84, 0x31, 0xf5, 0x3e,
+ 0x80, 0x52, 0x32, 0xbd, 0x8d, 0x52, 0x32, 0xbf, 0x56, 0x2b, 0x00, 0xbf,
+ 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x34, 0x87, 0x08, 0xbf,
+ 0xd0, 0x9a, 0x21, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x0c, 0xc2, 0xd3, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+ 0x40, 0x08, 0x1c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+ 0x08, 0xc2, 0x53, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xb4, 0x77, 0xbd, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
+ 0x40, 0x08, 0x9c, 0x3d, 0x54, 0x2b, 0x80, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
+ 0xa8, 0x75, 0x96, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+ 0xe4, 0x9c, 0xc8, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+ 0x9c, 0x54, 0xd9, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0xa8, 0x75, 0x16, 0xbf, 0xe0, 0x9c, 0x48, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
+ 0x80, 0x52, 0x32, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x7e, 0x50, 0x0b, 0x3f, 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x08, 0xc2, 0x53, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+ 0xa0, 0xf4, 0x02, 0xbf, 0x00, 0xbe, 0x05, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+ 0x00, 0xbe, 0x05, 0x3d, 0x54, 0x2b, 0x80, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
+ 0xa0, 0x52, 0x32, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x5e, 0xac, 0x13, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+ 0x90, 0x52, 0xb2, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x60, 0x2d, 0x27, 0xbe,
+ 0x4c, 0x0a, 0xc3, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0x80, 0x52, 0x32, 0x3c, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x80, 0x52, 0x32, 0xbc, 0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x90, 0x52, 0xb2, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
+ 0xec, 0xbd, 0x85, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x90, 0x52, 0xb2, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x60, 0x2d, 0x27, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x85, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0xe3, 0x10, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0xa8, 0x75, 0x96, 0xbe,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x43, 0x89, 0x2f, 0xbf, 0x7c, 0x50, 0x8b, 0xbe,
+ 0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+ 0x80, 0x52, 0x32, 0x3c, 0xf0, 0xbd, 0x85, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x38, 0x08, 0x1c, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x14, 0xe3, 0x90, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+ 0x22, 0xe5, 0x37, 0xbf, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+ 0x08, 0xc2, 0x53, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0xa8, 0x75, 0x96, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x54, 0x2b, 0x80, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0x80, 0x50, 0x8b, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x74, 0x2f, 0xce, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0x20, 0xe5, 0xb7, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+ 0xf8, 0xbf, 0xac, 0xbe, 0xa8, 0x75, 0x16, 0xbf, 0x24, 0xe5, 0xb7, 0x3e,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xc0, 0x52, 0xb2, 0x3c, 0x74, 0x2f, 0xce, 0xbe,
+ 0x3c, 0x08, 0x9c, 0x3e, 0xf8, 0xbf, 0xac, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0x9c, 0x54, 0xd9, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x18, 0xc4, 0xfa, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+ 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x31, 0x75, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
+ 0xa8, 0x75, 0x96, 0xbe, 0xca, 0x19, 0x0e, 0x3f, 0x80, 0x52, 0x32, 0xbc,
+ 0x40, 0x08, 0x1c, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x5e, 0xac, 0x13, 0xbf, 0x20, 0xe7, 0x5e, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x36, 0x87, 0x08, 0x3f,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x80, 0x52, 0x32, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x80, 0x50, 0x8b, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
+ 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+ 0x90, 0x52, 0x32, 0x3e, 0x34, 0xe7, 0xde, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+ 0xec, 0xbd, 0x85, 0x3e, 0xae, 0xf6, 0x29, 0x3f, 0x74, 0x2f, 0xce, 0xbe,
+ 0x83, 0x31, 0x75, 0xbf, 0x30, 0xe7, 0x5e, 0x3e, 0x74, 0x2f, 0xce, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0xe8, 0xbd, 0x85, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
+ 0xe0, 0x9c, 0x48, 0x3e, 0xfc, 0xbf, 0xac, 0x3e, 0xc4, 0x79, 0xe4, 0xbe,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x14, 0xe3, 0x90, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0x3e, 0xc6, 0x79, 0x64, 0x3f,
+ 0x9c, 0x54, 0xd9, 0x3e, 0xfc, 0xbf, 0xac, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
+ 0x38, 0x08, 0x1c, 0xbe, 0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0xc4, 0x79, 0xe4, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+ 0x14, 0xe3, 0x90, 0x3e, 0xf2, 0x3e, 0x19, 0x3f, 0x40, 0x08, 0x9c, 0x3d,
+ 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
+ 0x5e, 0xac, 0x13, 0x3f, 0xb8, 0x77, 0x3d, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x84, 0x31, 0xf5, 0x3e,
+ 0xaa, 0x75, 0x16, 0x3f, 0x68, 0x2d, 0xa7, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x84, 0x31, 0xf5, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0x40, 0x08, 0x1c, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
+ 0xb8, 0x77, 0xbd, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x68, 0x2d, 0xa7, 0x3e,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x80, 0x52, 0x32, 0x3c, 0x00, 0xbe, 0x05, 0x3d, 0x60, 0x0c, 0x6a, 0x3e,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x08, 0xc2, 0xd3, 0xbe,
+ 0xca, 0x19, 0x0e, 0x3f, 0xe8, 0xbd, 0x05, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+ 0x08, 0xc2, 0x53, 0x3e, 0xec, 0x9e, 0xef, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+ 0x80, 0x52, 0x32, 0x3c, 0xa2, 0xf4, 0x02, 0x3f, 0x68, 0x2d, 0x27, 0x3e,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xc4, 0x79, 0xe4, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xf8, 0xbf, 0xac, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x20, 0xe5, 0xb7, 0xbe,
+ 0xa8, 0x75, 0x96, 0xbe, 0xa4, 0xd5, 0x6c, 0xbf, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xfc, 0xbf, 0xac, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+ 0x90, 0x52, 0xb2, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x18, 0xe3, 0x10, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x68, 0x2d, 0xa7, 0x3e,
+ 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+ 0x9c, 0x54, 0xd9, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0x6e, 0xae, 0x3a, 0x3f,
+ 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
+ 0x90, 0x52, 0xb2, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x80, 0x31, 0xf5, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0xb8, 0x77, 0x3d, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x52, 0x32, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x74, 0x2f, 0xce, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x80, 0x52, 0x32, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x80, 0x50, 0x8b, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x08, 0xc2, 0x53, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x30, 0x08, 0x9c, 0xbd,
+ 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
+ 0x38, 0x08, 0x1c, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+ 0x54, 0x2b, 0x80, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+ 0x80, 0x31, 0xf5, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x30, 0xe7, 0xde, 0xbd, 0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x80, 0x31, 0xf5, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x60, 0x2d, 0x27, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x88, 0x52, 0x32, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x4c, 0x0a, 0xc3, 0x3e,
+ 0x18, 0xc4, 0xfa, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0x75, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd,
+ 0x80, 0x31, 0xf5, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x90, 0x52, 0xb2, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x20, 0xe5, 0xb7, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0x32, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0x80, 0x52, 0x32, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x80, 0x31, 0x75, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0xe4, 0x9c, 0xc8, 0x3e,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x00, 0xbe, 0x05, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x40, 0x08, 0x9c, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0xec, 0x9e, 0xef, 0x3e,
+ 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x40, 0x08, 0x9c, 0x3d,
+ 0x30, 0xe7, 0xde, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0xb4, 0x77, 0xbd, 0xbe,
+ 0xa8, 0x75, 0x96, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x58, 0x2b, 0x80, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
+ 0x90, 0x31, 0xf5, 0x3d, 0xe8, 0xbd, 0x85, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd, 0xf9, 0xbf, 0x2c, 0xbf,
+ 0x90, 0x52, 0x32, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x80, 0x52, 0x32, 0xbc, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xec, 0xbd, 0x85, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+ 0x38, 0x08, 0x1c, 0xbe, 0x3c, 0x08, 0x1c, 0xbf, 0x7e, 0x50, 0x0b, 0xbf,
+ 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x12, 0xe3, 0x10, 0xbf, 0x80, 0x52, 0xb2, 0xbc,
+ 0x40, 0x08, 0x9c, 0x3d, 0xc8, 0x19, 0x0e, 0xbf, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x1a, 0x64, 0x24, 0xbf,
+ 0x08, 0xc2, 0x53, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+ 0x08, 0xc2, 0x53, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x52, 0x8b, 0x56, 0xbf,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x30, 0xe7, 0xde, 0x3d, 0x24, 0xe5, 0xb7, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0xc8, 0x19, 0x0e, 0xbf,
+ 0x80, 0x31, 0xf5, 0xbd, 0x84, 0x31, 0xf5, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x80, 0x52, 0x32, 0xbd, 0xd0, 0x9a, 0xa1, 0x3e, 0x3c, 0x08, 0x1c, 0xbf,
+ 0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0xf2, 0x3e, 0x19, 0xbf, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+ 0x56, 0x2b, 0x00, 0xbf, 0xa0, 0xf4, 0x02, 0xbf, 0x88, 0x52, 0x32, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x9c, 0x54, 0xd9, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0xd8, 0x1b, 0x35, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
+ 0xa8, 0x75, 0x96, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x08, 0xc2, 0x53, 0x3e,
+ 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x95, 0xd3, 0x45, 0xbf, 0xe0, 0x9c, 0x48, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x9c, 0x54, 0xd9, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x29, 0x66, 0x4b, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0x56, 0x2b, 0x00, 0xbf, 0x88, 0x52, 0x32, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xb6, 0x77, 0x3d, 0xbf, 0x95, 0xd3, 0x45, 0xbf,
+ 0x10, 0xe3, 0x10, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x17, 0xc4, 0x7a, 0xbf, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
+ 0x3c, 0x08, 0x1c, 0xbf, 0xa8, 0x75, 0x96, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0x80, 0x52, 0xb2, 0xbc, 0x7e, 0x50, 0x8b, 0xbf, 0x08, 0xc2, 0xd3, 0xbe,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x1a, 0x64, 0x24, 0xbf, 0xc4, 0x79, 0xe4, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0xd0, 0x9a, 0x21, 0xbf, 0x84, 0x31, 0xf5, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+ 0x5e, 0xac, 0x13, 0xbf, 0x90, 0x31, 0xf5, 0x3d, 0x5e, 0xac, 0x13, 0xbf,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0xb4, 0x77, 0xbd, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xd0, 0x9a, 0x21, 0xbf,
+ 0xb4, 0x77, 0xbd, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+ 0x90, 0x52, 0xb2, 0xbd, 0x18, 0xc4, 0xfa, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0x10, 0xe3, 0x10, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x1c, 0xc4, 0xfa, 0x3e,
+ 0x52, 0x8b, 0x56, 0xbf, 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x9c, 0x54, 0xd9, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e,
+ 0xec, 0x9e, 0xef, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x08, 0xc2, 0x53, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0x18, 0xc4, 0xfa, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x95, 0xd3, 0x45, 0xbf, 0x40, 0x08, 0x9c, 0x3d,
+ 0x90, 0x52, 0x32, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x34, 0xe7, 0xde, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x6c, 0xae, 0x3a, 0xbf,
+ 0xec, 0xbd, 0x85, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x74, 0x2f, 0xce, 0x3e,
+ 0x24, 0xe5, 0xb7, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x74, 0x2f, 0xce, 0xbe,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x5e, 0xac, 0x13, 0xbf, 0xb4, 0x77, 0xbd, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x84, 0x31, 0xf5, 0x3e, 0x9c, 0x54, 0xd9, 0x3e,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+ 0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0xbd,
+ 0xd8, 0x1b, 0x35, 0xbf, 0x30, 0xe7, 0x5e, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xfa, 0xbf, 0x2c, 0x3f, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xa8, 0x75, 0x96, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x68, 0x2d, 0x27, 0x3e, 0x20, 0xe5, 0xb7, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+ 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x43, 0x89, 0x2f, 0xbf,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x90, 0x52, 0xb2, 0xbd, 0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0x24, 0xe5, 0xb7, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x80, 0x52, 0x32, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+ 0xc8, 0x19, 0x0e, 0xbf, 0x54, 0x2b, 0x80, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+ 0xe8, 0xbd, 0x85, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x84, 0x31, 0xf5, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x54, 0x2b, 0x80, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+ 0x40, 0x08, 0x1c, 0x3e, 0xd8, 0x1b, 0x35, 0xbf, 0xa8, 0x75, 0x96, 0xbe,
+ 0xfc, 0xbf, 0xac, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x00, 0x41, 0x40, 0xbf, 0x34, 0x87, 0x08, 0xbf, 0x30, 0x08, 0x9c, 0xbd,
+ 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x88, 0x31, 0x75, 0x3e,
+ 0x36, 0x87, 0x08, 0x3f, 0x74, 0x2f, 0xce, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+ 0xe0, 0x9c, 0x48, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xe8, 0xbd, 0x85, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x18, 0xc4, 0xfa, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x34, 0xe7, 0xde, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0x24, 0xe5, 0xb7, 0x3e,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+ 0x18, 0xe3, 0x10, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x1c, 0xc4, 0xfa, 0x3e, 0xec, 0xbd, 0x85, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xe4, 0x9c, 0xc8, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+ 0x30, 0xe7, 0x5e, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
+ 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x34, 0xe7, 0xde, 0x3e, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x10, 0xe3, 0x10, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x68, 0x2d, 0x27, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0xec, 0xbd, 0x85, 0x3e,
+ 0x60, 0x2d, 0x27, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0xca, 0x19, 0x0e, 0x3f, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0xc8, 0x3d, 0x18, 0xc4, 0xfa, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0xea, 0xbd, 0x05, 0x3f, 0x5c, 0x0c, 0xea, 0x3e,
+ 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0x88, 0x31, 0x75, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0xe4, 0x9c, 0xc8, 0x3e,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x38, 0x08, 0x1c, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x64, 0x2d, 0xa7, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0x5e, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x90, 0x52, 0xb2, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0xc4, 0x79, 0xe4, 0xbe,
+ 0xd0, 0x9a, 0x21, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe, 0xe7, 0x1d, 0x5c, 0xbf,
+ 0xf8, 0xbf, 0xac, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x14, 0xe3, 0x90, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x86, 0xd1, 0x1e, 0xbf, 0xa0, 0xf4, 0x02, 0xbf,
+ 0x08, 0xc2, 0x53, 0xbf, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+ 0x80, 0x52, 0x32, 0xbd, 0x5c, 0x0c, 0xea, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x68, 0x2d, 0x27, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0xbd,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+ 0x80, 0x31, 0xf5, 0xbd, 0xfc, 0xbf, 0xac, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+ 0x8c, 0x52, 0xb2, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+ 0xb4, 0x77, 0xbd, 0xbe, 0xee, 0x9e, 0x6f, 0xbf, 0x80, 0x52, 0x32, 0xbd,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x3c, 0x08, 0x9c, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x84, 0x31, 0xf5, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0xe4, 0x9c, 0xc8, 0x3e,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x3c, 0x08, 0x1c, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
+ 0x95, 0xd3, 0x45, 0xbf, 0xc0, 0x52, 0xb2, 0x3c, 0x00, 0xbe, 0x05, 0x3d,
+ 0xea, 0xbd, 0x85, 0xbf, 0xe8, 0xbd, 0x05, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0x18, 0xc4, 0xfa, 0xbe, 0x5e, 0xac, 0x13, 0xbf, 0x80, 0x52, 0x32, 0xbd,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x64, 0x2d, 0xa7, 0xbe,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x5e, 0xac, 0x13, 0xbf,
+ 0xc8, 0x19, 0x0e, 0xbf, 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x29, 0x66, 0x4b, 0xbf, 0x80, 0x31, 0x75, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x45, 0x59, 0x84, 0xbf, 0x24, 0xb5, 0x8c, 0xbf, 0x90, 0x52, 0x32, 0x3e,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0x32, 0x3e,
+ 0xa8, 0x75, 0x16, 0xbf, 0xe8, 0xbd, 0x05, 0xbe, 0xf9, 0xbf, 0x2c, 0xbf,
+ 0x84, 0x31, 0xf5, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+ 0x9c, 0x54, 0xd9, 0x3e, 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0xf0, 0xbd, 0x05, 0x3e,
+ 0xee, 0x9e, 0x6f, 0xbf, 0x30, 0x08, 0x9c, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0x80, 0x52, 0x32, 0x3c,
+ 0x22, 0xe5, 0x37, 0xbf, 0x18, 0xc4, 0xfa, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x00, 0xbe, 0x05, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0xaf, 0xf6, 0x29, 0xbf, 0xd0, 0x9a, 0xa1, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+ 0xe7, 0x1d, 0x5c, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0xa8, 0x75, 0x96, 0x3e, 0xc8, 0x19, 0x0e, 0xbf,
+ 0x18, 0xe3, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x1c, 0x3e,
+ 0x7e, 0x50, 0x0b, 0xbf, 0x18, 0xc4, 0xfa, 0xbe, 0x80, 0x50, 0x8b, 0x3e,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
+ 0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0xaf, 0xf6, 0x29, 0xbf, 0xd8, 0x1b, 0x35, 0xbf,
+ 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe, 0x8d, 0x52, 0x32, 0xbf,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x34, 0x87, 0x08, 0xbf,
+ 0xdf, 0x9c, 0x48, 0xbf, 0x90, 0x52, 0xb2, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+ 0x64, 0x2d, 0xa7, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x58, 0x0c, 0xea, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x1a, 0x64, 0x24, 0xbf, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0xbd,
+ 0x90, 0x31, 0xf5, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x9c, 0x54, 0xd9, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0xec, 0x9e, 0xef, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+ 0x56, 0x2b, 0x00, 0xbf, 0x60, 0x2d, 0x27, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+ 0x80, 0x52, 0xb2, 0xbc, 0x64, 0x2d, 0xa7, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x34, 0xe7, 0xde, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0xa8, 0x75, 0x96, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0x95, 0xd3, 0x45, 0xbf, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+ 0x74, 0x2f, 0xce, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0xde, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0xe0, 0x9c, 0x48, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xb4, 0x77, 0xbd, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+ 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0x3c,
+ 0x90, 0x52, 0xb2, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0x5e, 0xac, 0x13, 0xbf,
+ 0x60, 0x0c, 0x6a, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x31, 0x75, 0xbe,
+ 0xae, 0xf6, 0x29, 0x3f, 0x30, 0xe7, 0xde, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0xfc, 0xbf, 0xac, 0x3e,
+ 0xb4, 0x77, 0xbd, 0xbe, 0xf2, 0x3e, 0x19, 0x3f, 0x58, 0x2b, 0x80, 0x3e,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0x3d, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0xea, 0xbd, 0x05, 0x3f, 0x0c, 0xc2, 0xd3, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x88, 0x52, 0x32, 0xbe, 0xea, 0xbd, 0x05, 0x3f,
+ 0x30, 0xe7, 0x5e, 0xbe, 0xec, 0x9e, 0xef, 0x3e, 0x52, 0x8b, 0x56, 0xbf,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xdf, 0x9c, 0x48, 0xbf,
+ 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xb8, 0x77, 0xbd, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x68, 0x2d, 0x27, 0x3e, 0xf9, 0xbf, 0x2c, 0xbf,
+ 0x60, 0x2d, 0x27, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x88, 0x52, 0x32, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x64, 0x2d, 0xa7, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0x60, 0x2d, 0x27, 0xbe, 0xa8, 0x75, 0x96, 0x3e, 0x58, 0x0c, 0xea, 0xbe,
+ 0xa8, 0x75, 0x96, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0xbd,
+ 0x24, 0xe5, 0xb7, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x7e, 0x50, 0x0b, 0xbf, 0x7c, 0x50, 0x8b, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x90, 0x52, 0xb2, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0x3c,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x74, 0x2f, 0xce, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x74, 0x2f, 0xce, 0x3e,
+ 0x68, 0x2d, 0x27, 0x3e, 0xe8, 0xbd, 0x85, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0x3c, 0x08, 0x1c, 0xbf,
+ 0xd0, 0x9a, 0x21, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x80, 0x50, 0x8b, 0x3e, 0x34, 0xe7, 0xde, 0x3e, 0xd8, 0x1b, 0x35, 0xbf,
+ 0x90, 0x52, 0xb2, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x43, 0x89, 0x2f, 0xbf, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+ 0x58, 0x2b, 0x80, 0x3e, 0xa0, 0xf4, 0x02, 0xbf, 0xec, 0x9e, 0xef, 0xbe,
+ 0xa8, 0x75, 0x96, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0xda, 0x1b, 0x35, 0x3f,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x58, 0x0c, 0x6a, 0xbe, 0xa2, 0xf4, 0x02, 0x3f,
+ 0xaa, 0x75, 0x16, 0x3f, 0x30, 0xe7, 0xde, 0xbd, 0x14, 0xe3, 0x90, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+ 0x80, 0x52, 0x32, 0x3c, 0xa0, 0x52, 0x32, 0x3d, 0x9c, 0x54, 0xd9, 0x3e,
+ 0x5c, 0x0c, 0xea, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
+ 0x90, 0x52, 0xb2, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xc8, 0x19, 0x0e, 0xbf, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xec, 0xbd, 0x85, 0x3e, 0x8d, 0x52, 0x32, 0xbf, 0x80, 0x52, 0xb2, 0xbc,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0xec, 0xbd, 0x85, 0x3e,
+ 0xa8, 0x75, 0x96, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x08, 0xc2, 0x53, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xa0, 0xf4, 0x02, 0xbf,
+ 0x14, 0xe3, 0x90, 0x3e, 0xb4, 0x77, 0xbd, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+ 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xca, 0x19, 0x0e, 0x3f, 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0xb8, 0x77, 0xbd, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x84, 0x31, 0xf5, 0xbe,
+ 0xf8, 0xbf, 0xac, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x1c, 0xc4, 0xfa, 0x3e,
+ 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0xec, 0xbd, 0x85, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x5e, 0xac, 0x13, 0x3f, 0x14, 0xe3, 0x90, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
+ 0xa8, 0x75, 0x96, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0x9c, 0x54, 0xd9, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x52, 0x32, 0x3c, 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+ 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x1c, 0xc4, 0xfa, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x5e, 0xac, 0x13, 0xbf, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x40, 0x08, 0x9c, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+ 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x88, 0x52, 0x32, 0xbe,
+ 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x5c, 0x0c, 0xea, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x56, 0x2b, 0x00, 0xbf,
+ 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x5e, 0xac, 0x13, 0xbf,
+ 0x74, 0x2f, 0xce, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x7e, 0x50, 0x0b, 0x3f,
+ 0x54, 0x2b, 0x80, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xa2, 0xf4, 0x02, 0x3f,
+ 0xa8, 0x75, 0x96, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+ 0x12, 0xe3, 0x10, 0x3f, 0x40, 0xe7, 0x5e, 0x3d, 0x08, 0xc2, 0x53, 0x3e,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xc4, 0x79, 0xe4, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x64, 0x2d, 0xa7, 0xbe,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0x3e,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x22, 0xe5, 0x37, 0xbf, 0x00, 0x41, 0x40, 0xbf,
+ 0x30, 0x08, 0x9c, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x14, 0xe3, 0x90, 0xbe, 0x34, 0x87, 0x08, 0xbf, 0x12, 0xe3, 0x10, 0xbf,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x5e, 0xac, 0x13, 0x3f, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x08, 0x1c, 0x3e, 0x24, 0xe5, 0xb7, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0xa0, 0x52, 0x32, 0x3d, 0x95, 0xd3, 0x45, 0xbf, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x84, 0x31, 0xf5, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x7c, 0x50, 0x8b, 0xbe, 0xaf, 0xf6, 0x29, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x50, 0x8b, 0x3e,
+ 0x56, 0x2b, 0x00, 0x3f, 0xa8, 0x75, 0x96, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+ 0x86, 0xd1, 0x1e, 0x3f, 0x6c, 0xae, 0x3a, 0xbf, 0x88, 0x52, 0x32, 0xbe,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xc8, 0x19, 0x0e, 0xbf, 0xe0, 0x9c, 0x48, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+ 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0xb2, 0xbc,
+ 0x43, 0x89, 0x2f, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xe0, 0x9c, 0x48, 0x3e, 0xd8, 0x1b, 0x35, 0xbf, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x43, 0x89, 0x2f, 0xbf,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x18, 0xc4, 0xfa, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x60, 0x2d, 0x27, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x80, 0x31, 0xf5, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x80, 0x31, 0x75, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x88, 0x31, 0x75, 0x3e,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0xbd,
+ 0x90, 0x31, 0xf5, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x18, 0xe3, 0x10, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x00, 0xbe, 0x05, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+ 0x30, 0x08, 0x9c, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+ 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+ 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x68, 0x2d, 0xa7, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x31, 0x75, 0xbe,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0x18, 0xe3, 0x10, 0x3e, 0xf8, 0xbf, 0xac, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x80, 0x52, 0xb2, 0xbc, 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+ 0xb8, 0x77, 0xbd, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0x00, 0x00, 0x00,
+ 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0xe8, 0xbd, 0x05, 0xbe,
+ 0xf8, 0xbf, 0xac, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+ 0x90, 0x52, 0x32, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+ 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x58, 0x2b, 0x80, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x14, 0xe3, 0x90, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x38, 0x08, 0x1c, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+ 0x00, 0xbe, 0x05, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x80, 0x52, 0x32, 0x3c, 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x74, 0x2f, 0xce, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x74, 0x2f, 0xce, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x12, 0xe3, 0x10, 0xbf, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
+ 0x4c, 0x0a, 0xc3, 0x3e, 0xec, 0xbd, 0x85, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0xd0, 0x9a, 0xa1, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+ 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x56, 0x2b, 0x00, 0xbf,
+ 0xea, 0xbd, 0x05, 0xbf, 0xc0, 0x52, 0xb2, 0x3c, 0xd0, 0x9a, 0x21, 0xbf,
+ 0xf8, 0xbf, 0xac, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xec, 0xbd, 0x85, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x68, 0x2d, 0x27, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0xbd,
+ 0x68, 0x2d, 0x27, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x80, 0x52, 0x32, 0xbc, 0x38, 0x08, 0x1c, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+ 0x80, 0x52, 0x32, 0xbc, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
+ 0x12, 0xe3, 0x10, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x80, 0x52, 0xb2, 0xbc, 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x40, 0x08, 0x1c, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x58, 0x2b, 0x80, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x90, 0x52, 0xb2, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0xec, 0x9e, 0xef, 0xbe,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0x74, 0x2f, 0xce, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x50, 0x8b, 0x3e,
+ 0x80, 0x52, 0xb2, 0xbc, 0x54, 0x2b, 0x80, 0xbe, 0xf2, 0x3e, 0x19, 0xbf,
+ 0x14, 0xe3, 0x90, 0x3e, 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+ 0x24, 0xe5, 0xb7, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+ 0x30, 0x08, 0x9c, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x52, 0x32, 0xbd, 0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x56, 0x2b, 0x00, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x88, 0x31, 0x75, 0x3e,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x08, 0xc2, 0x53, 0xbf, 0x56, 0x2b, 0x00, 0x3f,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x74, 0x2f, 0xce, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
+ 0x40, 0x08, 0x9c, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0xbd,
+ 0x54, 0x2b, 0x80, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0xbe,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+ 0xe4, 0x9c, 0xc8, 0x3e, 0x24, 0xe5, 0xb7, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
+ 0x7c, 0x50, 0x8b, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xbe, 0x05, 0x3d, 0xf9, 0xbf, 0x2c, 0xbf, 0x38, 0x08, 0x1c, 0xbe,
+ 0xc4, 0x79, 0xe4, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+ 0x30, 0xe7, 0xde, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x58, 0x2b, 0x80, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x18, 0xe3, 0x10, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x80, 0x31, 0xf5, 0xbd, 0x7e, 0x50, 0x0b, 0x3f, 0x10, 0xe3, 0x10, 0xbe,
+ 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+ 0xa2, 0xf4, 0x02, 0x3f, 0x08, 0xc2, 0x53, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+ 0x30, 0x08, 0x9c, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x10, 0xe3, 0x10, 0xbe,
+ 0x90, 0x52, 0x32, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x14, 0xe3, 0x90, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+ 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xec, 0xbd, 0x85, 0x3e,
+ 0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x88, 0x31, 0x75, 0x3e,
+ 0x90, 0x31, 0xf5, 0x3d, 0x3c, 0x08, 0x9c, 0x3e, 0x88, 0x31, 0x75, 0x3e,
+ 0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
+ 0x80, 0x52, 0x32, 0xbc, 0xb4, 0x77, 0xbd, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xec, 0xbd, 0x85, 0x3e, 0x90, 0x52, 0xb2, 0x3e,
+ 0xa0, 0xf4, 0x02, 0xbf, 0x80, 0x52, 0x32, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x5e, 0xac, 0x13, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x80, 0x52, 0xb2, 0xbc, 0xd0, 0x9a, 0xa1, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0xe0, 0x9c, 0x48, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0xaf, 0xf6, 0x29, 0xbf,
+ 0x30, 0xe7, 0xde, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xc4, 0x79, 0xe4, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0xec, 0xbd, 0x85, 0x3e,
+ 0x90, 0x31, 0xf5, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x8c, 0x52, 0xb2, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0x5e, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+ 0xc8, 0x19, 0x0e, 0xbf, 0x54, 0x2b, 0x80, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x4c, 0x0a, 0xc3, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x74, 0x2f, 0xce, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x56, 0x2b, 0x00, 0xbf,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xec, 0x9e, 0xef, 0x3e,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0x20, 0xe5, 0xb7, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x56, 0x2b, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x54, 0x2b, 0x80, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+ 0x7e, 0x50, 0x0b, 0xbf, 0xe4, 0x9c, 0xc8, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xea, 0xbd, 0x05, 0xbf, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x30, 0x08, 0x9c, 0xbd, 0x90, 0x52, 0xb2, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x80, 0x31, 0x75, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+ 0x10, 0xe3, 0x10, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xa8, 0x75, 0x96, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
+ 0xb6, 0x77, 0x3d, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0xf9, 0xbf, 0x2c, 0xbf,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0xb8, 0x77, 0x3d, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x10, 0xe3, 0x10, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x90, 0x52, 0x32, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0x80, 0x52, 0xb2, 0xbc, 0x14, 0xe3, 0x90, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+ 0x90, 0x52, 0x32, 0x3e, 0x20, 0xe5, 0xb7, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xd0, 0x9a, 0x21, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd, 0x14, 0xe3, 0x90, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x56, 0x2b, 0x00, 0xbf, 0xec, 0x9e, 0xef, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0x10, 0xe3, 0x10, 0xbe, 0x1a, 0x64, 0x24, 0x3f, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x38, 0x68, 0x72, 0xbf, 0xfc, 0xbf, 0xac, 0x3e, 0xd0, 0x9a, 0x21, 0xbf,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0x22, 0xe5, 0x37, 0xbf,
+ 0xe4, 0x9c, 0xc8, 0x3e, 0x5e, 0xac, 0x13, 0xbf, 0x80, 0x52, 0x32, 0x3c,
+ 0xf8, 0xbf, 0xac, 0xbe, 0x90, 0x52, 0xb2, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0xc0, 0x52, 0xb2, 0x3c, 0xa0, 0x52, 0x32, 0x3d,
+ 0x1c, 0xc4, 0xfa, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xa8, 0x75, 0x96, 0x3e,
+ 0x80, 0x31, 0x75, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+ 0xa8, 0x75, 0x16, 0xbf, 0x80, 0x52, 0x32, 0x3c, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x7e, 0x50, 0x0b, 0xbf, 0x4c, 0x0a, 0xc3, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x8c, 0x52, 0xb2, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+ 0xd0, 0x9a, 0x21, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x88, 0x31, 0x75, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x5a, 0x0c, 0x6a, 0xbf,
+ 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0x86, 0xd1, 0x1e, 0xbf, 0x74, 0x2f, 0x4e, 0xbf, 0x30, 0x08, 0x9c, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x22, 0xe5, 0x37, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x80, 0x31, 0xf5, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x50, 0x8b, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xf8, 0xbf, 0xac, 0xbe, 0x8d, 0x52, 0x32, 0xbf, 0x30, 0xe7, 0xde, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x68, 0x2d, 0xa7, 0x3e,
+ 0x34, 0x87, 0x08, 0xbf, 0x4b, 0x0a, 0x43, 0xbf, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x9c, 0x54, 0xd9, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xf2, 0x3e, 0x19, 0xbf,
+ 0x54, 0x2b, 0x80, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0xca, 0x19, 0x0e, 0x3f, 0xe0, 0x9c, 0x48, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x30, 0x08, 0x9c, 0xbd, 0x3c, 0x08, 0x1c, 0xbf, 0x88, 0x52, 0x32, 0xbe,
+ 0xa2, 0xf4, 0x02, 0x3f, 0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x60, 0x0c, 0x6a, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x56, 0x2b, 0x00, 0xbf,
+ 0xd8, 0x1b, 0x35, 0xbf, 0x00, 0xbe, 0x05, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+ 0x80, 0x31, 0xf5, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+ 0x12, 0xe3, 0x10, 0xbf, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+ 0x30, 0x08, 0x9c, 0xbd, 0xa0, 0xf4, 0x02, 0xbf, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xd8, 0x1b, 0x35, 0xbf, 0xc8, 0x19, 0x0e, 0xbf,
+ 0x90, 0x31, 0xf5, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x80, 0x52, 0x32, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x38, 0x08, 0x1c, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x30, 0xe7, 0xde, 0xbd, 0x3c, 0x08, 0x9c, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0x8d, 0x52, 0x32, 0xbf, 0xea, 0xbd, 0x05, 0xbf, 0x88, 0x52, 0x32, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xe8, 0xbd, 0x85, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+ 0x90, 0x31, 0xf5, 0x3d, 0xb6, 0x77, 0x3d, 0xbf, 0x3c, 0x08, 0x1c, 0xbf,
+ 0x30, 0xe7, 0xde, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x95, 0xd3, 0x45, 0xbf,
+ 0x18, 0xe3, 0x10, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0xdf, 0x9c, 0x48, 0xbf,
+ 0xec, 0x9e, 0xef, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x90, 0x31, 0xf5, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x34, 0x87, 0x08, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
+ 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
+ 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+ 0x88, 0x52, 0x32, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x58, 0x0c, 0xea, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x30, 0xe7, 0xde, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+ 0x7c, 0x50, 0x8b, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+ 0x80, 0x52, 0x32, 0xbc, 0xc4, 0x79, 0xe4, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0x5a, 0x0c, 0x6a, 0xbf, 0x90, 0x31, 0xf5, 0x3d,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0x3d,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x1c, 0xc4, 0xfa, 0x3e,
+ 0x64, 0x2d, 0xa7, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+ 0x74, 0x2f, 0xce, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0x48, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xaf, 0xf6, 0xa9, 0xbf, 0xe8, 0xbd, 0x05, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x30, 0xe7, 0xde, 0x3d, 0x56, 0x2b, 0x00, 0xbf, 0x30, 0xe7, 0xde, 0xbe,
+ 0x56, 0x2b, 0x00, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+ 0xfc, 0xbf, 0xac, 0x3e, 0xf8, 0xbf, 0xac, 0xbe, 0x9c, 0x54, 0x59, 0xbf,
+ 0x90, 0x31, 0xf5, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0x12, 0xe3, 0x10, 0xbf,
+ 0x80, 0x52, 0x32, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+ 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x00, 0x00, 0x00, 0x00,
+ 0xfc, 0xbf, 0xac, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xec, 0xbd, 0x85, 0x3e,
+ 0x5e, 0xac, 0x13, 0xbf, 0x9c, 0x54, 0xd9, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xc4, 0x79, 0xe4, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+ 0xc4, 0x79, 0xe4, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x3c, 0x08, 0x1c, 0xbf,
+ 0x6c, 0xae, 0x3a, 0xbf, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x14, 0xe3, 0x90, 0xbe, 0xec, 0x9e, 0xef, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
+ 0xa8, 0x75, 0x96, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
+ 0x34, 0x87, 0x08, 0xbf, 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x9c, 0x3d,
+ 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x38, 0x08, 0x1c, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x88, 0x31, 0x75, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0x6c, 0xae, 0x3a, 0xbf, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x80, 0x52, 0x32, 0x3c, 0x24, 0xe5, 0xb7, 0x3e, 0xc4, 0x79, 0xe4, 0x3e,
+ 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x65, 0x2d, 0x27, 0xbf, 0xc0, 0x52, 0xb2, 0x3c, 0xea, 0xbd, 0x05, 0x3f,
+ 0x80, 0x31, 0xf5, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+ 0x80, 0x31, 0x75, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0x40, 0x08, 0x1c, 0x3e, 0x56, 0x2b, 0x00, 0x3f,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x24, 0xe5, 0xb7, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+ 0x80, 0x52, 0x32, 0xbc, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x74, 0x2f, 0xce, 0x3e,
+ 0x60, 0x2d, 0x27, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
+ 0xa0, 0xf4, 0x02, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0xbd, 0x3e,
+ 0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x08, 0xc2, 0xd3, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+ 0x56, 0x2b, 0x00, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0x3c,
+ 0x60, 0x2d, 0x27, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+ 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
+ 0x40, 0x08, 0x9c, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+ 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0xbc,
+ 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+ 0x80, 0x31, 0xf5, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x88, 0x31, 0x75, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+ 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x80, 0x52, 0x32, 0x3c, 0xa0, 0x52, 0x32, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0x90, 0x52, 0xb2, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+ 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+ 0x90, 0x52, 0xb2, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x10, 0xe3, 0x10, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x68, 0x2d, 0x27, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0x90, 0x52, 0xb2, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x18, 0xe3, 0x10, 0x3e,
+ 0x90, 0x31, 0xf5, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+ 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+ 0x58, 0x0c, 0xea, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x56, 0x2b, 0x00, 0xbf,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x54, 0x2b, 0x80, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+ 0xf8, 0xbf, 0xac, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x80, 0x31, 0xf5, 0xbd, 0x68, 0x2d, 0x27, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+ 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+ 0x40, 0x08, 0x1c, 0x3e, 0xc4, 0x79, 0xe4, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0x90, 0x52, 0xb2, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0xb2, 0xbc,
+ 0x18, 0xe3, 0x10, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0x32, 0x3e,
+ 0x90, 0x52, 0x32, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+ 0x80, 0x50, 0x8b, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
+ 0x88, 0x52, 0x32, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+ 0x9c, 0x54, 0xd9, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
+ 0x40, 0x08, 0x9c, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x58, 0x0c, 0x6a, 0xbe,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0xa0, 0x52, 0x32, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x1c, 0x3e,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x1c, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xe8, 0xbd, 0x85, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xc4, 0x79, 0xe4, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0x3c, 0xa8, 0x75, 0x96, 0xbe,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+ 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x18, 0xc4, 0xfa, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x80, 0x52, 0x32, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x8d, 0x52, 0x32, 0xbf,
+ 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0xa0, 0x52, 0x32, 0x3d,
+ 0x90, 0x31, 0xf5, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x6c, 0xae, 0x3a, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
+ 0xb4, 0x77, 0xbd, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+ 0xec, 0xbd, 0x85, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+ 0x40, 0x08, 0x1c, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x38, 0x08, 0x1c, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+ 0x84, 0x31, 0xf5, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
+ 0x88, 0x52, 0x32, 0xbe, 0xb8, 0x77, 0xbd, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+ 0x80, 0x50, 0x8b, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0xc2, 0x53, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0xea, 0xbd, 0x05, 0x3f,
+ 0x34, 0xe7, 0xde, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0x1c, 0xc4, 0xfa, 0x3e,
+ 0x80, 0x31, 0xf5, 0xbd, 0xa0, 0xf4, 0x02, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
+ 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0x38, 0x08, 0x1c, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
+ 0xa8, 0x75, 0x96, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0xbd,
+ 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x00, 0xbe, 0x05, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x20, 0xe5, 0xb7, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x08, 0xc2, 0x53, 0x3e, 0x52, 0x8b, 0x56, 0xbf, 0x90, 0x52, 0xb2, 0xbd,
+ 0x14, 0xe3, 0x90, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xc4, 0x79, 0xe4, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x68, 0x2d, 0xa7, 0x3e,
+ 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x14, 0xe3, 0x90, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
+ 0xec, 0x9e, 0xef, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+ 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x3c, 0x08, 0x9c, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+ 0x80, 0x31, 0xf5, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x9c, 0x54, 0xd9, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0xb8, 0x77, 0xbd, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x1c, 0xc4, 0xfa, 0x3e,
+ 0x30, 0x08, 0x9c, 0xbd, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x5c, 0x0c, 0xea, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xa0, 0x52, 0x32, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
+ 0x90, 0x31, 0xf5, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0xb8, 0x77, 0xbd, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x84, 0x31, 0xf5, 0x3e, 0xb8, 0x77, 0xbd, 0x3e,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+ 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x40, 0x08, 0x1c, 0x3e,
+ 0xfc, 0xbf, 0xac, 0x3e, 0xea, 0xbd, 0x05, 0xbf, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x30, 0xe7, 0xde, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0xde, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+ 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0xc4, 0x79, 0xe4, 0x3e,
+ 0xa0, 0x52, 0x32, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+ 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+ 0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x3c, 0x08, 0x9c, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0x3c, 0x08, 0x9c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+ 0xe0, 0x9c, 0x48, 0x3e, 0xb8, 0x77, 0xbd, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xa8, 0x75, 0x96, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x0c, 0x6a, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0xa8, 0x75, 0x96, 0x3e,
+ 0x58, 0x2b, 0x80, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0xc4, 0x79, 0xe4, 0x3e,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+ 0x74, 0x2f, 0xce, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0x30, 0x08, 0x9c, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+ 0x90, 0x52, 0xb2, 0x3d, 0x84, 0x31, 0xf5, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x90, 0x52, 0xb2, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0xc4, 0x79, 0xe4, 0x3e,
+ 0xec, 0x9e, 0xef, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+ 0x90, 0x52, 0x32, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x52, 0x32, 0x3c,
+ 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0x5e, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+ 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+ 0xe4, 0x9c, 0xc8, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xa0, 0xf4, 0x02, 0xbf, 0xf0, 0xbd, 0x85, 0x3d, 0x30, 0xe7, 0xde, 0xbd,
+ 0x90, 0x31, 0xf5, 0x3d, 0x34, 0xe7, 0xde, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x85, 0xbd, 0xea, 0xbd, 0x05, 0xbf,
+ 0x80, 0x52, 0x32, 0x3c, 0x80, 0x31, 0xf5, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0x00, 0xbe, 0x05, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+ 0x08, 0xc2, 0x53, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+ 0x80, 0x52, 0x32, 0x3c, 0x90, 0x31, 0xf5, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0xbe, 0x05, 0x3d,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x4c, 0x0a, 0xc3, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x3e, 0x08, 0x1c, 0x3f, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xfc, 0xbf, 0xac, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
+ 0x10, 0xe3, 0x10, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
+ 0xa8, 0x75, 0x96, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x18, 0xc4, 0xfa, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x30, 0xe7, 0xde, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xa8, 0x75, 0x96, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xc4, 0x79, 0xe4, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x40, 0x08, 0x1c, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0x9c, 0x54, 0xd9, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x4c, 0x0a, 0xc3, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0xbe, 0x05, 0x3d,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0x32, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0x10, 0xe3, 0x10, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0xa0, 0x52, 0x32, 0x3d, 0x74, 0x2f, 0xce, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+ 0xa8, 0x75, 0x96, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+ 0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0xbd,
+ 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x88, 0x52, 0x32, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x58, 0x0c, 0xea, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0x3d, 0x84, 0x31, 0xf5, 0x3e,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x5e, 0xac, 0x13, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+ 0x88, 0x52, 0x32, 0xbe, 0xa8, 0x75, 0x96, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x90, 0x52, 0x32, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x30, 0xe7, 0xde, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x6c, 0xae, 0x3a, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
+ 0x90, 0x52, 0xb2, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x90, 0x31, 0xf5, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xec, 0x9e, 0xef, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+ 0x08, 0xc2, 0x53, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0x14, 0xe3, 0x90, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0x32, 0x3e, 0xb4, 0x77, 0xbd, 0xbe,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
+ 0xea, 0xbd, 0x05, 0xbf, 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xe0, 0x9c, 0x48, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+ 0x30, 0xe7, 0x5e, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x31, 0xf5, 0x3d,
+ 0x68, 0x2d, 0x27, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x7c, 0x50, 0x8b, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x90, 0x31, 0xf5, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0xde, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x88, 0x52, 0x32, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0xc4, 0x79, 0xe4, 0xbe,
+ 0x5c, 0x0c, 0xea, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+ 0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+ 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x68, 0x2d, 0x27, 0x3e,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0x48, 0xbe, 0x3c, 0x08, 0x9c, 0x3e,
+ 0x5c, 0x0c, 0xea, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+ 0x14, 0xe3, 0x90, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+ 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+ 0xea, 0xbd, 0x05, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0xb2, 0xbc,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xe4, 0x9c, 0xc8, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x24, 0xe5, 0xb7, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+ 0x58, 0x2b, 0x80, 0x3e, 0x24, 0xe5, 0xb7, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+ 0x40, 0x08, 0x9c, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+ 0x80, 0x52, 0x32, 0xbc, 0x8e, 0x52, 0x32, 0x3f, 0x74, 0x2f, 0xce, 0x3e,
+ 0x54, 0x2b, 0x80, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x3c, 0x08, 0x9c, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+ 0xa8, 0x75, 0x16, 0xbf, 0x38, 0x68, 0x72, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x18, 0xc4, 0xfa, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x14, 0xe3, 0x90, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0xd0, 0x9a, 0x21, 0xbf,
+ 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
+ 0x88, 0x52, 0x32, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x95, 0xd3, 0x45, 0xbf,
+ 0x80, 0x52, 0x32, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xb4, 0x77, 0xbd, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x00, 0x41, 0x40, 0xbf, 0x5c, 0x0c, 0xea, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x52, 0x8b, 0x56, 0xbf, 0x60, 0x0c, 0x6a, 0x3e,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x43, 0x89, 0x2f, 0xbf, 0x34, 0x87, 0x08, 0xbf,
+ 0x54, 0x2b, 0x80, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0xf2, 0x3e, 0x19, 0xbf, 0x3c, 0x08, 0x9c, 0xbe,
+ 0xb4, 0x77, 0xbd, 0xbe, 0x86, 0xd1, 0x1e, 0xbf, 0x90, 0x52, 0xb2, 0xbd,
+ 0x52, 0x8b, 0x56, 0xbf, 0x14, 0xe3, 0x90, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x9c, 0x54, 0xd9, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0xa8, 0x75, 0x96, 0x3e,
+ 0x18, 0xc4, 0xfa, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0x10, 0xe3, 0x10, 0xbe, 0xf2, 0x3e, 0x19, 0xbf, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x80, 0x31, 0xf5, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x84, 0x31, 0xf5, 0xbe,
+ 0x38, 0x08, 0x1c, 0xbe, 0x58, 0x0c, 0xea, 0xbe, 0x7e, 0x50, 0x0b, 0xbf,
+ 0x5e, 0xac, 0x13, 0xbf, 0x88, 0x52, 0x32, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x13, 0xe3, 0x90, 0xbf,
+ 0x5e, 0xac, 0x13, 0x3f, 0xd0, 0x9a, 0xa1, 0x3e, 0x3c, 0x08, 0x9c, 0xbe,
+ 0xe1, 0x6c, 0x9d, 0xbf, 0xa8, 0x75, 0x96, 0xbe, 0x17, 0xc4, 0x7a, 0xbf,
+ 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+ 0x34, 0x87, 0x08, 0xbf, 0x20, 0xe5, 0xb7, 0xbe, 0x22, 0xe5, 0x37, 0xbf,
+ 0x40, 0x08, 0x9c, 0x3d, 0x7e, 0x50, 0x0b, 0x3f, 0x90, 0x52, 0xb2, 0xbd,
+ 0x88, 0x31, 0x75, 0x3e, 0xa0, 0xf4, 0x02, 0xbf, 0x74, 0x2f, 0xce, 0xbe,
+ 0xd0, 0x9a, 0x21, 0xbf, 0xa8, 0x75, 0x96, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+ 0x84, 0x31, 0xf5, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0xc2, 0x53, 0xbf, 0x80, 0x31, 0xf5, 0xbd, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x18, 0xc4, 0xfa, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0x3c, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x88, 0x52, 0x32, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x30, 0xe7, 0xde, 0x3d, 0xa8, 0x75, 0x96, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+ 0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0xb2, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+ 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0x3d,
+ 0x4c, 0x0a, 0xc3, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x40, 0x08, 0x1c, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x38, 0x08, 0x1c, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x68, 0x2d, 0x27, 0x3e,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0x3d,
+ 0x10, 0xe3, 0x10, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x8c, 0x52, 0xb2, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0x32, 0x3c,
+ 0x00, 0xbe, 0x05, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0x30, 0xe7, 0xde, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0x75, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x18, 0xe3, 0x10, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0x30, 0xe7, 0xde, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0x3d,
+ 0x90, 0x31, 0xf5, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+ 0x30, 0xe7, 0xde, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x90, 0x52, 0xb2, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+ 0x30, 0x08, 0x9c, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x31, 0xf5, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+ 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe7, 0xde, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xc0, 0x52, 0xb2, 0x3c, 0xe8, 0xbd, 0x85, 0xbe,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x74, 0x2f, 0x4e, 0xbf,
+ 0x40, 0x08, 0x1c, 0x3e, 0x4b, 0x0a, 0x43, 0xbf, 0x7b, 0xb0, 0x61, 0xbf,
+ 0x80, 0x52, 0xb2, 0xbc, 0x14, 0xe3, 0x90, 0xbe, 0x74, 0x2f, 0xce, 0x3e,
+ 0x88, 0x52, 0x32, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x84, 0x31, 0xf5, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x3c, 0x08, 0x9c, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x3c, 0x08, 0x9c, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x14, 0xe3, 0x90, 0x3e, 0x22, 0xe5, 0x37, 0xbf,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x80, 0x52, 0x32, 0xbd, 0x43, 0x89, 0x2f, 0xbf, 0x00, 0xbe, 0x05, 0x3d,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x18, 0xc4, 0xfa, 0xbe, 0x34, 0xe7, 0xde, 0x3e,
+ 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0xb2, 0x3e,
+ 0x58, 0x2b, 0x80, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+ 0x88, 0x52, 0x32, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x84, 0x31, 0xf5, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x68, 0x2d, 0x27, 0x3e,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0x74, 0x2f, 0xce, 0x3e,
+ 0x84, 0x31, 0xf5, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0x53, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x22, 0xe5, 0x37, 0xbf, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x88, 0x31, 0x75, 0x3e, 0xf2, 0x3e, 0x19, 0xbf, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x68, 0x2d, 0x27, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x43, 0x89, 0x2f, 0xbf,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+ 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0x3c,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x74, 0x2f, 0xce, 0x3e,
+ 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+ 0x1a, 0x64, 0x24, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x00, 0xbe, 0x05, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0xd0, 0x9a, 0x21, 0xbf,
+ 0xe7, 0x1d, 0x5c, 0xbf, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+ 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0xbd,
+ 0xe8, 0xbd, 0x85, 0xbe, 0xc8, 0x19, 0x0e, 0xbf, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x14, 0xe3, 0x90, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x56, 0x2b, 0x00, 0xbf, 0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x30, 0xe7, 0xde, 0x3d, 0x65, 0x2d, 0x27, 0xbf, 0xa0, 0x52, 0x32, 0x3d,
+ 0xfc, 0xbf, 0xac, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+ 0x60, 0x2d, 0x27, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x24, 0xe5, 0xb7, 0x3e,
+ 0xa8, 0x75, 0x96, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+ 0x14, 0xe3, 0x90, 0xbe, 0xf2, 0x3e, 0x19, 0x3f, 0x54, 0x2b, 0x80, 0xbe,
+ 0x18, 0xe3, 0x10, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
+ 0x58, 0x0c, 0xea, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x4c, 0x0a, 0xc3, 0x3e,
+ 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0x14, 0xe3, 0x90, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e, 0xb8, 0x77, 0xbd, 0x3e,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+ 0x80, 0x52, 0x32, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+ 0xec, 0xbd, 0x85, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+ 0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xf2, 0x3e, 0x19, 0x3f, 0x74, 0x2f, 0xce, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x9c, 0x54, 0x59, 0xbf,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x8c, 0x52, 0xb2, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+ 0xec, 0x9e, 0xef, 0x3e, 0x8c, 0x52, 0xb2, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x12, 0xe3, 0x10, 0xbf, 0x14, 0xe3, 0x90, 0x3e, 0xe8, 0xbd, 0x85, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0x08, 0x9c, 0xbd, 0x74, 0x2f, 0xce, 0xbe,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x05, 0x3d,
+ 0x80, 0x31, 0xf5, 0xbd, 0xf2, 0x3e, 0x19, 0xbf, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x58, 0x0c, 0xea, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x74, 0x2f, 0xce, 0x3e,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x58, 0x0c, 0xea, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+ 0xe0, 0x9c, 0x48, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x52, 0xb2, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x90, 0x52, 0xb2, 0xbd, 0x84, 0x31, 0xf5, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0x08, 0xc2, 0x53, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xfc, 0xbf, 0xac, 0x3e,
+ 0x5e, 0xac, 0x13, 0x3f, 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x14, 0xe3, 0x90, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x52, 0x8b, 0x56, 0xbf, 0xb8, 0x77, 0x3d, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xb8, 0x77, 0x3d, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x14, 0xe3, 0x90, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x58, 0x0c, 0xea, 0xbe,
+ 0x0c, 0xc2, 0xd3, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x90, 0x31, 0xf5, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0x54, 0x2b, 0x80, 0xbe, 0xea, 0xbd, 0x05, 0xbf,
+ 0x80, 0x31, 0x75, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x58, 0x2b, 0x80, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x40, 0x08, 0x1c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+ 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x08, 0xc2, 0x53, 0x3e,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xc4, 0x79, 0xe4, 0xbe, 0xc4, 0x79, 0xe4, 0x3e,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0x80, 0x31, 0x75, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x7e, 0x50, 0x0b, 0xbf,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0xf8, 0xbf, 0xac, 0xbe,
+ 0xa8, 0x75, 0x96, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x14, 0xe3, 0x90, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0x14, 0xe3, 0x90, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+ 0x38, 0x08, 0x1c, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xec, 0xbd, 0x85, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0xca, 0x19, 0x0e, 0x3f, 0x0c, 0xc2, 0xd3, 0x3e,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x3c, 0x08, 0x9c, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0x48, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+ 0x90, 0x52, 0xb2, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x9c, 0xc8, 0x3e,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x10, 0xe3, 0x10, 0xbe, 0xa8, 0x75, 0x96, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x30, 0xe7, 0xde, 0xbd, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x88, 0x31, 0x75, 0x3e,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0x88, 0x52, 0x32, 0xbe, 0x7b, 0xb0, 0x61, 0xbf, 0x80, 0x52, 0x32, 0x3c,
+ 0x80, 0x31, 0xf5, 0xbd, 0xc8, 0x19, 0x0e, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
+ 0x68, 0x2d, 0xa7, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x58, 0x0c, 0xea, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+ 0x68, 0x2d, 0x27, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0x30, 0x08, 0x9c, 0xbd, 0xaf, 0xf6, 0x29, 0xbf,
+ 0x8c, 0x52, 0xb2, 0xbe, 0xa8, 0x75, 0x16, 0xbf, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xec, 0x9e, 0xef, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x31, 0x75, 0xbe,
+ 0x5c, 0x0c, 0xea, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x08, 0xc2, 0x53, 0xbe, 0xb6, 0x77, 0x3d, 0x3f, 0x30, 0xe7, 0xde, 0xbd,
+ 0x80, 0x50, 0x8b, 0x3e, 0x34, 0xe7, 0xde, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+ 0x46, 0x89, 0x2f, 0x3f, 0x40, 0x08, 0x1c, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x34, 0x87, 0x08, 0xbf, 0xb8, 0x77, 0x3d, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+ 0x08, 0xc2, 0x53, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x82, 0x31, 0x75, 0x3f,
+ 0x88, 0x52, 0x32, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x88, 0x31, 0x75, 0x3e,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x22, 0xe5, 0x37, 0x3f,
+ 0x30, 0xe7, 0xde, 0xbd, 0x3e, 0x08, 0x1c, 0x3f, 0x18, 0xe3, 0x10, 0x3e,
+ 0xe0, 0x9c, 0x48, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x3c, 0x08, 0x1c, 0xbf,
+ 0x60, 0x0c, 0x6a, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x43, 0x89, 0x2f, 0xbf, 0x60, 0x2d, 0x27, 0xbe,
+ 0xe2, 0x9c, 0x48, 0x3f, 0x8c, 0x52, 0xb2, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x95, 0xd3, 0x45, 0xbf, 0x84, 0x31, 0xf5, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x86, 0xd1, 0x1e, 0xbf, 0x80, 0x50, 0x8b, 0x3e, 0x90, 0x52, 0xb2, 0x3e,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+ 0x54, 0x2b, 0x80, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0x40, 0x08, 0x9c, 0x3d, 0x0a, 0xc2, 0x53, 0x3f,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0x0c, 0xc2, 0xd3, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x12, 0xe3, 0x10, 0x3f,
+ 0xf2, 0x3e, 0x19, 0x3f, 0xe0, 0x9c, 0xc8, 0xbd, 0x7f, 0x50, 0x8b, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x14, 0xe3, 0x90, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x96, 0xd3, 0x45, 0x3f, 0x3e, 0x08, 0x1c, 0x3f, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x18, 0xe3, 0x10, 0x3e, 0x84, 0x31, 0xf5, 0x3e, 0x1a, 0x64, 0x24, 0xbf,
+ 0x08, 0xc2, 0x53, 0xbe, 0x1a, 0x64, 0x24, 0x3f, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x30, 0x08, 0x9c, 0xbd, 0x18, 0xc4, 0xfa, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+ 0x30, 0xe7, 0x5e, 0x3e, 0xec, 0xbd, 0x85, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+ 0x08, 0xc2, 0x53, 0xbf, 0x58, 0x2b, 0x80, 0x3e, 0x3c, 0x08, 0x9c, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x9c, 0x54, 0xd9, 0x3e,
+ 0x60, 0x2d, 0x27, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
+ 0x88, 0x31, 0x75, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
+ 0x5e, 0xac, 0x13, 0xbf, 0x80, 0x52, 0x32, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbe,
+ 0x18, 0xe3, 0x10, 0x3e, 0xa8, 0x75, 0x16, 0xbf, 0x90, 0x31, 0xf5, 0x3d,
+ 0x30, 0xe7, 0x5e, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x85, 0xbe, 0xfc, 0xbf, 0xac, 0x3e,
+ 0x40, 0x08, 0x1c, 0x3e, 0x3c, 0x08, 0x9c, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x30, 0x08, 0x9c, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x68, 0x2d, 0x27, 0x3e,
+ 0xa0, 0xf4, 0x02, 0xbf, 0x68, 0x2d, 0x27, 0x3e, 0x5e, 0xac, 0x13, 0xbf,
+ 0xa8, 0x75, 0x96, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x43, 0x89, 0x2f, 0xbf,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0x18, 0xc4, 0xfa, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x12, 0xe3, 0x10, 0x3f, 0x00, 0x41, 0x40, 0xbf,
+ 0x38, 0x08, 0x1c, 0xbe, 0x86, 0xd1, 0x1e, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x90, 0x52, 0x32, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+ 0x54, 0x2b, 0x80, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+ 0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+ 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x7e, 0x50, 0x0b, 0xbf, 0x80, 0x31, 0x75, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0x90, 0x52, 0x32, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x00, 0xbe, 0x05, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x60, 0x2d, 0x27, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x0c, 0xc2, 0xd3, 0x3e,
+ 0x30, 0x08, 0x9c, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0x6c, 0xae, 0x3a, 0xbf,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0x32, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0x90, 0x52, 0x32, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x30, 0xe7, 0x5e, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+ 0xa8, 0x75, 0x96, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x90, 0x31, 0xf5, 0x3d, 0x88, 0x31, 0x75, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0xc8, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x14, 0xe3, 0x90, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x80, 0x52, 0x32, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
+ 0x74, 0x2f, 0xce, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x56, 0x2b, 0x00, 0xbf,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0xb2, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x74, 0x2f, 0xce, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+ 0xec, 0xbd, 0x85, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xa8, 0x75, 0x96, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+ 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0xec, 0xbd, 0x85, 0x3e,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x7e, 0x50, 0x0b, 0xbf, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0x3c, 0x08, 0x9c, 0x3e, 0xa0, 0xf4, 0x02, 0xbf,
+ 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0x08, 0x9c, 0xbd,
+ 0xa2, 0xf4, 0x02, 0x3f, 0xa0, 0x52, 0x32, 0x3d, 0x5e, 0xac, 0x13, 0xbf,
+ 0x08, 0xc2, 0x53, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x00, 0xbe, 0x05, 0x3d,
+ 0x12, 0xe3, 0x10, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
+ 0xa8, 0x75, 0x96, 0xbe, 0x84, 0x31, 0xf5, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+ 0x20, 0xe5, 0xb7, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x3c, 0x08, 0x9c, 0x3e, 0x29, 0x66, 0x4b, 0xbf,
+ 0xc4, 0x79, 0xe4, 0x3e, 0x3c, 0x08, 0x9c, 0xbe, 0x5e, 0xac, 0x13, 0x3f,
+ 0x90, 0x52, 0xb2, 0x3d, 0xc8, 0x19, 0x0e, 0xbf, 0x58, 0x2b, 0x80, 0x3e,
+ 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x12, 0xe3, 0x10, 0xbf, 0x24, 0xe5, 0xb7, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0x00, 0xbe, 0x05, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0x80, 0x52, 0x32, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x80, 0x31, 0xf5, 0xbd, 0x68, 0x2d, 0x27, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x36, 0x87, 0x08, 0x3f, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0xa2, 0xf4, 0x02, 0x3f,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x86, 0xd1, 0x1e, 0xbf, 0x90, 0x31, 0xf5, 0x3d,
+ 0x3c, 0x08, 0x1c, 0xbf, 0x34, 0x87, 0x08, 0xbf, 0x9c, 0x54, 0xd9, 0xbe,
+ 0xfc, 0xbf, 0xac, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0xb8, 0x77, 0x3d, 0x3e,
+ 0xa8, 0x75, 0x16, 0xbf, 0x43, 0x89, 0x2f, 0xbf, 0xec, 0x9e, 0xef, 0x3e,
+ 0x34, 0x87, 0x88, 0xbf, 0x68, 0x2d, 0x27, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+ 0x7e, 0x50, 0x0b, 0x3f, 0x80, 0x50, 0x8b, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x34, 0x87, 0x08, 0xbf, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x31, 0x75, 0xbe,
+ 0xda, 0x1b, 0x35, 0x3f, 0x80, 0x52, 0x32, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0xca, 0x19, 0x0e, 0x3f,
+ 0x4c, 0x0a, 0xc3, 0x3e, 0xe7, 0x1d, 0x5c, 0xbf, 0x9e, 0x54, 0x59, 0x3f,
+ 0x9c, 0x54, 0xd9, 0x3e, 0xa0, 0xf4, 0x02, 0xbf, 0x4c, 0x0a, 0xc3, 0x3e,
+ 0x1a, 0x64, 0x24, 0x3f, 0x84, 0x31, 0xf5, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x80, 0x52, 0x32, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0xe7, 0x1d, 0x5c, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x90, 0x52, 0xb2, 0x3d, 0x22, 0xe5, 0x37, 0x3f, 0x08, 0xc2, 0x53, 0x3e,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x3c, 0x08, 0x9c, 0xbe, 0x34, 0x87, 0x08, 0xbf,
+ 0x3c, 0x08, 0x9c, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x50, 0x8b, 0x3e,
+ 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
+ 0x08, 0xc2, 0x53, 0xbe, 0xf9, 0xbf, 0x2c, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x84, 0x31, 0xf5, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0xbd,
+ 0x65, 0x2d, 0x27, 0xbf, 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x5c, 0x0c, 0xea, 0x3e,
+ 0x80, 0x50, 0x8b, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0xa8, 0x75, 0x96, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x08, 0xc2, 0x53, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0xbe,
+ 0xf8, 0xbf, 0xac, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0x7c, 0x50, 0x8b, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x58, 0x2b, 0x80, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+ 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
+ 0xea, 0xbd, 0x05, 0xbf, 0x80, 0x52, 0xb2, 0xbc, 0xa8, 0x75, 0x96, 0x3e,
+ 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
+ 0x80, 0x31, 0x75, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+ 0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x3c, 0x08, 0x1c, 0xbf, 0x68, 0x2d, 0x27, 0x3e,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x74, 0x2f, 0xce, 0xbe,
+ 0x30, 0xe7, 0x5e, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x14, 0xe3, 0x90, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0xc8, 0x19, 0x0e, 0xbf,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xa8, 0x75, 0x96, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x90, 0x52, 0xb2, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x90, 0x52, 0xb2, 0xbd, 0x68, 0x2d, 0xa7, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x34, 0x87, 0x08, 0xbf, 0xfc, 0xbf, 0xac, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+ 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xf8, 0xbf, 0xac, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0x24, 0xe5, 0xb7, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+ 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
+ 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+ 0x90, 0x52, 0x32, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+ 0x08, 0xc2, 0xd3, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0x3d,
+ 0x00, 0xbe, 0x05, 0x3d, 0xec, 0xbd, 0x85, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+ 0x0c, 0xc2, 0xd3, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+ 0x90, 0x52, 0x32, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0xc8, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x18, 0xe3, 0x10, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0x30, 0x08, 0x9c, 0xbd, 0x9c, 0x54, 0xd9, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+ 0x88, 0x31, 0x75, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x0a, 0xc3, 0x3e,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0x86, 0xd1, 0x1e, 0xbf,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xe8, 0xbd, 0x05, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x54, 0x2b, 0x80, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x7e, 0x50, 0x0b, 0xbf,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0xb4, 0x77, 0xbd, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x90, 0x52, 0x32, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xc4, 0x79, 0xe4, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x8c, 0x52, 0xb2, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x9c, 0x54, 0xd9, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+ 0xa8, 0x75, 0x96, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x08, 0xc2, 0x53, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xa8, 0x75, 0x96, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x90, 0x31, 0xf5, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
+ 0x40, 0x08, 0x1c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+ 0x80, 0x52, 0xb2, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x80, 0x52, 0x32, 0xbc, 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x60, 0x2d, 0x27, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x88, 0x52, 0x32, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x38, 0x08, 0x1c, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+ 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
+ 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0x3c,
+ 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbe,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x08, 0xc2, 0x53, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
+ 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
+ 0x54, 0x2b, 0x80, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0xec, 0xbd, 0x85, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+ 0x80, 0x31, 0x75, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbd, 0xa8, 0x75, 0x96, 0xbf, 0x18, 0xe3, 0x10, 0x3e,
+ 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xfc, 0xbf, 0xac, 0x3e, 0x0a, 0xc2, 0x53, 0x3f, 0xca, 0x19, 0x0e, 0x3f,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
+ 0xc4, 0x79, 0xe4, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+ 0x60, 0x2d, 0x27, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
+ 0x08, 0xc2, 0x53, 0x3e, 0xb4, 0x77, 0xbd, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x20, 0xe5, 0xb7, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+ 0x1a, 0x64, 0x24, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+ 0x80, 0x31, 0x75, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0x86, 0xd1, 0x1e, 0x3f,
+ 0x14, 0xe3, 0x90, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x19, 0x0e, 0xbf,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x85, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x4b, 0x0a, 0x43, 0xbf, 0x90, 0x31, 0xf5, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x7c, 0x50, 0x8b, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e, 0x74, 0x2f, 0xce, 0xbe,
+ 0xa2, 0xf4, 0x02, 0x3f, 0x34, 0x87, 0x08, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x14, 0xe3, 0x90, 0xbe, 0x90, 0x52, 0xb2, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0xaf, 0xf6, 0x29, 0xbf,
+ 0x22, 0xe5, 0x37, 0xbf, 0x18, 0xe3, 0x10, 0x3e, 0x08, 0xc2, 0x53, 0x3e,
+ 0x83, 0x31, 0x75, 0xbf, 0xf0, 0xbd, 0x85, 0x3d, 0x96, 0xd3, 0x45, 0x3f,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xd0, 0x9a, 0xa1, 0x3e,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0xc8, 0x19, 0x0e, 0xbf,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x24, 0xe5, 0xb7, 0x3e, 0x90, 0x52, 0xb2, 0x3e,
+ 0xb4, 0x77, 0xbd, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x56, 0x2b, 0x00, 0x3f,
+ 0x84, 0x31, 0xf5, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
+ 0x34, 0x87, 0x08, 0xbf, 0x34, 0x87, 0x08, 0xbf, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x08, 0xc2, 0xd3, 0xbe, 0xa4, 0xd5, 0x6c, 0xbf, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x12, 0xe3, 0x10, 0x3f,
+ 0x0a, 0x92, 0xa8, 0xbf, 0x68, 0x2d, 0x27, 0x3e, 0xa8, 0x75, 0x16, 0xbf,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x17, 0xc4, 0x7a, 0xbf, 0x00, 0x41, 0x40, 0xbf, 0x38, 0x08, 0x1c, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3d, 0x65, 0x2d, 0x27, 0xbf, 0x1a, 0x64, 0x24, 0xbf,
+ 0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0x56, 0x2b, 0x00, 0xbf,
+ 0xfc, 0xbf, 0xac, 0x3e, 0xaf, 0xf6, 0x29, 0xbf, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x14, 0xe3, 0x90, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x3c, 0x08, 0x9c, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x31, 0x75, 0xbe, 0xc8, 0x19, 0x0e, 0xbf,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0xec, 0x9e, 0xef, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0x75, 0xbe,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+ 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x31, 0x75, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x90, 0x52, 0xb2, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x08, 0xc2, 0x53, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x80, 0x52, 0xb2, 0xbc, 0xec, 0xbd, 0x85, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
+ 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x31, 0x75, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x88, 0x31, 0x75, 0x3e,
+ 0x80, 0x31, 0x75, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+ 0x38, 0x08, 0x1c, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+ 0x80, 0x52, 0xb2, 0xbc, 0xe8, 0xbd, 0x85, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x9c, 0x3d,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+ 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x34, 0x87, 0x08, 0xbf,
+ 0x30, 0xe7, 0xde, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x90, 0x52, 0xb2, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+ 0x3c, 0x08, 0x9c, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x90, 0x31, 0xf5, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+ 0xf8, 0xbf, 0xac, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x80, 0x52, 0x32, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x88, 0x31, 0x75, 0x3e, 0x3c, 0x08, 0x1c, 0xbf,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x7c, 0x50, 0x8b, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
+ 0x3c, 0x08, 0x1c, 0xbf, 0x8c, 0x52, 0xb2, 0xbe, 0x43, 0x89, 0x2f, 0xbf,
+ 0x54, 0x2b, 0x80, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x84, 0x31, 0xf5, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x80, 0x52, 0x32, 0xbc, 0x3c, 0x08, 0x9c, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x8c, 0x52, 0xb2, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+ 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xf2, 0x3e, 0x19, 0xbf,
+ 0xec, 0xbd, 0x85, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x3c, 0x08, 0x9c, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0x43, 0x89, 0x2f, 0xbf, 0xd0, 0x9a, 0x21, 0xbf,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+ 0xf9, 0xbf, 0x2c, 0xbf, 0x90, 0x52, 0xb2, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x58, 0x0c, 0xea, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0xbd,
+ 0x30, 0x08, 0x9c, 0xbd, 0xd0, 0x9a, 0xa1, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x0a, 0x92, 0xa8, 0xbf, 0x08, 0xc2, 0xd3, 0xbe, 0x34, 0x87, 0x08, 0xbf,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x31, 0x75, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0x60, 0x2d, 0x27, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
+ 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe, 0x1a, 0x64, 0x24, 0xbf,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+ 0x5e, 0xac, 0x13, 0xbf, 0x40, 0x08, 0x9c, 0x3d, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x08, 0xc2, 0x53, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x34, 0xe7, 0xde, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x30, 0x08, 0x9c, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+ 0x14, 0xe3, 0x90, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xec, 0xbd, 0x85, 0x3e,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0x80, 0x52, 0x32, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x56, 0x2b, 0x00, 0xbf,
+ 0x40, 0x08, 0x9c, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x3c, 0x08, 0x9c, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0x1a, 0x64, 0x24, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x90, 0x31, 0xf5, 0x3d, 0xd8, 0x1b, 0x35, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0x74, 0x2f, 0xce, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0xc4, 0x79, 0xe4, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+ 0xa0, 0x52, 0x32, 0x3d, 0x9c, 0x54, 0xd9, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x30, 0xe7, 0xde, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
+ 0x90, 0x52, 0x32, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x68, 0x2d, 0xa7, 0x3e, 0xae, 0xf6, 0x29, 0x3f, 0xe8, 0xbd, 0x05, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+ 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x74, 0x2f, 0xce, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x40, 0x08, 0x9c, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0x5e, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xf8, 0xbf, 0xac, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x90, 0x52, 0x32, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0x3c,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe7, 0xde, 0xbd,
+ 0x3e, 0x08, 0x1c, 0x3f, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x31, 0xf5, 0xbd,
+ 0xf9, 0xbf, 0x2c, 0xbf, 0x60, 0x2d, 0x27, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x9c, 0x54, 0xd9, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+ 0x90, 0x52, 0xb2, 0x3d, 0x24, 0xe5, 0xb7, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x12, 0xe3, 0x10, 0xbf, 0x88, 0x31, 0x75, 0x3e,
+ 0xa8, 0x75, 0x16, 0xbf, 0x3c, 0x08, 0x9c, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x80, 0x52, 0x32, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xec, 0xbd, 0x85, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x8c, 0x52, 0xb2, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x80, 0x31, 0xf5, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0x88, 0x31, 0x75, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+ 0x90, 0x52, 0xb2, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
+ 0xec, 0x9e, 0xef, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
+ 0xec, 0xbd, 0x85, 0x3e, 0xa0, 0xf4, 0x02, 0xbf, 0x80, 0x52, 0x32, 0x3c,
+ 0x14, 0xe3, 0x90, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x3c, 0x08, 0x9c, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+ 0x56, 0x2b, 0x00, 0xbf, 0x24, 0xe5, 0xb7, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x84, 0x31, 0xf5, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x34, 0x87, 0x08, 0xbf, 0x80, 0x50, 0x8b, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
+ 0x58, 0x2b, 0x80, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+ 0x08, 0xc2, 0x53, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x88, 0x31, 0x75, 0x3e,
+ 0x74, 0x2f, 0xce, 0xbe, 0x7e, 0x50, 0x0b, 0xbf, 0xf0, 0xbd, 0x05, 0x3e,
+ 0xc4, 0x79, 0xe4, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x40, 0xe7, 0x5e, 0x3d, 0x74, 0x2f, 0xce, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+ 0x18, 0xe3, 0x10, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
+ 0xec, 0x9e, 0xef, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x5c, 0x0c, 0xea, 0x3e,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x8c, 0x52, 0xb2, 0xbe, 0xb4, 0x77, 0xbd, 0xbe,
+ 0xb4, 0x77, 0xbd, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xa0, 0xf4, 0x02, 0xbf,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x14, 0xe3, 0x90, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xe0, 0x9c, 0x48, 0xbe, 0xec, 0x9e, 0xef, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+ 0x34, 0x87, 0x08, 0xbf, 0x34, 0xe7, 0xde, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x80, 0x52, 0x32, 0xbc, 0xa8, 0x75, 0x96, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x5e, 0xac, 0x13, 0xbf, 0x88, 0x52, 0x32, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x68, 0x2d, 0xa7, 0x3e,
+ 0x80, 0x52, 0x32, 0x3c, 0x58, 0x0c, 0x6a, 0xbe, 0x34, 0x87, 0x08, 0xbf,
+ 0x80, 0x31, 0x75, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
+ 0x80, 0x31, 0xf5, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x64, 0x2d, 0xa7, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0xee, 0x9e, 0x6f, 0xbf,
+ 0xc8, 0x19, 0x0e, 0xbf, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+ 0x9c, 0x54, 0xd9, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x4c, 0x0a, 0xc3, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0x7e, 0x50, 0x0b, 0xbf, 0xca, 0x19, 0x0e, 0x3f,
+ 0xa0, 0xf4, 0x02, 0xbf, 0x20, 0xe7, 0x5e, 0xbd, 0x38, 0x68, 0x72, 0xbf,
+ 0x38, 0x68, 0x72, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x8c, 0x52, 0xb2, 0xbe, 0xa8, 0x75, 0x16, 0xbf, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xec, 0xbd, 0x85, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
+ 0x1c, 0xc4, 0xfa, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+ 0x84, 0x31, 0xf5, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+ 0x08, 0xc2, 0x53, 0x3e, 0xf2, 0x3e, 0x19, 0xbf, 0xe0, 0x9c, 0x48, 0x3e,
+ 0xea, 0xbd, 0x05, 0xbf, 0x36, 0x87, 0x08, 0x3f, 0x60, 0x2d, 0x27, 0xbe,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x02, 0x11, 0x95, 0xbf,
+ 0x90, 0x31, 0xf5, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+ 0x08, 0xc2, 0x53, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+ 0xf2, 0x3e, 0x19, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0xe4, 0x9c, 0xc8, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+ 0x8c, 0x52, 0xb2, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0xaf, 0xf6, 0x29, 0xbf, 0xe9, 0xed, 0xb0, 0xbf,
+ 0xb4, 0x77, 0xbd, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x5c, 0x0c, 0xea, 0x3e,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x84, 0x31, 0xf5, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0x86, 0xd1, 0x9e, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
+ 0x38, 0x08, 0x1c, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xaf, 0xf6, 0x29, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x65, 0x2d, 0x27, 0xbf, 0xa0, 0x52, 0x32, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x5c, 0x0c, 0xea, 0x3e, 0x3c, 0x08, 0x9c, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+ 0xf2, 0x3e, 0x19, 0x3f, 0xec, 0xbd, 0x85, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x34, 0x87, 0x08, 0xbf, 0x3c, 0x08, 0x9c, 0x3e,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x14, 0xe3, 0x90, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xec, 0x9e, 0xef, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x68, 0x2d, 0xa7, 0x3e, 0x8c, 0x52, 0xb2, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0xc4, 0x79, 0xe4, 0x3e, 0x56, 0x2b, 0x00, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x74, 0x2f, 0xce, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x8e, 0x52, 0x32, 0x3f,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x5a, 0x0c, 0x6a, 0xbf, 0x3c, 0x08, 0x9c, 0x3e, 0xd2, 0x9a, 0x21, 0x3f,
+ 0x08, 0xc2, 0x53, 0x3e, 0xea, 0xbd, 0x05, 0x3f, 0x58, 0x2b, 0x80, 0x3e,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x40, 0x08, 0x9c, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x3c, 0x08, 0x9c, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x08, 0xc2, 0x53, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
+ 0x90, 0x31, 0xf5, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x60, 0x2d, 0x27, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0x74, 0x2f, 0xce, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0xe4, 0x9c, 0xc8, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
+ 0x40, 0x08, 0x9c, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0xe7, 0x5e, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0xa8, 0x75, 0x96, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x14, 0xe3, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x2d, 0x27, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e,
+ 0x3c, 0x08, 0x9c, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xa8, 0x75, 0x96, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0x3c,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x80, 0x52, 0x32, 0x3c, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0x58, 0x2b, 0x80, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xa8, 0x75, 0x96, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+ 0x80, 0x31, 0xf5, 0xbd, 0x0c, 0xc2, 0xd3, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x90, 0x52, 0xb2, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+ 0x40, 0x08, 0x9c, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x31, 0x75, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x40, 0x08, 0x1c, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0xa0, 0x52, 0x32, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x14, 0xe3, 0x90, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x3c, 0x08, 0x9c, 0xbe, 0xc8, 0x19, 0x0e, 0xbf, 0x80, 0x52, 0xb2, 0xbc,
+ 0x18, 0xe3, 0x10, 0x3e, 0x5e, 0xac, 0x13, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x14, 0xe3, 0x90, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
+ 0xc4, 0x79, 0xe4, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0xd0, 0x9a, 0xa1, 0x3e, 0x22, 0xe5, 0x37, 0xbf,
+ 0x88, 0x31, 0x75, 0x3e, 0xd8, 0x1b, 0x35, 0xbf, 0x64, 0x2d, 0xa7, 0xbe,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x80, 0x31, 0x75, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x24, 0xe5, 0xb7, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0x68, 0x2d, 0xa7, 0x3e, 0xa0, 0xf4, 0x02, 0xbf,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x74, 0x2f, 0xce, 0x3e,
+ 0x68, 0x2d, 0x27, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xcd, 0xfa, 0x77, 0xbf, 0x7b, 0xb0, 0x61, 0xbf, 0x88, 0x31, 0x75, 0x3e,
+ 0x68, 0x2d, 0x27, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0xec, 0x9e, 0xef, 0x3e,
+ 0x14, 0xe3, 0x90, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xec, 0xbd, 0x85, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xec, 0xbd, 0x85, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x88, 0x31, 0x75, 0x3e,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x56, 0x2b, 0x00, 0x3f, 0x8c, 0x52, 0xb2, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x88, 0x31, 0x75, 0x3e,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xec, 0xbd, 0x85, 0x3e, 0x90, 0x52, 0x32, 0x3e,
+ 0x74, 0x2f, 0xce, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x7e, 0x50, 0x0b, 0xbf, 0x58, 0x2b, 0x80, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0x84, 0x31, 0xf5, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+ 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x8d, 0x52, 0x32, 0xbf,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x0c, 0x6a, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x95, 0xd3, 0x45, 0xbf, 0xfc, 0xbf, 0xac, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x14, 0xe3, 0x90, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0x68, 0x2d, 0xa7, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x74, 0x2f, 0xce, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
+ 0x14, 0xe3, 0x90, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0x3c,
+ 0x8d, 0x52, 0x32, 0xbf, 0x64, 0x2d, 0xa7, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x3c, 0x08, 0x9c, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xf8, 0xbf, 0xac, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x74, 0x2f, 0x4e, 0xbf,
+ 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0xd0, 0x9a, 0x21, 0xbf,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xda, 0xeb, 0x89, 0xbf,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+ 0x30, 0xe7, 0xde, 0x3d, 0x9c, 0x54, 0xd9, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
+ 0xc4, 0x79, 0xe4, 0xbe, 0xf9, 0xbf, 0x2c, 0xbf, 0x80, 0x52, 0xb2, 0xbc,
+ 0xd8, 0x1b, 0x35, 0xbf, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x90, 0x52, 0x32, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+ 0x80, 0x52, 0xb2, 0xbc, 0xb8, 0x77, 0x3d, 0x3e, 0x88, 0x52, 0x32, 0xbe,
+ 0x34, 0x87, 0x08, 0xbf, 0xe0, 0xbd, 0x85, 0xbd, 0x22, 0xe5, 0x37, 0xbf,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
+ 0x56, 0x2b, 0x00, 0xbf, 0x30, 0xe7, 0x5e, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x88, 0x31, 0x75, 0x3e, 0xc4, 0x79, 0xe4, 0xbe, 0x65, 0x2d, 0x27, 0xbf,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0x9c, 0x48, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
+ 0xec, 0x9e, 0xef, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+ 0xc8, 0x19, 0x0e, 0xbf, 0xd0, 0x9a, 0x21, 0xbf, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x4c, 0x0a, 0xc3, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x88, 0x31, 0x75, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0x58, 0x2b, 0x80, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
+ 0xec, 0x9e, 0xef, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0xd3, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0xbd, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+ 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
+ 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0xfc, 0xbf, 0xac, 0x3e,
+ 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
+ 0x88, 0x31, 0x75, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0xc8, 0x19, 0x0e, 0xbf,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xd8, 0x1b, 0x35, 0xbf,
+ 0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+ 0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x40, 0x08, 0x1c, 0x3e,
+ 0x08, 0xc2, 0x53, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x65, 0x2d, 0x27, 0xbf, 0x40, 0x08, 0x9c, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x60, 0x2d, 0x27, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x8c, 0x52, 0xb2, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x88, 0x52, 0x32, 0xbe,
+ 0x68, 0x2d, 0x27, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0xea, 0xbd, 0x05, 0xbf,
+ 0x88, 0x52, 0x32, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xa8, 0x75, 0x16, 0xbf, 0xe7, 0x1d, 0x5c, 0xbf, 0xd0, 0x9a, 0x21, 0xbf,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0x74, 0x2f, 0xce, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x80, 0x52, 0x32, 0xbc, 0x74, 0x2f, 0xce, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x90, 0x52, 0xb2, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+ 0x40, 0x08, 0x9c, 0x3d, 0x68, 0x2d, 0xa7, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x4c, 0xda, 0x97, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x38, 0x08, 0x1c, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x80, 0x52, 0x32, 0x3c, 0xc0, 0x52, 0xb2, 0x3c, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0xbc, 0x54, 0x2b, 0x80, 0xbe,
+ 0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0xec, 0x9e, 0xef, 0xbe,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xec, 0x9e, 0xef, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd,
+ 0x3c, 0x08, 0x9c, 0xbe, 0x3c, 0x08, 0x9c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x08, 0xc2, 0x53, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x31, 0x75, 0xbe,
+ 0x4c, 0x0a, 0xc3, 0x3e, 0xc4, 0x79, 0xe4, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
+ 0xa0, 0x52, 0x32, 0x3d, 0xec, 0x9e, 0xef, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0xea, 0xbd, 0x05, 0xbf, 0x74, 0x2f, 0xce, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
+ 0x40, 0x08, 0x1c, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0xb6, 0x77, 0x3d, 0xbf, 0x90, 0x52, 0xb2, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x14, 0xe3, 0x90, 0xbe, 0x5e, 0xac, 0x13, 0xbf,
+ 0x68, 0x2d, 0x27, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xa0, 0xf4, 0x02, 0xbf,
+ 0x14, 0xe3, 0x90, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
+ 0xaf, 0xf6, 0x29, 0xbf, 0x74, 0x2f, 0xce, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+ 0xa0, 0x52, 0x32, 0x3d, 0x64, 0x2d, 0xa7, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x68, 0x2d, 0xa7, 0x3e,
+ 0x1a, 0x64, 0x24, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0xaa, 0x75, 0x16, 0x3f,
+ 0x34, 0x87, 0x08, 0xbf, 0x08, 0xc2, 0xd3, 0xbe, 0x3c, 0x08, 0x1c, 0xbf,
+ 0x30, 0x08, 0x9c, 0xbd, 0x68, 0x2d, 0xa7, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x14, 0xe3, 0x90, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x7e, 0x50, 0x0b, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x8c, 0x52, 0xb2, 0xbe, 0xea, 0xbd, 0x05, 0xbf, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x88, 0x52, 0x32, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0x9c, 0x54, 0xd9, 0x3e,
+ 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+ 0xd8, 0x1b, 0x35, 0xbf, 0xa8, 0x75, 0x96, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x7e, 0x50, 0x0b, 0xbf,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x56, 0x2b, 0x00, 0xbf,
+ 0x10, 0xe3, 0x10, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x58, 0x0c, 0xea, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x14, 0xe3, 0x90, 0x3e,
+ 0xa8, 0x75, 0x96, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x64, 0x2d, 0xa7, 0xbe,
+ 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x3c, 0x08, 0x1c, 0xbf,
+ 0x54, 0x2b, 0x80, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x68, 0x2d, 0xa7, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0xf8, 0xbf, 0xac, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0x4c, 0x0a, 0xc3, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x84, 0x31, 0xf5, 0xbe,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x85, 0xbd, 0x1a, 0x64, 0x24, 0xbf,
+ 0x58, 0x0c, 0xea, 0xbe, 0x3c, 0x08, 0x9c, 0x3e, 0xa0, 0xf4, 0x02, 0xbf,
+ 0x08, 0xc2, 0x53, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+ 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x34, 0xe7, 0xde, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0xec, 0x9e, 0xef, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x90, 0x52, 0x32, 0x3e,
+ 0xfc, 0xbf, 0xac, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x68, 0x2d, 0x27, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0xaf, 0xf6, 0x29, 0xbf,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xb4, 0x77, 0xbd, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0xfc, 0xbf, 0xac, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x90, 0x31, 0xf5, 0x3d, 0xa8, 0x75, 0x96, 0xbe, 0xe7, 0x1d, 0x5c, 0xbf,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x84, 0x31, 0xf5, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
+ 0x90, 0x52, 0xb2, 0xbd, 0x31, 0xe7, 0x5e, 0xbf, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x74, 0x2f, 0xce, 0x3e, 0x74, 0x2f, 0xce, 0x3e, 0x8d, 0x52, 0x32, 0xbf,
+ 0x80, 0x52, 0x32, 0xbc, 0x74, 0x2f, 0xce, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+ 0x24, 0xe5, 0xb7, 0x3e, 0xa2, 0xf4, 0x02, 0x3f, 0x18, 0xe3, 0x10, 0x3e,
+ 0x14, 0xe3, 0x90, 0x3e, 0xc8, 0x19, 0x0e, 0xbf, 0x80, 0x52, 0x32, 0x3c,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xd0, 0x9a, 0xa1, 0x3e, 0xc4, 0x79, 0xe4, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x4b, 0x0a, 0x43, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x80, 0x52, 0x32, 0xbd, 0x14, 0xe3, 0x90, 0xbe, 0x84, 0x31, 0xf5, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xc8, 0x19, 0x0e, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x00, 0xbe, 0x05, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+ 0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0xd0, 0x9a, 0x21, 0xbf,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x50, 0x8b, 0x3e,
+ 0xf8, 0xbf, 0xac, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0x58, 0x0c, 0xea, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+ 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+ 0x80, 0x52, 0xb2, 0xbc, 0x8c, 0x52, 0xb2, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x8c, 0x52, 0xb2, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+ 0xfc, 0xbf, 0xac, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+ 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+ 0xaf, 0xf6, 0x29, 0xbf, 0x30, 0x08, 0x9c, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x80, 0x31, 0x75, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0xe0, 0x9c, 0x48, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0xbe, 0xf8, 0x50, 0xbf, 0xe0, 0x9c, 0x48, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xf9, 0xbf, 0x2c, 0xbf,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x9c, 0x54, 0xd9, 0x3e, 0x84, 0x31, 0xf5, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x90, 0x31, 0xf5, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe7, 0xde, 0x3d,
+ 0x08, 0xc2, 0x53, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x6c, 0xae, 0x3a, 0xbf, 0x40, 0x08, 0x9c, 0x3d, 0x30, 0xe7, 0xde, 0xbe,
+ 0x08, 0xc2, 0x53, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xe8, 0xbd, 0x85, 0xbe,
+ 0x90, 0x31, 0xf5, 0x3d, 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x80, 0x52, 0x32, 0x3c, 0x60, 0x2d, 0x27, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
+ 0x58, 0x0c, 0xea, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xbe, 0x05, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0x08, 0xc2, 0x53, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x7c, 0x50, 0x8b, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x24, 0xe5, 0xb7, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0xbd,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
+ 0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x20, 0xe5, 0xb7, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xfc, 0xbf, 0xac, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x9c, 0x54, 0xd9, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0x56, 0x2b, 0x00, 0xbf,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0xea, 0xbd, 0x05, 0xbf,
+ 0xc4, 0x79, 0xe4, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x7c, 0x50, 0x8b, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0x38, 0x08, 0x1c, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x30, 0xe7, 0x5e, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x4c, 0x0a, 0xc3, 0xbe,
+ 0x90, 0x52, 0x32, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x74, 0x2f, 0xce, 0x3e, 0x3c, 0x08, 0x9c, 0xbe, 0xd8, 0x1b, 0x35, 0xbf,
+ 0xf8, 0xbf, 0xac, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x7c, 0x50, 0x8b, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x9c, 0x54, 0xd9, 0x3e,
+ 0x80, 0x52, 0x32, 0xbc, 0x14, 0xe3, 0x90, 0xbe, 0x80, 0x52, 0x32, 0xbc,
+ 0xea, 0xbd, 0x05, 0xbf, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0x3c,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x60, 0x2d, 0x27, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x4c, 0x0a, 0xc3, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0xc4, 0x79, 0xe4, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbd, 0xf2, 0x3e, 0x19, 0x3f, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x38, 0x08, 0x1c, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x85, 0xbd, 0x68, 0x2d, 0xa7, 0x3e,
+ 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0xc8, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e,
+ 0xd0, 0x9a, 0x21, 0xbf, 0x80, 0x50, 0x8b, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+ 0xe0, 0x9c, 0x48, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0xf0, 0xbd, 0x85, 0x3d, 0x5c, 0x0c, 0xea, 0x3e,
+ 0x80, 0x52, 0x32, 0xbc, 0xc4, 0x79, 0xe4, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
+ 0xa0, 0x52, 0x32, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x58, 0x2b, 0x80, 0x3e, 0x18, 0xc4, 0xfa, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0xf8, 0xbf, 0xac, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0x3c, 0x08, 0x9c, 0x3e, 0xec, 0x9e, 0xef, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
+ 0x80, 0x52, 0x32, 0x3c, 0x00, 0xbe, 0x05, 0x3d, 0x08, 0xc2, 0xd3, 0xbe,
+ 0x88, 0x31, 0x75, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0x96, 0xd3, 0x45, 0x3f, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0xc4, 0x79, 0xe4, 0xbe,
+ 0x14, 0xe3, 0x90, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
+ 0x88, 0x52, 0x32, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x90, 0x31, 0xf5, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x8d, 0x52, 0x32, 0xbf,
+ 0x0c, 0xc2, 0xd3, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+ 0x08, 0xc2, 0x53, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0x90, 0x52, 0xb2, 0x3e,
+ 0xfc, 0xbf, 0xac, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+ 0xaf, 0xf6, 0x29, 0xbf, 0xe8, 0xbd, 0x05, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
+ 0x74, 0x2f, 0xce, 0x3e, 0xe4, 0x9c, 0xc8, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xea, 0xbd, 0x05, 0x3f, 0xb8, 0x77, 0x3d, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x68, 0x2d, 0xa7, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
+ 0x4c, 0x0a, 0xc3, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0x86, 0xd1, 0x1e, 0xbf,
+ 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x14, 0xe3, 0x90, 0x3e, 0xf8, 0xbf, 0xac, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xc8, 0x19, 0x0e, 0xbf, 0x80, 0x31, 0x75, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x80, 0x52, 0x32, 0x3c, 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x56, 0x2b, 0x00, 0x3f,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x34, 0x87, 0x08, 0xbf, 0x90, 0x52, 0xb2, 0xbd,
+ 0x88, 0x52, 0x32, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+ 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0x48, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+ 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbd,
+ 0x90, 0x52, 0xb2, 0x3d, 0x74, 0x2f, 0xce, 0xbe, 0x90, 0x52, 0xb2, 0x3e,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+ 0xaa, 0x75, 0x16, 0x3f, 0xb8, 0x77, 0x3d, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
+ 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
+ 0x4c, 0x0a, 0xc3, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0xd0, 0x9a, 0x21, 0xbf, 0x68, 0x2d, 0x27, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xb4, 0x77, 0xbd, 0xbe, 0xa2, 0xf4, 0x02, 0x3f,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x86, 0xd1, 0x9e, 0xbf, 0x80, 0x52, 0x32, 0xbd,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x86, 0xd1, 0x1e, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
+ 0x80, 0x52, 0xb2, 0xbc, 0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0xea, 0xbd, 0x05, 0xbf, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x12, 0xe3, 0x10, 0x3f, 0xf0, 0xbd, 0x85, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x7e, 0x50, 0x0b, 0x3f, 0x90, 0x52, 0x32, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
+ 0xe0, 0x9c, 0x48, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0xea, 0xbd, 0x05, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x30, 0xe7, 0xde, 0xbd, 0xb8, 0x77, 0xbd, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0x48, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
+ 0x14, 0xe3, 0x90, 0x3e, 0x20, 0xe5, 0xb7, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+ 0x24, 0xe5, 0xb7, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+ 0xa0, 0x52, 0x32, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x14, 0xe3, 0x90, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
+ 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0x86, 0xd1, 0x1e, 0xbf, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x30, 0xe7, 0xde, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0x38, 0x08, 0x1c, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0xd8, 0x1b, 0x35, 0xbf,
+ 0x30, 0x08, 0x9c, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x80, 0x31, 0xf5, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0x84, 0x31, 0xf5, 0xbe,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbc,
+ 0xf8, 0xbf, 0xac, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0x40, 0x08, 0x1c, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+ 0x54, 0x2b, 0x80, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x58, 0x0c, 0xea, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+ 0x3c, 0x08, 0x9c, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
+ 0x58, 0x2b, 0x80, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0x80, 0x52, 0x32, 0x3c, 0x20, 0xe5, 0xb7, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+ 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x05, 0xbd,
+ 0x80, 0x52, 0x32, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
+ 0x88, 0x52, 0x32, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x68, 0x2d, 0x27, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x31, 0x75, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0x32, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e,
+ 0x64, 0x2d, 0xa7, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x68, 0x2d, 0x27, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x90, 0x52, 0x32, 0x3e,
+ 0xb8, 0x77, 0x3d, 0x3e, 0x3c, 0x08, 0x1c, 0xbf, 0x60, 0x0c, 0x6a, 0x3e,
+ 0x3c, 0x08, 0x1c, 0xbf, 0xa8, 0x75, 0x96, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0x80, 0x52, 0x32, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+ 0x30, 0x08, 0x9c, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
+ 0x80, 0x31, 0xf5, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
+ 0x30, 0x08, 0x9c, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
+ 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xd8, 0x1b, 0x35, 0xbf, 0x80, 0x31, 0xf5, 0xbd,
+ 0xe0, 0x9c, 0x48, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
+ 0x40, 0x08, 0x1c, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
+ 0x80, 0x52, 0xb2, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0x88, 0x52, 0x32, 0xbe,
+ 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x31, 0xf5, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0xc2, 0xd3, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
+ 0xfb, 0x8f, 0x81, 0xbf, 0x80, 0x52, 0xb2, 0xbc, 0xb4, 0x77, 0xbd, 0xbe,
+ 0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x50, 0x8b, 0x3e,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x08, 0xc2, 0x53, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x50, 0x8b, 0x3e,
+ 0x54, 0x2b, 0x80, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
+ 0x74, 0x2f, 0xce, 0x3e, 0xb8, 0x77, 0xbd, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x80, 0x31, 0xf5, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+ 0x30, 0xe7, 0xde, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x31, 0x75, 0xbe,
+ 0x18, 0xe3, 0x10, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
+ 0x30, 0xe7, 0xde, 0xbd, 0xe7, 0x1d, 0x5c, 0xbf, 0x58, 0x2b, 0x80, 0x3e,
+ 0x60, 0x0c, 0x6a, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0x3c,
+ 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0xbd,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x9c, 0x54, 0xd9, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x84, 0x31, 0xf5, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
+ 0x14, 0xe3, 0x90, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
+ 0x0c, 0xc2, 0xd3, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
+ 0x18, 0xe3, 0x10, 0x3e, 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0xc4, 0x79, 0xe4, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x40, 0x08, 0x9c, 0x3d, 0x74, 0x2f, 0xce, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x64, 0x2d, 0xa7, 0xbe,
+ 0x24, 0xe5, 0xb7, 0x3e, 0x5c, 0x0c, 0xea, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xb4, 0x77, 0xbd, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x30, 0x08, 0x9c, 0xbd,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x38, 0x08, 0x1c, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0xec, 0xbd, 0x85, 0x3e,
+ 0x56, 0x2b, 0x00, 0xbf, 0x38, 0x08, 0x1c, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+ 0x18, 0xc4, 0xfa, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0x32, 0x3e,
+ 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+ 0xf8, 0xbf, 0xac, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
+ 0x00, 0xbe, 0x05, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x24, 0xe5, 0xb7, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+ 0xa8, 0x75, 0x96, 0xbe, 0xaf, 0xf6, 0x29, 0xbf, 0x30, 0xe7, 0x5e, 0x3e,
+ 0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0xbd,
+ 0xa0, 0x52, 0x32, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x20, 0xe5, 0xb7, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0xbd, 0x3e,
+ 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
+ 0x00, 0xbe, 0x05, 0x3d, 0x18, 0xc4, 0xfa, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0x38, 0x08, 0x1c, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
+ 0xc4, 0x79, 0xe4, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
+ 0x10, 0xe3, 0x10, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+ 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xe8, 0xbd, 0x85, 0xbe,
+ 0xd0, 0x9a, 0xa1, 0x3e, 0x5c, 0x0c, 0xea, 0x3e, 0x22, 0xe5, 0x37, 0xbf,
+ 0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
+ 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
+ 0x54, 0x2b, 0x80, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xae, 0xf6, 0x29, 0x3f,
+ 0xa8, 0x75, 0x96, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x80, 0x52, 0x32, 0x3c, 0x20, 0xe7, 0x5e, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
+ 0x3c, 0x08, 0x9c, 0x3e, 0xb8, 0x77, 0xbd, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
+ 0xc4, 0x79, 0xe4, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x86, 0xd1, 0x1e, 0x3f,
+ 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x1a, 0x64, 0x24, 0x3f,
+ 0x9c, 0x54, 0xd9, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x1c, 0xc4, 0xfa, 0x3e,
+ 0x76, 0x2f, 0x4e, 0x3f, 0xe0, 0xbd, 0x85, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
+ 0x10, 0xe3, 0x10, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0x90, 0x52, 0xb2, 0x3d,
+ 0xa0, 0x52, 0x32, 0x3d, 0x8d, 0x52, 0x32, 0xbf, 0x80, 0x31, 0x75, 0xbe,
+ 0x90, 0x31, 0xf5, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
+ 0x90, 0x52, 0x32, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0xcd, 0xfa, 0x77, 0xbf,
+ 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x18, 0xc4, 0xfa, 0xbe,
+ 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0xca, 0x19, 0x0e, 0x3f,
+ 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x8d, 0x52, 0x32, 0xbf,
+ 0x30, 0xe7, 0x5e, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
+ 0xd0, 0x9a, 0x21, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x60, 0x2d, 0x27, 0xbe,
+ 0xea, 0xbd, 0x05, 0x3f, 0x08, 0xc2, 0xd3, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x68, 0x2d, 0x27, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
+ 0x56, 0x2b, 0x00, 0x3f, 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0x14, 0xe3, 0x90, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
+ 0xea, 0xbd, 0x05, 0xbf, 0xfa, 0xbf, 0x2c, 0x3f, 0x80, 0x52, 0x32, 0xbd,
+ 0xf0, 0xbd, 0x05, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
+ 0x6e, 0xae, 0x3a, 0x3f, 0xe0, 0x9c, 0xc8, 0xbd, 0x24, 0xe5, 0xb7, 0x3e,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x9c, 0x54, 0xd9, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xfc, 0xbf, 0xac, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
+ 0x80, 0x52, 0x32, 0xbc, 0x40, 0x08, 0x9c, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
+ 0x08, 0xc2, 0x53, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+ 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
+ 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
+ 0x38, 0x08, 0x1c, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0x08, 0x9c, 0xbd,
+ 0x90, 0x31, 0xf5, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
+ 0xa0, 0x52, 0x32, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
+ 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0xfc, 0xbf, 0xac, 0x3e,
+ 0x80, 0x52, 0x32, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x00, 0xbe, 0x05, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x80, 0x52, 0x32, 0x3c, 0x60, 0x2d, 0x27, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
+ 0xb8, 0x77, 0x3d, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbc,
+ 0x80, 0x52, 0x32, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
+ 0xa0, 0x52, 0x32, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0xbd,
+ 0x80, 0x52, 0x32, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x20, 0xe7, 0x5e, 0xbd,
+ 0x90, 0x31, 0xf5, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x30, 0x08, 0x9c, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x30, 0xe7, 0x5e, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
+ 0xe0, 0xbd, 0x05, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
+ 0x40, 0x08, 0x9c, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
+ 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
+ 0x80, 0x52, 0x32, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0x3d,
+ 0x90, 0x31, 0xf5, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0x32, 0xbd,
+ 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x90, 0x31, 0xf5, 0x3d,
+ 0x40, 0x08, 0x9c, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
+ 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x18, 0xe3, 0x10, 0x3e,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x3c, 0x08, 0x9c, 0x3e,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
+ 0x68, 0x2d, 0x27, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0xb2, 0xbc,
+ 0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+ 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x52, 0x32, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0x9c, 0x48, 0xbe,
+ 0x60, 0x0c, 0x6a, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0xbd,
+ 0x40, 0x08, 0x9c, 0x3d, 0x61, 0x8d, 0x7d, 0xbf, 0x58, 0x0c, 0x6a, 0xbe,
+ 0xe8, 0xbd, 0x85, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x8c, 0x52, 0xb2, 0xbe,
+ 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
+ 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x58, 0x0c, 0x6a, 0xbe,
+ 0x8d, 0x52, 0x32, 0xbf, 0xb6, 0x77, 0x3d, 0xbf, 0x1c, 0xc4, 0xfa, 0x3e,
+ 0x80, 0x52, 0x32, 0xbc, 0x40, 0x08, 0x9c, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
+ 0xa8, 0x75, 0x96, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x80, 0x52, 0x32, 0xbc,
+ 0x5e, 0xac, 0x13, 0xbf, 0x5c, 0x0c, 0xea, 0x3e, 0x80, 0x52, 0x32, 0x3c,
+ 0xec, 0x9e, 0xef, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
+ 0x74, 0x2f, 0xce, 0xbe, 0xd0, 0x9a, 0x21, 0xbf, 0x20, 0xe5, 0xb7, 0xbe,
+ 0x1a, 0x64, 0x24, 0xbf, 0x65, 0x2d, 0x27, 0xbf, 0xd0, 0x9a, 0x21, 0xbf,
+ 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
+ 0xe0, 0xbd, 0x85, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
+ 0x88, 0x31, 0x75, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
+ 0xa8, 0x75, 0x96, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
+ 0x90, 0x52, 0xb2, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
+ 0x80, 0x52, 0x32, 0xbd, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
+ 0x80, 0x52, 0x32, 0x3c, 0xe8, 0xbd, 0x05, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
+ 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
+ 0xec, 0x9e, 0xef, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x52, 0x32, 0xbe,
+ 0xa2, 0xf4, 0x02, 0x3f, 0x58, 0x2b, 0x80, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
+ 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x8c, 0x52, 0xb2, 0xbe,
+ 0xe0, 0x9c, 0x48, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x74, 0x2f, 0xce, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
+ 0x90, 0x31, 0xf5, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x31, 0xf5, 0xbd,
+ 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x7c, 0x50, 0x8b, 0xbe,
+ 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
+ 0xa0, 0x52, 0x32, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0xea, 0xbd, 0x05, 0xbf,
+ 0x14, 0xe3, 0x90, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
+ 0x10, 0xe3, 0x10, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
+ 0xd0, 0x9a, 0xa1, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0xaf, 0xf6, 0x29, 0xbf,
+ 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
+ 0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
+ 0xf0, 0xbd, 0x85, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0xa8, 0x75, 0x16, 0xbf,
+ 0x20, 0xe7, 0x5e, 0xbd, 0xa8, 0x75, 0x16, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd,
+ 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x14, 0xe3, 0x90, 0xbe,
+}};
+const int32_t dnn_hiddenlayer_2_bias__4__cf__4_shape[1] = {59};
+const union {
+ uint8_t bytes[236];
+ float values[59];
+} dnn_hiddenlayer_2_bias__4__cf__4 = {{
+ 0x57, 0x61, 0xf1, 0x3f, 0x30, 0x26, 0x90, 0x3f, 0xe7, 0xc6, 0xe5, 0xbc,
+ 0x26, 0x25, 0xc0, 0xbd, 0x28, 0xeb, 0x96, 0xbe, 0x03, 0x9f, 0xa7, 0xbf,
+ 0x54, 0x6c, 0xec, 0x3f, 0xfa, 0x8e, 0x1c, 0x3f, 0x35, 0x7d, 0x0a, 0x40,
+ 0xeb, 0x5a, 0x3d, 0xbf, 0xa0, 0xcb, 0x28, 0x3f, 0xee, 0x93, 0xc9, 0x3f,
+ 0x1f, 0x68, 0x23, 0xbf, 0xbf, 0x97, 0x8c, 0x3f, 0xc3, 0x2c, 0xe4, 0xbf,
+ 0xf3, 0xc7, 0xd8, 0x3e, 0x69, 0x6d, 0xd5, 0x3e, 0x49, 0x5f, 0x19, 0x40,
+ 0x9c, 0x2f, 0xfb, 0x3d, 0x38, 0x3e, 0x08, 0xbf, 0x58, 0x26, 0x06, 0x40,
+ 0xf3, 0x59, 0x80, 0xbf, 0xc7, 0x4c, 0x0b, 0xc0, 0xc3, 0x12, 0x20, 0x3f,
+ 0x2a, 0xd6, 0x08, 0xbf, 0x80, 0xe3, 0x9b, 0x3e, 0x4a, 0xc1, 0x0d, 0x40,
+ 0xe1, 0x1d, 0x9f, 0xbf, 0xdb, 0x27, 0xfa, 0xbd, 0xa0, 0xde, 0xa5, 0xbf,
+ 0xd1, 0x4a, 0x01, 0x3f, 0xb2, 0x0d, 0x2e, 0xbf, 0xe5, 0x3b, 0x8c, 0x3f,
+ 0x64, 0xe9, 0x53, 0x3f, 0xf5, 0xb7, 0xc4, 0x3e, 0x5e, 0x26, 0x97, 0xbf,
+ 0x66, 0x90, 0x65, 0x3f, 0x58, 0x16, 0x20, 0x40, 0xe3, 0x7e, 0xe9, 0xbf,
+ 0x84, 0x87, 0x32, 0x3f, 0x3d, 0xd8, 0x34, 0xbf, 0xa9, 0xe2, 0xf3, 0xbe,
+ 0xe2, 0x54, 0xa8, 0xbe, 0xe1, 0x85, 0x19, 0x3f, 0xbb, 0x54, 0xd0, 0x3f,
+ 0xe0, 0x88, 0x16, 0xbf, 0xcd, 0x35, 0xcc, 0x3f, 0xff, 0x1b, 0x03, 0xbf,
+ 0x92, 0x93, 0xf6, 0xbe, 0xcb, 0x9a, 0x2d, 0x3f, 0x52, 0xb0, 0xd9, 0xbe,
+ 0xd1, 0x0b, 0x48, 0xbf, 0x78, 0x2c, 0xe9, 0x3e, 0xad, 0x46, 0x0a, 0xbf,
+ 0x80, 0x2d, 0x84, 0x3f, 0xa8, 0x55, 0x48, 0x3f, 0x1f, 0x69, 0x18, 0xbe,
+ 0x48, 0xc0, 0xd1, 0xbf, 0xa3, 0x20, 0xe8, 0xbf,
}};
-const int32_t dnn_logits_bias__2__cf__2_shape[1] = {1};
+const int32_t dnn_hiddenlayer_2_kernel__5__cf__5_shape[2] = {115, 59};
+const union {
+ uint8_t bytes[27140];
+ float values[6785];
+} dnn_hiddenlayer_2_kernel__5__cf__5 = {{
+ 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x8c, 0x1d, 0xbe,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x10, 0xd2, 0xbd, 0x58, 0x4f, 0x49, 0xbe,
+ 0x54, 0xcb, 0x94, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x54, 0x0d, 0xaf, 0xbe,
+ 0x00, 0xce, 0x37, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0x00, 0xce, 0x37, 0x3e,
+ 0x80, 0x0a, 0x0c, 0x3c, 0xc0, 0x0a, 0x8c, 0xbc, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0xa8, 0x12, 0x75, 0x3e, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x8c, 0x9d, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0x56, 0xaa, 0x87, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+ 0x58, 0xd3, 0x7d, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0xcb, 0x14, 0x3e,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d, 0xa0, 0x12, 0x75, 0x3d,
+ 0x00, 0x10, 0xd2, 0xbc, 0x80, 0x0a, 0x0c, 0x3c, 0xa0, 0x12, 0x75, 0xbd,
+ 0x56, 0xaa, 0x87, 0xbe, 0x2a, 0x9b, 0x12, 0xbf, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xa0, 0x12, 0xf5, 0x3d, 0x50, 0x91, 0x63, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
+ 0x58, 0x91, 0x63, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0xc0, 0x0a, 0x8c, 0xbc,
+ 0x00, 0x10, 0xd2, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d, 0x55, 0x2e, 0x3c, 0xbf,
+ 0xa8, 0x2b, 0x99, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x10, 0xd2, 0x3c,
+ 0x00, 0x4a, 0x03, 0xbe, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0x2b, 0x99, 0x3e,
+ 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x54, 0x2e, 0xbc, 0xbe,
+ 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0x3d,
+ 0xa0, 0x12, 0x75, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x10, 0xd2, 0x3d,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0xa8, 0x4c, 0xa6, 0x3e, 0x50, 0x4f, 0x49, 0x3e,
+ 0x58, 0xcb, 0x14, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0xce, 0xb7, 0xbe,
+ 0x00, 0xce, 0x37, 0x3e, 0x54, 0xec, 0xa1, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x12, 0x75, 0x3e,
+ 0xd5, 0x19, 0x01, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d, 0xa8, 0x12, 0x75, 0xbe,
+ 0x54, 0x70, 0xd6, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xa8, 0x8e, 0x40, 0x3e,
+ 0x00, 0x8c, 0x1d, 0x3f, 0x00, 0x10, 0xd2, 0x3d, 0x2a, 0x9b, 0x12, 0xbf,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0xd2, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x10, 0xd2, 0x3c, 0x54, 0x4f, 0xc9, 0x3e,
+ 0xa8, 0x4c, 0x26, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0x4f, 0x49, 0x3e,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x10, 0xd2, 0xbd, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x60, 0x0d, 0x2f, 0x3d, 0x50, 0x0d, 0xaf, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0x00, 0xce, 0x37, 0x3e, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x10, 0x52, 0x3e,
+ 0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0xd2, 0xbc, 0x54, 0x0d, 0xaf, 0xbe,
+ 0xa8, 0x6d, 0xb3, 0x3e, 0x54, 0xaa, 0x07, 0x3f, 0x00, 0xce, 0x37, 0x3e,
+ 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0xd0, 0xda, 0x3e, 0x2a, 0x7a, 0x05, 0x3f,
+ 0xa8, 0x0a, 0x8c, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
+ 0x2a, 0x7a, 0x05, 0x3f, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x31, 0xdf, 0xbe,
+ 0x00, 0x10, 0x52, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xd5, 0x7c, 0x28, 0xbf, 0xa8, 0x12, 0x75, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0xa0, 0x12, 0x75, 0xbd, 0x50, 0xcb, 0x14, 0x3e,
+ 0xa8, 0x12, 0x75, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x58, 0x91, 0x63, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+ 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0x50, 0xcb, 0x14, 0x3e,
+ 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+ 0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x6b, 0x90, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+ 0x00, 0x10, 0x52, 0x3e, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x10, 0x52, 0xbd,
+ 0x00, 0x10, 0xd2, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0xad, 0xaa, 0xbe,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x50, 0xd3, 0x7d, 0x3e, 0xff, 0x72, 0x79, 0xbf,
+ 0x50, 0xd3, 0x7d, 0x3e, 0x50, 0x91, 0x63, 0x3e, 0x50, 0x91, 0x63, 0x3e,
+ 0xa8, 0x4c, 0x26, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0xce, 0x37, 0xbe,
+ 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xad, 0xaa, 0xbe, 0x54, 0x70, 0xd6, 0xbe,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x80, 0x0a, 0x0c, 0x3c,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0xef, 0xc4, 0x3e, 0x50, 0x4f, 0x49, 0x3e,
+ 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0x4f, 0x49, 0x3f,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0x28, 0x82, 0x6e, 0x3f,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x8c, 0x9d, 0xbd, 0x2a, 0x9b, 0x12, 0xbf,
+ 0x00, 0x4a, 0x83, 0xbe, 0x54, 0x4f, 0xc9, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e,
+ 0x00, 0x4a, 0x03, 0x3f, 0x00, 0x10, 0xd2, 0x3d, 0x00, 0xad, 0xaa, 0xbe,
+ 0x54, 0xec, 0xa1, 0x3e, 0x00, 0x4a, 0x83, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaf, 0xcd, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0x54, 0xec, 0xa1, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x4a, 0x83, 0xbe, 0x54, 0x91, 0xe3, 0x3e, 0x50, 0x0d, 0xaf, 0xbd,
+ 0x50, 0xd3, 0x7d, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
+ 0xa0, 0x12, 0xf5, 0x3d, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x8c, 0x9d, 0x3e,
+ 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+ 0x00, 0xce, 0x37, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x6d, 0xb3, 0x3e,
+ 0x54, 0x70, 0xd6, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0x58, 0xd3, 0x7d, 0xbe,
+ 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x10, 0x52, 0x3d, 0x00, 0xef, 0xc4, 0x3e,
+ 0x60, 0x0d, 0x2f, 0x3d, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x4a, 0x03, 0x3e,
+ 0x2a, 0xbc, 0x1f, 0x3f, 0xa8, 0x4c, 0x26, 0x3e, 0x54, 0xaa, 0x87, 0x3e,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x91, 0xe3, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d,
+ 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0xb2, 0xf0, 0x3e,
+ 0x00, 0xad, 0xaa, 0x3e, 0x00, 0xce, 0xb7, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xa8, 0xaf, 0xcd, 0x3e,
+ 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x12, 0x75, 0xbd,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x4f, 0x49, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+ 0x00, 0x10, 0x52, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0xa8, 0x8e, 0x40, 0xbe, 0x50, 0xd3, 0x7d, 0x3e, 0xaa, 0x6d, 0xb3, 0xbe,
+ 0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x54, 0xd3, 0xfd, 0x3e,
+ 0x50, 0x91, 0xe3, 0x3d, 0x54, 0x0d, 0xaf, 0x3e, 0x00, 0xef, 0xc4, 0x3e,
+ 0x54, 0xaa, 0x87, 0x3e, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0xad, 0xaa, 0xbe,
+ 0xaa, 0xf1, 0xe7, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0xa8, 0x4c, 0x26, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0x58, 0x91, 0x63, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe,
+ 0xaa, 0xd0, 0x5a, 0xbf, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0xce, 0x37, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0xaa, 0x12, 0xf5, 0xbe, 0x54, 0x0d, 0xaf, 0x3e,
+ 0x00, 0x10, 0xd2, 0x3c, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x4a, 0x03, 0x3e,
+ 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x6b, 0x90, 0x3e, 0xd5, 0x3a, 0x0e, 0xbf,
+ 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0x6d, 0xb3, 0x3e, 0x50, 0x0d, 0xaf, 0x3d,
+ 0xaa, 0x2b, 0x99, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x58, 0x0d, 0x2f, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0x54, 0xcb, 0x94, 0xbe, 0xaa, 0x0a, 0x0c, 0xbf,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+ 0x55, 0xaa, 0x07, 0xbf, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x00, 0x00, 0x00,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0xaa, 0x12, 0xf5, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
+ 0xa8, 0x12, 0x75, 0x3e, 0x54, 0x0d, 0xaf, 0xbe, 0xa8, 0x6d, 0xb3, 0x3e,
+ 0xa8, 0x12, 0x75, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x8c, 0x1d, 0xbe,
+ 0xa8, 0x8e, 0x40, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0x80, 0x0a, 0x0c, 0xbc,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x50, 0x0d, 0xaf, 0xbd,
+ 0x54, 0xb2, 0xf0, 0xbe, 0x50, 0x91, 0x63, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+ 0xff, 0x30, 0x5f, 0xbf, 0x00, 0x6b, 0x90, 0x3e, 0xa8, 0x12, 0x75, 0x3e,
+ 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x10, 0xd2, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbc, 0x56, 0xaa, 0x87, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0xf1, 0xe7, 0xbe, 0x54, 0x70, 0xd6, 0xbe,
+ 0x50, 0x91, 0x63, 0x3e, 0xaa, 0x6d, 0x33, 0xbf, 0x80, 0x0a, 0x0c, 0xbc,
+ 0xaa, 0x0a, 0x0c, 0xbf, 0x54, 0xec, 0xa1, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe,
+ 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x73, 0xf9, 0xbe,
+ 0x00, 0x10, 0xd2, 0x3d, 0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe,
+ 0xa0, 0x12, 0x75, 0xbd, 0x80, 0x0a, 0x0c, 0x3c, 0x58, 0x0d, 0x2f, 0xbe,
+ 0xaa, 0x12, 0xf5, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0xa8, 0x12, 0x75, 0xbe,
+ 0x54, 0xd3, 0xfd, 0xbe, 0x54, 0x2e, 0xbc, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x50, 0x91, 0xe3, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x10, 0xd2, 0xbd,
+ 0xa8, 0x4c, 0x26, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x50, 0x0d, 0xaf, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0x0d, 0xaf, 0x3e,
+ 0xa8, 0x12, 0x75, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0x52, 0x3f, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x50, 0x0d, 0xaf, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0x56, 0xaa, 0x87, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
+ 0xaa, 0x4c, 0x26, 0x3f, 0x55, 0x0d, 0x2f, 0xbf, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xa8, 0x6d, 0xb3, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x31, 0xdf, 0xbe,
+ 0x00, 0x10, 0x52, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x50, 0x91, 0xe3, 0xbd, 0x54, 0x2e, 0xbc, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0xa8, 0x8e, 0x40, 0x3e, 0xa0, 0x12, 0x75, 0x3d, 0x80, 0x0a, 0x0c, 0x3c,
+ 0xa8, 0x6d, 0xb3, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x6b, 0x90, 0x3e,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x00, 0x10, 0xd2, 0x3c, 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0x56, 0xaa, 0x87, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x54, 0x2e, 0xbc, 0x3e, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+ 0x00, 0xad, 0xaa, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0x80, 0x0a, 0x0c, 0xbc,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+ 0x50, 0xcb, 0x14, 0x3e, 0x54, 0xec, 0xa1, 0x3e, 0xaa, 0x4c, 0x26, 0xbf,
+ 0xb0, 0x12, 0xf5, 0xbd, 0xaa, 0x8e, 0xc0, 0xbe, 0xaa, 0xaf, 0xcd, 0xbe,
+ 0x00, 0x4a, 0x03, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x4c, 0xa6, 0x3e,
+ 0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x10, 0x52, 0xbe,
+ 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x4a, 0x03, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
+ 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x6b, 0x10, 0xbf,
+ 0x54, 0x0d, 0xaf, 0x3e, 0x00, 0x4a, 0x03, 0x3e, 0x54, 0x4f, 0xc9, 0xbe,
+ 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0x52, 0x3e,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x10, 0xd2, 0x3c, 0x58, 0xd3, 0x7d, 0xbe,
+ 0xa8, 0x6d, 0xb3, 0x3e, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x10, 0xd2, 0xbc,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x31, 0xdf, 0x3e,
+ 0x55, 0xaa, 0x07, 0xbf, 0x54, 0x4f, 0xc9, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
+ 0x50, 0x0d, 0x2f, 0x3e, 0xd4, 0xbe, 0x42, 0xbf, 0xaa, 0x12, 0xf5, 0xbe,
+ 0x00, 0xce, 0x37, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+ 0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x8e, 0xc0, 0x3d, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x00, 0x52, 0xec, 0xbe, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x6b, 0x90, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd, 0x56, 0xaa, 0x87, 0xbe,
+ 0xaa, 0x0a, 0x0c, 0xbf, 0x80, 0x0a, 0x0c, 0x3c, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+ 0xaa, 0x2b, 0x99, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd, 0xa8, 0x12, 0x75, 0x3e,
+ 0x00, 0x10, 0xd2, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x8c, 0x9d, 0x3d,
+ 0x50, 0x4f, 0x49, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0xa8, 0x4c, 0x26, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
+ 0x54, 0x70, 0xd6, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0x52, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
+ 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x10, 0xd2, 0x3c, 0xaa, 0xf1, 0xe7, 0xbe,
+ 0x00, 0xce, 0x37, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+ 0x54, 0xcb, 0x94, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
+ 0xa8, 0x0a, 0x8c, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x4a, 0x03, 0x3e,
+ 0x50, 0x0d, 0xaf, 0xbd, 0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x52, 0xec, 0x3e, 0x00, 0x4a, 0x03, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xa0, 0x12, 0x75, 0xbd,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+ 0x00, 0x52, 0x6c, 0xbe, 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0x52, 0x3d,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x52, 0xbd, 0x00, 0x4a, 0x03, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0xa8, 0x4c, 0x26, 0xbe, 0x50, 0x0d, 0x2f, 0x3e,
+ 0x58, 0xcb, 0x14, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x4c, 0x26, 0x3e,
+ 0x00, 0x10, 0xd2, 0x3d, 0x58, 0x4f, 0x49, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0xad, 0xaa, 0x3e,
+ 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+ 0x00, 0x10, 0x52, 0x3d, 0x58, 0xcb, 0x14, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x00, 0x10, 0x52, 0x3d, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0xce, 0x37, 0x3e,
+ 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+ 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0xce, 0xb7, 0x3e, 0xa8, 0x8e, 0x40, 0xbe,
+ 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
+ 0x50, 0x0d, 0x2f, 0x3e, 0x54, 0x4f, 0xc9, 0xbe, 0x54, 0x91, 0xe3, 0xbe,
+ 0x00, 0xce, 0x37, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x10, 0x52, 0xbd,
+ 0x54, 0xaa, 0x87, 0x3e, 0x00, 0x4a, 0x03, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0x80, 0xda, 0x09, 0x3f, 0xa8, 0x8e, 0x40, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x58, 0x91, 0x63, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0xa8, 0xaf, 0xcd, 0x3e,
+ 0x50, 0x91, 0x63, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+ 0x00, 0xce, 0xb7, 0x3e, 0x00, 0x4a, 0x83, 0x3e, 0x00, 0x10, 0xd2, 0xbe,
+ 0x00, 0x4a, 0x03, 0xbf, 0x55, 0x2e, 0x3c, 0xbf, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x52, 0x6c, 0xbe,
+ 0x00, 0x10, 0x52, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+ 0xff, 0x0f, 0x52, 0xbf, 0x58, 0x4f, 0x49, 0xbe, 0xaa, 0xaf, 0xcd, 0xbe,
+ 0xaa, 0x8e, 0x40, 0xbf, 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x12, 0x75, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x4a, 0x03, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+ 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
+ 0x54, 0x0d, 0xaf, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x00, 0x4a, 0x83, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+ 0x80, 0x0a, 0x0c, 0x3c, 0xaa, 0xd0, 0xda, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0xad, 0xaa, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xa8, 0x4c, 0x26, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
+ 0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xaa, 0x0a, 0x0c, 0xbf, 0xaa, 0xf1, 0xe7, 0xbe, 0xd5, 0x3a, 0x0e, 0xbf,
+ 0x58, 0x4f, 0x49, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x7f, 0xfb, 0x16, 0xbf,
+ 0xa0, 0x12, 0xf5, 0x3d, 0x55, 0xaa, 0x07, 0xbf, 0x60, 0x0d, 0x2f, 0xbd,
+ 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x8c, 0x9d, 0x3d, 0xaa, 0x2b, 0x99, 0xbe,
+ 0xaa, 0x8e, 0xc0, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x6b, 0x90, 0x3e,
+ 0x00, 0x10, 0xd2, 0x3c, 0x58, 0xd3, 0x7d, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0xa0, 0x12, 0x75, 0x3d, 0x60, 0x0d, 0x2f, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0xa0, 0x12, 0xf5, 0x3d,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x54, 0x70, 0xd6, 0xbe,
+ 0x00, 0x4a, 0x03, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
+ 0x00, 0x10, 0x52, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x91, 0xe3, 0xbd,
+ 0x50, 0x0d, 0x2f, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x00, 0x8c, 0x9d, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x8e, 0x40, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+ 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+ 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x8c, 0x1d, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
+ 0xff, 0x30, 0x5f, 0xbf, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x10, 0xd2, 0xbe,
+ 0x00, 0x8c, 0x9d, 0x3d, 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
+ 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0x54, 0x0d, 0xaf, 0xbe,
+ 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x52, 0xec, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+ 0x50, 0x4f, 0x49, 0x3e, 0x00, 0xce, 0x37, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x8c, 0x9d, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x4a, 0x03, 0xbf, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x54, 0xec, 0xa1, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e,
+ 0x00, 0x6b, 0x10, 0xbf, 0x50, 0xcb, 0x14, 0x3e, 0x50, 0x0d, 0xaf, 0xbd,
+ 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x73, 0xf9, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0xa8, 0x12, 0x75, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+ 0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+ 0xaa, 0xd0, 0xda, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0xff, 0x8b, 0x1d, 0xbf, 0x54, 0xcb, 0x94, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0x8e, 0x40, 0x3e,
+ 0x58, 0x0d, 0x2f, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0xbd,
+ 0xaa, 0xaf, 0xcd, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
+ 0xa0, 0x12, 0xf5, 0x3d, 0xa0, 0x0a, 0x0c, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
+ 0x00, 0x10, 0xd2, 0x3c, 0x54, 0x91, 0xe3, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x50, 0x0d, 0x2f, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0xaa, 0x2b, 0x99, 0xbe,
+ 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x00, 0xce, 0xb7, 0xbe,
+ 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0xa0, 0x12, 0x75, 0x3d,
+ 0x00, 0x10, 0x52, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
+ 0x00, 0x8c, 0x9d, 0x3d, 0xa0, 0x0a, 0x0c, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x00, 0x10, 0x52, 0x3d, 0x00, 0x8c, 0x1d, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d,
+ 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6c, 0xbe,
+ 0x00, 0xce, 0xb7, 0x3e, 0xa8, 0xf1, 0xe7, 0x3e, 0x60, 0x0d, 0x2f, 0xbd,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x91, 0x63, 0x3e,
+ 0xaa, 0x0a, 0x0c, 0x3f, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+ 0x00, 0x10, 0xd2, 0x3d, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x4a, 0x03, 0xbe,
+ 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0x54, 0x4f, 0xc9, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0x12, 0xf5, 0x3e,
+ 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x8e, 0x40, 0x3e,
+ 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
+ 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0x52, 0x3d, 0x54, 0xcb, 0x94, 0xbe,
+ 0x00, 0x10, 0x52, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+ 0x60, 0x0d, 0x2f, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0x2a, 0xbc, 0x1f, 0x3f,
+ 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0xd2, 0xbc, 0x50, 0x91, 0xe3, 0xbd,
+ 0x00, 0x52, 0x6c, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e, 0x50, 0x0d, 0xaf, 0x3d,
+ 0x54, 0x2e, 0xbc, 0x3e, 0x54, 0xec, 0xa1, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+ 0x54, 0xec, 0xa1, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x60, 0x0d, 0x2f, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0x55, 0xaa, 0x07, 0xbf,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x56, 0xaa, 0x87, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x4a, 0x83, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0xaa, 0x12, 0xf5, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0xef, 0xc4, 0xbe,
+ 0x58, 0x0d, 0x2f, 0xbe, 0x54, 0x70, 0xd6, 0xbe, 0x00, 0x73, 0xf9, 0xbe,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+ 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0x00, 0xce, 0x37, 0xbe,
+ 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
+ 0xaa, 0x2b, 0x19, 0xbf, 0x00, 0x10, 0xd2, 0xbc, 0x54, 0xec, 0xa1, 0xbe,
+ 0x58, 0xcb, 0x14, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0x50, 0x4f, 0x49, 0x3e,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0xd2, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x52, 0xec, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
+ 0x54, 0x4f, 0xc9, 0xbe, 0xaa, 0xd0, 0xda, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x50, 0x91, 0x63, 0x3e, 0xa8, 0x12, 0x75, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0x54, 0x0d, 0xaf, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0x58, 0xd3, 0x7d, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe,
+ 0xd5, 0x19, 0x01, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xdf, 0xbe,
+ 0x00, 0x10, 0x52, 0x3d, 0xa8, 0xd0, 0xda, 0x3e, 0x00, 0x10, 0x52, 0xbd,
+ 0x00, 0x8c, 0x9d, 0x3d, 0x54, 0x0d, 0xaf, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0x00, 0x10, 0x52, 0x3d, 0xaa, 0x0a, 0x8c, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0xa8, 0x8e, 0x40, 0x3e, 0x54, 0x0d, 0xaf, 0x3e, 0x54, 0xec, 0xa1, 0x3e,
+ 0xaa, 0xaf, 0xcd, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0xd2, 0x3c,
+ 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e,
+ 0x00, 0xad, 0xaa, 0x3e, 0xff, 0x8b, 0x1d, 0xbf, 0x00, 0x4a, 0x03, 0x3e,
+ 0x00, 0x4a, 0x03, 0xbf, 0x00, 0x10, 0xd2, 0xbc, 0x58, 0x91, 0x63, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x4c, 0x26, 0x3e, 0x50, 0x0d, 0xaf, 0x3d,
+ 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x52, 0xec, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+ 0xa8, 0x2b, 0x99, 0x3e, 0x58, 0xd3, 0x7d, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
+ 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xad, 0xaa, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+ 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0xd2, 0x3c, 0xaa, 0x4c, 0xa6, 0xbe,
+ 0x54, 0x2e, 0xbc, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0x28, 0x1f, 0x47, 0x3f,
+ 0x54, 0x91, 0xe3, 0x3e, 0x50, 0x91, 0xe3, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x73, 0xf9, 0x3e,
+ 0x00, 0x52, 0x6c, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x10, 0x52, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
+ 0xaa, 0x12, 0xf5, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x0a, 0x8c, 0x3e,
+ 0x50, 0x4f, 0x49, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0x52, 0xbd,
+ 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x54, 0x70, 0xd6, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+ 0xa8, 0x4c, 0x26, 0x3e, 0x2a, 0x61, 0x61, 0xbf, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0x50, 0x91, 0xe3, 0xbd, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0xce, 0x37, 0xbe,
+ 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0xce, 0xb7, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+ 0xa8, 0x8e, 0x40, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd, 0x56, 0xaa, 0x87, 0xbe,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x8c, 0x9d, 0x3e,
+ 0x54, 0xd3, 0xfd, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0xbe,
+ 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0xaa, 0x6d, 0xb3, 0xbe,
+ 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+ 0x58, 0xcb, 0x14, 0xbe, 0x2a, 0xbc, 0x1f, 0xbf, 0x00, 0xce, 0x37, 0x3e,
+ 0x00, 0x10, 0x52, 0xbe, 0xa8, 0x12, 0x75, 0x3e, 0xaa, 0x6d, 0xb3, 0xbe,
+ 0xd5, 0x5b, 0x1b, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d, 0x60, 0x0d, 0x2f, 0x3d,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xd5, 0x19, 0x01, 0xbf,
+ 0x54, 0xec, 0xa1, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x60, 0x0d, 0x2f, 0x3d, 0xb0, 0x12, 0xf5, 0xbd, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x54, 0x0d, 0xaf, 0xbe, 0xff, 0x0f, 0x52, 0xbf, 0x54, 0x4f, 0xc9, 0x3e,
+ 0x54, 0xec, 0xa1, 0xbe, 0x50, 0xd3, 0x7d, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe,
+ 0x54, 0xcb, 0x14, 0x3f, 0x00, 0x10, 0x52, 0xbd, 0xaa, 0x2b, 0x19, 0xbf,
+ 0x58, 0x91, 0x63, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0xd5, 0x7c, 0x28, 0xbf,
+ 0xaa, 0x0a, 0x0c, 0xbf, 0xb0, 0x0a, 0x8c, 0xbd, 0x2a, 0xa3, 0x7b, 0xbf,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0x7f, 0xc1, 0x65, 0xbf, 0xa8, 0x0a, 0x8c, 0x3e,
+ 0x55, 0xec, 0x21, 0xbf, 0x60, 0x0d, 0x2f, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbc, 0xaa, 0x0a, 0x8c, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x54, 0xd3, 0xfd, 0xbe,
+ 0xa8, 0x8e, 0x40, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x31, 0xdf, 0xbe,
+ 0x00, 0x31, 0xdf, 0xbe, 0x7f, 0xa0, 0x58, 0xbf, 0x50, 0x91, 0x63, 0x3e,
+ 0x00, 0x31, 0xdf, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0xbe,
+ 0x00, 0xce, 0x37, 0xbe, 0xa8, 0x12, 0x75, 0x3e, 0xa8, 0x0a, 0x8c, 0x3e,
+ 0x00, 0x10, 0xd2, 0x3c, 0x00, 0xce, 0xb7, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
+ 0x00, 0x10, 0xd2, 0x3d, 0xaa, 0x6d, 0xb3, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x00, 0xad, 0xaa, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0xaa, 0x0a, 0x8c, 0xbe,
+ 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+ 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x4a, 0x83, 0xbe, 0x55, 0xaa, 0x07, 0xbf,
+ 0x58, 0x91, 0x63, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0x54, 0x70, 0xd6, 0xbe, 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0x50, 0x91, 0x63, 0x3e, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
+ 0x00, 0xef, 0xc4, 0xbe, 0x54, 0x70, 0xd6, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0xd0, 0x5a, 0xbe, 0xb0, 0x12, 0xf5, 0xbd,
+ 0x58, 0x91, 0x63, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0xad, 0xaa, 0xbe,
+ 0xff, 0xac, 0x2a, 0xbf, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x73, 0xf9, 0xbe,
+ 0x50, 0x91, 0xe3, 0x3d, 0xa8, 0x12, 0x75, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
+ 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc,
+ 0xaa, 0xf1, 0xe7, 0xbe, 0x54, 0x91, 0xe3, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x73, 0xf9, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x8c, 0x1d, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+ 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x12, 0x75, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+ 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0x3c,
+ 0x00, 0x10, 0x52, 0x3e, 0x00, 0xad, 0xaa, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x6b, 0x90, 0x3e,
+ 0xa8, 0x4c, 0x26, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x58, 0xd3, 0x7d, 0xbe,
+ 0x00, 0xad, 0xaa, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x50, 0x91, 0xe3, 0x3d,
+ 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0x50, 0x4f, 0x49, 0x3e,
+ 0x00, 0x8c, 0x9d, 0xbe, 0x55, 0xaa, 0x07, 0xbf, 0xa8, 0x8e, 0x40, 0xbe,
+ 0x00, 0x4a, 0x83, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0xa8, 0x8e, 0x40, 0x3e,
+ 0x00, 0x10, 0x52, 0xbd, 0xaa, 0x0a, 0x0c, 0xbf, 0x54, 0x4f, 0xc9, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0x0d, 0x2f, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
+ 0xa8, 0x4c, 0x26, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x54, 0x0d, 0xaf, 0xbe,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x10, 0x52, 0xbe,
+ 0x2a, 0x7a, 0x05, 0xbf, 0x54, 0x0d, 0xaf, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+ 0x00, 0xef, 0xc4, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
+ 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
+ 0xaa, 0x8e, 0xc0, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x54, 0xb2, 0xf0, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+ 0x56, 0xaa, 0x87, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
+ 0x00, 0x10, 0x52, 0x3e, 0xa8, 0x0a, 0x8c, 0x3e, 0x7f, 0x1c, 0x24, 0xbf,
+ 0xaa, 0xd0, 0xda, 0xbe, 0xd5, 0x3a, 0x0e, 0xbf, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x54, 0x4f, 0xc9, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc,
+ 0x2a, 0x1f, 0x47, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d, 0xaa, 0x12, 0xf5, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0xd5, 0x3a, 0x0e, 0xbf,
+ 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x4a, 0x83, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+ 0xa8, 0xd0, 0xda, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x4c, 0xa6, 0x3e,
+ 0x54, 0xcb, 0x94, 0x3e, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0xad, 0xaa, 0x3e,
+ 0xaa, 0x12, 0xf5, 0xbe, 0xff, 0x8b, 0x1d, 0xbf, 0xaa, 0x4c, 0xa6, 0xbe,
+ 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xa8, 0x6d, 0xb3, 0x3e,
+ 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+ 0x00, 0x6b, 0x90, 0x3e, 0xaa, 0x6d, 0xb3, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x10, 0x52, 0xbe,
+ 0x00, 0x10, 0xd2, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x10, 0xd2, 0xbe,
+ 0x50, 0x91, 0x63, 0x3e, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x8c, 0x1d, 0x3e,
+ 0xaa, 0x12, 0x75, 0xbf, 0x58, 0xd3, 0x7d, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
+ 0x00, 0x10, 0xd2, 0x3c, 0x50, 0x91, 0x63, 0x3e, 0x54, 0x2e, 0xbc, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x10, 0xd2, 0x3e, 0x00, 0x4a, 0x83, 0xbe,
+ 0xa8, 0x4c, 0x26, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x4a, 0x83, 0x3e,
+ 0xa0, 0x12, 0x75, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x8c, 0x9d, 0x3d,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0xa0, 0x12, 0x75, 0x3d, 0xaa, 0xaf, 0xcd, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x10, 0x52, 0xbd,
+ 0x58, 0x0d, 0x2f, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x00, 0xce, 0x37, 0x3e,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x4a, 0x83, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x52, 0x6c, 0x3e,
+ 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x10, 0x52, 0xbd,
+ 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0xce, 0xb7, 0xbe,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x12, 0xf5, 0xbd,
+ 0x00, 0x10, 0xd2, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x10, 0x52, 0x3e,
+ 0x00, 0xad, 0xaa, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe, 0x54, 0xb2, 0xf0, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x4a, 0x03, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x4c, 0xa6, 0x3e,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x10, 0xd2, 0xbc,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x31, 0xdf, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+ 0x00, 0x10, 0x52, 0xbe, 0x54, 0x91, 0xe3, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
+ 0xa0, 0x12, 0x75, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x10, 0x52, 0xbd,
+ 0x50, 0x0d, 0x2f, 0x3e, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0xaa, 0x87, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
+ 0x00, 0xef, 0xc4, 0x3e, 0x58, 0x91, 0x63, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x4a, 0x83, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+ 0xa8, 0x8e, 0xc0, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e, 0x60, 0x0d, 0x2f, 0xbd,
+ 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x4a, 0x83, 0x3e, 0x54, 0x91, 0xe3, 0xbe,
+ 0x54, 0x4f, 0xc9, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x10, 0xd2, 0x3c,
+ 0xd5, 0x3a, 0x0e, 0xbf, 0x00, 0x10, 0xd2, 0x3d, 0xb0, 0x12, 0xf5, 0xbd,
+ 0x58, 0x0d, 0x2f, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x56, 0xaa, 0x87, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbc, 0x50, 0x0d, 0x2f, 0x3e, 0x54, 0xd3, 0xfd, 0x3e,
+ 0xa8, 0x2b, 0x99, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
+ 0x56, 0xaa, 0x87, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x8c, 0x1d, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0x0d, 0xaf, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x52, 0x6c, 0x3e,
+ 0x50, 0x91, 0xe3, 0xbd, 0x54, 0x4f, 0xc9, 0x3e, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x00, 0x10, 0x52, 0x3d, 0x50, 0x4f, 0x49, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc,
+ 0x50, 0x91, 0xe3, 0x3d, 0x58, 0xcb, 0x14, 0xbe, 0x7f, 0x1c, 0x24, 0xbf,
+ 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x4a, 0x03, 0x3f, 0x58, 0xcb, 0x14, 0xbe,
+ 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+ 0xd5, 0x3a, 0x0e, 0xbf, 0xa0, 0x12, 0xf5, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x58, 0xcb, 0x14, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0xaa, 0x6d, 0xb3, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+ 0x00, 0x52, 0xec, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+ 0x00, 0x10, 0x52, 0xbd, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0xce, 0xb7, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc, 0xaa, 0x2b, 0x19, 0xbf,
+ 0x50, 0x0d, 0x2f, 0x3e, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x8c, 0x1d, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0x80, 0x0a, 0x0c, 0xbc,
+ 0xaa, 0x6d, 0xb3, 0xbe, 0xa8, 0xaf, 0xcd, 0x3e, 0x50, 0x91, 0x63, 0x3e,
+ 0x50, 0x0d, 0xaf, 0x3d, 0x50, 0xcb, 0x14, 0x3e, 0x50, 0x91, 0x63, 0x3e,
+ 0x00, 0x10, 0x52, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0x3d,
+ 0x00, 0x10, 0x52, 0xbd, 0xa8, 0x4c, 0x26, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+ 0x00, 0x6b, 0x90, 0xbe, 0x54, 0x2e, 0xbc, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
+ 0x54, 0x2e, 0xbc, 0x3e, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x4a, 0x03, 0xbe,
+ 0xa8, 0x0a, 0x8c, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x52, 0xec, 0x3e,
+ 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x54, 0x91, 0xe3, 0x3e, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0xb0, 0x0a, 0x8c, 0x3d, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0xa0, 0x12, 0x75, 0x3d, 0xb0, 0x12, 0xf5, 0xbd, 0xa8, 0x4c, 0x26, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0x0a, 0x0c, 0xbf,
+ 0x50, 0x91, 0xe3, 0xbd, 0x54, 0xcb, 0x94, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0x52, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0x52, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0x58, 0xcb, 0x14, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0xaa, 0xf1, 0xe7, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+ 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0x00, 0xce, 0xb7, 0x3e,
+ 0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x54, 0xaa, 0x87, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0xa0, 0x12, 0x75, 0xbd, 0x54, 0x70, 0xd6, 0x3e, 0x58, 0xcb, 0x14, 0xbe,
+ 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x4a, 0x83, 0x3e,
+ 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0xd2, 0xbc, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0x60, 0x0d, 0x2f, 0x3d, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0x3e,
+ 0x50, 0x91, 0xe3, 0x3d, 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0x0d, 0x2f, 0xbe,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe,
+ 0xa0, 0x12, 0xf5, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+ 0x00, 0x52, 0x6c, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x2b, 0x99, 0xbe,
+ 0x00, 0x10, 0x52, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x4a, 0x03, 0x3e,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0xce, 0x37, 0x3e, 0xb0, 0x12, 0xf5, 0xbd,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x10, 0xd2, 0x3c, 0x54, 0x0d, 0xaf, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x54, 0x2e, 0xbc, 0x3e, 0x60, 0x0d, 0x2f, 0x3d,
+ 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x10, 0x52, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d,
+ 0x58, 0x0d, 0x2f, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0xef, 0xc4, 0x3e,
+ 0xaa, 0x12, 0xf5, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0xaa, 0x87, 0x3e,
+ 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x54, 0x2e, 0xbc, 0x3e,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x8e, 0x40, 0x3e,
+ 0x00, 0x10, 0x52, 0xbe, 0x00, 0x52, 0x6c, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d,
+ 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0xff, 0x51, 0x6c, 0xbf,
+ 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x4a, 0x83, 0x3e,
+ 0x54, 0xcb, 0x94, 0xbe, 0x56, 0xaa, 0x87, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
+ 0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x6d, 0xb3, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
+ 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
+ 0x00, 0x6b, 0x90, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x6b, 0x90, 0xbe,
+ 0xa8, 0x0a, 0x8c, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0x54, 0x0d, 0xaf, 0x3e,
+ 0x54, 0x4f, 0xc9, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x58, 0x4f, 0x49, 0xbe,
+ 0x00, 0x4a, 0x83, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xce, 0xb7, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+ 0x00, 0x4a, 0x03, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x52, 0x6c, 0x3e, 0xa8, 0x12, 0x75, 0xbe,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x8e, 0x40, 0x3e, 0x50, 0x91, 0xe3, 0x3d,
+ 0x00, 0x31, 0xdf, 0xbe, 0x00, 0x10, 0x52, 0xbe, 0x00, 0xce, 0x37, 0x3e,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x0d, 0x2f, 0x3e, 0x50, 0x91, 0x63, 0x3e,
+ 0x54, 0x4f, 0xc9, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x91, 0xe3, 0xbd,
+ 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x4c, 0x26, 0x3e,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0xaa, 0x6d, 0xb3, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xd2, 0x3d, 0x54, 0xec, 0xa1, 0xbe,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe, 0x54, 0x91, 0xe3, 0xbe,
+ 0x2a, 0xbc, 0x1f, 0xbf, 0xa0, 0x12, 0x75, 0x3d, 0x50, 0x91, 0xe3, 0x3d,
+ 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x10, 0xd2, 0x3d,
+ 0x00, 0x52, 0x6c, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0x00, 0x10, 0xd2, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x8c, 0x1d, 0x3e,
+ 0x00, 0xce, 0xb7, 0x3e, 0x00, 0xef, 0xc4, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe,
+ 0x50, 0x91, 0xe3, 0x3d, 0xc0, 0x0a, 0x8c, 0x3c, 0x60, 0x0d, 0x2f, 0xbd,
+ 0xa8, 0x4c, 0x26, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x4a, 0x83, 0xbe,
+ 0x00, 0x4a, 0x03, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x8c, 0x1d, 0xbe,
+ 0x00, 0x10, 0x52, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+ 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x54, 0x2e, 0xbc, 0xbe,
+ 0x50, 0x91, 0x63, 0x3e, 0x00, 0x31, 0xdf, 0x3e, 0x54, 0xec, 0xa1, 0x3e,
+ 0x00, 0xce, 0xb7, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x10, 0x52, 0x3e,
+ 0x54, 0xec, 0xa1, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0x54, 0xaa, 0x87, 0x3e,
+ 0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0x50, 0xcb, 0x14, 0x3e,
+ 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0xef, 0xc4, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+ 0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0xa8, 0x4c, 0xa6, 0x3e, 0x50, 0x91, 0x63, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0xef, 0xc4, 0xbe,
+ 0xb0, 0x12, 0xf5, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+ 0xa0, 0x12, 0xf5, 0x3d, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x8c, 0x1d, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0xa0, 0x0a, 0x0c, 0xbd, 0xaa, 0x2b, 0x99, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0xce, 0xb7, 0x3e, 0x00, 0x31, 0xdf, 0x3e,
+ 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x4a, 0x83, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0x00, 0x8c, 0x1d, 0x3f, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x4a, 0x83, 0x3e,
+ 0x00, 0x73, 0xf9, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x73, 0xf9, 0x3e, 0xa8, 0x8e, 0x40, 0xbe,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x50, 0x4f, 0x49, 0x3e, 0x50, 0x91, 0xe3, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0x00, 0xad, 0xaa, 0x3e, 0x00, 0xad, 0xaa, 0x3e, 0x00, 0x10, 0xd2, 0xbe,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x4a, 0x03, 0xbf, 0x58, 0x91, 0x63, 0xbe,
+ 0xa8, 0x4c, 0x26, 0x3e, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0x58, 0xd3, 0x7d, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0xaa, 0x0a, 0x8c, 0xbe,
+ 0xff, 0x72, 0x79, 0xbf, 0xa8, 0xaf, 0xcd, 0x3e, 0xa8, 0x12, 0x75, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x8e, 0x40, 0x3e, 0x54, 0x0d, 0xaf, 0x3e,
+ 0x00, 0x52, 0xec, 0x3e, 0x50, 0x91, 0xe3, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xa8, 0xf1, 0xe7, 0x3e, 0x54, 0xec, 0xa1, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x58, 0x4f, 0x49, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x91, 0xe3, 0xbd,
+ 0x54, 0x4f, 0xc9, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0xa8, 0x12, 0xf5, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0xd0, 0x5a, 0x3e,
+ 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xce, 0xb7, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0xef, 0xc4, 0xbe,
+ 0xaa, 0x4c, 0xa6, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x4a, 0x03, 0x3f,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0x54, 0xcb, 0x94, 0x3e, 0x54, 0x91, 0xe3, 0xbe, 0x54, 0x2e, 0xbc, 0xbe,
+ 0x54, 0x91, 0xe3, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x50, 0x0d, 0xaf, 0xbd,
+ 0x00, 0xce, 0xb7, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
+ 0xa0, 0x12, 0xf5, 0x3d, 0xaa, 0x8e, 0xc0, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0x56, 0xaa, 0x87, 0xbe, 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x10, 0x52, 0xbd,
+ 0xa8, 0x4c, 0xa6, 0x3e, 0x50, 0x0d, 0x2f, 0x3e, 0x50, 0x91, 0xe3, 0x3d,
+ 0x00, 0x10, 0xd2, 0x3e, 0x00, 0x8c, 0x9d, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+ 0x54, 0x2e, 0xbc, 0x3e, 0x7f, 0xc1, 0x65, 0xbf, 0xb0, 0x12, 0xf5, 0xbd,
+ 0x60, 0x0d, 0x2f, 0x3d, 0xd5, 0x19, 0x01, 0xbf, 0x80, 0x0a, 0x0c, 0x3c,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x8c, 0x9d, 0xbd,
+ 0x00, 0x10, 0xd2, 0xbd, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
+ 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x4a, 0x83, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc,
+ 0xaa, 0x2b, 0x99, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x50, 0x0d, 0x2f, 0x3e, 0x58, 0x91, 0x63, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x52, 0x6c, 0x3e,
+ 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+ 0x54, 0xcb, 0x94, 0x3e, 0x55, 0xec, 0x21, 0xbf, 0x58, 0x4f, 0x49, 0xbe,
+ 0xaa, 0x6d, 0xb3, 0xbe, 0xd5, 0x3a, 0x0e, 0xbf, 0x50, 0x0d, 0xaf, 0x3d,
+ 0x55, 0x0d, 0x2f, 0xbf, 0x56, 0xaa, 0x87, 0xbe, 0x54, 0x2e, 0xbc, 0xbe,
+ 0xa8, 0x4c, 0x26, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x58, 0x91, 0x63, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0xd0, 0x5a, 0x3e,
+ 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0x2b, 0x99, 0x3e,
+ 0x00, 0x10, 0x52, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x8c, 0x9d, 0xbe, 0x54, 0x2e, 0xbc, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
+ 0x54, 0xec, 0xa1, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
+ 0x00, 0x6b, 0x90, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x73, 0xf9, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe,
+ 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+ 0x00, 0xce, 0x37, 0xbe, 0x54, 0x70, 0xd6, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x8c, 0x9d, 0xbd,
+ 0x50, 0x91, 0xe3, 0x3d, 0x54, 0xb2, 0xf0, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0x00, 0x4a, 0x03, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0xaa, 0xd0, 0xda, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0x58, 0x4f, 0x49, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+ 0x00, 0xce, 0x37, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0x4f, 0xc9, 0x3e,
+ 0xa8, 0x4c, 0x26, 0xbe, 0x2a, 0x7a, 0x05, 0xbf, 0x00, 0x8c, 0x9d, 0x3d,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x4a, 0x83, 0x3e,
+ 0x50, 0x91, 0x63, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0x54, 0x91, 0xe3, 0x3e, 0x54, 0xcb, 0x94, 0xbe, 0x50, 0x0d, 0x2f, 0x3e,
+ 0x00, 0x10, 0x52, 0x3e, 0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x73, 0xf9, 0x3e,
+ 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x8c, 0x9d, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x8e, 0x40, 0xbe,
+ 0x00, 0x6b, 0x90, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0x00, 0xad, 0xaa, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x10, 0xd2, 0xbe,
+ 0xa8, 0x8e, 0x40, 0x3e, 0xa0, 0x12, 0x75, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0x00, 0x31, 0xdf, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0x50, 0x91, 0xe3, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc, 0x60, 0x0d, 0x2f, 0xbd,
+ 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe,
+ 0x00, 0x6b, 0x90, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xaa, 0x2b, 0x99, 0xbe,
+ 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e, 0x50, 0x91, 0x63, 0x3e,
+ 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x31, 0xdf, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x00, 0x8c, 0x1d, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0x00, 0x8c, 0x1d, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0xaa, 0x0a, 0x0c, 0x3f, 0x54, 0x2e, 0xbc, 0x3e,
+ 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x8c, 0x1d, 0xbe, 0x50, 0xd3, 0x7d, 0x3e,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0xb0, 0x0a, 0x8c, 0x3d, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x50, 0x0d, 0x2f, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x50, 0x0d, 0xaf, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0xaa, 0x0a, 0x0c, 0xbf,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x12, 0x75, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x56, 0xaa, 0x87, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x00, 0x4a, 0x83, 0x3e, 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0x12, 0xf5, 0xbe, 0xd5, 0x3a, 0x0e, 0xbf,
+ 0xa8, 0x12, 0x75, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x8c, 0x9d, 0xbd,
+ 0x00, 0x8c, 0x1d, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0xcb, 0x94, 0xbe,
+ 0x00, 0x10, 0x52, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x52, 0x6c, 0x3e,
+ 0x00, 0x10, 0x52, 0xbd, 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
+ 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
+ 0x7f, 0xfb, 0x16, 0xbf, 0x50, 0xd3, 0x7d, 0x3e, 0xa8, 0x4c, 0x26, 0x3e,
+ 0x00, 0xad, 0xaa, 0x3e, 0x00, 0x10, 0xd2, 0x3c, 0x50, 0x0d, 0x2f, 0x3e,
+ 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d, 0x7f, 0x5e, 0x3e, 0xbf,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
+ 0xa0, 0x12, 0xf5, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x0d, 0xaf, 0x3d,
+ 0x00, 0x10, 0xd2, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+ 0xaa, 0xaf, 0xcd, 0xbe, 0x54, 0xec, 0xa1, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x54, 0x91, 0xe3, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
+ 0x54, 0xcb, 0x94, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
+ 0x50, 0x0d, 0x2f, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd, 0xd5, 0x3a, 0x0e, 0xbf,
+ 0x58, 0x91, 0x63, 0xbe, 0xd5, 0x19, 0x01, 0xbf, 0x80, 0x0a, 0x0c, 0xbc,
+ 0xb0, 0x12, 0xf5, 0xbd, 0xd4, 0x19, 0x01, 0x3f, 0x54, 0x4f, 0xc9, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0xce, 0x37, 0x3e,
+ 0x00, 0xce, 0x37, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x4a, 0x83, 0x3e, 0xa8, 0x2b, 0x99, 0x3e,
+ 0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0x12, 0xf5, 0xbe, 0x00, 0x10, 0x52, 0x3e,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0xd2, 0x3c, 0x54, 0xcb, 0x94, 0xbe,
+ 0x00, 0x10, 0x52, 0xbd, 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0x0d, 0xaf, 0x3e,
+ 0xaa, 0x2b, 0x19, 0xbf, 0x54, 0x4f, 0xc9, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0xad, 0xaa, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
+ 0x00, 0x10, 0xd2, 0x3c, 0x50, 0x0d, 0xaf, 0x3d, 0xaa, 0x4c, 0xa6, 0xbe,
+ 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x52, 0x6c, 0xbe,
+ 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x4a, 0x03, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x58, 0x91, 0x63, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x50, 0x91, 0x63, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc,
+ 0x00, 0x8c, 0x9d, 0x3d, 0x58, 0x4f, 0x49, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+ 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0x0d, 0xaf, 0x3d,
+ 0xaa, 0x8e, 0xc0, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x54, 0xb2, 0xf0, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbc, 0x54, 0x70, 0xd6, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+ 0x00, 0xce, 0x37, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+ 0x00, 0x31, 0xdf, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0xa8, 0x12, 0x75, 0xbe,
+ 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x6b, 0x90, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+ 0x00, 0xef, 0xc4, 0xbe, 0x00, 0x10, 0xd2, 0xbe, 0xd5, 0x3a, 0x0e, 0xbf,
+ 0x00, 0xce, 0x37, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+ 0x00, 0x10, 0x52, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x8c, 0x9d, 0xbe,
+ 0xa8, 0x8e, 0x40, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+ 0x54, 0x2e, 0xbc, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0xd2, 0xbd, 0xaa, 0x2b, 0x99, 0xbe,
+ 0x80, 0x0a, 0x0c, 0xbc, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+ 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x31, 0xdf, 0xbe, 0xd5, 0x19, 0x81, 0xbf,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x54, 0xcb, 0x94, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+ 0x56, 0xaa, 0x87, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x54, 0xcb, 0x94, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x52, 0xec, 0x3e, 0x00, 0x10, 0x52, 0x3e,
+ 0xa0, 0x12, 0x75, 0xbd, 0xa8, 0xaf, 0xcd, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
+ 0x00, 0x10, 0xd2, 0xbc, 0xa0, 0x12, 0x75, 0xbd, 0x54, 0xcb, 0x94, 0x3e,
+ 0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x8c, 0x9d, 0xbd,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
+ 0x00, 0x52, 0x6c, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+ 0x00, 0x10, 0x52, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0x2b, 0x99, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
+ 0x58, 0x91, 0x63, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x56, 0xaa, 0x87, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x4c, 0xa6, 0x3e, 0x54, 0xec, 0xa1, 0xbe,
+ 0x80, 0xda, 0x09, 0x3f, 0xa8, 0x0a, 0x8c, 0x3e, 0xa8, 0x4c, 0x26, 0x3e,
+ 0xaa, 0xd0, 0xda, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x00, 0x10, 0xd2, 0x3d, 0x00, 0xef, 0xc4, 0x3e, 0x00, 0x10, 0x52, 0x3d,
+ 0x80, 0x0a, 0x0c, 0x3c, 0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x0d, 0xaf, 0x3d,
+ 0x00, 0x31, 0xdf, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0x50, 0xcb, 0x14, 0x3e,
+ 0xa8, 0x0a, 0x8c, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x8c, 0x9d, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0x50, 0x91, 0xe3, 0x3d, 0xa0, 0x12, 0xf5, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
+ 0x58, 0x91, 0x63, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x58, 0xcb, 0x14, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x31, 0xdf, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+ 0x00, 0x00, 0x00, 0x00, 0x58, 0x4f, 0x49, 0xbe, 0xaa, 0x0a, 0x0c, 0xbf,
+ 0x54, 0x91, 0xe3, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x4c, 0x26, 0x3e,
+ 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x8c, 0x9d, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+ 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0xd2, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+ 0x58, 0x91, 0x63, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+ 0xaa, 0xd0, 0xda, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x54, 0x91, 0xe3, 0xbe, 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x52, 0xec, 0xbe,
+ 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x8c, 0x9d, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0xaa, 0x8e, 0xc0, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+ 0xaa, 0x8e, 0xc0, 0xbe, 0xaa, 0x6d, 0x33, 0xbf, 0x00, 0xef, 0xc4, 0xbe,
+ 0x50, 0x0d, 0xaf, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x80, 0x0a, 0x0c, 0x3c,
+ 0xaa, 0xaf, 0xcd, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0xa0, 0x12, 0xf5, 0x3d,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0x2a, 0x61, 0x61, 0xbf, 0xa8, 0x12, 0x75, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x73, 0xf9, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0xa0, 0x12, 0xf5, 0x3d, 0x58, 0x0d, 0x2f, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x58, 0x91, 0x63, 0xbe, 0xb0, 0x12, 0xf5, 0xbd,
+ 0xaa, 0xd0, 0xda, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x8c, 0x9d, 0xbe,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x58, 0xcb, 0x14, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0x50, 0xd3, 0x7d, 0x3e, 0x00, 0x31, 0xdf, 0x3e,
+ 0x54, 0xec, 0xa1, 0x3e, 0x00, 0x10, 0x52, 0x3d, 0xaa, 0x2b, 0x19, 0xbf,
+ 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x10, 0xd2, 0xbe, 0xff, 0x8b, 0x1d, 0xbf,
+ 0x50, 0x4f, 0x49, 0x3e, 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0x12, 0x75, 0x3e,
+ 0x00, 0xce, 0x37, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
+ 0xa8, 0x8e, 0x40, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0xaa, 0x4c, 0xa6, 0xbe,
+ 0x00, 0x10, 0xd2, 0x3d, 0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x54, 0xb2, 0xf0, 0xbe, 0x00, 0xce, 0x37, 0x3e,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x4a, 0x03, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+ 0x56, 0xaa, 0x87, 0xbe, 0x7f, 0xfb, 0x16, 0xbf, 0x50, 0x0d, 0x2f, 0x3e,
+ 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x12, 0x75, 0x3e, 0xd5, 0x3a, 0x0e, 0xbf,
+ 0x00, 0x10, 0xd2, 0x3c, 0xa8, 0x2b, 0x99, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0xaa, 0x8e, 0xc0, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0x80, 0x0a, 0x0c, 0x3c, 0xaa, 0x4c, 0xa6, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x8c, 0x9d, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0x50, 0x91, 0xe3, 0x3d, 0x00, 0xad, 0xaa, 0x3e, 0xd4, 0x19, 0x01, 0x3f,
+ 0xa8, 0x12, 0x75, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x91, 0xe3, 0xbd,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0xd2, 0x3d,
+ 0x50, 0x0d, 0x2f, 0x3e, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0xce, 0xb7, 0x3e,
+ 0x50, 0x91, 0x63, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0xa0, 0x12, 0x75, 0x3d, 0xa8, 0x4c, 0xa6, 0x3e,
+ 0xa8, 0xd0, 0xda, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0xa0, 0x12, 0x75, 0xbd,
+ 0x00, 0x4a, 0x03, 0xbe, 0xa8, 0x6d, 0xb3, 0x3e, 0x54, 0x70, 0xd6, 0x3e,
+ 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x90, 0x3e,
+ 0x00, 0x4a, 0x83, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0x00, 0x10, 0x52, 0x3d, 0x00, 0xce, 0x37, 0x3e, 0xa8, 0x12, 0x75, 0x3e,
+ 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
+ 0x00, 0xce, 0x37, 0x3e, 0xa8, 0x8e, 0xc0, 0x3e, 0x00, 0x10, 0xd2, 0x3d,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0xaa, 0x0a, 0x8c, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+ 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x10, 0xd2, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x00, 0x4a, 0x83, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0xd0, 0xda, 0x3e,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x10, 0x52, 0xbe, 0x00, 0xce, 0x37, 0x3e,
+ 0x00, 0x6b, 0x90, 0x3e, 0xa8, 0xd0, 0xda, 0x3e, 0x00, 0xef, 0xc4, 0x3e,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x4a, 0x03, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
+ 0x50, 0xcb, 0x14, 0x3e, 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x10, 0x52, 0x3e,
+ 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0xa8, 0x8e, 0x40, 0x3e,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
+ 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0xd2, 0xbd,
+ 0x54, 0x0d, 0xaf, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0xd2, 0x3c, 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0xc0, 0x0a, 0x8c, 0xbc, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0x80, 0x0a, 0x0c, 0xbc, 0xaa, 0xd0, 0xda, 0xbe,
+ 0xa0, 0x12, 0x75, 0x3d, 0xaa, 0xaf, 0xcd, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+ 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x10, 0x52, 0xbd,
+ 0x00, 0x4a, 0x03, 0xbf, 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+ 0x00, 0xce, 0x37, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0xcb, 0x14, 0x3e,
+ 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x56, 0xaa, 0x87, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0x52, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+ 0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x10, 0x52, 0x3e,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
+ 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0x00, 0x4a, 0x03, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0xaa, 0x6d, 0x33, 0xbf,
+ 0xa8, 0x4c, 0x26, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0x0d, 0xaf, 0x3d,
+ 0xa8, 0x8e, 0x40, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0xef, 0xc4, 0x3e,
+ 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+ 0x58, 0x91, 0x63, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0xcb, 0x94, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
+ 0x54, 0xec, 0xa1, 0xbe, 0x00, 0x8c, 0x9d, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0x00, 0x4a, 0x03, 0x3e, 0xa8, 0x12, 0x75, 0x3e, 0xff, 0xac, 0x2a, 0xbf,
+ 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x0d, 0x2f, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x00, 0xef, 0xc4, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x9d, 0xbd,
+ 0x00, 0x4a, 0x03, 0xbe, 0xd4, 0x19, 0x01, 0x3f, 0x54, 0x91, 0xe3, 0xbe,
+ 0x56, 0xaa, 0x87, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+ 0xd5, 0x5b, 0x1b, 0xbf, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+ 0xaa, 0xf1, 0xe7, 0xbe, 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+ 0xaa, 0x2b, 0x99, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x52, 0x6c, 0xbe,
+ 0x50, 0xcb, 0x14, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd, 0x58, 0xcb, 0x14, 0xbe,
+ 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d,
+ 0x50, 0x0d, 0xaf, 0x3d, 0x50, 0x4f, 0x49, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xad, 0xaa, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x00, 0x10, 0x52, 0xbe, 0x00, 0xce, 0x37, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0xa0, 0x12, 0x75, 0x3d, 0x00, 0xad, 0xaa, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xaa, 0x12, 0xf5, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+ 0xa8, 0x8e, 0xc0, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0x52, 0x3d, 0x50, 0x91, 0xe3, 0x3d,
+ 0x2a, 0x9b, 0x12, 0xbf, 0x60, 0x0d, 0x2f, 0x3d, 0x56, 0xaa, 0x87, 0xbe,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x10, 0x52, 0x3d, 0x00, 0x4a, 0x03, 0xbe,
+ 0xaa, 0x8e, 0xc0, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0xce, 0x37, 0x3e,
+ 0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x50, 0x4f, 0x49, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0x4f, 0xc9, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x00, 0x10, 0xd2, 0x3d, 0x50, 0xcb, 0x14, 0x3e, 0x54, 0xcb, 0x94, 0xbe,
+ 0x54, 0xaa, 0x87, 0x3e, 0x54, 0x70, 0xd6, 0xbe, 0x00, 0x52, 0xec, 0xbe,
+ 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+ 0xa8, 0x2b, 0x99, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x31, 0xdf, 0xbe,
+ 0x00, 0x4a, 0x83, 0x3e, 0x54, 0xb2, 0xf0, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x10, 0xd2, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
+ 0x00, 0x10, 0x52, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x52, 0x6c, 0x3e,
+ 0xaa, 0x8e, 0xc0, 0xbe, 0x80, 0xda, 0x09, 0xbf, 0x60, 0x0d, 0x2f, 0x3d,
+ 0xa0, 0x12, 0x75, 0x3d, 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0xb2, 0xf0, 0xbe,
+ 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0xa0, 0x12, 0x75, 0x3d, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x10, 0x52, 0x3e,
+ 0x54, 0x0d, 0xaf, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0x58, 0xcb, 0x14, 0xbe,
+ 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x90, 0x3e,
+ 0xaa, 0xaf, 0x4d, 0xbf, 0xb0, 0x12, 0xf5, 0xbd, 0x80, 0x0a, 0x0c, 0xbc,
+ 0xa8, 0x4c, 0x26, 0xbe, 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0xaa, 0x2b, 0x19, 0xbf, 0x55, 0x0d, 0x2f, 0xbf, 0x00, 0x4a, 0x03, 0xbe,
+ 0x00, 0x10, 0x52, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x2a, 0x7a, 0x05, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0xaa, 0xaf, 0xcd, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x00, 0x10, 0x52, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x58, 0x0d, 0x2f, 0xbe,
+ 0xa0, 0x12, 0x75, 0x3d, 0x60, 0x0d, 0x2f, 0xbd, 0x54, 0xcb, 0x94, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x10, 0xd2, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0xff, 0x0f, 0x52, 0xbf, 0x00, 0x8c, 0x1d, 0xbe,
+ 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x6b, 0x10, 0xbf, 0xa8, 0x12, 0x75, 0xbe,
+ 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x6b, 0x10, 0x3f, 0xa8, 0x0a, 0x8c, 0x3e,
+ 0x54, 0xaa, 0x87, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0xaa, 0x4c, 0xa6, 0xbe,
+ 0x00, 0x10, 0xd2, 0x3c, 0xa8, 0x6d, 0xb3, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
+ 0xa8, 0x2b, 0x99, 0x3e, 0x54, 0xec, 0xa1, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0x00, 0x8c, 0x1d, 0x3e, 0x50, 0x0d, 0xaf, 0xbd, 0x2a, 0x9b, 0x12, 0xbf,
+ 0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x52, 0x6c, 0x3e,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x58, 0xcb, 0x14, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x00, 0x10, 0xd2, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x4a, 0x03, 0xbe,
+ 0x50, 0x0d, 0xaf, 0x3d, 0x50, 0x0d, 0xaf, 0x3d, 0x58, 0xd3, 0x7d, 0xbe,
+ 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0x52, 0x3e, 0x50, 0x0d, 0xaf, 0x3d,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x54, 0x2e, 0xbc, 0x3e, 0x54, 0x70, 0xd6, 0xbe,
+ 0x50, 0x91, 0xe3, 0xbd, 0x7f, 0x7f, 0x4b, 0xbf, 0x00, 0x4a, 0x03, 0xbe,
+ 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x4c, 0xa6, 0x3e,
+ 0x00, 0xce, 0x37, 0x3e, 0x50, 0x91, 0x63, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
+ 0x00, 0x10, 0xd2, 0xbc, 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x8c, 0x9d, 0x3d, 0x54, 0x4f, 0xc9, 0x3e,
+ 0xa8, 0x0a, 0x8c, 0x3e, 0x58, 0xcb, 0x14, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x10, 0x52, 0x3d,
+ 0x50, 0x91, 0xe3, 0x3d, 0xa8, 0x4c, 0xa6, 0x3e, 0x00, 0x10, 0xd2, 0x3e,
+ 0x00, 0xef, 0xc4, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
+ 0x00, 0x10, 0xd2, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0x50, 0x0d, 0xaf, 0x3d,
+ 0x00, 0xad, 0x2a, 0x3f, 0xc0, 0x0a, 0x8c, 0x3c, 0x50, 0xcb, 0x14, 0x3e,
+ 0x00, 0x52, 0x6c, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d, 0xaa, 0x0a, 0x8c, 0xbe,
+ 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0xa0, 0x12, 0x75, 0x3d, 0x54, 0x91, 0xe3, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e,
+ 0x55, 0xaa, 0x07, 0xbf, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x4a, 0x83, 0x3e,
+ 0x50, 0x91, 0xe3, 0x3d, 0xa8, 0x4c, 0x26, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe,
+ 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x80, 0x0a, 0x0c, 0x3c,
+ 0x54, 0xaa, 0x87, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d, 0xaa, 0xaf, 0xcd, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+ 0x00, 0xce, 0x37, 0xbe, 0x54, 0x70, 0xd6, 0x3e, 0x58, 0xd3, 0x7d, 0xbe,
+ 0xaa, 0xd0, 0xda, 0xbe, 0x00, 0x6b, 0x90, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0x50, 0x91, 0xe3, 0x3d, 0xd4, 0x7c, 0x28, 0x3f, 0x00, 0x4a, 0x83, 0x3e,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x6b, 0x90, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
+ 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x10, 0x52, 0x3e,
+ 0x58, 0x4f, 0x49, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x8c, 0x9d, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x8e, 0x40, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0x54, 0xcb, 0x94, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
+ 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0x8e, 0x40, 0x3e,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x91, 0xe3, 0xbd,
+ 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x6b, 0x10, 0xbf,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x52, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0x54, 0x0d, 0xaf, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x4c, 0x26, 0x3e,
+ 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
+ 0x56, 0xaa, 0x87, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+ 0xaa, 0xd0, 0xda, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+ 0x00, 0x8c, 0x9d, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x8c, 0x9d, 0x3e,
+ 0x58, 0xd3, 0x7d, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0xaa, 0xd0, 0xda, 0xbe,
+ 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x10, 0xd2, 0x3d, 0x7f, 0x7f, 0x4b, 0xbf,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x8c, 0x1d, 0x3e,
+ 0x80, 0xda, 0x09, 0xbf, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x52, 0x6c, 0xbe,
+ 0xaa, 0xd0, 0xda, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0x50, 0x0d, 0x2f, 0x3e, 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0xd2, 0x3d,
+ 0x50, 0x0d, 0xaf, 0xbd, 0x54, 0xb2, 0xf0, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
+ 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xa0, 0x12, 0x75, 0x3d,
+ 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x8c, 0x9d, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0xbd, 0xd5, 0x19, 0x01, 0xbf,
+ 0x54, 0xec, 0xa1, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0x54, 0x91, 0xe3, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x2a, 0x9b, 0x12, 0xbf, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x12, 0x75, 0x3e,
+ 0x60, 0x0d, 0x2f, 0xbd, 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0xaa, 0x6d, 0xb3, 0xbe,
+ 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x8c, 0x1d, 0xbe, 0x54, 0xd3, 0xfd, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x54, 0x4f, 0x49, 0xbf, 0x00, 0x4a, 0x03, 0x3e,
+ 0x00, 0x10, 0x52, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
+ 0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x50, 0x0d, 0xaf, 0x3d,
+ 0x58, 0x91, 0x63, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0xbc,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0xf1, 0xe7, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+ 0x50, 0x0d, 0xaf, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
+ 0x00, 0x73, 0xf9, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0xbc,
+ 0x00, 0xce, 0xb7, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x8c, 0x1d, 0x3e,
+ 0x80, 0x0a, 0x0c, 0x3c, 0xaa, 0x4c, 0xa6, 0xbe, 0xd4, 0x19, 0x01, 0x3f,
+ 0x00, 0x10, 0xd2, 0xbe, 0x54, 0xaa, 0x87, 0x3e, 0x50, 0x91, 0xe3, 0x3d,
+ 0xa8, 0x0a, 0x8c, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d, 0xa8, 0x4c, 0x26, 0x3e,
+ 0xaa, 0x0a, 0x0c, 0x3f, 0xa8, 0xd0, 0x5a, 0xbe, 0x7f, 0x7f, 0x4b, 0xbf,
+ 0xa8, 0x0a, 0x8c, 0x3e, 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0xef, 0xc4, 0x3e,
+ 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x6b, 0x10, 0x3f, 0x54, 0xcb, 0x94, 0xbe,
+ 0xd4, 0x7c, 0x28, 0x3f, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x8c, 0x9d, 0x3d,
+ 0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x31, 0xdf, 0xbe,
+ 0x00, 0x8c, 0x9d, 0x3d, 0xaa, 0x2b, 0x99, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x73, 0xf9, 0x3e, 0x54, 0xaa, 0x87, 0x3e,
+ 0x2a, 0xfe, 0x39, 0x3f, 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x73, 0xf9, 0x3e,
+ 0x54, 0xec, 0xa1, 0x3e, 0xa8, 0xaf, 0xcd, 0x3e, 0x54, 0x2e, 0x3c, 0x3f,
+ 0x00, 0x4a, 0x03, 0x3f, 0x54, 0xb2, 0xf0, 0xbe, 0x54, 0xaa, 0x87, 0x3e,
+ 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0xaa, 0x6d, 0x33, 0xbf, 0x00, 0x4a, 0x03, 0x3e,
+ 0x00, 0xce, 0x37, 0x3e, 0x00, 0x31, 0xdf, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+ 0x54, 0x2e, 0xbc, 0xbe, 0xa8, 0x4c, 0x26, 0x3e, 0x58, 0xcb, 0x14, 0xbe,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0x54, 0xec, 0xa1, 0xbe, 0x55, 0xaa, 0x07, 0xbf, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0x58, 0x91, 0x63, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e, 0xa8, 0x8e, 0x40, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x4a, 0x03, 0xbf, 0x00, 0x8c, 0x9d, 0x3d,
+ 0x00, 0xad, 0xaa, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d,
+ 0x00, 0x10, 0xd2, 0xbc, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
+ 0xa0, 0x0a, 0x0c, 0x3d, 0xa8, 0x4c, 0x26, 0x3e, 0x50, 0xcb, 0x14, 0x3e,
+ 0x58, 0x91, 0x63, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0xef, 0xc4, 0xbe,
+ 0x00, 0x8c, 0x1d, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c, 0x50, 0x0d, 0xaf, 0x3d,
+ 0x54, 0xec, 0xa1, 0x3e, 0xd5, 0x5b, 0x1b, 0xbf, 0x00, 0xce, 0x37, 0xbe,
+ 0x00, 0x8c, 0x9d, 0x3d, 0x54, 0x4f, 0xc9, 0x3e, 0x80, 0xda, 0x09, 0xbf,
+ 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0xaa, 0x87, 0x3e, 0x2a, 0xbc, 0x1f, 0x3f,
+ 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0xa8, 0x4c, 0x26, 0x3e, 0x60, 0x0d, 0x2f, 0xbd,
+ 0x00, 0xef, 0xc4, 0xbe, 0xaa, 0xd0, 0xda, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+ 0x60, 0x0d, 0x2f, 0x3d, 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
+ 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
+ 0x00, 0xad, 0xaa, 0xbe, 0x54, 0x2e, 0xbc, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
+ 0xa8, 0x4c, 0x26, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+ 0x00, 0x4a, 0x03, 0xbf, 0x00, 0x10, 0xd2, 0x3c, 0xa0, 0x12, 0x75, 0xbd,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0x56, 0xaa, 0x87, 0xbe, 0x55, 0xaa, 0x07, 0xbf,
+ 0x00, 0x8c, 0x9d, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x10, 0x52, 0x3e,
+ 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0xa8, 0x4c, 0x26, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+ 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x10, 0xd2, 0xbe,
+ 0x54, 0xcb, 0x94, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0xb0, 0x12, 0xf5, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0x00, 0x10, 0x52, 0x3d, 0x50, 0x4f, 0x49, 0x3e, 0x60, 0x0d, 0x2f, 0xbd,
+ 0x00, 0x4a, 0x03, 0x3e, 0xa0, 0x12, 0x75, 0x3d, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x55, 0xec, 0x21, 0xbf, 0x00, 0x10, 0x52, 0xbd, 0x00, 0xce, 0xb7, 0xbe,
+ 0x00, 0x10, 0x52, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x8c, 0x1d, 0x3e,
+ 0x54, 0x70, 0xd6, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x00, 0x4a, 0x83, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x60, 0x0d, 0x2f, 0x3d, 0xa0, 0x12, 0x75, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x8c, 0x9d, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x54, 0xd3, 0xfd, 0xbe, 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x2a, 0x7a, 0x05, 0xbf, 0x00, 0x8c, 0x1d, 0xbe,
+ 0x00, 0xce, 0x37, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0xa8, 0xd0, 0x5a, 0x3e,
+ 0x55, 0x0d, 0x2f, 0xbf, 0x80, 0x0a, 0x0c, 0xbc, 0x54, 0xb2, 0xf0, 0xbe,
+ 0x00, 0x8c, 0x1d, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
+ 0x00, 0x10, 0x52, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0xad, 0xaa, 0x3e,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x50, 0x0d, 0xaf, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0xb0, 0x12, 0xf5, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+ 0x00, 0xce, 0x37, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x50, 0x91, 0x63, 0x3e,
+ 0x00, 0x8c, 0x9d, 0x3e, 0xaa, 0xaf, 0xcd, 0xbe, 0x54, 0x91, 0xe3, 0x3e,
+ 0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbc, 0x54, 0x4f, 0xc9, 0x3e, 0x00, 0x52, 0x6c, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0x54, 0xaa, 0x07, 0x3f, 0x54, 0xec, 0xa1, 0x3e,
+ 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0x52, 0x3e,
+ 0x00, 0x4a, 0x83, 0xbe, 0xaa, 0x12, 0xf5, 0xbe, 0x54, 0x91, 0x63, 0xbf,
+ 0x54, 0xb2, 0xf0, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+ 0x00, 0xef, 0xc4, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x50, 0x91, 0xe3, 0x3d, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0x3c,
+ 0x50, 0x91, 0xe3, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0xce, 0xb7, 0xbe,
+ 0xa8, 0x4c, 0x26, 0x3e, 0xaa, 0xaf, 0xcd, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x58, 0xcb, 0x14, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0x58, 0xd3, 0x7d, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x31, 0xdf, 0xbe,
+ 0x00, 0x10, 0x52, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe, 0x54, 0xaa, 0x87, 0x3e,
+ 0x56, 0xaa, 0x87, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0xaa, 0xd0, 0xda, 0xbe,
+ 0xff, 0xee, 0x44, 0xbf, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x52, 0xec, 0xbe,
+ 0x00, 0x52, 0x6c, 0xbe, 0x54, 0x70, 0xd6, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0xce, 0xb7, 0xbe,
+ 0x54, 0x2e, 0xbc, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x52, 0xec, 0xbe, 0x54, 0x91, 0xe3, 0xbe,
+ 0x60, 0x0d, 0x2f, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0x00, 0x4a, 0x83, 0x3e, 0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+ 0x50, 0x91, 0xe3, 0x3d, 0x54, 0xcb, 0x94, 0xbe, 0xaa, 0x12, 0xf5, 0xbe,
+ 0xa8, 0x4c, 0x26, 0x3e, 0x54, 0xd3, 0xfd, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
+ 0x54, 0x4f, 0xc9, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x4c, 0x26, 0x3e,
+ 0x00, 0xce, 0x37, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+ 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+ 0x00, 0x10, 0x52, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x4a, 0x03, 0xbe,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x54, 0xcb, 0x94, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0x00, 0xce, 0x37, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0x4f, 0xc9, 0x3e,
+ 0x00, 0x52, 0xec, 0x3e, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+ 0x00, 0x10, 0x52, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x54, 0x2e, 0xbc, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0xce, 0xb7, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+ 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0x3e, 0xff, 0x8b, 0x1d, 0xbf,
+ 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0xf1, 0xe7, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
+ 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xad, 0xaa, 0xbe,
+ 0xd5, 0x19, 0x01, 0xbf, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0xce, 0x37, 0x3e,
+ 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x4a, 0x03, 0xbe, 0xa8, 0x8e, 0x40, 0x3e,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x4a, 0x03, 0x3e, 0xb0, 0x12, 0xf5, 0xbd,
+ 0xa8, 0x0a, 0x8c, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
+ 0x00, 0xce, 0x37, 0x3e, 0x00, 0x6b, 0x90, 0xbe, 0xa8, 0x8e, 0x40, 0x3e,
+ 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+ 0x50, 0xd3, 0x7d, 0x3e, 0xa8, 0x8e, 0x40, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x4a, 0x83, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+ 0x50, 0x91, 0xe3, 0xbd, 0x55, 0xcb, 0x14, 0xbf, 0x00, 0x52, 0x6c, 0xbe,
+ 0xa8, 0x8e, 0x40, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e, 0x80, 0xda, 0x09, 0xbf,
+ 0x54, 0xec, 0xa1, 0x3e, 0x58, 0x4f, 0x49, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+ 0x00, 0x31, 0xdf, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0xaa, 0x87, 0x3e,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe, 0xa8, 0x2b, 0x99, 0x3e,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x10, 0xd2, 0xbd,
+ 0xa8, 0x6d, 0xb3, 0x3e, 0x2a, 0x9b, 0x12, 0x3f, 0xa0, 0x12, 0x75, 0xbd,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0xd4, 0x19, 0x01, 0x3f, 0x54, 0xcb, 0x94, 0x3e,
+ 0x7f, 0x5e, 0x3e, 0xbf, 0x60, 0x0d, 0x2f, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x50, 0xcb, 0x14, 0x3e, 0xa8, 0xf1, 0xe7, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
+ 0x00, 0xad, 0xaa, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e, 0x80, 0xfb, 0x16, 0x3f,
+ 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x91, 0xe3, 0x3d, 0x50, 0x0d, 0xaf, 0x3d,
+ 0x00, 0x10, 0x52, 0x3d, 0x00, 0xef, 0xc4, 0xbe, 0x54, 0xaa, 0x87, 0x3e,
+ 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x73, 0xf9, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
+ 0x00, 0xce, 0xb7, 0x3e, 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0xa8, 0x4c, 0x26, 0x3e, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0xce, 0x37, 0xbe,
+ 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x58, 0xcb, 0x14, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x54, 0xcb, 0x94, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+ 0x58, 0xd3, 0x7d, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x10, 0x52, 0xbd,
+ 0x00, 0x31, 0xdf, 0x3e, 0x00, 0x6b, 0x10, 0xbf, 0x54, 0x2e, 0xbc, 0xbe,
+ 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0xd2, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0x52, 0x3e,
+ 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x4a, 0x83, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+ 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x0a, 0x8c, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x4a, 0x03, 0xbf, 0x54, 0xcb, 0x94, 0xbe,
+ 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x54, 0x91, 0xe3, 0x3e,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x52, 0x6c, 0xbe,
+ 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+ 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0xd0, 0xda, 0xbe,
+ 0xa8, 0x8e, 0x40, 0x3e, 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x4a, 0x03, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x54, 0xec, 0xa1, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0xbd,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x55, 0xaa, 0x07, 0xbf, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x00, 0x10, 0x52, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d, 0x58, 0xcb, 0x14, 0xbe,
+ 0x50, 0xd3, 0x7d, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
+ 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x52, 0xec, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+ 0x00, 0x73, 0xf9, 0xbe, 0xd5, 0x5b, 0x1b, 0xbf, 0x54, 0x4f, 0xc9, 0xbe,
+ 0x00, 0x10, 0x52, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x10, 0xd2, 0xbc,
+ 0x00, 0xce, 0xb7, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0x0d, 0x2f, 0xbe,
+ 0x58, 0xcb, 0x14, 0xbe, 0x58, 0xd3, 0x7d, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xa8, 0xd0, 0x5a, 0x3e,
+ 0x00, 0x10, 0x52, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0xa0, 0x12, 0x75, 0x3d,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0xf1, 0xe7, 0xbe,
+ 0xaa, 0x0a, 0x0c, 0xbf, 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x00, 0x00, 0x00,
+ 0xa8, 0x8e, 0x40, 0x3e, 0xff, 0xac, 0x2a, 0xbf, 0x54, 0xd3, 0xfd, 0xbe,
+ 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0x80, 0xda, 0x89, 0xbf,
+ 0x00, 0x31, 0xdf, 0x3e, 0x58, 0x91, 0x63, 0xbe, 0xa8, 0x2b, 0x99, 0x3e,
+ 0x00, 0x10, 0x52, 0xbd, 0xd5, 0x3a, 0x0e, 0xbf, 0x00, 0x52, 0xec, 0xbe,
+ 0x00, 0x73, 0xf9, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0xd2, 0x3c,
+ 0x54, 0x2e, 0xbc, 0x3e, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x54, 0xcb, 0x94, 0x3e, 0x54, 0xcb, 0x94, 0xbe,
+ 0xa8, 0x4c, 0x26, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x60, 0x0d, 0x2f, 0xbd,
+ 0x54, 0x2e, 0xbc, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0xa0, 0x12, 0x75, 0xbd,
+ 0x00, 0x31, 0xdf, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xce, 0xb7, 0xbe,
+ 0xa8, 0x8e, 0x40, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x58, 0x91, 0x63, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0x2b, 0x99, 0x3e,
+ 0xa8, 0x12, 0x75, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x31, 0xdf, 0x3e,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x52, 0xec, 0x3e, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xa8, 0x8e, 0xc0, 0x3e, 0x50, 0xd3, 0x7d, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x52, 0x6c, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0xa0, 0x12, 0xf5, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
+ 0x2a, 0xbc, 0x1f, 0x3f, 0x00, 0x10, 0x52, 0x3d, 0x50, 0xd3, 0x7d, 0x3e,
+ 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x4a, 0x83, 0xbe, 0x50, 0x0d, 0xaf, 0x3d,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0xd2, 0x3c, 0x50, 0xcb, 0x14, 0x3e,
+ 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x4a, 0x03, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+ 0xb0, 0x12, 0xf5, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe, 0x54, 0x2e, 0xbc, 0x3e,
+ 0x50, 0xcb, 0x14, 0x3e, 0xaa, 0x0a, 0x0c, 0xbf, 0x00, 0x10, 0x52, 0xbd,
+ 0xaa, 0xd0, 0xda, 0xbe, 0xa8, 0x4c, 0x26, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x00, 0x10, 0x52, 0x3d, 0x00, 0x73, 0xf9, 0xbe, 0x54, 0x4f, 0xc9, 0xbe,
+ 0x50, 0xd3, 0x7d, 0x3e, 0x00, 0x10, 0xd2, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+ 0xb0, 0x12, 0xf5, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
+ 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x4c, 0x26, 0xbe, 0xd5, 0x19, 0x01, 0xbf,
+ 0x50, 0x91, 0xe3, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
+ 0x00, 0x8c, 0x1d, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x00, 0x52, 0xec, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x54, 0xd3, 0xfd, 0xbe,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x55, 0xcb, 0x14, 0xbf, 0xb0, 0x12, 0xf5, 0xbd,
+ 0x00, 0xce, 0x37, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
+ 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xad, 0xaa, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x60, 0x0d, 0x2f, 0x3d, 0x54, 0x4f, 0xc9, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xce, 0x37, 0xbe, 0xaa, 0xaf, 0x4d, 0xbf,
+ 0x00, 0x4a, 0x03, 0xbe, 0x7f, 0xfb, 0x16, 0xbf, 0x58, 0x91, 0x63, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x58, 0xd3, 0x7d, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x50, 0xcb, 0x14, 0x3e,
+ 0x50, 0x91, 0x63, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+ 0x00, 0x52, 0xec, 0xbe, 0xaa, 0xd0, 0xda, 0xbe, 0x7f, 0xfb, 0x16, 0xbf,
+ 0x54, 0xd3, 0xfd, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x52, 0x6c, 0xbe,
+ 0xff, 0x8b, 0x1d, 0xbf, 0xa0, 0x12, 0x75, 0xbd, 0x54, 0x4f, 0xc9, 0xbe,
+ 0x54, 0x0d, 0xaf, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbd, 0xa0, 0x12, 0xf5, 0x3d, 0xaa, 0xaf, 0xcd, 0xbe,
+ 0x00, 0x73, 0xf9, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x00, 0xce, 0xb7, 0xbe, 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+ 0x00, 0x4a, 0x03, 0x3e, 0x54, 0xcb, 0x94, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0x00, 0x6b, 0x90, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+ 0x58, 0x4f, 0x49, 0xbe, 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+ 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0xd5, 0x19, 0x01, 0xbf,
+ 0x60, 0x0d, 0x2f, 0x3d, 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0xd2, 0xbd,
+ 0xa8, 0x4c, 0x26, 0xbe, 0xd4, 0xbe, 0x42, 0xbf, 0x00, 0xad, 0xaa, 0xbe,
+ 0xaa, 0x4c, 0xa6, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x80, 0xda, 0x09, 0xbf,
+ 0xaa, 0x8e, 0xc0, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0xce, 0xb7, 0xbe,
+ 0x54, 0xcb, 0x94, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x58, 0xd3, 0x7d, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x8c, 0x1d, 0x3e,
+ 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x80, 0x0a, 0x0c, 0xbc, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0x54, 0x2e, 0xbc, 0xbe, 0x50, 0xd3, 0x7d, 0x3e,
+ 0x00, 0x4a, 0x03, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x8c, 0x1d, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0xaa, 0x12, 0xf5, 0xbe, 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+ 0x58, 0x91, 0x63, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x31, 0xdf, 0x3e,
+ 0xa8, 0x8e, 0xc0, 0x3e, 0x54, 0x70, 0xd6, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+ 0x00, 0x52, 0xec, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0x50, 0x91, 0xe3, 0xbd,
+ 0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x54, 0x4f, 0xc9, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0x00, 0x10, 0xd2, 0xbd, 0x54, 0xcb, 0x94, 0xbe, 0xaa, 0x0a, 0x0c, 0xbf,
+ 0x00, 0x52, 0xec, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+ 0x00, 0x10, 0x52, 0x3e, 0x58, 0x91, 0x63, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x54, 0xd3, 0xfd, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x31, 0xdf, 0xbe,
+ 0x58, 0xd3, 0x7d, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+ 0x00, 0x8c, 0x1d, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x4a, 0x83, 0x3e,
+ 0x80, 0x0a, 0x0c, 0xbc, 0xc0, 0x0a, 0x8c, 0xbc, 0x58, 0x91, 0x63, 0xbe,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x8c, 0x9d, 0x3d, 0x60, 0x0d, 0x2f, 0xbd,
+ 0x58, 0x91, 0x63, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0xce, 0x37, 0xbe,
+ 0x58, 0x0d, 0x2f, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0x12, 0x75, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x4a, 0x03, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d,
+ 0xaa, 0x6d, 0xb3, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x50, 0x91, 0xe3, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x8c, 0x9d, 0xbe,
+ 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0xef, 0xc4, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
+ 0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x58, 0xcb, 0x14, 0xbe,
+ 0xa0, 0x12, 0x75, 0x3d, 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x4a, 0x03, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
+ 0xa8, 0x8e, 0xc0, 0x3e, 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+ 0x50, 0x91, 0xe3, 0xbd, 0x58, 0xd3, 0x7d, 0xbe, 0x54, 0xcb, 0x94, 0x3e,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0xce, 0x37, 0x3e,
+ 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x8e, 0x40, 0xbe,
+ 0x00, 0x6b, 0x90, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0x3c,
+ 0x00, 0x4a, 0x03, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x54, 0x70, 0xd6, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0x4f, 0xc9, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0x00, 0xce, 0x37, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x10, 0xd2, 0xbc,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x52, 0x6c, 0xbe, 0xa8, 0x4c, 0xa6, 0x3e,
+ 0xd5, 0x3a, 0x0e, 0xbf, 0x50, 0x91, 0xe3, 0xbd, 0x50, 0x91, 0xe3, 0x3d,
+ 0x80, 0x0a, 0x0c, 0x3c, 0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x0d, 0xaf, 0x3d,
+ 0x00, 0xce, 0xb7, 0xbe, 0xd5, 0x5b, 0x1b, 0xbf, 0x54, 0xcb, 0x94, 0xbe,
+ 0x54, 0x0d, 0xaf, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x10, 0xd2, 0x3e,
+ 0xa8, 0x12, 0x75, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0x60, 0x0d, 0x2f, 0xbd,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x4a, 0x83, 0x3e, 0x00, 0xce, 0xb7, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c, 0xa0, 0x12, 0x75, 0xbd,
+ 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x50, 0x91, 0xe3, 0x3d,
+ 0x54, 0xb2, 0xf0, 0xbe, 0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
+ 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x00, 0x10, 0x52, 0x3d, 0x7f, 0x5e, 0x3e, 0xbf, 0x50, 0x0d, 0xaf, 0xbd,
+ 0x00, 0x10, 0x52, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0xb0, 0x12, 0xf5, 0xbd,
+ 0x00, 0x4a, 0x03, 0x3e, 0xa8, 0x0a, 0x8c, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0x7f, 0x1c, 0x24, 0xbf, 0x60, 0x0d, 0x2f, 0x3d, 0x2a, 0x7a, 0x05, 0xbf,
+ 0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0x00, 0x8c, 0x9d, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x58, 0xcb, 0x14, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0xce, 0xb7, 0x3e,
+ 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x6b, 0x90, 0x3e, 0x00, 0x10, 0x52, 0xbe,
+ 0x00, 0x4a, 0x03, 0x3f, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+ 0x00, 0xce, 0x37, 0x3e, 0x50, 0x0d, 0x2f, 0x3e, 0xff, 0xac, 0x2a, 0xbf,
+ 0xa8, 0xaf, 0xcd, 0x3e, 0x00, 0x8c, 0x9d, 0xbe, 0xff, 0x30, 0x5f, 0xbf,
+ 0x54, 0xcb, 0x14, 0x3f, 0xa8, 0x8e, 0x40, 0x3e, 0x58, 0xcb, 0x14, 0xbe,
+ 0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+ 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x10, 0x52, 0xbe,
+ 0xaa, 0x12, 0xf5, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0x00, 0x10, 0x52, 0x3d, 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe,
+ 0x58, 0x91, 0x63, 0xbe, 0x00, 0x8c, 0x9d, 0x3d, 0x58, 0x91, 0x63, 0xbe,
+ 0x00, 0x10, 0xd2, 0x3d, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0xd2, 0xbc,
+ 0xa0, 0x12, 0x75, 0xbd, 0xaa, 0x2b, 0x19, 0x3f, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x83, 0x3e, 0xd5, 0x3a, 0x0e, 0xbf,
+ 0xa0, 0x12, 0xf5, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0xcb, 0x14, 0x3e,
+ 0xa8, 0x12, 0x75, 0xbe, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x10, 0xd2, 0x3d,
+ 0x50, 0x91, 0xe3, 0x3d, 0x00, 0xad, 0xaa, 0x3e, 0x50, 0x0d, 0xaf, 0x3d,
+ 0x60, 0x0d, 0x2f, 0x3d, 0x54, 0x70, 0xd6, 0xbe, 0xa8, 0x4c, 0xa6, 0x3e,
+ 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0x54, 0xd3, 0xfd, 0xbe,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x10, 0xd2, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0x00, 0x10, 0x52, 0x3d, 0x50, 0x91, 0x63, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
+ 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x8e, 0x40, 0x3e, 0x50, 0x91, 0xe3, 0x3d,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x4a, 0x03, 0x3e,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x50, 0x91, 0xe3, 0x3d, 0xa0, 0x12, 0x75, 0x3d,
+ 0x00, 0x10, 0x52, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+ 0x54, 0xcb, 0x94, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0x52, 0xbe,
+ 0xb0, 0x12, 0xf5, 0xbd, 0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0x52, 0x3d,
+ 0x60, 0x0d, 0x2f, 0x3d, 0x60, 0x0d, 0x2f, 0x3d, 0x54, 0x4f, 0xc9, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+ 0x00, 0x10, 0xd2, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x58, 0x4f, 0x49, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+ 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0x52, 0xbe, 0x50, 0x0d, 0x2f, 0x3e,
+ 0x54, 0x4f, 0xc9, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x50, 0xcb, 0x14, 0x3e,
+ 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x31, 0xdf, 0x3e, 0xd4, 0xbe, 0x42, 0xbf,
+ 0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x8e, 0x40, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0x00, 0xce, 0xb7, 0xbe, 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x6b, 0x90, 0x3e,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0x52, 0x3d, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0xaa, 0x8e, 0x40, 0xbf,
+ 0x00, 0x8c, 0x1d, 0x3e, 0x7f, 0x7f, 0x4b, 0xbf, 0x00, 0x10, 0xd2, 0xbc,
+ 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+ 0xaa, 0x8e, 0xc0, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0xb0, 0x12, 0xf5, 0xbd,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x6b, 0x90, 0xbe,
+ 0x00, 0xce, 0x37, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x91, 0xe3, 0xbd,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0x52, 0x3d, 0x50, 0xcb, 0x14, 0x3e,
+ 0x54, 0xec, 0xa1, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe,
+ 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x00, 0x10, 0xd2, 0xbc, 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x4c, 0xa6, 0xbe,
+ 0x00, 0x52, 0x6c, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x8c, 0x1d, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x10, 0x52, 0x3d,
+ 0x00, 0x31, 0xdf, 0xbe, 0xff, 0x0f, 0x52, 0xbf, 0x54, 0x70, 0xd6, 0x3e,
+ 0x50, 0x0d, 0xaf, 0xbd, 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0xce, 0x37, 0x3e,
+ 0x00, 0xce, 0x37, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
+ 0xa0, 0x12, 0x75, 0x3d, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0x52, 0xbd,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0xa8, 0x6d, 0xb3, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
+ 0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x12, 0x75, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
+ 0x54, 0x0d, 0xaf, 0x3e, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+ 0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x50, 0x91, 0xe3, 0xbd,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0x54, 0x0d, 0xaf, 0x3e,
+ 0xa8, 0x4c, 0xa6, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+ 0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x0a, 0x8c, 0xbd, 0xaa, 0x12, 0xf5, 0xbe,
+ 0x00, 0x10, 0x52, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x12, 0xf5, 0xbd,
+ 0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0xce, 0xb7, 0x3e,
+ 0x00, 0x4a, 0x03, 0xbe, 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+ 0xa8, 0x4c, 0x26, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x8c, 0x9d, 0x3d,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
+ 0xaa, 0xaf, 0xcd, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x50, 0x4f, 0x49, 0x3e,
+ 0x7f, 0xa0, 0x58, 0xbf, 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x6d, 0xb3, 0x3e,
+ 0x54, 0x91, 0xe3, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x00, 0x52, 0x6c, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x4a, 0x03, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x50, 0x0d, 0xaf, 0xbd, 0x54, 0xaa, 0x87, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x73, 0xf9, 0x3e, 0x50, 0x4f, 0x49, 0x3e, 0x54, 0xaa, 0x87, 0x3e,
+ 0xd5, 0x19, 0x01, 0xbf, 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x4a, 0x83, 0xbe,
+ 0x00, 0x4a, 0x83, 0x3e, 0x54, 0xcb, 0x94, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+ 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0xef, 0xc4, 0x3e, 0xa8, 0xaf, 0xcd, 0x3e,
+ 0x00, 0x8c, 0x1d, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x00, 0x10, 0xd2, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+ 0xd5, 0x19, 0x01, 0xbf, 0x54, 0xec, 0xa1, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0xcb, 0x94, 0x3e, 0xb0, 0x12, 0xf5, 0xbd,
+ 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x8c, 0x9d, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x10, 0xd2, 0x3c, 0x50, 0x0d, 0xaf, 0x3d,
+ 0x50, 0x91, 0xe3, 0x3d, 0xa8, 0xd0, 0xda, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
+ 0x58, 0x91, 0x63, 0xbe, 0xaa, 0xd0, 0xda, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+ 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+ 0x50, 0xcb, 0x14, 0x3e, 0x58, 0x4f, 0x49, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0x3d,
+ 0x7f, 0xfb, 0x16, 0xbf, 0x00, 0x4a, 0x03, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d,
+ 0x00, 0x10, 0xd2, 0xbc, 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x91, 0x63, 0x3e,
+ 0x00, 0x10, 0x52, 0x3d, 0x00, 0x8c, 0x1d, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+ 0x54, 0x70, 0x56, 0xbf, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x4a, 0x03, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0x54, 0x2e, 0xbc, 0x3e, 0xd5, 0x5b, 0x1b, 0xbf,
+ 0xa8, 0x8e, 0x40, 0x3e, 0x54, 0x2e, 0xbc, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
+ 0x00, 0x10, 0xd2, 0x3e, 0x00, 0x31, 0xdf, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
+ 0x00, 0xef, 0xc4, 0x3e, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x52, 0xbd, 0xd5, 0x7c, 0x28, 0xbf, 0x00, 0x4a, 0x83, 0x3e,
+ 0x2a, 0x9b, 0x12, 0xbf, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0xbd,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0xd5, 0x5b, 0x1b, 0xbf,
+ 0x58, 0xcb, 0x14, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x7f, 0x1c, 0x24, 0xbf,
+ 0x2a, 0x7a, 0x05, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0xce, 0xb7, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x10, 0xd2, 0x3c, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0xd5, 0x19, 0x01, 0xbf, 0xa8, 0x0a, 0x0c, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
+ 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x8c, 0x1d, 0x3e,
+ 0x58, 0x91, 0x63, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x50, 0xcb, 0x14, 0x3e,
+ 0x00, 0x10, 0xd2, 0xbc, 0xaa, 0x4c, 0xa6, 0xbe, 0x54, 0xaa, 0x87, 0x3e,
+ 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0xaa, 0x8e, 0xc0, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+ 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0xaa, 0x0a, 0x0c, 0xbf,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0xbc, 0x54, 0x91, 0xe3, 0x3e,
+ 0xa0, 0x12, 0x75, 0x3d, 0x2a, 0x7a, 0x05, 0xbf, 0x00, 0x8c, 0x1d, 0x3e,
+ 0x50, 0x91, 0xe3, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
+ 0x00, 0x31, 0xdf, 0xbe, 0x54, 0x70, 0xd6, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+ 0x00, 0x4a, 0x03, 0xbf, 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x54, 0x70, 0xd6, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x31, 0xdf, 0x3e,
+ 0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x55, 0xaa, 0x07, 0xbf,
+ 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x10, 0xd2, 0xbd, 0xaa, 0xaf, 0x4d, 0xbf,
+ 0x00, 0xad, 0xaa, 0x3e, 0x50, 0xd3, 0x7d, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x54, 0x2e, 0xbc, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+ 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0xef, 0xc4, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+ 0x00, 0xad, 0xaa, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0x52, 0xbe,
+ 0x80, 0xfb, 0x16, 0x3f, 0x2a, 0x7a, 0x05, 0xbf, 0x54, 0xec, 0xa1, 0x3e,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+ 0x54, 0x70, 0xd6, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x54, 0xec, 0xa1, 0xbe,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc, 0x56, 0xaa, 0x87, 0xbe,
+ 0xa0, 0x12, 0x75, 0x3d, 0x60, 0x0d, 0x2f, 0xbd, 0x58, 0x4f, 0x49, 0xbe,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0x58, 0xcb, 0x14, 0xbe,
+ 0x54, 0x70, 0xd6, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0x50, 0x0d, 0x2f, 0x3e,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0x54, 0xaa, 0x87, 0x3e, 0xa8, 0x8e, 0x40, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
+ 0x00, 0xad, 0xaa, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x8c, 0x9d, 0xbd,
+ 0xa8, 0x8e, 0x40, 0x3e, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xce, 0x37, 0xbe,
+ 0x50, 0x0d, 0xaf, 0x3d, 0x80, 0x0a, 0x0c, 0xbc, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0x54, 0xcb, 0x94, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0xa0, 0x12, 0x75, 0xbd,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x8c, 0x1d, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x50, 0x0d, 0xaf, 0xbd, 0x50, 0x91, 0xe3, 0xbd,
+ 0x00, 0x10, 0x52, 0x3e, 0x50, 0x91, 0x63, 0x3e, 0x50, 0xcb, 0x14, 0x3e,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xaa, 0x6d, 0xb3, 0xbe,
+ 0x00, 0x4a, 0x03, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
+ 0xb0, 0x12, 0xf5, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0xd2, 0xbc,
+ 0x60, 0x0d, 0x2f, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0x3e,
+ 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0xd2, 0xbd, 0x54, 0xb2, 0xf0, 0x3e,
+ 0x00, 0x10, 0xd2, 0x3c, 0x58, 0x91, 0x63, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+ 0x50, 0xd3, 0x7d, 0x3e, 0xa8, 0xd0, 0xda, 0x3e, 0x00, 0x10, 0x52, 0x3e,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d, 0x56, 0xaa, 0x87, 0xbe,
+ 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x4a, 0x03, 0x3e,
+ 0xa8, 0x12, 0xf5, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
+ 0x00, 0xce, 0x37, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd, 0x54, 0xec, 0xa1, 0xbe,
+ 0x00, 0x52, 0x6c, 0xbe, 0xaa, 0x0a, 0x0c, 0xbf, 0x00, 0x10, 0x52, 0xbe,
+ 0x58, 0xcb, 0x14, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+ 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+ 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x8c, 0x9d, 0x3e,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x10, 0xd2, 0xbe,
+ 0x56, 0xaa, 0x87, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+ 0x00, 0x10, 0x52, 0x3d, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x10, 0x52, 0xbd,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0x54, 0xb2, 0xf0, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xce, 0xb7, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x6b, 0x90, 0x3e, 0x00, 0x10, 0x52, 0x3d,
+ 0x54, 0x91, 0xe3, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xa0, 0x12, 0x75, 0x3d, 0x00, 0xce, 0x37, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+ 0x50, 0x91, 0xe3, 0xbd, 0x58, 0x4f, 0x49, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
+ 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x8c, 0x1d, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0xef, 0xc4, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+ 0x54, 0x0d, 0xaf, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
+ 0x54, 0xec, 0xa1, 0x3e, 0x00, 0xad, 0xaa, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0x54, 0x91, 0xe3, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0xad, 0xaa, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x58, 0x4f, 0x49, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+ 0x58, 0x91, 0x63, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x8c, 0x9d, 0x3d,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+ 0x50, 0x91, 0x63, 0x3e, 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0xce, 0x37, 0x3e,
+ 0xa8, 0x4c, 0x26, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0xcb, 0x14, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x00, 0x73, 0xf9, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x80, 0x0a, 0x0c, 0x3c,
+ 0xd5, 0x9d, 0x35, 0xbf, 0x58, 0xcb, 0x14, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
+ 0x00, 0x10, 0x52, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0xd0, 0xda, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0x58, 0xcb, 0x14, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x58, 0x91, 0x63, 0xbe,
+ 0x00, 0x73, 0xf9, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+ 0x54, 0x4f, 0xc9, 0x3e, 0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+ 0x00, 0x8c, 0x1d, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc, 0xa8, 0x12, 0x75, 0x3e,
+ 0x00, 0x10, 0xd2, 0xbd, 0xaa, 0x2b, 0x99, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+ 0xa8, 0x6d, 0xb3, 0x3e, 0x54, 0xcb, 0x94, 0x3e, 0xa8, 0x12, 0x75, 0x3e,
+ 0x54, 0x2e, 0xbc, 0x3e, 0xa0, 0x12, 0x75, 0x3d, 0xa8, 0x2b, 0x99, 0x3e,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x4a, 0x83, 0x3e, 0x50, 0x0d, 0xaf, 0x3d,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0xad, 0xaa, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0x50, 0x91, 0xe3, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+ 0xaa, 0x8e, 0x40, 0xbf, 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x91, 0x63, 0x3e,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x31, 0xdf, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0xa8, 0xf1, 0xe7, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+ 0xa8, 0x4c, 0xa6, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x9d, 0x3e,
+ 0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0xd0, 0xda, 0x3e,
+ 0xaa, 0x2b, 0x19, 0xbf, 0x00, 0xef, 0xc4, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e,
+ 0x00, 0xce, 0x37, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0x54, 0xec, 0xa1, 0x3e,
+ 0x00, 0x4a, 0x03, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0xd3, 0x7d, 0x3e,
+ 0x00, 0xce, 0x37, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x9d, 0x3e,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x00, 0x00, 0x00,
+ 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x4a, 0x03, 0x3e,
+ 0xaa, 0x12, 0xf5, 0xbe, 0xaa, 0xd0, 0xda, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbc, 0x00, 0xce, 0xb7, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+ 0xa8, 0x4c, 0x26, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0xa8, 0x12, 0x75, 0xbe,
+ 0x00, 0x8c, 0x1d, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+ 0x00, 0x10, 0x52, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xaa, 0x4c, 0xa6, 0xbe,
+ 0x58, 0x91, 0x63, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x00, 0xad, 0xaa, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0xce, 0x37, 0x3e,
+ 0x00, 0x10, 0x52, 0xbd, 0x00, 0x8c, 0x9d, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+ 0x00, 0x10, 0x52, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0xa8, 0x0a, 0x8c, 0x3e,
+ 0xff, 0xee, 0x44, 0xbf, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0xbc,
+ 0xa8, 0x4c, 0x26, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x10, 0x52, 0xbd,
+ 0x00, 0xce, 0xb7, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0xaa, 0x12, 0xf5, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0x60, 0x0d, 0x2f, 0xbd,
+ 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x12, 0x75, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0x54, 0xb2, 0xf0, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0x12, 0x75, 0x3e,
+ 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0x3d,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0xd2, 0xbe, 0xa8, 0x2b, 0x99, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xa8, 0x0a, 0x0c, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+ 0x58, 0x91, 0x63, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0xce, 0x37, 0x3e,
+ 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0xd3, 0xfd, 0xbe, 0x54, 0x2e, 0xbc, 0xbe,
+ 0x00, 0x10, 0x52, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x58, 0x91, 0x63, 0xbe,
+ 0x00, 0x4a, 0x83, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0x80, 0xda, 0x09, 0xbf,
+ 0xa8, 0x4c, 0xa6, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x8c, 0x9d, 0xbd,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0xaa, 0x8e, 0x40, 0xbf,
+ 0xa0, 0x0a, 0x0c, 0x3d, 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0x3d, 0x58, 0xcb, 0x14, 0xbe, 0x50, 0x91, 0x63, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xa8, 0x12, 0x75, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
+ 0x00, 0x8c, 0x1d, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
+ 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x10, 0x52, 0x3d, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+ 0x7f, 0x5e, 0x3e, 0xbf, 0xaa, 0x4c, 0xa6, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+ 0x00, 0x10, 0xd2, 0x3c, 0x2a, 0x7a, 0x05, 0xbf, 0x50, 0xcb, 0x14, 0x3e,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0xce, 0xb7, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x58, 0x91, 0x63, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+ 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x8e, 0x40, 0x3e, 0x55, 0xaa, 0x07, 0xbf,
+ 0xaa, 0xd0, 0xda, 0xbe, 0x80, 0xda, 0x09, 0xbf, 0x00, 0x10, 0x52, 0xbd,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0x0d, 0xaf, 0xbe, 0x55, 0x2e, 0x3c, 0xbf,
+ 0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x12, 0xf5, 0xbd, 0x50, 0x0d, 0x2f, 0x3e,
+ 0x54, 0xd3, 0xfd, 0xbe, 0x7f, 0x3d, 0x31, 0xbf, 0xc0, 0x0a, 0x8c, 0xbc,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0xad, 0xaa, 0xbe,
+ 0x54, 0xcb, 0x94, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0x7f, 0xfb, 0x16, 0xbf,
+ 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+ 0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+ 0xaa, 0x4c, 0xa6, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x4a, 0x03, 0x3e,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x10, 0xd2, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+ 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0x52, 0xbe, 0x50, 0xd3, 0x7d, 0x3e,
+ 0x54, 0xd3, 0xfd, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0xaa, 0xaf, 0xcd, 0xbe,
+ 0x00, 0xce, 0x37, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x54, 0xcb, 0x94, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x00, 0x52, 0x6c, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0xc0, 0x0a, 0x8c, 0xbc, 0xa8, 0x4c, 0x26, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x80, 0xda, 0x09, 0xbf, 0x58, 0xcb, 0x14, 0xbe,
+ 0xd5, 0x5b, 0x1b, 0xbf, 0xb0, 0x12, 0xf5, 0xbd, 0xd5, 0x19, 0x01, 0xbf,
+ 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x4a, 0x83, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+ 0x58, 0x91, 0x63, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x58, 0x4f, 0x49, 0xbe,
+ 0x00, 0x52, 0x6c, 0x3e, 0x56, 0xaa, 0x87, 0xbe, 0x50, 0x0d, 0x2f, 0x3e,
+ 0x00, 0x73, 0xf9, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+ 0x00, 0x10, 0x52, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0x50, 0xd3, 0x7d, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x10, 0xd2, 0xbc,
+ 0x50, 0x0d, 0xaf, 0x3d, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x10, 0xd2, 0x3d,
+ 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+ 0xa0, 0x12, 0x75, 0x3d, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x8c, 0x9d, 0xbd,
+ 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0xd5, 0x19, 0x01, 0xbf,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x58, 0x0d, 0x2f, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+ 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x50, 0xcb, 0x14, 0x3e,
+ 0xd5, 0x19, 0x01, 0xbf, 0x00, 0xce, 0x37, 0x3e, 0x50, 0x91, 0x63, 0x3e,
+ 0xd5, 0x19, 0x01, 0xbf, 0x00, 0x10, 0xd2, 0x3c, 0x60, 0x0d, 0x2f, 0x3d,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x2a, 0x7a, 0x05, 0xbf, 0xaa, 0xaf, 0xcd, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e,
+ 0xa8, 0xd0, 0xda, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
+ 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
+ 0x00, 0x10, 0xd2, 0x3e, 0x00, 0xce, 0x37, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc,
+ 0x00, 0x10, 0xd2, 0x3d, 0xaa, 0x4c, 0xa6, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x00, 0x10, 0xd2, 0xbd, 0x58, 0x91, 0x63, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+ 0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0xd2, 0x3c,
+ 0x00, 0x6b, 0x10, 0xbf, 0x54, 0xb2, 0xf0, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+ 0x00, 0x10, 0x52, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x6b, 0x10, 0xbf, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xa8, 0x4c, 0x26, 0x3e, 0x50, 0xd3, 0x7d, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0xaa, 0xd0, 0xda, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
+ 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x4c, 0x26, 0x3e, 0x54, 0x2e, 0xbc, 0xbe,
+ 0x54, 0xec, 0xa1, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x00, 0xce, 0x37, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0x8e, 0x40, 0x3e, 0x7f, 0x3d, 0x31, 0xbf,
+ 0x00, 0x4a, 0x03, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xa0, 0x12, 0x75, 0xbd,
+ 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0xd2, 0x3c,
+ 0x00, 0x8c, 0x9d, 0x3d, 0xa0, 0x12, 0x75, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x00, 0x8c, 0x9d, 0xbd, 0xb0, 0x12, 0xf5, 0xbd, 0xa8, 0x2b, 0x99, 0x3e,
+ 0xaa, 0x2b, 0x19, 0xbf, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x8c, 0x9d, 0x3e,
+ 0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x91, 0xe3, 0x3d, 0xaa, 0x6d, 0xb3, 0xbe,
+ 0x50, 0xd3, 0x7d, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0xaa, 0xf1, 0xe7, 0xbe,
+ 0xa8, 0x12, 0x75, 0xbe, 0x2a, 0xdd, 0x2c, 0xbf, 0xa0, 0x12, 0x75, 0xbd,
+ 0x00, 0xce, 0x37, 0x3e, 0x00, 0xad, 0xaa, 0x3e, 0x54, 0x2e, 0xbc, 0xbe,
+ 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x8c, 0x1d, 0x3e,
+ 0x00, 0x4a, 0x03, 0x3e, 0xaa, 0xaf, 0x4d, 0xbf, 0x00, 0xef, 0xc4, 0xbe,
+ 0x00, 0x52, 0x6c, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x50, 0xd3, 0x7d, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0xad, 0xaa, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e,
+ 0xa0, 0x12, 0x75, 0x3d, 0x50, 0xcb, 0x14, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
+ 0xa8, 0x12, 0x75, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x56, 0xaa, 0x87, 0xbe,
+ 0x50, 0x91, 0x63, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0x58, 0x91, 0x63, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0x58, 0xcb, 0x14, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0x8e, 0x40, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x10, 0x52, 0x3d,
+ 0x00, 0x10, 0x52, 0xbd, 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+ 0x00, 0x52, 0x6c, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0xa0, 0x12, 0xf5, 0x3d,
+ 0xa8, 0x12, 0x75, 0xbe, 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x8e, 0x40, 0xbe,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xa0, 0x12, 0x75, 0xbd,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0xd0, 0x5a, 0x3e,
+ 0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
+ 0x00, 0xce, 0x37, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x4a, 0x03, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x55, 0xcb, 0x14, 0xbf, 0x00, 0x6b, 0x90, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x58, 0xcb, 0x14, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0xaa, 0x2b, 0x99, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+ 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+ 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+ 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0xce, 0x37, 0x3e, 0xaa, 0x12, 0xf5, 0xbe,
+ 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x4c, 0x26, 0xbe,
+ 0xa8, 0x8e, 0x40, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x54, 0xaa, 0x87, 0x3e,
+ 0x50, 0xcb, 0x14, 0x3e, 0x54, 0x2e, 0xbc, 0xbe, 0xa8, 0x4c, 0xa6, 0x3e,
+ 0xa8, 0x4c, 0x26, 0xbe, 0xd5, 0x5b, 0x1b, 0xbf, 0x00, 0x10, 0xd2, 0x3d,
+ 0x60, 0x0d, 0x2f, 0x3d, 0xb0, 0x0a, 0x8c, 0x3d, 0x58, 0x91, 0x63, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0xbd, 0x2a, 0xbc, 0x1f, 0xbf,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x52, 0x6c, 0x3e, 0xaa, 0xf1, 0xe7, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbd, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x31, 0xdf, 0xbe,
+ 0x58, 0xd3, 0x7d, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
+ 0x58, 0x4f, 0x49, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0xaa, 0xf1, 0xe7, 0xbe,
+ 0x00, 0xce, 0x37, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x00, 0x10, 0x52, 0x3e, 0xaa, 0x4c, 0x26, 0xbf, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x7f, 0x1c, 0x24, 0xbf, 0x00, 0x4a, 0x83, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
+ 0x54, 0x4f, 0xc9, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x4a, 0x83, 0x3e,
+ 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x8c, 0x9d, 0x3d, 0x54, 0xd3, 0xfd, 0xbe,
+ 0x00, 0xce, 0x37, 0x3e, 0xaa, 0x2b, 0x99, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x9d, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x10, 0xd2, 0xbd, 0x58, 0xcb, 0x14, 0xbe,
+ 0xaa, 0x0a, 0x0c, 0xbf, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0xef, 0xc4, 0xbe,
+ 0xff, 0x8b, 0x1d, 0xbf, 0xa8, 0x12, 0x75, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x00, 0x31, 0xdf, 0x3e, 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x10, 0xd2, 0xbd,
+ 0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0x12, 0xf5, 0x3e, 0xa8, 0x8e, 0x40, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0x54, 0x2e, 0xbc, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+ 0x00, 0x10, 0x52, 0x3d, 0x55, 0x2e, 0x3c, 0xbf, 0x00, 0xce, 0x37, 0x3e,
+ 0x00, 0x8c, 0x1d, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x6b, 0x90, 0xbe,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x58, 0x0d, 0x2f, 0xbe, 0x54, 0x70, 0xd6, 0xbe,
+ 0xaa, 0x4c, 0xa6, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x10, 0xd2, 0xbc,
+ 0x00, 0x52, 0xec, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+ 0xa8, 0xf1, 0x67, 0x3f, 0x60, 0x0d, 0x2f, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d,
+ 0x58, 0x0d, 0x2f, 0xbe, 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x8c, 0x9d, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x52, 0xec, 0x3e, 0x7f, 0x5e, 0x3e, 0xbf,
+ 0xa8, 0x0a, 0x8c, 0x3e, 0x56, 0xaa, 0x87, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x00, 0x4a, 0x83, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0x58, 0x4f, 0x49, 0xbe,
+ 0x00, 0x4a, 0x03, 0x3e, 0x54, 0x2e, 0xbc, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe,
+ 0x58, 0xcb, 0x14, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0x91, 0xe3, 0x3d,
+ 0xa0, 0x12, 0x75, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d, 0x58, 0x91, 0x63, 0xbe,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x10, 0x52, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0x58, 0xcb, 0x14, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0x80, 0x0a, 0x0c, 0x3c, 0x58, 0x0d, 0x2f, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0xbe, 0x55, 0xaa, 0x07, 0xbf,
+ 0xa8, 0x4c, 0x26, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0x54, 0xcb, 0x94, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0x2a, 0x7a, 0x05, 0x3f,
+ 0x2a, 0x9b, 0x12, 0xbf, 0x00, 0xce, 0xb7, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xa8, 0x12, 0x75, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+ 0x00, 0x4a, 0x83, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x4f, 0x49, 0x3e,
+ 0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x8c, 0x9d, 0x3d,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0x52, 0xbe, 0x54, 0xaa, 0x07, 0x3f,
+ 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x54, 0xaa, 0x87, 0x3e,
+ 0x00, 0x10, 0x52, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x2a, 0x7a, 0x05, 0xbf,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0xce, 0x37, 0x3e,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xef, 0xc4, 0x3e,
+ 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x4a, 0x83, 0x3e, 0x58, 0xd3, 0x7d, 0xbe,
+ 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0x54, 0xec, 0xa1, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x7f, 0xfb, 0x16, 0xbf,
+ 0xa0, 0x0a, 0x0c, 0x3d, 0xa0, 0x12, 0x75, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d,
+ 0x54, 0x0d, 0xaf, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0x3d,
+ 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x4a, 0x03, 0xbe, 0x50, 0x0d, 0xaf, 0x3d,
+ 0x50, 0x91, 0xe3, 0x3d, 0x50, 0x91, 0xe3, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0x54, 0xcb, 0x94, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0x0d, 0xaf, 0x3e,
+ 0xa8, 0x4c, 0x26, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x50, 0x91, 0x63, 0x3e,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xce, 0xb7, 0x3e,
+ 0xa8, 0x12, 0x75, 0x3e, 0xa8, 0x8e, 0x40, 0x3e, 0x54, 0xec, 0xa1, 0x3e,
+ 0xd4, 0x3a, 0x0e, 0x3f, 0xb0, 0x0a, 0x8c, 0x3d, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0xd3, 0x7d, 0x3e, 0xa8, 0x4c, 0x26, 0x3e,
+ 0x00, 0x52, 0x6c, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0x7f, 0x7f, 0x4b, 0xbf,
+ 0x00, 0x10, 0xd2, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0xce, 0xb7, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x00, 0x10, 0xd2, 0xbd, 0xaa, 0x12, 0xf5, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+ 0xaa, 0x2b, 0x99, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0xd2, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+ 0x58, 0x91, 0x63, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x54, 0x4f, 0xc9, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x10, 0x52, 0x3e, 0x2a, 0x82, 0x6e, 0xbf,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x4c, 0x26, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
+ 0x50, 0xd3, 0x7d, 0x3e, 0x00, 0x10, 0xd2, 0x3d, 0xaa, 0x6d, 0xb3, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0xce, 0x37, 0x3e,
+ 0x50, 0x91, 0x63, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x8c, 0x9d, 0xbe,
+ 0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0x50, 0x91, 0xe3, 0xbd, 0xaa, 0xf1, 0xe7, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
+ 0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x00, 0x8c, 0x9d, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0xad, 0xaa, 0x3e,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x4a, 0x03, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+ 0x58, 0x91, 0x63, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x8c, 0x9d, 0x3d,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0xec, 0xa1, 0xbe, 0x00, 0x8c, 0x9d, 0x3e,
+ 0x55, 0xaa, 0x07, 0xbf, 0xa0, 0x12, 0x75, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x52, 0x6c, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x8e, 0x40, 0xbe, 0x7f, 0x1c, 0x24, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x0d, 0xaf, 0x3d,
+ 0x54, 0xcb, 0x94, 0xbe, 0x50, 0xd3, 0x7d, 0x3e, 0x54, 0xaa, 0x87, 0x3e,
+ 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x2b, 0x99, 0x3e,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x8c, 0x1d, 0xbe, 0xa8, 0x8e, 0x40, 0x3e,
+ 0x50, 0x91, 0xe3, 0xbd, 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x4c, 0x26, 0x3e,
+ 0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x8c, 0x9d, 0x3e, 0x60, 0x0d, 0x2f, 0x3d,
+ 0xa0, 0x12, 0xf5, 0x3d, 0x54, 0x0d, 0xaf, 0xbe, 0x55, 0xcb, 0x14, 0xbf,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0xad, 0xaa, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
+ 0x54, 0xcb, 0x14, 0x3f, 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x52, 0x6c, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0x52, 0x3d, 0xa8, 0x8e, 0x40, 0x3e,
+ 0x50, 0x91, 0x63, 0x3e, 0x58, 0x4f, 0x49, 0xbe, 0xff, 0x30, 0x5f, 0xbf,
+ 0x00, 0xef, 0xc4, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0x54, 0x2e, 0xbc, 0x3e,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x10, 0xd2, 0xbc, 0x50, 0xd3, 0x7d, 0x3e,
+ 0x00, 0x10, 0x52, 0x3d, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x52, 0x6c, 0xbe,
+ 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+ 0xa8, 0x8e, 0x40, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d,
+ 0x54, 0x4f, 0xc9, 0x3e, 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x2b, 0x99, 0x3e,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0xa8, 0x12, 0x75, 0xbe, 0x54, 0x0d, 0xaf, 0x3e,
+ 0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x0d, 0xaf, 0xbd, 0xa0, 0x12, 0x75, 0xbd,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x50, 0x4f, 0x49, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0x00, 0x52, 0x6c, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x4a, 0x03, 0x3e,
+ 0x00, 0x4a, 0x83, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x00, 0x10, 0x52, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x58, 0x91, 0x63, 0xbe,
+ 0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
+ 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x4a, 0x03, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x4a, 0x03, 0xbe,
+ 0x54, 0x91, 0xe3, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0xd2, 0xbd,
+ 0xa8, 0x12, 0x75, 0xbe, 0xa8, 0xaf, 0xcd, 0x3e, 0x00, 0x31, 0xdf, 0x3e,
+ 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x52, 0xec, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+ 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+ 0x54, 0x4f, 0xc9, 0xbe, 0x00, 0xad, 0xaa, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
+ 0x00, 0x10, 0x52, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e,
+ 0xa0, 0x12, 0x75, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c, 0x58, 0x4f, 0x49, 0xbe,
+ 0xa8, 0x4c, 0xa6, 0x3e, 0xff, 0x8b, 0x1d, 0xbf, 0xa0, 0x12, 0x75, 0x3d,
+ 0x00, 0xef, 0xc4, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0x8e, 0x40, 0x3e,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x10, 0x52, 0xbe,
+ 0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x10, 0x52, 0x3d,
+ 0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x10, 0xd2, 0x3d,
+ 0x2a, 0xfe, 0x39, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x8c, 0x9d, 0x3d,
+ 0x00, 0x10, 0x52, 0x3d, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
+ 0x00, 0x4a, 0x83, 0x3e, 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x6b, 0x10, 0xbf,
+ 0xaa, 0xaf, 0xcd, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
+ 0x00, 0x10, 0xd2, 0xbd, 0x00, 0xce, 0x37, 0x3e, 0xaa, 0x12, 0xf5, 0xbe,
+ 0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0x58, 0xcb, 0x14, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0x3d, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0x3c,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x6b, 0x90, 0x3e,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x8e, 0xc0, 0x3d,
+ 0x00, 0x10, 0xd2, 0x3c, 0x56, 0xaa, 0x87, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+ 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0x50, 0x4f, 0x49, 0x3e,
+ 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x10, 0xd2, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe, 0x54, 0x91, 0xe3, 0xbe,
+ 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x12, 0x75, 0x3e, 0xa8, 0x4c, 0x26, 0x3e,
+ 0x00, 0xce, 0xb7, 0x3e, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x8c, 0x1d, 0x3e,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0xaa, 0x2b, 0x99, 0xbe,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x4a, 0x03, 0xbf, 0x00, 0x4a, 0x83, 0xbe,
+ 0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x6b, 0x90, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x10, 0x52, 0x3e,
+ 0x00, 0x10, 0x52, 0xbd, 0x00, 0x4a, 0x83, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+ 0xaa, 0x4c, 0xa6, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0x58, 0x91, 0x63, 0xbe,
+ 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x8c, 0x9d, 0x3d,
+ 0x58, 0x91, 0x63, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+ 0x54, 0xcb, 0x94, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
+ 0x00, 0xce, 0x37, 0x3e, 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x00, 0xce, 0x37, 0x3e, 0xa8, 0x0a, 0x8c, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x52, 0xec, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0xb0, 0x12, 0xf5, 0xbd, 0xb0, 0x12, 0xf5, 0xbd,
+ 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0xaa, 0xf1, 0xe7, 0xbe,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xdf, 0x3e,
+ 0x55, 0xcb, 0x14, 0xbf, 0x80, 0x0a, 0x0c, 0xbc, 0x54, 0xd3, 0xfd, 0xbe,
+ 0xd4, 0x3a, 0x0e, 0x3f, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x8c, 0x9d, 0xbd,
+ 0x60, 0x0d, 0x2f, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0x54, 0xec, 0xa1, 0x3e,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x58, 0x91, 0x63, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0xef, 0xc4, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
+ 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x4a, 0x83, 0xbe,
+ 0xa0, 0x12, 0x75, 0xbd, 0x00, 0xad, 0xaa, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0x56, 0xaa, 0x87, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
+ 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+ 0x00, 0x4a, 0x03, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+ 0x54, 0x70, 0xd6, 0xbe, 0x50, 0xd3, 0x7d, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbd, 0x58, 0xd3, 0x7d, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x54, 0x4f, 0xc9, 0x3e, 0x50, 0x0d, 0x2f, 0x3e,
+ 0xa0, 0x0a, 0x0c, 0x3d, 0xa0, 0x12, 0x75, 0x3d, 0x54, 0xec, 0xa1, 0xbe,
+ 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x00, 0xad, 0xaa, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+ 0x56, 0xaa, 0x87, 0xbe, 0x00, 0xef, 0xc4, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+ 0x00, 0xce, 0x37, 0x3e, 0x56, 0xaa, 0x87, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0x00, 0x4a, 0x83, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0x2e, 0xbc, 0xbe,
+ 0xaa, 0x4c, 0xa6, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0x50, 0x91, 0xe3, 0xbd,
+ 0x00, 0xce, 0x37, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe,
+ 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0xa0, 0x12, 0x75, 0x3d,
+ 0x00, 0xce, 0x37, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xad, 0xaa, 0x3e, 0xaa, 0xaf, 0xcd, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbc, 0xa0, 0x0a, 0x0c, 0xbd, 0xa0, 0x12, 0x75, 0x3d,
+ 0x00, 0x6b, 0x90, 0xbe, 0x54, 0xaa, 0x07, 0x3f, 0x00, 0x10, 0x52, 0xbe,
+ 0x58, 0x4f, 0x49, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x52, 0x6c, 0x3e,
+ 0x80, 0x0a, 0x0c, 0x3c, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x10, 0x52, 0x3d,
+ 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0xec, 0xa1, 0x3e, 0xa0, 0x12, 0x75, 0xbd,
+ 0x00, 0x10, 0xd2, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x8e, 0x40, 0x3e,
+ 0xa8, 0xaf, 0xcd, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc, 0xb0, 0x12, 0xf5, 0xbd,
+ 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0xad, 0xaa, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x00, 0x10, 0xd2, 0x3d, 0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0x8e, 0x40, 0x3e,
+ 0x50, 0xcb, 0x14, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x4c, 0x26, 0x3e,
+ 0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0xa8, 0x4c, 0xa6, 0x3e, 0x00, 0x8c, 0x1d, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
+ 0x00, 0xce, 0x37, 0xbe, 0x00, 0x6b, 0x10, 0x3f, 0xd4, 0x5b, 0x1b, 0x3f,
+ 0x58, 0x0d, 0x2f, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0x50, 0xd3, 0x7d, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0xa8, 0xf1, 0xe7, 0x3e, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x4a, 0x03, 0x3e,
+ 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x52, 0x6c, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x6b, 0x90, 0xbe,
+ 0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+ 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0xa0, 0x12, 0x75, 0x3d,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x80, 0x0a, 0x0c, 0x3c, 0x80, 0x0a, 0x0c, 0xbc,
+ 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0x55, 0xaa, 0x07, 0xbf,
+ 0xa0, 0x12, 0xf5, 0x3d, 0xa0, 0x12, 0x75, 0x3d, 0x54, 0xcb, 0x94, 0x3e,
+ 0x50, 0xd3, 0x7d, 0x3e, 0x00, 0x6b, 0x10, 0xbf, 0x00, 0x10, 0xd2, 0xbd,
+ 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x31, 0xdf, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
+ 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+ 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0xf1, 0xe7, 0x3e, 0x00, 0x10, 0x52, 0xbe,
+ 0x54, 0xd3, 0xfd, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
+ 0x00, 0x10, 0x52, 0xbd, 0x54, 0x4f, 0xc9, 0x3e, 0x2a, 0xfe, 0x39, 0xbf,
+ 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc,
+ 0xaa, 0x4c, 0xa6, 0xbe, 0xd5, 0x3a, 0x0e, 0xbf, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x54, 0xcb, 0x94, 0x3e, 0xaa, 0x0a, 0x0c, 0x3f, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x00, 0x10, 0x52, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x54, 0xaa, 0x87, 0x3e,
+ 0x50, 0x4f, 0x49, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
+ 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x73, 0xf9, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x4a, 0x03, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xd5, 0x5b, 0x1b, 0xbf, 0x58, 0x0d, 0x2f, 0xbe,
+ 0xa8, 0x4c, 0xa6, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0x52, 0xbd,
+ 0x54, 0x0d, 0xaf, 0x3e, 0x00, 0x10, 0xd2, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
+ 0x50, 0x4f, 0x49, 0x3e, 0x7f, 0x3d, 0x31, 0xbf, 0x50, 0x91, 0xe3, 0xbd,
+ 0x00, 0x10, 0xd2, 0x3e, 0x54, 0x91, 0xe3, 0xbe, 0x54, 0x0d, 0xaf, 0x3e,
+ 0x00, 0x10, 0x52, 0xbd, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
+ 0x00, 0x8c, 0x9d, 0x3d, 0x54, 0xcb, 0x94, 0x3e, 0xaa, 0xf1, 0xe7, 0xbe,
+ 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0xce, 0x37, 0xbe,
+ 0x50, 0x0d, 0xaf, 0xbd, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
+ 0xaa, 0x2b, 0x19, 0xbf, 0xaa, 0x2b, 0x99, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
+ 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0xd2, 0x3c,
+ 0x50, 0x0d, 0xaf, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x4a, 0x03, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0x2a, 0xbc, 0x9f, 0xbf, 0x50, 0x91, 0xe3, 0x3d,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x54, 0x91, 0xe3, 0xbe, 0xa8, 0xaf, 0xcd, 0x3e,
+ 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0x52, 0x3d,
+ 0xaa, 0x8e, 0xc0, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0xd4, 0x42, 0x77, 0xbf,
+ 0x00, 0x10, 0x52, 0x3e, 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x10, 0x52, 0xbd,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0xef, 0xc4, 0x3e,
+ 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
+ 0x2a, 0x9b, 0x12, 0xbf, 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0x4c, 0x26, 0x3e,
+ 0xaa, 0x12, 0xf5, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x54, 0x0d, 0xaf, 0x3e,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x10, 0xd2, 0xbd,
+ 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0x52, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
+ 0xd5, 0x19, 0x01, 0xbf, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
+ 0xa8, 0xd0, 0xda, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0xaa, 0x2b, 0x19, 0xbf, 0xa8, 0x6d, 0xb3, 0x3e,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x7f, 0x1c, 0x24, 0xbf, 0x00, 0xad, 0xaa, 0x3e,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x8c, 0x1d, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+ 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x58, 0xcb, 0x14, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x10, 0xd2, 0x3d,
+ 0x50, 0x91, 0xe3, 0x3d, 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0x4f, 0xc9, 0xbe,
+ 0x00, 0x52, 0x6c, 0xbe, 0x58, 0xd3, 0x7d, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+ 0xd5, 0x5b, 0x1b, 0xbf, 0xa0, 0x12, 0x75, 0x3d, 0xaa, 0x4c, 0xa6, 0xbe,
+ 0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x4a, 0x83, 0x3e,
+ 0x55, 0xaa, 0x07, 0xbf, 0x00, 0x52, 0x6c, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
+ 0x50, 0x0d, 0xaf, 0x3d, 0xa0, 0x0a, 0x0c, 0x3d, 0x54, 0x70, 0xd6, 0x3e,
+ 0x2a, 0xbc, 0x1f, 0xbf, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+ 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0xb0, 0x12, 0xf5, 0xbd,
+ 0x55, 0x0d, 0x2f, 0xbf, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x4a, 0x03, 0xbe,
+ 0x00, 0x52, 0x6c, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x00, 0x00, 0x00, 0x00, 0xa0, 0x12, 0x75, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
+ 0x00, 0x10, 0x52, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0xd4, 0xdf, 0x4f, 0xbf,
+ 0x00, 0x4a, 0x03, 0x3e, 0xaa, 0xf1, 0xe7, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
+ 0x00, 0x4a, 0x03, 0x3e, 0x58, 0xd3, 0x7d, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x54, 0xec, 0xa1, 0x3e, 0x54, 0xaa, 0x87, 0x3e, 0x00, 0x10, 0x52, 0x3e,
+ 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xce, 0xb7, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe,
+ 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x31, 0xdf, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x55, 0xec, 0x21, 0xbf, 0xaa, 0xaf, 0xcd, 0xbe, 0x54, 0x70, 0xd6, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x4a, 0x03, 0xbe,
+ 0x58, 0x91, 0x63, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x8c, 0x9d, 0xbd,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+ 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x12, 0xf5, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x50, 0x91, 0xe3, 0x3d, 0x50, 0x0d, 0xaf, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
+ 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x54, 0x0d, 0xaf, 0xbe, 0x54, 0x70, 0xd6, 0xbe, 0x54, 0x70, 0xd6, 0xbe,
+ 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0xa0, 0x12, 0x75, 0xbd,
+ 0x58, 0x0d, 0x2f, 0xbe, 0x2a, 0xbc, 0x1f, 0xbf, 0x00, 0x4a, 0x03, 0xbe,
+ 0xa8, 0x12, 0x75, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd, 0x54, 0xcb, 0x94, 0xbe,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+ 0x54, 0x2e, 0xbc, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
+ 0x00, 0x4a, 0x03, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
+ 0x50, 0x0d, 0xaf, 0x3d, 0x50, 0x0d, 0xaf, 0x3d, 0x54, 0xec, 0xa1, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x54, 0x91, 0xe3, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
+ 0x00, 0x73, 0xf9, 0x3e, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x4a, 0x83, 0x3e,
+ 0x00, 0x10, 0x52, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0xd5, 0x19, 0x01, 0xbf, 0xaa, 0xd0, 0xda, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0x00, 0x10, 0x52, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+ 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x8c, 0x9d, 0x3d, 0xa0, 0x12, 0x75, 0x3d,
+ 0xaa, 0x4c, 0xa6, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0x58, 0xd3, 0x7d, 0xbe,
+ 0xd4, 0x3a, 0x0e, 0x3f, 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x8e, 0x40, 0x3e,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0x54, 0x0d, 0xaf, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x2b, 0x99, 0x3e,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x60, 0x0d, 0x2f, 0xbd, 0xd5, 0x3a, 0x0e, 0xbf,
+ 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x8c, 0x9d, 0x3d,
+ 0x58, 0x0d, 0x2f, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x6b, 0x90, 0xbe,
+ 0x54, 0xcb, 0x94, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0xd2, 0xbc,
+ 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
+ 0x50, 0x91, 0xe3, 0xbd, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x6b, 0x10, 0xbf, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x58, 0x91, 0x63, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x00, 0x10, 0xd2, 0xbc, 0xaa, 0x2b, 0x99, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe,
+ 0xd5, 0x5b, 0x1b, 0xbf, 0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x54, 0x4f, 0xc9, 0xbe, 0x54, 0xb2, 0xf0, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+ 0x50, 0x91, 0xe3, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0xa8, 0x4c, 0x26, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0x54, 0x4f, 0xc9, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x4f, 0x49, 0x3e,
+ 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x31, 0xdf, 0xbe,
+ 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x4a, 0x83, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
+ 0x54, 0xec, 0xa1, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0xef, 0xc4, 0xbe,
+ 0x54, 0xd3, 0xfd, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x12, 0x75, 0xbe,
+ 0xaa, 0xaf, 0xcd, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x4a, 0x83, 0x3e, 0x00, 0x52, 0x6c, 0xbe,
+ 0xaa, 0xf1, 0x67, 0xbf, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x54, 0x70, 0xd6, 0xbe, 0x00, 0x8c, 0x9d, 0x3e,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
+ 0x00, 0x6b, 0x90, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0x00, 0xef, 0xc4, 0x3e, 0xa8, 0x0a, 0x8c, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x4a, 0x83, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x54, 0xec, 0xa1, 0x3e, 0x58, 0xd3, 0x7d, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+ 0x00, 0x10, 0x52, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x6b, 0x90, 0x3e,
+ 0x54, 0xaa, 0x87, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe,
+ 0x50, 0x91, 0xe3, 0xbd, 0x2a, 0xbc, 0x1f, 0xbf, 0x00, 0x10, 0xd2, 0xbc,
+ 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x4c, 0x26, 0x3e,
+ 0x54, 0xcb, 0x94, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e,
+ 0x00, 0xad, 0xaa, 0xbe, 0x54, 0xcb, 0x94, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0x00, 0x10, 0x52, 0xbe, 0xd4, 0x5b, 0x1b, 0x3f, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0x00, 0x10, 0x52, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0x50, 0xcb, 0x14, 0x3e,
+ 0x50, 0x91, 0xe3, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0x2a, 0x7a, 0x05, 0xbf,
+ 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x00, 0x00, 0x00,
+ 0x54, 0x0d, 0xaf, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x9d, 0x3e,
+ 0x54, 0x91, 0x63, 0xbf, 0xa8, 0x8e, 0x40, 0x3e, 0x7f, 0x3d, 0x31, 0xbf,
+ 0xa8, 0x8e, 0x40, 0xbe, 0x54, 0xec, 0xa1, 0x3e, 0xaa, 0x6d, 0xb3, 0xbe,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x58, 0xcb, 0x14, 0xbe, 0xb0, 0x12, 0xf5, 0xbd,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0x2a, 0xfe, 0x39, 0xbf, 0x50, 0x91, 0x63, 0x3e,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x54, 0xec, 0xa1, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
+ 0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x4c, 0x26, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x8c, 0x9d, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+ 0x00, 0x31, 0xdf, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0x50, 0x4f, 0x49, 0x3e,
+ 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x8c, 0x9d, 0x3e,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0xa8, 0x0a, 0x8c, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e,
+ 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0xd0, 0xda, 0xbe,
+ 0x54, 0xcb, 0x94, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0x12, 0x75, 0x3e,
+ 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x10, 0x52, 0x3d, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x56, 0xaa, 0x87, 0xbe, 0x54, 0x0d, 0xaf, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
+ 0x00, 0x4a, 0x03, 0x3e, 0x54, 0x4f, 0xc9, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x55, 0xaa, 0x07, 0xbf,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0x54, 0x91, 0xe3, 0xbe,
+ 0xa8, 0x4c, 0x26, 0x3e, 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0x91, 0x63, 0xbe,
+ 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x52, 0xec, 0xbe, 0x50, 0x0d, 0xaf, 0x3d,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x6b, 0x90, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x10, 0x52, 0x3e,
+ 0x00, 0x10, 0xd2, 0x3c, 0x60, 0x0d, 0x2f, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x00, 0x6b, 0x90, 0x3e, 0xff, 0xac, 0x2a, 0xbf, 0x00, 0x4a, 0x03, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0xce, 0xb7, 0xbe, 0x54, 0x70, 0xd6, 0xbe,
+ 0x54, 0xcb, 0x94, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x58, 0x4f, 0x49, 0xbe,
+ 0x50, 0x0d, 0xaf, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x4a, 0x83, 0x3e,
+ 0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x8e, 0xc0, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
+ 0x00, 0x00, 0x00, 0x00, 0x54, 0xcb, 0x94, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0xa0, 0x12, 0x75, 0xbd, 0x50, 0x4f, 0x49, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0xaa, 0x2b, 0x19, 0xbf, 0xa8, 0xd0, 0x5a, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0xa0, 0x12, 0xf5, 0x3d, 0x50, 0xd3, 0x7d, 0x3e, 0xa0, 0x12, 0x75, 0xbd,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x4f, 0x49, 0x3e, 0x2a, 0xfe, 0x39, 0xbf,
+ 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x73, 0xf9, 0xbe,
+ 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0x50, 0x4f, 0x49, 0x3e,
+ 0x54, 0x4f, 0xc9, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x50, 0x0d, 0x2f, 0x3e,
+ 0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x8e, 0xc0, 0x3e, 0x00, 0x8c, 0x9d, 0x3d,
+ 0xaa, 0xf1, 0xe7, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x8c, 0x1d, 0xbe,
+ 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
+ 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x4a, 0x03, 0x3f,
+ 0xa8, 0x8e, 0x40, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd, 0x7f, 0x3d, 0x31, 0xbf,
+ 0x00, 0xce, 0x37, 0x3e, 0x00, 0x52, 0xec, 0xbe, 0xa8, 0x8e, 0x40, 0x3e,
+ 0xd4, 0x19, 0x01, 0x3f, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0x00, 0x4a, 0x03, 0x3e, 0xaa, 0xf1, 0xe7, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x52, 0x6c, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+ 0xff, 0x8b, 0x1d, 0xbf, 0x00, 0x6b, 0x90, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+ 0xa0, 0x12, 0xf5, 0x3d, 0x58, 0x4f, 0x49, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+ 0x60, 0x0d, 0x2f, 0xbd, 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
+ 0x50, 0x0d, 0xaf, 0xbd, 0xa8, 0x4c, 0x26, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0x54, 0x91, 0xe3, 0x3e, 0x54, 0x91, 0xe3, 0x3e,
+ 0x58, 0x0d, 0x2f, 0xbe, 0xd5, 0x19, 0x01, 0xbf, 0xa0, 0x12, 0x75, 0xbd,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x00, 0x00, 0x00,
+ 0x54, 0xaa, 0x07, 0x3f, 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
+ 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x8c, 0x1d, 0x3e,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x4a, 0x83, 0x3e,
+ 0x50, 0x91, 0xe3, 0xbd, 0xaa, 0x0a, 0x0c, 0xbf, 0x00, 0x31, 0xdf, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x0a, 0x8c, 0x3d,
+ 0x58, 0xcb, 0x14, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
+ 0x00, 0x8c, 0x9d, 0x3d, 0xb0, 0x0a, 0x8c, 0x3d, 0xaa, 0xaf, 0xcd, 0xbe,
+ 0xb0, 0x12, 0xf5, 0xbd, 0xa8, 0xd0, 0x5a, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0xd4, 0x00, 0x5d, 0xbf, 0xa0, 0x12, 0x75, 0xbd, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x00, 0x52, 0x6c, 0xbe, 0x54, 0xec, 0xa1, 0x3e, 0xb0, 0x12, 0xf5, 0xbd,
+ 0xaa, 0xaf, 0xcd, 0xbe, 0xa8, 0xd0, 0xda, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0x00, 0x10, 0xd2, 0xbd, 0x00, 0xce, 0xb7, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0x54, 0xcb, 0x94, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+ 0x80, 0xda, 0x09, 0xbf, 0x58, 0x0d, 0x2f, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x54, 0xaa, 0x07, 0x3f, 0xaa, 0x0a, 0x8c, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
+ 0x50, 0x91, 0x63, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0x12, 0x75, 0xbe,
+ 0x00, 0x6b, 0x90, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x2a, 0xbc, 0x1f, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x50, 0x0d, 0xaf, 0x3d, 0x50, 0x0d, 0x2f, 0x3e,
+ 0xaa, 0x2b, 0x99, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0x00, 0x6b, 0x90, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+ 0x00, 0x4a, 0x83, 0xbe, 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x10, 0xd2, 0x3e,
+ 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0x50, 0xcb, 0x14, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0xb0, 0x12, 0xf5, 0xbd, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0xad, 0x2a, 0x3f,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x58, 0xd3, 0x7d, 0xbe, 0x54, 0x2e, 0xbc, 0x3e,
+ 0x00, 0x10, 0xd2, 0xbc, 0x54, 0xec, 0xa1, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
+ 0x00, 0x4a, 0x03, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
+ 0xa8, 0x4c, 0x26, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0x54, 0xec, 0xa1, 0xbe,
+ 0x54, 0x2e, 0xbc, 0x3e, 0x50, 0x91, 0x63, 0x3e, 0xaa, 0xf1, 0xe7, 0xbe,
+ 0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x4a, 0x03, 0xbe,
+ 0x50, 0x91, 0x63, 0x3e, 0x00, 0x4a, 0x03, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x54, 0x4f, 0xc9, 0x3e, 0x00, 0x8c, 0x9d, 0x3e, 0x58, 0x91, 0x63, 0xbe,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0xa8, 0x4c, 0xa6, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
+ 0xa8, 0xf1, 0xe7, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0x3c, 0x54, 0xec, 0xa1, 0xbe,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x50, 0xd3, 0x7d, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
+ 0xa0, 0x12, 0x75, 0x3d, 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0xce, 0x37, 0x3e,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x10, 0x52, 0x3d,
+ 0x00, 0x10, 0x52, 0xbd, 0x55, 0x0d, 0x2f, 0xbf, 0x50, 0xd3, 0x7d, 0x3e,
+ 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x8c, 0x9d, 0x3e,
+ 0x54, 0x70, 0xd6, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e, 0xa0, 0x12, 0x75, 0xbd,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0xa0, 0x0a, 0x0c, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d,
+ 0x00, 0xad, 0xaa, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0xa0, 0x12, 0x75, 0xbd,
+ 0xa0, 0x12, 0x75, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0x3c,
+ 0x56, 0xaa, 0x87, 0xbe, 0x50, 0x91, 0x63, 0x3e, 0xa8, 0xaf, 0xcd, 0x3e,
+ 0x54, 0xb2, 0xf0, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0x54, 0xec, 0xa1, 0x3e,
+ 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0xce, 0x37, 0x3e,
+ 0x54, 0xaa, 0x07, 0x3f, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x4a, 0x03, 0x3e, 0x80, 0xfb, 0x16, 0x3f,
+ 0x00, 0x73, 0xf9, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x8c, 0x9d, 0x3e,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0x54, 0x0d, 0xaf, 0x3e,
+ 0x00, 0x10, 0xd2, 0xbe, 0xff, 0x8b, 0x1d, 0xbf, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x58, 0xcb, 0x14, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+ 0x00, 0x10, 0xd2, 0x3c, 0xa8, 0xd0, 0x5a, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0x58, 0xcb, 0x14, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x12, 0xf5, 0xbe,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x52, 0xec, 0x3e,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x54, 0xaa, 0x87, 0x3e, 0x00, 0x10, 0x52, 0xbd,
+ 0x00, 0x8c, 0x9d, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
+ 0x54, 0xb2, 0xf0, 0xbe, 0x50, 0x91, 0x63, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x8c, 0x9d, 0xbd, 0x58, 0x0d, 0x2f, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0xaa, 0x4c, 0x26, 0xbf, 0x00, 0x10, 0x52, 0xbd,
+ 0xa8, 0x8e, 0x40, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0x54, 0x4f, 0xc9, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc,
+ 0x50, 0xcb, 0x14, 0x3e, 0x50, 0x91, 0x63, 0x3e, 0x00, 0x8c, 0x1d, 0x3e,
+ 0x54, 0x0d, 0xaf, 0x3e, 0x00, 0x10, 0x52, 0x3d, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0xd0, 0x5a, 0x3e, 0x50, 0xd3, 0x7d, 0x3e,
+ 0xd5, 0x3a, 0x0e, 0xbf, 0x54, 0xb2, 0xf0, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
+ 0x56, 0xaa, 0x87, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x52, 0x6c, 0x3e,
+ 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x10, 0xd2, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x60, 0x0d, 0x2f, 0x3d, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0xd5, 0x3a, 0x0e, 0xbf, 0xaa, 0x4c, 0xa6, 0xbe, 0x80, 0xda, 0x09, 0x3f,
+ 0x00, 0x8c, 0x1d, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd, 0x54, 0x0d, 0xaf, 0x3e,
+ 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x54, 0xec, 0xa1, 0x3e, 0x00, 0x4a, 0x03, 0xbe,
+ 0xa8, 0x4c, 0xa6, 0x3e, 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0xef, 0xc4, 0xbe,
+ 0x58, 0xd3, 0x7d, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0x0d, 0x2f, 0x3e,
+ 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x8c, 0x9d, 0xbe, 0xa8, 0xaf, 0xcd, 0x3e,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
+ 0x50, 0x91, 0x63, 0x3e, 0x00, 0x8c, 0x1d, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x6b, 0x10, 0xbf, 0x00, 0x10, 0x52, 0xbd,
+ 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0x2b, 0x99, 0xbe,
+ 0xaa, 0x6d, 0xb3, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x91, 0xe3, 0x3d,
+ 0x00, 0x10, 0x52, 0x3d, 0x54, 0x0d, 0xaf, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+ 0x60, 0x0d, 0x2f, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0xcb, 0x14, 0x3e,
+ 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x6b, 0x90, 0xbe,
+ 0x00, 0x6b, 0x10, 0xbf, 0x50, 0x0d, 0x2f, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
+ 0x54, 0xd3, 0xfd, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x54, 0x70, 0xd6, 0xbe,
+ 0x80, 0x0a, 0x0c, 0xbc, 0xa0, 0x0a, 0x0c, 0xbd, 0x58, 0x4f, 0x49, 0xbe,
+ 0xaa, 0x4c, 0xa6, 0xbe, 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0xd2, 0xbc,
+ 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0xb0, 0x0a, 0x8c, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x90, 0xbe, 0xaa, 0x6d, 0x33, 0xbf,
+ 0x00, 0x8c, 0x9d, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0xaa, 0x4c, 0xa6, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0xa8, 0x8e, 0x40, 0xbe,
+ 0xaa, 0x4c, 0xa6, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x6b, 0x90, 0xbe, 0x58, 0x91, 0x63, 0xbe,
+ 0x00, 0x4a, 0x83, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0xaa, 0x6d, 0x33, 0xbf,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x80, 0xda, 0x09, 0xbf, 0xb0, 0x12, 0xf5, 0xbd,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x8c, 0x9d, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xa8, 0x6d, 0xb3, 0x3e, 0xd4, 0x21, 0x6a, 0xbf, 0xa8, 0x8e, 0x40, 0xbe,
+ 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x55, 0x0d, 0x2f, 0xbf,
+ 0xaa, 0x2b, 0x99, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
+ 0xb0, 0x12, 0xf5, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
+ 0x80, 0x0a, 0x0c, 0x3c, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x8c, 0x9d, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x00, 0x00, 0x00,
+ 0x56, 0xaa, 0x87, 0xbe, 0x7f, 0xe2, 0x72, 0xbf, 0x00, 0x10, 0xd2, 0xbe,
+ 0x00, 0xce, 0x37, 0xbe, 0xd5, 0x19, 0x01, 0xbf, 0x00, 0x52, 0xec, 0xbe,
+ 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0xd0, 0x5a, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x4a, 0x03, 0xbf, 0x00, 0x52, 0x6c, 0x3e,
+ 0x00, 0x10, 0xd2, 0x3c, 0x54, 0x4f, 0xc9, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+ 0x50, 0x0d, 0x2f, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c, 0x58, 0x0d, 0x2f, 0xbe,
+ 0x50, 0x91, 0xe3, 0x3d, 0x00, 0xce, 0x37, 0x3e, 0x54, 0xcb, 0x94, 0xbe,
+ 0xaa, 0xd0, 0xda, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x58, 0xcb, 0x14, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0x00, 0x52, 0x6c, 0xbe, 0x00, 0xce, 0xb7, 0x3e, 0xb0, 0x12, 0xf5, 0xbd,
+ 0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x73, 0xf9, 0xbe, 0x54, 0xaa, 0x87, 0x3e,
+ 0x00, 0xce, 0x37, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x58, 0x4f, 0x49, 0xbe,
+ 0xaa, 0x6d, 0xb3, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0x4f, 0xc9, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+ 0x00, 0xad, 0xaa, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+ 0x00, 0xce, 0x37, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e,
+ 0x00, 0x10, 0x52, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0xaa, 0xaf, 0xcd, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0x3d, 0x54, 0x70, 0xd6, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x4c, 0xa6, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+ 0x54, 0x70, 0xd6, 0xbe, 0x80, 0xda, 0x09, 0xbf, 0x00, 0x8c, 0x1d, 0xbe,
+ 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0xd0, 0xda, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x54, 0xcb, 0x94, 0x3e,
+ 0x54, 0xec, 0xa1, 0xbe, 0x54, 0x91, 0xe3, 0xbe, 0x00, 0x73, 0xf9, 0xbe,
+ 0x60, 0x0d, 0x2f, 0x3d, 0xd5, 0x3a, 0x0e, 0xbf, 0x00, 0x10, 0xd2, 0xbc,
+ 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xad, 0xaa, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0x2b, 0x19, 0xbf, 0xa8, 0x12, 0x75, 0x3e,
+ 0x00, 0x4a, 0x03, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x10, 0x52, 0xbd,
+ 0x7f, 0x5e, 0x3e, 0xbf, 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
+ 0x00, 0x10, 0xd2, 0x3d, 0xaa, 0x8e, 0xc0, 0xbe, 0xb0, 0x12, 0xf5, 0xbd,
+ 0xaa, 0xaf, 0xcd, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e,
+ 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x10, 0x52, 0x3d, 0x55, 0xec, 0x21, 0xbf,
+ 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
+ 0x00, 0xce, 0xb7, 0x3e, 0x54, 0xd3, 0xfd, 0xbe, 0x54, 0x0d, 0xaf, 0x3e,
+ 0xa8, 0x12, 0x75, 0xbe, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0xce, 0x37, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0xd0, 0xda, 0x3e,
+ 0x54, 0x70, 0xd6, 0x3e, 0x00, 0xad, 0xaa, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+ 0x00, 0x10, 0x52, 0xbe, 0x00, 0x73, 0xf9, 0xbe, 0x50, 0x0d, 0xaf, 0x3d,
+ 0x00, 0xef, 0xc4, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d,
+ 0x00, 0xce, 0x37, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xff, 0x8b, 0x1d, 0xbf,
+ 0x00, 0xce, 0x37, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x4a, 0x03, 0x3e, 0x50, 0xcb, 0x14, 0x3e,
+ 0x56, 0xaa, 0x87, 0xbe, 0x54, 0xcb, 0x94, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
+ 0xaa, 0xd0, 0xda, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+ 0x00, 0x10, 0x52, 0x3d, 0x54, 0xaa, 0x87, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+ 0xaa, 0x0a, 0x8c, 0xbe, 0x2a, 0xbc, 0x1f, 0xbf, 0xc0, 0x0a, 0x8c, 0xbc,
+ 0x00, 0xce, 0x37, 0x3e, 0x55, 0xcb, 0x14, 0xbf, 0x50, 0xcb, 0x14, 0x3e,
+ 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0xef, 0xc4, 0xbe, 0x00, 0x10, 0x52, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbc, 0x54, 0x4f, 0xc9, 0x3e, 0x60, 0x0d, 0x2f, 0xbd,
+ 0xa8, 0xd0, 0x5a, 0xbe, 0x54, 0x2e, 0xbc, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+ 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x56, 0xaa, 0x87, 0xbe,
+ 0xaa, 0xaf, 0xcd, 0xbe, 0x50, 0x91, 0x63, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d,
+ 0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x50, 0xcb, 0x14, 0x3e,
+ 0x00, 0x6b, 0x90, 0xbe, 0xa8, 0x6d, 0xb3, 0x3e, 0x54, 0xcb, 0x94, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0xec, 0xa1, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
+ 0xaa, 0x12, 0xf5, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x12, 0xf5, 0x3e,
+ 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x54, 0x2e, 0xbc, 0xbe,
+ 0xa0, 0x12, 0x75, 0xbd, 0xd5, 0x3a, 0x0e, 0xbf, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x00, 0x10, 0x52, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x4a, 0x83, 0x3e,
+ 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
+ 0x00, 0x73, 0xf9, 0x3e, 0x54, 0xaa, 0x87, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x8c, 0x1d, 0x3f, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x10, 0x52, 0x3d, 0x54, 0xec, 0xa1, 0x3e,
+ 0xaa, 0x6d, 0xb3, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x54, 0x4f, 0xc9, 0xbe,
+ 0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0x00, 0x6b, 0x10, 0xbf,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x2a, 0xbc, 0x1f, 0xbf, 0x58, 0x0d, 0x2f, 0xbe,
+ 0x50, 0x91, 0xe3, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe, 0xb0, 0x12, 0xf5, 0xbd,
+ 0x60, 0x0d, 0x2f, 0x3d, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0xd2, 0x3c,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xaa, 0x6d, 0xb3, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x8c, 0x9d, 0x3d,
+ 0x00, 0x10, 0xd2, 0x3d, 0x54, 0xcb, 0x94, 0x3e, 0x00, 0x10, 0xd2, 0xbc,
+ 0x00, 0x10, 0xd2, 0xbd, 0xc0, 0x0a, 0x8c, 0xbc, 0x58, 0x0d, 0x2f, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x58, 0x4f, 0x49, 0xbe, 0xa8, 0x2b, 0x99, 0x3e,
+ 0x00, 0x8c, 0x9d, 0x3d, 0xa0, 0x12, 0x75, 0x3d, 0x54, 0xaa, 0x87, 0x3e,
+ 0x00, 0x8c, 0x9d, 0x3d, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x6b, 0x90, 0x3e,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x8c, 0x1d, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+ 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0x58, 0x91, 0x63, 0xbe,
+ 0x00, 0x4a, 0x03, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x8c, 0x1d, 0x3e,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x8c, 0x9d, 0x3d,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0xcb, 0x94, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0xa8, 0x0a, 0x8c, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
+ 0x54, 0xec, 0xa1, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xc0, 0x0a, 0x8c, 0xbc,
+ 0x00, 0x4a, 0x03, 0xbe, 0x00, 0xef, 0xc4, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0xce, 0x37, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
+ 0x00, 0x8c, 0x1d, 0x3e, 0x50, 0x91, 0xe3, 0x3d, 0x60, 0x0d, 0x2f, 0xbd,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x91, 0xe3, 0x3d,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
+ 0x00, 0x4a, 0x83, 0x3e, 0xaa, 0xd0, 0xda, 0xbe, 0x00, 0x10, 0x52, 0x3d,
+ 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0xd2, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x10, 0x52, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe,
+ 0xc0, 0x01, 0x80, 0xbf, 0x54, 0xcb, 0x94, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x00, 0xef, 0xc4, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+ 0x00, 0xce, 0x37, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0xaa, 0xd0, 0xda, 0xbe,
+ 0x00, 0x10, 0x52, 0xbd, 0xc0, 0x0a, 0x8c, 0xbc, 0xaa, 0x4c, 0xa6, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x52, 0x6c, 0x3e,
+ 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x4a, 0x03, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+ 0xaa, 0x6d, 0xb3, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
+ 0x00, 0x00, 0x00, 0x00, 0x50, 0x91, 0xe3, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd,
+ 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x00, 0xce, 0xb7, 0xbe,
+ 0x54, 0xcb, 0x94, 0x3e, 0x00, 0xce, 0x37, 0x3e, 0xa0, 0x12, 0x75, 0xbd,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x9d, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xa8, 0x8e, 0x40, 0x3e, 0x54, 0x70, 0xd6, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
+ 0x00, 0x4a, 0x03, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0x50, 0x4f, 0x49, 0x3e,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x8c, 0x1d, 0x3e, 0x54, 0xb2, 0xf0, 0xbe,
+ 0x00, 0x10, 0xd2, 0xbd, 0x2a, 0x7a, 0x05, 0xbf, 0x00, 0x10, 0x52, 0x3e,
+ 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0xce, 0x37, 0x3e,
+ 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
+ 0x00, 0x10, 0xd2, 0xbd, 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0x0a, 0x0c, 0xbe,
+ 0xd5, 0x3a, 0x0e, 0xbf, 0x00, 0x6b, 0x90, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
+ 0x00, 0x4a, 0x03, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d, 0x58, 0xcb, 0x14, 0xbe,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0xf1, 0xe7, 0x3e, 0x00, 0x4a, 0x83, 0xbe,
+ 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
+ 0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x4c, 0x26, 0x3e, 0x60, 0x0d, 0x2f, 0x3d,
+ 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x50, 0x0d, 0xaf, 0x3d,
+ 0x80, 0x0a, 0x0c, 0x3c, 0xd5, 0x7c, 0x28, 0xbf, 0x00, 0x10, 0xd2, 0xbd,
+ 0xa8, 0x6d, 0xb3, 0x3e, 0x54, 0x0d, 0xaf, 0x3e, 0x2a, 0x7a, 0x05, 0xbf,
+ 0x50, 0xd3, 0x7d, 0x3e, 0x54, 0xec, 0xa1, 0x3e, 0x00, 0x8c, 0x1d, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x0a, 0x0c, 0x3c, 0xa0, 0x12, 0x75, 0xbd,
+ 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0xd0, 0x5a, 0x3e,
+ 0x00, 0x4a, 0x03, 0x3f, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xce, 0xb7, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0x3d,
+ 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x12, 0x75, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0x3e,
+ 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
+ 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0x0d, 0xaf, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0x00, 0x52, 0x6c, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
+ 0xb0, 0x8e, 0xc0, 0x3d, 0xaa, 0x2b, 0x99, 0xbe, 0x54, 0x2e, 0xbc, 0xbe,
+ 0x54, 0x2e, 0xbc, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
+ 0xa8, 0xf1, 0xe7, 0x3e, 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x4a, 0x03, 0xbe,
+ 0x58, 0xd3, 0x7d, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x0a, 0x8c, 0xbd,
+ 0x54, 0xcb, 0x94, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
+ 0x00, 0xce, 0x37, 0xbe, 0x50, 0x91, 0x63, 0x3e, 0x00, 0x8c, 0x1d, 0x3e,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0xb2, 0xf0, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
+ 0x60, 0x0d, 0x2f, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
+ 0x50, 0x0d, 0x2f, 0x3e, 0x58, 0x4f, 0x49, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
+ 0x50, 0x0d, 0xaf, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0xd5, 0x5b, 0x1b, 0xbf,
+ 0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x12, 0xf5, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e,
+ 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x8c, 0x9d, 0x3d, 0xa0, 0x12, 0x75, 0x3d,
+ 0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x12, 0xf5, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
+ 0x54, 0xcb, 0x94, 0x3e, 0xa0, 0x12, 0x75, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
+ 0x54, 0x4f, 0xc9, 0x3e, 0x00, 0xce, 0xb7, 0xbe, 0xd5, 0x19, 0x01, 0xbf,
+ 0xb0, 0x12, 0xf5, 0xbd, 0x50, 0x0d, 0xaf, 0x3d, 0x80, 0x0a, 0x0c, 0xbc,
+ 0x00, 0xce, 0x37, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0x7f, 0x1c, 0x24, 0xbf,
+ 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
+ 0xc0, 0x0a, 0x8c, 0xbc, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x55, 0x0d, 0x2f, 0xbf, 0x00, 0x52, 0x6c, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbe, 0xff, 0x8b, 0x1d, 0xbf, 0x00, 0x8c, 0x1d, 0x3e,
+ 0x54, 0x0d, 0xaf, 0xbe, 0x55, 0xaa, 0x07, 0xbf, 0x50, 0x0d, 0xaf, 0xbd,
+ 0xaa, 0x2b, 0x19, 0xbf, 0x00, 0xce, 0xb7, 0xbe, 0xd5, 0x19, 0x01, 0xbf,
+ 0xa0, 0x12, 0xf5, 0x3d, 0x54, 0x70, 0xd6, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
+ 0xd5, 0x3a, 0x0e, 0xbf, 0xa0, 0x12, 0xf5, 0x3d, 0x54, 0xec, 0xa1, 0xbe,
+ 0x00, 0x8c, 0x1d, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0xff, 0xac, 0x2a, 0xbf,
+ 0x00, 0x10, 0x52, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x6b, 0x10, 0xbf,
+ 0x50, 0x91, 0xe3, 0xbd, 0xaa, 0x12, 0xf5, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
+ 0x54, 0xec, 0xa1, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x4a, 0x03, 0xbf,
+ 0x00, 0xce, 0xb7, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0xce, 0x37, 0xbe,
+ 0xc0, 0x0a, 0x8c, 0x3c, 0x80, 0x0a, 0x0c, 0xbc, 0x50, 0x91, 0xe3, 0x3d,
+ 0x50, 0x91, 0x63, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
+ 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0xbc, 0xa0, 0x12, 0x75, 0xbd,
+ 0x00, 0x10, 0x52, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
+ 0xaa, 0x8e, 0xc0, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0xad, 0xaa, 0x3e,
+ 0x58, 0xcb, 0x14, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd, 0x80, 0x0a, 0x0c, 0x3c,
+ 0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x0a, 0x8c, 0x3e, 0x7f, 0x1c, 0x24, 0xbf,
+ 0xb0, 0x12, 0xf5, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x10, 0xd2, 0xbc,
+ 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x10, 0x52, 0xbe, 0x00, 0xad, 0xaa, 0xbe,
+ 0x80, 0x0a, 0x0c, 0xbc, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x6b, 0x90, 0xbe,
+ 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
+ 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
+ 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
+ 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0x52, 0x3d,
+ 0x00, 0x10, 0xd2, 0x3c, 0x58, 0x4f, 0x49, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
+ 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x8c, 0x9d, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x83, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
+ 0x00, 0x6b, 0x90, 0xbe, 0x2a, 0x7a, 0x05, 0xbf, 0xa8, 0x0a, 0x0c, 0x3e,
+ 0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0xef, 0xc4, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
+ 0xaa, 0x2b, 0x99, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0xaa, 0xaf, 0xcd, 0xbe,
+ 0x00, 0x4a, 0x83, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
+}};
+const int32_t dnn_logits_bias__6__cf__6_shape[1] = {1};
const union {
uint8_t bytes[4];
float values[1];
-} dnn_logits_bias__2__cf__2 = {{
- 0xbf,
- 0x29,
- 0xe6,
- 0xbf,
+} dnn_logits_bias__6__cf__6 = {{
+ 0xa9,
+ 0x35,
+ 0x05,
+ 0xc0,
}};
-const int32_t dnn_logits_kernel__3__cf__3_shape[2] = {20, 1};
+const int32_t dnn_logits_kernel__7__cf__7_shape[2] = {59, 1};
const union {
- uint8_t bytes[80];
- float values[20];
-} dnn_logits_kernel__3__cf__3 = {{
- 0xa6, 0xad, 0x95, 0x3e, 0x25, 0xcd, 0x04, 0xbd, 0x56, 0x3e, 0x48, 0x3d,
- 0x60, 0xd7, 0x5b, 0xbd, 0xa6, 0x97, 0x5a, 0x3e, 0x20, 0xa1, 0xc1, 0xbe,
- 0xeb, 0xad, 0xb4, 0x3d, 0x85, 0x6e, 0x1f, 0xbe, 0x43, 0xf3, 0x35, 0xbd,
- 0xfa, 0x8f, 0x73, 0xbd, 0x33, 0xa6, 0x7a, 0xbd, 0x09, 0x89, 0x6b, 0x3f,
- 0x6e, 0x80, 0x2a, 0x3e, 0xcc, 0x63, 0xa4, 0xbe, 0xc4, 0x7a, 0xed, 0xbd,
- 0xfe, 0xe8, 0x66, 0x3e, 0xfb, 0x67, 0xde, 0x3e, 0xa9, 0x9d, 0xc9, 0x3d,
- 0x02, 0x33, 0xdc, 0x3d, 0x31, 0xd8, 0x8f, 0xbd,
+ uint8_t bytes[236];
+ float values[59];
+} dnn_logits_kernel__7__cf__7 = {{
+ 0xd8, 0x84, 0x02, 0xbd, 0x58, 0x41, 0x31, 0xbd, 0x32, 0x3a, 0x83, 0x3d,
+ 0xce, 0xa0, 0x16, 0xbc, 0xe3, 0xc6, 0xa3, 0x3d, 0x2d, 0x19, 0x03, 0x3d,
+ 0x10, 0x9f, 0x8d, 0xbd, 0xac, 0x19, 0x93, 0x3d, 0xdf, 0xbe, 0x87, 0xbd,
+ 0xab, 0x00, 0x83, 0x3d, 0xe6, 0x8b, 0x76, 0xbd, 0x37, 0xf7, 0xa5, 0xbd,
+ 0x8e, 0x55, 0xb9, 0x3d, 0x48, 0xc0, 0xe2, 0xbb, 0x2c, 0x10, 0x6c, 0x3d,
+ 0x9f, 0x14, 0x19, 0xbb, 0x29, 0x15, 0xa6, 0xbd, 0x46, 0xb5, 0xb7, 0xbd,
+ 0x5c, 0xf3, 0xf9, 0x3c, 0x12, 0xde, 0x23, 0x3e, 0x65, 0x28, 0x83, 0xbd,
+ 0x0e, 0xbb, 0x2e, 0x3d, 0x51, 0x53, 0x11, 0x3d, 0xf9, 0xf7, 0xd8, 0xbd,
+ 0x6b, 0x71, 0xec, 0x3d, 0xa0, 0xce, 0xa5, 0xbd, 0xa2, 0xd8, 0xcd, 0xbd,
+ 0x6d, 0xda, 0x78, 0x3d, 0xfb, 0x74, 0x85, 0x3e, 0x36, 0x7b, 0x9e, 0x3b,
+ 0x05, 0xc9, 0x6b, 0xbd, 0x52, 0x47, 0xda, 0x3d, 0x89, 0x6d, 0x36, 0xbc,
+ 0x1f, 0x34, 0x03, 0xbd, 0x43, 0x68, 0xa6, 0x3d, 0xfa, 0xfd, 0x58, 0x3d,
+ 0x92, 0x07, 0x53, 0xbb, 0xca, 0xbd, 0x2f, 0xbd, 0xb1, 0x63, 0xd7, 0x3d,
+ 0x8b, 0x63, 0xf4, 0x3d, 0xf2, 0x5c, 0xd3, 0x3d, 0xb4, 0xb3, 0x00, 0x3e,
+ 0x3c, 0xb2, 0x45, 0xbd, 0x15, 0xbb, 0x9e, 0x3d, 0x2e, 0xab, 0xc8, 0xbd,
+ 0x9a, 0xad, 0x99, 0xbc, 0xac, 0xf6, 0x54, 0xbd, 0x7f, 0xf9, 0xa0, 0x3d,
+ 0x54, 0xa4, 0xc1, 0x3d, 0xb8, 0x08, 0xb9, 0xbd, 0x0d, 0x84, 0xd1, 0xbc,
+ 0x8a, 0x8d, 0x3b, 0x3d, 0xe0, 0x7d, 0xd3, 0xbc, 0xf7, 0xea, 0xfa, 0x3c,
+ 0xb2, 0x30, 0x89, 0xbd, 0xbc, 0x6e, 0x8e, 0xbd, 0x80, 0x70, 0x74, 0x3d,
+ 0xaf, 0x25, 0x86, 0x3d, 0x99, 0x50, 0x8b, 0x3d,
}};
} // anonymous namespace
@@ -3876,18 +15344,18 @@ const union {
// -----------------------------------------------------------------------------
int32_t input_from_feature_columns_input_layer_concat_concat0Shape[2] = {1,
- 323};
+ 173};
int32_t logits_MatMul_merged_with_dnn_logits_BiasAdd0Shape[2] = {1, 1};
void Inference(
- const float* __restrict input_from_feature_columns_input_layer_concat_concat0 /* shape: 1,323 */
+ const float* __restrict input_from_feature_columns_input_layer_concat_concat0 /* shape: 1,173 */
,
float* __restrict logits_MatMul_merged_with_dnn_logits_BiasAdd0 /* shape:
1,1 */
,
FixedAllocations* __restrict fixed) {
const int32_t input_from_feature_columns_input_layer_concat_concat0_shape[] =
- {1, 323};
+ {1, 173};
#if OP_LIB_BENCHMARK
Singleton<PerOpTimings>::get()->Reset();
@@ -3903,17 +15371,45 @@ void Inference(
dnn_hiddenlayer_0_bias__0__cf__0.values, fixed->alloc0);
fixed->shape0[0] = 1;
- fixed->shape0[1] = 20;
+ fixed->shape0[1] = 117;
// dnn/hiddenlayer_0/Relu
Relu<float>(2, // rank
fixed->shape0, fixed->alloc0, fixed->alloc0);
+ // dnn/hiddenlayer_1/MatMul_merged_with_dnn/hiddenlayer_1/BiasAdd
+ FullyConnected<float>(fixed->shape0, fixed->alloc0,
+ dnn_hiddenlayer_1_kernel__3__cf__3_shape,
+ dnn_hiddenlayer_1_kernel__3__cf__3.values,
+ dnn_hiddenlayer_1_bias__2__cf__2_shape,
+ dnn_hiddenlayer_1_bias__2__cf__2.values, fixed->alloc1);
+
+ fixed->shape0[0] = 1;
+ fixed->shape0[1] = 115;
+
+ // dnn/hiddenlayer_1/Relu
+ Relu<float>(2, // rank
+ fixed->shape0, fixed->alloc1, fixed->alloc1);
+
+ // dnn/hiddenlayer_2/MatMul_merged_with_dnn/hiddenlayer_2/BiasAdd
+ FullyConnected<float>(fixed->shape0, fixed->alloc1,
+ dnn_hiddenlayer_2_kernel__5__cf__5_shape,
+ dnn_hiddenlayer_2_kernel__5__cf__5.values,
+ dnn_hiddenlayer_2_bias__4__cf__4_shape,
+ dnn_hiddenlayer_2_bias__4__cf__4.values, fixed->alloc0);
+
+ fixed->shape0[0] = 1;
+ fixed->shape0[1] = 59;
+
+ // dnn/hiddenlayer_2/Relu
+ Relu<float>(2, // rank
+ fixed->shape0, fixed->alloc0, fixed->alloc0);
+
// dnn/logits/MatMul_merged_with_dnn/logits/BiasAdd
FullyConnected<float>(
- fixed->shape0, fixed->alloc0, dnn_logits_kernel__3__cf__3_shape,
- dnn_logits_kernel__3__cf__3.values, dnn_logits_bias__2__cf__2_shape,
- dnn_logits_bias__2__cf__2.values,
+ fixed->shape0, fixed->alloc0, dnn_logits_kernel__7__cf__7_shape,
+ dnn_logits_kernel__7__cf__7.values, dnn_logits_bias__6__cf__6_shape,
+ dnn_logits_bias__6__cf__6.values,
logits_MatMul_merged_with_dnn_logits_BiasAdd0);
#if OP_LIB_BENCHMARK
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.h b/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.h
index 601d4af9e7e..102274e96dc 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.h
+++ b/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.h
@@ -1,4 +1,4 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Code generated by tf.native.
@@ -8,7 +8,8 @@
namespace ui::internal_onedevice::alpha_model {
struct alignas(16) FixedAllocations {
- float alloc0[20];
+ float alloc0[117];
+ float alloc1[115];
int32_t shape0[2];
};
@@ -20,7 +21,7 @@ extern int32_t logits_MatMul_merged_with_dnn_logits_BiasAdd0Shape[2];
#define CHROME_KNOWLEDGE_INPUT_FROM_FEATURE_COLUMNS_INPUT_LAYER_CONCAT_CONCAT0_DIM0_SIZE \
1
#define CHROME_KNOWLEDGE_INPUT_FROM_FEATURE_COLUMNS_INPUT_LAYER_CONCAT_CONCAT0_DIM1_SIZE \
- 323
+ 173
#define CHROME_KNOWLEDGE_LOGITS_MATMUL_MERGED_WITH_DNN_LOGITS_BIASADD0_RANK 2
#define CHROME_KNOWLEDGE_LOGITS_MATMUL_MERGED_WITH_DNN_LOGITS_BIASADD0_DIM0_SIZE \
1
@@ -28,7 +29,7 @@ extern int32_t logits_MatMul_merged_with_dnn_logits_BiasAdd0Shape[2];
1
void Inference(
- const float* __restrict input_from_feature_columns_input_layer_concat_concat0 /* shape: 1,323 */
+ const float* __restrict input_from_feature_columns_input_layer_concat_concat0 /* shape: 1,173 */
,
float* __restrict logits_MatMul_merged_with_dnn_logits_BiasAdd0 /* shape:
1,1 */
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.cc b/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.cc
deleted file mode 100644
index c4318783699..00000000000
--- a/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.cc
+++ /dev/null
@@ -1,15422 +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 "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.h"
-#include <algorithm>
-#include <cassert>
-#include <cmath>
-#include <cstdint>
-#include <cstring>
-#include <limits>
-#include <tuple>
-
-#ifndef USE_EIGEN
-#define USE_EIGEN 0
-#endif
-
-namespace ui::internal_onedevice::alpha_model_v2 {
-namespace {
-
-// -----------------------------------------------------------------------------
-// OP LIBRARY
-// Copied here to make sure that the inference code always stays in sync with
-// the lib that it was generated for.
-// -----------------------------------------------------------------------------
-
-// Default to using std::copy and std::fill over memcpy and memset as they
-// are usually faster, thanks to the compiler getting stricter alignment
-// guarantees.
-#ifndef USE_TYPED_MEMSETMEMCPY
-#define USE_TYPED_MEMSETMEMCPY 1
-#endif
-#ifndef USE_EIGEN
-#error Please define USE_EIGEN to either 0 or 1
-#endif
-
-// Helper to reinterpret memory as Eigen matrices.
-#if USE_EIGEN
-template <typename Scalar>
-using ConstMatrixMap = typename Eigen::Map<
- const Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>>;
-template <typename Scalar>
-using ConstRowVectorMap =
- typename Eigen::Map<const Eigen::Matrix<Scalar, Eigen::Dynamic, 1>>;
-template <typename Scalar>
-using RowVectorMap =
- typename Eigen::Map<Eigen::Matrix<Scalar, Eigen::Dynamic, 1>>;
-template <typename Scalar>
-using MatrixMap =
- typename Eigen::Map<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>>;
-template <typename Scalar, typename StorageIndex>
-using SparseMatrix = Eigen::SparseMatrix<Scalar, Eigen::RowMajor, StorageIndex>;
-#endif
-
-#if OP_LIB_BENCHMARK
-class PerOpTimings {
- public:
- void Add(const std::string& op, absl::Duration time) {
- time_per_op_[op] += time;
- }
-
- void Reset() { time_per_op_.clear(); }
-
- void WriteTimingsToInfoLog() {
- std::string message = "Per op totals:\n";
- absl::Duration total;
- for (auto& entry : time_per_op_) {
- total += entry.second;
- absl::StrAppend(
- &message, entry.first, ": ",
- absl::LegacyPrecision(absl::ToDoubleMilliseconds(entry.second)),
- " ms\n");
- }
- absl::StrAppend(&message, "Total: ",
- absl::LegacyPrecision(absl::ToDoubleMilliseconds(total)),
- " ms\n");
- VLOG(1) << message;
- }
-
- private:
- std::map<std::string, absl::Duration> time_per_op_;
-};
-
-// Timer for individual operations. For each operation, add a statement like
-// BENCHMARK_TIMER_V2(name_part1, name_part2, ...);
-// to the beginning of the code. All name parts will be concatenated together
-// and a line will be logged after executing the operation showing the name and
-// the elapsed time.
-class BenchmarkTimer {
- public:
- explicit BenchmarkTimer(std::string name)
- : name_(std::move(name)), start_(absl::Now()) {}
-
- ~BenchmarkTimer() {
- const absl::Duration elapsed = absl::Now() - start_;
- Singleton<PerOpTimings>::get()->Add(name_, elapsed);
- VLOG(1) << "Time for " << name_ << ": "
- << absl::ToDoubleMilliseconds(elapsed) << " ms";
- }
-
- private:
- const std::string name_;
- const absl::Time start_;
-};
-
-#define BENCHMARK_TIMER_V2(...) BenchmarkTimer timer(absl::StrCat(__VA_ARGS__));
-
-#else // OP_LIB_BENCHMARK
-#define BENCHMARK_TIMER_V2(...)
-#endif // OP_LIB_BENCHMARK
-
-// The size of a shape in terms of number of coefficients.
-inline int32_t ShapeSize(const int32_t rank, const int32_t* shape) {
- int32_t size = 1;
- for (int32_t i = 0; i < rank; ++i)
- size *= shape[i];
- return size;
-}
-
-// For convolutional operations, calculates the output size with VALID padding.
-// Returns (height, width).
-inline std::tuple<int, int> GetConvOutputSizeVALID(const int32_t* input_shape,
- const int32_t* kernel_shape,
- int32_t stride_y,
- int32_t stride_x) {
- return std::make_tuple(
- (input_shape[1] + stride_y - kernel_shape[0]) / stride_y,
- (input_shape[2] + stride_x - kernel_shape[1]) / stride_x);
-}
-
-// For convolutional operations, calculates the output size with SAME padding.
-// Returns (height, width).
-inline std::tuple<int, int> GetConvOutputSizeSAME(const int32_t* input_shape,
- int32_t stride_y,
- int32_t stride_x) {
- return std::make_tuple((input_shape[1] + stride_y - 1) / stride_y,
- (input_shape[2] + stride_x - 1) / stride_x);
-}
-
-// Helper to compute the size of the inner loop for an op that uses indices to
-// specify which axes are reduced.
-template <typename Tidx>
-int32_t GetReduceInnerSize(int32_t input_tensor_rank,
- const int32_t* __restrict input_shape,
- int32_t index_tensor_rank,
- const int32_t* __restrict index_shape,
- const Tidx* __restrict index_values) {
- assert(index_tensor_rank <= 1);
- const int32_t num_indices = index_tensor_rank > 0 ? index_shape[0] : 1;
- int32_t inner_size = 1;
- for (int32_t i = 0; i < num_indices; ++i) {
- Tidx index_value = index_values[i];
- if (index_value < 0) {
- index_value = input_tensor_rank + index_value;
- }
- inner_size *= input_shape[index_value];
- }
- return inner_size;
-}
-
-template <typename T>
-void ConcatV2Args2(int32_t arg0_rank,
- const int32_t* __restrict arg0_shape,
- const T* __restrict arg0_values,
- int32_t arg1_rank,
- const int32_t* __restrict arg1_shape,
- const T* __restrict arg1_values,
- const int32_t* __restrict axis_value,
- T* __restrict output_values) {
- BENCHMARK_TIMER_V2("ConcatV2Args2");
- const int32_t axis = axis_value[0];
- const int32_t num_lines = ShapeSize(axis, arg0_shape);
- const int32_t arg0_line_size = ShapeSize(arg0_rank - axis, arg0_shape + axis);
- const int32_t arg1_line_size = ShapeSize(arg1_rank - axis, arg1_shape + axis);
- for (int32_t line = 0; line < num_lines; ++line) {
- std::copy(arg0_values, arg0_values + arg0_line_size, output_values);
- arg0_values += arg0_line_size;
- output_values += arg0_line_size;
- std::copy(arg1_values, arg1_values + arg1_line_size, output_values);
- arg1_values += arg1_line_size;
- output_values += arg1_line_size;
- }
-}
-
-template <typename T>
-void MatMul(const int32_t* __restrict input_shape,
- const T* __restrict input_values,
- const int32_t* __restrict weight_shape,
- const T* __restrict weight_values,
- T* __restrict output_values) {
- BENCHMARK_TIMER_V2("MatMul");
-#if USE_EIGEN
- const auto in =
- ConstMatrixMap<T>(input_values, input_shape[1], input_shape[0]);
- const auto weight =
- ConstMatrixMap<T>(weight_values, weight_shape[1], weight_shape[0]);
- auto result = MatrixMap<T>(output_values, weight_shape[1], input_shape[0]);
- result.noalias() = weight * in;
-#else
- const int32_t batch_size = input_shape[0];
- const int32_t num_inputs = weight_shape[0];
- const int32_t num_outputs = weight_shape[1];
- assert(input_shape[1] == num_inputs);
- for (int32_t batch = 0; batch < batch_size; ++batch) {
- for (int32_t out_i = 0; out_i < num_outputs; ++out_i) {
- T value = 0;
- for (int32_t in_i = 0; in_i < num_inputs; ++in_i) {
- value += input_values[batch * num_inputs + in_i] *
- weight_values[in_i * num_outputs + out_i];
- }
- *output_values++ = value;
- }
- }
-#endif
-}
-
-template <typename T>
-void DepthwiseConv2dNative(const int32_t* __restrict input_shape,
- const T* __restrict input_values,
- const int32_t* __restrict kernel_shape,
- const T* __restrict kernel_values,
- int32_t stride_y,
- int32_t stride_x,
- int32_t out_height,
- int32_t out_width,
- T* __restrict output_values) {
- BENCHMARK_TIMER_V2("DepthwiseConv2dNative");
- // Give the shape values nicer names.
- assert(input_shape[3] == kernel_shape[2]);
- const int32_t batch_size = input_shape[0];
- const int32_t kernel_height = kernel_shape[0];
- const int32_t kernel_width = kernel_shape[1];
- const int32_t in_depth = kernel_shape[2];
- const int32_t depth_mul = kernel_shape[3];
- const int32_t in_height = input_shape[1];
- const int32_t in_width = input_shape[2];
-
- // Compute the amount of padding needed to get the desired output size.
- const int32_t pad_height =
- ((out_height - 1) * stride_y + kernel_height - in_height) / 2;
- const int32_t pad_width =
- ((out_width - 1) * stride_x + kernel_width - in_width) / 2;
-
- // Cache the strides for address computations.
- const int32_t in_strides[4] = {
- input_shape[1] * input_shape[2] * input_shape[3], // batch
- input_shape[2] * input_shape[3], // y
- input_shape[3], // x
- 1, // channel
- };
- const int32_t kernel_strides[4] = {
- kernel_shape[1] * kernel_shape[2] * kernel_shape[3], // y
- kernel_shape[2] * kernel_shape[3], // x
- kernel_shape[3], // in channels
- 1, // channel mult
- };
-
- T* out_write_ptr = output_values;
- for (int32_t batch = 0; batch < batch_size; ++batch) {
- for (int32_t out_y = 0; out_y < out_height; ++out_y) {
- for (int32_t out_x = 0; out_x < out_width; ++out_x) {
- // Compute the input read offsets.
- const int32_t in_y_origin = (out_y * stride_y) - pad_height;
- const int32_t in_x_origin = (out_x * stride_x) - pad_width;
-
- // Compute the range of the kernel to be applied (we may need to clip
- // when we'd read outside of the valid input region - for SAME).
- const int32_t kernel_y_start =
- std::max(static_cast<int32_t>(0), -in_y_origin);
- const int32_t kernel_y_end =
- std::min(kernel_height, in_height - in_y_origin);
- const int32_t kernel_x_start =
- std::max(static_cast<int32_t>(0), -in_x_origin);
- const int32_t kernel_x_end =
- std::min(kernel_width, in_width - in_x_origin);
-
- for (int32_t in_c = 0; in_c < in_depth; ++in_c) {
- for (int32_t mul_c = 0; mul_c < depth_mul; ++mul_c, ++out_write_ptr) {
- // Convolve.
- T sum = 0;
- for (int32_t k_y = kernel_y_start; k_y < kernel_y_end; ++k_y) {
- const int32_t in_y = in_y_origin + k_y;
- assert(in_y >= 0 && in_y < in_height);
- for (int32_t k_x = kernel_x_start; k_x < kernel_x_end; ++k_x) {
- const int32_t in_x = in_x_origin + k_x;
- assert(in_x >= 0 && in_x < in_width);
- const T input_value =
- input_values[batch * in_strides[0] + // batch
- in_y * in_strides[1] + // y
- in_x * in_strides[2] + // x
- in_c]; // in chan
- const T kernel_value =
- kernel_values[k_y * kernel_strides[0] + // y
- k_x * kernel_strides[1] + // x
- in_c * kernel_strides[2] + // in chan
- mul_c]; // chan mult
- sum += input_value * kernel_value;
- }
- }
- *out_write_ptr = sum;
- } // mul_c
- } // in_c
- } // out_x
- } // out_y
- } // batch
-}
-
-template <typename T>
-void DepthwiseConv2dNativeVALID(const int32_t* __restrict input_shape,
- const T* __restrict input_values,
- const int32_t* __restrict kernel_shape,
- const T* __restrict kernel_values,
- int32_t stride_y,
- int32_t stride_x,
- T* __restrict output_values) {
- const auto out_size =
- GetConvOutputSizeVALID(input_shape, kernel_shape, stride_y, stride_x);
- DepthwiseConv2dNative<T>(
- input_shape, input_values, kernel_shape, kernel_values, stride_y,
- stride_x, std::get<0>(out_size), std::get<1>(out_size), output_values);
-}
-
-template <typename T>
-void DepthwiseConv2dNativeSAME(const int32_t* __restrict input_shape,
- const T* __restrict input_values,
- const int32_t* __restrict kernel_shape,
- const T* __restrict kernel_values,
- int32_t stride_y,
- int32_t stride_x,
- T* __restrict output_values) {
- const auto out_size = GetConvOutputSizeSAME(input_shape, stride_y, stride_x);
- DepthwiseConv2dNative<T>(
- input_shape, input_values, kernel_shape, kernel_values, stride_y,
- stride_x, std::get<0>(out_size), std::get<1>(out_size), output_values);
-}
-
-template <typename T>
-void FullyConnected(const int32_t* __restrict input_shape,
- const T* __restrict input_values,
- const int32_t* __restrict weight_shape,
- const T* __restrict weight_values,
- const int32_t* __restrict bias_shape,
- const T* __restrict bias_values,
- T* __restrict output_values) {
- BENCHMARK_TIMER_V2("FullyConnected");
-#if USE_EIGEN
- const auto in =
- ConstMatrixMap<T>(input_values, input_shape[1], input_shape[0]);
- const auto weight =
- ConstMatrixMap<T>(weight_values, weight_shape[1], weight_shape[0]);
- const auto bias = ConstRowVectorMap<T>(bias_values, bias_shape[0]);
- auto result = MatrixMap<T>(output_values, weight_shape[1], input_shape[0]);
- result.noalias() = (weight * in).colwise() + bias;
-#else
- const int32_t batch_size = input_shape[0];
- const int32_t num_inputs = weight_shape[0];
- const int32_t num_outputs = weight_shape[1];
- assert(input_shape[1] == num_inputs);
- assert(bias_shape[0] == num_outputs);
- for (int32_t batch = 0; batch < batch_size; ++batch) {
- for (int32_t out_i = 0; out_i < num_outputs; ++out_i) {
- T value = bias_values[out_i];
- for (int32_t in_i = 0; in_i < num_inputs; ++in_i) {
- value += input_values[batch * num_inputs + in_i] *
- weight_values[in_i * num_outputs + out_i];
- }
- output_values[batch * num_outputs + out_i] = value;
- }
- }
-#endif
-}
-
-template <typename T, typename TBlocks, typename TPaddings>
-void SpaceToBatchNDRank4(const int32_t* __restrict input_shape,
- const T* __restrict input_values,
- const TBlocks* __restrict block_shape_values,
- const TPaddings* __restrict padding_values,
- T* __restrict output_values) {
- BENCHMARK_TIMER_V2("SpaceToBatchNDRank4");
- const int32_t input_batch_size = input_shape[0];
- const int32_t input_height = input_shape[1];
- const int32_t input_width = input_shape[2];
- const int32_t input_depth = input_shape[3];
-
- const TBlocks block_shape_height = block_shape_values[0];
- const TBlocks block_shape_width = block_shape_values[1];
- const TPaddings padding_top = padding_values[0];
- const TPaddings padding_bottom = padding_values[1];
- const TPaddings padding_left = padding_values[2];
- const TPaddings padding_right = padding_values[3];
-
- const int32_t block_size = block_shape_height * block_shape_width;
- const int32_t output_depth = input_depth;
- const int32_t output_batch_size = input_batch_size * block_size;
- const int32_t output_height =
- (padding_top + padding_bottom + input_height) / block_shape_height;
- const int32_t output_width =
- (padding_left + padding_right + input_width) / block_shape_width;
-
- const T pad_value = 0;
-
- for (int32_t out_b = 0; out_b < output_batch_size; ++out_b) {
- const int32_t input_batch = out_b % input_batch_size;
- const int32_t shift_w = (out_b / input_batch_size) % block_shape_width;
- const int32_t shift_h = (out_b / input_batch_size) / block_shape_width;
- for (int32_t out_h = 0; out_h < output_height; ++out_h) {
- for (int32_t out_w = 0; out_w < output_width; ++out_w) {
- T* out = output_values +
- (((out_b * output_height + out_h) * output_width + out_w) *
- output_depth +
- 0);
- // Check if padding cell are being handled.
- if (out_h * block_shape_height + shift_h < padding_top ||
- out_h * block_shape_height + shift_h >=
- padding_top + input_height ||
- out_w * block_shape_width + shift_w < padding_left ||
- out_w * block_shape_width + shift_w >= padding_left + input_width) {
-// This may not execute correctly when pad_value != 0 and T != uint8.
-#if USE_TYPED_MEMSETMEMCPY
- std::fill(out, out + input_depth, pad_value);
-#else
- std::memset(out, pad_value, input_depth * sizeof(T));
-#endif
- } else {
- const int32_t i0 = input_batch;
- const int32_t i1 =
- (out_h * block_shape_height + shift_h) - padding_top;
- const int32_t i2 =
- (out_w * block_shape_width + shift_w) - padding_left;
- const T* in =
- input_values +
- (((i0 * input_height + i1) * input_width + i2) * input_depth + 0);
-#if USE_TYPED_MEMSETMEMCPY
- std::copy(in, in + input_depth, out);
-#else
- std::memcpy(out, in, input_depth * sizeof(T));
-#endif
- }
- }
- }
- }
-}
-
-template <typename T, typename TBlocks, typename TCrops>
-void BatchToSpaceNDRank4(const int32_t* __restrict input_shape,
- const T* __restrict input_values,
- const TBlocks* __restrict block_shape_values,
- const TCrops* __restrict crops_values,
- T* __restrict output_values) {
- BENCHMARK_TIMER_V2("BatchToSpaceNDRank4");
- const int32_t input_batch_size = input_shape[0];
- const int32_t input_height = input_shape[1];
- const int32_t input_width = input_shape[2];
- const int32_t input_depth = input_shape[3];
- const TBlocks block_shape_height = block_shape_values[0];
- const TBlocks block_shape_width = block_shape_values[1];
- const TCrops crops_top = crops_values[0];
- const TCrops crops_bottom = crops_values[1];
- const TCrops crops_left = crops_values[2];
- const TCrops crops_right = crops_values[3];
-
- const int32_t output_depth = input_depth;
- const int32_t output_batch_size =
- input_batch_size / (block_shape_width * block_shape_height);
- const int32_t output_height =
- input_height * block_shape_height - crops_top - crops_bottom;
- const int32_t output_width =
- input_width * block_shape_width - crops_left - crops_right;
-
- for (int32_t in_batch = 0; in_batch < input_batch_size; ++in_batch) {
- const int32_t out_batch = in_batch % output_batch_size;
- const int32_t spatial_offset = in_batch / output_batch_size;
- for (int32_t in_h = 0; in_h < input_height; ++in_h) {
- const int32_t out_h = in_h * block_shape_height +
- spatial_offset / block_shape_width - crops_top;
- if (out_h < 0 || out_h >= output_height) {
- continue;
- }
- for (int32_t in_w = 0; in_w < input_width; ++in_w) {
- const int32_t out_w = in_w * block_shape_width +
- spatial_offset % block_shape_width - crops_left;
-
- if (out_w < 0 || out_w >= output_width) {
- continue;
- }
- T* out = output_values +
- (((out_batch * output_height + out_h) * output_width + out_w) *
- output_depth +
- 0);
- const T* in = input_values +
- (((in_batch * input_height + in_h) * input_width + in_w) *
- input_depth +
- 0);
-#if USE_TYPED_MEMSETMEMCPY
- std::copy(in, in + input_depth, out);
-#else
- std::memcpy(out, in, input_depth * sizeof(T));
-#endif
- }
- }
- }
-}
-
-#if USE_EIGEN
-template <typename T, typename Tidx>
-void SparseDenseMatMulCSR(const int32_t* __restrict input_shape,
- const T* __restrict input_values,
- const int32_t num_rows,
- const int32_t* __restrict nnz_shape,
- const T* __restrict nnz_values,
- const Tidx* __restrict outer_index,
- const Tidx* __restrict cols,
- T* __restrict output_values) {
- BENCHMARK_TIMER_V2("SparseDenseMatMulCSR");
- const int32_t num_cols = input_shape[1];
- const auto in =
- ConstMatrixMap<T>(input_values, input_shape[1], input_shape[0]);
- const Eigen::Map<const SparseMatrix<T, Tidx>> weight(
- num_rows, num_cols, nnz_shape[0], outer_index, cols, nnz_values);
- auto result = MatrixMap<T>(output_values, num_rows, input_shape[0]);
- result.noalias() = weight * in;
-}
-
-template <typename T, typename Tidx>
-void SparseFullyConnectedCSR(const int32_t* __restrict input_shape,
- const T* __restrict input_values,
- const int32_t num_rows,
- const int32_t* __restrict nnz_shape,
- const T* __restrict nnz_values,
- const Tidx* __restrict outer_index,
- const Tidx* __restrict cols,
- const int32_t* __restrict bias_shape,
- const T* __restrict bias_values,
- T* __restrict output_values) {
- BENCHMARK_TIMER_V2("SparseFullyConnectedCSR");
- const int32_t num_cols = input_shape[1];
- const auto in =
- ConstMatrixMap<T>(input_values, input_shape[1], input_shape[0]);
- const auto bias = ConstRowVectorMap<T>(bias_values, bias_shape[0]);
- const Eigen::Map<const SparseMatrix<T, Tidx>> weight(
- num_rows, num_cols, nnz_shape[0], outer_index, cols, nnz_values);
- auto result = MatrixMap<T>(output_values, num_rows, input_shape[0]);
- result.noalias() = (weight * in).colwise() + bias;
-}
-#endif
-
-template <typename T, typename TIndex>
-void Gather(int32_t params_rank,
- const int32_t* __restrict params_shape,
- const T* __restrict params_values,
- int32_t indices_rank,
- const int32_t* __restrict indices_shape,
- const TIndex* __restrict indices_values,
- T* __restrict output_values) {
- BENCHMARK_TIMER_V2("Gather");
- const int32_t num_indices = ShapeSize(indices_rank, indices_shape);
- const int32_t num_params = params_shape[0];
- const int32_t slice_size = ShapeSize(params_rank - 1, params_shape + 1);
- for (int32_t i = 0; i < num_indices; ++i) {
- const int32_t index = indices_values[i];
- if (index < 0 || index >= num_params) {
- std::fill(output_values, output_values + slice_size, 0);
- } else {
- std::copy(params_values + index * slice_size,
- params_values + index * slice_size + slice_size, output_values);
- }
- output_values += slice_size;
- }
-}
-
-template <typename T>
-void Im2Row(const int32_t* __restrict input_shape,
- const T* __restrict input_values,
- const int32_t* __restrict kernel_shape,
- int32_t stride_y,
- int32_t stride_x,
- int32_t out_height,
- int32_t out_width,
- T* __restrict output_values) {
- BENCHMARK_TIMER_V2("Im2Row");
- // Give the shape values nicer names.
- assert(input_shape[3] == kernel_shape[2]);
- const int32_t batch_size = input_shape[0];
- const int32_t kernel_height = kernel_shape[0];
- const int32_t kernel_width = kernel_shape[1];
- const int32_t in_depth = kernel_shape[2];
- const int32_t in_height = input_shape[1];
- const int32_t in_width = input_shape[2];
-
- // Compute the amount of padding needed to get the desired output size.
- const int32_t pad_height =
- ((out_height - 1) * stride_y + kernel_height - in_height) / 2;
- const int32_t pad_width =
- ((out_width - 1) * stride_x + kernel_width - in_width) / 2;
-
- // Cache the strides for address computations.
- const int32_t x_stride = input_shape[3];
- const int32_t y_stride = input_shape[2] * x_stride;
- const int32_t batch_stride = input_shape[1] * y_stride;
-
- for (int32_t batch = 0; batch < batch_size; ++batch) {
- for (int32_t out_y = 0; out_y < out_height; ++out_y) {
- for (int32_t out_x = 0; out_x < out_width; ++out_x) {
- // Compute the input read offsets.
- const int32_t in_y_origin = (out_y * stride_y) - pad_height;
- const int32_t in_x_origin = (out_x * stride_x) - pad_width;
-
- // Compute the range of the kernel to be applied (we may need to clip
- // when we'd read outside of the valid input region - for SAME).
- const int32_t kernel_y_start =
- std::max(static_cast<int32_t>(0), -in_y_origin);
- const int32_t kernel_y_end =
- std::min(kernel_height, in_height - in_y_origin);
- const int32_t kernel_x_start =
- std::max(static_cast<int32_t>(0), -in_x_origin);
- const int32_t kernel_x_end =
- std::min(kernel_width, in_width - in_x_origin);
-
- // Padding top.
- if (kernel_y_start != 0) {
- const int32_t num_lines = kernel_y_start;
- const int32_t num_coeffs = num_lines * kernel_width * in_depth;
-#if USE_TYPED_MEMSETMEMCPY
- std::fill(output_values, output_values + num_coeffs, 0);
-#else
- std::memset(output_values, 0, num_coeffs * sizeof(T));
-#endif
- output_values += num_coeffs;
- }
- for (int32_t k_y = kernel_y_start; k_y < kernel_y_end; ++k_y) {
- // Padding left.
- if (kernel_x_start != 0) {
- const int32_t num_coeffs = kernel_x_start * in_depth;
-#if USE_TYPED_MEMSETMEMCPY
- std::fill(output_values, output_values + num_coeffs, 0);
-#else
- std::memset(output_values, 0, num_coeffs * sizeof(T));
-#endif
- output_values += num_coeffs;
- }
- // Valid values.
- {
- const int32_t in_y = in_y_origin + k_y;
- const int32_t in_x = in_x_origin + kernel_x_start;
- const int32_t num_coeffs =
- (kernel_x_end - kernel_x_start) * in_depth;
-#if USE_TYPED_MEMSETMEMCPY
- const int32_t offset =
- batch * batch_stride + in_y * y_stride + in_x * x_stride;
- std::copy(input_values + offset, input_values + offset + num_coeffs,
- output_values);
-#else
- std::memcpy(output_values,
- input_values // Reusing the restricted pointer.
- + batch * batch_stride // batch
- + in_y * y_stride // y
- + in_x * x_stride, // x
- num_coeffs * sizeof(T));
-#endif
- output_values += num_coeffs;
- }
- // Padding right.
- if (kernel_x_end != kernel_width) {
- const int32_t num_coeffs = (kernel_width - kernel_x_end) * in_depth;
-#if USE_TYPED_MEMSETMEMCPY
- std::fill(output_values, output_values + num_coeffs, 0);
-#else
- std::memset(output_values, 0, num_coeffs * sizeof(T));
-#endif
- output_values += num_coeffs;
- }
- }
- // Padding bottom.
- if (kernel_y_end != kernel_height) {
- const int32_t num_lines = kernel_height - kernel_y_end;
- const int32_t num_coeffs = num_lines * kernel_width * in_depth;
-#if USE_TYPED_MEMSETMEMCPY
- std::fill(output_values, output_values + num_coeffs, 0);
-#else
- std::memset(output_values, 0, num_coeffs * sizeof(T));
-#endif
- output_values += num_coeffs;
- }
- }
- }
- }
-}
-
-template <typename T>
-void Im2RowVALID(const int32_t* __restrict input_shape,
- const T* __restrict input_values,
- const int32_t* __restrict kernel_shape,
- int32_t stride_y,
- int32_t stride_x,
- T* __restrict output_values) {
- const auto out_size =
- GetConvOutputSizeVALID(input_shape, kernel_shape, stride_y, stride_x);
- Im2Row<T>(input_shape, input_values, kernel_shape, stride_y, stride_x,
- std::get<0>(out_size), std::get<1>(out_size), output_values);
-}
-
-template <typename T>
-void Im2RowSAME(const int32_t* __restrict input_shape,
- const T* __restrict input_values,
- const int32_t* __restrict kernel_shape,
- int32_t stride_y,
- int32_t stride_x,
- T* __restrict output_values) {
- const auto out_size = GetConvOutputSizeSAME(input_shape, stride_y, stride_x);
- Im2Row<T>(input_shape, input_values, kernel_shape, stride_y, stride_x,
- std::get<0>(out_size), std::get<1>(out_size), output_values);
-}
-
-// We use macros instead of template functions with templated functors here
-// because it's a lot less verbose and easier for the compiler to optimize.
-#define POOL_OP_V2(OP_NAME, DEFAULT_VALUE, UPDATE_EXPR, RESULT_EXPR) \
- template <typename T> \
- void OP_NAME##Pool(const int32_t* __restrict input_shape, \
- const T* __restrict input_values, int32_t stride_y, \
- int32_t stride_x, int32_t kernel_height, \
- int32_t kernel_width, int32_t out_height, \
- int32_t out_width, T* __restrict output_values) { \
- BENCHMARK_TIMER_V2(#OP_NAME, "Pool"); \
- const int32_t batch_size = input_shape[0]; \
- const int32_t in_height = input_shape[1]; \
- const int32_t in_width = input_shape[2]; \
- const int32_t depth = input_shape[3]; \
- \
- const int32_t pad_height = \
- ((out_height - 1) * stride_y + kernel_height - in_height) / 2; \
- const int32_t pad_width = \
- ((out_width - 1) * stride_x + kernel_width - in_width) / 2; \
- \
- const int32_t in_strides[4] = { \
- input_shape[1] * input_shape[2] * input_shape[3], \
- input_shape[2] * input_shape[3], \
- input_shape[3], \
- 1, \
- }; \
- \
- T* out_write_ptr = output_values; \
- for (int32_t batch = 0; batch < batch_size; ++batch) { \
- for (int32_t out_y = 0; out_y < out_height; ++out_y) { \
- for (int32_t out_x = 0; out_x < out_width; ++out_x) { \
- const int32_t in_y_origin = (out_y * stride_y) - pad_height; \
- const int32_t in_x_origin = (out_x * stride_x) - pad_width; \
- const int32_t kernel_y_start = \
- std::max(static_cast<int32_t>(0), -in_y_origin); \
- const int32_t kernel_y_end = \
- std::min(kernel_height, in_height - in_y_origin); \
- const int32_t kernel_x_start = \
- std::max(static_cast<int32_t>(0), -in_x_origin); \
- const int32_t kernel_x_end = \
- std::min(kernel_width, in_width - in_x_origin); \
- const int32_t count = (kernel_y_end - kernel_y_start) * \
- (kernel_x_end - kernel_x_start); \
- (void)sizeof(count); \
- \
- for (int32_t chan = 0; chan < depth; ++chan, ++out_write_ptr) { \
- T value = DEFAULT_VALUE; \
- for (int32_t k_y = kernel_y_start; k_y < kernel_y_end; ++k_y) { \
- const int32_t in_y = in_y_origin + k_y; \
- assert(in_y >= 0 && in_y < in_height); \
- for (int32_t k_x = kernel_x_start; k_x < kernel_x_end; ++k_x) { \
- const int32_t in_x = in_x_origin + k_x; \
- assert(in_x >= 0 && in_x < in_width); \
- const T next = input_values[batch * in_strides[0] + \
- in_y * in_strides[1] + \
- in_x * in_strides[2] + chan]; \
- value = UPDATE_EXPR; \
- } \
- } \
- *out_write_ptr = RESULT_EXPR; \
- } \
- } \
- } \
- } \
- } \
- \
- template <typename T> \
- void OP_NAME##PoolVALID(const int32_t* __restrict input_shape, \
- const T* __restrict input_values, int32_t stride_y, \
- int32_t stride_x, int32_t kernel_height, \
- int32_t kernel_width, T* __restrict output_values) { \
- const int32_t kernel_shape[4] = {kernel_height, kernel_width, 1, 1}; \
- const auto out_size = \
- GetConvOutputSizeVALID(input_shape, kernel_shape, stride_y, stride_x); \
- OP_NAME##Pool<T>(input_shape, input_values, stride_y, stride_x, \
- kernel_height, kernel_width, std::get<0>(out_size), \
- std::get<1>(out_size), output_values); \
- } \
- \
- template <typename T> \
- void OP_NAME##PoolSAME(const int32_t* __restrict input_shape, \
- const T* __restrict input_values, int32_t stride_y, \
- int32_t stride_x, int32_t kernel_height, \
- int32_t kernel_width, T* __restrict output_values) { \
- const auto out_size = \
- GetConvOutputSizeSAME(input_shape, stride_y, stride_x); \
- OP_NAME##Pool<T>(input_shape, input_values, stride_y, stride_x, \
- kernel_height, kernel_width, std::get<0>(out_size), \
- std::get<1>(out_size), output_values); \
- }
-
-POOL_OP_V2(Max, std::numeric_limits<T>::lowest(), std::max(value, next), value)
-POOL_OP_V2(Avg, 0, value + next, value / count)
-
-template <typename T>
-void Memcpy(const int32_t rank,
- const int32_t* __restrict input_shape,
- const T* __restrict input_values,
- T* __restrict output_values) {
- BENCHMARK_TIMER_V2("Memcpy");
- const int32_t size = ShapeSize(rank, input_shape);
- for (int32_t i = 0; i < size; ++i) {
- output_values[i] = input_values[i];
- }
-}
-
-template <typename T>
-void Softmax(const int32_t rank,
- const int32_t* __restrict input_shape,
- const T* __restrict input_values,
- const int32_t reduce_dim,
- T* __restrict output_values,
- T* __restrict scratch_values) {
- BENCHMARK_TIMER_V2("Softmax");
- const int32_t size = ShapeSize(rank, input_shape);
- if (rank == 2 && reduce_dim == 1) {
- T logits_max = std::numeric_limits<T>::lowest();
-
- // Max.
- for (int32_t i = 0; i < size; ++i) {
- logits_max = std::max(logits_max, input_values[i]);
- }
-
- // Pre-compute exp.
- for (int32_t i = 0; i < size; ++i) {
- scratch_values[i] = std::exp(input_values[i] - logits_max);
- }
-
- // Sum over the last dimension, then divide the exps and write out.
- for (int32_t offset = 0; offset < size; offset += input_shape[1]) {
- const int32_t end_offset = offset + input_shape[1];
- T sum = 0;
- for (int32_t i = offset; i < end_offset; ++i) {
- sum += scratch_values[i];
- }
- const T rcp_denom = static_cast<T>(1) / sum;
- for (int32_t i = 0; i < input_shape[1]; ++i) {
- output_values[offset + i] = scratch_values[offset + i] * rcp_denom;
- }
- }
- } else {
- assert(false && "Generic Softmax not yet supported.");
- }
-}
-
-// Returns the start position for a slice in a single dimension.
-template <typename T>
-int32_t StridedSliceBegin(int32_t range_mask,
- const T* __restrict range_values,
- const T* __restrict strides,
- const int32_t* __restrict input_shape,
- int32_t dim) {
- const bool is_explicit = 0 == (range_mask & (1 << dim));
- if (is_explicit) {
- const T range_value = range_values[dim];
- return (range_value < 0 ? range_value + input_shape[dim] : range_value);
- } else {
- const bool is_reverse = strides[dim] < 0;
- return is_reverse ? input_shape[dim] - 1 : 0;
- }
-}
-
-// Returns the end position for a slice in a single dimension.
-template <typename T>
-int32_t StridedSliceEnd(int32_t range_mask,
- const T* __restrict range_values,
- const T* __restrict strides,
- const int32_t* __restrict input_shape,
- int32_t dim) {
- const bool is_explicit = 0 == (range_mask & (1 << dim));
- if (is_explicit) {
- const T range_value = range_values[dim];
- return (range_value < 0 ? range_value + input_shape[dim] : range_value);
- } else {
- const bool is_reverse = strides[dim] < 0;
- return is_reverse ? -1 : input_shape[dim];
- }
-}
-
-template <typename T, typename TIdx>
-void StridedSlice(const int32_t input_rank,
- const int32_t* __restrict input_shape,
- const T* __restrict input_values,
- const TIdx* __restrict begin,
- const TIdx* __restrict end,
- const TIdx* __restrict strides,
- int32_t begin_mask,
- int32_t end_mask,
- T* __restrict output_values) {
- BENCHMARK_TIMER_V2("StridedSlice");
- const int32_t MAX_RANK = 8;
- assert(input_rank < MAX_RANK);
-
- // Compute the address strides for each dimension.
- int32_t dim_addr_strides[MAX_RANK] = {0};
- dim_addr_strides[input_rank - 1] = 1;
- for (int32_t dim = input_rank - 2; dim >= 0; --dim) {
- dim_addr_strides[dim] = dim_addr_strides[dim + 1] * input_shape[dim + 1];
- }
-
- // Resolve the masks and get explicit ranges for each dimension.
- int32_t dim_begin[MAX_RANK];
- int32_t dim_end[MAX_RANK];
- bool dim_is_full_range[MAX_RANK];
- for (int32_t dim = 0; dim < input_rank; ++dim) {
- const int32_t stride = strides[dim];
- dim_begin[dim] =
- StridedSliceBegin(begin_mask, begin, strides, input_shape, dim);
- dim_end[dim] = StridedSliceEnd(end_mask, end, strides, input_shape, dim);
- dim_is_full_range[dim] =
- dim_begin[dim] == 0 && dim_end[dim] == input_shape[dim] && stride == 1;
- // Make sure that the dim_end is always bigger than dim_begin, this
- // simplifies the boundary checks below.
- if (stride > 0 && dim_begin[dim] > dim_end[dim]) {
- dim_end[dim] += input_shape[dim];
- }
-
- // Our termination criteria for loops is that we hit the end exactly, so
- // we need to ensure that we don't step over the end with stride != 1.
- const int32_t length_mod = (dim_end[dim] - dim_begin[dim]) % stride;
- if (length_mod != 0) {
- dim_end[dim] += stride - length_mod;
- }
- }
-
- // Find out how large the blocks are that we can copy contiguously. (All
- // dimensions on the right for which we fetch the full range)
- int32_t last_sliced_dim = input_rank - 1;
- int32_t block_size = 1;
- for (int32_t dim = input_rank - 1; dim >= 0 && dim_is_full_range[dim];
- --dim) {
- block_size *= input_shape[dim];
- last_sliced_dim--;
- }
-
- // Initialize the read pos for each dimension according to the begin offsets.
- int32_t read_pos[MAX_RANK] = {0};
- for (int32_t dim = 0; dim < input_rank; ++dim) {
- read_pos[dim] = dim_begin[dim];
- }
-
- while (read_pos[0] != dim_end[0]) {
- // Compute the read offset for the current position.
- int32_t read_offset = 0;
- for (int32_t dim = 0; dim <= last_sliced_dim; ++dim) {
- read_offset += (read_pos[dim] % input_shape[dim]) * dim_addr_strides[dim];
- }
-
-#if USE_TYPED_MEMSETMEMCPY
- std::copy(input_values + read_offset,
- input_values + read_offset + block_size, output_values);
-#else
- std::memcpy(output_values, input_values + read_offset,
- block_size * sizeof(T));
-#endif
- output_values += block_size;
-
- // Advance the read position.
- for (int32_t dim = last_sliced_dim; dim >= 0; --dim) {
- read_pos[dim] += strides[dim];
- if (dim == 0 || read_pos[dim] != dim_end[dim])
- break;
- read_pos[dim] = dim_begin[dim];
- }
- }
-}
-
-template <typename T>
-void TransposeRank3(const int32_t* __restrict input_shape,
- const T* __restrict input_values,
- const int32_t* __restrict perm,
- T* __restrict output_values) {
- BENCHMARK_TIMER_V2("TransposeRank3");
- const int32_t in_strides[3] = {
- input_shape[1] * input_shape[2],
- input_shape[2],
- 1,
- };
- const int32_t out_strides[3] = {in_strides[perm[0]], in_strides[perm[1]],
- in_strides[perm[2]]};
- const int32_t out_shape[3] = {input_shape[perm[0]], input_shape[perm[1]],
- input_shape[perm[2]]};
-
- int32_t write_offset = 0;
- for (int32_t it0 = 0; it0 < out_shape[0]; ++it0) {
- const int32_t read_offset0 = it0 * out_strides[0];
- for (int32_t it1 = 0; it1 < out_shape[1]; ++it1) {
- const int32_t read_offset01 = read_offset0 + it1 * out_strides[1];
- for (int32_t it2 = 0; it2 < out_shape[2]; ++it2, ++write_offset) {
- const int32_t read_offset = read_offset01 + it2 * out_strides[2];
- output_values[write_offset] = input_values[read_offset];
- }
- }
- }
-}
-
-template <typename T>
-void TransposeRank4(const int32_t* __restrict input_shape,
- const T* __restrict input_values,
- const int32_t* __restrict perm,
- T* __restrict output_values) {
- BENCHMARK_TIMER_V2("TransposeRank4");
- const int32_t in_strides[4] = {
- input_shape[1] * input_shape[2] * input_shape[3],
- input_shape[2] * input_shape[3],
- input_shape[3],
- 1,
- };
- const int32_t out_strides[4] = {in_strides[perm[0]], in_strides[perm[1]],
- in_strides[perm[2]], in_strides[perm[3]]};
- const int32_t out_shape[4] = {input_shape[perm[0]], input_shape[perm[1]],
- input_shape[perm[2]], input_shape[perm[3]]};
-
- int32_t write_offset = 0;
- for (int32_t it0 = 0; it0 < out_shape[0]; ++it0) {
- const int32_t read_offset0 = it0 * out_strides[0];
- for (int32_t it1 = 0; it1 < out_shape[1]; ++it1) {
- const int32_t read_offset01 = read_offset0 + it1 * out_strides[1];
- for (int32_t it2 = 0; it2 < out_shape[2]; ++it2) {
- const int32_t read_offset012 = read_offset01 + it2 * out_strides[2];
- for (int32_t it3 = 0; it3 < out_shape[3]; ++it3, ++write_offset) {
- const int32_t read_offset = read_offset012 + it3 * out_strides[3];
- output_values[write_offset] = input_values[read_offset];
- }
- }
- }
- }
-}
-
-template <typename T, typename TIdx, typename TDepth>
-void OneHot(const int32_t input_rank,
- const int32_t* __restrict input_shape,
- const TIdx* __restrict input_values,
- const TDepth* __restrict depth,
- const T* __restrict on_value,
- const T* __restrict off_value,
- const int32_t axis,
- T* __restrict output_values) {
- BENCHMARK_TIMER_V2("OneHot");
- const int32_t num_elements = ShapeSize(input_rank, input_shape);
- // We can assume axis >= 0 in this implementation.
- const int32_t prefix_dim_size = ShapeSize(axis, input_shape);
- const int32_t suffix_dim_size = num_elements / prefix_dim_size;
- int32_t write_offset = 0;
- for (int32_t i = 0; i < prefix_dim_size; ++i) {
- const int32_t read_offset_pre = i * suffix_dim_size;
- for (TDepth d = 0; d < *depth; ++d) {
- for (int32_t j = 0; j < suffix_dim_size; ++j, ++write_offset) {
- const int32_t read_offset = read_offset_pre + j;
- output_values[write_offset] =
- (input_values[read_offset] == d) ? *on_value : *off_value;
- }
- }
- }
-}
-
-template <typename T, typename TIdx, typename TDepth>
-void OneHotLastDim(const int32_t input_rank,
- const int32_t* __restrict input_shape,
- const TIdx* __restrict input_values,
- const TDepth* __restrict depth,
- const T* __restrict on_value,
- const T* __restrict off_value,
- T* __restrict output_values) {
- BENCHMARK_TIMER_V2("OneHotLastDim");
- const int32_t num_elements = ShapeSize(input_rank, input_shape);
- int32_t write_offset = 0;
- for (int32_t i = 0; i < num_elements; ++i) {
- for (TDepth d = 0; d < *depth; ++d, ++write_offset) {
- output_values[write_offset] =
- (input_values[i] == d) ? *on_value : *off_value;
- }
- }
-}
-
-// -----------------------------------------------------------------------------
-// Simple unary ops
-// -----------------------------------------------------------------------------
-
-// We use macros instead of template functions with templated functors here
-// because it's a lot less verbose and easier for the compiler to optimize.
-
-#if USE_EIGEN
-
-#define SIMPLE_UNARY_OP_V2(OP_NAME, _, EXPR_EIGEN) \
- template <typename T> \
- void OP_NAME(const int32_t rank, const int32_t* __restrict input_shape, \
- const T* __restrict input_values, \
- T* __restrict output_values) { \
- BENCHMARK_TIMER_V2(#OP_NAME); \
- const int32_t size = ShapeSize(rank, input_shape); \
- auto values = ConstRowVectorMap<T>(input_values, size).array(); \
- auto output = RowVectorMap<T>(output_values, size).array(); \
- output = EXPR_EIGEN; \
- }
-
-#else
-
-#define SIMPLE_UNARY_OP_V2(OP_NAME, EXPR, _) \
- template <typename T> \
- void OP_NAME(const int32_t rank, const int32_t* __restrict input_shape, \
- const T* __restrict input_values, \
- T* __restrict output_values) { \
- BENCHMARK_TIMER_V2(#OP_NAME); \
- const int32_t size = ShapeSize(rank, input_shape); \
- for (int32_t i = 0; i < size; ++i) { \
- const T value = input_values[i]; \
- output_values[i] = EXPR; \
- } \
- }
-
-#endif
-
-// Second macro param is value expression, third entry is Eigen vector
-// expression.
-SIMPLE_UNARY_OP_V2(Abs, std::abs(value), values.abs())
-SIMPLE_UNARY_OP_V2(Acos, std::acos(value), values.acos())
-SIMPLE_UNARY_OP_V2(Asin, std::asin(value), values.asin())
-SIMPLE_UNARY_OP_V2(Atan, std::atan(value), values.atan())
-SIMPLE_UNARY_OP_V2(Cos, std::cos(value), values.cos())
-SIMPLE_UNARY_OP_V2(Cosh, std::cosh(value), values.cosh())
-SIMPLE_UNARY_OP_V2(Exp, std::exp(value), values.exp())
-SIMPLE_UNARY_OP_V2(Elu,
- value < 0 ? std::expm1(value) : value,
- // Use branchless version of Elu: min(ReLU, e^x - 1)
- values.max(0).min(values.exp() - 1))
-SIMPLE_UNARY_OP_V2(HardSigmoid,
- std::min(std::max((static_cast<T>(0.2) * value +
- static_cast<T>(0.5)),
- static_cast<T>(0)),
- static_cast<T>(1)),
- (0.2 * values + 0.5).max(0).min(1))
-SIMPLE_UNARY_OP_V2(Log, std::log(value), values.log())
-SIMPLE_UNARY_OP_V2(Log1p, std::log1p(value), values.log1p())
-SIMPLE_UNARY_OP_V2(Neg, -value, -values)
-SIMPLE_UNARY_OP_V2(Reciprocal, static_cast<T>(1) / value, values.cwiseInverse())
-SIMPLE_UNARY_OP_V2(Relu, std::max(value, static_cast<T>(0)), values.max(0))
-SIMPLE_UNARY_OP_V2(Relu6,
- std::min(std::max(value, static_cast<T>(0)),
- static_cast<T>(6)),
- values.max(0).min(6))
-SIMPLE_UNARY_OP_V2(Rsqrt, static_cast<T>(1) / std::sqrt(value), values.rsqrt())
-SIMPLE_UNARY_OP_V2(Sigmoid,
- static_cast<T>(1) / (1 + std::exp(-value)),
- ((-values).exp() + 1).cwiseInverse())
-SIMPLE_UNARY_OP_V2(Sin, std::sin(value), values.sin())
-SIMPLE_UNARY_OP_V2(Sinh, std::sinh(value), values.sinh())
-SIMPLE_UNARY_OP_V2(Sqrt, std::sqrt(value), values.sqrt())
-SIMPLE_UNARY_OP_V2(Square, value* value, values.square())
-SIMPLE_UNARY_OP_V2(Tan, std::tan(value), values.tan())
-SIMPLE_UNARY_OP_V2(Tanh, std::tanh(value), values.tanh())
-
-// -----------------------------------------------------------------------------
-// Broadcasting binary ops
-// -----------------------------------------------------------------------------
-
-template <typename T, typename OP>
-void OpNoBroadcast(const int32_t left_rank,
- const int32_t* __restrict left_shape,
- const T* __restrict left_values,
- const int32_t right_rank,
- const int32_t* __restrict right_shape,
- const T* __restrict right_values,
- T* __restrict output_values,
- OP op) {
- BENCHMARK_TIMER_V2(op.name, "NoBroadcast");
- const int32_t size = ShapeSize(left_rank, left_shape);
-#if USE_EIGEN
- auto lhs = ConstRowVectorMap<T>(left_values, size).array();
- auto rhs = ConstRowVectorMap<T>(right_values, size).array();
- auto output = RowVectorMap<T>(output_values, size).array();
- op.apply(lhs, rhs, output);
-#else
- for (int32_t i = 0; i < size; ++i) {
- output_values[i] = op(left_values[i], right_values[i]);
- }
-#endif
-}
-
-template <typename T, typename OP>
-void OpInnerBroadcast(int32_t left_rank,
- const int32_t* __restrict left_shape,
- const T* __restrict left_values,
- int32_t right_rank,
- const int32_t* __restrict right_shape,
- const T* __restrict right_values,
- T* __restrict output_values,
- OP op) {
- BENCHMARK_TIMER_V2(op.name, "InnerBroadcast");
- const int32_t output_size = ShapeSize(left_rank, left_shape);
- const int32_t inner_size = ShapeSize(right_rank, right_shape);
- const int32_t outer_size = output_size / inner_size;
-#if USE_EIGEN
- if (inner_size == 1) {
- // Apply the same value to all elements.
- auto left = ConstMatrixMap<T>(left_values, inner_size, outer_size);
- auto output = MatrixMap<T>(output_values, inner_size, outer_size);
- op.apply(left.array(), right_values[0], output.array());
- } else {
- auto left = ConstMatrixMap<T>(left_values, inner_size, outer_size);
- auto right = ConstRowVectorMap<T>(right_values, inner_size);
- auto output = MatrixMap<T>(output_values, inner_size, outer_size);
- for (int32_t col = 0; col < outer_size; col++) {
- op.apply(left.col(col).array(), right.array(), output.col(col).array());
- }
- }
-#else
- for (int32_t idx_out = 0; idx_out < outer_size; ++idx_out) {
- for (int32_t idx_in = 0; idx_in < inner_size; ++idx_in) {
- const int32_t offset = idx_out * inner_size + idx_in;
- output_values[offset] = op(left_values[offset], right_values[idx_in]);
- }
- }
-#endif
-}
-
-// Increments indices according to a shape.
-// Returns false if indices can't be incremented because they point to the last
-// element.
-//
-// E.g. if shape is (2, 3) and indices is [1, 2], indices is incremented to [2,
-// 0].
-inline bool IncrementIndices(int32_t rank,
- const int32_t* shape,
- int32_t* indices) {
- int32_t i = rank - 1;
- while (i >= 0 && indices[i] == shape[i] - 1) {
- --i;
- }
- if (i < 0) {
- return false;
- }
- indices[i] += 1;
- for (++i; i < rank; ++i) {
- indices[i] = 0;
- }
- return true;
-}
-
-// Returns the offset in a values array given its shape and indices.
-// E.g. if the shape is (2, 3) and indices are [1, 2] the offset is 1*3 + 2.
-inline int32_t Offset(int32_t rank,
- const int32_t* shape,
- const int32_t* indices) {
- int32_t offset = 0;
- int32_t mul = 1;
- for (int32_t i = rank - 1; i >= 0; --i) {
- offset += mul * indices[i];
- mul *= shape[i];
- }
- return offset;
-}
-
-// Like Offset() but with broadcasting.
-// E.g. if the input_shape is (2, 1, 3) and indices are [1, 2, 2] the offset is
-// 1*1*3 + 2*0 + 2.
-// The indices_rank can be greater than the input_rank and then the first
-// indices_rank - input_rank indices are ignored.
-// E.g. if the input_shape is (4) and indices are [2, 3, 1] the offset is 1.
-inline int32_t BroadcastOffset(int32_t input_rank,
- const int32_t* input_shape,
- int32_t indices_rank,
- const int32_t* indices) {
- int32_t offset = 0;
- int32_t mul = 1;
- for (int32_t i = input_rank - 1; i >= 0; --i) {
- int32_t index =
- input_shape[i] == 1 ? 0 : indices[i + indices_rank - input_rank];
- offset += mul * index;
- mul *= input_shape[i];
- }
- return offset;
-}
-
-template <typename T, typename OP>
-void OpGenericBroadcast(int32_t left_rank,
- const int32_t* __restrict left_shape,
- const T* __restrict left_values,
- int32_t right_rank,
- const int32_t* __restrict right_shape,
- const T* __restrict right_values,
- T* __restrict output_values,
- OP op) {
- BENCHMARK_TIMER_V2(op.name, "GenericBroadcast");
- const int32_t output_rank = std::max(left_rank, right_rank);
- const int32_t kMaxRank = 8;
- assert(output_rank <= kMaxRank);
-
- int32_t output_shape[kMaxRank];
- for (int32_t i = 0; i < output_rank; ++i) {
- int32_t left_i = i - output_rank + left_rank;
- int32_t right_i = i - output_rank + right_rank;
- output_shape[i] = std::max(left_i >= 0 ? left_shape[left_i] : 0,
- right_i >= 0 ? right_shape[right_i] : 0);
- }
-
- int32_t output_indices[kMaxRank]{};
- do {
- output_values[Offset(output_rank, output_shape, output_indices)] =
- op(left_values[BroadcastOffset(left_rank, left_shape, output_rank,
- output_indices)],
- right_values[BroadcastOffset(right_rank, right_shape, output_rank,
- output_indices)]);
- } while (IncrementIndices(output_rank, output_shape, output_indices));
-}
-
-#define BROADCAST_BINARY_OP_V2(OP_NAME, EXPR, EXPR_EIGEN) \
- template <typename T> \
- struct Op##OP_NAME { \
- const char* name = #OP_NAME; \
- T operator()(const T lhs, const T rhs) { return EXPR; } \
- template <typename X, typename Y, typename Z> \
- void apply(const X& lhs, const Y& rhs, Z out) { \
- out = EXPR_EIGEN; \
- } \
- }; \
- template <typename T> \
- void OP_NAME##NoBroadcast( \
- const int32_t left_rank, const int32_t* __restrict left_shape, \
- const T* __restrict left_values, const int32_t right_rank, \
- const int32_t* __restrict right_shape, const T* __restrict right_values, \
- T* __restrict output_values) { \
- OpNoBroadcast(left_rank, left_shape, left_values, right_rank, right_shape, \
- right_values, output_values, Op##OP_NAME<T>()); \
- } \
- template <typename T> \
- void OP_NAME##InnerBroadcast( \
- const int32_t left_rank, const int32_t* __restrict left_shape, \
- const T* __restrict left_values, const int32_t right_rank, \
- const int32_t* __restrict right_shape, const T* __restrict right_values, \
- T* __restrict output_values) { \
- OpInnerBroadcast(left_rank, left_shape, left_values, right_rank, \
- right_shape, right_values, output_values, \
- Op##OP_NAME<T>()); \
- } \
- template <typename T> \
- void OP_NAME(const int32_t left_rank, const int32_t* __restrict left_shape, \
- const T* __restrict left_values, const int32_t right_rank, \
- const int32_t* __restrict right_shape, \
- const T* __restrict right_values, \
- T* __restrict output_values) { \
- OpGenericBroadcast(left_rank, left_shape, left_values, right_rank, \
- right_shape, right_values, output_values, \
- Op##OP_NAME<T>()); \
- }
-
-// Second macro param is value expression, third entry is Eigen vector
-// expression.
-BROADCAST_BINARY_OP_V2(Add, lhs + rhs, lhs + rhs)
-BROADCAST_BINARY_OP_V2(Maximum, std::max(lhs, rhs), lhs.max(rhs))
-BROADCAST_BINARY_OP_V2(Minimum, std::min(lhs, rhs), lhs.min(rhs))
-BROADCAST_BINARY_OP_V2(Mul, lhs* rhs, lhs* rhs)
-BROADCAST_BINARY_OP_V2(Sub, lhs - rhs, lhs - rhs)
-BROADCAST_BINARY_OP_V2(SquaredDifference,
- (lhs - rhs) * (lhs - rhs),
- (lhs - rhs).square())
-
-// -----------------------------------------------------------------------------
-// Reduce ops
-// -----------------------------------------------------------------------------
-
-// We use macros instead of template functions with templated functors here
-// because it's a lot less verbose and easier for the compiler to optimize.
-#define REDUCE_OP_V2(OP_NAME, DEFAULT_VALUE, UPDATE_EXPR, RESULT_EXPR) \
- template <typename T, typename Tidx> \
- void OP_NAME##InnerReduce( \
- int32_t input_rank, const int32_t* __restrict input_shape, \
- const T* __restrict input_values, int32_t index_tensor_rank, \
- const int32_t* __restrict index_shape, \
- const Tidx* __restrict index_values, T* __restrict output_values) { \
- BENCHMARK_TIMER_V2(#OP_NAME, "InnerReduce"); \
- const int32_t inner_size = \
- GetReduceInnerSize(input_rank, input_shape, index_tensor_rank, \
- index_shape, index_values); \
- const int32_t input_size = ShapeSize(input_rank, input_shape); \
- const int32_t outer_size = input_size / inner_size; \
- for (int32_t idx_out = 0; idx_out < outer_size; ++idx_out) { \
- T value = DEFAULT_VALUE; \
- for (int32_t idx_in = 0; idx_in < inner_size; ++idx_in) { \
- const T prev = value; \
- const T next = input_values[idx_out * inner_size + idx_in]; \
- value = UPDATE_EXPR; \
- } \
- const T count = inner_size; \
- /* Used by mean reduce. */ \
- (void)sizeof(count); \
- output_values[idx_out] = RESULT_EXPR; \
- } \
- } \
- template <typename T, typename Tidx> \
- void OP_NAME##GenericReduceRank2( \
- int32_t input_rank, const int32_t* __restrict input_shape, \
- const T* __restrict input_values, int32_t index_tensor_rank, \
- const int32_t* __restrict index_shape, \
- const Tidx* __restrict index_values, T* __restrict output_values) { \
- assert(input_rank == 2); \
- assert(index_tensor_rank <= 1); \
- BENCHMARK_TIMER_V2(#OP_NAME, "GenericReduceRank2"); \
- const int32_t output_size = input_shape[1]; \
- std::fill_n(output_values, output_size, DEFAULT_VALUE); \
- for (int32_t dim0 = 0; dim0 < input_shape[0]; ++dim0) { \
- for (int32_t dim1 = 0; dim1 < input_shape[1]; ++dim1, ++input_values) { \
- T* out_ptr = output_values + dim1; \
- const T prev = *out_ptr; \
- const T next = *input_values; \
- *out_ptr = UPDATE_EXPR; \
- } \
- } \
- const T count = input_shape[0]; \
- /* Used by mean reduce. */ \
- (void)sizeof(count); \
- for (int32_t i = 0; i < output_size; ++i) { \
- const T value = output_values[i]; \
- output_values[i] = RESULT_EXPR; \
- } \
- } \
- template <typename T, typename Tidx> \
- void OP_NAME##GenericReduceRank3( \
- int32_t input_rank, const int32_t* __restrict input_shape, \
- const T* __restrict input_values, int32_t index_tensor_rank, \
- const int32_t* __restrict index_shape, \
- const Tidx* __restrict index_values, T* __restrict output_values) { \
- assert(input_rank == 3); \
- assert(index_tensor_rank <= 1); \
- BENCHMARK_TIMER_V2(#OP_NAME, "GenericReduceRank3"); \
- int32_t out_shape[3] = {input_shape[0], input_shape[1], input_shape[2]}; \
- bool reduce_mask[3] = {false, false, false}; \
- const int32_t num_indices = index_tensor_rank > 0 ? index_shape[0] : 1; \
- for (int32_t i = 0; i < num_indices; ++i) { \
- reduce_mask[index_values[i]] = true; \
- out_shape[index_values[i]] = 1; \
- } \
- const int32_t out_strides[3] = { \
- reduce_mask[0] ? 0 : out_shape[1] * out_shape[2], \
- reduce_mask[1] ? 0 : out_shape[2], \
- reduce_mask[2] ? 0 : 1, \
- }; \
- const int32_t output_size = ShapeSize(input_rank, out_shape); \
- std::fill_n(output_values, output_size, DEFAULT_VALUE); \
- for (int32_t dim0 = 0; dim0 < input_shape[0]; ++dim0) { \
- for (int32_t dim1 = 0; dim1 < input_shape[1]; ++dim1) { \
- for (int32_t dim2 = 0; dim2 < input_shape[2]; \
- ++dim2, ++input_values) { \
- T* out_ptr = output_values + out_strides[0] * dim0 + \
- out_strides[1] * dim1 + out_strides[2] * dim2; \
- const T prev = *out_ptr; \
- const T next = *input_values; \
- *out_ptr = UPDATE_EXPR; \
- } \
- } \
- } \
- const T count = (reduce_mask[0] ? input_shape[0] : 1) * \
- (reduce_mask[1] ? input_shape[1] : 1) * \
- (reduce_mask[2] ? input_shape[2] : 1); \
- /* Used by mean reduce. */ \
- (void)sizeof(count); \
- for (int32_t i = 0; i < output_size; ++i) { \
- const T value = output_values[i]; \
- output_values[i] = RESULT_EXPR; \
- } \
- } \
- template <typename T, typename Tidx> \
- void OP_NAME##GenericReduceRank4( \
- int32_t input_rank, const int32_t* __restrict input_shape, \
- const T* __restrict input_values, int32_t index_tensor_rank, \
- const int32_t* __restrict index_shape, \
- const Tidx* __restrict index_values, T* __restrict output_values) { \
- assert(input_rank == 4); \
- assert(index_tensor_rank <= 1); \
- BENCHMARK_TIMER_V2(#OP_NAME, "GenericReduceRank4"); \
- int32_t out_shape[4] = {input_shape[0], input_shape[1], input_shape[2], \
- input_shape[3]}; \
- bool reduce_mask[4] = {false, false, false, false}; \
- const int32_t num_indices = index_tensor_rank > 0 ? index_shape[0] : 1; \
- for (int32_t i = 0; i < num_indices; ++i) { \
- reduce_mask[index_values[i]] = true; \
- out_shape[index_values[i]] = 1; \
- } \
- const int32_t out_strides[4] = { \
- reduce_mask[0] ? 0 : out_shape[1] * out_shape[2] * out_shape[3], \
- reduce_mask[1] ? 0 : out_shape[2] * out_shape[3], \
- reduce_mask[2] ? 0 : out_shape[3], \
- reduce_mask[3] ? 0 : 1, \
- }; \
- const int32_t output_size = ShapeSize(input_rank, out_shape); \
- std::fill_n(output_values, output_size, DEFAULT_VALUE); \
- for (int32_t dim0 = 0; dim0 < input_shape[0]; ++dim0) { \
- for (int32_t dim1 = 0; dim1 < input_shape[1]; ++dim1) { \
- for (int32_t dim2 = 0; dim2 < input_shape[2]; ++dim2) { \
- for (int32_t dim3 = 0; dim3 < input_shape[3]; \
- ++dim3, ++input_values) { \
- T* out_ptr = output_values + out_strides[0] * dim0 + \
- out_strides[1] * dim1 + out_strides[2] * dim2 + \
- out_strides[3] * dim3; \
- const T prev = *out_ptr; \
- const T next = *input_values; \
- *out_ptr = UPDATE_EXPR; \
- } \
- } \
- } \
- } \
- const T count = (reduce_mask[0] ? input_shape[0] : 1) * \
- (reduce_mask[1] ? input_shape[1] : 1) * \
- (reduce_mask[2] ? input_shape[2] : 1) * \
- (reduce_mask[3] ? input_shape[3] : 1); \
- /* Used by mean reduce. */ \
- (void)sizeof(count); \
- for (int32_t i = 0; i < output_size; ++i) { \
- const T value = output_values[i]; \
- output_values[i] = RESULT_EXPR; \
- } \
- } \
- template <typename T, typename Tidx> \
- void OP_NAME##GenericReduceRank5( \
- int32_t input_rank, const int32_t* __restrict input_shape, \
- const T* __restrict input_values, int32_t index_tensor_rank, \
- const int32_t* __restrict index_shape, \
- const Tidx* __restrict index_values, T* __restrict output_values) { \
- assert(input_rank == 5); \
- assert(index_tensor_rank <= 1); \
- BENCHMARK_TIMER_V2(#OP_NAME, "GenericReduceRank5"); \
- int32_t out_shape[5] = {input_shape[0], input_shape[1], input_shape[2], \
- input_shape[3], input_shape[4]}; \
- /* If true, reduce the input across that dimension. */ \
- bool reduce_mask[5] = {false, false, false, false, false}; \
- const int32_t num_indices = index_tensor_rank > 0 ? index_shape[0] : 1; \
- for (int32_t i = 0; i < num_indices; ++i) { \
- reduce_mask[index_values[i]] = true; \
- out_shape[index_values[i]] = 1; \
- } \
- const int32_t out_strides[5] = { \
- reduce_mask[0] \
- ? 0 \
- : out_shape[1] * out_shape[2] * out_shape[3] * out_shape[4], \
- reduce_mask[1] ? 0 : out_shape[2] * out_shape[3] * out_shape[4], \
- reduce_mask[2] ? 0 : out_shape[3] * out_shape[4], \
- reduce_mask[3] ? 0 : out_shape[4], \
- reduce_mask[4] ? 0 : 1, \
- }; \
- const int32_t output_size = ShapeSize(input_rank, out_shape); \
- std::fill_n(output_values, output_size, DEFAULT_VALUE); \
- for (int32_t dim0 = 0; dim0 < input_shape[0]; ++dim0) { \
- for (int32_t dim1 = 0; dim1 < input_shape[1]; ++dim1) { \
- for (int32_t dim2 = 0; dim2 < input_shape[2]; ++dim2) { \
- for (int32_t dim3 = 0; dim3 < input_shape[3]; ++dim3) { \
- for (int32_t dim4 = 0; dim4 < input_shape[4]; \
- ++dim4, ++input_values) { \
- T* out_ptr = output_values + out_strides[0] * dim0 + \
- out_strides[1] * dim1 + out_strides[2] * dim2 + \
- out_strides[3] * dim3 + out_strides[4] * dim4; \
- const T prev = *out_ptr; \
- const T next = *input_values; \
- *out_ptr = UPDATE_EXPR; \
- } \
- } \
- } \
- } \
- } \
- const T count = (reduce_mask[0] ? input_shape[0] : 1) * \
- (reduce_mask[1] ? input_shape[1] : 1) * \
- (reduce_mask[2] ? input_shape[2] : 1) * \
- (reduce_mask[3] ? input_shape[3] : 1) * \
- (reduce_mask[4] ? input_shape[4] : 1); \
- /* Used by mean reduce. */ \
- (void)sizeof(count); \
- for (int32_t i = 0; i < output_size; ++i) { \
- const T value = output_values[i]; \
- output_values[i] = RESULT_EXPR; \
- } \
- }
-
-REDUCE_OP_V2(Max, std::numeric_limits<T>::lowest(), std::max(prev, next), value)
-REDUCE_OP_V2(Min,
- std::numeric_limits<T>::infinity(),
- std::min(prev, next),
- value)
-REDUCE_OP_V2(Sum, 0, prev + next, value)
-REDUCE_OP_V2(Mean, 0, prev + next, value / count)
-
-// -----------------------------------------------------------------------------
-// Dequantize ops
-// -----------------------------------------------------------------------------
-
-template <typename T>
-void DequantizeMinCombined(const int32_t rank,
- const int32_t* __restrict input_shape,
- const T* __restrict input_values,
- const float* __restrict min_range,
- const float* __restrict max_range,
- float* __restrict output_values) {
- BENCHMARK_TIMER_V2("DequantizeMinCombined");
- const int32_t size = ShapeSize(rank, input_shape);
- const float offset =
- std::is_signed<T>::value
- ? (static_cast<float>(std::numeric_limits<T>::max()) -
- std::numeric_limits<T>::min() + 1) /
- 2.0f
- : 0.0f;
- const float range_scale = (max_range[0] - min_range[0]) /
- (static_cast<float>(std::numeric_limits<T>::max()) -
- std::numeric_limits<T>::min());
- for (int32_t i = 0; i < size; ++i) {
- output_values[i] =
- ((static_cast<int32_t>(input_values[i]) + offset) * range_scale) +
- min_range[0];
- }
-}
-
-template <typename T>
-void DequantizeMinFirst(const int32_t rank,
- const int32_t* __restrict input_shape,
- const T* __restrict input_values,
- const float* __restrict min_range,
- const float* __restrict max_range,
- float* __restrict output_values) {
- BENCHMARK_TIMER_V2("DequantizeMinFirst");
- const int32_t size = ShapeSize(rank, input_shape);
- const float range_scale = (max_range[0] - min_range[0]) /
- (static_cast<float>(std::numeric_limits<T>::max()) -
- std::numeric_limits<T>::min());
- const float range_min_rounded =
- (max_range[0] == min_range[0]
- ? min_range[0]
- : std::round(min_range[0] / range_scale) * range_scale);
- for (int32_t i = 0; i < size; ++i) {
- output_values[i] = ((static_cast<int32_t>(input_values[i]) -
- std::numeric_limits<T>::min()) *
- range_scale) +
- range_min_rounded;
- }
-}
-
-// -----------------------------------------------------------------------------
-// AddN op
-// -----------------------------------------------------------------------------
-
-template <typename T>
-void AddN(const int32_t rank,
- const int32_t* __restrict shape,
- std::initializer_list<const T* __restrict> input_values,
- T* __restrict output_values) {
- BENCHMARK_TIMER_V2("AddN");
- const int32_t size = ShapeSize(rank, shape);
-#if USE_EIGEN
- auto output = RowVectorMap<T>(output_values, size).array();
- std::fill_n(output_values, size, 0);
- for (const auto input_value : input_values) {
- output += ConstRowVectorMap<T>(input_value, size).array();
- }
-#else
- for (int32_t i = 0; i < size; ++i) {
- T output_value = 0;
- for (auto input_value : input_values) {
- output_value += input_value[i];
- }
- output_values[i] = output_value;
- }
-#endif
-}
-
-// -----------------------------------------------------------------------------
-// CONSTANTS
-// Note that for now, endianness of the target machine needs to match that of
-// the one training was performed on.
-// -----------------------------------------------------------------------------
-const int32_t dnn_hiddenlayer_0_bias__0__cf__0_shape[1] = {117};
-const union {
- uint8_t bytes[468];
- float values[117];
-} dnn_hiddenlayer_0_bias__0__cf__0 = {{
- 0x6a, 0x8b, 0x40, 0xbe, 0x09, 0xc4, 0xd0, 0x3f, 0xe9, 0x26, 0xe7, 0x3d,
- 0x98, 0x1c, 0x00, 0xbf, 0x24, 0x35, 0x2c, 0x3f, 0x5c, 0x46, 0x7e, 0xbe,
- 0x66, 0xe7, 0x16, 0x3d, 0x62, 0x63, 0x48, 0x3f, 0xd9, 0xe5, 0x2a, 0xbf,
- 0x5b, 0x67, 0x18, 0xc0, 0x6d, 0xfe, 0x13, 0xc0, 0xb0, 0xed, 0xb8, 0x3d,
- 0x69, 0x75, 0x38, 0xbf, 0x1d, 0x41, 0x0b, 0x40, 0x2d, 0xf1, 0x94, 0xbe,
- 0xa0, 0x2d, 0x05, 0xbe, 0xbd, 0x15, 0x89, 0x3f, 0xa4, 0x2b, 0x64, 0x3f,
- 0xb7, 0x75, 0x18, 0xbf, 0xef, 0x9c, 0x29, 0x3f, 0x23, 0x65, 0x46, 0xc0,
- 0x93, 0x47, 0x90, 0x3e, 0xfa, 0x73, 0x2d, 0xbd, 0xb2, 0xbe, 0x14, 0xbe,
- 0xf5, 0x8a, 0x8a, 0xbf, 0x53, 0x2a, 0xc7, 0x3e, 0x99, 0x85, 0xd0, 0x3f,
- 0x8f, 0x87, 0xc6, 0x3e, 0xe3, 0xdb, 0x38, 0xc0, 0x93, 0xa0, 0x8f, 0x3e,
- 0x2a, 0xba, 0x7b, 0x3e, 0x38, 0x4b, 0xab, 0xbe, 0x6a, 0x4d, 0x5e, 0xbf,
- 0x38, 0x95, 0xd8, 0x3e, 0x59, 0xae, 0xfb, 0x3e, 0x14, 0xc0, 0xa0, 0xbe,
- 0x79, 0x17, 0xd0, 0xbe, 0x4f, 0xe6, 0xab, 0xbd, 0xbd, 0x40, 0x6a, 0xbf,
- 0xfd, 0xd5, 0x81, 0xbe, 0x83, 0xa3, 0x0f, 0xbc, 0xa3, 0x8f, 0x3e, 0x40,
- 0x97, 0xbf, 0x5e, 0xbe, 0xc1, 0x01, 0xcc, 0x3e, 0x74, 0x44, 0x5c, 0xbf,
- 0xa1, 0xda, 0xf0, 0xbf, 0x9f, 0xa9, 0x8d, 0x3f, 0x7b, 0x46, 0xc1, 0xbe,
- 0x9e, 0xd3, 0xb5, 0x3f, 0xdb, 0x4a, 0x0c, 0xbd, 0x94, 0xd6, 0x14, 0xbf,
- 0x29, 0x8e, 0xe1, 0xbe, 0xca, 0x15, 0x2c, 0xbe, 0x52, 0x30, 0x38, 0x40,
- 0xcb, 0x91, 0x1a, 0xc0, 0xa5, 0x17, 0xd9, 0xbe, 0x02, 0x0e, 0x33, 0x40,
- 0x22, 0x53, 0x8f, 0xbe, 0xbb, 0x23, 0xcd, 0xbe, 0xbc, 0x45, 0x20, 0xbe,
- 0x00, 0xfb, 0x9f, 0x3e, 0x8e, 0xba, 0xa6, 0x3e, 0xdd, 0x13, 0xe5, 0x3f,
- 0xc6, 0x25, 0x70, 0xbf, 0xe8, 0xa7, 0x60, 0x3d, 0x74, 0xe6, 0xb3, 0x3f,
- 0x3c, 0x7b, 0x23, 0xc0, 0xed, 0x1e, 0x04, 0x3d, 0xd9, 0x8a, 0x87, 0xbf,
- 0x0f, 0xd5, 0xd2, 0xbf, 0x3f, 0x60, 0x80, 0xbe, 0x55, 0x35, 0xf1, 0xbf,
- 0x7d, 0x40, 0xea, 0xbe, 0x78, 0x44, 0x31, 0x3e, 0x82, 0x1d, 0x31, 0x40,
- 0xd9, 0x99, 0xb2, 0x3f, 0x2a, 0xf2, 0x81, 0x3f, 0xab, 0x29, 0x87, 0xbe,
- 0x27, 0x14, 0xe4, 0xbe, 0x2b, 0x08, 0xa0, 0x3e, 0x62, 0xfd, 0xa3, 0x3e,
- 0xc3, 0x85, 0x98, 0xbb, 0x7c, 0x94, 0x0f, 0x3e, 0x7f, 0x69, 0xaa, 0xbe,
- 0x0d, 0xc8, 0xa6, 0x3f, 0xa5, 0x97, 0xe7, 0xbe, 0x48, 0x06, 0xa5, 0xbf,
- 0x71, 0x92, 0x20, 0xbf, 0x49, 0x12, 0x08, 0x3f, 0x17, 0x42, 0x92, 0x3e,
- 0xf1, 0xcf, 0x1b, 0x3f, 0x6e, 0x81, 0x41, 0xbd, 0xaf, 0x69, 0x4e, 0x3e,
- 0x4d, 0x4d, 0x84, 0x3d, 0x7f, 0x8f, 0x8d, 0xbf, 0x4a, 0xb1, 0x2b, 0xbe,
- 0xac, 0xae, 0x22, 0xc0, 0xce, 0x9a, 0x65, 0xbe, 0x4c, 0x14, 0x05, 0x40,
- 0xdd, 0x53, 0x81, 0xbe, 0x1f, 0x54, 0x39, 0xbf, 0x40, 0x88, 0x28, 0x40,
- 0x01, 0x6a, 0xd8, 0xbd, 0x25, 0x16, 0x30, 0xbf, 0x74, 0xfd, 0x1b, 0x40,
- 0x3f, 0x1a, 0x46, 0xc0, 0x34, 0xc8, 0x0e, 0xc0, 0xbf, 0x85, 0x8e, 0xbf,
- 0x5a, 0x75, 0x4c, 0xc0, 0xb4, 0xd5, 0xed, 0xbe, 0x09, 0xb6, 0x5c, 0x3e,
- 0xf0, 0x6b, 0x7a, 0xbd, 0xb6, 0x49, 0x56, 0xbb, 0x8c, 0x08, 0x4c, 0x3d,
- 0x42, 0x81, 0x0f, 0x40, 0xa0, 0x78, 0x6d, 0xbe, 0x95, 0x58, 0x06, 0xc0,
-}};
-const int32_t dnn_hiddenlayer_0_kernel__1__cf__1_shape[2] = {173, 117};
-const union {
- uint8_t bytes[80964];
- float values[20241];
-} dnn_hiddenlayer_0_kernel__1__cf__1 = {{
- 0x80, 0x76, 0x28, 0xbf, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x10, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x90, 0x65, 0x10, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0xc8, 0xb1, 0x7c, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x7e, 0xb4, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x48, 0x72, 0xa2, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x98, 0x58, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0xc8, 0xb1, 0x7c, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0x3e, 0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0xf0, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x80, 0x76, 0x28, 0xbf,
- 0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3f,
- 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0x3f,
- 0x80, 0x76, 0x28, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x20, 0x5d, 0x04, 0x3f, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x7f, 0x34, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0xa0, 0x65, 0x10, 0x3f, 0x90, 0x65, 0x10, 0xbf, 0xd8, 0xa0, 0x64, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x7a, 0xae, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x84, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0x28, 0xbf,
- 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
- 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0xd8, 0xa0, 0x64, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x90, 0x65, 0x10, 0xbf,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x10, 0x6e, 0x1c, 0x3f,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x7f, 0x34, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
- 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x50, 0xa9, 0x70, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x70, 0x87, 0x40, 0xbf,
- 0x80, 0x87, 0x40, 0x3f, 0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x50, 0xa9, 0x70, 0xbf, 0x50, 0xa9, 0x70, 0xbf,
- 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
- 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
- 0x50, 0xa9, 0x70, 0xbf, 0x4a, 0x72, 0x22, 0xc0, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0x60, 0x98, 0xd8, 0x3e, 0xa4, 0x78, 0xab, 0xc0, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x84, 0x08, 0xc2, 0xc0, 0x50, 0xa9, 0x70, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0xc8, 0xb1, 0xfc, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
- 0x28, 0x94, 0xd2, 0x3f, 0x90, 0x65, 0x10, 0xbf, 0x20, 0x5d, 0x84, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0x50, 0xa9, 0x70, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0xd8, 0x69, 0x96, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0xb6, 0x67, 0x13, 0xc0, 0x40, 0xa9, 0x70, 0xbe, 0x50, 0xa9, 0x70, 0x3f,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0x20, 0x5d, 0x84, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x50, 0xa9, 0x70, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f, 0x38, 0x83, 0xba, 0xbf,
- 0x80, 0x76, 0x28, 0xbf, 0x50, 0xa9, 0x70, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x20, 0x5d, 0x04, 0xbf, 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x5c, 0x61, 0x8a, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x50, 0x72, 0xa2, 0x3f,
- 0xa0, 0x65, 0x10, 0x3f, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x76, 0x28, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0x20, 0x5d, 0x04, 0xbf,
- 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x9c, 0xde, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
- 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0xd4, 0x69, 0x96, 0xbf,
- 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x70, 0x87, 0x40, 0xbf,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x9c, 0xde, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f, 0x70, 0x87, 0x40, 0xbf,
- 0xf2, 0x6b, 0x19, 0xc0, 0x7a, 0x63, 0x0d, 0xc0, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x76, 0x28, 0xbf, 0x7c, 0x63, 0x0d, 0x40, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x84, 0x3f, 0xd0, 0xb1, 0x7c, 0x3f,
- 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0xec, 0x8f, 0x4c, 0xc0,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0xd4, 0x69, 0x96, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x78, 0x87, 0xc0, 0x3f,
- 0x80, 0x76, 0xa8, 0x3e, 0x76, 0x87, 0x40, 0xc0, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x58, 0x85, 0x3d, 0x40,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
- 0xc8, 0xb1, 0xfc, 0xbf, 0x10, 0x6e, 0x9c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0x78, 0x87, 0xc0, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x58, 0x85, 0x3d, 0x40,
- 0x2c, 0x70, 0x1f, 0xc0, 0x90, 0x65, 0x10, 0xbf, 0xc4, 0x7a, 0x2e, 0x40,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x9c, 0xde, 0x3f,
- 0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x38, 0x83, 0xba, 0x3f,
- 0x86, 0x76, 0x28, 0xc0, 0x80, 0x87, 0xc0, 0xbd, 0x50, 0xa9, 0x70, 0xbf,
- 0x74, 0x87, 0xc0, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x18, 0xa5, 0xea, 0xbf,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x1c, 0x81, 0x37, 0x40,
- 0x50, 0x72, 0xa2, 0x3f, 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
- 0x50, 0x72, 0xa2, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0xd4, 0x69, 0x96, 0xbf,
- 0x70, 0x87, 0x40, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0x3e,
- 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x10, 0x6e, 0x1c, 0xc0, 0x80, 0x87, 0x40, 0xbe, 0x90, 0xad, 0xf6, 0x3f,
- 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xe0, 0x7c, 0x31, 0x40,
- 0x00, 0x88, 0x40, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x4c, 0x72, 0x22, 0x40,
- 0x94, 0x89, 0x43, 0xc0, 0x3e, 0x5f, 0x07, 0xc0, 0xc8, 0xb1, 0x7c, 0xbf,
- 0xec, 0x8f, 0x4c, 0xc0, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x98, 0x65, 0x10, 0x40, 0x80, 0x76, 0xa8, 0xbe, 0x3e, 0x5f, 0x07, 0xc0,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x70, 0x87, 0x40, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x7f, 0x34, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
- 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x60, 0x98, 0xd8, 0xbe,
- 0x60, 0x98, 0x58, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x60, 0x98, 0x58, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x3c, 0xf1, 0xa0, 0xc0, 0xc0, 0x65, 0x10, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x03, 0x5b, 0x81, 0xc0, 0x40, 0xa9, 0xf0, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0xd8, 0xa0, 0x64, 0xbf,
- 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x50, 0xa9, 0x70, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
- 0x60, 0x61, 0x8a, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0xb0, 0x8b, 0xc6, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3f,
- 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x20, 0x5d, 0x04, 0xbf, 0x3e, 0x5f, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0xe0, 0x7c, 0xb1, 0xc0, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0x3f,
- 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0x18, 0xa5, 0xea, 0xbf,
- 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x7f, 0xb4, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x98, 0x58, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x20, 0x5d, 0x84, 0x3f, 0x70, 0x87, 0x40, 0xbf, 0x18, 0xa5, 0xea, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x10, 0x3f, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0x58, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0xe0, 0x7c, 0x31, 0xc0, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x48, 0x72, 0xa2, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0xb0, 0x8b, 0xc6, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
- 0xd8, 0xa0, 0x64, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x76, 0x28, 0xbf,
- 0xc8, 0xb1, 0xfc, 0xbf, 0x20, 0x5d, 0x04, 0xc0, 0x60, 0xa9, 0xf0, 0x3e,
- 0xc8, 0xb1, 0x7c, 0xbf, 0xb0, 0x8b, 0xc6, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x38, 0x83, 0xba, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
- 0x00, 0x7f, 0x34, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0xc2, 0x7a, 0x2e, 0xc0,
- 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xf0, 0x8f, 0xcc, 0x3f,
- 0x60, 0x98, 0xd8, 0x3e, 0x4a, 0x72, 0x22, 0xc0, 0x00, 0x7f, 0x34, 0x3f,
- 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x88, 0x76, 0x28, 0x40,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0x3f, 0xd8, 0xa0, 0x64, 0xbf,
- 0x50, 0xa9, 0xf0, 0xbf, 0x78, 0x87, 0xc0, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0xf0, 0x8f, 0xcc, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0xb8, 0x67, 0x13, 0x40,
- 0x98, 0x65, 0x10, 0xc0, 0x80, 0x76, 0xa8, 0xbe, 0xa4, 0x78, 0x2b, 0x40,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0xb0, 0x8b, 0xc6, 0x3f,
- 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x28, 0x94, 0xd2, 0x3f,
- 0xd4, 0x69, 0x16, 0xc0, 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x9c, 0xbf,
- 0x48, 0x72, 0xa2, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x74, 0x87, 0xc0, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xf4, 0x6b, 0x19, 0x40,
- 0x50, 0x72, 0xa2, 0x3f, 0x50, 0x72, 0xa2, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x20, 0x5d, 0x84, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
- 0x80, 0x76, 0xa8, 0xbe, 0x50, 0xa9, 0x70, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0x3f,
- 0x40, 0xa9, 0x70, 0x3e, 0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0xa4, 0x78, 0x2b, 0xc0, 0x80, 0x76, 0xa8, 0x3e, 0x90, 0xad, 0xf6, 0x3f,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x10, 0x6e, 0x1c, 0x40,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x7c, 0x63, 0x0d, 0x40,
- 0xc2, 0x7a, 0x2e, 0xc0, 0x98, 0x65, 0x10, 0xc0, 0x90, 0x65, 0x10, 0xbf,
- 0x46, 0x96, 0x55, 0xc0, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x28, 0x94, 0xd2, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xc8, 0xb1, 0xfc, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x90, 0x76, 0x28, 0x3f,
- 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0x58, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
- 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0x58, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0xf0, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xe8, 0xb3, 0x7f, 0xc0, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x03, 0x5b, 0x81, 0xc0, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x76, 0x28, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x70, 0x87, 0x40, 0xbf,
- 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x10, 0x6e, 0x1c, 0x3f,
- 0x90, 0x76, 0x28, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0xec, 0x8f, 0xcc, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
- 0x7a, 0x63, 0x0d, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x74, 0x87, 0xc0, 0xbf,
- 0x80, 0x76, 0x28, 0xbf, 0x78, 0x87, 0xc0, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x84, 0xbf, 0x90, 0x65, 0x10, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x3e, 0x5f, 0x07, 0xc0, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xb4, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0x28, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf,
- 0x20, 0x5d, 0x04, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0x90, 0x65, 0x10, 0xbf,
- 0x64, 0x98, 0xd8, 0xbf, 0xdc, 0xa0, 0xe4, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x10, 0x6e, 0x1c, 0xbf, 0x10, 0x6e, 0x9c, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x98, 0x65, 0x90, 0x3f, 0x60, 0x98, 0x58, 0x3f,
- 0x70, 0x87, 0x40, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0xf2, 0x6b, 0x19, 0xc0,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x88, 0x76, 0xa8, 0x3f,
- 0x40, 0xa9, 0x70, 0x3e, 0xb6, 0x67, 0x13, 0xc0, 0x10, 0x6e, 0x1c, 0x3f,
- 0x10, 0x6e, 0x1c, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x70, 0x87, 0x40, 0xbf,
- 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x30, 0x70, 0x1f, 0x40,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x74, 0x87, 0xc0, 0xbf, 0x10, 0x6e, 0x9c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0x88, 0x76, 0xa8, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x5c, 0x61, 0x0a, 0x40,
- 0x8c, 0xad, 0xf6, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x10, 0x6e, 0x1c, 0x40,
- 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0xc8, 0x7a, 0xae, 0x3f,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x84, 0x3f,
- 0x5c, 0x61, 0x0a, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x69, 0x96, 0xbf,
- 0x48, 0x72, 0xa2, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x10, 0x6e, 0x9c, 0xbf,
- 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xb8, 0x67, 0x13, 0x40,
- 0x60, 0x98, 0x58, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
- 0xd8, 0x69, 0x96, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf,
- 0x60, 0x98, 0xd8, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
- 0x7a, 0x63, 0x0d, 0xc0, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0xb4, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x7c, 0x63, 0x0d, 0x40,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x9c, 0xde, 0x3f,
- 0x7a, 0x63, 0x0d, 0xc0, 0xdc, 0xa0, 0xe4, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0xfe, 0x7e, 0x34, 0xc0, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x10, 0x6e, 0x9c, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0xb0, 0x8b, 0xc6, 0xbf,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x20, 0x5d, 0x04, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x98, 0x65, 0x90, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xe0, 0x7c, 0x31, 0xc0, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0xfa, 0xa2, 0x67, 0xc0, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0x28, 0xbf,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
- 0x60, 0xa9, 0xf0, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0x98, 0x58, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x88, 0x76, 0xa8, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xc8, 0xb1, 0x7c, 0xbf,
- 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0x98, 0x58, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x8c, 0xad, 0xf6, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x61, 0x8a, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x7a, 0xae, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0xd4, 0x69, 0x96, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0x28, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0xd8, 0x69, 0x96, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0x28, 0xbf,
- 0x98, 0x65, 0x90, 0xbf, 0x10, 0x6e, 0x9c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x61, 0x8a, 0x3f, 0x00, 0x7f, 0x34, 0x3f,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x02, 0x5b, 0x01, 0xc0,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f,
- 0x40, 0xa9, 0x70, 0x3e, 0x28, 0x94, 0xd2, 0xbf, 0x20, 0x5d, 0x04, 0x3f,
- 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x04, 0x5b, 0x01, 0x40,
- 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x90, 0x65, 0x10, 0xbf,
- 0x5c, 0x61, 0x8a, 0xbf, 0x20, 0x5d, 0x84, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x5d, 0x84, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x68, 0x98, 0xd8, 0x3f,
- 0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x9c, 0xde, 0x3f,
- 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x61, 0x8a, 0x3f,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x61, 0x8a, 0x3f,
- 0xb0, 0x8b, 0xc6, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x98, 0x65, 0x90, 0xbf,
- 0x20, 0x5d, 0x84, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x50, 0xa9, 0x70, 0xbf,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x58, 0xa9, 0xf0, 0x3f,
- 0x00, 0x7f, 0x34, 0x3f, 0x60, 0x61, 0x8a, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
- 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
- 0xa0, 0x65, 0x90, 0xbe, 0x50, 0xa9, 0x70, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0xec, 0x8f, 0xcc, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xd8, 0x69, 0x96, 0x3f,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x50, 0x72, 0xa2, 0x3f,
- 0x18, 0xa5, 0xea, 0xbf, 0x98, 0x65, 0x90, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0x5c, 0x61, 0x0a, 0xc0, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0xe0, 0xa0, 0x64, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xfc, 0x7e, 0xb4, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x60, 0x98, 0xd8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0x58, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xc8, 0xb1, 0xfc, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0xfe, 0x7e, 0x34, 0xc0, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
- 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x98, 0x58, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x90, 0x65, 0x10, 0xbf, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x84, 0x76, 0xa8, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
- 0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0xc8, 0xb1, 0x7c, 0xbf, 0x50, 0xa9, 0x70, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x10, 0x3f,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x74, 0x87, 0xc0, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0xfc, 0x7e, 0xb4, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xb0, 0x8b, 0xc6, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x98, 0x65, 0x90, 0x3f,
- 0xd4, 0x69, 0x96, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0xcc, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3f,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3f,
- 0x98, 0x65, 0x90, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x84, 0xbf,
- 0x50, 0xa9, 0x70, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x9c, 0xde, 0x3f,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
- 0xfc, 0x7e, 0xb4, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0xe0, 0xa0, 0x64, 0x3f,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x84, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x84, 0x3f,
- 0x10, 0x6e, 0x9c, 0xbf, 0xd8, 0xa0, 0x64, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x28, 0x94, 0xd2, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x50, 0xa9, 0x70, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0xf0, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x9c, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0x3e, 0xec, 0x8f, 0xcc, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
- 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0x58, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0xa8, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x90, 0x65, 0x10, 0xbf,
- 0x80, 0x76, 0x28, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0x70, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x98, 0x65, 0x90, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f,
- 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x84, 0x3f,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x90, 0x76, 0x28, 0x3f,
- 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
- 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x84, 0x3f,
- 0x20, 0x5d, 0x04, 0x3f, 0x10, 0x6e, 0x1c, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x98, 0xd8, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x98, 0x58, 0xbf, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x5c, 0x61, 0x8a, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x90, 0x65, 0x10, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x68, 0x98, 0xd8, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7f, 0x34, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0x90, 0x65, 0x10, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0x58, 0x3f, 0x80, 0x76, 0x28, 0xbf,
- 0x98, 0x65, 0x10, 0xc0, 0x02, 0x5b, 0x01, 0xc0, 0x40, 0xa9, 0x70, 0x3e,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x40, 0x5f, 0x07, 0x40, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x98, 0x65, 0x90, 0x3f, 0xd8, 0x69, 0x96, 0x3f,
- 0x00, 0x7f, 0x34, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x58, 0x85, 0x3d, 0xc0,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x5c, 0x61, 0x8a, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0xe0, 0xa0, 0xe4, 0x3f,
- 0x40, 0xa9, 0x70, 0x3e, 0x3a, 0x83, 0x3a, 0xc0, 0x10, 0x6e, 0x1c, 0x3f,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xf0, 0x8f, 0x4c, 0x40,
- 0x80, 0x87, 0x40, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf,
- 0xc8, 0xb1, 0xfc, 0xbf, 0xd8, 0x69, 0x96, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x88, 0x76, 0xa8, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xe0, 0x7c, 0x31, 0x40,
- 0xb6, 0x67, 0x13, 0xc0, 0x40, 0xa9, 0xf0, 0xbe, 0x78, 0x87, 0x40, 0x40,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x28, 0x94, 0xd2, 0x3f,
- 0x10, 0x6e, 0x1c, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x88, 0x76, 0xa8, 0x3f,
- 0x86, 0x76, 0x28, 0xc0, 0x00, 0x88, 0x40, 0x3d, 0x48, 0x72, 0xa2, 0xbf,
- 0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x02, 0x5b, 0x01, 0xc0,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x58, 0x85, 0x3d, 0x40,
- 0x50, 0x72, 0xa2, 0x3f, 0x10, 0x6e, 0x9c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe,
- 0x00, 0x7f, 0xb4, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x48, 0x72, 0xa2, 0xbf,
- 0x70, 0x87, 0x40, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
- 0xc0, 0x65, 0x10, 0x3e, 0x50, 0xa9, 0x70, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0xc2, 0x7a, 0x2e, 0xc0, 0x00, 0x87, 0x40, 0xbd, 0x04, 0x5b, 0x01, 0x40,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x10, 0x6e, 0x1c, 0x40,
- 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x5c, 0x61, 0x0a, 0x40,
- 0x3a, 0x83, 0x3a, 0xc0, 0x98, 0x65, 0x10, 0xc0, 0x10, 0x6e, 0x9c, 0xbf,
- 0x0a, 0x92, 0x4f, 0xc0, 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x98, 0x65, 0x10, 0x40, 0x80, 0x87, 0x40, 0xbe, 0x5c, 0x61, 0x0a, 0xc0,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x90, 0x65, 0x10, 0xbf,
- 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x50, 0xa9, 0x70, 0xbf, 0x60, 0x98, 0x58, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0xc5, 0xe8, 0x94, 0xc0, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0xf2, 0x6b, 0x99, 0xc0, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0x58, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
- 0xf0, 0x8f, 0x4c, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x76, 0x28, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0x28, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0xd4, 0x69, 0x96, 0xbf,
- 0x90, 0x65, 0x10, 0xbf, 0xe0, 0xa0, 0x64, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x9c, 0xde, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x50, 0xa9, 0x70, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0x58, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x70, 0x87, 0x40, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xb1, 0x7c, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xd8, 0xa0, 0x64, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x48, 0x72, 0xa2, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0x48, 0x72, 0xa2, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x7f, 0x34, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0xfc, 0x7e, 0xb4, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x50, 0xa9, 0x70, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x48, 0x72, 0xa2, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x98, 0x58, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0xb0, 0x8b, 0xc6, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0xa9, 0xf0, 0x3e, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x98, 0xd8, 0xbe, 0xe0, 0xa0, 0x64, 0x3f, 0x70, 0x87, 0x40, 0xbf,
- 0x80, 0x76, 0xa8, 0xbe, 0x50, 0xa9, 0xf0, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x61, 0x8a, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x20, 0x5d, 0x04, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x60, 0x98, 0xd8, 0xbe, 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x70, 0x87, 0x40, 0xbf,
- 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x70, 0x87, 0x40, 0xbf,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x90, 0x65, 0x10, 0xbf,
- 0xdc, 0xa0, 0xe4, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x98, 0x65, 0x90, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xd8, 0x69, 0x96, 0x3f,
- 0x5c, 0x61, 0x0a, 0xc0, 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xc8, 0x7a, 0xae, 0x3f,
- 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x38, 0x83, 0xba, 0xbf, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x84, 0x76, 0xa8, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x65, 0x10, 0xbf,
- 0x50, 0x72, 0xa2, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
- 0x60, 0x98, 0xd8, 0x3e, 0x84, 0x76, 0xa8, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0x98, 0x58, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x88, 0x76, 0xa8, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0xd0, 0xb1, 0xfc, 0x3f,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x7c, 0x63, 0x0d, 0x40,
- 0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
- 0x8c, 0xad, 0xf6, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xb0, 0x8b, 0xc6, 0xbf,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x76, 0x28, 0x3f,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0x58, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0xd0, 0xb1, 0x7c, 0x3f,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x98, 0x58, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0x20, 0x5d, 0x04, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x7f, 0x34, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0xbf,
- 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0x28, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x70, 0x87, 0x40, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x50, 0xa9, 0x70, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3f,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x90, 0x65, 0x10, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x90, 0x65, 0x10, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0xf0, 0x8f, 0x4c, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x7f, 0x34, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x7f, 0x34, 0x3f,
- 0x10, 0x6e, 0x1c, 0xbf, 0xdc, 0xa0, 0xe4, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0xbf, 0xa0, 0x65, 0x10, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x7f, 0x34, 0xbf,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x70, 0xab, 0x73, 0xc0, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x98, 0x65, 0x10, 0xc0, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x84, 0x76, 0xa8, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x84, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x48, 0x72, 0xa2, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9c, 0xde, 0xbf,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0xa0, 0x65, 0x10, 0x3f, 0x60, 0x61, 0x8a, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
- 0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x90, 0x76, 0x28, 0x3f,
- 0xc0, 0x7a, 0xae, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf,
- 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x90, 0x76, 0x28, 0x3f,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
- 0xa2, 0x0a, 0xc5, 0xc0, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0x58, 0x3f,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xb0, 0x8b, 0xc6, 0xbf,
- 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xc8, 0xb1, 0x7c, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0x50, 0xa9, 0xf0, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x98, 0xd8, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf,
- 0xa0, 0x65, 0x90, 0xbe, 0xc8, 0xb1, 0xfc, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0xd0, 0xb1, 0x7c, 0x3f, 0x90, 0x76, 0x28, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x90, 0x76, 0x28, 0x3f,
- 0x40, 0xa9, 0x70, 0xbe, 0xd4, 0x69, 0x96, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0x58, 0xbf,
- 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x90, 0x65, 0x10, 0xbf,
- 0xb0, 0x8b, 0xc6, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x50, 0x72, 0xa2, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x61, 0x8a, 0x3f,
- 0x02, 0x5b, 0x01, 0xc0, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x78, 0x87, 0xc0, 0x3f,
- 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
- 0xc0, 0x7a, 0xae, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x7f, 0xb4, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x76, 0x28, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f,
- 0x10, 0x6e, 0x1c, 0x3f, 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x78, 0x87, 0xc0, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x58, 0xa9, 0xf0, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x40, 0x5f, 0x07, 0x40,
- 0xb0, 0x8b, 0xc6, 0xbf, 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0xc8, 0xb1, 0xfc, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x90, 0x76, 0x28, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x94, 0xd2, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x7f, 0x34, 0x3f,
- 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
- 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x90, 0x65, 0x10, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0x3e, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x48, 0x72, 0xa2, 0xbf,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0xc8, 0x7a, 0xae, 0x3f,
- 0x80, 0x76, 0xa8, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x61, 0x8a, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x10, 0x6e, 0x1c, 0xbf, 0xb0, 0x8b, 0x46, 0xc0, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x50, 0xa9, 0x70, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0x70, 0x87, 0x40, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0x40, 0x3e,
- 0x20, 0x5d, 0x84, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x9c, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f, 0x60, 0x98, 0xd8, 0x3e,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x7a, 0x63, 0x0d, 0xc0, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0xf3, 0xa2, 0x0c, 0xc1, 0x80, 0x65, 0x10, 0xbe, 0x04, 0x5b, 0x01, 0x40,
- 0xe0, 0xa0, 0x64, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xb6, 0x67, 0x13, 0xc0,
- 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x98, 0x65, 0x90, 0x3f,
- 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
- 0x8c, 0xad, 0xf6, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x20, 0x5d, 0x84, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7f, 0x34, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0xd0, 0xb1, 0x7c, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
- 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x50, 0x72, 0xa2, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0xd4, 0x69, 0x96, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0x58, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xd8, 0xa0, 0x64, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x64, 0x98, 0xd8, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
- 0x50, 0x72, 0xa2, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x50, 0x72, 0xa2, 0x3f,
- 0xd4, 0x69, 0x16, 0xc0, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x88, 0x76, 0xa8, 0x3f,
- 0x60, 0x98, 0x58, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x50, 0xa9, 0x70, 0x3f,
- 0xfc, 0x7e, 0xb4, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
- 0xb0, 0x8b, 0xc6, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x50, 0x72, 0xa2, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x7f, 0xb4, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0xa0, 0x64, 0xbf,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0x58, 0x3f,
- 0x10, 0x6e, 0x1c, 0x3f, 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0xcc, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x5c, 0x61, 0x0a, 0x40,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0xb8, 0x67, 0x13, 0x40,
- 0xfc, 0x7e, 0xb4, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0x28, 0xbf,
- 0x20, 0x5d, 0x04, 0xc0, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0x98, 0x58, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x38, 0x83, 0xba, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
- 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x10, 0x6e, 0x1c, 0x3f,
- 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x7f, 0x34, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0x28, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x4a, 0x72, 0x22, 0xc0, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x74, 0x87, 0xc0, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
- 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x61, 0x8a, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x98, 0x65, 0x90, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
- 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x10, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x50, 0xa9, 0x70, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0x58, 0x3f,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
- 0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x84, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x3a, 0x83, 0x3a, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x8f, 0xcc, 0x3f,
- 0x00, 0x7f, 0x34, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x90, 0x76, 0x28, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0x98, 0x58, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0x58, 0x3f, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0xd8, 0x69, 0x96, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x50, 0xa9, 0x70, 0x3f, 0x60, 0x98, 0x58, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x10, 0x6e, 0x1c, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x98, 0x65, 0x90, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x70, 0x87, 0x40, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f,
- 0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0xbf,
- 0x18, 0xa5, 0xea, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x50, 0x72, 0xa2, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xd8, 0x69, 0x96, 0x3f,
- 0x3e, 0x5f, 0x07, 0xc0, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x38, 0x83, 0xba, 0x3f,
- 0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x50, 0xa9, 0x70, 0x3f,
- 0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0x28, 0xbf,
- 0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7f, 0xb4, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x10, 0x6e, 0x9c, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
- 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
- 0xf0, 0x8f, 0x4c, 0x3f, 0x20, 0x5d, 0x84, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xb0, 0x8b, 0xc6, 0x3f,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x98, 0x65, 0x10, 0x40,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x98, 0x65, 0x10, 0x40,
- 0xec, 0x8f, 0xcc, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x64, 0x98, 0xd8, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x28, 0x94, 0xd2, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x7f, 0x34, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x70, 0x87, 0x40, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0x3f, 0x90, 0x76, 0x28, 0x3f,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x70, 0x87, 0x40, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x50, 0xa9, 0x70, 0x3f,
- 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x7f, 0x34, 0x3f,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x84, 0x76, 0xa8, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x3e, 0x5f, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0xa8, 0xbe, 0x3e, 0x5f, 0x07, 0xc0, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x98, 0xd8, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x20, 0x5d, 0x04, 0x3f,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0x98, 0x58, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x98, 0x58, 0x3f, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0xd0, 0xb1, 0x7c, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0xd0, 0xb1, 0x7c, 0x3f,
- 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0xa0, 0x64, 0xbf,
- 0x60, 0x98, 0x58, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x76, 0x28, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x98, 0x58, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x10, 0x6e, 0x1c, 0x3f, 0x60, 0x98, 0x58, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xe0, 0xa0, 0x64, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x84, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f, 0x50, 0xa9, 0x70, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0x60, 0x98, 0x58, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x50, 0xa9, 0x70, 0xbf,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xd8, 0xa0, 0x64, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0x3f,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf,
- 0x28, 0x94, 0xd2, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x98, 0x65, 0x90, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xd8, 0x69, 0x96, 0x3f,
- 0x5c, 0x61, 0x0a, 0xc0, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x68, 0x98, 0xd8, 0x3f,
- 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f,
- 0x38, 0x83, 0xba, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x38, 0x83, 0xba, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x50, 0x72, 0xa2, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0x61, 0x8a, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x5c, 0x61, 0x8a, 0xbf,
- 0x10, 0x6e, 0x1c, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3f,
- 0x90, 0x76, 0x28, 0x3f, 0x48, 0x72, 0xa2, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x58, 0xa9, 0xf0, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x90, 0xad, 0xf6, 0x3f,
- 0xb0, 0x8b, 0xc6, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x18, 0xa5, 0xea, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xdc, 0xa0, 0xe4, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x90, 0x76, 0x28, 0x3f,
- 0x80, 0x76, 0x28, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
- 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x76, 0x28, 0x3f,
- 0x80, 0x76, 0x28, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x84, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x74, 0x87, 0xc0, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
- 0x10, 0x6e, 0x1c, 0xbf, 0x8c, 0xad, 0xf6, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0xb6, 0x67, 0x13, 0xc0, 0xa0, 0x65, 0x90, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x98, 0x65, 0x90, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0x70, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x98, 0x65, 0x90, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0x28, 0xbf,
- 0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x5d, 0x84, 0x3f, 0x10, 0x6e, 0x9c, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x76, 0x28, 0x3f,
- 0x90, 0x65, 0x10, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0x50, 0x72, 0xa2, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x10, 0x3f,
- 0x10, 0x6e, 0x1c, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
- 0x98, 0x65, 0x90, 0x3f, 0x60, 0x98, 0x58, 0x3f, 0x5c, 0x61, 0x8a, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0xc8, 0xb1, 0x7c, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0x98, 0x65, 0x90, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x1c, 0x3f, 0x70, 0x87, 0x40, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0xc0, 0x40, 0xa9, 0x70, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0x69, 0x96, 0x3f, 0x98, 0x65, 0x90, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x60, 0x87, 0xc0, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0x98, 0x58, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x50, 0xa9, 0x70, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x90, 0x65, 0x10, 0xbf,
- 0x8c, 0xad, 0xf6, 0xbf, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0x88, 0x76, 0xa8, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xd8, 0x69, 0x96, 0x3f,
- 0x7a, 0x63, 0x0d, 0xc0, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xe0, 0xa0, 0xe4, 0x3f,
- 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3f,
- 0xb0, 0x8b, 0xc6, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0x98, 0x65, 0x90, 0xbf,
- 0x38, 0x83, 0xba, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x38, 0x83, 0xba, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0xd8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x98, 0x65, 0x90, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xe0, 0xa0, 0x64, 0x3f,
- 0x10, 0x6e, 0x1c, 0x3f, 0x48, 0x72, 0xa2, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x58, 0xa9, 0xf0, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0x5f, 0x07, 0x40,
- 0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x50, 0xa9, 0xf0, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e,
- 0x60, 0x98, 0x58, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x9c, 0xde, 0xbf,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0xa0, 0x65, 0x10, 0x3f,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x90, 0x65, 0x10, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x90, 0x76, 0x28, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x70, 0x87, 0x40, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x87, 0xc0, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0xa0, 0x65, 0x10, 0x3f,
- 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x90, 0x65, 0x10, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x20, 0x5d, 0x04, 0x3f,
- 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0x28, 0xbf,
- 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0x40, 0x3f,
- 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x9c, 0xde, 0xbf, 0x50, 0xa9, 0x70, 0x3f,
- 0x80, 0x87, 0xc0, 0xbd, 0x58, 0x85, 0x3d, 0xc0, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0xf2, 0x6b, 0x99, 0xc0, 0x60, 0x98, 0x58, 0xbf,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xb1, 0xfc, 0xbf,
- 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x50, 0xa9, 0x70, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0xfc, 0x7e, 0xb4, 0xbf,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0x28, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x20, 0x5d, 0x84, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0xec, 0x8f, 0x4c, 0xc0, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf, 0x90, 0x65, 0x10, 0xbf,
- 0x50, 0xa9, 0x70, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0x98, 0x58, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0x28, 0xbf,
- 0x60, 0x98, 0x58, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x70, 0x87, 0x40, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0x58, 0x3f,
- 0xc8, 0x7a, 0xae, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x28, 0x94, 0xd2, 0xbf,
- 0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0x28, 0xbf,
- 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x76, 0x28, 0xbf,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x98, 0xd8, 0x3e, 0xe0, 0xa0, 0x64, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x70, 0x87, 0x40, 0xbf,
- 0x20, 0x5d, 0x04, 0xbf, 0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x9c, 0x3f, 0x98, 0x65, 0x90, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0x28, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f, 0x98, 0x65, 0x90, 0x3f,
- 0x80, 0x87, 0xc0, 0xbd, 0x5c, 0x61, 0x8a, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x84, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x50, 0xa9, 0xf0, 0xbf, 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0xf0, 0x8f, 0xcc, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x98, 0x65, 0x90, 0x3f,
- 0xb6, 0x67, 0x13, 0xc0, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x9c, 0xde, 0x3f,
- 0x10, 0x6e, 0x9c, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0x70, 0x3f,
- 0x28, 0x94, 0xd2, 0xbf, 0x90, 0x76, 0x28, 0x3f, 0x20, 0x5d, 0x84, 0xbf,
- 0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0xc8, 0x7a, 0xae, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x50, 0xa9, 0x70, 0xbf,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x10, 0x3f,
- 0x60, 0xa9, 0xf0, 0x3e, 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xf0, 0x8f, 0xcc, 0x3f,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x9c, 0xde, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x04, 0x5b, 0x01, 0x40,
- 0x10, 0x6e, 0x9c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x9c, 0xde, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x18, 0xa5, 0xea, 0xbf,
- 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x61, 0x8a, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x90, 0x76, 0x28, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x60, 0x87, 0xc0, 0xbe, 0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x98, 0x65, 0x90, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0xf0, 0x8f, 0x4c, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x5c, 0x61, 0x8a, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0x28, 0xbf,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
- 0xdc, 0xa0, 0xe4, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x7f, 0xb4, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x50, 0x72, 0xa2, 0x3f,
- 0xd4, 0x69, 0x16, 0xc0, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x78, 0x87, 0xc0, 0x3f,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xd0, 0xb1, 0x7c, 0x3f,
- 0x64, 0x98, 0xd8, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0x58, 0xbf,
- 0xec, 0x8f, 0xcc, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x38, 0x83, 0xba, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x50, 0x72, 0xa2, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0xa0, 0x64, 0xbf,
- 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f,
- 0x20, 0x5d, 0x04, 0x3f, 0x10, 0x6e, 0x9c, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x04, 0x5b, 0x01, 0x40,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x04, 0x5b, 0x01, 0x40,
- 0xfc, 0x7e, 0xb4, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
- 0x02, 0x5b, 0x01, 0xc0, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0xf0, 0x8f, 0x4c, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x9c, 0xde, 0xbf,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x7f, 0x34, 0x3f,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x10, 0x3f,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x84, 0x76, 0xa8, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x3a, 0x83, 0x3a, 0xc0, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0x86, 0x76, 0x28, 0xc0, 0x90, 0x65, 0x10, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0xa0, 0x64, 0xbf,
- 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x84, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x9c, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x98, 0xd8, 0x3e, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
- 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
- 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
- 0x60, 0x98, 0x58, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
- 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0x28, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x20, 0x5d, 0x84, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0xc8, 0xb1, 0x7c, 0xbf,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x20, 0x5d, 0x84, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x48, 0x72, 0xa2, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
- 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x90, 0x76, 0x28, 0x3f,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x10, 0x6e, 0x9c, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0x58, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xf0, 0x8f, 0x4c, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0xe0, 0xa0, 0x64, 0x3f, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x74, 0x87, 0xc0, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x84, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f,
- 0x80, 0x76, 0xa8, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0x28, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
- 0xc0, 0x7a, 0xae, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0x18, 0xa5, 0xea, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x20, 0x5d, 0x04, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x10, 0x6e, 0x9c, 0x3f,
- 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf,
- 0x60, 0x98, 0x58, 0xbf, 0x10, 0x6e, 0x9c, 0x3f, 0x60, 0x98, 0xd8, 0xbe,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x60, 0x98, 0x58, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x5c, 0x61, 0x8a, 0xbf,
- 0xf0, 0x8f, 0x4c, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x5d, 0x84, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x78, 0x87, 0xc0, 0x3f,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x28, 0x94, 0xd2, 0x3f,
- 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x9c, 0xde, 0x3f,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x76, 0x28, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
- 0x48, 0x72, 0xa2, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xfc, 0x7e, 0xb4, 0xbf,
- 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0x58, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
- 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3f,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0x28, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x90, 0x65, 0x10, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3f,
- 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x65, 0x10, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0x90, 0x76, 0x28, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x10, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x9c, 0xde, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
- 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0xd0, 0xb1, 0x7c, 0x3f, 0xe0, 0x7c, 0xb1, 0xc0, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x38, 0x15, 0xd4, 0xc0, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x28, 0x94, 0xd2, 0xbf,
- 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x7f, 0x34, 0xbf, 0x60, 0xa9, 0xf0, 0x3e, 0x70, 0x87, 0x40, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x50, 0x72, 0xa2, 0x3f, 0x90, 0x76, 0x28, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
- 0x90, 0x76, 0x28, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x20, 0x5d, 0x84, 0x3f,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x3a, 0x83, 0xba, 0xc0, 0x00, 0x88, 0x40, 0x3d, 0x48, 0x72, 0xa2, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0xe0, 0xa0, 0x64, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0x3f,
- 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0xb0, 0x8b, 0xc6, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0x58, 0xbf, 0x98, 0x65, 0x90, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xd4, 0x69, 0x96, 0xbf,
- 0x90, 0x65, 0x10, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x5c, 0x61, 0x8a, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
- 0x60, 0x98, 0xd8, 0xbe, 0x64, 0x98, 0xd8, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0x58, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
- 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x60, 0x98, 0xd8, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0xc0, 0x7a, 0xae, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xf0, 0x8f, 0x4c, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
- 0x64, 0x98, 0xd8, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x38, 0x83, 0xba, 0x3f,
- 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x70, 0x87, 0x40, 0xbf, 0x60, 0x61, 0x8a, 0x3f, 0x90, 0x65, 0x10, 0xbf,
- 0x80, 0x76, 0x28, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x7f, 0x34, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x5c, 0x61, 0x8a, 0xbf,
- 0x10, 0x6e, 0x1c, 0x3f, 0x70, 0x87, 0x40, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x98, 0x65, 0x90, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0xc8, 0x7a, 0xae, 0x3f,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0xcc, 0x3f,
- 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x68, 0x98, 0xd8, 0x3f,
- 0x00, 0x7f, 0x34, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x84, 0x76, 0xa8, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x7f, 0x34, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x69, 0x96, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0x3f,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x7f, 0x34, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x70, 0x87, 0x40, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x90, 0x65, 0x10, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0x58, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x48, 0x72, 0xa2, 0xbf, 0x20, 0x5d, 0x04, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x7f, 0x34, 0x3f,
- 0x20, 0x5d, 0x84, 0x3f, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0xe0, 0xa0, 0x64, 0x3f, 0x00, 0x7f, 0x34, 0x3f,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x3f, 0x5f, 0x87, 0xc0, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0xfe, 0x7e, 0xb4, 0xc0, 0xa0, 0x65, 0x90, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0x58, 0xbf,
- 0x60, 0x98, 0xd8, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x88, 0x76, 0xa8, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0xd4, 0x69, 0x16, 0x40, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x20, 0x5d, 0x04, 0x3f, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x48, 0x72, 0xa2, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x35, 0xa7, 0xed, 0xc0, 0x80, 0x87, 0x40, 0xbe, 0x50, 0xa9, 0x70, 0xbf,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x78, 0x87, 0xc0, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0xce, 0x8d, 0x49, 0xc0,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xe0, 0xa0, 0xe4, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
- 0x90, 0x76, 0x28, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x76, 0xa8, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0xe0, 0xa0, 0x64, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x8c, 0xad, 0xf6, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x50, 0xa9, 0x70, 0x3f, 0x90, 0x76, 0x28, 0x3f,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0x00, 0x7f, 0x34, 0xbf, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
- 0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x70, 0x87, 0x40, 0xbf,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x64, 0x98, 0xd8, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x50, 0xa9, 0x70, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x20, 0x5d, 0x04, 0xc0, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x78, 0x87, 0xc0, 0x3f,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
- 0x60, 0x98, 0x58, 0xbf, 0x10, 0x6e, 0x9c, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
- 0x5c, 0x61, 0x8a, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0xf0, 0x8f, 0x4c, 0x3f, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0x60, 0x98, 0xd8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xc8, 0xb1, 0x7c, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xd8, 0xa0, 0x64, 0xbf,
- 0x50, 0xa9, 0x70, 0x3f, 0xc8, 0xb1, 0x7c, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x98, 0x65, 0x90, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x28, 0x94, 0xd2, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x28, 0x94, 0xd2, 0x3f,
- 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x84, 0x76, 0xa8, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x7a, 0xae, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x90, 0x65, 0x10, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
- 0xa0, 0x65, 0x90, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f, 0x20, 0x5d, 0x04, 0x3f,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf, 0x50, 0xa9, 0x70, 0x3f,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x76, 0x28, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
- 0x80, 0x87, 0x40, 0x3e, 0xdc, 0xa0, 0x64, 0xc0, 0x00, 0x87, 0x40, 0xbd,
- 0x20, 0x5d, 0x04, 0xbf, 0x96, 0xf7, 0xa9, 0xc0, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x88, 0x76, 0xa8, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x90, 0x65, 0x10, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0x28, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x10, 0x6e, 0x1c, 0xc0, 0x80, 0x87, 0x40, 0xbe, 0x74, 0x87, 0xc0, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x84, 0x76, 0xa8, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x10, 0x6e, 0x1c, 0x3f,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xc8, 0xb1, 0x7c, 0xbf,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x10, 0x3f, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xc0, 0xc0, 0x65, 0x10, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0xd0, 0xb1, 0x7c, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
- 0x20, 0x5d, 0x04, 0xbf, 0x50, 0xa9, 0x70, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
- 0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
- 0x64, 0x98, 0xd8, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0xe0, 0xa0, 0x64, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3f,
- 0x02, 0x5b, 0x01, 0xc0, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x90, 0x65, 0x10, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0xc8, 0x7a, 0xae, 0x3f,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x60, 0x61, 0x8a, 0x3f, 0x90, 0x65, 0x10, 0xbf,
- 0x98, 0x65, 0x90, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x98, 0x58, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x50, 0xa9, 0x70, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x90, 0x76, 0x28, 0x3f, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0x40, 0xbe,
- 0x60, 0x98, 0x58, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0xc8, 0x7a, 0xae, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x28, 0x94, 0xd2, 0x3f,
- 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0xe0, 0xa0, 0xe4, 0x3f,
- 0x00, 0x7f, 0x34, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x38, 0x83, 0xba, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0xd0, 0xb1, 0x7c, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x74, 0x87, 0xc0, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x10, 0x3f,
- 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
- 0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x1c, 0x81, 0x37, 0xc0, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x98, 0xd8, 0xbe, 0x46, 0x96, 0x55, 0xc0, 0x20, 0x5d, 0x04, 0x3f,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x70, 0x87, 0x40, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0xe0, 0xa0, 0x64, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x28, 0x94, 0xd2, 0xbf,
- 0x80, 0x76, 0x28, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x90, 0x65, 0x10, 0xbf, 0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0xe0, 0xa0, 0x64, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xd4, 0x69, 0x96, 0xbf,
- 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x20, 0x5d, 0x04, 0x3f, 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f, 0x90, 0x65, 0x10, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0xc8, 0xb1, 0xfc, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x61, 0x8a, 0x3f, 0x00, 0x7f, 0x34, 0x3f,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0x28, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
- 0x00, 0x7f, 0x34, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x10, 0x3f, 0x90, 0x65, 0x10, 0xbf,
- 0x18, 0xa5, 0xea, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x10, 0x6e, 0x9c, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x7f, 0x34, 0x3f,
- 0x02, 0x5b, 0x01, 0xc0, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0xb0, 0x8b, 0xc6, 0x3f,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x61, 0x8a, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
- 0x50, 0xa9, 0x70, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x50, 0xa9, 0x70, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x7f, 0x34, 0x3f, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0x40, 0xbe,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x38, 0x83, 0xba, 0x3f,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x68, 0x98, 0xd8, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xf0, 0x8f, 0xcc, 0x3f,
- 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0xc0, 0x7a, 0xae, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x60, 0x98, 0x58, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xdc, 0xa0, 0xe4, 0xbf,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x70, 0x87, 0x40, 0xbf, 0x10, 0x6e, 0x1c, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x70, 0x87, 0x40, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x2c, 0x70, 0x1f, 0xc0, 0x00, 0x88, 0x40, 0x3d,
- 0x90, 0x65, 0x10, 0xbf, 0x70, 0xab, 0x73, 0xc0, 0x00, 0x7f, 0xb4, 0x3f,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf,
- 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x60, 0x98, 0x58, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
- 0x38, 0x83, 0xba, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x90, 0x76, 0x28, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x98, 0x65, 0x90, 0xbf,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xd4, 0x69, 0x96, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x5c, 0x61, 0x8a, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x9c, 0xbf,
- 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x70, 0x87, 0x40, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0xc8, 0xb1, 0xfc, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x61, 0x8a, 0x3f, 0x20, 0x5d, 0x04, 0x3f,
- 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0x28, 0xbf,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x10, 0x3f,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0x20, 0x5d, 0x04, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x90, 0x65, 0x10, 0xbf,
- 0x80, 0x87, 0x40, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x50, 0xa9, 0x70, 0xbf,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
- 0xa0, 0x9c, 0xde, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0xd8, 0x69, 0x96, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
- 0x3e, 0x5f, 0x07, 0xc0, 0x80, 0x76, 0xa8, 0xbe, 0x90, 0x65, 0x10, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x9c, 0xde, 0x3f,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0xe8, 0x8f, 0x4c, 0xbf, 0xd0, 0xb1, 0x7c, 0x3f, 0x70, 0x87, 0x40, 0xbf,
- 0x98, 0x65, 0x90, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0xd0, 0xb1, 0x7c, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0x58, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x90, 0x76, 0x28, 0x3f, 0x20, 0x5d, 0x84, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x28, 0x94, 0xd2, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x7f, 0xb4, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x68, 0x98, 0xd8, 0x3f,
- 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0xc0, 0x7a, 0xae, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0xdc, 0xa0, 0xe4, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x90, 0x76, 0x28, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
- 0x60, 0x98, 0xd8, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
- 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
- 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0xe0, 0xa0, 0x64, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0xbf, 0x90, 0x65, 0x10, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x34, 0xa7, 0x6d, 0xc0, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x49, 0x04, 0xbc, 0xc0, 0x20, 0x5d, 0x04, 0x3f,
- 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x90, 0x76, 0x28, 0x3f, 0x84, 0x76, 0xa8, 0xbf,
- 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe,
- 0xd8, 0x69, 0x96, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x76, 0x28, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0xd0, 0xb1, 0x7c, 0x3f,
- 0x74, 0x87, 0xc0, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x76, 0x28, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x18, 0xa5, 0xea, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0x58, 0x3f,
- 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
- 0x88, 0x76, 0xa8, 0x3f, 0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3f,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0xd0, 0xb1, 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x70, 0xab, 0x73, 0xc0,
- 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x90, 0x76, 0x28, 0x3f,
- 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x7f, 0x34, 0xbf,
- 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0x58, 0x3f,
- 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x9c, 0xbf,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0x28, 0xbf,
- 0xa0, 0x65, 0x90, 0xbe, 0xc8, 0xb1, 0xfc, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0x58, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x70, 0x87, 0x40, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
- 0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x50, 0xa9, 0x70, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
- 0xc8, 0xb1, 0xfc, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x50, 0x72, 0xa2, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0x98, 0x65, 0x10, 0xc0, 0x60, 0x87, 0xc0, 0xbe, 0x90, 0x65, 0x10, 0xbf,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x58, 0xa9, 0xf0, 0x3f,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x76, 0x28, 0xbf, 0x50, 0xa9, 0x70, 0x3f, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0x20, 0x5d, 0x84, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0x20, 0x5d, 0x04, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x9c, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x7f, 0x34, 0x3f, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0x40, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x78, 0x87, 0xc0, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x9c, 0xde, 0x3f,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
- 0x84, 0x76, 0xa8, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x7f, 0x34, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x64, 0x98, 0xd8, 0xbf,
- 0x20, 0x5d, 0x04, 0x3f, 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0xc8, 0xb1, 0xfc, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xe0, 0xa0, 0x64, 0x3f, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x65, 0x10, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0x20, 0x5d, 0x04, 0xbf, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x70, 0x87, 0x40, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x70, 0x87, 0x40, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
- 0xdc, 0xa0, 0xe4, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
- 0x8c, 0xad, 0xf6, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x78, 0x87, 0xc0, 0x3f,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0x50, 0xa9, 0x70, 0xbf, 0xe0, 0xa0, 0x64, 0x3f, 0x90, 0x65, 0x10, 0xbf,
- 0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0xd0, 0xb1, 0x7c, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x60, 0x98, 0x58, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x50, 0xa9, 0x70, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x70, 0x87, 0x40, 0xbf,
- 0x60, 0x98, 0x58, 0x3f, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x38, 0x83, 0xba, 0x3f,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xb0, 0x8b, 0xc6, 0x3f,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x9c, 0xde, 0x3f,
- 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0xc0, 0x7a, 0xae, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x64, 0x98, 0xd8, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0xf0, 0x8f, 0x4c, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0x3f,
- 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x03, 0x5b, 0x81, 0xc0, 0x80, 0x87, 0xc0, 0xbd,
- 0x20, 0x5d, 0x04, 0xbf, 0x0d, 0x00, 0xb6, 0xc0, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3f, 0x60, 0x98, 0xd8, 0xbe,
- 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0x28, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x76, 0xa8, 0xbe, 0x98, 0x65, 0x90, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0x28, 0xbf,
- 0x90, 0x76, 0x28, 0x3f, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0xb6, 0x67, 0x13, 0xc0,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x61, 0x8a, 0x3f,
- 0x70, 0x87, 0x40, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xb0, 0x8b, 0xc6, 0x3f,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x90, 0x65, 0x10, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x70, 0x87, 0x40, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0x58, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0x58, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x7f, 0x34, 0x3f,
- 0x98, 0x65, 0x90, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x60, 0x98, 0x58, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf,
- 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0x5c, 0x61, 0x8a, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x20, 0x5d, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x84, 0xbf, 0x70, 0x87, 0x40, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
- 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x7f, 0x34, 0x3f, 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x5c, 0x61, 0x8a, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x7f, 0x34, 0x3f,
- 0x20, 0x5d, 0x84, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x84, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x9c, 0x3f,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x61, 0x8a, 0x3f,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
- 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x50, 0xa9, 0x70, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
- 0x10, 0x6e, 0x1c, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x84, 0xbf,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x20, 0x5d, 0x04, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x20, 0x5d, 0x04, 0x3f,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
- 0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0x3f,
- 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x10, 0x3f,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0xd8, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
- 0x80, 0x87, 0x40, 0x3f, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
- 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0xb0, 0x8b, 0xc6, 0xbf, 0x10, 0x6e, 0x9c, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x7f, 0x34, 0x3f,
- 0x80, 0x76, 0xa8, 0xbe, 0x98, 0x65, 0x90, 0xbf, 0xe0, 0xa0, 0x64, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x7a, 0x63, 0x8d, 0xc0, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x3a, 0x83, 0xba, 0xc0, 0x20, 0x5d, 0x04, 0xbf,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x7a, 0x63, 0x0d, 0xc0,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x70, 0x87, 0x40, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
- 0xe8, 0x8f, 0x4c, 0xbf, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0xe0, 0xa0, 0x64, 0x3f, 0x60, 0x61, 0x8a, 0x3f,
- 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0xf0, 0x8f, 0x4c, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0xd8, 0x69, 0x96, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x61, 0x8a, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3f,
- 0x40, 0xa9, 0xf0, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
- 0xb0, 0x8b, 0x46, 0xc0, 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x76, 0x28, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
- 0x60, 0x98, 0x58, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0xa4, 0x78, 0x2b, 0xc0,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
- 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xd0, 0xb1, 0x7c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x5c, 0x61, 0x8a, 0xbf, 0x00, 0x7f, 0x34, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x70, 0x87, 0x40, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
- 0xd4, 0x69, 0x96, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x48, 0x72, 0xa2, 0xbf, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0x58, 0x3f,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x20, 0x5d, 0x04, 0x3f,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xc8, 0xb1, 0x7c, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x90, 0x76, 0x28, 0x3f, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x61, 0x8a, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x98, 0x65, 0x90, 0x3f,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x9c, 0xde, 0x3f,
- 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x70, 0x87, 0x40, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0xd8, 0xa0, 0x64, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x10, 0x6e, 0x1c, 0x3f,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x70, 0x87, 0x40, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
- 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0x3f,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xd0, 0xb1, 0x7c, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x20, 0x5d, 0x84, 0x3f, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x10, 0x6e, 0x9c, 0xbf, 0x98, 0x65, 0x90, 0xbf, 0xa0, 0x65, 0x10, 0x3f,
- 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x38, 0x83, 0xba, 0x3f, 0x00, 0x7f, 0x34, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0xca, 0xb1, 0x7c, 0xc0, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x98, 0xd8, 0xbe, 0xfe, 0x7e, 0xb4, 0xc0, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x50, 0xa9, 0x70, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x48, 0x72, 0xa2, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x98, 0x65, 0x90, 0x3f,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0xf0, 0x8f, 0x4c, 0x3f, 0x60, 0x98, 0x58, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0xf0, 0x8f, 0x4c, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x76, 0x28, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x90, 0x76, 0x28, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0xe0, 0xa0, 0x64, 0x3f,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
- 0x20, 0x5d, 0x04, 0xbf, 0xd4, 0x69, 0x96, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
- 0x94, 0x89, 0xc3, 0xc0, 0x80, 0x87, 0xc0, 0x3d, 0xd8, 0x69, 0x96, 0x3f,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf,
- 0xf0, 0x8f, 0xcc, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x5c, 0x61, 0x8a, 0xc0,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
- 0x80, 0x87, 0x40, 0x3f, 0x50, 0xa9, 0x70, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xb0, 0x8b, 0xc6, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0x28, 0xbf,
- 0x38, 0x83, 0xba, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0xf0, 0x8f, 0x4c, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x84, 0x76, 0xa8, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
- 0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xc8, 0xb1, 0x7c, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
- 0x50, 0xa9, 0x70, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x84, 0x3f,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x50, 0xa9, 0x70, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0xb0, 0x8b, 0xc6, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x60, 0x98, 0x58, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
- 0x60, 0x98, 0x58, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x48, 0x72, 0xa2, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x90, 0x76, 0x28, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0xc8, 0xb1, 0x7c, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0x28, 0xbf,
- 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x90, 0x76, 0x28, 0x3f,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0xec, 0x8f, 0x4c, 0xc0, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x69, 0x74, 0xa5, 0xc0, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x84, 0x3f,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0xd4, 0x69, 0x96, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xd8, 0x69, 0x96, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
- 0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0xe0, 0xa0, 0x64, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x38, 0x83, 0xba, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x50, 0xa9, 0x70, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x90, 0x65, 0x10, 0xbf,
- 0xc0, 0x7a, 0xae, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0x98, 0x58, 0x3f, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0xc0, 0x7a, 0xae, 0xbf, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xd0, 0xb1, 0x7c, 0x3f,
- 0xd8, 0xa0, 0x64, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x9c, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x78, 0x87, 0xc0, 0x3f,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0xd8, 0xa0, 0x64, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
- 0x60, 0x98, 0x58, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x48, 0x72, 0xa2, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
- 0x70, 0x87, 0x40, 0xbf, 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x70, 0x87, 0x40, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xd8, 0xa0, 0x64, 0xbf,
- 0x60, 0x98, 0xd8, 0xbe, 0x86, 0x76, 0x28, 0xc0, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x21, 0x5d, 0x84, 0xc0, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0x28, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x98, 0x65, 0x90, 0x3f,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
- 0x00, 0x7f, 0x34, 0xbf, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x61, 0x8a, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x18, 0xa5, 0xea, 0xbf, 0x80, 0x87, 0x40, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x70, 0x87, 0x40, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x50, 0x72, 0xa2, 0x3f,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0xd8, 0x69, 0x96, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
- 0x60, 0x98, 0x58, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x60, 0x61, 0x8a, 0x3f,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x76, 0x28, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0xec, 0x8f, 0xcc, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0x58, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x90, 0x65, 0x10, 0xbf,
- 0x10, 0x6e, 0x9c, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0xd8, 0x69, 0x96, 0x3f, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
- 0x38, 0x83, 0xba, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x50, 0xa9, 0x70, 0x3f,
- 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0x28, 0xbf,
- 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x98, 0x65, 0x90, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0x40, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x9c, 0x3f,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xf0, 0x8f, 0xcc, 0x3f,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x50, 0xa9, 0x70, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xb0, 0x8b, 0xc6, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x7f, 0x34, 0x3f,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0xa0, 0x65, 0x10, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x76, 0x28, 0xbf, 0x00, 0x7f, 0x34, 0x3f, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
- 0x90, 0x65, 0x10, 0xbf, 0x7a, 0x63, 0x0d, 0xc0, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x98, 0xd8, 0xbe, 0x12, 0xdc, 0x82, 0xc0, 0xe0, 0xa0, 0x64, 0x3f,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7f, 0xb4, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x18, 0xa5, 0xea, 0x3f,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xc8, 0x7a, 0xae, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0xd8, 0x69, 0x96, 0x3f, 0x48, 0x72, 0xa2, 0xbf,
- 0x40, 0xa9, 0xf0, 0xbe, 0xa0, 0x9c, 0xde, 0xbf, 0xd8, 0xa0, 0x64, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x90, 0x65, 0x10, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
- 0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x76, 0x28, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0xad, 0xf6, 0x3f,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0xe0, 0xa0, 0x64, 0x3f,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x28, 0x94, 0xd2, 0xbf, 0x90, 0x65, 0x10, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x7f, 0x34, 0xbf,
- 0xc0, 0x7a, 0xae, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
- 0x98, 0x65, 0x90, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0x84, 0x76, 0xa8, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x84, 0x3f,
- 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf,
- 0x10, 0x6e, 0x1c, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x90, 0x76, 0x28, 0x3f, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xd8, 0x69, 0x96, 0x3f,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x90, 0x76, 0x28, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x28, 0x94, 0xd2, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x70, 0x87, 0x40, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0xf0, 0x8f, 0x4c, 0x3f, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x38, 0x83, 0xba, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf,
- 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x10, 0x3f,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0xa0, 0x65, 0x10, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x60, 0x61, 0x8a, 0x3f, 0x28, 0x94, 0xd2, 0xbf,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x87, 0xc0, 0xbe,
- 0x10, 0x6e, 0x1c, 0xbf, 0x28, 0x94, 0x52, 0xc0, 0x00, 0x00, 0x00, 0x00,
- 0x10, 0x6e, 0x1c, 0xbf, 0x94, 0x89, 0xc3, 0xc0, 0xa0, 0x65, 0x10, 0x3f,
- 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x90, 0x76, 0x28, 0x3f, 0x84, 0x76, 0xa8, 0xbf,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x60, 0x61, 0x8a, 0x3f, 0x20, 0x5d, 0x04, 0xbf, 0xd0, 0xb1, 0xfc, 0x3f,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x46, 0x96, 0x55, 0xc0, 0x00, 0x7f, 0xb4, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x78, 0x87, 0xc0, 0x3f, 0x70, 0x87, 0x40, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x64, 0x98, 0xd8, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x90, 0x65, 0x10, 0xbf,
- 0x10, 0x6e, 0x9c, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x20, 0x5d, 0x84, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0xc0, 0x7a, 0xae, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0xd8, 0x69, 0x96, 0x3f,
- 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0x58, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0xc8, 0x7a, 0xae, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0xc8, 0xb1, 0x7c, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x10, 0x6e, 0x9c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0xcc, 0x3f,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x50, 0xa9, 0x70, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0xd0, 0xb1, 0x7c, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x28, 0x94, 0xd2, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x70, 0x87, 0x40, 0xbf,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x70, 0x87, 0x40, 0xbf,
- 0x38, 0x83, 0xba, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x60, 0x61, 0x8a, 0x3f, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x98, 0x65, 0x90, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x98, 0x65, 0x90, 0x3f,
- 0x00, 0x7f, 0x34, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x70, 0x87, 0x40, 0xbf,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xd8, 0xa0, 0x64, 0xbf,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0xe0, 0xa0, 0x64, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x88, 0x76, 0xa8, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x28, 0x94, 0xd2, 0x3f,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x7f, 0x34, 0x3f, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x7a, 0xae, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xec, 0x8f, 0xcc, 0xbf, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x70, 0x87, 0x40, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0xc0, 0x7a, 0xae, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x61, 0x8a, 0x3f, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0x84, 0x76, 0xa8, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0xd0, 0xb1, 0x7c, 0x3f,
- 0x80, 0x76, 0x28, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf,
- 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0xf0, 0x8f, 0x4c, 0x3f, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x98, 0x65, 0x90, 0x3f,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x50, 0xa9, 0x70, 0x3f,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x68, 0x98, 0xd8, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x50, 0xa9, 0x70, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x48, 0x72, 0xa2, 0xbf,
- 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3f,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x18, 0xa5, 0x6a, 0xc0, 0xc0, 0x65, 0x10, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x3a, 0x83, 0xba, 0xc0, 0x40, 0xa9, 0x70, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0x58, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x50, 0x72, 0xa2, 0x3f,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x98, 0x65, 0x90, 0xbf, 0x60, 0x61, 0x8a, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x9c, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0xb0, 0x8b, 0xc6, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x70, 0x87, 0x40, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3f,
- 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf,
- 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x76, 0x28, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x90, 0x65, 0x10, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x90, 0x76, 0x28, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x84, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
- 0x8c, 0xad, 0xf6, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x90, 0x76, 0x28, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0x50, 0xa9, 0x70, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x7f, 0x34, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x9c, 0xde, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x74, 0x87, 0xc0, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x48, 0x72, 0xa2, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x65, 0x10, 0xbf,
- 0x10, 0x6e, 0x1c, 0xbf, 0x60, 0x98, 0x58, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x98, 0x65, 0x90, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x38, 0x83, 0xba, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x98, 0x65, 0x90, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x70, 0x87, 0x40, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x76, 0x28, 0x3f,
- 0x50, 0xa9, 0x70, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0x28, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0x28, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0x60, 0x98, 0xd8, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x98, 0xd8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x50, 0x72, 0xa2, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x76, 0x28, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x28, 0x94, 0xd2, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x7f, 0x34, 0x3f,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f, 0x70, 0x87, 0x40, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
- 0x60, 0x98, 0x58, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x7f, 0x34, 0x3f,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xb1, 0x7c, 0x3f,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0x28, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x74, 0x87, 0xc0, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x7f, 0x34, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x84, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x76, 0x28, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
- 0x90, 0x76, 0x28, 0x3f, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0x58, 0x3f,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0x28, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0xe0, 0xa0, 0x64, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0xd0, 0xb1, 0x7c, 0x3f,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x50, 0xa9, 0x70, 0x3f,
- 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0xc8, 0xb1, 0x7c, 0xbf, 0x50, 0xa9, 0xf0, 0xbf, 0x00, 0x7f, 0x34, 0xbf,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x10, 0x3f,
- 0x60, 0x98, 0x58, 0xbf, 0x20, 0x5d, 0x84, 0xbf, 0x20, 0x5d, 0x84, 0x3f,
- 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x98, 0x65, 0x90, 0xbf,
- 0x60, 0x98, 0xd8, 0x3e, 0xbe, 0x9e, 0x61, 0xc0, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x0b, 0x92, 0xcf, 0xc0, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x72, 0x22, 0xc0,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x10, 0x6e, 0x9c, 0xbf,
- 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x76, 0x28, 0x3f,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xb4, 0x3f, 0x60, 0x98, 0x58, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0xb6, 0x67, 0x13, 0xc0, 0x80, 0x87, 0x40, 0x3f,
- 0xc8, 0xb1, 0x7c, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0x28, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
- 0x60, 0x98, 0x58, 0x3f, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xd8, 0xa0, 0x64, 0xbf,
- 0xc8, 0xb1, 0x7c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x86, 0x76, 0x28, 0xc0,
- 0x80, 0x65, 0x10, 0xbe, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x9c, 0xde, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0xd4, 0x69, 0x96, 0xbf,
- 0x90, 0x76, 0x28, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x50, 0xa9, 0x70, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x20, 0x5d, 0x04, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x98, 0x65, 0x90, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x74, 0x87, 0xc0, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x9c, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0x58, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x87, 0xc0, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x70, 0x87, 0x40, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f,
- 0x50, 0xa9, 0x70, 0xbf, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
- 0x60, 0x98, 0x58, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xc8, 0x7a, 0xae, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xe8, 0x8f, 0x4c, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0x3f, 0x60, 0xa9, 0xf0, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0xd8, 0xa0, 0x64, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x5c, 0x61, 0x8a, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x76, 0x28, 0x3f,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x7f, 0x34, 0x3f,
- 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x90, 0x76, 0x28, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x90, 0x76, 0x28, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x70, 0x87, 0x40, 0xbf, 0x38, 0x83, 0xba, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0x20, 0x5d, 0x04, 0x3f, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x88, 0x76, 0xa8, 0x3f, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xd8, 0x69, 0x96, 0x3f,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x03, 0x5b, 0x81, 0xc0, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x0c, 0xc8, 0xc0, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x8c, 0xad, 0xf6, 0xbf,
- 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xc8, 0x7a, 0xae, 0x3f, 0x80, 0x87, 0x40, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x98, 0x65, 0x10, 0xc0, 0x80, 0x76, 0xa8, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
- 0x88, 0x76, 0xa8, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0xbe,
- 0xfa, 0xa2, 0x67, 0xc0, 0xc0, 0x65, 0x10, 0x3e, 0x98, 0x65, 0x10, 0xc0,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0xd4, 0x69, 0x96, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x86, 0x76, 0x28, 0xc0,
- 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x10, 0x6e, 0x1c, 0x3f, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x60, 0x98, 0x58, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0xd8, 0x69, 0x96, 0x3f,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x5c, 0x61, 0x8a, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf,
- 0x20, 0x5d, 0x04, 0xbf, 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x76, 0x28, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x7a, 0xae, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0xe0, 0xa0, 0x64, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0xc8, 0xb1, 0x7c, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0xf0, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0x70, 0x3f,
- 0x84, 0x76, 0xa8, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x90, 0x65, 0x10, 0xbf,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf, 0x40, 0xa9, 0x70, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3f,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x76, 0x28, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xc8, 0x7a, 0xae, 0x3f,
- 0x00, 0x7f, 0x34, 0xbf, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x90, 0x65, 0x10, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x20, 0x5d, 0x84, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e,
- 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x70, 0x87, 0x40, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e,
- 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x1c, 0x3f,
- 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0x70, 0x87, 0x40, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x90, 0x65, 0x10, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0x58, 0x3f,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0x70, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x46, 0x96, 0x55, 0xc0, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x96, 0xf7, 0xa9, 0xc0, 0x40, 0xa9, 0x70, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x28, 0x94, 0xd2, 0xbf,
- 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0xf0, 0x8f, 0x4c, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0x58, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0xdc, 0xa0, 0xe4, 0xbf, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0xb0, 0x8b, 0xc6, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xb1, 0xfc, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x74, 0x87, 0xc0, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x5c, 0x61, 0x8a, 0xbf,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x20, 0x5d, 0x84, 0x3f, 0x60, 0x98, 0xd8, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x20, 0x5d, 0x84, 0x3f,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0x28, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x28, 0x94, 0xd2, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x90, 0xbe,
- 0x50, 0xa9, 0x70, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x10, 0x6e, 0x1c, 0x3f, 0x90, 0x76, 0x28, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0xe0, 0xa0, 0x64, 0x3f,
- 0xd4, 0x69, 0x96, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x76, 0xa8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x20, 0x5d, 0x04, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x70, 0x87, 0x40, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x90, 0x65, 0x10, 0xbf,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x90, 0x76, 0x28, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x90, 0x76, 0x28, 0x3f,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x98, 0x65, 0x90, 0x3f,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x76, 0x28, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x76, 0xa8, 0x3e,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x84, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0xc8, 0xb1, 0x7c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0x3f,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0x3f,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x10, 0x3f,
- 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x98, 0x58, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
- 0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xd0, 0xb1, 0x7c, 0x3f,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0xbe, 0x70, 0x87, 0x40, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x3a, 0x83, 0x3a, 0xc0, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x52, 0xa9, 0x70, 0xc0, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xc8, 0xb1, 0x7c, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xd8, 0xa0, 0x64, 0xbf,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x50, 0xa9, 0x70, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x98, 0x65, 0x90, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x28, 0x94, 0xd2, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x7f, 0x34, 0x3f, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x87, 0x40, 0x3f,
- 0x20, 0x5d, 0x84, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0xf0, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e,
- 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x61, 0x8a, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
- 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0xd4, 0x69, 0x96, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x7f, 0x34, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x7f, 0x34, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x90, 0x65, 0x10, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0xb0, 0x8b, 0xc6, 0x3f, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0x28, 0xbf, 0xc0, 0x65, 0x10, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x9c, 0xde, 0xbf, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x20, 0x5d, 0x04, 0x3f,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x70, 0x87, 0x40, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x60, 0x98, 0xd8, 0xbe,
- 0x98, 0x65, 0x90, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0xf0, 0x8f, 0x4c, 0x3f, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3f,
- 0x38, 0x83, 0xba, 0xbf, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
- 0x60, 0x98, 0x58, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x60, 0xa9, 0xf0, 0x3e,
- 0x40, 0xa9, 0xf0, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x76, 0x28, 0x3f, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x90, 0x76, 0x28, 0x3f,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0x28, 0xbf,
- 0x80, 0x76, 0xa8, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0x3f,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xb1, 0x7c, 0x3f,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xd8, 0x69, 0x96, 0x3f,
- 0x60, 0x98, 0x58, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x5c, 0x61, 0x8a, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x98, 0x58, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x65, 0x10, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x60, 0x98, 0xd8, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0xa9, 0xf0, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x10, 0x3f,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x40, 0xa9, 0xf0, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x61, 0x8a, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0xbf, 0x70, 0x87, 0x40, 0xbf,
- 0x60, 0x87, 0xc0, 0xbe, 0x58, 0x85, 0x3d, 0xc0, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x12, 0xdc, 0x82, 0xc0, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x98, 0x58, 0xbf,
- 0x50, 0x72, 0xa2, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0x58, 0x3f,
- 0x58, 0xa9, 0xf0, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0xb0, 0x8b, 0xc6, 0x3f, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x76, 0xa8, 0xbe, 0x48, 0x72, 0xa2, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x7f, 0xb4, 0x3f, 0x80, 0x87, 0xc0, 0x3e,
- 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x50, 0xa9, 0x70, 0x3f, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x48, 0x72, 0xa2, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x98, 0xd8, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0x10, 0x6e, 0x1c, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf, 0x98, 0x65, 0x90, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0xa9, 0xf0, 0x3e, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0xc0, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0x20, 0x5d, 0x84, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x04, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6e, 0x1c, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x10, 0x6e, 0x1c, 0xbf, 0x40, 0xa9, 0x70, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0xec, 0x8f, 0xcc, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x84, 0xbf, 0xa0, 0x65, 0x10, 0x3f,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0xe8, 0x8f, 0x4c, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x76, 0x28, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0x84, 0x76, 0xa8, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x20, 0x5d, 0x84, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
- 0xc0, 0x7a, 0xae, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3f,
- 0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
- 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x76, 0x28, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x90, 0x76, 0x28, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x10, 0x6e, 0x1c, 0x3f,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x7f, 0x34, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x70, 0x87, 0x40, 0xbf,
- 0x80, 0x76, 0xa8, 0x3e, 0x10, 0x6e, 0x1c, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x87, 0x40, 0xbd,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xb1, 0x7c, 0x3f,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
- 0x50, 0xa9, 0x70, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x10, 0x6e, 0x1c, 0x3f,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0xd4, 0x69, 0x96, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0x28, 0xbf,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0xe8, 0x8f, 0x4c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x10, 0x6e, 0x1c, 0x3f,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0xf0, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x90, 0x65, 0x10, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe, 0xc0, 0x65, 0x10, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x70, 0x87, 0x40, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x76, 0x28, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x90, 0x65, 0x10, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x65, 0x90, 0xbe, 0x60, 0x98, 0x58, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x10, 0x3f,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
- 0xa0, 0x65, 0x90, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x7f, 0x34, 0xbf, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x20, 0x5d, 0x04, 0xbf,
- 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x34, 0xbf,
- 0xa0, 0x65, 0x10, 0x3f, 0x50, 0xa9, 0x70, 0x3f, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x10, 0x6e, 0x1c, 0xbf,
- 0x80, 0x76, 0x28, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x87, 0xc0, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x80, 0x87, 0x40, 0x3e, 0x50, 0xa9, 0x70, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x64, 0x98, 0x58, 0xc0, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0xc2, 0x7a, 0xae, 0xc0, 0x10, 0x6e, 0x1c, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f, 0x7a, 0x63, 0x0d, 0xc0,
- 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x88, 0x76, 0xa8, 0x3f, 0x90, 0x65, 0x10, 0xbf, 0x10, 0x6e, 0x1c, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0x3f,
- 0x60, 0x98, 0xd8, 0xbe, 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xf0, 0x8f, 0xcc, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x28, 0x94, 0xd2, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0x98, 0xd8, 0x3e, 0x98, 0x65, 0x90, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x50, 0xa9, 0x70, 0x3f,
- 0x48, 0x72, 0xa2, 0xbf, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x76, 0xa8, 0xbe,
- 0x20, 0x5d, 0x04, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0xf0, 0x8f, 0x4c, 0x3f,
- 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x3a, 0x83, 0x3a, 0xc0,
- 0x80, 0x87, 0xc0, 0xbd, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x40, 0xa9, 0x70, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0xc0, 0x65, 0x10, 0x3e,
- 0x80, 0x65, 0x10, 0xbe, 0xd8, 0xa0, 0x64, 0xbf, 0xe8, 0x8f, 0x4c, 0xbf,
- 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x90, 0x76, 0x28, 0x3f,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x70, 0x87, 0x40, 0xbf, 0x10, 0x6e, 0x1c, 0x3f, 0xa0, 0x65, 0x90, 0x3e,
- 0x20, 0x5d, 0x04, 0x3f, 0x70, 0x87, 0x40, 0xbf, 0x10, 0x6e, 0x1c, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e,
- 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x04, 0xbf, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0x40, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x10, 0x6e, 0x1c, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x20, 0x5d, 0x84, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x98, 0xd8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x87, 0x40, 0xbd, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d,
- 0x90, 0x65, 0x10, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0x40, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x87, 0xc0, 0xbe,
- 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x87, 0xc0, 0x3d, 0x28, 0x94, 0xd2, 0xbf, 0x00, 0x88, 0x40, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x50, 0xa9, 0x70, 0xbf, 0x60, 0xa9, 0xf0, 0x3e,
- 0x40, 0xa9, 0x70, 0x3e, 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x88, 0x40, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf, 0xa0, 0x65, 0x90, 0xbe,
- 0x20, 0x5d, 0x04, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x7f, 0x34, 0xbf,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0xd4, 0x69, 0x96, 0xbf, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0xd0, 0xb1, 0x7c, 0x3f, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e,
- 0x64, 0x98, 0xd8, 0xbf, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x10, 0x6e, 0x1c, 0x3f,
- 0xe8, 0x8f, 0x4c, 0xbf, 0xc0, 0x65, 0x10, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
- 0x40, 0xa9, 0xf0, 0xbe, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0x40, 0xa9, 0x70, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x76, 0xa8, 0xbe,
- 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0xc0, 0x65, 0x10, 0x3e, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x65, 0x10, 0x3f, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0x28, 0xbf,
- 0xa0, 0x65, 0x90, 0x3e, 0x00, 0x7f, 0x34, 0x3f, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x88, 0x40, 0x3d,
- 0x40, 0xa9, 0xf0, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd, 0x98, 0x65, 0x90, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x60, 0x98, 0x58, 0x3f,
- 0xe8, 0x8f, 0x4c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x60, 0x98, 0xd8, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0x60, 0x98, 0xd8, 0x3e, 0x20, 0x5d, 0x04, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x76, 0xa8, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x50, 0xa9, 0x70, 0xbf,
- 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd, 0x40, 0xa9, 0xf0, 0xbe,
- 0x10, 0x6e, 0x1c, 0xbf, 0x20, 0x5d, 0x04, 0x3f, 0x20, 0x5d, 0x04, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0xfc, 0x7e, 0xb4, 0xbf, 0x80, 0x87, 0x40, 0xbe,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x5d, 0x84, 0xbf, 0x80, 0x87, 0xc0, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x65, 0x10, 0xbe, 0x10, 0x6e, 0x9c, 0xbf, 0x80, 0x87, 0xc0, 0x3d,
- 0x80, 0x87, 0xc0, 0xbd, 0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0xbe,
- 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0x3e, 0x20, 0x5d, 0x04, 0xbf,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x98, 0x65, 0x90, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x87, 0x40, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x7f, 0x34, 0x3f,
- 0x48, 0x72, 0xa2, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x20, 0x5d, 0x04, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
- 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0xa0, 0x65, 0x10, 0x3f,
- 0x70, 0x87, 0x40, 0xbf, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0x3e,
- 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x76, 0xa8, 0x3e, 0x60, 0x87, 0xc0, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0x40, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x60, 0xa9, 0xf0, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x20, 0x5d, 0x04, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0x90, 0x65, 0x10, 0xbf,
- 0x40, 0xa9, 0x70, 0x3e, 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x60, 0xa9, 0xf0, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x10, 0x6e, 0x1c, 0xbf, 0x80, 0x65, 0x10, 0xbe,
- 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x90, 0x76, 0x28, 0x3f,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0xe0, 0xa0, 0x64, 0x3f,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0x61, 0x8a, 0x3f,
- 0x80, 0x76, 0x28, 0xbf, 0x00, 0x87, 0x40, 0xbd, 0x60, 0x98, 0xd8, 0xbe,
- 0x10, 0x6e, 0x1c, 0xbf, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x5c, 0x61, 0x8a, 0xbf,
- 0xa0, 0x65, 0x10, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x90, 0x65, 0x10, 0xbf, 0x80, 0x76, 0xa8, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0xa0, 0x65, 0x90, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0x60, 0x98, 0xd8, 0x3e, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0x40, 0x3e,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0xf0, 0xbe, 0xe0, 0xa0, 0x64, 0x3f,
- 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe, 0xd4, 0x69, 0x96, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x8e, 0xad, 0x76, 0xc0, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x76, 0x87, 0xc0, 0xc0, 0x90, 0x65, 0x10, 0xbf,
- 0x60, 0x98, 0xd8, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x50, 0xa9, 0xf0, 0xbf,
- 0x80, 0x87, 0x40, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x50, 0xa9, 0x70, 0x3f, 0x80, 0x65, 0x10, 0xbe, 0xc8, 0xb1, 0x7c, 0xbf,
- 0x80, 0x76, 0xa8, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0x60, 0xa9, 0xf0, 0x3e,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x65, 0x10, 0xbe, 0x88, 0x76, 0xa8, 0x3f, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0xbe, 0x8c, 0xad, 0xf6, 0xbf, 0xa0, 0x65, 0x90, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x90, 0x3e, 0x20, 0x5d, 0x84, 0x3f, 0x80, 0x87, 0x40, 0x3e,
- 0x50, 0xa9, 0x70, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa9, 0x70, 0xbe,
- 0x60, 0x98, 0xd8, 0xbe, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x76, 0xa8, 0x3e,
- 0x80, 0x87, 0xc0, 0xbd, 0x80, 0x87, 0xc0, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x87, 0xc0, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3e,
- 0x90, 0x65, 0x10, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x69, 0x16, 0xc0,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0xa0, 0x65, 0x90, 0xbe, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x5c, 0x61, 0x8a, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x98, 0xd8, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x60, 0xa9, 0xf0, 0x3e, 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x76, 0xa8, 0x3e,
- 0x60, 0x98, 0x58, 0xbf, 0x90, 0x76, 0x28, 0x3f, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x60, 0x98, 0xd8, 0x3e, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x76, 0xa8, 0x3e, 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0xa0, 0x65, 0x10, 0x3f, 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x65, 0x10, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x60, 0x87, 0xc0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0xbe, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x65, 0x10, 0xbe,
- 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0xc0, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x7f, 0x34, 0xbf, 0x60, 0x98, 0xd8, 0xbe,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0x40, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x80, 0x76, 0xa8, 0xbe, 0x00, 0x87, 0x40, 0xbd, 0x00, 0x88, 0x40, 0x3d,
- 0x90, 0x65, 0x10, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x65, 0x10, 0xbe, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x98, 0xd8, 0xbe, 0x60, 0x87, 0xc0, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xc0, 0x65, 0x10, 0x3e, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x40, 0xbd,
- 0xc0, 0x65, 0x10, 0x3e, 0x60, 0x87, 0xc0, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x70, 0x87, 0x40, 0xbf, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x88, 0x40, 0x3d, 0x40, 0xa9, 0x70, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x65, 0x90, 0x3e, 0x70, 0x87, 0x40, 0xbf,
- 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0x40, 0x3e, 0xc0, 0x65, 0x10, 0x3e,
- 0x10, 0x6e, 0x1c, 0x3f, 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x65, 0x10, 0xbe, 0x80, 0x87, 0xc0, 0x3d,
- 0xec, 0x8f, 0xcc, 0xbf, 0x80, 0x87, 0x40, 0x3e, 0x80, 0x87, 0x40, 0x3e,
- 0x00, 0x88, 0x40, 0x3d, 0x60, 0x87, 0xc0, 0xbe, 0x60, 0x98, 0xd8, 0x3e,
- 0x00, 0x87, 0x40, 0xbd, 0x00, 0x87, 0x40, 0xbd, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x87, 0xc0, 0x3d, 0xc0, 0x65, 0x10, 0x3e, 0x90, 0x76, 0x28, 0x3f,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0x40, 0x3e, 0x00, 0x87, 0x40, 0xbd,
- 0xd8, 0xa0, 0x64, 0xbf, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x98, 0xd8, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0xa0, 0x65, 0x90, 0x3e, 0x80, 0x87, 0xc0, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x00, 0x88, 0x40, 0x3d, 0x80, 0x87, 0xc0, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x60, 0x98, 0x58, 0xbf, 0x60, 0x98, 0xd8, 0xbe, 0x80, 0x65, 0x10, 0xbe,
- 0x00, 0x87, 0x40, 0xbd, 0x60, 0xa9, 0xf0, 0x3e, 0x5c, 0x61, 0x8a, 0xbf,
- 0xc0, 0x65, 0x10, 0x3e, 0x40, 0xa9, 0x70, 0xbe, 0xa0, 0x65, 0x90, 0xbe,
- 0x40, 0xa9, 0x70, 0xbe, 0x80, 0x87, 0xc0, 0xbd, 0xa0, 0x65, 0x90, 0x3e,
- 0x80, 0x87, 0x40, 0x3e, 0x40, 0xa9, 0x70, 0x3e, 0x80, 0x87, 0xc0, 0xbd,
- 0x80, 0x76, 0xa8, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0x00, 0x87, 0x40, 0xbd,
- 0x80, 0x87, 0x40, 0x3e, 0x00, 0x88, 0x40, 0x3d, 0xb6, 0x67, 0x13, 0xc0,
-}};
-const int32_t dnn_hiddenlayer_1_bias__2__cf__2_shape[1] = {115};
-const union {
- uint8_t bytes[460];
- float values[115];
-} dnn_hiddenlayer_1_bias__2__cf__2 = {{
- 0x79, 0x65, 0x22, 0x3d, 0x8e, 0xfa, 0x43, 0xbd, 0x8a, 0x89, 0xd4, 0xbf,
- 0x5b, 0x33, 0xa7, 0x3c, 0x8a, 0x75, 0x40, 0xbe, 0xf7, 0x04, 0xbf, 0xbe,
- 0x86, 0xfd, 0xb2, 0xbf, 0xaa, 0x80, 0x7b, 0xbe, 0x55, 0xab, 0xb4, 0xbf,
- 0x64, 0x26, 0x82, 0xbe, 0x5d, 0x82, 0xcd, 0xbf, 0xf3, 0xd4, 0x38, 0xbf,
- 0xc7, 0x76, 0xbf, 0x3f, 0x9f, 0x27, 0x3c, 0xbe, 0x7c, 0x3c, 0x9e, 0x3f,
- 0x5e, 0x7f, 0x7c, 0x3e, 0x55, 0x54, 0x94, 0xbf, 0x86, 0x1b, 0x80, 0x3e,
- 0x49, 0xe5, 0xef, 0xbf, 0xff, 0xca, 0xb9, 0xbf, 0x28, 0x5a, 0xfc, 0xbf,
- 0xc0, 0xc4, 0x32, 0xbf, 0xba, 0xa1, 0x04, 0x3f, 0xc7, 0x1c, 0xf5, 0xbd,
- 0x9f, 0xe0, 0x7f, 0xbf, 0xea, 0x2b, 0x5e, 0x3f, 0x64, 0x62, 0xcc, 0xbe,
- 0x6b, 0x95, 0x0a, 0x3f, 0x0b, 0xaa, 0xb7, 0x3e, 0xab, 0xf1, 0x79, 0x3f,
- 0x89, 0xe5, 0xf6, 0x3e, 0xb6, 0x96, 0xcc, 0x3e, 0xed, 0xd4, 0x25, 0x3f,
- 0x8c, 0x85, 0xeb, 0xbd, 0x1d, 0x80, 0xb8, 0x3f, 0xf7, 0x3e, 0xce, 0xbe,
- 0x8d, 0x25, 0x97, 0x3d, 0x70, 0xe2, 0xbe, 0xbd, 0x48, 0xd8, 0x40, 0xbe,
- 0x66, 0xe1, 0x09, 0x3e, 0x92, 0xb0, 0x1a, 0x3f, 0x25, 0xe7, 0xb3, 0xbe,
- 0x19, 0x90, 0xf4, 0x3f, 0xd8, 0xf2, 0xdf, 0xbf, 0xce, 0xee, 0x27, 0xbe,
- 0x65, 0x9f, 0xc1, 0xbe, 0xc3, 0x91, 0x7a, 0xbf, 0x83, 0x9b, 0x4a, 0x3f,
- 0x77, 0x7d, 0xab, 0x3d, 0xa0, 0x14, 0xa2, 0xbf, 0x88, 0xb8, 0x9f, 0x3c,
- 0x53, 0x14, 0x12, 0xbe, 0xf2, 0x1c, 0x92, 0xbe, 0xba, 0xcf, 0x87, 0x3e,
- 0x75, 0x16, 0x82, 0xbe, 0x30, 0x3d, 0xf2, 0xbd, 0x20, 0x12, 0x31, 0xbc,
- 0x45, 0x9d, 0x90, 0xbf, 0xd4, 0x9a, 0x11, 0xc0, 0x47, 0xf8, 0x6c, 0x3e,
- 0x94, 0xcb, 0x72, 0xbe, 0x7a, 0x2d, 0x20, 0xbf, 0x50, 0x8f, 0xac, 0x3e,
- 0x5a, 0x80, 0x84, 0xbf, 0xf6, 0x3e, 0x89, 0xbf, 0x97, 0x93, 0xee, 0xbf,
- 0x80, 0xc6, 0xb0, 0x3f, 0xe9, 0x3c, 0xe8, 0xbf, 0x6e, 0x21, 0x06, 0x3e,
- 0x97, 0xf2, 0xcd, 0xbd, 0xf5, 0x2f, 0x62, 0xbf, 0x7f, 0xd7, 0xf1, 0xbd,
- 0x35, 0x48, 0x83, 0x3e, 0xa1, 0xae, 0xcb, 0x3e, 0x00, 0x79, 0xac, 0xbd,
- 0x63, 0xbd, 0x12, 0xbc, 0x67, 0xe3, 0xaf, 0x3f, 0xac, 0x51, 0xf0, 0xbd,
- 0x39, 0x1a, 0xb9, 0xbf, 0xbd, 0xd8, 0x36, 0xc0, 0x80, 0xc8, 0x5c, 0x3f,
- 0xec, 0xbd, 0x61, 0xbf, 0xce, 0xa6, 0x12, 0x3f, 0xad, 0x8a, 0xdd, 0x3e,
- 0x53, 0xc4, 0x59, 0x3e, 0xfe, 0x7f, 0x81, 0xbf, 0x16, 0x55, 0x40, 0xbf,
- 0x43, 0x30, 0xdf, 0x3c, 0xba, 0xf6, 0x5d, 0x3e, 0x13, 0xd8, 0x9d, 0xbe,
- 0xee, 0x41, 0x7d, 0x3f, 0xf5, 0x2c, 0xfc, 0xbe, 0x46, 0xdf, 0x09, 0xbe,
- 0xf3, 0x5a, 0x35, 0x40, 0x30, 0xb4, 0x1c, 0xbe, 0x3e, 0xbf, 0x30, 0x3f,
- 0x86, 0x41, 0x1b, 0x3e, 0x3f, 0x4a, 0xcc, 0x3f, 0x81, 0xce, 0xb7, 0x3f,
- 0xa9, 0xed, 0x55, 0x3f, 0x81, 0xe5, 0x7b, 0x3e, 0x95, 0xdd, 0x8d, 0x3e,
- 0x86, 0x89, 0x77, 0x3f, 0xe6, 0x98, 0x2e, 0x3e, 0xca, 0x82, 0x15, 0xbf,
- 0x3e, 0x96, 0x44, 0xbe, 0x9d, 0xb3, 0xc1, 0x3f, 0x7f, 0x4b, 0xbc, 0x3f,
- 0x98, 0xd3, 0x18, 0x3d, 0xc7, 0xbb, 0x58, 0x3d, 0xb6, 0x7b, 0x8d, 0xbd,
- 0xa9, 0xdf, 0x13, 0xbf, 0x38, 0x16, 0x87, 0xbf, 0x87, 0xaa, 0x35, 0x3f,
- 0xb3, 0x28, 0x33, 0x3f,
-}};
-const int32_t dnn_hiddenlayer_1_kernel__3__cf__3_shape[2] = {117, 115};
-const union {
- uint8_t bytes[53820];
- float values[13455];
-} dnn_hiddenlayer_1_kernel__3__cf__3 = {{
- 0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x08, 0xc2, 0x53, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0xd8, 0x1b, 0x35, 0xbf,
- 0xc0, 0x52, 0xb2, 0x3c, 0xf0, 0xbd, 0x05, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
- 0x30, 0xe7, 0x5e, 0x3e, 0x20, 0xe5, 0xb7, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
- 0x08, 0xc2, 0x53, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0xf0, 0xbd, 0x85, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x14, 0xe3, 0x90, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0xf2, 0x3e, 0x19, 0xbf, 0x80, 0x52, 0xb2, 0xbc,
- 0x30, 0xe7, 0x5e, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
- 0x58, 0x0c, 0x6a, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x3c, 0x08, 0x9c, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x31, 0x75, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0xb8, 0x77, 0xbd, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0xe8, 0xbd, 0x05, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
- 0xa8, 0x75, 0x96, 0xbe, 0xc4, 0x79, 0xe4, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0xb8, 0x77, 0x3d, 0xbe, 0x9c, 0x54, 0xd9, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
- 0xa8, 0x75, 0x96, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
- 0x58, 0x0c, 0xea, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x80, 0x52, 0xb2, 0xbc, 0xb8, 0x77, 0x3d, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0x80, 0x31, 0x75, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x05, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0xe0, 0xbd, 0x85, 0xbd, 0x14, 0xe3, 0x90, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
- 0x34, 0x87, 0x08, 0xbf, 0x65, 0x2d, 0x27, 0xbf, 0x30, 0x08, 0x9c, 0xbd,
- 0x40, 0x08, 0x9c, 0x3d, 0x36, 0x87, 0x08, 0x3f, 0x60, 0x2d, 0x27, 0xbe,
- 0x4a, 0x0a, 0x43, 0x3f, 0xc8, 0x19, 0x0e, 0xbf, 0x80, 0x31, 0xf5, 0xbd,
- 0x40, 0x08, 0x1c, 0x3e, 0x46, 0x89, 0x2f, 0x3f, 0xc0, 0x52, 0xb2, 0x3c,
- 0x00, 0x00, 0x00, 0x00, 0xf8, 0xbf, 0xac, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
- 0xec, 0xbd, 0x85, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0x34, 0xe7, 0xde, 0x3e,
- 0x90, 0x52, 0x32, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x52, 0x32, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x18, 0xe3, 0x10, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x1c, 0x3e,
- 0x90, 0x52, 0xb2, 0x3d, 0xe8, 0xbd, 0x85, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0x74, 0x2f, 0xce, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
- 0xa2, 0xf4, 0x02, 0x3f, 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0x30, 0x08, 0x9c, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0x29, 0x66, 0x4b, 0xbf,
- 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0x48, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x58, 0x0c, 0xea, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x85, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
- 0x88, 0x52, 0x32, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0x58, 0x2b, 0x80, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
- 0xe0, 0x9c, 0xc8, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0xbc,
- 0x3c, 0x08, 0x9c, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
- 0x54, 0x2b, 0x80, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x88, 0x52, 0x32, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0xea, 0xbd, 0x05, 0xbf, 0xf0, 0xbd, 0x85, 0x3d,
- 0x90, 0x31, 0xf5, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x5e, 0xac, 0x13, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
- 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0x5e, 0xbe,
- 0xea, 0xbd, 0x05, 0xbf, 0x6c, 0xae, 0x3a, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
- 0xec, 0xbd, 0x85, 0x3e, 0x7e, 0x50, 0x0b, 0xbf, 0x7c, 0x50, 0x8b, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
- 0x30, 0xe7, 0xde, 0x3d, 0x64, 0x2d, 0xa7, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x90, 0x31, 0xf5, 0x3d, 0xc4, 0x79, 0xe4, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x65, 0x2d, 0x27, 0xbf, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x31, 0xf5, 0xbd,
- 0x00, 0xbe, 0x05, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
- 0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0x3c,
- 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0xde, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
- 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
- 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x68, 0x2d, 0x27, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
- 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0x3c, 0x30, 0x08, 0x9c, 0xbd,
- 0x40, 0xe7, 0x5e, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
- 0x80, 0x50, 0x8b, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
- 0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x88, 0x52, 0x32, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0xe0, 0xbd, 0x05, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
- 0x38, 0x08, 0x1c, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
- 0x38, 0x08, 0x1c, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0xea, 0xbd, 0x05, 0x3f,
- 0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x88, 0x31, 0x75, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0x90, 0x52, 0x32, 0x3e,
- 0x30, 0xe7, 0x5e, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
- 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0xf0, 0xbd, 0x05, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0x32, 0x3e,
- 0x8c, 0x52, 0xb2, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
- 0x10, 0xe3, 0x10, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
- 0x08, 0xc2, 0x53, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0x80, 0x31, 0xf5, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x5e, 0xac, 0x13, 0x3f,
- 0x80, 0x52, 0x32, 0x3c, 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0xb4, 0x77, 0xbd, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x7c, 0x50, 0x8b, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x18, 0xe3, 0x10, 0x3e,
- 0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
- 0xe0, 0x9c, 0x48, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
- 0x80, 0x52, 0x32, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xa0, 0x52, 0x32, 0x3d,
- 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x56, 0x2b, 0x00, 0x3f,
- 0xe0, 0xbd, 0x85, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0x18, 0xe3, 0x10, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd,
- 0x24, 0xe5, 0xb7, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x40, 0xe7, 0x5e, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
- 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
- 0x64, 0x2d, 0xa7, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x74, 0x2f, 0xce, 0x3e,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
- 0x80, 0x52, 0x32, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
- 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
- 0x58, 0x0c, 0x6a, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
- 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
- 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
- 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd, 0x84, 0x31, 0xf5, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x80, 0x52, 0xb2, 0xbc, 0x88, 0x31, 0x75, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
- 0x30, 0xe7, 0xde, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
- 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0x32, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
- 0x30, 0x08, 0x9c, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
- 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
- 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0x30, 0xe7, 0x5e, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x85, 0x3d,
- 0x80, 0x50, 0x8b, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
- 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x05, 0x3e,
- 0x08, 0xc2, 0x53, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
- 0x60, 0x2d, 0x27, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
- 0x80, 0x52, 0x32, 0xbc, 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
- 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
- 0x40, 0x08, 0x1c, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xa8, 0x75, 0x96, 0x3e,
- 0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x31, 0xf5, 0x3d,
- 0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
- 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0x32, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0xbc, 0xb8, 0x77, 0x3d, 0xbe,
- 0x90, 0x52, 0xb2, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x77, 0x3d, 0xbe,
- 0x80, 0x31, 0xf5, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
- 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
- 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
- 0xf0, 0xbd, 0x85, 0x3d, 0xd0, 0x9a, 0x21, 0xbf, 0xf0, 0xbd, 0x85, 0x3d,
- 0x02, 0x41, 0x40, 0x3f, 0x88, 0x52, 0x32, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
- 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
- 0x40, 0x08, 0x1c, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0xd2, 0x9a, 0x21, 0x3f,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0x34, 0x87, 0x08, 0xbf, 0x14, 0xe3, 0x90, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x32, 0xe7, 0x5e, 0x3f, 0xc0, 0x52, 0xb2, 0x3c, 0x84, 0x31, 0xf5, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0x74, 0x2f, 0x4e, 0xbf,
- 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x58, 0x0c, 0x6a, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0x75, 0xbe,
- 0xca, 0x19, 0x0e, 0x3f, 0x80, 0x52, 0x32, 0xbd, 0x12, 0xe3, 0x10, 0xbf,
- 0x40, 0x08, 0x9c, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0xfc, 0xbf, 0xac, 0x3e,
- 0xe0, 0xbd, 0x05, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
- 0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
- 0xe0, 0xbd, 0x85, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0x68, 0x2d, 0x27, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
- 0x68, 0x2d, 0x27, 0x3e, 0xa2, 0xf4, 0x02, 0x3f, 0x08, 0xc2, 0x53, 0x3e,
- 0xe8, 0xbd, 0x05, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x24, 0xe5, 0xb7, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
- 0x5d, 0xac, 0x93, 0x3f, 0x10, 0xe3, 0x10, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0x40, 0xe7, 0x5e, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x0c, 0xea, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
- 0x10, 0xe3, 0x10, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x52, 0x32, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0x34, 0xe7, 0xde, 0x3e, 0x56, 0x2b, 0x00, 0xbf,
- 0x8d, 0x52, 0x32, 0xbf, 0x18, 0xc4, 0xfa, 0xbe, 0xb6, 0x77, 0x3d, 0xbf,
- 0x3c, 0x08, 0x9c, 0xbe, 0x3c, 0x08, 0x1c, 0xbf, 0xe0, 0xbd, 0x85, 0xbd,
- 0x30, 0xe7, 0x5e, 0x3e, 0xaa, 0x75, 0x16, 0x3f, 0x6c, 0xae, 0x3a, 0xbf,
- 0x30, 0xe7, 0xde, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0xb8, 0x77, 0xbd, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
- 0x30, 0xe7, 0x5e, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x88, 0x52, 0x32, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0x86, 0xd1, 0x1e, 0xbf, 0x88, 0x31, 0x75, 0x3e, 0x90, 0x52, 0x32, 0x3e,
- 0x80, 0x31, 0x75, 0xbe, 0x1a, 0x64, 0x24, 0x3f, 0x90, 0x52, 0xb2, 0x3d,
- 0x00, 0xbe, 0x05, 0x3d, 0xdf, 0x9c, 0x48, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x80, 0x31, 0x75, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x8c, 0x52, 0xb2, 0xbe,
- 0xe8, 0xbd, 0x85, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
- 0x36, 0x87, 0x08, 0x3f, 0x40, 0x08, 0x1c, 0x3e, 0xb8, 0x77, 0xbd, 0x3e,
- 0x68, 0x2d, 0x27, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
- 0x88, 0x52, 0x32, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x1c, 0xc4, 0xfa, 0x3e,
- 0x54, 0x2b, 0x80, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x52, 0x32, 0xbe,
- 0x8d, 0x52, 0x32, 0xbf, 0xa8, 0x75, 0x96, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0xbd, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
- 0xe8, 0xbd, 0x05, 0xbe, 0x4c, 0xda, 0x97, 0xbf, 0xb8, 0x77, 0xbd, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0xc4, 0x79, 0xe4, 0x3e,
- 0xc0, 0x52, 0xb2, 0x3c, 0x08, 0xc2, 0xd3, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x08, 0xc2, 0x53, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x9c, 0x54, 0xd9, 0x3e, 0xf2, 0x3e, 0x19, 0xbf,
- 0xfc, 0xbf, 0xac, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0xa2, 0xf4, 0x02, 0x3f,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
- 0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0x3c,
- 0x30, 0xe7, 0xde, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
- 0x58, 0x2b, 0x80, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0x90, 0x52, 0xb2, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3e,
- 0x90, 0x31, 0xf5, 0x3d, 0xb6, 0x77, 0x3d, 0xbf, 0x60, 0x2d, 0x27, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0x58, 0x0c, 0x6a, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0xa0, 0xf4, 0x02, 0xbf, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0x90, 0x52, 0xb2, 0xbd, 0x88, 0x31, 0x75, 0x3e, 0x9c, 0x54, 0xd9, 0x3e,
- 0x54, 0x2b, 0x80, 0xbe, 0x65, 0x2d, 0x27, 0xbf, 0x54, 0x2b, 0x80, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x64, 0x2d, 0xa7, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
- 0x14, 0xe3, 0x90, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0x3c, 0x08, 0x9c, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x3c, 0x08, 0x9c, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
- 0x30, 0xe7, 0xde, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x4c, 0x0a, 0xc3, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0xb4, 0x77, 0xbd, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
- 0x80, 0x31, 0xf5, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x80, 0x50, 0x8b, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
- 0x38, 0x08, 0x1c, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x14, 0xe3, 0x90, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
- 0x80, 0x52, 0x32, 0xbc, 0x00, 0xbe, 0x05, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
- 0x30, 0xe7, 0xde, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x88, 0x52, 0x32, 0xbe,
- 0x80, 0x31, 0x75, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
- 0x58, 0x0c, 0x6a, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x52, 0x32, 0x3c,
- 0x30, 0xe7, 0xde, 0x3d, 0x3c, 0x08, 0x9c, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x80, 0x52, 0x32, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x64, 0x2d, 0xa7, 0xbe,
- 0x08, 0xc2, 0x53, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
- 0x20, 0xe7, 0x5e, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0x5e, 0x3e,
- 0x9c, 0x54, 0xd9, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0x5e, 0xac, 0x13, 0xbf,
- 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
- 0xa8, 0x75, 0x16, 0xbf, 0x88, 0x31, 0x75, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x30, 0xe7, 0xde, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x14, 0xe3, 0x90, 0x3e,
- 0x30, 0xe7, 0x5e, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
- 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x64, 0x2d, 0xa7, 0xbe,
- 0x90, 0x52, 0xb2, 0xbd, 0x6c, 0xae, 0x3a, 0xbf, 0x1a, 0x64, 0x24, 0xbf,
- 0x80, 0x52, 0x32, 0xbd, 0x6c, 0xae, 0x3a, 0xbf, 0xc4, 0x79, 0xe4, 0xbe,
- 0x08, 0xc2, 0x53, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x8c, 0x52, 0xb2, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0xc5, 0x79, 0x64, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x31, 0x75, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x43, 0x89, 0x2f, 0xbf,
- 0x7c, 0x50, 0x8b, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
- 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x31, 0x75, 0xbe,
- 0xb8, 0x77, 0x3d, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
- 0xea, 0xbd, 0x05, 0xbf, 0xa0, 0x52, 0x32, 0x3d, 0x9c, 0x54, 0xd9, 0xbe,
- 0x30, 0xe7, 0x5e, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x58, 0x0c, 0x6a, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
- 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
- 0xc0, 0x52, 0xb2, 0x3c, 0x08, 0xc2, 0x53, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
- 0xec, 0xbd, 0x85, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0xc4, 0x79, 0xe4, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0x8d, 0x52, 0x32, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
- 0x74, 0x2f, 0xce, 0xbe, 0x18, 0xc4, 0xfa, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0xa8, 0x75, 0x96, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x74, 0x2f, 0x4e, 0xbf,
- 0x38, 0x08, 0x1c, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
- 0xb4, 0x77, 0xbd, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x88, 0x52, 0x32, 0xbe,
- 0x7c, 0x50, 0x8b, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
- 0x34, 0x87, 0x08, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0x32, 0xbc,
- 0x84, 0x31, 0xf5, 0x3e, 0xe8, 0xbd, 0x85, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xc8, 0x19, 0x0e, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
- 0x3c, 0x08, 0x9c, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
- 0xb8, 0x77, 0x3d, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
- 0xb6, 0x77, 0x3d, 0xbf, 0x20, 0xe5, 0xb7, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
- 0x88, 0x52, 0x32, 0xbe, 0x18, 0xc4, 0xfa, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
- 0xf0, 0xbd, 0x85, 0x3d, 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x22, 0xe5, 0x37, 0xbf, 0xa8, 0x75, 0x96, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0x40, 0x08, 0x1c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
- 0x88, 0x52, 0x32, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
- 0x80, 0x52, 0x32, 0x3c, 0x90, 0x31, 0xf5, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe,
- 0xfc, 0xbf, 0xac, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x88, 0x52, 0x32, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0x58, 0x0c, 0xea, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0x08, 0xc2, 0x53, 0xbe, 0x29, 0x66, 0x4b, 0xbf, 0x58, 0x0c, 0x6a, 0xbe,
- 0xa8, 0x75, 0x96, 0xbe, 0xea, 0xbd, 0x05, 0xbf, 0xb8, 0x77, 0x3d, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0x9c, 0x54, 0xd9, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0x30, 0xe7, 0x5e, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0x4c, 0x0a, 0xc3, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0xf8, 0xbf, 0xac, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x20, 0xe5, 0xb7, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x34, 0xe7, 0xde, 0x3e,
- 0x8c, 0x52, 0xb2, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x22, 0xe5, 0x37, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0xf2, 0x3e, 0x19, 0xbf, 0x00, 0xbe, 0x05, 0x3d,
- 0xf0, 0xbd, 0x85, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0xa8, 0x75, 0x96, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbc,
- 0x30, 0xe7, 0xde, 0xbd, 0xc4, 0x79, 0xe4, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
- 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x08, 0xc2, 0xd3, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0xf9, 0xbf, 0x2c, 0xbf,
- 0x80, 0x31, 0x75, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x88, 0x31, 0x75, 0x3e,
- 0x80, 0x52, 0x32, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
- 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x31, 0xf5, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0xa0, 0xf4, 0x02, 0xbf, 0x38, 0x08, 0x1c, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0x5e, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x60, 0x2d, 0x27, 0xbe,
- 0x7c, 0x50, 0x8b, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xca, 0x19, 0x0e, 0x3f,
- 0x88, 0x31, 0x75, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0xb8, 0x77, 0x3d, 0x3e,
- 0xe0, 0x9c, 0x48, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
- 0x18, 0xe3, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbd, 0x05, 0x3e,
- 0x08, 0xc2, 0x53, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0xb8, 0x77, 0x3d, 0x3e,
- 0x80, 0x52, 0x32, 0xbc, 0x46, 0x89, 0x2f, 0x3f, 0x40, 0x08, 0x9c, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0x32, 0x3e, 0x74, 0x2f, 0xce, 0xbe,
- 0x86, 0xd1, 0x1e, 0xbf, 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0xb4, 0x77, 0xbd, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xa8, 0x75, 0x96, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x68, 0x2d, 0x27, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
- 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0xe0, 0x9c, 0x48, 0xbe, 0x7e, 0x50, 0x0b, 0xbf, 0x58, 0x0c, 0x6a, 0xbe,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xb8, 0x77, 0xbd, 0x3e,
- 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x7c, 0x50, 0x8b, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x50, 0x8b, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
- 0x30, 0x08, 0x9c, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xca, 0x19, 0x0e, 0x3f, 0x3c, 0x08, 0x9c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
- 0x3c, 0x08, 0x9c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0x8c, 0x52, 0xb2, 0xbe, 0x24, 0xe5, 0xb7, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
- 0xd0, 0x9a, 0xa1, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
- 0x0c, 0xc2, 0xd3, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
- 0xe8, 0xbd, 0x05, 0xbe, 0x56, 0x2b, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x50, 0x8b, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
- 0xa0, 0x52, 0x32, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0xe4, 0x9c, 0xc8, 0x3e,
- 0x14, 0xe3, 0x90, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
- 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0x3d, 0xa8, 0x75, 0x96, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
- 0xe0, 0x9c, 0x48, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0xec, 0x9e, 0xef, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0xde, 0xbe,
- 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0xea, 0xbd, 0x05, 0xbf, 0x3c, 0x08, 0x9c, 0xbe,
- 0x7e, 0x50, 0x0b, 0xbf, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x50, 0x8b, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0x30, 0xe7, 0xde, 0xbd, 0x4c, 0x0a, 0xc3, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
- 0x86, 0xd1, 0x1e, 0xbf, 0x80, 0x31, 0xf5, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
- 0x18, 0xe3, 0x10, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x60, 0x0c, 0x6a, 0x3e,
- 0x58, 0x0c, 0xea, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
- 0x18, 0xc4, 0xfa, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0xc8, 0x19, 0x0e, 0xbf,
- 0x20, 0xe5, 0xb7, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0xc4, 0x79, 0xe4, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x5a, 0x0c, 0x6a, 0xbf,
- 0x80, 0x52, 0x32, 0xbc, 0xf0, 0xbd, 0x85, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0x90, 0x52, 0x32, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x34, 0xe7, 0xde, 0x3e,
- 0x20, 0xe5, 0xb7, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0x3d,
- 0xa8, 0x75, 0x96, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x54, 0x2b, 0x80, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x85, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0x38, 0x08, 0x1c, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xf8, 0xbf, 0xac, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x31, 0x75, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x8c, 0x52, 0xb2, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x34, 0x87, 0x08, 0xbf,
- 0x3c, 0x08, 0x9c, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
- 0xf2, 0x3e, 0x19, 0xbf, 0xe8, 0xbd, 0x85, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
- 0x8c, 0x52, 0xb2, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
- 0x60, 0x0c, 0x6a, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0xf8, 0xbf, 0xac, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
- 0x14, 0xe3, 0x90, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x54, 0x2b, 0x80, 0xbe,
- 0x08, 0xc2, 0xd3, 0xbe, 0x86, 0xd1, 0x1e, 0xbf, 0xf8, 0xbf, 0xac, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x50, 0x8b, 0xbe,
- 0x5a, 0x0c, 0x6a, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0xbd,
- 0x30, 0xe7, 0xde, 0x3d, 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0x30, 0x08, 0x9c, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x31, 0x75, 0xbe,
- 0xfa, 0xbf, 0x2c, 0x3f, 0x20, 0xe5, 0xb7, 0xbe, 0x5a, 0x0c, 0x6a, 0xbf,
- 0xf0, 0xbd, 0x85, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x56, 0x2b, 0x00, 0xbf, 0x30, 0x08, 0x9c, 0xbd,
- 0x7e, 0x50, 0x8b, 0xbf, 0xa8, 0x75, 0x96, 0x3e, 0xd2, 0x9a, 0x21, 0x3f,
- 0x6c, 0xae, 0x3a, 0xbf, 0x08, 0xc2, 0x53, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe,
- 0xe8, 0xbd, 0x05, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xa8, 0x75, 0x96, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
- 0x3c, 0x08, 0x9c, 0xbf, 0x4c, 0x0a, 0xc3, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
- 0x68, 0x2d, 0x27, 0x3e, 0xb4, 0x77, 0xbd, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
- 0x90, 0x31, 0xf5, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0xe4, 0x9c, 0xc8, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
- 0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0x5e, 0x3e, 0xc8, 0x19, 0x0e, 0xbf,
- 0x3c, 0x08, 0x9c, 0xbe, 0x34, 0x87, 0x08, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0xd0, 0x9a, 0x21, 0xbf,
- 0x30, 0xe7, 0x5e, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
- 0x5e, 0xac, 0x13, 0xbf, 0x80, 0x31, 0xf5, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
- 0x12, 0xe3, 0x10, 0xbf, 0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0x10, 0xe3, 0x10, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
- 0xe0, 0x9c, 0x48, 0xbe, 0x22, 0xe5, 0x37, 0xbf, 0x95, 0xd3, 0x45, 0xbf,
- 0xec, 0x9e, 0xef, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
- 0xa8, 0x75, 0x96, 0xbe, 0xb8, 0x77, 0xbd, 0x3e, 0x29, 0x66, 0x4b, 0xbf,
- 0x20, 0xe5, 0xb7, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x5c, 0x0c, 0xea, 0x3e,
- 0x14, 0xe3, 0x90, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x24, 0xe5, 0xb7, 0x3e,
- 0xc4, 0x79, 0xe4, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0x60, 0x0c, 0x6a, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
- 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x31, 0xf5, 0x3d, 0x3c, 0x08, 0x9c, 0xbe,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x50, 0x8b, 0x3e,
- 0x88, 0x31, 0x75, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x3c, 0x08, 0x1c, 0xbf, 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
- 0x54, 0x2b, 0x80, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0xb6, 0x77, 0x3d, 0xbf, 0x18, 0xe3, 0x10, 0x3e,
- 0xe0, 0xbd, 0x85, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0x90, 0x52, 0xb2, 0x3e,
- 0x90, 0x52, 0xb2, 0x3d, 0xb6, 0x77, 0x3d, 0xbf, 0x80, 0x31, 0xf5, 0xbd,
- 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
- 0x88, 0x52, 0x32, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0xec, 0x9e, 0xef, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
- 0xe0, 0x9c, 0x48, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
- 0x90, 0x52, 0x32, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x30, 0xe7, 0x5e, 0x3e,
- 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
- 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
- 0x80, 0x52, 0xb2, 0xbc, 0xe8, 0xbd, 0x85, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0x60, 0x0c, 0x6a, 0x3e, 0xaf, 0xf6, 0x29, 0xbf, 0xf0, 0xbd, 0x05, 0x3e,
- 0xf8, 0xbf, 0xac, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x7e, 0x50, 0x0b, 0x3f,
- 0x90, 0x52, 0xb2, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0x68, 0x2d, 0xa7, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
- 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0x5e, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
- 0xa8, 0x75, 0x16, 0xbf, 0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0x68, 0x2d, 0xa7, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
- 0x80, 0x52, 0x32, 0xbc, 0xd0, 0x9a, 0xa1, 0xbe, 0xea, 0xbd, 0x85, 0xbf,
- 0x40, 0x08, 0x1c, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
- 0xc0, 0x52, 0xb2, 0x3c, 0x74, 0x2f, 0xce, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x30, 0xe7, 0xde, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x9c, 0x3d,
- 0xe0, 0xbd, 0x05, 0xbd, 0x7e, 0x50, 0x0b, 0xbf, 0xe0, 0x9c, 0x48, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x31, 0x75, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0xa8, 0x75, 0x96, 0x3e,
- 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0x8c, 0x52, 0xb2, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e,
- 0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
- 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0xa8, 0x75, 0x96, 0xbe,
- 0xec, 0xbd, 0x85, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
- 0x3c, 0x08, 0x9c, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0xb8, 0x77, 0xbd, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0xe0, 0xbd, 0x05, 0xbd, 0x14, 0xe3, 0x90, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
- 0xe0, 0x9c, 0x48, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
- 0x40, 0x08, 0x9c, 0x3d, 0x84, 0x31, 0xf5, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
- 0x68, 0x2d, 0x27, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0x5e, 0x3e,
- 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
- 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x84, 0x31, 0xf5, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
- 0xe0, 0xbd, 0x85, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x08, 0xc2, 0xd3, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
- 0xe8, 0xbd, 0x05, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
- 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
- 0x60, 0x2d, 0x27, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x68, 0x2d, 0xa7, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3e,
- 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x31, 0x75, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x68, 0x2d, 0x27, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0x3c,
- 0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x0c, 0x6a, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x58, 0x0c, 0x6a, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0x90, 0x52, 0xb2, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
- 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
- 0x60, 0x2d, 0x27, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
- 0x58, 0x2b, 0x80, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0x90, 0x52, 0xb2, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x00, 0xbe, 0x05, 0x3d, 0x8c, 0x52, 0xb2, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x05, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
- 0x30, 0x08, 0x9c, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x77, 0x3d, 0x3e,
- 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
- 0x80, 0x50, 0x8b, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x08, 0xc2, 0x53, 0xbe,
- 0x08, 0xc2, 0x53, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
- 0xe0, 0x9c, 0x48, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
- 0x80, 0x52, 0x32, 0xbd, 0xf8, 0xbf, 0xac, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
- 0x9c, 0x54, 0xd9, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
- 0xf0, 0xbd, 0x05, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0x48, 0xbe,
- 0x74, 0x2f, 0xce, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
- 0x43, 0x89, 0x2f, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0xa8, 0x75, 0x16, 0xbf,
- 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x17, 0xc4, 0x7a, 0xbf,
- 0x8c, 0x52, 0xb2, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
- 0x74, 0x2f, 0xce, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0xde, 0xbd,
- 0xf0, 0xbd, 0x05, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x50, 0x8b, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0x48, 0x3e,
- 0x88, 0x31, 0x75, 0x3e, 0xf2, 0x3e, 0x19, 0xbf, 0xb4, 0x77, 0xbd, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0x6c, 0xae, 0x3a, 0xbf, 0x80, 0x52, 0x32, 0xbc,
- 0x00, 0xbe, 0x05, 0x3d, 0xa8, 0x75, 0x96, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
- 0xf0, 0xbd, 0x05, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
- 0x8c, 0x52, 0xb2, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xea, 0xbd, 0x05, 0xbf,
- 0xec, 0xbd, 0x85, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x88, 0x31, 0x75, 0x3e,
- 0xe0, 0x9c, 0x48, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x08, 0xc2, 0xd3, 0xbe,
- 0x58, 0x2b, 0x80, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0xb4, 0x77, 0xbd, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
- 0xc0, 0x52, 0xb2, 0x3c, 0xc0, 0x52, 0xb2, 0x3c, 0x20, 0xe7, 0x5e, 0xbd,
- 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0x48, 0x3e, 0xa8, 0x75, 0x16, 0xbf,
- 0x90, 0x52, 0x32, 0x3e, 0xa8, 0x75, 0x16, 0xbf, 0x80, 0x31, 0x75, 0xbe,
- 0x80, 0x50, 0x8b, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x08, 0xc2, 0xd3, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
- 0xb8, 0x77, 0xbd, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
- 0x5e, 0xac, 0x13, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0x3c, 0x08, 0x1c, 0xbf, 0x60, 0x0c, 0x6a, 0x3e,
- 0x20, 0xe5, 0xb7, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
- 0x9c, 0x54, 0xd9, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0x32, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0x74, 0x2f, 0xce, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
- 0xe0, 0x9c, 0x48, 0xbe, 0xf2, 0x3e, 0x19, 0xbf, 0xb8, 0x77, 0x3d, 0x3e,
- 0x34, 0xe7, 0xde, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0xa2, 0xf4, 0x02, 0x3f,
- 0x80, 0x52, 0xb2, 0xbc, 0x56, 0x2b, 0x00, 0x3f, 0x20, 0xe7, 0x5e, 0xbd,
- 0x80, 0x50, 0x8b, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0xc8, 0x19, 0x0e, 0xbf,
- 0x80, 0x50, 0x8b, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x31, 0x75, 0xbe,
- 0x18, 0xc4, 0xfa, 0xbe, 0xa8, 0x75, 0x16, 0xbf, 0x40, 0x08, 0x9c, 0x3d,
- 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0xbe, 0xf8, 0x50, 0xbf, 0xbe, 0xf8, 0x50, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x08, 0xc2, 0x53, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
- 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbd,
- 0x90, 0x52, 0x32, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
- 0xfc, 0xbf, 0xac, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
- 0x7c, 0x50, 0x8b, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0x08, 0xc2, 0x53, 0x3e,
- 0xe4, 0x9c, 0xc8, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x88, 0x52, 0x32, 0xbe,
- 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0xb8, 0x77, 0x3d, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0x80, 0x52, 0x32, 0xbc,
- 0x74, 0x2f, 0xce, 0x3e, 0x68, 0x2d, 0xa7, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
- 0x30, 0xe7, 0x5e, 0x3e, 0x68, 0x2d, 0xa7, 0x3e, 0x88, 0x52, 0x32, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0x8c, 0x52, 0xb2, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x68, 0x2d, 0x27, 0x3e,
- 0x30, 0x08, 0x9c, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
- 0xec, 0xbd, 0x85, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0xf2, 0x3e, 0x19, 0x3f, 0x80, 0x31, 0x75, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x14, 0xe3, 0x90, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0x3c,
- 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
- 0xa2, 0xf4, 0x02, 0x3f, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
- 0x90, 0x31, 0xf5, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0x8c, 0x52, 0xb2, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
- 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
- 0x90, 0x52, 0xb2, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x58, 0x0c, 0x6a, 0xbe,
- 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x74, 0x2f, 0xce, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
- 0x68, 0x2d, 0x27, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x30, 0x08, 0x9c, 0xbd,
- 0x30, 0xe7, 0xde, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0x32, 0x3e,
- 0x08, 0xc2, 0x53, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
- 0xa0, 0x52, 0x32, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
- 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
- 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
- 0x30, 0xe7, 0x5e, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
- 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
- 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xf0, 0xbd, 0x85, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x88, 0x52, 0x32, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
- 0x40, 0x08, 0x9c, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
- 0x34, 0x87, 0x08, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
- 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
- 0x24, 0xe5, 0xb7, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
- 0x14, 0xe3, 0x90, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0x3d,
- 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
- 0x30, 0xe7, 0xde, 0x3d, 0xec, 0xbd, 0x85, 0x3e, 0xb8, 0x77, 0x3d, 0x3e,
- 0x90, 0x31, 0xf5, 0x3d, 0xec, 0x9e, 0xef, 0xbe, 0x88, 0x31, 0x75, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
- 0x88, 0x52, 0x32, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
- 0x80, 0x52, 0x32, 0xbc, 0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xa0, 0x52, 0x32, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0xca, 0x19, 0x0e, 0x3f, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0x90, 0x52, 0xb2, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
- 0x30, 0xe7, 0xde, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0xf0, 0xbd, 0x85, 0x3d,
- 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x24, 0xe5, 0xb7, 0x3e,
- 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
- 0xe0, 0xbd, 0x85, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x52, 0x32, 0x3c,
- 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
- 0xb8, 0x77, 0xbd, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e,
- 0xf0, 0xbd, 0x85, 0x3d, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
- 0x80, 0x31, 0xf5, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0x3c,
- 0xb8, 0x77, 0x3d, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0xd0, 0x9a, 0xa1, 0x3e,
- 0x40, 0x08, 0x9c, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
- 0x14, 0xe3, 0x90, 0x3e, 0x56, 0x2b, 0x00, 0xbf, 0x58, 0x0c, 0x6a, 0xbe,
- 0xea, 0xbd, 0x05, 0xbf, 0x18, 0xc4, 0xfa, 0xbe, 0xea, 0xbd, 0x05, 0xbf,
- 0x80, 0x52, 0x32, 0x3c, 0xec, 0xbd, 0x85, 0x3e, 0x6c, 0xae, 0x3a, 0xbf,
- 0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x52, 0x32, 0x3c,
- 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x00, 0x00, 0x00, 0x00,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
- 0x80, 0x31, 0x75, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
- 0x38, 0x08, 0x1c, 0xbe, 0x86, 0xd1, 0x1e, 0xbf, 0x30, 0xe7, 0xde, 0x3d,
- 0x08, 0xc2, 0xd3, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0x40, 0xe7, 0x5e, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
- 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x14, 0xe3, 0x90, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0x3d,
- 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x88, 0x31, 0x75, 0x3e,
- 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x7c, 0x50, 0x8b, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0xc4, 0x79, 0xe4, 0xbe,
- 0x3c, 0x08, 0x9c, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xfc, 0xbf, 0xac, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
- 0xa0, 0x52, 0x32, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
- 0xea, 0xbd, 0x05, 0xbf, 0x30, 0xe7, 0xde, 0xbd, 0x74, 0x2f, 0xce, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0xb8, 0x77, 0x3d, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0x80, 0x31, 0xf5, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0x30, 0x08, 0x9c, 0xbd, 0xa8, 0x75, 0x96, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0x3c, 0x08, 0x1c, 0xbf, 0x30, 0x08, 0x9c, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
- 0x80, 0x31, 0xf5, 0xbd, 0x08, 0xc2, 0xd3, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0xe8, 0xbd, 0x05, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xf8, 0xbf, 0xac, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x30, 0xe7, 0x5e, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbd,
- 0xb8, 0x77, 0x3d, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x88, 0x31, 0x75, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0xb4, 0x77, 0xbd, 0xbe,
- 0x3c, 0x08, 0x1c, 0xbf, 0x7e, 0x50, 0x0b, 0xbf, 0x90, 0x52, 0xb2, 0x3e,
- 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x14, 0xe3, 0x90, 0xbe,
- 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x74, 0x2f, 0x4e, 0xbf,
- 0x88, 0x31, 0x75, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0xaf, 0xf6, 0x29, 0xbf,
- 0x34, 0x87, 0x08, 0xbf, 0xec, 0xbd, 0x85, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
- 0x1a, 0x64, 0x24, 0xbf, 0x1a, 0x64, 0x24, 0x3f, 0xa8, 0x75, 0x96, 0xbe,
- 0xc4, 0x79, 0xe4, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
- 0x80, 0x50, 0x8b, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0xec, 0x9e, 0xef, 0xbe,
- 0x1a, 0x64, 0x24, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d, 0x74, 0x2f, 0xce, 0xbe,
- 0x68, 0x2d, 0xa7, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x58, 0x2b, 0x80, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbd,
- 0x38, 0x08, 0x1c, 0xbe, 0x08, 0xc2, 0x53, 0xbf, 0x29, 0x66, 0x4b, 0xbf,
- 0x34, 0xe7, 0xde, 0x3e, 0x7b, 0xb0, 0x61, 0xbf, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x18, 0xc4, 0xfa, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
- 0x30, 0xe7, 0x5e, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0x32, 0x3e,
- 0x80, 0x52, 0x32, 0x3c, 0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
- 0x7c, 0x50, 0x8b, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x56, 0x2b, 0x00, 0xbf, 0x65, 0x2d, 0x27, 0xbf, 0x30, 0xe7, 0x5e, 0x3e,
- 0x18, 0xc4, 0xfa, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0xec, 0x9e, 0xef, 0xbe, 0xec, 0x9e, 0xef, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
- 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0xb2, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
- 0x68, 0x2d, 0x27, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0x38, 0x68, 0x72, 0xbf,
- 0x3c, 0x08, 0x9c, 0x3e, 0xf8, 0xbf, 0xac, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
- 0x4c, 0x0a, 0xc3, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x4c, 0x0a, 0xc3, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
- 0xa0, 0xf4, 0x02, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe,
- 0x08, 0xc2, 0xd3, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x00, 0x41, 0x40, 0xbf,
- 0xa0, 0x52, 0x32, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x58, 0x0c, 0xea, 0xbe, 0x65, 0x2d, 0x27, 0xbf, 0x65, 0x2d, 0x27, 0xbf,
- 0x80, 0x31, 0xf5, 0xbd, 0x68, 0x2d, 0xa7, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
- 0xec, 0x9e, 0xef, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
- 0x8d, 0x52, 0x32, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
- 0x74, 0x2f, 0xce, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
- 0x12, 0xe3, 0x10, 0xbf, 0xd0, 0x9a, 0x21, 0xbf, 0x40, 0xe7, 0x5e, 0x3d,
- 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x8c, 0x52, 0xb2, 0xbe,
- 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x52, 0x32, 0xbc, 0x12, 0xe3, 0x10, 0xbf, 0xc0, 0x52, 0xb2, 0x3c,
- 0x80, 0x52, 0x32, 0xbc, 0x5e, 0xac, 0x13, 0x3f, 0xf9, 0xbf, 0x2c, 0xbf,
- 0xa8, 0x75, 0x16, 0xbf, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x20, 0xe5, 0xb7, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0x18, 0xe3, 0x10, 0x3e, 0x9c, 0x54, 0xd9, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0xb8, 0x77, 0x3d, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbd,
- 0x58, 0x0c, 0xea, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
- 0xa8, 0x75, 0x96, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
- 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
- 0xea, 0xbd, 0x05, 0xbf, 0x58, 0x0c, 0xea, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
- 0xc8, 0x19, 0x0e, 0xbf, 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x90, 0x31, 0xf5, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0x86, 0xd1, 0x1e, 0xbf,
- 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x80, 0x52, 0x32, 0xbc, 0x40, 0xe7, 0x5e, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0xa0, 0xf4, 0x02, 0xbf, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
- 0xe8, 0xbd, 0x85, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x60, 0x0c, 0x6a, 0x3e,
- 0xe7, 0x1d, 0x5c, 0xbf, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0xbd,
- 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
- 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xb8, 0x77, 0x3d, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x88, 0x31, 0x75, 0x3e,
- 0x40, 0x08, 0x9c, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xe8, 0xbd, 0x85, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
- 0xf8, 0xbf, 0xac, 0xbe, 0xc4, 0x79, 0xe4, 0xbe, 0x7e, 0x50, 0x0b, 0xbf,
- 0x3c, 0x08, 0x9c, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
- 0x40, 0x08, 0x1c, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x52, 0x32, 0x3c,
- 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x14, 0xe3, 0x90, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x84, 0x31, 0xf5, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x9c, 0x54, 0xd9, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0xf8, 0xbf, 0xac, 0xbe,
- 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xea, 0xbd, 0x05, 0x3f,
- 0x08, 0xc2, 0x53, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0xb4, 0x77, 0xbd, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbd,
- 0x84, 0x31, 0xf5, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0x32, 0x3e,
- 0xe0, 0xbd, 0x85, 0xbd, 0x5e, 0xac, 0x13, 0xbf, 0x08, 0xc2, 0x53, 0xbe,
- 0xf2, 0x3e, 0x19, 0x3f, 0x80, 0x52, 0x32, 0x3c, 0xb8, 0x77, 0x3d, 0x3e,
- 0x80, 0x31, 0x75, 0xbe, 0x86, 0xd1, 0x1e, 0xbf, 0xf2, 0x3e, 0x19, 0xbf,
- 0x22, 0xe5, 0x37, 0xbf, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0x32, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
- 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x30, 0xe7, 0xde, 0x3d, 0xb4, 0x77, 0xbd, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
- 0x5e, 0xac, 0x13, 0xbf, 0x68, 0x2d, 0xa7, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
- 0xc0, 0x52, 0xb2, 0x3c, 0x60, 0x2d, 0x27, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0x32, 0x3e,
- 0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x3e, 0x08, 0x1c, 0x3f,
- 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x88, 0x52, 0x32, 0xbe,
- 0xc8, 0x19, 0x0e, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0xf0, 0xbd, 0x05, 0x3e,
- 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0xb4, 0x77, 0xbd, 0xbe,
- 0xb8, 0x77, 0x3d, 0x3e, 0xaf, 0xf6, 0x29, 0xbf, 0x90, 0x52, 0xb2, 0x3d,
- 0x80, 0x31, 0xf5, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x14, 0xe3, 0x90, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbe, 0x36, 0x87, 0x08, 0x3f, 0x8d, 0x52, 0x32, 0xbf,
- 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0xe0, 0x9c, 0x48, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0xfc, 0xbf, 0xac, 0x3e,
- 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
- 0x7e, 0x50, 0x8b, 0xbf, 0xf2, 0x3e, 0x19, 0xbf, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x5c, 0x0c, 0xea, 0x3e,
- 0x80, 0x31, 0x75, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x45, 0x59, 0x84, 0xbf, 0x08, 0xc2, 0xd3, 0xbe,
- 0x74, 0x2f, 0xce, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
- 0x3c, 0x08, 0x9c, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
- 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0xbc,
- 0x08, 0xc2, 0x53, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
- 0x08, 0xc2, 0x53, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
- 0xc8, 0x19, 0x0e, 0xbf, 0x34, 0xe7, 0xde, 0x3e, 0x34, 0x87, 0x88, 0xbf,
- 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0xe7, 0x5e, 0x3d, 0x58, 0x0c, 0x6a, 0xbe,
- 0xa2, 0xf4, 0x02, 0x3f, 0x10, 0xe3, 0x10, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
- 0xec, 0xbd, 0x85, 0x3e, 0xc4, 0x79, 0xe4, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
- 0x86, 0xd1, 0x1e, 0xbf, 0xec, 0x9e, 0xef, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x84, 0x31, 0xf5, 0x3e,
- 0x58, 0x2b, 0x80, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0xbd, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x41, 0x40, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x24, 0xe5, 0xb7, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
- 0x88, 0x31, 0x75, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x68, 0x2d, 0xa7, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
- 0xe0, 0xbd, 0x85, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
- 0x68, 0x2d, 0x27, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0xf0, 0xbd, 0x05, 0x3e, 0x58, 0x0c, 0xea, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0x20, 0xe5, 0xb7, 0xbe, 0x5c, 0x0c, 0xea, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
- 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x86, 0xd1, 0x1e, 0x3f,
- 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
- 0x14, 0xe3, 0x90, 0x3e, 0x43, 0x89, 0x2f, 0xbf, 0xe8, 0xbd, 0x85, 0xbe,
- 0x68, 0x2d, 0x27, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
- 0xe8, 0xbd, 0x05, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0xb4, 0x77, 0xbd, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e, 0xc5, 0x79, 0x64, 0xbf,
- 0x30, 0xe7, 0xde, 0xbd, 0xc4, 0x79, 0xe4, 0x3e, 0x56, 0x2b, 0x00, 0x3f,
- 0x3c, 0x08, 0x9c, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
- 0x12, 0xe3, 0x10, 0x3f, 0xe0, 0x9c, 0xc8, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0xec, 0xbd, 0x85, 0x3e, 0x9c, 0x54, 0xd9, 0x3e, 0x80, 0x52, 0x32, 0xbc,
- 0x10, 0xe3, 0x10, 0xbe, 0x5c, 0x0c, 0xea, 0x3e, 0x80, 0x31, 0x75, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
- 0x80, 0x31, 0xf5, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x56, 0x2b, 0x00, 0xbf,
- 0x08, 0xc2, 0x53, 0x3e, 0x1a, 0x64, 0x24, 0xbf, 0x80, 0x52, 0x32, 0x3c,
- 0x12, 0xe3, 0x10, 0xbf, 0x24, 0xe5, 0xb7, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
- 0x90, 0x52, 0xb2, 0x3e, 0x90, 0x22, 0x87, 0xbf, 0xb8, 0x77, 0x3d, 0xbe,
- 0x08, 0xc2, 0x53, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x3c, 0x08, 0x9c, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
- 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x74, 0x2f, 0xce, 0x3e,
- 0xe0, 0x9c, 0x48, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
- 0xca, 0x19, 0x0e, 0x3f, 0xe0, 0x9c, 0xc8, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x80, 0x52, 0x32, 0x3c, 0x40, 0xe7, 0x5e, 0x3d, 0x95, 0xd3, 0x45, 0xbf,
- 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
- 0x90, 0x52, 0xb2, 0xbd, 0xa8, 0x75, 0x96, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0xea, 0xbd, 0x05, 0xbf, 0x40, 0xe7, 0x5e, 0x3d,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x14, 0xe3, 0x90, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
- 0x08, 0xc2, 0x53, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
- 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
- 0x60, 0x0c, 0x6a, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
- 0x08, 0xc2, 0x53, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
- 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0xb2, 0x3e,
- 0xb8, 0x77, 0x3d, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x66, 0x2d, 0x27, 0x3f, 0xe0, 0xbd, 0x05, 0xbd,
- 0xb8, 0x77, 0x3d, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
- 0x90, 0x31, 0xf5, 0x3d, 0xa8, 0x75, 0x96, 0x3e, 0x5c, 0x0c, 0xea, 0x3e,
- 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
- 0x30, 0xe7, 0xde, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0xec, 0x9e, 0xef, 0x3e,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
- 0x80, 0x31, 0xf5, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
- 0xa8, 0x75, 0x96, 0x3e, 0xc4, 0x79, 0xe4, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
- 0x34, 0xe7, 0xde, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x24, 0xe5, 0xb7, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
- 0xec, 0xbd, 0x85, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbc,
- 0x30, 0xe7, 0x5e, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
- 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x88, 0x31, 0x75, 0x3e,
- 0x64, 0x2d, 0xa7, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x58, 0x0c, 0xea, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x00, 0xbe, 0x05, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
- 0xec, 0xbd, 0x85, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x85, 0xbd,
- 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
- 0x60, 0x0c, 0x6a, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
- 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0xc4, 0x79, 0xe4, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x30, 0xe7, 0xde, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
- 0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0xb8, 0x77, 0xbd, 0x3e,
- 0xe8, 0xbd, 0x05, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x56, 0x2b, 0x00, 0x3f,
- 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
- 0x9c, 0x54, 0xd9, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0xe8, 0xbd, 0x85, 0xbe,
- 0xec, 0xbd, 0x85, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x90, 0x52, 0xb2, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x30, 0xe7, 0x5e, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbc,
- 0x68, 0x2d, 0x27, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x50, 0x8b, 0x3e,
- 0xe4, 0x9c, 0xc8, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
- 0x9c, 0x54, 0xd9, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x3c, 0x08, 0x9c, 0x3e,
- 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0xe8, 0xbd, 0x85, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0x14, 0xe3, 0x90, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0xa8, 0x75, 0x96, 0xbe, 0x58, 0x0c, 0xea, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0xf9, 0xbf, 0x2c, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0x5e, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x31, 0x75, 0xbe,
- 0xe8, 0xbd, 0x05, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x80, 0x31, 0xf5, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
- 0xe8, 0xbd, 0x05, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0x90, 0x52, 0x32, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
- 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x50, 0x8b, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0x20, 0xe5, 0xb7, 0xbe, 0x5e, 0xac, 0x13, 0xbf, 0x80, 0x52, 0x32, 0xbd,
- 0x5e, 0xac, 0x13, 0xbf, 0x90, 0x52, 0xb2, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x52, 0x32, 0x3d,
- 0x4c, 0x0a, 0xc3, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0xec, 0xbd, 0x85, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
- 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0x18, 0xe3, 0x10, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0xe8, 0xbd, 0x85, 0xbe,
- 0xe0, 0x9c, 0x48, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
- 0xc4, 0x79, 0xe4, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
- 0xec, 0x9e, 0xef, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
- 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0xf9, 0xbf, 0x2c, 0xbf, 0x08, 0xc2, 0xd3, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
- 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
- 0xa0, 0x52, 0x32, 0x3d, 0xe8, 0xbd, 0x05, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
- 0x38, 0x08, 0x1c, 0xbe, 0x43, 0x89, 0x2f, 0xbf, 0x88, 0x52, 0x32, 0xbe,
- 0x20, 0xe5, 0xb7, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
- 0x7c, 0x50, 0x8b, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0x5e, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0xec, 0xbd, 0x85, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
- 0x12, 0xe3, 0x10, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
- 0x56, 0x2b, 0x80, 0xbf, 0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xd0, 0x9a, 0xa1, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
- 0x80, 0x52, 0x32, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbd,
- 0xec, 0x9e, 0xef, 0x3e, 0x68, 0x2d, 0xa7, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
- 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0x3c,
- 0x58, 0x0c, 0x6a, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
- 0x30, 0xe7, 0x5e, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x64, 0x2d, 0xa7, 0xbe,
- 0x90, 0x31, 0xf5, 0x3d, 0x20, 0xe5, 0xb7, 0xbe, 0xd8, 0x1b, 0x35, 0xbf,
- 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd, 0x20, 0xe5, 0xb7, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
- 0xb4, 0x77, 0xbd, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
- 0x3c, 0x08, 0x9c, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x90, 0x52, 0x32, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
- 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
- 0x80, 0x50, 0x8b, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x54, 0x2b, 0x80, 0xbe,
- 0x90, 0x31, 0xf5, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
- 0xa8, 0x75, 0x96, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
- 0x14, 0xe3, 0x90, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0x30, 0xe7, 0xde, 0xbd, 0x56, 0x2b, 0x00, 0xbf, 0x1a, 0x64, 0x24, 0x3f,
- 0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0x9c, 0x54, 0xd9, 0x3e,
- 0x30, 0xe7, 0xde, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0xe8, 0xbd, 0x05, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0xfc, 0xbf, 0xac, 0x3e,
- 0x80, 0x52, 0x32, 0xbc, 0x80, 0x50, 0x8b, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x10, 0xe3, 0x10, 0xbe, 0x86, 0xd1, 0x1e, 0x3f, 0x80, 0x52, 0xb2, 0xbc,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
- 0x88, 0x52, 0x32, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0xf2, 0x3e, 0x19, 0x3f, 0xe0, 0xbd, 0x05, 0xbd,
- 0x58, 0x0c, 0x6a, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0xa8, 0x75, 0x96, 0x3e,
- 0x0c, 0xc2, 0xd3, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x88, 0x31, 0x75, 0x3e,
- 0x68, 0x2d, 0x27, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x68, 0x2d, 0xa7, 0x3e,
- 0x80, 0x52, 0x32, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x12, 0xe3, 0x10, 0xbf,
- 0x30, 0xe7, 0xde, 0x3d, 0x86, 0xd1, 0x1e, 0x3f, 0x88, 0x31, 0x75, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbe, 0x34, 0xe7, 0xde, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
- 0x30, 0xe7, 0x5e, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
- 0x7c, 0x50, 0x8b, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x52, 0x32, 0xbe,
- 0x58, 0x2b, 0x80, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
- 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0x54, 0x2b, 0x80, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x34, 0xe7, 0xde, 0x3e,
- 0xf0, 0xbd, 0x05, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x90, 0x52, 0x32, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
- 0x80, 0x31, 0xf5, 0xbd, 0xea, 0xbd, 0x05, 0xbf, 0x30, 0xe7, 0x5e, 0x3e,
- 0xe0, 0x9c, 0x48, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x14, 0xe3, 0x90, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xc4, 0x79, 0xe4, 0x3e, 0xfc, 0xbf, 0xac, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0xe8, 0xbd, 0x05, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x08, 0xc2, 0x53, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
- 0x30, 0xe7, 0x5e, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0xbc, 0xa0, 0x52, 0x32, 0x3d,
- 0xa8, 0x75, 0x96, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
- 0x46, 0x89, 0x2f, 0x3f, 0x18, 0xe3, 0x10, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0xc4, 0x79, 0xe4, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
- 0xa8, 0x75, 0x96, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0xfc, 0xbf, 0xac, 0x3e,
- 0xa8, 0x75, 0x16, 0xbf, 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
- 0x80, 0x31, 0xf5, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
- 0x8c, 0x52, 0xb2, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0xec, 0xbd, 0x85, 0x3e,
- 0xf8, 0xbf, 0xac, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
- 0xe0, 0x9c, 0x48, 0x3e, 0xc4, 0x79, 0xe4, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0xe0, 0x9c, 0x48, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x68, 0x2d, 0x27, 0x3e,
- 0x40, 0x08, 0x1c, 0x3e, 0x86, 0xd1, 0x1e, 0xbf, 0xea, 0xbd, 0x05, 0xbf,
- 0xa8, 0x75, 0x96, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0x75, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x30, 0xe7, 0xde, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x54, 0x2b, 0x80, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
- 0x60, 0x0c, 0x6a, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x08, 0xc2, 0x53, 0xbe,
- 0xb4, 0x77, 0xbd, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xec, 0x9e, 0xef, 0xbe,
- 0x58, 0x2b, 0x80, 0x3e, 0x9c, 0x54, 0xd9, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
- 0xe4, 0x9c, 0xc8, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0xb8, 0x77, 0x3d, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0xea, 0xbd, 0x05, 0xbf, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0x20, 0xe5, 0xb7, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x18, 0xe3, 0x10, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
- 0x3c, 0x08, 0x9c, 0xbe, 0x12, 0xe3, 0x10, 0x3f, 0x80, 0x50, 0x8b, 0x3e,
- 0xc4, 0x79, 0xe4, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
- 0xe8, 0xbd, 0x05, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x40, 0x08, 0x1c, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x90, 0x52, 0x32, 0x3e,
- 0x20, 0xe5, 0xb7, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
- 0x10, 0xe3, 0x10, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xd0, 0x9a, 0xa1, 0x3e,
- 0x4c, 0x0a, 0xc3, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
- 0x38, 0x08, 0x1c, 0xbe, 0xe7, 0x1d, 0x5c, 0xbf, 0x60, 0x0c, 0x6a, 0x3e,
- 0x30, 0x08, 0x9c, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0x5e, 0xac, 0x13, 0xbf,
- 0x18, 0xc4, 0xfa, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
- 0xe8, 0xbd, 0x05, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0x80, 0x52, 0x32, 0xbc, 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x30, 0xe7, 0x5e, 0xbe, 0x10, 0x43, 0x67, 0xbf, 0x20, 0xe7, 0x5e, 0xbd,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
- 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0x3d,
- 0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0x68, 0x2d, 0x27, 0x3e,
- 0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0xde, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0x3d,
- 0xf8, 0xbf, 0xac, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
- 0xe0, 0xbd, 0x05, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x24, 0xe5, 0xb7, 0x3e,
- 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x0c, 0xc2, 0xd3, 0x3e,
- 0x80, 0x50, 0x8b, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0xfc, 0xbf, 0xac, 0x3e,
- 0x58, 0x0c, 0x6a, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xe4, 0x9c, 0xc8, 0x3e,
- 0x30, 0x08, 0x9c, 0xbd, 0x95, 0xd3, 0x45, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x80, 0x52, 0x32, 0xbd, 0x86, 0xd1, 0x1e, 0xbf, 0x8c, 0x52, 0xb2, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
- 0x24, 0xe5, 0xb7, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xd0, 0x9a, 0xa1, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x5c, 0x0c, 0xea, 0x3e,
- 0x3c, 0x08, 0x9c, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x7e, 0x50, 0x0b, 0xbf,
- 0x90, 0x52, 0xb2, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
- 0xa8, 0x75, 0x96, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbd, 0x85, 0x3d,
- 0x30, 0xe7, 0xde, 0xbd, 0xc5, 0x79, 0x64, 0xbf, 0x08, 0xc2, 0x53, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
- 0x61, 0x8d, 0x7d, 0xbf, 0x34, 0xe7, 0xde, 0x3e, 0xc4, 0x79, 0xe4, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0x43, 0x89, 0x2f, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x85, 0x3d,
- 0x88, 0x52, 0x32, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x56, 0x2b, 0x00, 0xbf,
- 0x12, 0xe3, 0x10, 0xbf, 0x4c, 0x0a, 0xc3, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0x32, 0x3e,
- 0xe0, 0xbd, 0x85, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x31, 0xf5, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xc4, 0xfa, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
- 0x80, 0x31, 0x75, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xa8, 0x75, 0x96, 0x3e,
- 0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
- 0x3c, 0x08, 0x9c, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x3c, 0x08, 0x1c, 0xbf,
- 0x90, 0x31, 0xf5, 0x3d, 0x90, 0x52, 0xb2, 0x3e, 0x65, 0x2d, 0x27, 0xbf,
- 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0x3c, 0x08, 0x9c, 0x3e,
- 0xec, 0xbd, 0x85, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x3c, 0x08, 0x9c, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0xb4, 0x77, 0xbd, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0xa8, 0x75, 0x16, 0xbf, 0x88, 0x52, 0x32, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x12, 0xe3, 0x10, 0xbf, 0x90, 0x31, 0xf5, 0x3d,
- 0xb8, 0x77, 0x3d, 0xbe, 0xa4, 0xd5, 0x6c, 0xbf, 0x86, 0xd1, 0x1e, 0x3f,
- 0xec, 0x9e, 0xef, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
- 0x90, 0x22, 0x87, 0xbf, 0x68, 0x2d, 0x27, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
- 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
- 0xf8, 0xbf, 0xac, 0xbe, 0x43, 0x89, 0x2f, 0xbf, 0x18, 0xe3, 0x10, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0xe4, 0x9c, 0xc8, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0xe8, 0xbd, 0x85, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x31, 0x75, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0x58, 0x2b, 0x80, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0x18, 0xe3, 0x10, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0x40, 0x08, 0x9c, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
- 0x8d, 0x52, 0x32, 0xbf, 0x88, 0x52, 0x32, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
- 0x68, 0x2d, 0xa7, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x52, 0x32, 0x3d,
- 0xe0, 0x9c, 0xc8, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x90, 0x52, 0xb2, 0x3e,
- 0x18, 0xc4, 0xfa, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0xec, 0x9e, 0xef, 0x3e,
- 0x30, 0xe7, 0xde, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xec, 0x9e, 0xef, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0x20, 0xe5, 0xb7, 0xbe, 0x61, 0x8d, 0x7d, 0xbf,
- 0xe0, 0x9c, 0x48, 0x3e, 0x24, 0xe5, 0xb7, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
- 0x30, 0x08, 0x9c, 0xbd, 0x56, 0x2b, 0x00, 0x3f, 0xfc, 0xbf, 0xac, 0x3e,
- 0xb8, 0x77, 0x3d, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0xb8, 0x77, 0x3d, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
- 0xb8, 0x77, 0x3d, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0xb2, 0x3d,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xfc, 0xbf, 0xac, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
- 0x14, 0xe3, 0x90, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x80, 0x31, 0x75, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
- 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe,
- 0xea, 0xbd, 0x05, 0x3f, 0x90, 0x31, 0xf5, 0x3d, 0x90, 0x52, 0x32, 0x3e,
- 0xe0, 0x9c, 0x48, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
- 0x9c, 0x54, 0xd9, 0x3e, 0x9c, 0x54, 0xd9, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
- 0xf8, 0xbf, 0xac, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
- 0x80, 0x52, 0x32, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x56, 0x2b, 0x00, 0x3f,
- 0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
- 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
- 0x54, 0x2b, 0x80, 0xbe, 0x7e, 0x50, 0x0b, 0xbf, 0x40, 0x08, 0x1c, 0x3e,
- 0x08, 0xc2, 0xd3, 0xbe, 0x65, 0x2d, 0x27, 0xbf, 0x58, 0x2b, 0x80, 0x3e,
- 0x58, 0x0c, 0x6a, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
- 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
- 0x68, 0x2d, 0x27, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
- 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
- 0xe0, 0x9c, 0x48, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
- 0xf9, 0xbf, 0x2c, 0xbf, 0x74, 0x2f, 0xce, 0x3e, 0x08, 0xc2, 0x53, 0x3e,
- 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x9c, 0x54, 0xd9, 0xbe, 0x34, 0x87, 0x08, 0xbf,
- 0x14, 0xe3, 0x90, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
- 0xb8, 0x77, 0x3d, 0x3e, 0xc8, 0x19, 0x0e, 0xbf, 0x80, 0x50, 0x8b, 0x3e,
- 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
- 0x80, 0x31, 0x75, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x7b, 0xb0, 0x61, 0xbf,
- 0xf0, 0xbd, 0x85, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0x7c, 0x50, 0x8b, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
- 0xec, 0xbd, 0x85, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0xbc,
- 0xa0, 0x52, 0x32, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
- 0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x31, 0xf5, 0xbd,
- 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0xb4, 0x77, 0xbd, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
- 0x30, 0xe7, 0xde, 0xbd, 0x7e, 0x50, 0x0b, 0xbf, 0x90, 0x52, 0x32, 0x3e,
- 0x3c, 0x08, 0x9c, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0xa0, 0xf4, 0x82, 0xbf,
- 0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0x80, 0x52, 0xb2, 0xbc, 0x08, 0xc2, 0xd3, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
- 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x34, 0x87, 0x08, 0xbf,
- 0x08, 0xc2, 0x53, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0xe5, 0xb7, 0xbe,
- 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0x5e, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
- 0xb8, 0x77, 0x3d, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
- 0x18, 0xe3, 0x10, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x80, 0x52, 0x32, 0xbc, 0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x88, 0x52, 0x32, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
- 0x30, 0xe7, 0xde, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0x54, 0x2b, 0x80, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbc,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x00, 0x41, 0x40, 0xbf,
- 0x6c, 0xae, 0x3a, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
- 0x30, 0xe7, 0x5e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x52, 0x32, 0x3d,
- 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
- 0xa8, 0x75, 0x96, 0xbe, 0x18, 0xc4, 0xfa, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
- 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x68, 0x2d, 0x27, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xc4, 0x79, 0xe4, 0xbe, 0x80, 0x52, 0x32, 0x3c,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x3c, 0x08, 0x9c, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0x3c, 0x08, 0x1c, 0xbf, 0xec, 0xbd, 0x85, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
- 0x60, 0x2d, 0x27, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x00, 0xbe, 0x05, 0x3d,
- 0x3c, 0x08, 0x9c, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe,
- 0xd0, 0x9a, 0x21, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x75, 0x96, 0xbe,
- 0x80, 0x31, 0x75, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0xe4, 0x9c, 0xc8, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0x60, 0x2d, 0x27, 0xbe, 0xf2, 0x3e, 0x19, 0xbf, 0xa8, 0x75, 0x96, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
- 0x80, 0x31, 0x75, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
- 0x4c, 0x0a, 0xc3, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
- 0xf8, 0xbf, 0xac, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbd,
- 0x08, 0xc2, 0x53, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
- 0x10, 0xe3, 0x10, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0xbe, 0x05, 0x3d,
- 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x3c, 0x08, 0x9c, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
- 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0x5e, 0x3e,
- 0x60, 0x2d, 0x27, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
- 0x80, 0x31, 0xf5, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
- 0x38, 0x08, 0x1c, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x88, 0x31, 0x75, 0x3e,
- 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
- 0x20, 0xe5, 0xb7, 0xbe, 0xa0, 0xf4, 0x82, 0xbf, 0x64, 0x2d, 0xa7, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0x48, 0xbe, 0x34, 0xe7, 0xde, 0x3e,
- 0x30, 0x08, 0x9c, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0x3c, 0x08, 0x9c, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x83, 0x31, 0x75, 0xbf, 0x40, 0x08, 0x9c, 0x3d,
- 0x34, 0x87, 0x08, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
- 0x30, 0x08, 0x9c, 0xbd, 0xd0, 0x9a, 0xa1, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
- 0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x52, 0x32, 0xbe,
- 0x3c, 0x08, 0x9c, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
- 0xaf, 0xf6, 0x29, 0xbf, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
- 0x80, 0x50, 0x8b, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0xc8, 0x3d, 0xe8, 0xbd, 0x85, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0xf0, 0xbd, 0x85, 0x3d, 0x18, 0xc4, 0xfa, 0xbe,
- 0xf0, 0xbd, 0x05, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
- 0x88, 0x31, 0x75, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x08, 0xc2, 0xd3, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0xb2, 0xbc, 0x60, 0x0c, 0x6a, 0x3e,
- 0x90, 0x31, 0xf5, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
- 0x65, 0x2d, 0x27, 0xbf, 0xe0, 0x9c, 0x48, 0x3e, 0xb4, 0x77, 0xbd, 0xbe,
- 0x90, 0x31, 0xf5, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x90, 0x31, 0xf5, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
- 0x60, 0x0c, 0x6a, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
- 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0xf8, 0xbf, 0xac, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
- 0xf0, 0xbd, 0x05, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
- 0x68, 0x2d, 0x27, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x3c, 0x08, 0x1c, 0xbf,
- 0x30, 0xe7, 0x5e, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
- 0x40, 0x08, 0x9c, 0x3d, 0x43, 0x89, 0x2f, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
- 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
- 0xb8, 0x77, 0xbd, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0x14, 0xe3, 0x90, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0x30, 0xe7, 0xde, 0xbd, 0xd0, 0x9a, 0x21, 0xbf, 0x20, 0xe7, 0x5e, 0xbd,
- 0x64, 0x2d, 0xa7, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xa8, 0x75, 0x16, 0xbf,
- 0x90, 0x52, 0xb2, 0x3d, 0x00, 0x41, 0x40, 0xbf, 0x38, 0x08, 0x1c, 0xbe,
- 0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
- 0x68, 0x2d, 0x27, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0xb2, 0xbc,
- 0x4c, 0x0a, 0xc3, 0x3e, 0x08, 0xc2, 0xd3, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0x48, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e,
- 0xe0, 0xbd, 0x85, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x5c, 0x0c, 0xea, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e,
- 0x80, 0x52, 0x32, 0x3c, 0xa0, 0x52, 0x32, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
- 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
- 0xe8, 0xbd, 0x05, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xec, 0xbd, 0x85, 0x3e,
- 0xa0, 0x52, 0x32, 0x3d, 0xea, 0xbd, 0x05, 0xbf, 0x24, 0xe5, 0xb7, 0x3e,
- 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0x3c, 0xec, 0xbd, 0x85, 0x3e,
- 0x14, 0xe3, 0x90, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x1c, 0xc4, 0xfa, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
- 0x08, 0xc2, 0x53, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
- 0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0x5e, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0xf9, 0xbf, 0x2c, 0xbf,
- 0x8c, 0x52, 0xb2, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
- 0x38, 0x08, 0x1c, 0xbe, 0x5c, 0x0c, 0xea, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0xbe,
- 0xa8, 0x75, 0x96, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
- 0xe4, 0x9c, 0xc8, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
- 0x90, 0x52, 0x32, 0x3e, 0x8c, 0x52, 0xb2, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
- 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x7e, 0x50, 0x0b, 0xbf,
- 0xe0, 0x9c, 0x48, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0xf0, 0xbd, 0x85, 0x3d, 0xe8, 0xbd, 0x05, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0xbc, 0xc0, 0x52, 0xb2, 0x3c,
- 0x64, 0x2d, 0xa7, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x08, 0xc2, 0x53, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
- 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0x3d,
- 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0x00, 0x00, 0x00,
- 0xf0, 0xbd, 0x85, 0x3d, 0x74, 0x2f, 0xce, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
- 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
- 0x14, 0xe3, 0x90, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x56, 0x2b, 0x00, 0xbf,
- 0x40, 0x08, 0x9c, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x20, 0xe7, 0x5e, 0xbd,
- 0x90, 0x31, 0xf5, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
- 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x88, 0x31, 0x75, 0x3e,
- 0x80, 0x52, 0x32, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
- 0x74, 0x2f, 0xce, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0xe8, 0xbd, 0x05, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0x86, 0xd1, 0x1e, 0xbf, 0x30, 0xe7, 0x5e, 0x3e,
- 0x58, 0x0c, 0x6a, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x74, 0x2f, 0xce, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0x3e,
- 0xf0, 0xbd, 0x85, 0x3d, 0xa0, 0xf4, 0x02, 0xbf, 0xc0, 0x52, 0xb2, 0x3c,
- 0xe0, 0x9c, 0x48, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
- 0x74, 0x2f, 0xce, 0x3e, 0x9c, 0x54, 0xd9, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
- 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0xc8, 0x19, 0x0e, 0xbf,
- 0x14, 0xe3, 0x90, 0xbe, 0x84, 0x31, 0xf5, 0x3e, 0x74, 0x2f, 0xce, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
- 0xe8, 0xbd, 0x05, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0xb2, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x34, 0xe7, 0xde, 0x3e,
- 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0x3c,
- 0x88, 0x31, 0x75, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0xec, 0x9e, 0xef, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0xf9, 0xbf, 0x2c, 0xbf, 0x80, 0x52, 0x32, 0xbc,
- 0xd0, 0x9a, 0x21, 0xbf, 0x4c, 0x0a, 0xc3, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
- 0x30, 0xe7, 0x5e, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0xd3, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0x80, 0x31, 0x75, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x18, 0xc4, 0xfa, 0xbe, 0x9c, 0x54, 0x59, 0xbf, 0x22, 0xe5, 0x37, 0xbf,
- 0x3c, 0x08, 0x1c, 0xbf, 0x9c, 0x54, 0xd9, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0x17, 0xc4, 0x7a, 0xbf, 0xb8, 0x77, 0xbd, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
- 0x88, 0x31, 0x75, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xa8, 0x75, 0x96, 0x3e,
- 0xe0, 0x9c, 0x48, 0x3e, 0x34, 0xe7, 0xde, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
- 0xa8, 0x75, 0x96, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
- 0x3c, 0x08, 0x9c, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
- 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x9c, 0x54, 0x59, 0xbf,
- 0x14, 0xe3, 0x90, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
- 0x20, 0xe7, 0x5e, 0xbd, 0x0c, 0xc2, 0xd3, 0x3e, 0x88, 0x52, 0x32, 0xbe,
- 0x68, 0x2d, 0x27, 0x3e, 0x58, 0x0c, 0xea, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x14, 0xe3, 0x90, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0xc8, 0x19, 0x0e, 0xbf,
- 0x88, 0x31, 0x75, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0xb4, 0x77, 0xbd, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x9c, 0x54, 0xd9, 0x3e,
- 0x90, 0x52, 0xb2, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x58, 0x0c, 0xea, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0x88, 0x31, 0x75, 0x3e, 0x5c, 0x0c, 0xea, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x4b, 0x0a, 0x43, 0xbf,
- 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0x3c,
- 0xb4, 0x77, 0xbd, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x3c, 0x08, 0x1c, 0xbf,
- 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0x9c, 0x54, 0xd9, 0xbe,
- 0x86, 0xd1, 0x1e, 0x3f, 0x83, 0x31, 0x75, 0xbf, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0xd0, 0x9a, 0x21, 0xbf,
- 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x34, 0x87, 0x08, 0xbf,
- 0x80, 0x52, 0x32, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x31, 0xf5, 0xbd,
- 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0xb2, 0x3e,
- 0x7e, 0x50, 0x0b, 0xbf, 0x80, 0x52, 0x32, 0xbd, 0xf8, 0xbf, 0xac, 0xbe,
- 0xb8, 0x77, 0x3d, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
- 0x64, 0x2d, 0xa7, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
- 0x60, 0x2d, 0x27, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
- 0x80, 0x52, 0xb2, 0xbc, 0xaf, 0xf6, 0x29, 0xbf, 0x80, 0x31, 0xf5, 0xbd,
- 0xa8, 0x75, 0x16, 0xbf, 0x80, 0x50, 0x8b, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
- 0x14, 0xe3, 0x90, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
- 0x30, 0xe7, 0xde, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
- 0xe0, 0x9c, 0x48, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x64, 0x2d, 0xa7, 0xbe,
- 0xf2, 0x3e, 0x19, 0x3f, 0x30, 0xe7, 0x5e, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x52, 0x8b, 0x56, 0xbf, 0x3c, 0x08, 0x9c, 0xbe,
- 0xd8, 0x1b, 0x35, 0xbf, 0xee, 0x9e, 0x6f, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
- 0x88, 0x52, 0x32, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0xaf, 0xf6, 0x29, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x54, 0x2b, 0x80, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e,
- 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x3c, 0x08, 0x9c, 0x3e,
- 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x36, 0x87, 0x08, 0x3f,
- 0x80, 0x50, 0x8b, 0x3e, 0x4b, 0x0a, 0x43, 0xbf, 0xfc, 0xbf, 0xac, 0x3e,
- 0x80, 0x52, 0x32, 0xbc, 0x7e, 0x50, 0x0b, 0xbf, 0x18, 0xc4, 0xfa, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x31, 0x75, 0x3e,
- 0x08, 0xc2, 0x53, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0x90, 0x52, 0xb2, 0x3e,
- 0x80, 0x52, 0x32, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xec, 0xbd, 0x85, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0xb8, 0x77, 0xbd, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
- 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
- 0x90, 0x52, 0xb2, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x31, 0x75, 0xbe,
- 0xf0, 0xbd, 0x05, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
- 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xa0, 0x52, 0x32, 0x3d,
- 0x90, 0x52, 0x32, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
- 0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x31, 0x75, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
- 0x74, 0x2f, 0xce, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x5a, 0x0c, 0x6a, 0xbf,
- 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
- 0xa0, 0xf4, 0x02, 0xbf, 0x80, 0x52, 0xb2, 0xbc, 0x12, 0xe3, 0x10, 0xbf,
- 0x40, 0x08, 0x1c, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x64, 0x2d, 0xa7, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0x80, 0x52, 0x32, 0xbc, 0x7c, 0x50, 0x8b, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
- 0x30, 0xe7, 0x5e, 0x3e, 0x18, 0xc4, 0xfa, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0x80, 0x52, 0x32, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0xae, 0xf6, 0x29, 0x3f,
- 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x20, 0xe5, 0xb7, 0xbe,
- 0x68, 0x2d, 0x27, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0x4c, 0xda, 0x97, 0xbf,
- 0x54, 0x2b, 0x80, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x74, 0x2f, 0xce, 0x3e,
- 0x80, 0x50, 0x8b, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x8c, 0x52, 0xb2, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
- 0xe0, 0x9c, 0xc8, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0xfb, 0x8f, 0x81, 0xbf,
- 0xec, 0xbd, 0x85, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
- 0x74, 0x2f, 0xce, 0xbe, 0xc8, 0x19, 0x0e, 0xbf, 0x58, 0x0c, 0x6a, 0xbe,
- 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe,
- 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
- 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
- 0xf2, 0x3e, 0x19, 0x3f, 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0xbd,
- 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0xb2, 0xbc,
- 0x18, 0xe3, 0x10, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0x08, 0xc2, 0xd3, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
- 0x60, 0x0c, 0x6a, 0x3e, 0xfc, 0xbf, 0xac, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
- 0x68, 0x2d, 0xa7, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0x08, 0xc2, 0x53, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x24, 0xe5, 0xb7, 0x3e, 0x22, 0xe5, 0x37, 0xbf, 0x60, 0x0c, 0x6a, 0x3e,
- 0x30, 0xe7, 0x5e, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0x40, 0x08, 0x9c, 0x3d, 0x8c, 0x52, 0xb2, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
- 0x20, 0xe5, 0xb7, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x7c, 0x50, 0x8b, 0xbe, 0x56, 0x2b, 0x00, 0xbf, 0x80, 0x52, 0x32, 0xbd,
- 0x4c, 0x0a, 0xc3, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
- 0x3c, 0x08, 0x9c, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0xb4, 0x77, 0xbd, 0xbe,
- 0xd0, 0x9a, 0xa1, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
- 0xb8, 0x77, 0x3d, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
- 0xe0, 0x9c, 0xc8, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0xa8, 0x75, 0x96, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
- 0xb8, 0x77, 0x3d, 0x3e, 0x08, 0xc2, 0xd3, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xa0, 0x52, 0x32, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x60, 0x0c, 0x6a, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0x32, 0x3e,
- 0xe8, 0xbd, 0x05, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
- 0x40, 0x08, 0x9c, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
- 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
- 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
- 0x88, 0x52, 0x32, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0xc0, 0x52, 0xb2, 0x3c,
- 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
- 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
- 0x68, 0x2d, 0x27, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x18, 0xe3, 0x10, 0x3e,
- 0x40, 0x08, 0x1c, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
- 0x80, 0x52, 0x32, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
- 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0x3c, 0xf0, 0xbd, 0x85, 0x3d,
- 0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0x5e, 0x3e,
- 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0xb2, 0x3d,
- 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0xbe, 0x05, 0x3d,
- 0x80, 0x52, 0xb2, 0xbc, 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
- 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0x3d,
- 0xe8, 0xbd, 0x05, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0x30, 0xe7, 0xde, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
- 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
- 0x60, 0x2d, 0x27, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x30, 0xe7, 0x5e, 0x3e, 0x56, 0x2b, 0x00, 0x3f, 0xa0, 0x52, 0x32, 0x3d,
- 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x20, 0xe7, 0x5e, 0xbd,
- 0x86, 0xd1, 0x1e, 0x3f, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
- 0x60, 0x0c, 0x6a, 0x3e, 0xec, 0xbd, 0x85, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0x24, 0xe5, 0xb7, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
- 0x30, 0xe7, 0x5e, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0x74, 0x2f, 0xce, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0x32, 0x3e,
- 0xf0, 0xbd, 0x85, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xf0, 0xbd, 0x85, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x31, 0x75, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x05, 0xbd,
- 0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x40, 0xe7, 0x5e, 0x3d,
- 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x10, 0xe3, 0x10, 0xbe,
- 0x58, 0x0c, 0xea, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0xe7, 0x5e, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x88, 0x52, 0x32, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0xa0, 0x52, 0x32, 0x3d,
- 0x64, 0x2d, 0xa7, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
- 0x80, 0x52, 0x32, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0x80, 0x31, 0xf5, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
- 0x84, 0x31, 0xf5, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbc,
- 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0xe8, 0xbd, 0x85, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0x48, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
- 0xc0, 0x52, 0xb2, 0x3c, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x68, 0x2d, 0x27, 0x3e, 0x20, 0xe5, 0xb7, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0xc0, 0x52, 0xb2, 0x3c, 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0xb2, 0xbc, 0x10, 0xe3, 0x10, 0xbe,
- 0x5e, 0xac, 0x13, 0x3f, 0xe8, 0xbd, 0x05, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
- 0xe0, 0xbd, 0x05, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
- 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
- 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0x32, 0xbc,
- 0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
- 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x88, 0x52, 0x32, 0xbe,
- 0x90, 0x52, 0xb2, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x05, 0xbd,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x40, 0x08, 0x9c, 0x3d,
- 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0xde, 0xbe,
- 0x58, 0x2b, 0x80, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbd,
- 0x6c, 0xae, 0x3a, 0xbf, 0xe8, 0xbd, 0x05, 0xbe, 0x30, 0xe7, 0xde, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
- 0x90, 0x52, 0xb2, 0xbd, 0x86, 0xd1, 0x1e, 0xbf, 0x5c, 0x0c, 0xea, 0x3e,
- 0xe8, 0xbd, 0x85, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
- 0x38, 0x08, 0x1c, 0xbe, 0x29, 0x66, 0x4b, 0xbf, 0x68, 0x2d, 0xa7, 0x3e,
- 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x3c, 0x08, 0x9c, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0x4c, 0x0a, 0xc3, 0xbe, 0x86, 0xd1, 0x1e, 0xbf,
- 0x4b, 0x0a, 0x43, 0xbf, 0x86, 0xd1, 0x1e, 0xbf, 0xb8, 0x77, 0x3d, 0x3e,
- 0xc9, 0x19, 0x8e, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
- 0xb4, 0x77, 0xbd, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x88, 0x52, 0x32, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x8d, 0x52, 0x32, 0xbf,
- 0x80, 0x31, 0x75, 0xbe, 0xc4, 0x79, 0xe4, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0xf2, 0x3e, 0x19, 0xbf,
- 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x40, 0xe7, 0x5e, 0x3d, 0xa8, 0x75, 0x96, 0x3e, 0xb6, 0x77, 0x3d, 0xbf,
- 0x68, 0x2d, 0xa7, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0xb4, 0x77, 0xbd, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0x30, 0xe7, 0xde, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
- 0x56, 0x2b, 0x00, 0x3f, 0x7e, 0x50, 0x0b, 0xbf, 0x60, 0x2d, 0x27, 0xbe,
- 0x80, 0x50, 0x8b, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
- 0x24, 0xe5, 0xb7, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
- 0xa8, 0x75, 0x96, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
- 0x5c, 0x0c, 0xea, 0x3e, 0x56, 0x2b, 0x80, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
- 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
- 0x86, 0xd1, 0x1e, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
- 0x90, 0x52, 0xb2, 0x3d, 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x31, 0x75, 0xbe,
- 0x31, 0xe7, 0x5e, 0xbf, 0x64, 0x2d, 0xa7, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
- 0xaf, 0xf6, 0x29, 0xbf, 0x40, 0x08, 0x9c, 0x3d, 0x88, 0x52, 0x32, 0xbe,
- 0x90, 0x52, 0x32, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x30, 0xe7, 0xde, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
- 0x40, 0xe7, 0x5e, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0x64, 0x2d, 0xa7, 0xbe, 0x8d, 0x52, 0x32, 0xbf, 0xea, 0xbd, 0x05, 0xbf,
- 0xe0, 0xbd, 0x85, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
- 0x08, 0xc2, 0x53, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
- 0x54, 0x2b, 0x80, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x54, 0x5b, 0xab, 0xbf,
- 0x58, 0x0c, 0x6a, 0xbe, 0xf9, 0xbf, 0x2c, 0xbf, 0x52, 0x8b, 0x56, 0xbf,
- 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0xbd, 0xec, 0x9e, 0xef, 0x3e,
- 0xf0, 0xbd, 0x85, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
- 0x64, 0x2d, 0xa7, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0xa0, 0xf4, 0x02, 0xbf,
- 0x19, 0x94, 0xcf, 0xbf, 0xe8, 0xbd, 0x85, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x14, 0xe3, 0x90, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x24, 0xb5, 0x8c, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0xa8, 0x75, 0x96, 0xbe,
- 0x83, 0x31, 0x75, 0xbf, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x56, 0x2b, 0x80, 0xbf, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x50, 0x8b, 0x3e,
- 0x84, 0x31, 0xf5, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xc7, 0x49, 0xb9, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x12, 0xe3, 0x10, 0xbf, 0x18, 0xe3, 0x10, 0x3e,
- 0x60, 0x0c, 0x6a, 0x3e, 0x12, 0xe3, 0x10, 0xbf, 0x7e, 0x50, 0x0b, 0xbf,
- 0x24, 0xe5, 0xb7, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
- 0x08, 0xc2, 0xd3, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0xfc, 0xbf, 0xac, 0x3e,
- 0x6c, 0xae, 0x3a, 0xbf, 0x74, 0x2f, 0xce, 0xbe, 0xd8, 0x1b, 0x35, 0xbf,
- 0x40, 0x08, 0x9c, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x3c, 0x08, 0x1c, 0xbf,
- 0x3c, 0x08, 0x9c, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
- 0xd0, 0x9a, 0xa1, 0xbf, 0xec, 0xbd, 0x85, 0x3e, 0x01, 0x41, 0xc0, 0xbf,
- 0x80, 0x52, 0x32, 0x3c, 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
- 0xf0, 0xbd, 0x85, 0x3d, 0xfc, 0xbf, 0xac, 0x3e, 0x34, 0x87, 0x08, 0xbf,
- 0xd8, 0x1b, 0x35, 0xbf, 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
- 0x80, 0x31, 0xf5, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0xfc, 0xbf, 0xac, 0x3e,
- 0xa8, 0x75, 0x96, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0x80, 0x52, 0x32, 0x3c, 0x20, 0xe5, 0xb7, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0xc5, 0x79, 0x64, 0xbf, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x41, 0x40, 0xbf,
- 0xa0, 0x52, 0x32, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xf0, 0xbd, 0x05, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xb6, 0x77, 0x3d, 0xbf,
- 0x80, 0x31, 0x75, 0xbe, 0x58, 0x0c, 0xea, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0xc4, 0x79, 0xe4, 0x3e, 0x33, 0xb7, 0xb3, 0xbf, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xa8, 0x75, 0x96, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x56, 0x2b, 0x00, 0xbf, 0x52, 0x8b, 0x56, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0x02, 0x11, 0x95, 0xbf,
- 0x24, 0xe5, 0xb7, 0x3e, 0xfb, 0x8f, 0x81, 0xbf, 0x58, 0x2b, 0x80, 0x3e,
- 0xfc, 0xbf, 0xac, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x2d, 0x27, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
- 0xf0, 0xbd, 0x05, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
- 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x60, 0x0c, 0x6a, 0x3e,
- 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0xc8, 0x3d, 0xd0, 0x9a, 0xa1, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
- 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0x5e, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
- 0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x52, 0xb2, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
- 0x30, 0xe7, 0xde, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
- 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x88, 0x52, 0x32, 0xbe,
- 0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xb8, 0x77, 0x3d, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
- 0xb8, 0x77, 0x3d, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0x00, 0x00, 0x00, 0x00, 0x54, 0x2b, 0x80, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x18, 0xe3, 0x10, 0x3e,
- 0x88, 0x52, 0x32, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x52, 0xb2, 0x3c,
- 0xa8, 0x75, 0x96, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x08, 0xc2, 0x53, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x31, 0x75, 0x3e,
- 0x10, 0xe3, 0x10, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe5, 0xb7, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0xf0, 0xbd, 0x05, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x7c, 0x50, 0x8b, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0x18, 0xe3, 0x10, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
- 0x58, 0x2b, 0x80, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
- 0xb8, 0x77, 0xbd, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e,
- 0xa8, 0x75, 0x96, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
- 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0xbd,
- 0x68, 0x2d, 0x27, 0x3e, 0xa0, 0xf4, 0x02, 0xbf, 0x90, 0x31, 0xf5, 0x3d,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
- 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x50, 0x8b, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
- 0x60, 0x2d, 0x27, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
- 0x40, 0x08, 0x9c, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0xa0, 0x52, 0x32, 0x3d,
- 0xf0, 0xbd, 0x85, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0xe7, 0x5e, 0x3d,
- 0xe4, 0x9c, 0xc8, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
- 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
- 0x00, 0xbe, 0x05, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
- 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbd,
- 0xf0, 0xbd, 0x85, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
- 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
- 0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0x3c,
- 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
- 0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xf0, 0xbd, 0x85, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
- 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0xbd,
- 0x40, 0x08, 0x1c, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
- 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x52, 0x32, 0xbd,
- 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0xf0, 0xbd, 0x85, 0x3d,
- 0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
- 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0x30, 0x08, 0x9c, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
- 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0x08, 0x9c, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
- 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x05, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
- 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
- 0x30, 0xe7, 0xde, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
- 0xe8, 0xbd, 0x05, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0x3d,
- 0x30, 0x08, 0x9c, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
- 0x00, 0xbe, 0x05, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x84, 0x31, 0xf5, 0xbe,
- 0x8c, 0x52, 0xb2, 0xbe, 0x22, 0xe5, 0x37, 0xbf, 0xb6, 0x77, 0x3d, 0xbf,
- 0x30, 0xe7, 0xde, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0x84, 0x31, 0xf5, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xa8, 0x75, 0x96, 0x3e, 0x84, 0x31, 0xf5, 0x3e,
- 0xec, 0x9e, 0xef, 0xbe, 0xb8, 0x77, 0xbd, 0x3e, 0x4b, 0x0a, 0x43, 0xbf,
- 0x14, 0xe3, 0x90, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0x34, 0x87, 0x08, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
- 0x80, 0x50, 0x8b, 0x3e, 0x86, 0xd1, 0x1e, 0xbf, 0x34, 0xe7, 0xde, 0x3e,
- 0xe8, 0xbd, 0x05, 0xbe, 0xec, 0x9e, 0xef, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x0c, 0xc2, 0xd3, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
- 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x14, 0xe3, 0x90, 0xbe,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
- 0xf8, 0xbf, 0xac, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
- 0xec, 0x9e, 0xef, 0xbe, 0x84, 0x31, 0xf5, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
- 0x20, 0xe7, 0x5e, 0xbd, 0x56, 0x2b, 0x00, 0x3f, 0xf0, 0xbd, 0x85, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0xa0, 0x52, 0x32, 0x3d, 0x74, 0x2f, 0xce, 0xbe,
- 0x8c, 0x52, 0xb2, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x7e, 0x50, 0x0b, 0xbf, 0x90, 0x52, 0xb2, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
- 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0xa8, 0x75, 0x16, 0xbf,
- 0x3c, 0x08, 0x1c, 0xbf, 0xbe, 0xf8, 0x50, 0xbf, 0xb8, 0x77, 0x3d, 0xbe,
- 0x8d, 0x52, 0x32, 0xbf, 0x3c, 0x08, 0x1c, 0xbf, 0x10, 0xe3, 0x10, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0x56, 0x2b, 0x00, 0xbf, 0x3e, 0x08, 0x1c, 0x3f,
- 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x88, 0x52, 0x32, 0xbe,
- 0x14, 0xe3, 0x90, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0xe4, 0x9c, 0xc8, 0x3e,
- 0x58, 0x0c, 0xea, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
- 0x5c, 0x0c, 0xea, 0x3e, 0x9c, 0x54, 0xd9, 0xbe, 0x12, 0xe3, 0x10, 0x3f,
- 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x9e, 0x54, 0x59, 0x3f,
- 0x60, 0x2d, 0x27, 0xbe, 0x1a, 0x64, 0x24, 0xbf, 0x24, 0xe5, 0xb7, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x50, 0x8b, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x86, 0xd1, 0x1e, 0xbf, 0xe4, 0x9c, 0xc8, 0x3e,
- 0x3c, 0x08, 0x9c, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
- 0xe0, 0xbd, 0x05, 0xbd, 0x3c, 0x08, 0x9c, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
- 0x5e, 0xac, 0x13, 0xbf, 0xec, 0x9e, 0xef, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
- 0x68, 0x2d, 0x27, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x00, 0xbe, 0x05, 0x3d, 0xe8, 0xbd, 0x85, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xb4, 0x77, 0xbd, 0xbe,
- 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0x32, 0x3e,
- 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
- 0xb8, 0x77, 0x3d, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x31, 0x75, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
- 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0x48, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x14, 0xe3, 0x90, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x31, 0xf5, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
- 0xb8, 0x77, 0x3d, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0x3c, 0x08, 0x9c, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
- 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x31, 0x75, 0xbe,
- 0x20, 0xe5, 0xb7, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0xe8, 0xbd, 0x05, 0xbe,
- 0x80, 0x31, 0xf5, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
- 0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x52, 0x32, 0x3c, 0x68, 0x2d, 0x27, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
- 0x80, 0x52, 0x32, 0x3c, 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
- 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0xbc,
- 0xe0, 0x9c, 0x48, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0xbd,
- 0x90, 0x52, 0xb2, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x30, 0x08, 0x9c, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
- 0x20, 0xe7, 0x5e, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0x40, 0xe7, 0x5e, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0xe0, 0xbd, 0x05, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
- 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
- 0x40, 0x08, 0x1c, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
- 0xe0, 0x9c, 0xc8, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
- 0x60, 0x0c, 0x6a, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x50, 0x8b, 0x3e,
- 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0x32, 0x3e,
- 0x88, 0x31, 0x75, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x52, 0x32, 0x3e,
- 0x80, 0x52, 0xb2, 0xbc, 0xa8, 0x75, 0x16, 0xbf, 0x80, 0x52, 0x32, 0x3c,
- 0x58, 0x0c, 0x6a, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
- 0x8c, 0x52, 0xb2, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xc8, 0x19, 0x0e, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
- 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
- 0xe0, 0xbd, 0x85, 0xbd, 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0x74, 0x2f, 0xce, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0x3c,
- 0x80, 0x52, 0x32, 0xbd, 0x88, 0x31, 0x75, 0x3e, 0x58, 0x0c, 0xea, 0xbe,
- 0xea, 0xbd, 0x05, 0xbf, 0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
- 0xec, 0xbd, 0x85, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x9c, 0x3d,
- 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
- 0xb8, 0x77, 0x3d, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
- 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x88, 0x52, 0x32, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0x3c,
- 0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0x32, 0x3e,
- 0xec, 0xbd, 0x85, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0x14, 0xe3, 0x90, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0x32, 0x3e,
- 0x08, 0xc2, 0x53, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0x7e, 0x50, 0x0b, 0xbf, 0x60, 0x2d, 0x27, 0xbe,
- 0xa8, 0x75, 0x16, 0xbf, 0xe8, 0xbd, 0x85, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0xd0, 0x9a, 0xa1, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x05, 0xbe,
- 0x74, 0x2f, 0xce, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0x08, 0xc2, 0x53, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0xe8, 0xbd, 0x85, 0xbe,
- 0x9c, 0x54, 0xd9, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0xe8, 0xbd, 0x05, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0x30, 0xe7, 0xde, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0x61, 0x8d, 0x7d, 0xbf,
- 0xe8, 0xbd, 0x85, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x80, 0x31, 0x75, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0xd0, 0x9a, 0x21, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x3c, 0x08, 0x9c, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xea, 0xbd, 0x05, 0xbf,
- 0x90, 0x52, 0xb2, 0xbd, 0x9c, 0x54, 0x59, 0xbf, 0xe0, 0x9c, 0x48, 0x3e,
- 0x90, 0x52, 0xb2, 0x3d, 0x3c, 0x08, 0x9c, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
- 0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x50, 0x8b, 0x3e,
- 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
- 0x90, 0x31, 0xf5, 0x3d, 0xe8, 0xbd, 0x85, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
- 0x38, 0x08, 0x1c, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
- 0x40, 0xe7, 0x5e, 0x3d, 0xa8, 0x75, 0x96, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
- 0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0x32, 0xbd,
- 0x3c, 0x08, 0x9c, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
- 0xd8, 0x1b, 0x35, 0xbf, 0x40, 0xe7, 0x5e, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
- 0xec, 0xbd, 0x85, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
- 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0xbe,
- 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xcd, 0xfa, 0x77, 0xbf,
- 0x80, 0x52, 0x32, 0x3c, 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
- 0x30, 0xe7, 0xde, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x3c, 0x08, 0x9c, 0xbe,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0x9c, 0x48, 0xbe,
- 0x30, 0xe7, 0xde, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
- 0x80, 0x31, 0xf5, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0xf0, 0xbd, 0x85, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
- 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0x3c,
- 0x3c, 0x08, 0x9c, 0xbe, 0x4b, 0x0a, 0x43, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
- 0x74, 0x2f, 0xce, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
- 0x3c, 0x08, 0x9c, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
- 0xe0, 0xbd, 0x85, 0xbd, 0x64, 0x2d, 0xa7, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
- 0xb8, 0x77, 0x3d, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x84, 0x31, 0xf5, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0x58, 0x2b, 0x80, 0x3e, 0x68, 0x2d, 0xa7, 0x3e, 0xa8, 0x75, 0x16, 0xbf,
- 0x68, 0x2d, 0xa7, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0x32, 0x3e,
- 0x36, 0x87, 0x08, 0x3f, 0x3c, 0x08, 0x9c, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
- 0x8d, 0x52, 0x32, 0xbf, 0xec, 0x9e, 0xef, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0xa4, 0xd5, 0x6c, 0xbf, 0x00, 0xbe, 0x05, 0x3d, 0x7e, 0x50, 0x0b, 0xbf,
- 0xea, 0xbd, 0x05, 0x3f, 0x40, 0x08, 0x1c, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x56, 0x2b, 0x00, 0xbf,
- 0x46, 0x89, 0x2f, 0x3f, 0xea, 0xbd, 0x85, 0xbf, 0x56, 0x2b, 0x80, 0xbf,
- 0x3c, 0x08, 0x9c, 0xbe, 0x6c, 0xae, 0x3a, 0xbf, 0x9c, 0x54, 0xd9, 0xbe,
- 0x58, 0x0c, 0xea, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
- 0x64, 0x2d, 0xa7, 0xbe, 0x22, 0xe5, 0x37, 0xbf, 0x54, 0x2b, 0x80, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x12, 0xe3, 0x10, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
- 0x88, 0x31, 0x75, 0x3e, 0x7b, 0xb0, 0x61, 0xbf, 0x40, 0x08, 0x9c, 0x3d,
- 0x61, 0x8d, 0x7d, 0xbf, 0x38, 0x68, 0x72, 0xbf, 0xc0, 0x52, 0xb2, 0x3c,
- 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x31, 0x75, 0xbe,
- 0xa4, 0xd5, 0x6c, 0xbf, 0x66, 0x2d, 0x27, 0x3f, 0xdf, 0x9c, 0x48, 0xbf,
- 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
- 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
- 0x6e, 0xae, 0x3a, 0x3f, 0x24, 0xe5, 0xb7, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
- 0x4c, 0x0a, 0xc3, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xaf, 0xf6, 0x29, 0xbf,
- 0x12, 0xe3, 0x10, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
- 0x65, 0x2d, 0x27, 0xbf, 0x76, 0xff, 0xa2, 0xbf, 0x38, 0x08, 0x1c, 0xbe,
- 0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0x32, 0x3c,
- 0x90, 0x52, 0x32, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0x48, 0x3e,
- 0x80, 0x52, 0x32, 0x3c, 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x36, 0x87, 0x08, 0x3f, 0xc4, 0x79, 0xe4, 0x3e, 0x14, 0xe3, 0x90, 0xbe,
- 0x90, 0x52, 0xb2, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
- 0x08, 0xc2, 0xd3, 0xbe, 0x46, 0x89, 0x2f, 0x3f, 0xe4, 0x9c, 0xc8, 0x3e,
- 0xf8, 0xbf, 0xac, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
- 0xd8, 0x1b, 0x35, 0xbf, 0x90, 0x22, 0x87, 0xbf, 0x64, 0x2d, 0xa7, 0xbe,
- 0x3c, 0x08, 0x1c, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0x84, 0x31, 0xf5, 0xbe,
- 0xec, 0xbd, 0x85, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x34, 0x87, 0x08, 0xbf,
- 0x34, 0x87, 0x88, 0xbf, 0x08, 0xc2, 0x53, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0x56, 0x2b, 0x00, 0xbf, 0x7e, 0x50, 0x0b, 0xbf, 0xf2, 0x3e, 0x19, 0xbf,
- 0x08, 0xc2, 0x53, 0x3e, 0x8c, 0x52, 0xb2, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
- 0xd0, 0x9a, 0x21, 0xbf, 0x68, 0x2d, 0x27, 0x3e, 0x80, 0x31, 0x75, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0x24, 0xb5, 0x8c, 0xbf, 0xdf, 0x9c, 0x48, 0xbf,
- 0xe0, 0x9c, 0x48, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x30, 0xe7, 0x5e, 0x3e,
- 0x20, 0xe5, 0xb7, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
- 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0x30, 0xe7, 0x5e, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0xbc,
- 0xb8, 0x77, 0x3d, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e,
- 0x38, 0x08, 0x1c, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0x9c, 0x54, 0xd9, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x3c, 0x08, 0x9c, 0x3e, 0x58, 0x0c, 0xea, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
- 0xec, 0xbd, 0x85, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
- 0x08, 0xc2, 0x53, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0xa0, 0x52, 0x32, 0x3d, 0x9c, 0x54, 0xd9, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xf8, 0xbf, 0xac, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0xa0, 0x52, 0x32, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
- 0x20, 0xe5, 0xb7, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
- 0xb8, 0x77, 0x3d, 0x3e, 0x61, 0x8d, 0x7d, 0xbf, 0x3c, 0x08, 0x9c, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x20, 0xe5, 0xb7, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
- 0xb8, 0x77, 0x3d, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
- 0x65, 0x2d, 0x27, 0xbf, 0xf0, 0xbd, 0x85, 0x3d, 0x3c, 0x08, 0x9c, 0xbe,
- 0x80, 0x50, 0x8b, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0xe0, 0x9c, 0xc8, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
- 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0x48, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0xe7, 0x1d, 0x5c, 0xbf,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0xb2, 0xbd,
- 0xe0, 0x9c, 0x48, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
- 0x88, 0x31, 0x75, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0x32, 0x3e,
- 0x58, 0x0c, 0x6a, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
- 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
- 0x24, 0xe5, 0xb7, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0xe0, 0xbd, 0x05, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x7c, 0x50, 0x8b, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x84, 0x31, 0xf5, 0xbe,
- 0xe8, 0xbd, 0x05, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x30, 0x08, 0x9c, 0xbd,
- 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
- 0x90, 0x31, 0xf5, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0xe0, 0xbd, 0x05, 0xbd, 0xf8, 0xbf, 0xac, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x40, 0x08, 0x1c, 0x3e, 0x5e, 0xac, 0x13, 0xbf, 0x20, 0xe7, 0x5e, 0xbd,
- 0xc8, 0x19, 0x0e, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d, 0x7e, 0x50, 0x0b, 0xbf,
- 0x54, 0x2b, 0x80, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0xe0, 0xbd, 0x85, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0x3c,
- 0xf0, 0xbd, 0x85, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0x08, 0xc2, 0xd3, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
- 0xe0, 0x9c, 0x48, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x85, 0xbd,
- 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0x00, 0xbe, 0x05, 0x3d, 0x08, 0xc2, 0xd3, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
- 0x80, 0x52, 0x32, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0x3c,
- 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d, 0x88, 0x52, 0x32, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
- 0xc0, 0x52, 0xb2, 0x3c, 0x7c, 0x50, 0x8b, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
- 0x7c, 0x50, 0x8b, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0x00, 0x00, 0x00,
- 0x90, 0x52, 0x32, 0x3e, 0x68, 0x2d, 0xa7, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
- 0xe0, 0x9c, 0x48, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
- 0x08, 0xc2, 0x53, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbd,
- 0x54, 0x2b, 0x80, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x7e, 0x50, 0x0b, 0xbf,
- 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x88, 0x31, 0x75, 0x3e,
- 0x18, 0xc4, 0xfa, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
- 0x30, 0xe7, 0xde, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
- 0x86, 0xd1, 0x1e, 0xbf, 0x4c, 0x0a, 0xc3, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
- 0x7c, 0x50, 0x8b, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0xf0, 0xbd, 0x85, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
- 0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0x00, 0xbe, 0x05, 0x3d, 0x56, 0x2b, 0x00, 0x3f, 0xf0, 0xbd, 0x05, 0x3e,
- 0x34, 0x87, 0x08, 0xbf, 0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0x53, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0x56, 0x2b, 0x00, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0x88, 0x52, 0x32, 0xbe,
- 0x7e, 0x50, 0x0b, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0x68, 0x2d, 0x27, 0x3e,
- 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0xe8, 0xbd, 0x85, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xfc, 0xbf, 0xac, 0x3e, 0x80, 0x52, 0x32, 0xbc,
- 0x30, 0x08, 0x9c, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0xb8, 0x77, 0x3d, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
- 0x3c, 0x08, 0x1c, 0xbf, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
- 0x90, 0x52, 0xb2, 0xbd, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0x40, 0x08, 0x9c, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x60, 0x0c, 0x6a, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
- 0xa8, 0x75, 0x96, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x05, 0x3d,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xa8, 0x75, 0x16, 0xbf,
- 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x65, 0x2d, 0x27, 0xbf, 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0x3c,
- 0x3c, 0x08, 0x9c, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x43, 0x89, 0x2f, 0xbf, 0x20, 0xe7, 0x5e, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0x3d, 0x64, 0x2d, 0xa7, 0xbe,
- 0xec, 0x9e, 0xef, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x9c, 0x54, 0xd9, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0xec, 0xbd, 0x85, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xe0, 0xbd, 0x05, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe, 0x17, 0xc4, 0x7a, 0xbf,
- 0x40, 0xe7, 0x5e, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0xb2, 0x3e,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0xc8, 0x19, 0x0e, 0xbf,
- 0xa0, 0x52, 0x32, 0x3d, 0x12, 0xe3, 0x10, 0xbf, 0x40, 0x08, 0x1c, 0x3e,
- 0x08, 0xc2, 0x53, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0xa2, 0xf4, 0x02, 0x3f, 0x30, 0xe7, 0xde, 0xbd,
- 0x20, 0xe5, 0xb7, 0xbe, 0x29, 0x66, 0x4b, 0xbf, 0x00, 0xbe, 0x05, 0x3d,
- 0x08, 0xc2, 0x53, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0xc4, 0x79, 0xe4, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x30, 0xe7, 0x5e, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0x30, 0xe7, 0xde, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
- 0xe8, 0xbd, 0x05, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x9c, 0x54, 0x59, 0xbf,
- 0xe0, 0x9c, 0x48, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
- 0xa0, 0x52, 0x32, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
- 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x3c, 0x08, 0x9c, 0x3e,
- 0x20, 0xe5, 0xb7, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x14, 0xe3, 0x90, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
- 0x38, 0x08, 0x1c, 0xbe, 0x1a, 0x64, 0x24, 0xbf, 0x80, 0x52, 0x32, 0xbd,
- 0xa8, 0x75, 0x16, 0xbf, 0x80, 0x52, 0x32, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
- 0x88, 0x31, 0x75, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0x00, 0x00, 0x00, 0x00, 0x30, 0x08, 0x9c, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x30, 0x08, 0x9c, 0xbd, 0xea, 0xbd, 0x05, 0xbf,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x58, 0x0c, 0xea, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0x7e, 0x50, 0x0b, 0xbf, 0x86, 0xd1, 0x1e, 0x3f, 0x88, 0x31, 0x75, 0x3e,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x8c, 0x52, 0xb2, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x31, 0x75, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x77, 0x3d, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x8c, 0x52, 0xb2, 0xbe,
- 0x38, 0x08, 0x1c, 0xbe, 0x08, 0xc2, 0x53, 0xbf, 0x65, 0x2d, 0x27, 0xbf,
- 0x30, 0xe7, 0xde, 0x3d, 0x64, 0x2d, 0xa7, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xf8, 0xbf, 0xac, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
- 0x8c, 0x52, 0xb2, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
- 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x31, 0x75, 0xbe, 0x34, 0xe7, 0xde, 0x3e,
- 0xec, 0xbd, 0x85, 0x3e, 0xb4, 0x77, 0xbd, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x30, 0xe7, 0xde, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
- 0xe0, 0x9c, 0x48, 0xbe, 0x22, 0xe5, 0x37, 0xbf, 0x74, 0x2f, 0xce, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0x3d, 0x3c, 0x08, 0x9c, 0xbe,
- 0x90, 0x52, 0x32, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0x80, 0x52, 0xb2, 0xbc, 0xe8, 0xbd, 0x85, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0x3c, 0x08, 0x9c, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
- 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x08, 0xc2, 0x53, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x58, 0x0c, 0x6a, 0xbe, 0x52, 0x8b, 0x56, 0xbf, 0x08, 0xc2, 0xd3, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
- 0x30, 0xe7, 0xde, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
- 0xe8, 0xbd, 0x05, 0xbe, 0xfb, 0x8f, 0x81, 0xbf, 0x74, 0x2f, 0xce, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
- 0x7c, 0x50, 0x8b, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x86, 0xd1, 0x1e, 0xbf,
- 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x24, 0xe5, 0xb7, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x6c, 0xae, 0x3a, 0xbf, 0xb8, 0x77, 0x3d, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
- 0x08, 0xc2, 0x53, 0x3e, 0x1a, 0x64, 0x24, 0xbf, 0x90, 0x52, 0xb2, 0x3d,
- 0x90, 0x52, 0xb2, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x30, 0x08, 0x9c, 0xbd,
- 0x3c, 0x08, 0x9c, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x1c, 0xc4, 0xfa, 0x3e,
- 0x30, 0xe7, 0xde, 0xbd, 0x8c, 0x52, 0xb2, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0x40, 0x08, 0x1c, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xc4, 0x79, 0xe4, 0xbe,
- 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x88, 0x31, 0x75, 0x3e,
- 0x58, 0x0c, 0xea, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0x5e, 0xac, 0x13, 0xbf, 0x90, 0x52, 0xb2, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
- 0xa2, 0xf4, 0x02, 0x3f, 0x90, 0x52, 0xb2, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
- 0xa0, 0xf4, 0x02, 0xbf, 0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x08, 0xc2, 0x53, 0xbe, 0x56, 0x2b, 0x00, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x3c, 0x08, 0x9c, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0x40, 0x08, 0x1c, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x1c, 0xc4, 0xfa, 0x3e,
- 0xb8, 0x77, 0x3d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x05, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0x18, 0xc4, 0xfa, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x31, 0x75, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
- 0x30, 0x08, 0x9c, 0xbd, 0x9c, 0x54, 0xd9, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0x3d,
- 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
- 0x88, 0x31, 0x75, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x31, 0x75, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0xf8, 0xbf, 0xac, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x14, 0xe3, 0x90, 0x3e,
- 0x80, 0x31, 0x75, 0xbe, 0x74, 0x2f, 0xce, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
- 0x30, 0xe7, 0x5e, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
- 0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0xfb, 0x8f, 0x81, 0xbf, 0xea, 0xbd, 0x05, 0xbf,
- 0x90, 0x52, 0x32, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
- 0x88, 0x52, 0x32, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x38, 0x08, 0x1c, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0xe0, 0x9c, 0xc8, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0xbd,
- 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x31, 0x75, 0xbe,
- 0x88, 0x52, 0x32, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0x34, 0xe7, 0xde, 0x3e, 0x74, 0x2f, 0xce, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x3c, 0x08, 0x9c, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0x32, 0xbd,
- 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0x5e, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
- 0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0xbd, 0x05, 0xbd,
- 0xa0, 0x52, 0x32, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0xde, 0xbd,
- 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xf0, 0xbd, 0x85, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0x00, 0xbe, 0x05, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0x88, 0x31, 0x75, 0x3e,
- 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x85, 0x3d,
- 0x38, 0x08, 0x1c, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0xae, 0xf6, 0x29, 0x3f,
- 0x00, 0xbe, 0x05, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
- 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
- 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x85, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
- 0x38, 0x08, 0x1c, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
- 0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x52, 0x32, 0xbc,
- 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
- 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xec, 0xbd, 0x85, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
- 0x18, 0xe3, 0x10, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0xc0, 0x52, 0xb2, 0x3c, 0x88, 0x31, 0x75, 0x3e, 0x90, 0x52, 0x32, 0x3e,
- 0x88, 0x31, 0x75, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x14, 0xe3, 0x90, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
- 0x80, 0x52, 0xb2, 0xbc, 0xa8, 0x75, 0x96, 0x3e, 0x90, 0x52, 0x32, 0x3e,
- 0xc0, 0x52, 0xb2, 0x3c, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
- 0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
- 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
- 0x90, 0x52, 0xb2, 0x3d, 0x20, 0xe5, 0xb7, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
- 0x80, 0x50, 0x8b, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
- 0x90, 0x52, 0xb2, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
- 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x30, 0x08, 0x9c, 0xbd,
- 0x90, 0x52, 0xb2, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xe7, 0x5e, 0x3d,
- 0x90, 0x52, 0xb2, 0x3d, 0x8c, 0x52, 0xb2, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
- 0xb8, 0x77, 0xbd, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0xc8, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
- 0x90, 0x52, 0xb2, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
- 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
- 0x64, 0x2d, 0xa7, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
- 0x80, 0x52, 0x32, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0xa2, 0xf4, 0x02, 0x3f, 0x14, 0xe3, 0x90, 0x3e,
- 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0x80, 0x52, 0xb2, 0xbc, 0x30, 0x08, 0x9c, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
- 0x00, 0xbe, 0x05, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
- 0x30, 0xe7, 0x5e, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
- 0xe8, 0xbd, 0x85, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
- 0xf0, 0xbd, 0x85, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x88, 0x52, 0x32, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x80, 0x52, 0x32, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
- 0x3c, 0x08, 0x9c, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
- 0xe8, 0xbd, 0x85, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
- 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0xbd,
- 0x60, 0x2d, 0x27, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
- 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x88, 0x31, 0x75, 0x3e,
- 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x3c, 0x08, 0x9c, 0xbe,
- 0x08, 0xc2, 0x53, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
- 0x68, 0x2d, 0x27, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
- 0xf0, 0xbd, 0x85, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x10, 0xe3, 0x10, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
- 0xe0, 0x9c, 0x48, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
- 0x00, 0xbe, 0x05, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
- 0x40, 0x08, 0x1c, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0xe0, 0xbd, 0x05, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
- 0x58, 0x0c, 0x6a, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
- 0xe8, 0xbd, 0x85, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
- 0x4c, 0x0a, 0xc3, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x20, 0xe5, 0xb7, 0xbe,
- 0x7c, 0x50, 0x8b, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
- 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
- 0x90, 0x31, 0xf5, 0x3d, 0xb8, 0x77, 0x3d, 0x3e, 0x30, 0xe7, 0x5e, 0x3e,
- 0xc8, 0x19, 0x0e, 0xbf, 0xe4, 0x9c, 0xc8, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0xd3, 0xbe, 0xaf, 0xf6, 0x29, 0xbf,
- 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
- 0x0c, 0xc2, 0xd3, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0xf9, 0xbf, 0x2c, 0xbf,
- 0x3c, 0x08, 0x9c, 0xbe, 0x5c, 0x0c, 0xea, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
- 0x08, 0xc2, 0x53, 0xbe, 0xa8, 0x75, 0x96, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
- 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x50, 0x8b, 0x3e,
- 0x00, 0x41, 0x40, 0xbf, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0xbd,
- 0xb8, 0x77, 0x3d, 0xbe, 0xa8, 0x75, 0x96, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
- 0xb8, 0x77, 0x3d, 0x3e, 0xfc, 0xbf, 0xac, 0x3e, 0x88, 0x52, 0x32, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0x30, 0xe7, 0xde, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0x14, 0xe3, 0x90, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
- 0xe8, 0xbd, 0x05, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
- 0xb8, 0x77, 0x3d, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0x34, 0x87, 0x08, 0xbf, 0x22, 0xe5, 0x37, 0xbf,
- 0xa8, 0x75, 0x16, 0xbf, 0xf8, 0xbf, 0xac, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0x8d, 0x52, 0x32, 0xbf, 0x40, 0x08, 0x1c, 0x3e,
- 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd,
- 0x3c, 0x08, 0x9c, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xe8, 0xbd, 0x85, 0xbe,
- 0x3c, 0x08, 0x9c, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
- 0xa8, 0x75, 0x96, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
- 0x38, 0x08, 0x1c, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0xfc, 0xbf, 0xac, 0x3e,
- 0x3c, 0x08, 0x9c, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0x3c,
- 0xa8, 0x75, 0x16, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0x3c,
- 0xa8, 0x75, 0x96, 0x3e, 0x20, 0xe5, 0xb7, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e,
- 0x10, 0xe3, 0x10, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x4c, 0x0a, 0xc3, 0x3e,
- 0x08, 0xc2, 0x53, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x40, 0x08, 0x1c, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x68, 0x2d, 0x27, 0x3e,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0x5a, 0x0c, 0x6a, 0xbf,
- 0x90, 0x52, 0xb2, 0x3d, 0x54, 0x2b, 0x80, 0xbe, 0x9c, 0x54, 0xd9, 0x3e,
- 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0xbe, 0x80, 0x31, 0x75, 0xbe,
- 0x22, 0xe5, 0x37, 0xbf, 0xa8, 0x75, 0x96, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
- 0x4c, 0x0a, 0xc3, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x74, 0x2f, 0xce, 0x3e,
- 0x34, 0x87, 0x08, 0xbf, 0x7e, 0x50, 0x0b, 0x3f, 0xb8, 0x77, 0x3d, 0x3e,
- 0x86, 0xd1, 0x1e, 0xbf, 0x9c, 0x54, 0xd9, 0xbe, 0x56, 0x2b, 0x00, 0xbf,
- 0x9c, 0x54, 0xd9, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
- 0x9c, 0x54, 0xd9, 0x3e, 0x43, 0x89, 0x2f, 0xbf, 0x30, 0xe7, 0x5e, 0x3e,
- 0x20, 0xe7, 0x5e, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0x88, 0x31, 0x75, 0x3e, 0x8d, 0x52, 0x32, 0xbf, 0xe8, 0xbd, 0x85, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x88, 0x52, 0x32, 0xbe, 0x12, 0xe3, 0x10, 0xbf, 0x20, 0xe5, 0xb7, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
- 0x90, 0x52, 0x32, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0xcd, 0xfa, 0x77, 0xbf,
- 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0x08, 0x9c, 0xbd,
- 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0xbd, 0xfc, 0xbf, 0xac, 0x3e,
- 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x60, 0x2d, 0x27, 0xbe,
- 0xfc, 0xbf, 0xac, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
- 0xa0, 0xf4, 0x02, 0xbf, 0xf8, 0xbf, 0xac, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0xe0, 0xbd, 0x05, 0xbd, 0x76, 0x2f, 0x4e, 0x3f, 0x38, 0x08, 0x1c, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0x00, 0x00, 0x00, 0x00, 0xb6, 0x77, 0x3d, 0xbf,
- 0xe0, 0x9c, 0x48, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e, 0x80, 0x52, 0x32, 0xbc,
- 0xb8, 0x77, 0x3d, 0x3e, 0xea, 0xbd, 0x05, 0x3f, 0x74, 0x2f, 0x4e, 0xbf,
- 0x90, 0x31, 0xf5, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0xde, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
- 0xec, 0xbd, 0x85, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x52, 0xb2, 0x3c, 0xe4, 0x9c, 0xc8, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
- 0xe8, 0xbd, 0x85, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0xc0, 0x52, 0xb2, 0x3c, 0x68, 0x2d, 0x27, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
- 0xec, 0x9e, 0xef, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x34, 0x87, 0x08, 0xbf,
- 0xec, 0x9e, 0xef, 0xbe, 0x34, 0xe7, 0xde, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
- 0x14, 0xe3, 0x90, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
- 0x80, 0x52, 0x32, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x08, 0x9c, 0xbe,
- 0xe0, 0x9c, 0x48, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
- 0x30, 0xe7, 0x5e, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
- 0xa2, 0xf4, 0x02, 0x3f, 0x30, 0xe7, 0xde, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e,
- 0x74, 0x2f, 0xce, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
- 0x30, 0xe7, 0xde, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0x32, 0xbd,
- 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
- 0x90, 0x31, 0xf5, 0x3d, 0x0c, 0xc2, 0xd3, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0x80, 0x31, 0xf5, 0xbd, 0x58, 0x0c, 0xea, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
- 0x7c, 0x50, 0x8b, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
- 0xa8, 0x75, 0x96, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
- 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0xbd,
- 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
- 0x74, 0x2f, 0xce, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0xbe,
- 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0x32, 0xbd,
- 0x38, 0x08, 0x1c, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x66, 0x2d, 0x27, 0x3f,
- 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
- 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x40, 0x08, 0x1c, 0x3e,
- 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x9c, 0x54, 0xd9, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
- 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe,
- 0x7c, 0x50, 0x8b, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
- 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
- 0x40, 0xe7, 0x5e, 0x3d, 0xd0, 0x9a, 0xa1, 0x3e, 0xe8, 0xbd, 0x85, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x88, 0x52, 0x32, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xf8, 0xbf, 0xac, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
- 0x80, 0x50, 0x8b, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x5e, 0xac, 0x13, 0xbf,
- 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0xbc, 0xf0, 0xbd, 0x85, 0x3d,
- 0x3c, 0x08, 0x9c, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0xe0, 0xbd, 0x85, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x90, 0x52, 0xb2, 0x3e,
- 0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
- 0x30, 0xe7, 0xde, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x0c, 0xc2, 0xd3, 0x3e,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0x3c,
- 0x90, 0x31, 0xf5, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
- 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
- 0xec, 0xbd, 0x85, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
- 0xec, 0xbd, 0x85, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x80, 0x31, 0xf5, 0xbd, 0x5e, 0xac, 0x13, 0xbf, 0x68, 0x2d, 0x27, 0x3e,
- 0x8c, 0x52, 0xb2, 0xbe, 0x6c, 0xae, 0x3a, 0xbf, 0xa8, 0x75, 0x96, 0xbe,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0x3c,
- 0x68, 0x2d, 0x27, 0x3e, 0xe4, 0x9c, 0xc8, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0xf2, 0x3e, 0x19, 0xbf, 0x74, 0x2f, 0xce, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
- 0x74, 0x2f, 0xce, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x9c, 0x54, 0xd9, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
- 0x9c, 0x54, 0xd9, 0x3e, 0x9c, 0x54, 0xd9, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
- 0x10, 0xe3, 0x10, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x52, 0x32, 0xbc,
- 0x80, 0x52, 0x32, 0xbc, 0xec, 0xbd, 0x85, 0x3e, 0x80, 0x31, 0x75, 0xbe,
- 0x5c, 0x0c, 0xea, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
- 0xe8, 0xbd, 0x05, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0xe0, 0x9c, 0x48, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
- 0x20, 0xe5, 0xb7, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0x5e, 0xac, 0x13, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
- 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0x32, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x64, 0x2d, 0xa7, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x95, 0xd3, 0x45, 0xbf,
- 0x84, 0x31, 0xf5, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbd,
- 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x7c, 0x50, 0x8b, 0xbe,
- 0x74, 0x2f, 0x4e, 0xbf, 0xa8, 0x75, 0x16, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x3c, 0x08, 0x9c, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xa8, 0x75, 0x96, 0x3e,
- 0xec, 0x9e, 0xef, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0x56, 0x2b, 0x00, 0xbf, 0x80, 0x31, 0x75, 0xbe,
- 0xd0, 0x9a, 0xa1, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
- 0xb4, 0x77, 0xbd, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x36, 0x87, 0x08, 0x3f,
- 0x90, 0x52, 0xb2, 0x3d, 0xb4, 0x77, 0xbd, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0xf2, 0x3e, 0x19, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0x6c, 0xae, 0x3a, 0xbf,
- 0x3c, 0x08, 0x9c, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x74, 0x2f, 0xce, 0x3e,
- 0x34, 0x87, 0x08, 0xbf, 0x08, 0xc2, 0x53, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0x1c, 0xc4, 0xfa, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
- 0x90, 0x52, 0xb2, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0x84, 0x31, 0xf5, 0x3e,
- 0x80, 0x52, 0x32, 0xbd, 0x8d, 0x52, 0x32, 0xbf, 0x56, 0x2b, 0x00, 0xbf,
- 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x8c, 0x52, 0xb2, 0xbe,
- 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x34, 0x87, 0x08, 0xbf,
- 0xd0, 0x9a, 0x21, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0x48, 0xbe,
- 0x0c, 0xc2, 0xd3, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
- 0x40, 0x08, 0x1c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
- 0x08, 0xc2, 0x53, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0xb4, 0x77, 0xbd, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
- 0x40, 0x08, 0x9c, 0x3d, 0x54, 0x2b, 0x80, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
- 0xa8, 0x75, 0x96, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
- 0xe4, 0x9c, 0xc8, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbd,
- 0x9c, 0x54, 0xd9, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0xa8, 0x75, 0x16, 0xbf, 0xe0, 0x9c, 0x48, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
- 0x80, 0x52, 0x32, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
- 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0xe8, 0xbd, 0x05, 0xbe,
- 0x7e, 0x50, 0x0b, 0x3f, 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
- 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
- 0x08, 0xc2, 0x53, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
- 0xa0, 0xf4, 0x02, 0xbf, 0x00, 0xbe, 0x05, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
- 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
- 0xd0, 0x9a, 0xa1, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
- 0x00, 0xbe, 0x05, 0x3d, 0x54, 0x2b, 0x80, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
- 0xa0, 0x52, 0x32, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x5e, 0xac, 0x13, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
- 0xf0, 0xbd, 0x05, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
- 0x90, 0x52, 0xb2, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x60, 0x2d, 0x27, 0xbe,
- 0x4c, 0x0a, 0xc3, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0x80, 0x52, 0x32, 0x3c, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0x32, 0x3e,
- 0xf0, 0xbd, 0x85, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
- 0x80, 0x52, 0x32, 0xbc, 0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x40, 0xe7, 0x5e, 0x3d,
- 0x90, 0x52, 0xb2, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
- 0xec, 0xbd, 0x85, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
- 0x90, 0x52, 0xb2, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x60, 0x2d, 0x27, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
- 0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x85, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x10, 0xe3, 0x10, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
- 0x30, 0xe7, 0xde, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0xa8, 0x75, 0x96, 0xbe,
- 0x30, 0xe7, 0x5e, 0x3e, 0x43, 0x89, 0x2f, 0xbf, 0x7c, 0x50, 0x8b, 0xbe,
- 0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x52, 0x32, 0x3e,
- 0x80, 0x52, 0x32, 0x3c, 0xf0, 0xbd, 0x85, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
- 0x38, 0x08, 0x1c, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
- 0x14, 0xe3, 0x90, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
- 0x22, 0xe5, 0x37, 0xbf, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbc,
- 0x08, 0xc2, 0x53, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0xa8, 0x75, 0x96, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x54, 0x2b, 0x80, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0x80, 0x50, 0x8b, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x74, 0x2f, 0xce, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
- 0x30, 0xe7, 0x5e, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0x20, 0xe5, 0xb7, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
- 0xf8, 0xbf, 0xac, 0xbe, 0xa8, 0x75, 0x16, 0xbf, 0x24, 0xe5, 0xb7, 0x3e,
- 0xc0, 0x52, 0xb2, 0x3c, 0xc0, 0x52, 0xb2, 0x3c, 0x74, 0x2f, 0xce, 0xbe,
- 0x3c, 0x08, 0x9c, 0x3e, 0xf8, 0xbf, 0xac, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0x9c, 0x54, 0xd9, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0x18, 0xc4, 0xfa, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
- 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x31, 0x75, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
- 0xa8, 0x75, 0x96, 0xbe, 0xca, 0x19, 0x0e, 0x3f, 0x80, 0x52, 0x32, 0xbc,
- 0x40, 0x08, 0x1c, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e,
- 0x5e, 0xac, 0x13, 0xbf, 0x20, 0xe7, 0x5e, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
- 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
- 0xf0, 0xbd, 0x05, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x36, 0x87, 0x08, 0x3f,
- 0xf0, 0xbd, 0x85, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
- 0x80, 0x52, 0x32, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
- 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x20, 0xe5, 0xb7, 0xbe,
- 0x80, 0x50, 0x8b, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
- 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0xbc,
- 0x90, 0x52, 0x32, 0x3e, 0x34, 0xe7, 0xde, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
- 0xec, 0xbd, 0x85, 0x3e, 0xae, 0xf6, 0x29, 0x3f, 0x74, 0x2f, 0xce, 0xbe,
- 0x83, 0x31, 0x75, 0xbf, 0x30, 0xe7, 0x5e, 0x3e, 0x74, 0x2f, 0xce, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0xe8, 0xbd, 0x85, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
- 0xe0, 0x9c, 0x48, 0x3e, 0xfc, 0xbf, 0xac, 0x3e, 0xc4, 0x79, 0xe4, 0xbe,
- 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x14, 0xe3, 0x90, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
- 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0x3e, 0xc6, 0x79, 0x64, 0x3f,
- 0x9c, 0x54, 0xd9, 0x3e, 0xfc, 0xbf, 0xac, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
- 0x38, 0x08, 0x1c, 0xbe, 0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0xb8, 0x77, 0x3d, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0xc4, 0x79, 0xe4, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0xe7, 0x5e, 0xbd,
- 0x3c, 0x08, 0x9c, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
- 0x14, 0xe3, 0x90, 0x3e, 0xf2, 0x3e, 0x19, 0x3f, 0x40, 0x08, 0x9c, 0x3d,
- 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
- 0x5e, 0xac, 0x13, 0x3f, 0xb8, 0x77, 0x3d, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x84, 0x31, 0xf5, 0x3e,
- 0xaa, 0x75, 0x16, 0x3f, 0x68, 0x2d, 0xa7, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
- 0x84, 0x31, 0xf5, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0x40, 0x08, 0x1c, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
- 0xe8, 0xbd, 0x05, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
- 0xb8, 0x77, 0xbd, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x68, 0x2d, 0xa7, 0x3e,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x80, 0x52, 0x32, 0x3c, 0x00, 0xbe, 0x05, 0x3d, 0x60, 0x0c, 0x6a, 0x3e,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0x00, 0xbe, 0x05, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
- 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x08, 0xc2, 0xd3, 0xbe,
- 0xca, 0x19, 0x0e, 0x3f, 0xe8, 0xbd, 0x05, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
- 0x08, 0xc2, 0x53, 0x3e, 0xec, 0x9e, 0xef, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
- 0x80, 0x52, 0x32, 0x3c, 0xa2, 0xf4, 0x02, 0x3f, 0x68, 0x2d, 0x27, 0x3e,
- 0xe0, 0xbd, 0x05, 0xbd, 0xc4, 0x79, 0xe4, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xf8, 0xbf, 0xac, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
- 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x20, 0xe5, 0xb7, 0xbe,
- 0xa8, 0x75, 0x96, 0xbe, 0xa4, 0xd5, 0x6c, 0xbf, 0xe0, 0xbd, 0x05, 0xbd,
- 0xfc, 0xbf, 0xac, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
- 0x90, 0x52, 0xb2, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
- 0x18, 0xe3, 0x10, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x68, 0x2d, 0xa7, 0x3e,
- 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
- 0x9c, 0x54, 0xd9, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0x6e, 0xae, 0x3a, 0x3f,
- 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
- 0x90, 0x52, 0xb2, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x80, 0x31, 0xf5, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xb8, 0x77, 0x3d, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x52, 0x32, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
- 0x74, 0x2f, 0xce, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x80, 0x52, 0x32, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
- 0x80, 0x50, 0x8b, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x08, 0xc2, 0x53, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x88, 0x52, 0x32, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
- 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x30, 0x08, 0x9c, 0xbd,
- 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
- 0x38, 0x08, 0x1c, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbc,
- 0x54, 0x2b, 0x80, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
- 0x80, 0x31, 0xf5, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0x30, 0xe7, 0xde, 0xbd, 0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x80, 0x31, 0xf5, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
- 0x60, 0x2d, 0x27, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x88, 0x52, 0x32, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0x32, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x4c, 0x0a, 0xc3, 0x3e,
- 0x18, 0xc4, 0xfa, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0x75, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd,
- 0x80, 0x31, 0xf5, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x20, 0xe7, 0x5e, 0xbd,
- 0x90, 0x52, 0xb2, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x20, 0xe5, 0xb7, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0x32, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0x80, 0x52, 0x32, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0x88, 0x52, 0x32, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x80, 0x31, 0x75, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x7c, 0x50, 0x8b, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0xe4, 0x9c, 0xc8, 0x3e,
- 0x08, 0xc2, 0xd3, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
- 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0x32, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
- 0x00, 0xbe, 0x05, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0x3c, 0x08, 0x9c, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0x5e, 0x3e,
- 0x40, 0x08, 0x9c, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x58, 0x0c, 0x6a, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
- 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
- 0xe0, 0x9c, 0x48, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0xec, 0x9e, 0xef, 0x3e,
- 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x40, 0x08, 0x9c, 0x3d,
- 0x30, 0xe7, 0xde, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
- 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
- 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0xb4, 0x77, 0xbd, 0xbe,
- 0xa8, 0x75, 0x96, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
- 0x58, 0x2b, 0x80, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
- 0xb8, 0x77, 0x3d, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
- 0x90, 0x31, 0xf5, 0x3d, 0xe8, 0xbd, 0x85, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd, 0xf9, 0xbf, 0x2c, 0xbf,
- 0x90, 0x52, 0x32, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x80, 0x52, 0x32, 0xbc, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0xb8, 0x77, 0x3d, 0x3e, 0xec, 0xbd, 0x85, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
- 0x38, 0x08, 0x1c, 0xbe, 0x3c, 0x08, 0x1c, 0xbf, 0x7e, 0x50, 0x0b, 0xbf,
- 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x12, 0xe3, 0x10, 0xbf, 0x80, 0x52, 0xb2, 0xbc,
- 0x40, 0x08, 0x9c, 0x3d, 0xc8, 0x19, 0x0e, 0xbf, 0xf8, 0xbf, 0xac, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x1a, 0x64, 0x24, 0xbf,
- 0x08, 0xc2, 0x53, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
- 0xe0, 0x9c, 0x48, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
- 0x08, 0xc2, 0x53, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x52, 0x8b, 0x56, 0xbf,
- 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
- 0x30, 0xe7, 0xde, 0x3d, 0x24, 0xe5, 0xb7, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
- 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0xc8, 0x19, 0x0e, 0xbf,
- 0x80, 0x31, 0xf5, 0xbd, 0x84, 0x31, 0xf5, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0x80, 0x52, 0x32, 0xbd, 0xd0, 0x9a, 0xa1, 0x3e, 0x3c, 0x08, 0x1c, 0xbf,
- 0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0xe8, 0xbd, 0x85, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0xf2, 0x3e, 0x19, 0xbf, 0xe0, 0x9c, 0x48, 0x3e,
- 0x08, 0xc2, 0xd3, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
- 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbc,
- 0x56, 0x2b, 0x00, 0xbf, 0xa0, 0xf4, 0x02, 0xbf, 0x88, 0x52, 0x32, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x9c, 0x54, 0xd9, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0xd0, 0x9a, 0xa1, 0x3e, 0xd8, 0x1b, 0x35, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
- 0xa8, 0x75, 0x96, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x08, 0xc2, 0x53, 0x3e,
- 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0xbe,
- 0x95, 0xd3, 0x45, 0xbf, 0xe0, 0x9c, 0x48, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
- 0xe0, 0x9c, 0x48, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
- 0x9c, 0x54, 0xd9, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x29, 0x66, 0x4b, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0x5e, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0x56, 0x2b, 0x00, 0xbf, 0x88, 0x52, 0x32, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0xb6, 0x77, 0x3d, 0xbf, 0x95, 0xd3, 0x45, 0xbf,
- 0x10, 0xe3, 0x10, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0x8c, 0x52, 0xb2, 0xbe,
- 0x17, 0xc4, 0x7a, 0xbf, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
- 0x3c, 0x08, 0x1c, 0xbf, 0xa8, 0x75, 0x96, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
- 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0x80, 0x52, 0xb2, 0xbc, 0x7e, 0x50, 0x8b, 0xbf, 0x08, 0xc2, 0xd3, 0xbe,
- 0xe8, 0xbd, 0x05, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0x20, 0xe5, 0xb7, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x1a, 0x64, 0x24, 0xbf, 0xc4, 0x79, 0xe4, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0xd0, 0x9a, 0x21, 0xbf, 0x84, 0x31, 0xf5, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0x3c, 0x08, 0x9c, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x52, 0x32, 0xbe,
- 0x5e, 0xac, 0x13, 0xbf, 0x90, 0x31, 0xf5, 0x3d, 0x5e, 0xac, 0x13, 0xbf,
- 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0xb4, 0x77, 0xbd, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xd0, 0x9a, 0x21, 0xbf,
- 0xb4, 0x77, 0xbd, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
- 0x90, 0x52, 0xb2, 0xbd, 0x18, 0xc4, 0xfa, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
- 0x7c, 0x50, 0x8b, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0x32, 0x3e,
- 0x60, 0x0c, 0x6a, 0x3e, 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0x10, 0xe3, 0x10, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x1c, 0xc4, 0xfa, 0x3e,
- 0x52, 0x8b, 0x56, 0xbf, 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x3c, 0x08, 0x9c, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x9c, 0x54, 0xd9, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e,
- 0xec, 0x9e, 0xef, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
- 0x08, 0xc2, 0x53, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0x18, 0xc4, 0xfa, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
- 0x60, 0x0c, 0x6a, 0x3e, 0x95, 0xd3, 0x45, 0xbf, 0x40, 0x08, 0x9c, 0x3d,
- 0x90, 0x52, 0x32, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x8c, 0x52, 0xb2, 0xbe,
- 0x34, 0xe7, 0xde, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
- 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x6c, 0xae, 0x3a, 0xbf,
- 0xec, 0xbd, 0x85, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x74, 0x2f, 0xce, 0x3e,
- 0x24, 0xe5, 0xb7, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x74, 0x2f, 0xce, 0xbe,
- 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
- 0xe0, 0xbd, 0x05, 0xbd, 0x5e, 0xac, 0x13, 0xbf, 0xb4, 0x77, 0xbd, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x84, 0x31, 0xf5, 0x3e, 0x9c, 0x54, 0xd9, 0x3e,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
- 0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0xbd,
- 0xd8, 0x1b, 0x35, 0xbf, 0x30, 0xe7, 0x5e, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0xb8, 0x77, 0x3d, 0x3e, 0xfa, 0xbf, 0x2c, 0x3f, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xa8, 0x75, 0x96, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
- 0x68, 0x2d, 0x27, 0x3e, 0x20, 0xe5, 0xb7, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
- 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x43, 0x89, 0x2f, 0xbf,
- 0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x90, 0x52, 0xb2, 0xbd, 0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0x24, 0xe5, 0xb7, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x80, 0x52, 0x32, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
- 0xc8, 0x19, 0x0e, 0xbf, 0x54, 0x2b, 0x80, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
- 0xe8, 0xbd, 0x85, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x84, 0x31, 0xf5, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0x54, 0x2b, 0x80, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
- 0x40, 0x08, 0x1c, 0x3e, 0xd8, 0x1b, 0x35, 0xbf, 0xa8, 0x75, 0x96, 0xbe,
- 0xfc, 0xbf, 0xac, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0x00, 0x41, 0x40, 0xbf, 0x34, 0x87, 0x08, 0xbf, 0x30, 0x08, 0x9c, 0xbd,
- 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x88, 0x31, 0x75, 0x3e,
- 0x36, 0x87, 0x08, 0x3f, 0x74, 0x2f, 0xce, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
- 0xe0, 0x9c, 0x48, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
- 0xe8, 0xbd, 0x85, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
- 0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
- 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x18, 0xc4, 0xfa, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
- 0x58, 0x0c, 0x6a, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
- 0xb8, 0x77, 0x3d, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x3c, 0x08, 0x9c, 0xbe,
- 0x34, 0xe7, 0xde, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0x24, 0xe5, 0xb7, 0x3e,
- 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
- 0x18, 0xe3, 0x10, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x1c, 0xc4, 0xfa, 0x3e, 0xec, 0xbd, 0x85, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
- 0xe4, 0x9c, 0xc8, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
- 0x30, 0xe7, 0x5e, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x52, 0x32, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0xf0, 0xbd, 0x05, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
- 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x05, 0xbd,
- 0x60, 0x0c, 0x6a, 0x3e, 0x34, 0xe7, 0xde, 0x3e, 0x3c, 0x08, 0x9c, 0xbe,
- 0x90, 0x52, 0xb2, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0x10, 0xe3, 0x10, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
- 0x68, 0x2d, 0x27, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0xec, 0xbd, 0x85, 0x3e,
- 0x60, 0x2d, 0x27, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0xca, 0x19, 0x0e, 0x3f, 0x30, 0xe7, 0x5e, 0x3e,
- 0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0xc8, 0x3d, 0x18, 0xc4, 0xfa, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0xea, 0xbd, 0x05, 0x3f, 0x5c, 0x0c, 0xea, 0x3e,
- 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0x88, 0x31, 0x75, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0xe4, 0x9c, 0xc8, 0x3e,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0x38, 0x08, 0x1c, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x64, 0x2d, 0xa7, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0x5e, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
- 0x90, 0x52, 0xb2, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0xc4, 0x79, 0xe4, 0xbe,
- 0xd0, 0x9a, 0x21, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe, 0xe7, 0x1d, 0x5c, 0xbf,
- 0xf8, 0xbf, 0xac, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x14, 0xe3, 0x90, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x86, 0xd1, 0x1e, 0xbf, 0xa0, 0xf4, 0x02, 0xbf,
- 0x08, 0xc2, 0x53, 0xbf, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
- 0x80, 0x52, 0x32, 0xbd, 0x5c, 0x0c, 0xea, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x68, 0x2d, 0x27, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0xbd,
- 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0x32, 0x3c,
- 0x80, 0x31, 0xf5, 0xbd, 0xfc, 0xbf, 0xac, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
- 0xf0, 0xbd, 0x05, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0x3c,
- 0x8c, 0x52, 0xb2, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
- 0xb8, 0x77, 0x3d, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
- 0xb4, 0x77, 0xbd, 0xbe, 0xee, 0x9e, 0x6f, 0xbf, 0x80, 0x52, 0x32, 0xbd,
- 0xb8, 0x77, 0x3d, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x3c, 0x08, 0x9c, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
- 0x84, 0x31, 0xf5, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0xe4, 0x9c, 0xc8, 0x3e,
- 0xe8, 0xbd, 0x85, 0xbe, 0x3c, 0x08, 0x1c, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
- 0x95, 0xd3, 0x45, 0xbf, 0xc0, 0x52, 0xb2, 0x3c, 0x00, 0xbe, 0x05, 0x3d,
- 0xea, 0xbd, 0x85, 0xbf, 0xe8, 0xbd, 0x05, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0x18, 0xc4, 0xfa, 0xbe, 0x5e, 0xac, 0x13, 0xbf, 0x80, 0x52, 0x32, 0xbd,
- 0xe8, 0xbd, 0x85, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x64, 0x2d, 0xa7, 0xbe,
- 0xb8, 0x77, 0x3d, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x5e, 0xac, 0x13, 0xbf,
- 0xc8, 0x19, 0x0e, 0xbf, 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
- 0x29, 0x66, 0x4b, 0xbf, 0x80, 0x31, 0x75, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0x45, 0x59, 0x84, 0xbf, 0x24, 0xb5, 0x8c, 0xbf, 0x90, 0x52, 0x32, 0x3e,
- 0xb8, 0x77, 0x3d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0x32, 0x3e,
- 0xa8, 0x75, 0x16, 0xbf, 0xe8, 0xbd, 0x05, 0xbe, 0xf9, 0xbf, 0x2c, 0xbf,
- 0x84, 0x31, 0xf5, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
- 0x9c, 0x54, 0xd9, 0x3e, 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0x20, 0xe5, 0xb7, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x8c, 0x52, 0xb2, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x9c, 0x54, 0xd9, 0xbe,
- 0x30, 0xe7, 0xde, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0xf0, 0xbd, 0x05, 0x3e,
- 0xee, 0x9e, 0x6f, 0xbf, 0x30, 0x08, 0x9c, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0x80, 0x52, 0x32, 0x3c,
- 0x22, 0xe5, 0x37, 0xbf, 0x18, 0xc4, 0xfa, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
- 0x00, 0xbe, 0x05, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0xaf, 0xf6, 0x29, 0xbf, 0xd0, 0x9a, 0xa1, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
- 0xe7, 0x1d, 0x5c, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0xa8, 0x75, 0x96, 0x3e, 0xc8, 0x19, 0x0e, 0xbf,
- 0x18, 0xe3, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x1c, 0x3e,
- 0x7e, 0x50, 0x0b, 0xbf, 0x18, 0xc4, 0xfa, 0xbe, 0x80, 0x50, 0x8b, 0x3e,
- 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
- 0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0xaf, 0xf6, 0x29, 0xbf, 0xd8, 0x1b, 0x35, 0xbf,
- 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe, 0x8d, 0x52, 0x32, 0xbf,
- 0xe0, 0x9c, 0xc8, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x34, 0x87, 0x08, 0xbf,
- 0xdf, 0x9c, 0x48, 0xbf, 0x90, 0x52, 0xb2, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
- 0x64, 0x2d, 0xa7, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x58, 0x0c, 0xea, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0x48, 0xbe,
- 0xd0, 0x9a, 0xa1, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x9c, 0x54, 0xd9, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x85, 0x3d,
- 0x1a, 0x64, 0x24, 0xbf, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0xbd,
- 0x90, 0x31, 0xf5, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x9c, 0x54, 0xd9, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0xec, 0x9e, 0xef, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
- 0x56, 0x2b, 0x00, 0xbf, 0x60, 0x2d, 0x27, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
- 0x80, 0x52, 0xb2, 0xbc, 0x64, 0x2d, 0xa7, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
- 0x60, 0x0c, 0x6a, 0x3e, 0x34, 0xe7, 0xde, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
- 0xf0, 0xbd, 0x85, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0xa8, 0x75, 0x96, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0x95, 0xd3, 0x45, 0xbf, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
- 0x74, 0x2f, 0xce, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0xde, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0xe0, 0x9c, 0x48, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0xb4, 0x77, 0xbd, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
- 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0x3c,
- 0x90, 0x52, 0xb2, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x7c, 0x50, 0x8b, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0x5e, 0xac, 0x13, 0xbf,
- 0x60, 0x0c, 0x6a, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x31, 0x75, 0xbe,
- 0xae, 0xf6, 0x29, 0x3f, 0x30, 0xe7, 0xde, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0xfc, 0xbf, 0xac, 0x3e,
- 0xb4, 0x77, 0xbd, 0xbe, 0xf2, 0x3e, 0x19, 0x3f, 0x58, 0x2b, 0x80, 0x3e,
- 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0x3d, 0x58, 0x0c, 0x6a, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0xea, 0xbd, 0x05, 0x3f, 0x0c, 0xc2, 0xd3, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x88, 0x52, 0x32, 0xbe, 0xea, 0xbd, 0x05, 0x3f,
- 0x30, 0xe7, 0x5e, 0xbe, 0xec, 0x9e, 0xef, 0x3e, 0x52, 0x8b, 0x56, 0xbf,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xdf, 0x9c, 0x48, 0xbf,
- 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x58, 0x0c, 0x6a, 0xbe, 0xb8, 0x77, 0xbd, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x68, 0x2d, 0x27, 0x3e, 0xf9, 0xbf, 0x2c, 0xbf,
- 0x60, 0x2d, 0x27, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
- 0x20, 0xe5, 0xb7, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe5, 0xb7, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x88, 0x52, 0x32, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x4c, 0x0a, 0xc3, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x64, 0x2d, 0xa7, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0x60, 0x2d, 0x27, 0xbe, 0xa8, 0x75, 0x96, 0x3e, 0x58, 0x0c, 0xea, 0xbe,
- 0xa8, 0x75, 0x96, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0x3c,
- 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0xbd,
- 0x24, 0xe5, 0xb7, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0x7e, 0x50, 0x0b, 0xbf, 0x7c, 0x50, 0x8b, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
- 0x90, 0x52, 0xb2, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0x3c,
- 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x74, 0x2f, 0xce, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x74, 0x2f, 0xce, 0x3e,
- 0x68, 0x2d, 0x27, 0x3e, 0xe8, 0xbd, 0x85, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0x3c, 0x08, 0x1c, 0xbf,
- 0xd0, 0x9a, 0x21, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
- 0x80, 0x50, 0x8b, 0x3e, 0x34, 0xe7, 0xde, 0x3e, 0xd8, 0x1b, 0x35, 0xbf,
- 0x90, 0x52, 0xb2, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x43, 0x89, 0x2f, 0xbf, 0x7c, 0x50, 0x8b, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
- 0x08, 0xc2, 0xd3, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
- 0x58, 0x2b, 0x80, 0x3e, 0xa0, 0xf4, 0x02, 0xbf, 0xec, 0x9e, 0xef, 0xbe,
- 0xa8, 0x75, 0x96, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
- 0x58, 0x0c, 0x6a, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0xda, 0x1b, 0x35, 0x3f,
- 0xe0, 0xbd, 0x05, 0xbd, 0x58, 0x0c, 0x6a, 0xbe, 0xa2, 0xf4, 0x02, 0x3f,
- 0xaa, 0x75, 0x16, 0x3f, 0x30, 0xe7, 0xde, 0xbd, 0x14, 0xe3, 0x90, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
- 0x80, 0x52, 0x32, 0x3c, 0xa0, 0x52, 0x32, 0x3d, 0x9c, 0x54, 0xd9, 0x3e,
- 0x5c, 0x0c, 0xea, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
- 0x90, 0x52, 0xb2, 0x3d, 0x14, 0xe3, 0x90, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
- 0xe0, 0xbd, 0x85, 0xbd, 0xc8, 0x19, 0x0e, 0xbf, 0x30, 0xe7, 0x5e, 0xbe,
- 0xec, 0xbd, 0x85, 0x3e, 0x8d, 0x52, 0x32, 0xbf, 0x80, 0x52, 0xb2, 0xbc,
- 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0xec, 0xbd, 0x85, 0x3e,
- 0xa8, 0x75, 0x96, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0x08, 0xc2, 0x53, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xa0, 0xf4, 0x02, 0xbf,
- 0x14, 0xe3, 0x90, 0x3e, 0xb4, 0x77, 0xbd, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
- 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0xca, 0x19, 0x0e, 0x3f, 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0xb8, 0x77, 0xbd, 0x3e,
- 0x30, 0xe7, 0xde, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x84, 0x31, 0xf5, 0xbe,
- 0xf8, 0xbf, 0xac, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x1c, 0xc4, 0xfa, 0x3e,
- 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0xec, 0xbd, 0x85, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e,
- 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0x5e, 0xac, 0x13, 0x3f, 0x14, 0xe3, 0x90, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
- 0xa8, 0x75, 0x96, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0x9c, 0x54, 0xd9, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x52, 0x32, 0x3c, 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0x32, 0xbc,
- 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x1c, 0xc4, 0xfa, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x5e, 0xac, 0x13, 0xbf, 0x40, 0xe7, 0x5e, 0x3d,
- 0x40, 0x08, 0x9c, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
- 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x88, 0x52, 0x32, 0xbe,
- 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0xe8, 0xbd, 0x85, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x5c, 0x0c, 0xea, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbc,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x8c, 0x52, 0xb2, 0xbe,
- 0x30, 0xe7, 0x5e, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x56, 0x2b, 0x00, 0xbf,
- 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0x20, 0xe5, 0xb7, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x5e, 0xac, 0x13, 0xbf,
- 0x74, 0x2f, 0xce, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x7e, 0x50, 0x0b, 0x3f,
- 0x54, 0x2b, 0x80, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
- 0xe0, 0x9c, 0xc8, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xa2, 0xf4, 0x02, 0x3f,
- 0xa8, 0x75, 0x96, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x90, 0x52, 0x32, 0x3e,
- 0x12, 0xe3, 0x10, 0x3f, 0x40, 0xe7, 0x5e, 0x3d, 0x08, 0xc2, 0x53, 0x3e,
- 0x4c, 0x0a, 0xc3, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xc4, 0x79, 0xe4, 0xbe, 0x80, 0x52, 0x32, 0x3c,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x64, 0x2d, 0xa7, 0xbe,
- 0xe0, 0x9c, 0x48, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0x3e,
- 0xc0, 0x52, 0xb2, 0x3c, 0x22, 0xe5, 0x37, 0xbf, 0x00, 0x41, 0x40, 0xbf,
- 0x30, 0x08, 0x9c, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
- 0x14, 0xe3, 0x90, 0xbe, 0x34, 0x87, 0x08, 0xbf, 0x12, 0xe3, 0x10, 0xbf,
- 0xe0, 0x9c, 0x48, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x58, 0x0c, 0x6a, 0xbe, 0x5e, 0xac, 0x13, 0x3f, 0xd0, 0x9a, 0xa1, 0xbe,
- 0xe8, 0xbd, 0x85, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x08, 0x1c, 0x3e, 0x24, 0xe5, 0xb7, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0xa0, 0x52, 0x32, 0x3d, 0x95, 0xd3, 0x45, 0xbf, 0xe0, 0xbd, 0x85, 0xbd,
- 0x84, 0x31, 0xf5, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0xe0, 0x9c, 0x48, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x7c, 0x50, 0x8b, 0xbe, 0xaf, 0xf6, 0x29, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
- 0x30, 0xe7, 0x5e, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x50, 0x8b, 0x3e,
- 0x56, 0x2b, 0x00, 0x3f, 0xa8, 0x75, 0x96, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
- 0x86, 0xd1, 0x1e, 0x3f, 0x6c, 0xae, 0x3a, 0xbf, 0x88, 0x52, 0x32, 0xbe,
- 0x7c, 0x50, 0x8b, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
- 0xc8, 0x19, 0x0e, 0xbf, 0xe0, 0x9c, 0x48, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
- 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0xb2, 0xbc,
- 0x43, 0x89, 0x2f, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
- 0xe0, 0x9c, 0x48, 0x3e, 0xd8, 0x1b, 0x35, 0xbf, 0x20, 0xe7, 0x5e, 0xbd,
- 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x43, 0x89, 0x2f, 0xbf,
- 0x8c, 0x52, 0xb2, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
- 0x18, 0xc4, 0xfa, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x60, 0x2d, 0x27, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
- 0x80, 0x31, 0xf5, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
- 0x80, 0x31, 0x75, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x88, 0x31, 0x75, 0x3e,
- 0xe8, 0xbd, 0x05, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0xbd,
- 0x90, 0x31, 0xf5, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x18, 0xe3, 0x10, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
- 0x00, 0xbe, 0x05, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
- 0x30, 0x08, 0x9c, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
- 0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0x3c,
- 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
- 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x30, 0xe7, 0x5e, 0x3e, 0x68, 0x2d, 0xa7, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0x20, 0xe7, 0x5e, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e,
- 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xe8, 0xbd, 0x05, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x31, 0x75, 0xbe,
- 0xf0, 0xbd, 0x05, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0x18, 0xe3, 0x10, 0x3e, 0xf8, 0xbf, 0xac, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
- 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
- 0x80, 0x52, 0xb2, 0xbc, 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x31, 0x75, 0xbe,
- 0xb8, 0x77, 0xbd, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0x00, 0x00, 0x00,
- 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
- 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0xe8, 0xbd, 0x05, 0xbe,
- 0xf8, 0xbf, 0xac, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
- 0x90, 0x52, 0x32, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
- 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x58, 0x2b, 0x80, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0xc0, 0x52, 0xb2, 0x3c, 0x14, 0xe3, 0x90, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x38, 0x08, 0x1c, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbc,
- 0x00, 0xbe, 0x05, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
- 0x80, 0x52, 0x32, 0x3c, 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x74, 0x2f, 0xce, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
- 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
- 0x74, 0x2f, 0xce, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
- 0x12, 0xe3, 0x10, 0xbf, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
- 0x4c, 0x0a, 0xc3, 0x3e, 0xec, 0xbd, 0x85, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0xd0, 0x9a, 0xa1, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
- 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x56, 0x2b, 0x00, 0xbf,
- 0xea, 0xbd, 0x05, 0xbf, 0xc0, 0x52, 0xb2, 0x3c, 0xd0, 0x9a, 0x21, 0xbf,
- 0xf8, 0xbf, 0xac, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0xec, 0xbd, 0x85, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0x68, 0x2d, 0x27, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0xbd,
- 0x68, 0x2d, 0x27, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0xf8, 0xbf, 0xac, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x80, 0x52, 0x32, 0xbc, 0x38, 0x08, 0x1c, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
- 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd,
- 0xb8, 0x77, 0x3d, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x30, 0xe7, 0x5e, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
- 0x80, 0x52, 0x32, 0xbc, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
- 0x12, 0xe3, 0x10, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
- 0x80, 0x52, 0xb2, 0xbc, 0xa0, 0x52, 0x32, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
- 0x40, 0x08, 0x1c, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
- 0x58, 0x2b, 0x80, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
- 0x90, 0x52, 0xb2, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0xec, 0x9e, 0xef, 0xbe,
- 0xf0, 0xbd, 0x05, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0x74, 0x2f, 0xce, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
- 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x50, 0x8b, 0x3e,
- 0x80, 0x52, 0xb2, 0xbc, 0x54, 0x2b, 0x80, 0xbe, 0xf2, 0x3e, 0x19, 0xbf,
- 0x14, 0xe3, 0x90, 0x3e, 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0x32, 0x3c,
- 0x24, 0xe5, 0xb7, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
- 0x30, 0x08, 0x9c, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x52, 0x32, 0xbd, 0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0x32, 0x3e,
- 0xb8, 0x77, 0x3d, 0x3e, 0x56, 0x2b, 0x00, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x88, 0x31, 0x75, 0x3e,
- 0xe0, 0xbd, 0x05, 0xbd, 0x08, 0xc2, 0x53, 0xbf, 0x56, 0x2b, 0x00, 0x3f,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x74, 0x2f, 0xce, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
- 0x40, 0x08, 0x9c, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0xbd,
- 0x54, 0x2b, 0x80, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0xbe,
- 0xe8, 0xbd, 0x05, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
- 0xe4, 0x9c, 0xc8, 0x3e, 0x24, 0xe5, 0xb7, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
- 0x7c, 0x50, 0x8b, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xbe, 0x05, 0x3d, 0xf9, 0xbf, 0x2c, 0xbf, 0x38, 0x08, 0x1c, 0xbe,
- 0xc4, 0x79, 0xe4, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
- 0x30, 0xe7, 0xde, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
- 0x58, 0x2b, 0x80, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x18, 0xe3, 0x10, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x80, 0x31, 0xf5, 0xbd, 0x7e, 0x50, 0x0b, 0x3f, 0x10, 0xe3, 0x10, 0xbe,
- 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
- 0xa2, 0xf4, 0x02, 0x3f, 0x08, 0xc2, 0x53, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbc,
- 0x30, 0x08, 0x9c, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x10, 0xe3, 0x10, 0xbe,
- 0x90, 0x52, 0x32, 0x3e, 0x08, 0xc2, 0x53, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
- 0xf0, 0xbd, 0x05, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0x14, 0xe3, 0x90, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
- 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xec, 0xbd, 0x85, 0x3e,
- 0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x88, 0x31, 0x75, 0x3e,
- 0x90, 0x31, 0xf5, 0x3d, 0x3c, 0x08, 0x9c, 0x3e, 0x88, 0x31, 0x75, 0x3e,
- 0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
- 0x80, 0x52, 0x32, 0xbc, 0xb4, 0x77, 0xbd, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0xec, 0xbd, 0x85, 0x3e, 0x90, 0x52, 0xb2, 0x3e,
- 0xa0, 0xf4, 0x02, 0xbf, 0x80, 0x52, 0x32, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
- 0xb8, 0x77, 0x3d, 0x3e, 0x5e, 0xac, 0x13, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x80, 0x52, 0xb2, 0xbc, 0xd0, 0x9a, 0xa1, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0xe0, 0x9c, 0x48, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0xaf, 0xf6, 0x29, 0xbf,
- 0x30, 0xe7, 0xde, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
- 0xc4, 0x79, 0xe4, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0xec, 0xbd, 0x85, 0x3e,
- 0x90, 0x31, 0xf5, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0x8c, 0x52, 0xb2, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
- 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
- 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0x5e, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
- 0xc8, 0x19, 0x0e, 0xbf, 0x54, 0x2b, 0x80, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x4c, 0x0a, 0xc3, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
- 0x74, 0x2f, 0xce, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x56, 0x2b, 0x00, 0xbf,
- 0xb8, 0x77, 0x3d, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xec, 0x9e, 0xef, 0x3e,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0x20, 0xe5, 0xb7, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x56, 0x2b, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x05, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x54, 0x2b, 0x80, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbc,
- 0x7e, 0x50, 0x0b, 0xbf, 0xe4, 0x9c, 0xc8, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xea, 0xbd, 0x05, 0xbf, 0xe0, 0xbd, 0x05, 0xbd,
- 0x30, 0x08, 0x9c, 0xbd, 0x90, 0x52, 0xb2, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x7c, 0x50, 0x8b, 0xbe,
- 0x80, 0x31, 0x75, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
- 0x10, 0xe3, 0x10, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0x80, 0x31, 0x75, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
- 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
- 0xf0, 0xbd, 0x85, 0x3d, 0xa8, 0x75, 0x96, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
- 0xb6, 0x77, 0x3d, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0xf9, 0xbf, 0x2c, 0xbf,
- 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x88, 0x52, 0x32, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0xb8, 0x77, 0x3d, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e,
- 0xe0, 0xbd, 0x05, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0xf0, 0xbd, 0x85, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x10, 0xe3, 0x10, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x90, 0x52, 0x32, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0x80, 0x52, 0xb2, 0xbc, 0x14, 0xe3, 0x90, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
- 0x90, 0x52, 0x32, 0x3e, 0x20, 0xe5, 0xb7, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xd0, 0x9a, 0x21, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd, 0x14, 0xe3, 0x90, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0x56, 0x2b, 0x00, 0xbf, 0xec, 0x9e, 0xef, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0x10, 0xe3, 0x10, 0xbe, 0x1a, 0x64, 0x24, 0x3f, 0x58, 0x0c, 0x6a, 0xbe,
- 0x38, 0x68, 0x72, 0xbf, 0xfc, 0xbf, 0xac, 0x3e, 0xd0, 0x9a, 0x21, 0xbf,
- 0xe0, 0x9c, 0x48, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x58, 0x0c, 0x6a, 0xbe, 0x22, 0xe5, 0x37, 0xbf,
- 0xe4, 0x9c, 0xc8, 0x3e, 0x5e, 0xac, 0x13, 0xbf, 0x80, 0x52, 0x32, 0x3c,
- 0xf8, 0xbf, 0xac, 0xbe, 0x90, 0x52, 0xb2, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0xc0, 0x52, 0xb2, 0x3c, 0xa0, 0x52, 0x32, 0x3d,
- 0x1c, 0xc4, 0xfa, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xa8, 0x75, 0x96, 0x3e,
- 0x80, 0x31, 0x75, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
- 0xa8, 0x75, 0x16, 0xbf, 0x80, 0x52, 0x32, 0x3c, 0xf0, 0xbd, 0x85, 0x3d,
- 0x7e, 0x50, 0x0b, 0xbf, 0x4c, 0x0a, 0xc3, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x8c, 0x52, 0xb2, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
- 0xd0, 0x9a, 0x21, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
- 0x88, 0x31, 0x75, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x5a, 0x0c, 0x6a, 0xbf,
- 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0x86, 0xd1, 0x1e, 0xbf, 0x74, 0x2f, 0x4e, 0xbf, 0x30, 0x08, 0x9c, 0xbd,
- 0xe0, 0x9c, 0xc8, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
- 0x22, 0xe5, 0x37, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
- 0x80, 0x31, 0xf5, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x50, 0x8b, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xf8, 0xbf, 0xac, 0xbe, 0x8d, 0x52, 0x32, 0xbf, 0x30, 0xe7, 0xde, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x68, 0x2d, 0xa7, 0x3e,
- 0x34, 0x87, 0x08, 0xbf, 0x4b, 0x0a, 0x43, 0xbf, 0xe0, 0xbd, 0x05, 0xbd,
- 0x9c, 0x54, 0xd9, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0xf2, 0x3e, 0x19, 0xbf,
- 0x54, 0x2b, 0x80, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
- 0x30, 0xe7, 0xde, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0xca, 0x19, 0x0e, 0x3f, 0xe0, 0x9c, 0x48, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0x30, 0x08, 0x9c, 0xbd, 0x3c, 0x08, 0x1c, 0xbf, 0x88, 0x52, 0x32, 0xbe,
- 0xa2, 0xf4, 0x02, 0x3f, 0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x60, 0x0c, 0x6a, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x56, 0x2b, 0x00, 0xbf,
- 0xd8, 0x1b, 0x35, 0xbf, 0x00, 0xbe, 0x05, 0x3d, 0x88, 0x52, 0x32, 0xbe,
- 0x80, 0x31, 0xf5, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x31, 0x75, 0xbe,
- 0x12, 0xe3, 0x10, 0xbf, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
- 0x30, 0x08, 0x9c, 0xbd, 0xa0, 0xf4, 0x02, 0xbf, 0x58, 0x0c, 0x6a, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0xd8, 0x1b, 0x35, 0xbf, 0xc8, 0x19, 0x0e, 0xbf,
- 0x90, 0x31, 0xf5, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x80, 0x52, 0x32, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
- 0x40, 0xe7, 0x5e, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
- 0x38, 0x08, 0x1c, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x30, 0xe7, 0xde, 0xbd, 0x3c, 0x08, 0x9c, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0x8d, 0x52, 0x32, 0xbf, 0xea, 0xbd, 0x05, 0xbf, 0x88, 0x52, 0x32, 0xbe,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xe8, 0xbd, 0x85, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
- 0x90, 0x31, 0xf5, 0x3d, 0xb6, 0x77, 0x3d, 0xbf, 0x3c, 0x08, 0x1c, 0xbf,
- 0x30, 0xe7, 0xde, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x95, 0xd3, 0x45, 0xbf,
- 0x18, 0xe3, 0x10, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0xe0, 0xbd, 0x85, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0xdf, 0x9c, 0x48, 0xbf,
- 0xec, 0x9e, 0xef, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
- 0x30, 0xe7, 0x5e, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
- 0x90, 0x31, 0xf5, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
- 0x7c, 0x50, 0x8b, 0xbe, 0x34, 0x87, 0x08, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
- 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
- 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
- 0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
- 0x88, 0x52, 0x32, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe5, 0xb7, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x58, 0x0c, 0xea, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0x30, 0xe7, 0xde, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
- 0x7c, 0x50, 0x8b, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
- 0x80, 0x52, 0x32, 0xbc, 0xc4, 0x79, 0xe4, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0x5a, 0x0c, 0x6a, 0xbf, 0x90, 0x31, 0xf5, 0x3d,
- 0x3c, 0x08, 0x9c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0x3d,
- 0x20, 0xe5, 0xb7, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x1c, 0xc4, 0xfa, 0x3e,
- 0x64, 0x2d, 0xa7, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
- 0x74, 0x2f, 0xce, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0x48, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
- 0xaf, 0xf6, 0xa9, 0xbf, 0xe8, 0xbd, 0x05, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0x30, 0xe7, 0xde, 0x3d, 0x56, 0x2b, 0x00, 0xbf, 0x30, 0xe7, 0xde, 0xbe,
- 0x56, 0x2b, 0x00, 0xbf, 0x80, 0x52, 0x32, 0xbc, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x31, 0x75, 0xbe,
- 0xfc, 0xbf, 0xac, 0x3e, 0xf8, 0xbf, 0xac, 0xbe, 0x9c, 0x54, 0x59, 0xbf,
- 0x90, 0x31, 0xf5, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0x12, 0xe3, 0x10, 0xbf,
- 0x80, 0x52, 0x32, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
- 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x00, 0x00, 0x00, 0x00,
- 0xfc, 0xbf, 0xac, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
- 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xec, 0xbd, 0x85, 0x3e,
- 0x5e, 0xac, 0x13, 0xbf, 0x9c, 0x54, 0xd9, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
- 0xe8, 0xbd, 0x05, 0xbe, 0xc4, 0x79, 0xe4, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
- 0xc4, 0x79, 0xe4, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x3c, 0x08, 0x1c, 0xbf,
- 0x6c, 0xae, 0x3a, 0xbf, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
- 0x14, 0xe3, 0x90, 0xbe, 0xec, 0x9e, 0xef, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x9c, 0x54, 0xd9, 0xbe,
- 0xa8, 0x75, 0x96, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
- 0x34, 0x87, 0x08, 0xbf, 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x9c, 0x3d,
- 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
- 0x38, 0x08, 0x1c, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x88, 0x31, 0x75, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0x6c, 0xae, 0x3a, 0xbf, 0x40, 0xe7, 0x5e, 0x3d,
- 0x80, 0x52, 0x32, 0x3c, 0x24, 0xe5, 0xb7, 0x3e, 0xc4, 0x79, 0xe4, 0x3e,
- 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
- 0x65, 0x2d, 0x27, 0xbf, 0xc0, 0x52, 0xb2, 0x3c, 0xea, 0xbd, 0x05, 0x3f,
- 0x80, 0x31, 0xf5, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x8c, 0x52, 0xb2, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x88, 0x52, 0x32, 0xbe,
- 0x80, 0x31, 0x75, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0x40, 0x08, 0x1c, 0x3e, 0x56, 0x2b, 0x00, 0x3f,
- 0x30, 0xe7, 0x5e, 0xbe, 0x24, 0xe5, 0xb7, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x64, 0x2d, 0xa7, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
- 0x80, 0x52, 0x32, 0xbc, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x74, 0x2f, 0xce, 0x3e,
- 0x60, 0x2d, 0x27, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
- 0xa0, 0xf4, 0x02, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0xbd, 0x3e,
- 0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x7c, 0x50, 0x8b, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x08, 0xc2, 0xd3, 0xbe,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
- 0x56, 0x2b, 0x00, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0x3c,
- 0x60, 0x2d, 0x27, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
- 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
- 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
- 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
- 0x40, 0x08, 0x9c, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x40, 0xe7, 0x5e, 0x3d,
- 0xf0, 0xbd, 0x05, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0x3c,
- 0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
- 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
- 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0xbc,
- 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x88, 0x52, 0x32, 0xbe,
- 0x80, 0x31, 0xf5, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x88, 0x31, 0x75, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0xbd,
- 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
- 0xf0, 0xbd, 0x05, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
- 0xb8, 0x77, 0x3d, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
- 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
- 0x80, 0x52, 0x32, 0x3c, 0xa0, 0x52, 0x32, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0x90, 0x52, 0xb2, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbd,
- 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
- 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0x3c,
- 0x90, 0x52, 0xb2, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xbd, 0x85, 0xbd,
- 0x10, 0xe3, 0x10, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x68, 0x2d, 0x27, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0x90, 0x52, 0xb2, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0x3c,
- 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x18, 0xe3, 0x10, 0x3e,
- 0x90, 0x31, 0xf5, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
- 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
- 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
- 0xe0, 0x9c, 0x48, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0x32, 0x3c,
- 0x58, 0x0c, 0xea, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x20, 0xe7, 0x5e, 0xbd,
- 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x56, 0x2b, 0x00, 0xbf,
- 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x54, 0x2b, 0x80, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
- 0xe0, 0xbd, 0x05, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
- 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
- 0xf8, 0xbf, 0xac, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
- 0x80, 0x31, 0xf5, 0xbd, 0x68, 0x2d, 0x27, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
- 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
- 0xf0, 0xbd, 0x85, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
- 0x40, 0x08, 0x1c, 0x3e, 0xc4, 0x79, 0xe4, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0x90, 0x52, 0xb2, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0xb2, 0xbc,
- 0x18, 0xe3, 0x10, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0x32, 0x3e,
- 0x90, 0x52, 0x32, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
- 0x80, 0x50, 0x8b, 0x3e, 0x90, 0x52, 0x32, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
- 0x88, 0x52, 0x32, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
- 0x9c, 0x54, 0xd9, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
- 0x40, 0x08, 0x9c, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x58, 0x0c, 0x6a, 0xbe,
- 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0x3c, 0x08, 0x9c, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0xa0, 0x52, 0x32, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x1c, 0x3e,
- 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x1c, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
- 0xb8, 0x77, 0x3d, 0x3e, 0xe8, 0xbd, 0x85, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xc4, 0x79, 0xe4, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0x3c, 0xa8, 0x75, 0x96, 0xbe,
- 0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
- 0xb8, 0x77, 0x3d, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
- 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0xe0, 0x9c, 0xc8, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0x18, 0xc4, 0xfa, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x80, 0x52, 0x32, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x8d, 0x52, 0x32, 0xbf,
- 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0xa0, 0x52, 0x32, 0x3d,
- 0x90, 0x31, 0xf5, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x6c, 0xae, 0x3a, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
- 0xb4, 0x77, 0xbd, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
- 0xec, 0xbd, 0x85, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
- 0x40, 0x08, 0x1c, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0xe0, 0xbd, 0x85, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x38, 0x08, 0x1c, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
- 0x84, 0x31, 0xf5, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
- 0x88, 0x52, 0x32, 0xbe, 0xb8, 0x77, 0xbd, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
- 0x80, 0x50, 0x8b, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x08, 0xc2, 0x53, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0xea, 0xbd, 0x05, 0x3f,
- 0x34, 0xe7, 0xde, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xb8, 0x77, 0x3d, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0x64, 0x2d, 0xa7, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0x1c, 0xc4, 0xfa, 0x3e,
- 0x80, 0x31, 0xf5, 0xbd, 0xa0, 0xf4, 0x02, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
- 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0x38, 0x08, 0x1c, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
- 0xa8, 0x75, 0x96, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0xbd,
- 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
- 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xc0, 0x52, 0xb2, 0x3c,
- 0x00, 0xbe, 0x05, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x20, 0xe5, 0xb7, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x08, 0xc2, 0x53, 0x3e, 0x52, 0x8b, 0x56, 0xbf, 0x90, 0x52, 0xb2, 0xbd,
- 0x14, 0xe3, 0x90, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
- 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0xe8, 0xbd, 0x05, 0xbe, 0xc4, 0x79, 0xe4, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x68, 0x2d, 0xa7, 0x3e,
- 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
- 0xe8, 0xbd, 0x05, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
- 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
- 0xe0, 0xbd, 0x05, 0xbd, 0x14, 0xe3, 0x90, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
- 0xec, 0x9e, 0xef, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
- 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
- 0xe0, 0xbd, 0x85, 0xbd, 0x3c, 0x08, 0x9c, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
- 0x80, 0x31, 0xf5, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0x9c, 0x54, 0xd9, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
- 0xe8, 0xbd, 0x05, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0xb8, 0x77, 0xbd, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x1c, 0xc4, 0xfa, 0x3e,
- 0x30, 0x08, 0x9c, 0xbd, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x5c, 0x0c, 0xea, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x20, 0xe7, 0x5e, 0xbd,
- 0xa0, 0x52, 0x32, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
- 0x90, 0x31, 0xf5, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0xb8, 0x77, 0xbd, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x84, 0x31, 0xf5, 0x3e, 0xb8, 0x77, 0xbd, 0x3e,
- 0x58, 0x0c, 0x6a, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
- 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
- 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0x40, 0x08, 0x1c, 0x3e,
- 0xfc, 0xbf, 0xac, 0x3e, 0xea, 0xbd, 0x05, 0xbf, 0xf0, 0xbd, 0x85, 0x3d,
- 0x30, 0xe7, 0xde, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0xde, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
- 0x30, 0xe7, 0xde, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
- 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0xc4, 0x79, 0xe4, 0x3e,
- 0xa0, 0x52, 0x32, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
- 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
- 0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0xe0, 0x9c, 0x48, 0xbe, 0x3c, 0x08, 0x9c, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0x3c, 0x08, 0x9c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x90, 0x52, 0x32, 0x3e,
- 0xe0, 0x9c, 0x48, 0x3e, 0xb8, 0x77, 0xbd, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
- 0xa8, 0x75, 0x96, 0xbe, 0x88, 0x31, 0x75, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x0c, 0x6a, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x30, 0xe7, 0x5e, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0xa8, 0x75, 0x96, 0x3e,
- 0x58, 0x2b, 0x80, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0xc4, 0x79, 0xe4, 0x3e,
- 0x60, 0x0c, 0x6a, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0xb8, 0x77, 0x3d, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
- 0x74, 0x2f, 0xce, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0x30, 0x08, 0x9c, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
- 0x90, 0x52, 0xb2, 0x3d, 0x84, 0x31, 0xf5, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x90, 0x52, 0xb2, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0xc4, 0x79, 0xe4, 0x3e,
- 0xec, 0x9e, 0xef, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
- 0x90, 0x52, 0x32, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x52, 0x32, 0x3c,
- 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
- 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0x5e, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
- 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
- 0xe4, 0x9c, 0xc8, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
- 0xa0, 0xf4, 0x02, 0xbf, 0xf0, 0xbd, 0x85, 0x3d, 0x30, 0xe7, 0xde, 0xbd,
- 0x90, 0x31, 0xf5, 0x3d, 0x34, 0xe7, 0xde, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x85, 0xbd, 0xea, 0xbd, 0x05, 0xbf,
- 0x80, 0x52, 0x32, 0x3c, 0x80, 0x31, 0xf5, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0x00, 0xbe, 0x05, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
- 0x08, 0xc2, 0x53, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
- 0x80, 0x52, 0x32, 0x3c, 0x90, 0x31, 0xf5, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
- 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
- 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x05, 0x3e,
- 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0xbe, 0x05, 0x3d,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x4c, 0x0a, 0xc3, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
- 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xe0, 0xbd, 0x85, 0xbd, 0x3e, 0x08, 0x1c, 0x3f, 0xe0, 0xbd, 0x05, 0xbd,
- 0xe0, 0xbd, 0x85, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x20, 0xe7, 0x5e, 0xbd,
- 0xb8, 0x77, 0x3d, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0xe0, 0xbd, 0x85, 0xbd, 0xfc, 0xbf, 0xac, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
- 0x10, 0xe3, 0x10, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
- 0xa8, 0x75, 0x96, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
- 0x20, 0xe7, 0x5e, 0xbd, 0x18, 0xc4, 0xfa, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x30, 0xe7, 0xde, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0xa8, 0x75, 0x96, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xc4, 0x79, 0xe4, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x40, 0x08, 0x1c, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0x9c, 0x54, 0xd9, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x4c, 0x0a, 0xc3, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
- 0x3c, 0x08, 0x9c, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x00, 0xbe, 0x05, 0x3d,
- 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x52, 0x32, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
- 0xe0, 0x9c, 0x48, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0x10, 0xe3, 0x10, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0xa0, 0x52, 0x32, 0x3d, 0x74, 0x2f, 0xce, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
- 0xa8, 0x75, 0x96, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
- 0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0xbd,
- 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0x88, 0x52, 0x32, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
- 0xe0, 0x9c, 0x48, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x52, 0xb2, 0x3c,
- 0x64, 0x2d, 0xa7, 0xbe, 0x58, 0x0c, 0xea, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0xc0, 0x52, 0xb2, 0x3c,
- 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0x3d, 0x84, 0x31, 0xf5, 0x3e,
- 0xb8, 0x77, 0x3d, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
- 0xf0, 0xbd, 0x85, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x8c, 0x52, 0xb2, 0xbe,
- 0x5e, 0xac, 0x13, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x52, 0x32, 0xbc,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
- 0x88, 0x52, 0x32, 0xbe, 0xa8, 0x75, 0x96, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
- 0x90, 0x52, 0x32, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
- 0x30, 0xe7, 0xde, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0x32, 0x3e,
- 0xe8, 0xbd, 0x05, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
- 0x60, 0x0c, 0x6a, 0x3e, 0x6c, 0xae, 0x3a, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
- 0x90, 0x52, 0xb2, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0xf0, 0xbd, 0x85, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0xe8, 0xbd, 0x05, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
- 0x90, 0x31, 0xf5, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x52, 0xb2, 0x3d,
- 0x40, 0xe7, 0x5e, 0x3d, 0xec, 0x9e, 0xef, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x05, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
- 0x08, 0xc2, 0x53, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0x14, 0xe3, 0x90, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
- 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0x32, 0x3e, 0xb4, 0x77, 0xbd, 0xbe,
- 0x60, 0x0c, 0x6a, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
- 0xea, 0xbd, 0x05, 0xbf, 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xe0, 0x9c, 0x48, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
- 0x30, 0xe7, 0x5e, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x31, 0xf5, 0x3d,
- 0x68, 0x2d, 0x27, 0x3e, 0x88, 0x31, 0x75, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
- 0x7c, 0x50, 0x8b, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
- 0x90, 0x31, 0xf5, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0x88, 0x52, 0x32, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0xe7, 0xde, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
- 0x88, 0x52, 0x32, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0xc4, 0x79, 0xe4, 0xbe,
- 0x5c, 0x0c, 0xea, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
- 0xa8, 0x75, 0x96, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
- 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x68, 0x2d, 0x27, 0x3e,
- 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0x48, 0xbe, 0x3c, 0x08, 0x9c, 0x3e,
- 0x5c, 0x0c, 0xea, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
- 0x14, 0xe3, 0x90, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0x32, 0x3c,
- 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x90, 0x52, 0x32, 0x3e,
- 0xea, 0xbd, 0x05, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0xb2, 0xbc,
- 0xf0, 0xbd, 0x05, 0x3e, 0xe4, 0x9c, 0xc8, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
- 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
- 0x08, 0xc2, 0xd3, 0xbe, 0x24, 0xe5, 0xb7, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
- 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
- 0x58, 0x2b, 0x80, 0x3e, 0x24, 0xe5, 0xb7, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
- 0x40, 0x08, 0x9c, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
- 0x80, 0x52, 0x32, 0xbc, 0x8e, 0x52, 0x32, 0x3f, 0x74, 0x2f, 0xce, 0x3e,
- 0x54, 0x2b, 0x80, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0x80, 0x31, 0x75, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
- 0xe8, 0xbd, 0x85, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0xe0, 0x9c, 0x48, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x88, 0x52, 0x32, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0x5e, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x3c, 0x08, 0x9c, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
- 0xa8, 0x75, 0x16, 0xbf, 0x38, 0x68, 0x72, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0x18, 0xc4, 0xfa, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x14, 0xe3, 0x90, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0xd0, 0x9a, 0x21, 0xbf,
- 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
- 0x88, 0x52, 0x32, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0x58, 0x0c, 0x6a, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x95, 0xd3, 0x45, 0xbf,
- 0x80, 0x52, 0x32, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
- 0xb8, 0x77, 0x3d, 0x3e, 0xb4, 0x77, 0xbd, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x00, 0x41, 0x40, 0xbf, 0x5c, 0x0c, 0xea, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
- 0xe0, 0xbd, 0x05, 0xbd, 0x52, 0x8b, 0x56, 0xbf, 0x60, 0x0c, 0x6a, 0x3e,
- 0xe0, 0xbd, 0x05, 0xbd, 0x43, 0x89, 0x2f, 0xbf, 0x34, 0x87, 0x08, 0xbf,
- 0x54, 0x2b, 0x80, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xf2, 0x3e, 0x19, 0xbf, 0x3c, 0x08, 0x9c, 0xbe,
- 0xb4, 0x77, 0xbd, 0xbe, 0x86, 0xd1, 0x1e, 0xbf, 0x90, 0x52, 0xb2, 0xbd,
- 0x52, 0x8b, 0x56, 0xbf, 0x14, 0xe3, 0x90, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
- 0x9c, 0x54, 0xd9, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0xa8, 0x75, 0x96, 0x3e,
- 0x18, 0xc4, 0xfa, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0x10, 0xe3, 0x10, 0xbe, 0xf2, 0x3e, 0x19, 0xbf, 0xf8, 0xbf, 0xac, 0xbe,
- 0x80, 0x31, 0xf5, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x84, 0x31, 0xf5, 0xbe,
- 0x38, 0x08, 0x1c, 0xbe, 0x58, 0x0c, 0xea, 0xbe, 0x7e, 0x50, 0x0b, 0xbf,
- 0x5e, 0xac, 0x13, 0xbf, 0x88, 0x52, 0x32, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x13, 0xe3, 0x90, 0xbf,
- 0x5e, 0xac, 0x13, 0x3f, 0xd0, 0x9a, 0xa1, 0x3e, 0x3c, 0x08, 0x9c, 0xbe,
- 0xe1, 0x6c, 0x9d, 0xbf, 0xa8, 0x75, 0x96, 0xbe, 0x17, 0xc4, 0x7a, 0xbf,
- 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
- 0x34, 0x87, 0x08, 0xbf, 0x20, 0xe5, 0xb7, 0xbe, 0x22, 0xe5, 0x37, 0xbf,
- 0x40, 0x08, 0x9c, 0x3d, 0x7e, 0x50, 0x0b, 0x3f, 0x90, 0x52, 0xb2, 0xbd,
- 0x88, 0x31, 0x75, 0x3e, 0xa0, 0xf4, 0x02, 0xbf, 0x74, 0x2f, 0xce, 0xbe,
- 0xd0, 0x9a, 0x21, 0xbf, 0xa8, 0x75, 0x96, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
- 0x58, 0x0c, 0x6a, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
- 0x84, 0x31, 0xf5, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x08, 0xc2, 0x53, 0xbf, 0x80, 0x31, 0xf5, 0xbd, 0x9c, 0x54, 0xd9, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x18, 0xc4, 0xfa, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
- 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0x3c, 0xf0, 0xbd, 0x85, 0x3d,
- 0x88, 0x52, 0x32, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0x30, 0xe7, 0xde, 0x3d, 0xa8, 0x75, 0x96, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
- 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0x32, 0xbd,
- 0x80, 0x52, 0x32, 0x3c, 0x90, 0x52, 0xb2, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
- 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
- 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0xf0, 0xbd, 0x05, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0x3d,
- 0x4c, 0x0a, 0xc3, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x40, 0x08, 0x1c, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x85, 0xbd,
- 0x38, 0x08, 0x1c, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
- 0xd0, 0x9a, 0xa1, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x68, 0x2d, 0x27, 0x3e,
- 0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0x3d,
- 0x10, 0xe3, 0x10, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x8c, 0x52, 0xb2, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x52, 0x32, 0x3c,
- 0x00, 0xbe, 0x05, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0x30, 0xe7, 0xde, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x20, 0xe7, 0x5e, 0xbd,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
- 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
- 0xe0, 0x9c, 0x48, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
- 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0x75, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
- 0x18, 0xe3, 0x10, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0x30, 0xe7, 0xde, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0x3d,
- 0x90, 0x31, 0xf5, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
- 0x30, 0xe7, 0xde, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x20, 0xe7, 0x5e, 0xbd,
- 0x90, 0x52, 0xb2, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
- 0x30, 0x08, 0x9c, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x31, 0xf5, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
- 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0xbc, 0xe8, 0xbd, 0x05, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe7, 0xde, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0xc0, 0x52, 0xb2, 0x3c, 0xe8, 0xbd, 0x85, 0xbe,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x74, 0x2f, 0x4e, 0xbf,
- 0x40, 0x08, 0x1c, 0x3e, 0x4b, 0x0a, 0x43, 0xbf, 0x7b, 0xb0, 0x61, 0xbf,
- 0x80, 0x52, 0xb2, 0xbc, 0x14, 0xe3, 0x90, 0xbe, 0x74, 0x2f, 0xce, 0x3e,
- 0x88, 0x52, 0x32, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
- 0x84, 0x31, 0xf5, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x3c, 0x08, 0x9c, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x3c, 0x08, 0x9c, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x14, 0xe3, 0x90, 0x3e, 0x22, 0xe5, 0x37, 0xbf,
- 0x08, 0xc2, 0xd3, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x80, 0x52, 0x32, 0xbd, 0x43, 0x89, 0x2f, 0xbf, 0x00, 0xbe, 0x05, 0x3d,
- 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0x30, 0xe7, 0x5e, 0xbe, 0x18, 0xc4, 0xfa, 0xbe, 0x34, 0xe7, 0xde, 0x3e,
- 0xa0, 0x52, 0x32, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x90, 0x52, 0xb2, 0x3e,
- 0x58, 0x2b, 0x80, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
- 0x88, 0x52, 0x32, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0x84, 0x31, 0xf5, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
- 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x68, 0x2d, 0x27, 0x3e,
- 0xf0, 0xbd, 0x85, 0x3d, 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0xe8, 0xbd, 0x85, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0x74, 0x2f, 0xce, 0x3e,
- 0x84, 0x31, 0xf5, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0x53, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
- 0xe0, 0xbd, 0x85, 0xbd, 0x22, 0xe5, 0x37, 0xbf, 0x20, 0xe5, 0xb7, 0xbe,
- 0x88, 0x31, 0x75, 0x3e, 0xf2, 0x3e, 0x19, 0xbf, 0xe8, 0xbd, 0x85, 0xbe,
- 0x68, 0x2d, 0x27, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x43, 0x89, 0x2f, 0xbf,
- 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
- 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0x3c,
- 0x3c, 0x08, 0x9c, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x74, 0x2f, 0xce, 0x3e,
- 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
- 0x1a, 0x64, 0x24, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
- 0x00, 0xbe, 0x05, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0xd0, 0x9a, 0x21, 0xbf,
- 0xe7, 0x1d, 0x5c, 0xbf, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbc,
- 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0xbd,
- 0xe8, 0xbd, 0x85, 0xbe, 0xc8, 0x19, 0x0e, 0xbf, 0x8c, 0x52, 0xb2, 0xbe,
- 0x14, 0xe3, 0x90, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0x56, 0x2b, 0x00, 0xbf, 0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x30, 0xe7, 0xde, 0x3d, 0x65, 0x2d, 0x27, 0xbf, 0xa0, 0x52, 0x32, 0x3d,
- 0xfc, 0xbf, 0xac, 0x3e, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbd,
- 0x60, 0x2d, 0x27, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x24, 0xe5, 0xb7, 0x3e,
- 0xa8, 0x75, 0x96, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
- 0x14, 0xe3, 0x90, 0xbe, 0xf2, 0x3e, 0x19, 0x3f, 0x54, 0x2b, 0x80, 0xbe,
- 0x18, 0xe3, 0x10, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
- 0x58, 0x0c, 0xea, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x4c, 0x0a, 0xc3, 0x3e,
- 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0x14, 0xe3, 0x90, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0xb8, 0x77, 0x3d, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e, 0xb8, 0x77, 0xbd, 0x3e,
- 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
- 0x80, 0x52, 0x32, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0xe0, 0xbd, 0x85, 0xbd, 0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
- 0xec, 0xbd, 0x85, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
- 0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
- 0xf2, 0x3e, 0x19, 0x3f, 0x74, 0x2f, 0xce, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x9c, 0x54, 0x59, 0xbf,
- 0xe0, 0xbd, 0x85, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
- 0x8c, 0x52, 0xb2, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
- 0xec, 0x9e, 0xef, 0x3e, 0x8c, 0x52, 0xb2, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x12, 0xe3, 0x10, 0xbf, 0x14, 0xe3, 0x90, 0x3e, 0xe8, 0xbd, 0x85, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0x08, 0x9c, 0xbd, 0x74, 0x2f, 0xce, 0xbe,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x05, 0x3d,
- 0x80, 0x31, 0xf5, 0xbd, 0xf2, 0x3e, 0x19, 0xbf, 0x30, 0xe7, 0x5e, 0xbe,
- 0x58, 0x0c, 0xea, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x74, 0x2f, 0xce, 0x3e,
- 0xe8, 0xbd, 0x85, 0xbe, 0x58, 0x0c, 0xea, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
- 0xe0, 0x9c, 0x48, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x90, 0x52, 0xb2, 0x3e,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x90, 0x52, 0xb2, 0xbd, 0x84, 0x31, 0xf5, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0x08, 0xc2, 0x53, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xfc, 0xbf, 0xac, 0x3e,
- 0x5e, 0xac, 0x13, 0x3f, 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x14, 0xe3, 0x90, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd,
- 0x4c, 0x0a, 0xc3, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0x52, 0x8b, 0x56, 0xbf, 0xb8, 0x77, 0x3d, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0xb8, 0x77, 0x3d, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x18, 0xe3, 0x10, 0x3e,
- 0x20, 0xe7, 0x5e, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
- 0x14, 0xe3, 0x90, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x58, 0x0c, 0xea, 0xbe,
- 0x0c, 0xc2, 0xd3, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x7c, 0x50, 0x8b, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
- 0xe0, 0x9c, 0xc8, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x8c, 0x52, 0xb2, 0xbe,
- 0x90, 0x31, 0xf5, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x85, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0x54, 0x2b, 0x80, 0xbe, 0xea, 0xbd, 0x05, 0xbf,
- 0x80, 0x31, 0x75, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0x58, 0x2b, 0x80, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0xf0, 0xbd, 0x05, 0x3e,
- 0x40, 0x08, 0x1c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
- 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x08, 0xc2, 0x53, 0x3e,
- 0xf0, 0xbd, 0x05, 0x3e, 0xc4, 0x79, 0xe4, 0xbe, 0xc4, 0x79, 0xe4, 0x3e,
- 0x30, 0xe7, 0x5e, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0x80, 0x31, 0x75, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
- 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0xe0, 0x9c, 0xc8, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x7e, 0x50, 0x0b, 0xbf,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
- 0x8c, 0x52, 0xb2, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0xf8, 0xbf, 0xac, 0xbe,
- 0xa8, 0x75, 0x96, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0xb8, 0x77, 0x3d, 0x3e, 0xb8, 0x77, 0x3d, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
- 0x14, 0xe3, 0x90, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0x14, 0xe3, 0x90, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0x3c, 0x08, 0x9c, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
- 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
- 0x38, 0x08, 0x1c, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xec, 0xbd, 0x85, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0xca, 0x19, 0x0e, 0x3f, 0x0c, 0xc2, 0xd3, 0x3e,
- 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e, 0x88, 0x52, 0x32, 0xbe,
- 0x7c, 0x50, 0x8b, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x3c, 0x08, 0x9c, 0x3e,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x58, 0x2b, 0x80, 0x3e,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0x48, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
- 0x90, 0x52, 0xb2, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
- 0xb8, 0x77, 0x3d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x9c, 0xc8, 0x3e,
- 0xe8, 0xbd, 0x05, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
- 0x10, 0xe3, 0x10, 0xbe, 0xa8, 0x75, 0x96, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
- 0x30, 0xe7, 0xde, 0xbd, 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x30, 0xe7, 0x5e, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x88, 0x31, 0x75, 0x3e,
- 0xd0, 0x9a, 0xa1, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0x88, 0x52, 0x32, 0xbe, 0x7b, 0xb0, 0x61, 0xbf, 0x80, 0x52, 0x32, 0x3c,
- 0x80, 0x31, 0xf5, 0xbd, 0xc8, 0x19, 0x0e, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
- 0x68, 0x2d, 0xa7, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x58, 0x0c, 0xea, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
- 0x68, 0x2d, 0x27, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0x30, 0x08, 0x9c, 0xbd, 0xaf, 0xf6, 0x29, 0xbf,
- 0x8c, 0x52, 0xb2, 0xbe, 0xa8, 0x75, 0x16, 0xbf, 0xf0, 0xbd, 0x85, 0x3d,
- 0xec, 0x9e, 0xef, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x31, 0x75, 0xbe,
- 0x5c, 0x0c, 0xea, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x08, 0xc2, 0x53, 0xbe, 0xb6, 0x77, 0x3d, 0x3f, 0x30, 0xe7, 0xde, 0xbd,
- 0x80, 0x50, 0x8b, 0x3e, 0x34, 0xe7, 0xde, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
- 0x46, 0x89, 0x2f, 0x3f, 0x40, 0x08, 0x1c, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
- 0x34, 0x87, 0x08, 0xbf, 0xb8, 0x77, 0x3d, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
- 0x08, 0xc2, 0x53, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x82, 0x31, 0x75, 0x3f,
- 0x88, 0x52, 0x32, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
- 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x88, 0x31, 0x75, 0x3e,
- 0x8c, 0x52, 0xb2, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
- 0xe8, 0xbd, 0x05, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x22, 0xe5, 0x37, 0x3f,
- 0x30, 0xe7, 0xde, 0xbd, 0x3e, 0x08, 0x1c, 0x3f, 0x18, 0xe3, 0x10, 0x3e,
- 0xe0, 0x9c, 0x48, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
- 0xe0, 0x9c, 0x48, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x3c, 0x08, 0x1c, 0xbf,
- 0x60, 0x0c, 0x6a, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0xbd, 0x85, 0xbd,
- 0x40, 0xe7, 0x5e, 0x3d, 0x43, 0x89, 0x2f, 0xbf, 0x60, 0x2d, 0x27, 0xbe,
- 0xe2, 0x9c, 0x48, 0x3f, 0x8c, 0x52, 0xb2, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
- 0x95, 0xd3, 0x45, 0xbf, 0x84, 0x31, 0xf5, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0x86, 0xd1, 0x1e, 0xbf, 0x80, 0x50, 0x8b, 0x3e, 0x90, 0x52, 0xb2, 0x3e,
- 0xe8, 0xbd, 0x05, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
- 0x54, 0x2b, 0x80, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0x40, 0x08, 0x9c, 0x3d, 0x0a, 0xc2, 0x53, 0x3f,
- 0xe0, 0xbd, 0x05, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0x0c, 0xc2, 0xd3, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x12, 0xe3, 0x10, 0x3f,
- 0xf2, 0x3e, 0x19, 0x3f, 0xe0, 0x9c, 0xc8, 0xbd, 0x7f, 0x50, 0x8b, 0x3f,
- 0x00, 0x00, 0x00, 0x00, 0x14, 0xe3, 0x90, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0x96, 0xd3, 0x45, 0x3f, 0x3e, 0x08, 0x1c, 0x3f, 0xb8, 0x77, 0x3d, 0xbe,
- 0x18, 0xe3, 0x10, 0x3e, 0x84, 0x31, 0xf5, 0x3e, 0x1a, 0x64, 0x24, 0xbf,
- 0x08, 0xc2, 0x53, 0xbe, 0x1a, 0x64, 0x24, 0x3f, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x30, 0x08, 0x9c, 0xbd, 0x18, 0xc4, 0xfa, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
- 0x30, 0xe7, 0x5e, 0x3e, 0xec, 0xbd, 0x85, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x9c, 0x54, 0xd9, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbc,
- 0x08, 0xc2, 0x53, 0xbf, 0x58, 0x2b, 0x80, 0x3e, 0x3c, 0x08, 0x9c, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x9c, 0x54, 0xd9, 0x3e,
- 0x60, 0x2d, 0x27, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
- 0x88, 0x31, 0x75, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0x3c, 0x08, 0x9c, 0x3e,
- 0x5e, 0xac, 0x13, 0xbf, 0x80, 0x52, 0x32, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
- 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
- 0x20, 0xe5, 0xb7, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbe,
- 0x18, 0xe3, 0x10, 0x3e, 0xa8, 0x75, 0x16, 0xbf, 0x90, 0x31, 0xf5, 0x3d,
- 0x30, 0xe7, 0x5e, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xe8, 0xbd, 0x85, 0xbe, 0xfc, 0xbf, 0xac, 0x3e,
- 0x40, 0x08, 0x1c, 0x3e, 0x3c, 0x08, 0x9c, 0xbe, 0x80, 0x31, 0x75, 0xbe,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x30, 0x08, 0x9c, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x68, 0x2d, 0x27, 0x3e,
- 0xa0, 0xf4, 0x02, 0xbf, 0x68, 0x2d, 0x27, 0x3e, 0x5e, 0xac, 0x13, 0xbf,
- 0xa8, 0x75, 0x96, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
- 0xb8, 0x77, 0x3d, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
- 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0x48, 0x3e,
- 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x43, 0x89, 0x2f, 0xbf,
- 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0x18, 0xc4, 0xfa, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0x8c, 0x52, 0xb2, 0xbe, 0x12, 0xe3, 0x10, 0x3f, 0x00, 0x41, 0x40, 0xbf,
- 0x38, 0x08, 0x1c, 0xbe, 0x86, 0xd1, 0x1e, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
- 0x90, 0x52, 0x32, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
- 0x3c, 0x08, 0x9c, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
- 0x54, 0x2b, 0x80, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0x80, 0x52, 0x32, 0x3c,
- 0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
- 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
- 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x7e, 0x50, 0x0b, 0xbf, 0x80, 0x31, 0x75, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0x90, 0x52, 0x32, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x00, 0xbe, 0x05, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
- 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x60, 0x2d, 0x27, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x0c, 0xc2, 0xd3, 0x3e,
- 0x30, 0x08, 0x9c, 0xbd, 0xec, 0xbd, 0x85, 0x3e, 0x6c, 0xae, 0x3a, 0xbf,
- 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0x32, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0x90, 0x52, 0x32, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
- 0x30, 0xe7, 0x5e, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
- 0xe0, 0xbd, 0x05, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
- 0xa8, 0x75, 0x96, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x90, 0x31, 0xf5, 0x3d, 0x88, 0x31, 0x75, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0xc8, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0x18, 0xe3, 0x10, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
- 0x14, 0xe3, 0x90, 0x3e, 0x54, 0x2b, 0x80, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
- 0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0x80, 0x52, 0x32, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
- 0x74, 0x2f, 0xce, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x56, 0x2b, 0x00, 0xbf,
- 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
- 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0xb2, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
- 0x08, 0xc2, 0xd3, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0x74, 0x2f, 0xce, 0x3e, 0x80, 0x52, 0x32, 0xbc,
- 0xec, 0xbd, 0x85, 0x3e, 0x60, 0x0c, 0x6a, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
- 0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xa8, 0x75, 0x96, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
- 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0xec, 0xbd, 0x85, 0x3e,
- 0x3c, 0x08, 0x9c, 0xbe, 0x7e, 0x50, 0x0b, 0xbf, 0x20, 0xe5, 0xb7, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0x3c, 0x08, 0x9c, 0x3e, 0xa0, 0xf4, 0x02, 0xbf,
- 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
- 0x30, 0xe7, 0xde, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0x08, 0x9c, 0xbd,
- 0xa2, 0xf4, 0x02, 0x3f, 0xa0, 0x52, 0x32, 0x3d, 0x5e, 0xac, 0x13, 0xbf,
- 0x08, 0xc2, 0x53, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x00, 0xbe, 0x05, 0x3d,
- 0x12, 0xe3, 0x10, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
- 0xa8, 0x75, 0x96, 0xbe, 0x84, 0x31, 0xf5, 0x3e, 0x80, 0x31, 0x75, 0xbe,
- 0x20, 0xe5, 0xb7, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x3c, 0x08, 0x9c, 0x3e, 0x29, 0x66, 0x4b, 0xbf,
- 0xc4, 0x79, 0xe4, 0x3e, 0x3c, 0x08, 0x9c, 0xbe, 0x5e, 0xac, 0x13, 0x3f,
- 0x90, 0x52, 0xb2, 0x3d, 0xc8, 0x19, 0x0e, 0xbf, 0x58, 0x2b, 0x80, 0x3e,
- 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0x12, 0xe3, 0x10, 0xbf, 0x24, 0xe5, 0xb7, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0x00, 0xbe, 0x05, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0x80, 0x52, 0x32, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0x3c, 0x08, 0x9c, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
- 0x80, 0x31, 0xf5, 0xbd, 0x68, 0x2d, 0x27, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e,
- 0x08, 0xc2, 0xd3, 0xbe, 0x36, 0x87, 0x08, 0x3f, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0xa2, 0xf4, 0x02, 0x3f,
- 0xe0, 0x9c, 0x48, 0xbe, 0x86, 0xd1, 0x1e, 0xbf, 0x90, 0x31, 0xf5, 0x3d,
- 0x3c, 0x08, 0x1c, 0xbf, 0x34, 0x87, 0x08, 0xbf, 0x9c, 0x54, 0xd9, 0xbe,
- 0xfc, 0xbf, 0xac, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0xb8, 0x77, 0x3d, 0x3e,
- 0xa8, 0x75, 0x16, 0xbf, 0x43, 0x89, 0x2f, 0xbf, 0xec, 0x9e, 0xef, 0x3e,
- 0x34, 0x87, 0x88, 0xbf, 0x68, 0x2d, 0x27, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
- 0x20, 0xe5, 0xb7, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
- 0x7e, 0x50, 0x0b, 0x3f, 0x80, 0x50, 0x8b, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
- 0x20, 0xe5, 0xb7, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0x34, 0x87, 0x08, 0xbf, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x31, 0x75, 0xbe,
- 0xda, 0x1b, 0x35, 0x3f, 0x80, 0x52, 0x32, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
- 0xd0, 0x9a, 0xa1, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0xca, 0x19, 0x0e, 0x3f,
- 0x4c, 0x0a, 0xc3, 0x3e, 0xe7, 0x1d, 0x5c, 0xbf, 0x9e, 0x54, 0x59, 0x3f,
- 0x9c, 0x54, 0xd9, 0x3e, 0xa0, 0xf4, 0x02, 0xbf, 0x4c, 0x0a, 0xc3, 0x3e,
- 0x1a, 0x64, 0x24, 0x3f, 0x84, 0x31, 0xf5, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
- 0x80, 0x52, 0x32, 0xbd, 0xe8, 0xbd, 0x85, 0xbe, 0xe7, 0x1d, 0x5c, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0xc4, 0x79, 0xe4, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x90, 0x52, 0xb2, 0x3d, 0x22, 0xe5, 0x37, 0x3f, 0x08, 0xc2, 0x53, 0x3e,
- 0xb8, 0x77, 0x3d, 0x3e, 0x3c, 0x08, 0x9c, 0xbe, 0x34, 0x87, 0x08, 0xbf,
- 0x3c, 0x08, 0x9c, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x80, 0x50, 0x8b, 0x3e,
- 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x7c, 0x50, 0x8b, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x68, 0x2d, 0x27, 0x3e,
- 0x08, 0xc2, 0x53, 0xbe, 0xf9, 0xbf, 0x2c, 0xbf, 0x14, 0xe3, 0x90, 0xbe,
- 0xb8, 0x77, 0x3d, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
- 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
- 0x84, 0x31, 0xf5, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0xbd,
- 0x65, 0x2d, 0x27, 0xbf, 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x31, 0x75, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
- 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x5c, 0x0c, 0xea, 0x3e,
- 0x80, 0x50, 0x8b, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0xa8, 0x75, 0x96, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
- 0x08, 0xc2, 0x53, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
- 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0xbe,
- 0xf8, 0xbf, 0xac, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0x7c, 0x50, 0x8b, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
- 0x58, 0x2b, 0x80, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd,
- 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x60, 0x2d, 0x27, 0xbe,
- 0xea, 0xbd, 0x05, 0xbf, 0x80, 0x52, 0xb2, 0xbc, 0xa8, 0x75, 0x96, 0x3e,
- 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
- 0x80, 0x31, 0x75, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
- 0x68, 0x2d, 0xa7, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0x40, 0xe7, 0x5e, 0x3d, 0x3c, 0x08, 0x1c, 0xbf, 0x68, 0x2d, 0x27, 0x3e,
- 0xe8, 0xbd, 0x05, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
- 0x7c, 0x50, 0x8b, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x74, 0x2f, 0xce, 0xbe,
- 0x30, 0xe7, 0x5e, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
- 0x14, 0xe3, 0x90, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x90, 0x31, 0xf5, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0xc8, 0x19, 0x0e, 0xbf,
- 0xe8, 0xbd, 0x05, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0xb8, 0x77, 0x3d, 0xbe,
- 0xa8, 0x75, 0x96, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x08, 0xc2, 0x53, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0x48, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
- 0x90, 0x52, 0xb2, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0x90, 0x52, 0xb2, 0xbd, 0x68, 0x2d, 0xa7, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0xf8, 0xbf, 0xac, 0xbe,
- 0x34, 0x87, 0x08, 0xbf, 0xfc, 0xbf, 0xac, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
- 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
- 0xf8, 0xbf, 0xac, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
- 0xb8, 0x77, 0x3d, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0x24, 0xe5, 0xb7, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
- 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
- 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
- 0x90, 0x52, 0x32, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0x30, 0xe7, 0x5e, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
- 0x08, 0xc2, 0xd3, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0xde, 0x3d,
- 0x00, 0xbe, 0x05, 0x3d, 0xec, 0xbd, 0x85, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
- 0xe8, 0xbd, 0x05, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0xbc,
- 0x0c, 0xc2, 0xd3, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0x3c,
- 0x90, 0x52, 0x32, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0xc8, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0x18, 0xe3, 0x10, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0x30, 0x08, 0x9c, 0xbd, 0x9c, 0x54, 0xd9, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
- 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
- 0xb8, 0x77, 0x3d, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0xb8, 0x77, 0x3d, 0x3e,
- 0x88, 0x52, 0x32, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
- 0x88, 0x31, 0x75, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0xbe,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xf0, 0xbd, 0x85, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x0a, 0xc3, 0x3e,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0x86, 0xd1, 0x1e, 0xbf,
- 0x64, 0x2d, 0xa7, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xe8, 0xbd, 0x05, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x54, 0x2b, 0x80, 0xbe,
- 0x90, 0x52, 0xb2, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x7e, 0x50, 0x0b, 0xbf,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0xb4, 0x77, 0xbd, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x90, 0x52, 0x32, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0xc4, 0x79, 0xe4, 0x3e, 0x30, 0xe7, 0x5e, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x8c, 0x52, 0xb2, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x9c, 0x54, 0xd9, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
- 0xa8, 0x75, 0x96, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x08, 0xc2, 0x53, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0xe0, 0xbd, 0x05, 0xbd, 0xa8, 0x75, 0x96, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
- 0x90, 0x31, 0xf5, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0xec, 0xbd, 0x85, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0xbd,
- 0x40, 0x08, 0x1c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
- 0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
- 0x80, 0x52, 0xb2, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x80, 0x52, 0x32, 0xbc, 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x60, 0x2d, 0x27, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x88, 0x52, 0x32, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x4c, 0x0a, 0xc3, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x38, 0x08, 0x1c, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
- 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0xbd, 0x85, 0xbd, 0xa8, 0x75, 0x96, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x52, 0xb2, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
- 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0x3c,
- 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0x3c,
- 0xf0, 0xbd, 0x05, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
- 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
- 0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0x9c, 0x48, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0xe8, 0xbd, 0x85, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbe,
- 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
- 0xc0, 0x52, 0xb2, 0x3c, 0x08, 0xc2, 0x53, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
- 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
- 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
- 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
- 0x54, 0x2b, 0x80, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0xec, 0xbd, 0x85, 0x3e, 0x30, 0x08, 0x9c, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0xf0, 0xbd, 0x85, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
- 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
- 0x80, 0x31, 0x75, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
- 0x30, 0xe7, 0xde, 0xbd, 0xa8, 0x75, 0x96, 0xbf, 0x18, 0xe3, 0x10, 0x3e,
- 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
- 0xfc, 0xbf, 0xac, 0x3e, 0x0a, 0xc2, 0x53, 0x3f, 0xca, 0x19, 0x0e, 0x3f,
- 0x64, 0x2d, 0xa7, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x90, 0x52, 0xb2, 0x3d,
- 0xc4, 0x79, 0xe4, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
- 0x60, 0x2d, 0x27, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x40, 0x08, 0x1c, 0x3e,
- 0x08, 0xc2, 0x53, 0x3e, 0xb4, 0x77, 0xbd, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
- 0x20, 0xe5, 0xb7, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
- 0x1a, 0x64, 0x24, 0xbf, 0x90, 0x52, 0xb2, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
- 0x80, 0x31, 0x75, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0x86, 0xd1, 0x1e, 0x3f,
- 0x14, 0xe3, 0x90, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0xe0, 0x9c, 0x48, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0xe0, 0xbd, 0x85, 0xbd,
- 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x19, 0x0e, 0xbf,
- 0xe0, 0xbd, 0x85, 0xbd, 0xf0, 0xbd, 0x85, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
- 0x4b, 0x0a, 0x43, 0xbf, 0x90, 0x31, 0xf5, 0x3d, 0xe8, 0xbd, 0x05, 0xbe,
- 0x7c, 0x50, 0x8b, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e, 0x74, 0x2f, 0xce, 0xbe,
- 0xa2, 0xf4, 0x02, 0x3f, 0x34, 0x87, 0x08, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x14, 0xe3, 0x90, 0xbe, 0x90, 0x52, 0xb2, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0xaf, 0xf6, 0x29, 0xbf,
- 0x22, 0xe5, 0x37, 0xbf, 0x18, 0xe3, 0x10, 0x3e, 0x08, 0xc2, 0x53, 0x3e,
- 0x83, 0x31, 0x75, 0xbf, 0xf0, 0xbd, 0x85, 0x3d, 0x96, 0xd3, 0x45, 0x3f,
- 0x58, 0x0c, 0x6a, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xd0, 0x9a, 0xa1, 0x3e,
- 0xe0, 0xbd, 0x85, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0xc8, 0x19, 0x0e, 0xbf,
- 0xe0, 0x9c, 0x48, 0x3e, 0x24, 0xe5, 0xb7, 0x3e, 0x90, 0x52, 0xb2, 0x3e,
- 0xb4, 0x77, 0xbd, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x56, 0x2b, 0x00, 0x3f,
- 0x84, 0x31, 0xf5, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe, 0x08, 0xc2, 0x53, 0x3e,
- 0x34, 0x87, 0x08, 0xbf, 0x34, 0x87, 0x08, 0xbf, 0xb8, 0x77, 0x3d, 0xbe,
- 0x08, 0xc2, 0xd3, 0xbe, 0xa4, 0xd5, 0x6c, 0xbf, 0x20, 0xe5, 0xb7, 0xbe,
- 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x12, 0xe3, 0x10, 0x3f,
- 0x0a, 0x92, 0xa8, 0xbf, 0x68, 0x2d, 0x27, 0x3e, 0xa8, 0x75, 0x16, 0xbf,
- 0x58, 0x0c, 0x6a, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x17, 0xc4, 0x7a, 0xbf, 0x00, 0x41, 0x40, 0xbf, 0x38, 0x08, 0x1c, 0xbe,
- 0x90, 0x52, 0xb2, 0x3d, 0x65, 0x2d, 0x27, 0xbf, 0x1a, 0x64, 0x24, 0xbf,
- 0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0xde, 0xbe, 0x56, 0x2b, 0x00, 0xbf,
- 0xfc, 0xbf, 0xac, 0x3e, 0xaf, 0xf6, 0x29, 0xbf, 0xc0, 0x52, 0xb2, 0x3c,
- 0x14, 0xe3, 0x90, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0x3c, 0x08, 0x9c, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x31, 0x75, 0xbe, 0xc8, 0x19, 0x0e, 0xbf,
- 0xb8, 0x77, 0x3d, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0x30, 0x08, 0x9c, 0xbd, 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0xec, 0x9e, 0xef, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x80, 0x31, 0x75, 0xbe,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0xbd, 0x05, 0xbd,
- 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
- 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x31, 0x75, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0x90, 0x52, 0xb2, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
- 0x08, 0xc2, 0x53, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0x32, 0x3e,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
- 0x80, 0x52, 0xb2, 0xbc, 0xec, 0xbd, 0x85, 0x3e, 0x30, 0xe7, 0xde, 0xbe,
- 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0xf0, 0xbd, 0x85, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
- 0xf0, 0xbd, 0x05, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0x3c, 0x08, 0x9c, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x31, 0x75, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0x3c, 0x08, 0x9c, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x88, 0x31, 0x75, 0x3e,
- 0x80, 0x31, 0x75, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0xbc,
- 0x38, 0x08, 0x1c, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
- 0x80, 0x52, 0xb2, 0xbc, 0xe8, 0xbd, 0x85, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x9c, 0x54, 0xd9, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0xc0, 0x52, 0xb2, 0x3c, 0x40, 0x08, 0x9c, 0x3d,
- 0xf0, 0xbd, 0x05, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
- 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x34, 0x87, 0x08, 0xbf,
- 0x30, 0xe7, 0xde, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0x08, 0x9c, 0xbd,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x90, 0x52, 0xb2, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
- 0x3c, 0x08, 0x9c, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x90, 0x31, 0xf5, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
- 0xf8, 0xbf, 0xac, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x85, 0xbd,
- 0x80, 0x52, 0x32, 0xbd, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
- 0x20, 0xe7, 0x5e, 0xbd, 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x31, 0x75, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x88, 0x31, 0x75, 0x3e, 0x3c, 0x08, 0x1c, 0xbf,
- 0xe0, 0x9c, 0xc8, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x7c, 0x50, 0x8b, 0xbe, 0xf0, 0xbd, 0x85, 0x3d, 0x38, 0x08, 0x1c, 0xbe,
- 0x3c, 0x08, 0x1c, 0xbf, 0x8c, 0x52, 0xb2, 0xbe, 0x43, 0x89, 0x2f, 0xbf,
- 0x54, 0x2b, 0x80, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0x84, 0x31, 0xf5, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0xb8, 0x77, 0x3d, 0x3e,
- 0x80, 0x52, 0x32, 0xbc, 0x3c, 0x08, 0x9c, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x8c, 0x52, 0xb2, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbd,
- 0x30, 0x08, 0x9c, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xf2, 0x3e, 0x19, 0xbf,
- 0xec, 0xbd, 0x85, 0x3e, 0xa8, 0x75, 0x96, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
- 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
- 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x3c, 0x08, 0x9c, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0x43, 0x89, 0x2f, 0xbf, 0xd0, 0x9a, 0x21, 0xbf,
- 0xf0, 0xbd, 0x85, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0x3c,
- 0xf9, 0xbf, 0x2c, 0xbf, 0x90, 0x52, 0xb2, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x58, 0x0c, 0xea, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0xb2, 0xbd,
- 0x30, 0x08, 0x9c, 0xbd, 0xd0, 0x9a, 0xa1, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
- 0x0a, 0x92, 0xa8, 0xbf, 0x08, 0xc2, 0xd3, 0xbe, 0x34, 0x87, 0x08, 0xbf,
- 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x31, 0x75, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0x60, 0x2d, 0x27, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x68, 0x2d, 0xa7, 0x3e,
- 0x08, 0xc2, 0x53, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe, 0x1a, 0x64, 0x24, 0xbf,
- 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
- 0x5e, 0xac, 0x13, 0xbf, 0x40, 0x08, 0x9c, 0x3d, 0x30, 0xe7, 0x5e, 0x3e,
- 0x08, 0xc2, 0x53, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x34, 0xe7, 0xde, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0xbe,
- 0x4c, 0x0a, 0xc3, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x60, 0x0c, 0x6a, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xb8, 0x77, 0x3d, 0x3e,
- 0x30, 0x08, 0x9c, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x31, 0x75, 0xbe,
- 0x14, 0xe3, 0x90, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xec, 0xbd, 0x85, 0x3e,
- 0x08, 0xc2, 0xd3, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
- 0x30, 0xe7, 0x5e, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0x80, 0x52, 0x32, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x20, 0xe7, 0x5e, 0xbd,
- 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0x5e, 0xbe,
- 0xe8, 0xbd, 0x85, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x52, 0xb2, 0x3c,
- 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x0c, 0x6a, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x77, 0x3d, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0xbd,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0x56, 0x2b, 0x00, 0xbf,
- 0x40, 0x08, 0x9c, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
- 0xe0, 0xbd, 0x05, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x3c, 0x08, 0x9c, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x3c, 0x08, 0x9c, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0x1a, 0x64, 0x24, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x90, 0x31, 0xf5, 0x3d, 0xd8, 0x1b, 0x35, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0x74, 0x2f, 0xce, 0xbe, 0x54, 0x2b, 0x80, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0xc4, 0x79, 0xe4, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
- 0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
- 0xa0, 0x52, 0x32, 0x3d, 0x9c, 0x54, 0xd9, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0xbd, 0x05, 0xbd,
- 0x30, 0xe7, 0xde, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
- 0x90, 0x52, 0x32, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
- 0x20, 0xe7, 0x5e, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x68, 0x2d, 0xa7, 0x3e, 0xae, 0xf6, 0x29, 0x3f, 0xe8, 0xbd, 0x05, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
- 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x74, 0x2f, 0xce, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
- 0x40, 0x08, 0x9c, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0x5e, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
- 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
- 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xf8, 0xbf, 0xac, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
- 0x90, 0x52, 0x32, 0x3e, 0xa0, 0x52, 0x32, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
- 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0x3c,
- 0xe0, 0xbd, 0x85, 0xbd, 0x80, 0x52, 0x32, 0xbd, 0x38, 0x08, 0x1c, 0xbe,
- 0xb8, 0x77, 0x3d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe7, 0xde, 0xbd,
- 0x3e, 0x08, 0x1c, 0x3f, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x31, 0xf5, 0xbd,
- 0xf9, 0xbf, 0x2c, 0xbf, 0x60, 0x2d, 0x27, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x60, 0x2d, 0x27, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
- 0xe0, 0x9c, 0x48, 0xbe, 0x9c, 0x54, 0xd9, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
- 0x90, 0x52, 0xb2, 0x3d, 0x24, 0xe5, 0xb7, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xe0, 0x9c, 0x48, 0x3e, 0x12, 0xe3, 0x10, 0xbf, 0x88, 0x31, 0x75, 0x3e,
- 0xa8, 0x75, 0x16, 0xbf, 0x3c, 0x08, 0x9c, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0x08, 0xc2, 0x53, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0x80, 0x52, 0x32, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0xec, 0xbd, 0x85, 0x3e,
- 0xe0, 0x9c, 0xc8, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0x8c, 0x52, 0xb2, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0x80, 0x31, 0xf5, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0x88, 0x31, 0x75, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
- 0x90, 0x52, 0xb2, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0x60, 0x2d, 0x27, 0xbe,
- 0xec, 0x9e, 0xef, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x20, 0xe5, 0xb7, 0xbe,
- 0xec, 0xbd, 0x85, 0x3e, 0xa0, 0xf4, 0x02, 0xbf, 0x80, 0x52, 0x32, 0x3c,
- 0x14, 0xe3, 0x90, 0xbe, 0x68, 0x2d, 0xa7, 0x3e, 0x30, 0x08, 0x9c, 0xbd,
- 0xc0, 0x52, 0xb2, 0x3c, 0x3c, 0x08, 0x9c, 0x3e, 0x80, 0x52, 0x32, 0xbc,
- 0x56, 0x2b, 0x00, 0xbf, 0x24, 0xe5, 0xb7, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0x84, 0x31, 0xf5, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
- 0x34, 0x87, 0x08, 0xbf, 0x80, 0x50, 0x8b, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
- 0x58, 0x2b, 0x80, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
- 0x08, 0xc2, 0x53, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x88, 0x31, 0x75, 0x3e,
- 0x74, 0x2f, 0xce, 0xbe, 0x7e, 0x50, 0x0b, 0xbf, 0xf0, 0xbd, 0x05, 0x3e,
- 0xc4, 0x79, 0xe4, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x40, 0xe7, 0x5e, 0x3d, 0x74, 0x2f, 0xce, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0x48, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
- 0x18, 0xe3, 0x10, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x38, 0x08, 0x1c, 0xbe,
- 0xec, 0x9e, 0xef, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x5c, 0x0c, 0xea, 0x3e,
- 0x30, 0xe7, 0x5e, 0x3e, 0x8c, 0x52, 0xb2, 0xbe, 0xb4, 0x77, 0xbd, 0xbe,
- 0xb4, 0x77, 0xbd, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xa0, 0xf4, 0x02, 0xbf,
- 0xe0, 0xbd, 0x05, 0xbd, 0x14, 0xe3, 0x90, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0xe0, 0x9c, 0x48, 0xbe, 0xec, 0x9e, 0xef, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
- 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x80, 0x52, 0x32, 0xbd,
- 0x34, 0x87, 0x08, 0xbf, 0x34, 0xe7, 0xde, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x80, 0x52, 0x32, 0xbc, 0xa8, 0x75, 0x96, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
- 0x7c, 0x50, 0x8b, 0xbe, 0x5e, 0xac, 0x13, 0xbf, 0x88, 0x52, 0x32, 0xbe,
- 0x30, 0xe7, 0xde, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x68, 0x2d, 0xa7, 0x3e,
- 0x80, 0x52, 0x32, 0x3c, 0x58, 0x0c, 0x6a, 0xbe, 0x34, 0x87, 0x08, 0xbf,
- 0x80, 0x31, 0x75, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
- 0x80, 0x31, 0xf5, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
- 0x64, 0x2d, 0xa7, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0xee, 0x9e, 0x6f, 0xbf,
- 0xc8, 0x19, 0x0e, 0xbf, 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0x32, 0x3c,
- 0x9c, 0x54, 0xd9, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x4c, 0x0a, 0xc3, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0x7e, 0x50, 0x0b, 0xbf, 0xca, 0x19, 0x0e, 0x3f,
- 0xa0, 0xf4, 0x02, 0xbf, 0x20, 0xe7, 0x5e, 0xbd, 0x38, 0x68, 0x72, 0xbf,
- 0x38, 0x68, 0x72, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x8c, 0x52, 0xb2, 0xbe, 0xa8, 0x75, 0x16, 0xbf, 0x60, 0x0c, 0x6a, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xec, 0xbd, 0x85, 0x3e, 0x54, 0x2b, 0x80, 0xbe,
- 0x1c, 0xc4, 0xfa, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x52, 0x32, 0xbe,
- 0x84, 0x31, 0xf5, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
- 0x08, 0xc2, 0x53, 0x3e, 0xf2, 0x3e, 0x19, 0xbf, 0xe0, 0x9c, 0x48, 0x3e,
- 0xea, 0xbd, 0x05, 0xbf, 0x36, 0x87, 0x08, 0x3f, 0x60, 0x2d, 0x27, 0xbe,
- 0xe0, 0x9c, 0x48, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x02, 0x11, 0x95, 0xbf,
- 0x90, 0x31, 0xf5, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
- 0xf0, 0xbd, 0x05, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0x88, 0x52, 0x32, 0xbe,
- 0x08, 0xc2, 0x53, 0xbe, 0x08, 0xc2, 0x53, 0x3e, 0x88, 0x52, 0x32, 0xbe,
- 0xf2, 0x3e, 0x19, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0xb8, 0x77, 0x3d, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x4c, 0x0a, 0xc3, 0xbe,
- 0xe4, 0x9c, 0xc8, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
- 0x8c, 0x52, 0xb2, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x68, 0x2d, 0xa7, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0xaf, 0xf6, 0x29, 0xbf, 0xe9, 0xed, 0xb0, 0xbf,
- 0xb4, 0x77, 0xbd, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x5c, 0x0c, 0xea, 0x3e,
- 0xe0, 0x9c, 0x48, 0xbe, 0x84, 0x31, 0xf5, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0x86, 0xd1, 0x9e, 0xbf, 0xe0, 0xbd, 0x05, 0xbd, 0x40, 0x08, 0x1c, 0x3e,
- 0x38, 0x08, 0x1c, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
- 0x20, 0xe7, 0x5e, 0xbd, 0xaf, 0xf6, 0x29, 0xbf, 0xe8, 0xbd, 0x05, 0xbe,
- 0x65, 0x2d, 0x27, 0xbf, 0xa0, 0x52, 0x32, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
- 0x5c, 0x0c, 0xea, 0x3e, 0x3c, 0x08, 0x9c, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
- 0xf2, 0x3e, 0x19, 0x3f, 0xec, 0xbd, 0x85, 0x3e, 0xa8, 0x75, 0x96, 0xbe,
- 0x08, 0xc2, 0xd3, 0xbe, 0x34, 0x87, 0x08, 0xbf, 0x3c, 0x08, 0x9c, 0x3e,
- 0x7c, 0x50, 0x8b, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0x14, 0xe3, 0x90, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0xec, 0x9e, 0xef, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x85, 0xbd,
- 0x68, 0x2d, 0xa7, 0x3e, 0x8c, 0x52, 0xb2, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0xc4, 0x79, 0xe4, 0x3e, 0x56, 0x2b, 0x00, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
- 0x74, 0x2f, 0xce, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x8e, 0x52, 0x32, 0x3f,
- 0x08, 0xc2, 0xd3, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
- 0x5a, 0x0c, 0x6a, 0xbf, 0x3c, 0x08, 0x9c, 0x3e, 0xd2, 0x9a, 0x21, 0x3f,
- 0x08, 0xc2, 0x53, 0x3e, 0xea, 0xbd, 0x05, 0x3f, 0x58, 0x2b, 0x80, 0x3e,
- 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0xe7, 0x5e, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
- 0x40, 0x08, 0x9c, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0xe8, 0xbd, 0x85, 0xbe,
- 0x3c, 0x08, 0x9c, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xc0, 0x52, 0xb2, 0x3c,
- 0x08, 0xc2, 0x53, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0xbe, 0x30, 0xe7, 0xde, 0x3d,
- 0x90, 0x31, 0xf5, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0x3c, 0x60, 0x2d, 0x27, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0x74, 0x2f, 0xce, 0xbe, 0xec, 0x9e, 0xef, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0xe4, 0x9c, 0xc8, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
- 0x40, 0x08, 0x9c, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0x00, 0xbe, 0x05, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0xe7, 0x5e, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
- 0x80, 0x52, 0xb2, 0xbc, 0x30, 0xe7, 0xde, 0x3d, 0x80, 0x52, 0x32, 0xbd,
- 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0xe8, 0xbd, 0x85, 0xbe,
- 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0xe7, 0x5e, 0x3d,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xa8, 0x75, 0x96, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x14, 0xe3, 0x90, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0x2d, 0x27, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e,
- 0x3c, 0x08, 0x9c, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xa8, 0x75, 0x96, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0x32, 0x3c,
- 0x30, 0xe7, 0x5e, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd,
- 0x80, 0x52, 0x32, 0x3c, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
- 0xc0, 0x52, 0xb2, 0x3c, 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0x58, 0x2b, 0x80, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xa8, 0x75, 0x96, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x52, 0x32, 0x3e,
- 0x80, 0x31, 0xf5, 0xbd, 0x0c, 0xc2, 0xd3, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x90, 0x52, 0xb2, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
- 0x40, 0x08, 0x9c, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
- 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x31, 0x75, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x40, 0x08, 0x1c, 0x3e, 0x08, 0xc2, 0x53, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0xe0, 0xbd, 0x85, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0x5e, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0xa0, 0x52, 0x32, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0x3c, 0x08, 0x9c, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0x32, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xe0, 0x9c, 0x48, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
- 0x14, 0xe3, 0x90, 0x3e, 0x74, 0x2f, 0xce, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x3c, 0x08, 0x9c, 0xbe, 0xc8, 0x19, 0x0e, 0xbf, 0x80, 0x52, 0xb2, 0xbc,
- 0x18, 0xe3, 0x10, 0x3e, 0x5e, 0xac, 0x13, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
- 0x14, 0xe3, 0x90, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
- 0xc4, 0x79, 0xe4, 0x3e, 0xa8, 0x75, 0x96, 0x3e, 0x14, 0xe3, 0x90, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0xd0, 0x9a, 0xa1, 0x3e, 0x22, 0xe5, 0x37, 0xbf,
- 0x88, 0x31, 0x75, 0x3e, 0xd8, 0x1b, 0x35, 0xbf, 0x64, 0x2d, 0xa7, 0xbe,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x80, 0x52, 0x32, 0xbd, 0x14, 0xe3, 0x90, 0x3e,
- 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
- 0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0x5e, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0x80, 0x31, 0x75, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x24, 0xe5, 0xb7, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0x68, 0x2d, 0xa7, 0x3e, 0xa0, 0xf4, 0x02, 0xbf,
- 0xe8, 0xbd, 0x85, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x74, 0x2f, 0xce, 0x3e,
- 0x68, 0x2d, 0x27, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xcd, 0xfa, 0x77, 0xbf, 0x7b, 0xb0, 0x61, 0xbf, 0x88, 0x31, 0x75, 0x3e,
- 0x68, 0x2d, 0x27, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0xec, 0x9e, 0xef, 0x3e,
- 0x14, 0xe3, 0x90, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0xec, 0xbd, 0x85, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0xec, 0xbd, 0x85, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x88, 0x31, 0x75, 0x3e,
- 0xc0, 0x52, 0xb2, 0x3c, 0x56, 0x2b, 0x00, 0x3f, 0x8c, 0x52, 0xb2, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x88, 0x31, 0x75, 0x3e,
- 0xf0, 0xbd, 0x05, 0x3e, 0xec, 0xbd, 0x85, 0x3e, 0x90, 0x52, 0x32, 0x3e,
- 0x74, 0x2f, 0xce, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0x7e, 0x50, 0x0b, 0xbf, 0x58, 0x2b, 0x80, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
- 0xe0, 0x9c, 0x48, 0x3e, 0x3c, 0x08, 0x9c, 0x3e, 0x84, 0x31, 0xf5, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xb4, 0x77, 0xbd, 0xbe, 0x80, 0x52, 0x32, 0x3c,
- 0x90, 0x52, 0xb2, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x8d, 0x52, 0x32, 0xbf,
- 0x20, 0xe7, 0x5e, 0xbd, 0x60, 0x0c, 0x6a, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
- 0x64, 0x2d, 0xa7, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
- 0x95, 0xd3, 0x45, 0xbf, 0xfc, 0xbf, 0xac, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
- 0x40, 0xe7, 0x5e, 0x3d, 0x14, 0xe3, 0x90, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0xb8, 0x77, 0x3d, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0x68, 0x2d, 0xa7, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x20, 0xe5, 0xb7, 0xbe,
- 0x74, 0x2f, 0xce, 0xbe, 0x64, 0x2d, 0xa7, 0xbe, 0xa8, 0x75, 0x96, 0xbe,
- 0x14, 0xe3, 0x90, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0x3c,
- 0x8d, 0x52, 0x32, 0xbf, 0x64, 0x2d, 0xa7, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x3c, 0x08, 0x9c, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xf8, 0xbf, 0xac, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0xf8, 0xbf, 0xac, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x74, 0x2f, 0x4e, 0xbf,
- 0x30, 0x08, 0x9c, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0xbd, 0x05, 0xbd,
- 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0x08, 0x9c, 0x3d, 0xd0, 0x9a, 0x21, 0xbf,
- 0x20, 0xe5, 0xb7, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x58, 0x0c, 0x6a, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xda, 0xeb, 0x89, 0xbf,
- 0x58, 0x0c, 0x6a, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbd, 0x85, 0x3d,
- 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
- 0x30, 0xe7, 0xde, 0x3d, 0x9c, 0x54, 0xd9, 0xbe, 0x58, 0x0c, 0xea, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x52, 0xb2, 0xbc,
- 0xc4, 0x79, 0xe4, 0xbe, 0xf9, 0xbf, 0x2c, 0xbf, 0x80, 0x52, 0xb2, 0xbc,
- 0xd8, 0x1b, 0x35, 0xbf, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
- 0x90, 0x52, 0x32, 0x3e, 0xf0, 0xbd, 0x05, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
- 0x80, 0x52, 0xb2, 0xbc, 0xb8, 0x77, 0x3d, 0x3e, 0x88, 0x52, 0x32, 0xbe,
- 0x34, 0x87, 0x08, 0xbf, 0xe0, 0xbd, 0x85, 0xbd, 0x22, 0xe5, 0x37, 0xbf,
- 0x30, 0xe7, 0x5e, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0x08, 0xc2, 0xd3, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
- 0x56, 0x2b, 0x00, 0xbf, 0x30, 0xe7, 0x5e, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
- 0x88, 0x31, 0x75, 0x3e, 0xc4, 0x79, 0xe4, 0xbe, 0x65, 0x2d, 0x27, 0xbf,
- 0x4c, 0x0a, 0xc3, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0x9c, 0x48, 0x3e, 0x18, 0xe3, 0x10, 0x3e,
- 0xec, 0x9e, 0xef, 0xbe, 0xb8, 0x77, 0x3d, 0x3e, 0xa0, 0x52, 0x32, 0x3d,
- 0xf0, 0xbd, 0x85, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
- 0xc8, 0x19, 0x0e, 0xbf, 0xd0, 0x9a, 0x21, 0xbf, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0xe7, 0x5e, 0xbd, 0x4c, 0x0a, 0xc3, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
- 0x88, 0x31, 0x75, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0x90, 0x52, 0x32, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0x58, 0x2b, 0x80, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0xc0, 0x52, 0xb2, 0x3c,
- 0xec, 0x9e, 0xef, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x08, 0xc2, 0xd3, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0xbd, 0x7c, 0x50, 0x8b, 0xbe,
- 0x8c, 0x52, 0xb2, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
- 0x30, 0xe7, 0x5e, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0x90, 0x52, 0xb2, 0xbd,
- 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x9c, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x90, 0x52, 0xb2, 0xbd, 0xfc, 0xbf, 0xac, 0x3e,
- 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x60, 0x2d, 0x27, 0xbe,
- 0x88, 0x31, 0x75, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0xc8, 0x19, 0x0e, 0xbf,
- 0x8c, 0x52, 0xb2, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0xd8, 0x1b, 0x35, 0xbf,
- 0x00, 0xbe, 0x05, 0x3d, 0x38, 0x08, 0x1c, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
- 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbd,
- 0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x40, 0x08, 0x1c, 0x3e,
- 0x08, 0xc2, 0x53, 0xbe, 0x30, 0x08, 0x9c, 0xbd, 0x8c, 0x52, 0xb2, 0xbe,
- 0x65, 0x2d, 0x27, 0xbf, 0x40, 0x08, 0x9c, 0x3d, 0xf0, 0xbd, 0x85, 0x3d,
- 0x60, 0x2d, 0x27, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0xf8, 0xbf, 0xac, 0xbe,
- 0x8c, 0x52, 0xb2, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x88, 0x52, 0x32, 0xbe,
- 0x68, 0x2d, 0x27, 0x3e, 0x90, 0x31, 0xf5, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
- 0x3c, 0x08, 0x9c, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe, 0xea, 0xbd, 0x05, 0xbf,
- 0x88, 0x52, 0x32, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0x9c, 0x48, 0xbe,
- 0xa8, 0x75, 0x16, 0xbf, 0xe7, 0x1d, 0x5c, 0xbf, 0xd0, 0x9a, 0x21, 0xbf,
- 0xe0, 0x9c, 0x48, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0x74, 0x2f, 0xce, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x80, 0x52, 0x32, 0xbc, 0x74, 0x2f, 0xce, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
- 0x90, 0x52, 0xb2, 0xbd, 0x88, 0x52, 0x32, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0xe8, 0xbd, 0x85, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x68, 0x2d, 0x27, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
- 0x40, 0x08, 0x9c, 0x3d, 0x68, 0x2d, 0xa7, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd, 0x4c, 0xda, 0x97, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x38, 0x08, 0x1c, 0xbe, 0xb8, 0x77, 0x3d, 0x3e,
- 0x80, 0x52, 0x32, 0x3c, 0xc0, 0x52, 0xb2, 0x3c, 0xb8, 0x77, 0x3d, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0x32, 0xbc, 0x54, 0x2b, 0x80, 0xbe,
- 0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0x3e, 0xec, 0x9e, 0xef, 0xbe,
- 0xb8, 0x77, 0x3d, 0x3e, 0xec, 0x9e, 0xef, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbd,
- 0x3c, 0x08, 0x9c, 0xbe, 0x3c, 0x08, 0x9c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
- 0x08, 0xc2, 0x53, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x31, 0x75, 0xbe,
- 0x4c, 0x0a, 0xc3, 0x3e, 0xc4, 0x79, 0xe4, 0x3e, 0x90, 0x31, 0xf5, 0x3d,
- 0xa0, 0x52, 0x32, 0x3d, 0xec, 0x9e, 0xef, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xf0, 0xbd, 0x05, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0xea, 0xbd, 0x05, 0xbf, 0x74, 0x2f, 0xce, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
- 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0xa0, 0x52, 0x32, 0x3d,
- 0x40, 0x08, 0x1c, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0xb6, 0x77, 0x3d, 0xbf, 0x90, 0x52, 0xb2, 0xbd, 0x08, 0xc2, 0x53, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x14, 0xe3, 0x90, 0xbe, 0x5e, 0xac, 0x13, 0xbf,
- 0x68, 0x2d, 0x27, 0x3e, 0x68, 0x2d, 0x27, 0x3e, 0xa0, 0xf4, 0x02, 0xbf,
- 0x14, 0xe3, 0x90, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0xe0, 0xbd, 0x05, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0xbd, 0x05, 0xbd,
- 0xe8, 0xbd, 0x85, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0xe8, 0xbd, 0x85, 0xbe,
- 0xaf, 0xf6, 0x29, 0xbf, 0x74, 0x2f, 0xce, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
- 0xa0, 0x52, 0x32, 0x3d, 0x64, 0x2d, 0xa7, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x68, 0x2d, 0xa7, 0x3e,
- 0x1a, 0x64, 0x24, 0xbf, 0xe0, 0x9c, 0xc8, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
- 0x20, 0xe7, 0x5e, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0xaa, 0x75, 0x16, 0x3f,
- 0x34, 0x87, 0x08, 0xbf, 0x08, 0xc2, 0xd3, 0xbe, 0x3c, 0x08, 0x1c, 0xbf,
- 0x30, 0x08, 0x9c, 0xbd, 0x68, 0x2d, 0xa7, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
- 0x14, 0xe3, 0x90, 0x3e, 0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x7e, 0x50, 0x0b, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x8c, 0x52, 0xb2, 0xbe, 0xea, 0xbd, 0x05, 0xbf, 0xe0, 0x9c, 0x48, 0x3e,
- 0x88, 0x52, 0x32, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0x9c, 0x54, 0xd9, 0x3e,
- 0xa0, 0x52, 0x32, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
- 0xd8, 0x1b, 0x35, 0xbf, 0xa8, 0x75, 0x96, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0xc0, 0x52, 0xb2, 0x3c, 0x7e, 0x50, 0x0b, 0xbf,
- 0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x52, 0x32, 0xbd, 0x56, 0x2b, 0x00, 0xbf,
- 0x10, 0xe3, 0x10, 0xbe, 0x38, 0x08, 0x1c, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
- 0x20, 0xe7, 0x5e, 0xbd, 0x58, 0x0c, 0xea, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x14, 0xe3, 0x90, 0x3e,
- 0xa8, 0x75, 0x96, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x64, 0x2d, 0xa7, 0xbe,
- 0x9c, 0x54, 0xd9, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x3c, 0x08, 0x1c, 0xbf,
- 0x54, 0x2b, 0x80, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x68, 0x2d, 0xa7, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
- 0x30, 0xe7, 0x5e, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x10, 0xe3, 0x10, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0xc0, 0x52, 0xb2, 0x3c,
- 0x3c, 0x08, 0x9c, 0x3e, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
- 0xf8, 0xbf, 0xac, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0x4c, 0x0a, 0xc3, 0x3e, 0x14, 0xe3, 0x90, 0x3e, 0x84, 0x31, 0xf5, 0xbe,
- 0x8c, 0x52, 0xb2, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0xe0, 0xbd, 0x05, 0xbd,
- 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x85, 0xbd, 0x1a, 0x64, 0x24, 0xbf,
- 0x58, 0x0c, 0xea, 0xbe, 0x3c, 0x08, 0x9c, 0x3e, 0xa0, 0xf4, 0x02, 0xbf,
- 0x08, 0xc2, 0x53, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
- 0x30, 0xe7, 0x5e, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x34, 0xe7, 0xde, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0xec, 0x9e, 0xef, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x90, 0x52, 0x32, 0x3e,
- 0xfc, 0xbf, 0xac, 0x3e, 0xe0, 0x9c, 0x48, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0xe8, 0xbd, 0x05, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
- 0x68, 0x2d, 0x27, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x10, 0xe3, 0x10, 0xbe, 0xaf, 0xf6, 0x29, 0xbf,
- 0xc0, 0x52, 0xb2, 0x3c, 0xb4, 0x77, 0xbd, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0xfc, 0xbf, 0xac, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
- 0x90, 0x31, 0xf5, 0x3d, 0xa8, 0x75, 0x96, 0xbe, 0xe7, 0x1d, 0x5c, 0xbf,
- 0x58, 0x0c, 0x6a, 0xbe, 0x84, 0x31, 0xf5, 0x3e, 0x08, 0xc2, 0x53, 0xbe,
- 0x90, 0x52, 0xb2, 0xbd, 0x31, 0xe7, 0x5e, 0xbf, 0xe0, 0xbd, 0x05, 0xbd,
- 0xb8, 0x77, 0x3d, 0x3e, 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x74, 0x2f, 0xce, 0x3e, 0x74, 0x2f, 0xce, 0x3e, 0x8d, 0x52, 0x32, 0xbf,
- 0x80, 0x52, 0x32, 0xbc, 0x74, 0x2f, 0xce, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
- 0x24, 0xe5, 0xb7, 0x3e, 0xa2, 0xf4, 0x02, 0x3f, 0x18, 0xe3, 0x10, 0x3e,
- 0x14, 0xe3, 0x90, 0x3e, 0xc8, 0x19, 0x0e, 0xbf, 0x80, 0x52, 0x32, 0x3c,
- 0xf0, 0xbd, 0x85, 0x3d, 0xd0, 0x9a, 0xa1, 0x3e, 0xc4, 0x79, 0xe4, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x4b, 0x0a, 0x43, 0xbf, 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0x3e,
- 0x80, 0x52, 0x32, 0xbd, 0x14, 0xe3, 0x90, 0xbe, 0x84, 0x31, 0xf5, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xc8, 0x19, 0x0e, 0xbf, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x00, 0xbe, 0x05, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
- 0x80, 0x31, 0xf5, 0xbd, 0x30, 0xe7, 0xde, 0x3d, 0xd0, 0x9a, 0x21, 0xbf,
- 0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xd0, 0x9a, 0xa1, 0xbe,
- 0xe8, 0xbd, 0x85, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0x48, 0x3e, 0xe0, 0x9c, 0x48, 0x3e,
- 0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x80, 0x50, 0x8b, 0x3e,
- 0xf8, 0xbf, 0xac, 0xbe, 0x08, 0xc2, 0x53, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0x58, 0x0c, 0xea, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0xd0, 0x9a, 0xa1, 0xbe,
- 0xe8, 0xbd, 0x85, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0x3c,
- 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
- 0x80, 0x52, 0xb2, 0xbc, 0x8c, 0x52, 0xb2, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x8c, 0x52, 0xb2, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0x3c, 0x08, 0x9c, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
- 0xfc, 0xbf, 0xac, 0x3e, 0x40, 0x08, 0x1c, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
- 0x00, 0xbe, 0x05, 0x3d, 0x90, 0x31, 0xf5, 0x3d, 0x14, 0xe3, 0x90, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
- 0xaf, 0xf6, 0x29, 0xbf, 0x30, 0x08, 0x9c, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
- 0x80, 0x31, 0x75, 0xbe, 0x14, 0xe3, 0x90, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
- 0x40, 0xe7, 0x5e, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0xe0, 0x9c, 0x48, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0xbe, 0xf8, 0x50, 0xbf, 0xe0, 0x9c, 0x48, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xf9, 0xbf, 0x2c, 0xbf,
- 0xe8, 0xbd, 0x05, 0xbe, 0x9c, 0x54, 0xd9, 0x3e, 0x84, 0x31, 0xf5, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x90, 0x31, 0xf5, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe7, 0xde, 0x3d,
- 0x08, 0xc2, 0x53, 0xbe, 0x58, 0x2b, 0x80, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
- 0x6c, 0xae, 0x3a, 0xbf, 0x40, 0x08, 0x9c, 0x3d, 0x30, 0xe7, 0xde, 0xbe,
- 0x08, 0xc2, 0x53, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0xe8, 0xbd, 0x85, 0xbe,
- 0x90, 0x31, 0xf5, 0x3d, 0x64, 0x2d, 0xa7, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0xe8, 0xbd, 0x85, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
- 0x80, 0x52, 0x32, 0x3c, 0x60, 0x2d, 0x27, 0xbe, 0x14, 0xe3, 0x90, 0xbe,
- 0x58, 0x0c, 0xea, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xbe, 0x05, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0x90, 0x52, 0x32, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0x08, 0xc2, 0x53, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x7c, 0x50, 0x8b, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0x24, 0xe5, 0xb7, 0x3e, 0x30, 0xe7, 0xde, 0xbd,
- 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0xde, 0xbd,
- 0xe8, 0xbd, 0x85, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x74, 0x2f, 0xce, 0xbe,
- 0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x20, 0xe5, 0xb7, 0xbe,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xfc, 0xbf, 0xac, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0x9c, 0x54, 0xd9, 0xbe, 0x14, 0xe3, 0x90, 0xbe, 0x56, 0x2b, 0x00, 0xbf,
- 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0xea, 0xbd, 0x05, 0xbf,
- 0xc4, 0x79, 0xe4, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0xf0, 0xbd, 0x85, 0x3d,
- 0x7c, 0x50, 0x8b, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0x38, 0x08, 0x1c, 0xbe, 0x58, 0x0c, 0x6a, 0xbe, 0x60, 0x0c, 0x6a, 0x3e,
- 0x30, 0xe7, 0x5e, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x4c, 0x0a, 0xc3, 0xbe,
- 0x90, 0x52, 0x32, 0x3e, 0x64, 0x2d, 0xa7, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
- 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d, 0xc0, 0x52, 0xb2, 0x3c,
- 0x74, 0x2f, 0xce, 0x3e, 0x3c, 0x08, 0x9c, 0xbe, 0xd8, 0x1b, 0x35, 0xbf,
- 0xf8, 0xbf, 0xac, 0xbe, 0x74, 0x2f, 0xce, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x54, 0x2b, 0x80, 0xbe, 0xe0, 0x9c, 0x48, 0x3e,
- 0x7c, 0x50, 0x8b, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x9c, 0x54, 0xd9, 0x3e,
- 0x80, 0x52, 0x32, 0xbc, 0x14, 0xe3, 0x90, 0xbe, 0x80, 0x52, 0x32, 0xbc,
- 0xea, 0xbd, 0x05, 0xbf, 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0xbd, 0x05, 0xbd,
- 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0x3c,
- 0x3c, 0x08, 0x9c, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0xb4, 0x77, 0xbd, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x60, 0x2d, 0x27, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0x4c, 0x0a, 0xc3, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0x3c, 0x08, 0x9c, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0xc4, 0x79, 0xe4, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
- 0x30, 0xe7, 0xde, 0xbd, 0xf2, 0x3e, 0x19, 0x3f, 0xe0, 0x9c, 0x48, 0xbe,
- 0x38, 0x08, 0x1c, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x90, 0x52, 0xb2, 0xbd,
- 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x85, 0xbd, 0x68, 0x2d, 0xa7, 0x3e,
- 0x80, 0x31, 0xf5, 0xbd, 0xe0, 0x9c, 0xc8, 0xbe, 0xd0, 0x9a, 0xa1, 0x3e,
- 0xd0, 0x9a, 0x21, 0xbf, 0x80, 0x50, 0x8b, 0x3e, 0xec, 0xbd, 0x85, 0x3e,
- 0xe0, 0x9c, 0x48, 0xbe, 0x3c, 0x08, 0x9c, 0xbe, 0x38, 0x08, 0x1c, 0xbe,
- 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
- 0xe0, 0x9c, 0x48, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x64, 0x2d, 0xa7, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0xf0, 0xbd, 0x85, 0x3d, 0x5c, 0x0c, 0xea, 0x3e,
- 0x80, 0x52, 0x32, 0xbc, 0xc4, 0x79, 0xe4, 0xbe, 0x7c, 0x50, 0x8b, 0xbe,
- 0xa0, 0x52, 0x32, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0xe8, 0xbd, 0x05, 0xbe,
- 0x58, 0x2b, 0x80, 0x3e, 0x18, 0xc4, 0xfa, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0xf8, 0xbf, 0xac, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xd0, 0x9a, 0xa1, 0xbe,
- 0xe8, 0xbd, 0x85, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0x3c, 0x08, 0x9c, 0x3e, 0xec, 0x9e, 0xef, 0xbe, 0x24, 0xe5, 0xb7, 0x3e,
- 0x80, 0x52, 0x32, 0x3c, 0x00, 0xbe, 0x05, 0x3d, 0x08, 0xc2, 0xd3, 0xbe,
- 0x88, 0x31, 0x75, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x58, 0x0c, 0x6a, 0xbe,
- 0x4c, 0x0a, 0xc3, 0xbe, 0x96, 0xd3, 0x45, 0x3f, 0x7c, 0x50, 0x8b, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0x10, 0xe3, 0x10, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0xf0, 0xbd, 0x05, 0x3e, 0xc4, 0x79, 0xe4, 0xbe,
- 0x14, 0xe3, 0x90, 0x3e, 0x88, 0x52, 0x32, 0xbe, 0xa0, 0x52, 0x32, 0x3d,
- 0x88, 0x52, 0x32, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x0c, 0x6a, 0x3e,
- 0x90, 0x31, 0xf5, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x58, 0x2b, 0x80, 0x3e,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x68, 0x2d, 0x27, 0x3e, 0x8d, 0x52, 0x32, 0xbf,
- 0x0c, 0xc2, 0xd3, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xb8, 0x77, 0x3d, 0xbe, 0x80, 0x31, 0xf5, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
- 0x08, 0xc2, 0x53, 0x3e, 0xd0, 0x9a, 0xa1, 0xbe, 0x90, 0x52, 0xb2, 0x3e,
- 0xfc, 0xbf, 0xac, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
- 0xaf, 0xf6, 0x29, 0xbf, 0xe8, 0xbd, 0x05, 0xbe, 0xb8, 0x77, 0xbd, 0x3e,
- 0x74, 0x2f, 0xce, 0x3e, 0xe4, 0x9c, 0xc8, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
- 0xea, 0xbd, 0x05, 0x3f, 0xb8, 0x77, 0x3d, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e,
- 0x30, 0xe7, 0xde, 0xbe, 0xe0, 0x9c, 0x48, 0x3e, 0x58, 0x2b, 0x80, 0x3e,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x68, 0x2d, 0xa7, 0x3e, 0x7c, 0x50, 0x8b, 0xbe,
- 0x4c, 0x0a, 0xc3, 0xbe, 0xe4, 0x9c, 0xc8, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x30, 0xe7, 0x5e, 0x3e,
- 0x80, 0x52, 0x32, 0x3c, 0x30, 0xe7, 0xde, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
- 0x20, 0xe7, 0x5e, 0xbd, 0x20, 0xe5, 0xb7, 0xbe, 0x86, 0xd1, 0x1e, 0xbf,
- 0x40, 0x08, 0x1c, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
- 0x14, 0xe3, 0x90, 0x3e, 0xf8, 0xbf, 0xac, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xc8, 0x19, 0x0e, 0xbf, 0x80, 0x31, 0x75, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0x80, 0x52, 0x32, 0x3c, 0x60, 0x2d, 0x27, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0x58, 0x0c, 0x6a, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x56, 0x2b, 0x00, 0x3f,
- 0xd0, 0x9a, 0xa1, 0xbe, 0xec, 0xbd, 0x85, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
- 0xf0, 0xbd, 0x85, 0x3d, 0x34, 0x87, 0x08, 0xbf, 0x90, 0x52, 0xb2, 0xbd,
- 0x88, 0x52, 0x32, 0xbe, 0xfc, 0xbf, 0xac, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
- 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0x60, 0x0c, 0x6a, 0x3e,
- 0x7c, 0x50, 0x8b, 0xbe, 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0x48, 0xbe,
- 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0x9c, 0x48, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
- 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0x32, 0xbd,
- 0x90, 0x52, 0xb2, 0x3d, 0x74, 0x2f, 0xce, 0xbe, 0x90, 0x52, 0xb2, 0x3e,
- 0x20, 0xe5, 0xb7, 0xbe, 0x40, 0x08, 0x1c, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
- 0xaa, 0x75, 0x16, 0x3f, 0xb8, 0x77, 0x3d, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e,
- 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x31, 0xf5, 0xbd,
- 0x4c, 0x0a, 0xc3, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0xd0, 0x9a, 0x21, 0xbf, 0x68, 0x2d, 0x27, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
- 0x20, 0xe7, 0x5e, 0xbd, 0xb4, 0x77, 0xbd, 0xbe, 0xa2, 0xf4, 0x02, 0x3f,
- 0xe0, 0xbd, 0x85, 0xbd, 0x86, 0xd1, 0x9e, 0xbf, 0x80, 0x52, 0x32, 0xbd,
- 0xe0, 0x9c, 0x48, 0x3e, 0x86, 0xd1, 0x1e, 0xbf, 0x30, 0xe7, 0xde, 0xbd,
- 0x80, 0x52, 0xb2, 0xbc, 0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0xea, 0xbd, 0x05, 0xbf, 0x90, 0x52, 0xb2, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
- 0x12, 0xe3, 0x10, 0x3f, 0xf0, 0xbd, 0x85, 0x3d, 0x00, 0xbe, 0x05, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x7e, 0x50, 0x0b, 0x3f, 0x90, 0x52, 0x32, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0xf0, 0xbd, 0x85, 0x3d, 0x40, 0x08, 0x9c, 0x3d,
- 0xe0, 0x9c, 0x48, 0xbe, 0xf8, 0xbf, 0xac, 0xbe, 0xe8, 0xbd, 0x05, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0xea, 0xbd, 0x05, 0xbf, 0xe0, 0x9c, 0x48, 0xbe,
- 0x30, 0xe7, 0xde, 0xbd, 0xb8, 0x77, 0xbd, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0x80, 0x52, 0x32, 0x3c, 0xe0, 0x9c, 0x48, 0xbe, 0x08, 0xc2, 0x53, 0xbe,
- 0x14, 0xe3, 0x90, 0x3e, 0x20, 0xe5, 0xb7, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
- 0x24, 0xe5, 0xb7, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
- 0xa0, 0x52, 0x32, 0x3d, 0xf8, 0xbf, 0xac, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
- 0x14, 0xe3, 0x90, 0x3e, 0x10, 0xe3, 0x10, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
- 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0x86, 0xd1, 0x1e, 0xbf, 0x30, 0xe7, 0xde, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
- 0x30, 0xe7, 0xde, 0xbd, 0x08, 0xc2, 0x53, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0x38, 0x08, 0x1c, 0xbe, 0xe8, 0xbd, 0x05, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x20, 0xe7, 0x5e, 0xbd,
- 0x58, 0x0c, 0x6a, 0xbe, 0x08, 0xc2, 0xd3, 0xbe, 0x58, 0x0c, 0x6a, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0xd8, 0x1b, 0x35, 0xbf,
- 0x30, 0x08, 0x9c, 0xbd, 0x4c, 0x0a, 0xc3, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0x80, 0x31, 0xf5, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0x84, 0x31, 0xf5, 0xbe,
- 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x52, 0x32, 0xbc,
- 0xf8, 0xbf, 0xac, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0x40, 0x08, 0x1c, 0x3e, 0x58, 0x2b, 0x80, 0x3e, 0x8c, 0x52, 0xb2, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0x54, 0x2b, 0x80, 0xbe, 0x80, 0x31, 0x75, 0xbe,
- 0x54, 0x2b, 0x80, 0xbe, 0x88, 0x52, 0x32, 0xbe, 0x8c, 0x52, 0xb2, 0xbe,
- 0x58, 0x0c, 0xea, 0xbe, 0xb8, 0x77, 0x3d, 0xbe, 0xa8, 0x75, 0x96, 0x3e,
- 0xe8, 0xbd, 0x85, 0xbe, 0x7c, 0x50, 0x8b, 0xbe, 0x80, 0x31, 0x75, 0xbe,
- 0x3c, 0x08, 0x9c, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0x18, 0xe3, 0x10, 0x3e, 0x90, 0x52, 0xb2, 0x3e, 0x80, 0x50, 0x8b, 0x3e,
- 0x58, 0x2b, 0x80, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0x80, 0x52, 0x32, 0x3c, 0x20, 0xe5, 0xb7, 0xbe, 0x80, 0x31, 0x75, 0xbe,
- 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x31, 0xf5, 0xbd, 0x80, 0x31, 0xf5, 0xbd,
- 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0xe0, 0xbd, 0x05, 0xbd,
- 0x80, 0x52, 0x32, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0xb4, 0x77, 0xbd, 0xbe,
- 0x88, 0x52, 0x32, 0xbe, 0xa8, 0x75, 0x96, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x68, 0x2d, 0x27, 0x3e, 0xf0, 0xbd, 0x85, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
- 0x58, 0x0c, 0x6a, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x31, 0x75, 0xbe,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0x10, 0xe3, 0x10, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0x32, 0x3e, 0xd0, 0x9a, 0xa1, 0x3e,
- 0x64, 0x2d, 0xa7, 0xbe, 0x8c, 0x52, 0xb2, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0x68, 0x2d, 0x27, 0x3e, 0x58, 0x0c, 0x6a, 0xbe, 0x90, 0x52, 0x32, 0x3e,
- 0xb8, 0x77, 0x3d, 0x3e, 0x3c, 0x08, 0x1c, 0xbf, 0x60, 0x0c, 0x6a, 0x3e,
- 0x3c, 0x08, 0x1c, 0xbf, 0xa8, 0x75, 0x96, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0x80, 0x52, 0x32, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x90, 0x52, 0x32, 0x3e,
- 0x30, 0x08, 0x9c, 0xbd, 0x58, 0x2b, 0x80, 0x3e, 0x64, 0x2d, 0xa7, 0xbe,
- 0x80, 0x31, 0xf5, 0xbd, 0x38, 0x08, 0x1c, 0xbe, 0x10, 0xe3, 0x10, 0xbe,
- 0x30, 0x08, 0x9c, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x30, 0x08, 0x9c, 0xbd,
- 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd, 0x8c, 0x52, 0xb2, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0xd8, 0x1b, 0x35, 0xbf, 0x80, 0x31, 0xf5, 0xbd,
- 0xe0, 0x9c, 0x48, 0xbe, 0xd0, 0x9a, 0xa1, 0xbe, 0x18, 0xe3, 0x10, 0x3e,
- 0x40, 0x08, 0x1c, 0x3e, 0x30, 0xe7, 0xde, 0x3d, 0xa0, 0x52, 0x32, 0x3d,
- 0x80, 0x52, 0xb2, 0xbc, 0x10, 0xe3, 0x10, 0xbe, 0x88, 0x52, 0x32, 0xbe,
- 0x80, 0x52, 0xb2, 0xbc, 0x90, 0x31, 0xf5, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x08, 0xc2, 0xd3, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0x5e, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0xb8, 0x77, 0x3d, 0xbe,
- 0xfb, 0x8f, 0x81, 0xbf, 0x80, 0x52, 0xb2, 0xbc, 0xb4, 0x77, 0xbd, 0xbe,
- 0x88, 0x31, 0x75, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x50, 0x8b, 0x3e,
- 0xe0, 0xbd, 0x05, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
- 0x60, 0x0c, 0x6a, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x08, 0xc2, 0x53, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x80, 0x50, 0x8b, 0x3e,
- 0x54, 0x2b, 0x80, 0xbe, 0xec, 0x9e, 0xef, 0xbe, 0x60, 0x2d, 0x27, 0xbe,
- 0x74, 0x2f, 0xce, 0x3e, 0xb8, 0x77, 0xbd, 0x3e, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x80, 0x31, 0xf5, 0xbd, 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
- 0x30, 0xe7, 0xde, 0xbe, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x31, 0x75, 0xbe,
- 0x18, 0xe3, 0x10, 0x3e, 0x18, 0xe3, 0x10, 0x3e, 0x30, 0xe7, 0xde, 0x3d,
- 0x30, 0xe7, 0xde, 0xbd, 0xe7, 0x1d, 0x5c, 0xbf, 0x58, 0x2b, 0x80, 0x3e,
- 0x60, 0x0c, 0x6a, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0x3c,
- 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x90, 0x52, 0xb2, 0xbd,
- 0x20, 0xe7, 0x5e, 0xbd, 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0xe8, 0xbd, 0x05, 0xbe, 0x0c, 0xc2, 0xd3, 0x3e, 0x40, 0xe7, 0x5e, 0x3d,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x9c, 0x54, 0xd9, 0x3e, 0xea, 0xbd, 0x05, 0xbf,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0xde, 0xbd, 0x84, 0x31, 0xf5, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
- 0x20, 0xe7, 0x5e, 0xbd, 0x80, 0x52, 0x32, 0x3c, 0x38, 0x08, 0x1c, 0xbe,
- 0x14, 0xe3, 0x90, 0xbe, 0x30, 0xe7, 0xde, 0xbd, 0x30, 0xe7, 0x5e, 0xbe,
- 0x0c, 0xc2, 0xd3, 0x3e, 0xe0, 0x9c, 0x48, 0x3e, 0xe8, 0xbd, 0x05, 0xbe,
- 0xe8, 0xbd, 0x85, 0xbe, 0x60, 0x0c, 0x6a, 0x3e, 0x80, 0x52, 0xb2, 0xbc,
- 0x18, 0xe3, 0x10, 0x3e, 0x08, 0xc2, 0xd3, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0xc4, 0x79, 0xe4, 0x3e, 0x0c, 0xc2, 0xd3, 0x3e, 0x58, 0x0c, 0x6a, 0xbe,
- 0x40, 0x08, 0x9c, 0x3d, 0x74, 0x2f, 0xce, 0xbe, 0x14, 0xe3, 0x90, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x64, 0x2d, 0xa7, 0xbe,
- 0x24, 0xe5, 0xb7, 0x3e, 0x5c, 0x0c, 0xea, 0x3e, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xb4, 0x77, 0xbd, 0xbe, 0xe8, 0xbd, 0x85, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0xe0, 0x9c, 0x48, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x30, 0x08, 0x9c, 0xbd,
- 0xe0, 0xbd, 0x05, 0xbd, 0x80, 0x52, 0xb2, 0xbc, 0x38, 0x08, 0x1c, 0xbe,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0xec, 0xbd, 0x85, 0x3e,
- 0x56, 0x2b, 0x00, 0xbf, 0x38, 0x08, 0x1c, 0xbe, 0x40, 0x08, 0x1c, 0x3e,
- 0xe0, 0x9c, 0x48, 0xbe, 0x30, 0xe7, 0x5e, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
- 0xf0, 0xbd, 0x85, 0x3d, 0x40, 0x08, 0x9c, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
- 0x18, 0xc4, 0xfa, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x90, 0x52, 0x32, 0x3e,
- 0x90, 0x52, 0xb2, 0x3d, 0xe0, 0x9c, 0xc8, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
- 0xf8, 0xbf, 0xac, 0xbe, 0xe0, 0xbd, 0x85, 0xbd, 0x40, 0x08, 0x9c, 0x3d,
- 0x00, 0xbe, 0x05, 0x3d, 0x30, 0xe7, 0x5e, 0xbe, 0x90, 0x31, 0xf5, 0x3d,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x24, 0xe5, 0xb7, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0xe8, 0xbd, 0x05, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
- 0xa8, 0x75, 0x96, 0xbe, 0xaf, 0xf6, 0x29, 0xbf, 0x30, 0xe7, 0x5e, 0x3e,
- 0x88, 0x52, 0x32, 0xbe, 0x80, 0x52, 0xb2, 0xbc, 0x80, 0x52, 0x32, 0xbd,
- 0xa0, 0x52, 0x32, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x20, 0xe5, 0xb7, 0xbe, 0x90, 0x52, 0xb2, 0xbd, 0xb8, 0x77, 0xbd, 0x3e,
- 0x38, 0x08, 0x1c, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x54, 0x2b, 0x80, 0xbe,
- 0xe8, 0xbd, 0x85, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x31, 0xf5, 0x3d,
- 0x00, 0xbe, 0x05, 0x3d, 0x18, 0xc4, 0xfa, 0xbe, 0xe0, 0x9c, 0xc8, 0x3d,
- 0x38, 0x08, 0x1c, 0xbe, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0xb2, 0xbc,
- 0xc4, 0x79, 0xe4, 0x3e, 0x4c, 0x0a, 0xc3, 0xbe, 0x18, 0xc4, 0xfa, 0xbe,
- 0x10, 0xe3, 0x10, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0xf0, 0xbd, 0x05, 0x3e,
- 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x52, 0x32, 0xbc,
- 0x08, 0xc2, 0x53, 0x3e, 0x80, 0x52, 0xb2, 0xbc, 0xe8, 0xbd, 0x85, 0xbe,
- 0xd0, 0x9a, 0xa1, 0x3e, 0x5c, 0x0c, 0xea, 0x3e, 0x22, 0xe5, 0x37, 0xbf,
- 0x8c, 0x52, 0xb2, 0xbe, 0x80, 0x50, 0x8b, 0x3e, 0xe0, 0x9c, 0x48, 0xbe,
- 0xe0, 0xbd, 0x05, 0xbd, 0xe8, 0xbd, 0x05, 0xbe, 0x58, 0x2b, 0x80, 0x3e,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0xbe,
- 0x60, 0x2d, 0x27, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0xe0, 0x9c, 0x48, 0x3e,
- 0x54, 0x2b, 0x80, 0xbe, 0x20, 0xe7, 0x5e, 0xbd, 0xae, 0xf6, 0x29, 0x3f,
- 0xa8, 0x75, 0x96, 0x3e, 0xb8, 0x77, 0x3d, 0xbe, 0xf8, 0xbf, 0xac, 0xbe,
- 0x80, 0x52, 0x32, 0x3c, 0x20, 0xe7, 0x5e, 0xbd, 0xb8, 0x77, 0x3d, 0xbe,
- 0x3c, 0x08, 0x9c, 0x3e, 0xb8, 0x77, 0xbd, 0x3e, 0x20, 0xe5, 0xb7, 0xbe,
- 0xc4, 0x79, 0xe4, 0x3e, 0x20, 0xe7, 0x5e, 0xbd, 0x86, 0xd1, 0x1e, 0x3f,
- 0x08, 0xc2, 0x53, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x1a, 0x64, 0x24, 0x3f,
- 0x9c, 0x54, 0xd9, 0xbe, 0x18, 0xe3, 0x10, 0x3e, 0x1c, 0xc4, 0xfa, 0x3e,
- 0x76, 0x2f, 0x4e, 0x3f, 0xe0, 0xbd, 0x85, 0xbd, 0x08, 0xc2, 0x53, 0x3e,
- 0x10, 0xe3, 0x10, 0xbe, 0xa0, 0xf4, 0x02, 0xbf, 0x90, 0x52, 0xb2, 0x3d,
- 0xa0, 0x52, 0x32, 0x3d, 0x8d, 0x52, 0x32, 0xbf, 0x80, 0x31, 0x75, 0xbe,
- 0x90, 0x31, 0xf5, 0x3d, 0x60, 0x2d, 0x27, 0xbe, 0xf0, 0xbd, 0x05, 0x3e,
- 0x90, 0x52, 0x32, 0x3e, 0x90, 0x52, 0xb2, 0x3d, 0xcd, 0xfa, 0x77, 0xbf,
- 0x00, 0xbe, 0x05, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x18, 0xc4, 0xfa, 0xbe,
- 0x80, 0x52, 0x32, 0xbd, 0xb8, 0x77, 0x3d, 0x3e, 0xca, 0x19, 0x0e, 0x3f,
- 0x30, 0xe7, 0xde, 0x3d, 0x30, 0xe7, 0xde, 0x3d, 0x8d, 0x52, 0x32, 0xbf,
- 0x30, 0xe7, 0x5e, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x14, 0xe3, 0x90, 0x3e,
- 0xd0, 0x9a, 0x21, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x60, 0x2d, 0x27, 0xbe,
- 0xea, 0xbd, 0x05, 0x3f, 0x08, 0xc2, 0xd3, 0xbe, 0x40, 0xe7, 0x5e, 0x3d,
- 0x80, 0x31, 0xf5, 0xbd, 0x90, 0x52, 0xb2, 0x3d, 0x20, 0xe5, 0xb7, 0xbe,
- 0x68, 0x2d, 0x27, 0x3e, 0x40, 0x08, 0x9c, 0x3d, 0xb8, 0x77, 0x3d, 0x3e,
- 0x56, 0x2b, 0x00, 0x3f, 0xa8, 0x75, 0x96, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0x14, 0xe3, 0x90, 0x3e, 0x80, 0x31, 0x75, 0xbe, 0x08, 0xc2, 0xd3, 0xbe,
- 0xea, 0xbd, 0x05, 0xbf, 0xfa, 0xbf, 0x2c, 0x3f, 0x80, 0x52, 0x32, 0xbd,
- 0xf0, 0xbd, 0x05, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x31, 0xf5, 0xbd,
- 0x6e, 0xae, 0x3a, 0x3f, 0xe0, 0x9c, 0xc8, 0xbd, 0x24, 0xe5, 0xb7, 0x3e,
- 0xf0, 0xbd, 0x85, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0x68, 0x2d, 0x27, 0x3e,
- 0xf0, 0xbd, 0x05, 0x3e, 0x30, 0xe7, 0xde, 0xbe, 0xf0, 0xbd, 0x85, 0x3d,
- 0x20, 0xe7, 0x5e, 0xbd, 0x9c, 0x54, 0xd9, 0x3e, 0x20, 0xe7, 0x5e, 0xbd,
- 0xfc, 0xbf, 0xac, 0x3e, 0x00, 0xbe, 0x05, 0x3d, 0x80, 0x52, 0x32, 0xbc,
- 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0x48, 0x3e, 0xf8, 0xbf, 0xac, 0xbe,
- 0x80, 0x52, 0x32, 0xbc, 0x40, 0x08, 0x9c, 0x3d, 0x08, 0xc2, 0x53, 0xbe,
- 0x08, 0xc2, 0x53, 0xbe, 0x9c, 0x54, 0xd9, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
- 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0xe0, 0x9c, 0xc8, 0x3d,
- 0xe0, 0x9c, 0x48, 0x3e, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0xbd, 0x85, 0xbd,
- 0xc0, 0x52, 0xb2, 0x3c, 0xe0, 0xbd, 0x05, 0xbd, 0xc0, 0x52, 0xb2, 0x3c,
- 0x38, 0x08, 0x1c, 0xbe, 0xc0, 0x52, 0xb2, 0x3c, 0x30, 0x08, 0x9c, 0xbd,
- 0x90, 0x31, 0xf5, 0x3d, 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0x20, 0xe7, 0x5e, 0xbd, 0x90, 0x31, 0xf5, 0x3d, 0x80, 0x31, 0xf5, 0xbd,
- 0xa0, 0x52, 0x32, 0x3d, 0x88, 0x52, 0x32, 0xbe, 0xe0, 0x9c, 0x48, 0xbe,
- 0xe0, 0x9c, 0xc8, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbd, 0x85, 0x3d,
- 0x68, 0x2d, 0x27, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0x08, 0x9c, 0xbd,
- 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0xfc, 0xbf, 0xac, 0x3e,
- 0x80, 0x52, 0x32, 0xbc, 0x20, 0xe7, 0x5e, 0xbd, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x00, 0xbe, 0x05, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x20, 0xe7, 0x5e, 0xbd,
- 0x80, 0x52, 0x32, 0x3c, 0x60, 0x2d, 0x27, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x20, 0xe7, 0x5e, 0xbd, 0x00, 0xbe, 0x05, 0x3d,
- 0xb8, 0x77, 0x3d, 0xbe, 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x52, 0x32, 0xbc,
- 0x80, 0x52, 0x32, 0xbd, 0xa0, 0x52, 0x32, 0x3d, 0x90, 0x31, 0xf5, 0x3d,
- 0xa0, 0x52, 0x32, 0x3d, 0x40, 0xe7, 0x5e, 0x3d, 0x30, 0xe7, 0xde, 0xbd,
- 0x80, 0x52, 0x32, 0xbd, 0xc0, 0x52, 0xb2, 0x3c, 0x20, 0xe7, 0x5e, 0xbd,
- 0x90, 0x31, 0xf5, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x30, 0x08, 0x9c, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x52, 0xb2, 0xbc, 0xf0, 0xbd, 0x85, 0x3d,
- 0x90, 0x52, 0xb2, 0xbd, 0xe0, 0x9c, 0xc8, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x30, 0xe7, 0x5e, 0xbe, 0xf0, 0xbd, 0x05, 0x3e, 0x40, 0x08, 0x9c, 0x3d,
- 0xe0, 0xbd, 0x05, 0xbd, 0x18, 0xe3, 0x10, 0x3e, 0xf0, 0xbd, 0x85, 0x3d,
- 0x40, 0x08, 0x9c, 0x3d, 0xf0, 0xbd, 0x05, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0xb8, 0x77, 0x3d, 0x3e, 0xe0, 0xbd, 0x85, 0xbd, 0xe0, 0xbd, 0x05, 0xbd,
- 0xe8, 0xbd, 0x05, 0xbe, 0x90, 0x31, 0xf5, 0x3d, 0x40, 0xe7, 0x5e, 0x3d,
- 0x80, 0x52, 0x32, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x90, 0x52, 0xb2, 0x3d,
- 0x90, 0x31, 0xf5, 0x3d, 0x40, 0x08, 0x1c, 0x3e, 0x80, 0x52, 0x32, 0xbd,
- 0x10, 0xe3, 0x10, 0xbe, 0x80, 0x52, 0x32, 0xbc, 0x90, 0x31, 0xf5, 0x3d,
- 0x40, 0x08, 0x9c, 0x3d, 0x60, 0x0c, 0x6a, 0x3e, 0xe0, 0xbd, 0x85, 0xbd,
- 0x40, 0x08, 0x9c, 0x3d, 0x80, 0x52, 0x32, 0xbc, 0x18, 0xe3, 0x10, 0x3e,
- 0xe0, 0xbd, 0x85, 0xbd, 0x30, 0x08, 0x9c, 0xbd, 0x3c, 0x08, 0x9c, 0x3e,
- 0xe0, 0x9c, 0xc8, 0x3d, 0xe0, 0x9c, 0xc8, 0xbd, 0x18, 0xe3, 0x10, 0x3e,
- 0x68, 0x2d, 0x27, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x52, 0x32, 0x3c, 0x80, 0x52, 0x32, 0xbc, 0x80, 0x52, 0xb2, 0xbc,
- 0x40, 0xe7, 0x5e, 0x3d, 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
- 0xa0, 0x52, 0x32, 0x3d, 0x80, 0x31, 0xf5, 0xbd, 0x20, 0xe7, 0x5e, 0xbd,
- 0xe8, 0xbd, 0x05, 0xbe, 0xe0, 0x9c, 0xc8, 0xbd, 0x30, 0xe7, 0xde, 0x3d,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x52, 0x32, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0xf0, 0xbd, 0x85, 0x3d, 0xe0, 0x9c, 0x48, 0xbe,
- 0x60, 0x0c, 0x6a, 0x3e, 0xe8, 0xbd, 0x05, 0xbe, 0x80, 0x52, 0x32, 0xbd,
- 0x40, 0x08, 0x9c, 0x3d, 0x61, 0x8d, 0x7d, 0xbf, 0x58, 0x0c, 0x6a, 0xbe,
- 0xe8, 0xbd, 0x85, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x8c, 0x52, 0xb2, 0xbe,
- 0x30, 0xe7, 0x5e, 0x3e, 0x80, 0x50, 0x8b, 0x3e, 0x9c, 0x54, 0xd9, 0xbe,
- 0x80, 0x31, 0x75, 0xbe, 0x80, 0x52, 0x32, 0x3c, 0x58, 0x0c, 0x6a, 0xbe,
- 0x8d, 0x52, 0x32, 0xbf, 0xb6, 0x77, 0x3d, 0xbf, 0x1c, 0xc4, 0xfa, 0x3e,
- 0x80, 0x52, 0x32, 0xbc, 0x40, 0x08, 0x9c, 0x3d, 0x18, 0xe3, 0x10, 0x3e,
- 0xa8, 0x75, 0x96, 0xbe, 0x68, 0x2d, 0x27, 0x3e, 0x80, 0x52, 0x32, 0xbc,
- 0x5e, 0xac, 0x13, 0xbf, 0x5c, 0x0c, 0xea, 0x3e, 0x80, 0x52, 0x32, 0x3c,
- 0xec, 0x9e, 0xef, 0xbe, 0x20, 0xe5, 0xb7, 0xbe, 0x30, 0xe7, 0xde, 0xbd,
- 0x74, 0x2f, 0xce, 0xbe, 0xd0, 0x9a, 0x21, 0xbf, 0x20, 0xe5, 0xb7, 0xbe,
- 0x1a, 0x64, 0x24, 0xbf, 0x65, 0x2d, 0x27, 0xbf, 0xd0, 0x9a, 0x21, 0xbf,
- 0x18, 0xe3, 0x10, 0x3e, 0x80, 0x52, 0x32, 0xbc, 0x08, 0xc2, 0x53, 0xbe,
- 0xe0, 0xbd, 0x85, 0xbd, 0x7c, 0x50, 0x8b, 0xbe, 0x3c, 0x08, 0x9c, 0xbe,
- 0x88, 0x31, 0x75, 0x3e, 0x7c, 0x50, 0x8b, 0xbe, 0x20, 0xe7, 0x5e, 0xbd,
- 0xa8, 0x75, 0x96, 0x3e, 0x38, 0x08, 0x1c, 0xbe, 0x90, 0x52, 0xb2, 0xbd,
- 0x90, 0x52, 0xb2, 0x3e, 0x14, 0xe3, 0x90, 0xbe, 0x90, 0x52, 0xb2, 0x3d,
- 0x80, 0x52, 0x32, 0xbd, 0xf0, 0xbd, 0x85, 0x3d, 0x90, 0x52, 0xb2, 0x3d,
- 0x80, 0x52, 0x32, 0x3c, 0xe8, 0xbd, 0x05, 0xbe, 0x68, 0x2d, 0x27, 0x3e,
- 0x58, 0x0c, 0x6a, 0xbe, 0x30, 0xe7, 0xde, 0x3d, 0x40, 0x08, 0x1c, 0x3e,
- 0xec, 0x9e, 0xef, 0xbe, 0x40, 0xe7, 0x5e, 0x3d, 0x88, 0x52, 0x32, 0xbe,
- 0xa2, 0xf4, 0x02, 0x3f, 0x58, 0x2b, 0x80, 0x3e, 0x90, 0x52, 0xb2, 0x3d,
- 0x90, 0x52, 0x32, 0x3e, 0x80, 0x52, 0x32, 0x3c, 0x8c, 0x52, 0xb2, 0xbe,
- 0xe0, 0x9c, 0x48, 0xbe, 0x4c, 0x0a, 0xc3, 0x3e, 0xe0, 0x9c, 0xc8, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x74, 0x2f, 0xce, 0x3e, 0x00, 0xbe, 0x05, 0x3d,
- 0x90, 0x31, 0xf5, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x31, 0xf5, 0xbd,
- 0x40, 0xe7, 0x5e, 0x3d, 0x90, 0x52, 0xb2, 0x3d, 0xf0, 0xbd, 0x05, 0x3e,
- 0xf0, 0xbd, 0x85, 0x3d, 0x30, 0x08, 0x9c, 0xbd, 0x7c, 0x50, 0x8b, 0xbe,
- 0xe0, 0x9c, 0xc8, 0x3d, 0x30, 0xe7, 0xde, 0xbd, 0xe0, 0x9c, 0x48, 0x3e,
- 0xa0, 0x52, 0x32, 0x3d, 0x7c, 0x50, 0x8b, 0xbe, 0xea, 0xbd, 0x05, 0xbf,
- 0x14, 0xe3, 0x90, 0xbe, 0x54, 0x2b, 0x80, 0xbe, 0x40, 0x08, 0x9c, 0x3d,
- 0x10, 0xe3, 0x10, 0xbe, 0x60, 0x2d, 0x27, 0xbe, 0x30, 0xe7, 0x5e, 0xbe,
- 0xd0, 0x9a, 0xa1, 0xbe, 0x84, 0x31, 0xf5, 0xbe, 0xaf, 0xf6, 0x29, 0xbf,
- 0xb8, 0x77, 0x3d, 0xbe, 0x90, 0x52, 0xb2, 0x3d, 0x30, 0xe7, 0xde, 0x3d,
- 0xc0, 0x52, 0xb2, 0x3c, 0x38, 0x08, 0x1c, 0xbe, 0x80, 0x52, 0xb2, 0xbc,
- 0xf0, 0xbd, 0x85, 0x3d, 0xa0, 0x52, 0x32, 0x3d, 0xa8, 0x75, 0x16, 0xbf,
- 0x20, 0xe7, 0x5e, 0xbd, 0xa8, 0x75, 0x16, 0xbf, 0xe0, 0x9c, 0xc8, 0xbd,
- 0xf0, 0xbd, 0x85, 0x3d, 0x80, 0x52, 0xb2, 0xbc, 0x14, 0xe3, 0x90, 0xbe,
-}};
-const int32_t dnn_hiddenlayer_2_bias__4__cf__4_shape[1] = {59};
-const union {
- uint8_t bytes[236];
- float values[59];
-} dnn_hiddenlayer_2_bias__4__cf__4 = {{
- 0x57, 0x61, 0xf1, 0x3f, 0x30, 0x26, 0x90, 0x3f, 0xe7, 0xc6, 0xe5, 0xbc,
- 0x26, 0x25, 0xc0, 0xbd, 0x28, 0xeb, 0x96, 0xbe, 0x03, 0x9f, 0xa7, 0xbf,
- 0x54, 0x6c, 0xec, 0x3f, 0xfa, 0x8e, 0x1c, 0x3f, 0x35, 0x7d, 0x0a, 0x40,
- 0xeb, 0x5a, 0x3d, 0xbf, 0xa0, 0xcb, 0x28, 0x3f, 0xee, 0x93, 0xc9, 0x3f,
- 0x1f, 0x68, 0x23, 0xbf, 0xbf, 0x97, 0x8c, 0x3f, 0xc3, 0x2c, 0xe4, 0xbf,
- 0xf3, 0xc7, 0xd8, 0x3e, 0x69, 0x6d, 0xd5, 0x3e, 0x49, 0x5f, 0x19, 0x40,
- 0x9c, 0x2f, 0xfb, 0x3d, 0x38, 0x3e, 0x08, 0xbf, 0x58, 0x26, 0x06, 0x40,
- 0xf3, 0x59, 0x80, 0xbf, 0xc7, 0x4c, 0x0b, 0xc0, 0xc3, 0x12, 0x20, 0x3f,
- 0x2a, 0xd6, 0x08, 0xbf, 0x80, 0xe3, 0x9b, 0x3e, 0x4a, 0xc1, 0x0d, 0x40,
- 0xe1, 0x1d, 0x9f, 0xbf, 0xdb, 0x27, 0xfa, 0xbd, 0xa0, 0xde, 0xa5, 0xbf,
- 0xd1, 0x4a, 0x01, 0x3f, 0xb2, 0x0d, 0x2e, 0xbf, 0xe5, 0x3b, 0x8c, 0x3f,
- 0x64, 0xe9, 0x53, 0x3f, 0xf5, 0xb7, 0xc4, 0x3e, 0x5e, 0x26, 0x97, 0xbf,
- 0x66, 0x90, 0x65, 0x3f, 0x58, 0x16, 0x20, 0x40, 0xe3, 0x7e, 0xe9, 0xbf,
- 0x84, 0x87, 0x32, 0x3f, 0x3d, 0xd8, 0x34, 0xbf, 0xa9, 0xe2, 0xf3, 0xbe,
- 0xe2, 0x54, 0xa8, 0xbe, 0xe1, 0x85, 0x19, 0x3f, 0xbb, 0x54, 0xd0, 0x3f,
- 0xe0, 0x88, 0x16, 0xbf, 0xcd, 0x35, 0xcc, 0x3f, 0xff, 0x1b, 0x03, 0xbf,
- 0x92, 0x93, 0xf6, 0xbe, 0xcb, 0x9a, 0x2d, 0x3f, 0x52, 0xb0, 0xd9, 0xbe,
- 0xd1, 0x0b, 0x48, 0xbf, 0x78, 0x2c, 0xe9, 0x3e, 0xad, 0x46, 0x0a, 0xbf,
- 0x80, 0x2d, 0x84, 0x3f, 0xa8, 0x55, 0x48, 0x3f, 0x1f, 0x69, 0x18, 0xbe,
- 0x48, 0xc0, 0xd1, 0xbf, 0xa3, 0x20, 0xe8, 0xbf,
-}};
-const int32_t dnn_hiddenlayer_2_kernel__5__cf__5_shape[2] = {115, 59};
-const union {
- uint8_t bytes[27140];
- float values[6785];
-} dnn_hiddenlayer_2_kernel__5__cf__5 = {{
- 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x8c, 0x1d, 0xbe,
- 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x10, 0xd2, 0xbd, 0x58, 0x4f, 0x49, 0xbe,
- 0x54, 0xcb, 0x94, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x54, 0x0d, 0xaf, 0xbe,
- 0x00, 0xce, 0x37, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0x00, 0xce, 0x37, 0x3e,
- 0x80, 0x0a, 0x0c, 0x3c, 0xc0, 0x0a, 0x8c, 0xbc, 0xb0, 0x0a, 0x8c, 0xbd,
- 0xa8, 0x12, 0x75, 0x3e, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x8c, 0x9d, 0xbe,
- 0xc0, 0x0a, 0x8c, 0x3c, 0x56, 0xaa, 0x87, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
- 0x58, 0xd3, 0x7d, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0xcb, 0x14, 0x3e,
- 0xa8, 0x0a, 0x0c, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d, 0xa0, 0x12, 0x75, 0x3d,
- 0x00, 0x10, 0xd2, 0xbc, 0x80, 0x0a, 0x0c, 0x3c, 0xa0, 0x12, 0x75, 0xbd,
- 0x56, 0xaa, 0x87, 0xbe, 0x2a, 0x9b, 0x12, 0xbf, 0xa8, 0x4c, 0x26, 0xbe,
- 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
- 0xa0, 0x12, 0xf5, 0x3d, 0x50, 0x91, 0x63, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
- 0x58, 0x91, 0x63, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0xc0, 0x0a, 0x8c, 0xbc,
- 0x00, 0x10, 0xd2, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d, 0x55, 0x2e, 0x3c, 0xbf,
- 0xa8, 0x2b, 0x99, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x10, 0xd2, 0x3c,
- 0x00, 0x4a, 0x03, 0xbe, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0x2b, 0x99, 0x3e,
- 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x54, 0x2e, 0xbc, 0xbe,
- 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0x3d,
- 0xa0, 0x12, 0x75, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x10, 0xd2, 0x3d,
- 0xc0, 0x0a, 0x8c, 0xbc, 0xa8, 0x4c, 0xa6, 0x3e, 0x50, 0x4f, 0x49, 0x3e,
- 0x58, 0xcb, 0x14, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0xce, 0xb7, 0xbe,
- 0x00, 0xce, 0x37, 0x3e, 0x54, 0xec, 0xa1, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x12, 0x75, 0x3e,
- 0xd5, 0x19, 0x01, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d, 0xa8, 0x12, 0x75, 0xbe,
- 0x54, 0x70, 0xd6, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xa8, 0x8e, 0x40, 0x3e,
- 0x00, 0x8c, 0x1d, 0x3f, 0x00, 0x10, 0xd2, 0x3d, 0x2a, 0x9b, 0x12, 0xbf,
- 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0xd2, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd,
- 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x10, 0xd2, 0x3c, 0x54, 0x4f, 0xc9, 0x3e,
- 0xa8, 0x4c, 0x26, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0x4f, 0x49, 0x3e,
- 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x10, 0xd2, 0xbd, 0xa0, 0x12, 0xf5, 0x3d,
- 0x60, 0x0d, 0x2f, 0x3d, 0x50, 0x0d, 0xaf, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe,
- 0x00, 0xce, 0x37, 0x3e, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x10, 0x52, 0x3e,
- 0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0xd2, 0xbc, 0x54, 0x0d, 0xaf, 0xbe,
- 0xa8, 0x6d, 0xb3, 0x3e, 0x54, 0xaa, 0x07, 0x3f, 0x00, 0xce, 0x37, 0x3e,
- 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0xd0, 0xda, 0x3e, 0x2a, 0x7a, 0x05, 0x3f,
- 0xa8, 0x0a, 0x8c, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
- 0x2a, 0x7a, 0x05, 0x3f, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x31, 0xdf, 0xbe,
- 0x00, 0x10, 0x52, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x50, 0x0d, 0xaf, 0xbd,
- 0xd5, 0x7c, 0x28, 0xbf, 0xa8, 0x12, 0x75, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe,
- 0xa8, 0x0a, 0x0c, 0xbe, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xb0, 0x0a, 0x8c, 0x3d, 0xa0, 0x12, 0x75, 0xbd, 0x50, 0xcb, 0x14, 0x3e,
- 0xa8, 0x12, 0x75, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x58, 0x91, 0x63, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
- 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0x50, 0xcb, 0x14, 0x3e,
- 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
- 0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x6b, 0x90, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
- 0x00, 0x10, 0x52, 0x3e, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x10, 0x52, 0xbd,
- 0x00, 0x10, 0xd2, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0xad, 0xaa, 0xbe,
- 0x00, 0x8c, 0x1d, 0xbe, 0x50, 0xd3, 0x7d, 0x3e, 0xff, 0x72, 0x79, 0xbf,
- 0x50, 0xd3, 0x7d, 0x3e, 0x50, 0x91, 0x63, 0x3e, 0x50, 0x91, 0x63, 0x3e,
- 0xa8, 0x4c, 0x26, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0xce, 0x37, 0xbe,
- 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xad, 0xaa, 0xbe, 0x54, 0x70, 0xd6, 0xbe,
- 0x00, 0x8c, 0x1d, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x80, 0x0a, 0x0c, 0x3c,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0a, 0x8c, 0x3c,
- 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0xef, 0xc4, 0x3e, 0x50, 0x4f, 0x49, 0x3e,
- 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0x4f, 0x49, 0x3f,
- 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0x28, 0x82, 0x6e, 0x3f,
- 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x8c, 0x9d, 0xbd, 0x2a, 0x9b, 0x12, 0xbf,
- 0x00, 0x4a, 0x83, 0xbe, 0x54, 0x4f, 0xc9, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e,
- 0x00, 0x4a, 0x03, 0x3f, 0x00, 0x10, 0xd2, 0x3d, 0x00, 0xad, 0xaa, 0xbe,
- 0x54, 0xec, 0xa1, 0x3e, 0x00, 0x4a, 0x83, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
- 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaf, 0xcd, 0xbe,
- 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0x54, 0xec, 0xa1, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x4a, 0x83, 0xbe, 0x54, 0x91, 0xe3, 0x3e, 0x50, 0x0d, 0xaf, 0xbd,
- 0x50, 0xd3, 0x7d, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
- 0xa0, 0x12, 0xf5, 0x3d, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x8c, 0x9d, 0x3e,
- 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0xce, 0x37, 0xbe,
- 0x00, 0xce, 0x37, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x6d, 0xb3, 0x3e,
- 0x54, 0x70, 0xd6, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0x58, 0xd3, 0x7d, 0xbe,
- 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x10, 0x52, 0x3d, 0x00, 0xef, 0xc4, 0x3e,
- 0x60, 0x0d, 0x2f, 0x3d, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x4a, 0x03, 0x3e,
- 0x2a, 0xbc, 0x1f, 0x3f, 0xa8, 0x4c, 0x26, 0x3e, 0x54, 0xaa, 0x87, 0x3e,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x91, 0xe3, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d,
- 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0xb2, 0xf0, 0x3e,
- 0x00, 0xad, 0xaa, 0x3e, 0x00, 0xce, 0xb7, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xa8, 0xaf, 0xcd, 0x3e,
- 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x12, 0x75, 0xbd,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x4f, 0x49, 0x3e, 0x58, 0x91, 0x63, 0xbe,
- 0x00, 0x10, 0x52, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
- 0xa8, 0x8e, 0x40, 0xbe, 0x50, 0xd3, 0x7d, 0x3e, 0xaa, 0x6d, 0xb3, 0xbe,
- 0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x54, 0xd3, 0xfd, 0x3e,
- 0x50, 0x91, 0xe3, 0x3d, 0x54, 0x0d, 0xaf, 0x3e, 0x00, 0xef, 0xc4, 0x3e,
- 0x54, 0xaa, 0x87, 0x3e, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0xad, 0xaa, 0xbe,
- 0xaa, 0xf1, 0xe7, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
- 0xb0, 0x8e, 0xc0, 0x3d, 0xa8, 0x4c, 0x26, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
- 0x58, 0x91, 0x63, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe,
- 0xaa, 0xd0, 0x5a, 0xbf, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0xce, 0x37, 0xbe,
- 0xa8, 0x0a, 0x0c, 0x3e, 0xaa, 0x12, 0xf5, 0xbe, 0x54, 0x0d, 0xaf, 0x3e,
- 0x00, 0x10, 0xd2, 0x3c, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x4a, 0x03, 0x3e,
- 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x6b, 0x90, 0x3e, 0xd5, 0x3a, 0x0e, 0xbf,
- 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0x6d, 0xb3, 0x3e, 0x50, 0x0d, 0xaf, 0x3d,
- 0xaa, 0x2b, 0x99, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x58, 0x0d, 0x2f, 0xbe,
- 0xb0, 0x8e, 0xc0, 0x3d, 0x54, 0xcb, 0x94, 0xbe, 0xaa, 0x0a, 0x0c, 0xbf,
- 0xb0, 0x8e, 0xc0, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
- 0x55, 0xaa, 0x07, 0xbf, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x00, 0x00, 0x00,
- 0xb0, 0x8e, 0xc0, 0xbd, 0xaa, 0x12, 0xf5, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
- 0xa8, 0x12, 0x75, 0x3e, 0x54, 0x0d, 0xaf, 0xbe, 0xa8, 0x6d, 0xb3, 0x3e,
- 0xa8, 0x12, 0x75, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x8c, 0x1d, 0xbe,
- 0xa8, 0x8e, 0x40, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0x80, 0x0a, 0x0c, 0xbc,
- 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x50, 0x0d, 0xaf, 0xbd,
- 0x54, 0xb2, 0xf0, 0xbe, 0x50, 0x91, 0x63, 0x3e, 0x58, 0x91, 0x63, 0xbe,
- 0xff, 0x30, 0x5f, 0xbf, 0x00, 0x6b, 0x90, 0x3e, 0xa8, 0x12, 0x75, 0x3e,
- 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x10, 0xd2, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
- 0x00, 0x10, 0xd2, 0xbc, 0x56, 0xaa, 0x87, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0xf1, 0xe7, 0xbe, 0x54, 0x70, 0xd6, 0xbe,
- 0x50, 0x91, 0x63, 0x3e, 0xaa, 0x6d, 0x33, 0xbf, 0x80, 0x0a, 0x0c, 0xbc,
- 0xaa, 0x0a, 0x0c, 0xbf, 0x54, 0xec, 0xa1, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe,
- 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
- 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x73, 0xf9, 0xbe,
- 0x00, 0x10, 0xd2, 0x3d, 0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe,
- 0xa0, 0x12, 0x75, 0xbd, 0x80, 0x0a, 0x0c, 0x3c, 0x58, 0x0d, 0x2f, 0xbe,
- 0xaa, 0x12, 0xf5, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0xa8, 0x12, 0x75, 0xbe,
- 0x54, 0xd3, 0xfd, 0xbe, 0x54, 0x2e, 0xbc, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
- 0x50, 0x91, 0xe3, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0xaa, 0x0a, 0x8c, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x10, 0xd2, 0xbd,
- 0xa8, 0x4c, 0x26, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
- 0x50, 0x0d, 0xaf, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0x0d, 0xaf, 0x3e,
- 0xa8, 0x12, 0x75, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
- 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0x52, 0x3f, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x50, 0x0d, 0xaf, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
- 0x56, 0xaa, 0x87, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
- 0xaa, 0x4c, 0x26, 0x3f, 0x55, 0x0d, 0x2f, 0xbf, 0x50, 0x0d, 0xaf, 0xbd,
- 0xa8, 0x6d, 0xb3, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x31, 0xdf, 0xbe,
- 0x00, 0x10, 0x52, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
- 0x50, 0x91, 0xe3, 0xbd, 0x54, 0x2e, 0xbc, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0xa8, 0x8e, 0x40, 0x3e, 0xa0, 0x12, 0x75, 0x3d, 0x80, 0x0a, 0x0c, 0x3c,
- 0xa8, 0x6d, 0xb3, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x6b, 0x90, 0x3e,
- 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x00, 0x10, 0xd2, 0x3c, 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
- 0xa8, 0x0a, 0x0c, 0x3e, 0x56, 0xaa, 0x87, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
- 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
- 0x54, 0x2e, 0xbc, 0x3e, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
- 0x00, 0xad, 0xaa, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0x80, 0x0a, 0x0c, 0xbc,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
- 0x50, 0xcb, 0x14, 0x3e, 0x54, 0xec, 0xa1, 0x3e, 0xaa, 0x4c, 0x26, 0xbf,
- 0xb0, 0x12, 0xf5, 0xbd, 0xaa, 0x8e, 0xc0, 0xbe, 0xaa, 0xaf, 0xcd, 0xbe,
- 0x00, 0x4a, 0x03, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x4c, 0xa6, 0x3e,
- 0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x10, 0x52, 0xbe,
- 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x4a, 0x03, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
- 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x6b, 0x10, 0xbf,
- 0x54, 0x0d, 0xaf, 0x3e, 0x00, 0x4a, 0x03, 0x3e, 0x54, 0x4f, 0xc9, 0xbe,
- 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0x52, 0x3e,
- 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
- 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x10, 0xd2, 0x3c, 0x58, 0xd3, 0x7d, 0xbe,
- 0xa8, 0x6d, 0xb3, 0x3e, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x10, 0xd2, 0xbc,
- 0xb0, 0x8e, 0xc0, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x31, 0xdf, 0x3e,
- 0x55, 0xaa, 0x07, 0xbf, 0x54, 0x4f, 0xc9, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
- 0x50, 0x0d, 0x2f, 0x3e, 0xd4, 0xbe, 0x42, 0xbf, 0xaa, 0x12, 0xf5, 0xbe,
- 0x00, 0xce, 0x37, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
- 0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x8e, 0xc0, 0x3d, 0xa0, 0x12, 0xf5, 0x3d,
- 0x00, 0x52, 0xec, 0xbe, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x6b, 0x90, 0xbe,
- 0xb0, 0x0a, 0x8c, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd, 0x56, 0xaa, 0x87, 0xbe,
- 0xaa, 0x0a, 0x0c, 0xbf, 0x80, 0x0a, 0x0c, 0x3c, 0x60, 0x0d, 0x2f, 0x3d,
- 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
- 0xaa, 0x2b, 0x99, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd, 0xa8, 0x12, 0x75, 0x3e,
- 0x00, 0x10, 0xd2, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x8c, 0x9d, 0x3d,
- 0x50, 0x4f, 0x49, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
- 0xa8, 0xd0, 0x5a, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0xa8, 0x4c, 0x26, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
- 0x54, 0x70, 0xd6, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0x52, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
- 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x10, 0xd2, 0x3c, 0xaa, 0xf1, 0xe7, 0xbe,
- 0x00, 0xce, 0x37, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x10, 0x52, 0xbe,
- 0x54, 0xcb, 0x94, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
- 0xa8, 0x0a, 0x8c, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x4a, 0x03, 0x3e,
- 0x50, 0x0d, 0xaf, 0xbd, 0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e,
- 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x52, 0xec, 0x3e, 0x00, 0x4a, 0x03, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xa0, 0x12, 0x75, 0xbd,
- 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
- 0x00, 0x52, 0x6c, 0xbe, 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0x52, 0x3d,
- 0xb0, 0x8e, 0xc0, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x52, 0xbd, 0x00, 0x4a, 0x03, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
- 0xb0, 0x8e, 0xc0, 0x3d, 0xa8, 0x4c, 0x26, 0xbe, 0x50, 0x0d, 0x2f, 0x3e,
- 0x58, 0xcb, 0x14, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x4c, 0x26, 0x3e,
- 0x00, 0x10, 0xd2, 0x3d, 0x58, 0x4f, 0x49, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe,
- 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0xad, 0xaa, 0x3e,
- 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
- 0x00, 0x10, 0x52, 0x3d, 0x58, 0xcb, 0x14, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
- 0x00, 0x10, 0x52, 0x3d, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0xce, 0x37, 0x3e,
- 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
- 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0xce, 0xb7, 0x3e, 0xa8, 0x8e, 0x40, 0xbe,
- 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe,
- 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
- 0x50, 0x0d, 0x2f, 0x3e, 0x54, 0x4f, 0xc9, 0xbe, 0x54, 0x91, 0xe3, 0xbe,
- 0x00, 0xce, 0x37, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x10, 0x52, 0xbd,
- 0x54, 0xaa, 0x87, 0x3e, 0x00, 0x4a, 0x03, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
- 0x80, 0xda, 0x09, 0x3f, 0xa8, 0x8e, 0x40, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
- 0x58, 0x91, 0x63, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0xa8, 0xaf, 0xcd, 0x3e,
- 0x50, 0x91, 0x63, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
- 0x00, 0xce, 0xb7, 0x3e, 0x00, 0x4a, 0x83, 0x3e, 0x00, 0x10, 0xd2, 0xbe,
- 0x00, 0x4a, 0x03, 0xbf, 0x55, 0x2e, 0x3c, 0xbf, 0xa8, 0xd0, 0x5a, 0xbe,
- 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x52, 0x6c, 0xbe,
- 0x00, 0x10, 0x52, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
- 0xff, 0x0f, 0x52, 0xbf, 0x58, 0x4f, 0x49, 0xbe, 0xaa, 0xaf, 0xcd, 0xbe,
- 0xaa, 0x8e, 0x40, 0xbf, 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x12, 0x75, 0xbe,
- 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x4a, 0x03, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
- 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
- 0x54, 0x0d, 0xaf, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x00, 0x4a, 0x83, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
- 0x80, 0x0a, 0x0c, 0x3c, 0xaa, 0xd0, 0xda, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0xad, 0xaa, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xa8, 0x4c, 0x26, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
- 0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
- 0xaa, 0x0a, 0x0c, 0xbf, 0xaa, 0xf1, 0xe7, 0xbe, 0xd5, 0x3a, 0x0e, 0xbf,
- 0x58, 0x4f, 0x49, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x7f, 0xfb, 0x16, 0xbf,
- 0xa0, 0x12, 0xf5, 0x3d, 0x55, 0xaa, 0x07, 0xbf, 0x60, 0x0d, 0x2f, 0xbd,
- 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x8c, 0x9d, 0x3d, 0xaa, 0x2b, 0x99, 0xbe,
- 0xaa, 0x8e, 0xc0, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x6b, 0x90, 0x3e,
- 0x00, 0x10, 0xd2, 0x3c, 0x58, 0xd3, 0x7d, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0xa0, 0x12, 0x75, 0x3d, 0x60, 0x0d, 0x2f, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
- 0xa8, 0xd0, 0x5a, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0xa0, 0x12, 0xf5, 0x3d,
- 0xa8, 0x0a, 0x0c, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x54, 0x70, 0xd6, 0xbe,
- 0x00, 0x4a, 0x03, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
- 0x00, 0x10, 0x52, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x91, 0xe3, 0xbd,
- 0x50, 0x0d, 0x2f, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x0a, 0x0c, 0xbe,
- 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d,
- 0xa8, 0x0a, 0x0c, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
- 0x00, 0x8c, 0x9d, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x8e, 0x40, 0xbe,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
- 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
- 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x8c, 0x1d, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
- 0xff, 0x30, 0x5f, 0xbf, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x10, 0xd2, 0xbe,
- 0x00, 0x8c, 0x9d, 0x3d, 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
- 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0x54, 0x0d, 0xaf, 0xbe,
- 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x52, 0xec, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
- 0x50, 0x4f, 0x49, 0x3e, 0x00, 0xce, 0x37, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c,
- 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x8c, 0x9d, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d,
- 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x4a, 0x03, 0xbf, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x54, 0xec, 0xa1, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e,
- 0x00, 0x6b, 0x10, 0xbf, 0x50, 0xcb, 0x14, 0x3e, 0x50, 0x0d, 0xaf, 0xbd,
- 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x73, 0xf9, 0xbe,
- 0xb0, 0x8e, 0xc0, 0xbd, 0xa8, 0x12, 0x75, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
- 0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x58, 0x91, 0x63, 0xbe,
- 0xaa, 0xd0, 0xda, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0xb0, 0x0a, 0x8c, 0x3d,
- 0xff, 0x8b, 0x1d, 0xbf, 0x54, 0xcb, 0x94, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
- 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0x8e, 0x40, 0x3e,
- 0x58, 0x0d, 0x2f, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
- 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0xbd,
- 0xaa, 0xaf, 0xcd, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
- 0xa0, 0x12, 0xf5, 0x3d, 0xa0, 0x0a, 0x0c, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
- 0x00, 0x10, 0xd2, 0x3c, 0x54, 0x91, 0xe3, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x50, 0x0d, 0x2f, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0xaa, 0x2b, 0x99, 0xbe,
- 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x00, 0xce, 0xb7, 0xbe,
- 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0xa0, 0x12, 0x75, 0x3d,
- 0x00, 0x10, 0x52, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
- 0x00, 0x8c, 0x9d, 0x3d, 0xa0, 0x0a, 0x0c, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x00, 0x10, 0x52, 0x3d, 0x00, 0x8c, 0x1d, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d,
- 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6c, 0xbe,
- 0x00, 0xce, 0xb7, 0x3e, 0xa8, 0xf1, 0xe7, 0x3e, 0x60, 0x0d, 0x2f, 0xbd,
- 0xb0, 0x0a, 0x8c, 0x3d, 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x91, 0x63, 0x3e,
- 0xaa, 0x0a, 0x0c, 0x3f, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
- 0x00, 0x10, 0xd2, 0x3d, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x4a, 0x03, 0xbe,
- 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe,
- 0xa8, 0xd0, 0x5a, 0x3e, 0x54, 0x4f, 0xc9, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
- 0xa8, 0xd0, 0x5a, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0x12, 0xf5, 0x3e,
- 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x8e, 0x40, 0x3e,
- 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
- 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0x52, 0x3d, 0x54, 0xcb, 0x94, 0xbe,
- 0x00, 0x10, 0x52, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x10, 0x52, 0x3d,
- 0x60, 0x0d, 0x2f, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0x2a, 0xbc, 0x1f, 0x3f,
- 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0xd2, 0xbc, 0x50, 0x91, 0xe3, 0xbd,
- 0x00, 0x52, 0x6c, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e, 0x50, 0x0d, 0xaf, 0x3d,
- 0x54, 0x2e, 0xbc, 0x3e, 0x54, 0xec, 0xa1, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
- 0x54, 0xec, 0xa1, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x60, 0x0d, 0x2f, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0x55, 0xaa, 0x07, 0xbf,
- 0xaa, 0x0a, 0x8c, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x56, 0xaa, 0x87, 0xbe,
- 0x00, 0x10, 0xd2, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x4a, 0x83, 0xbe,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0xd0, 0x5a, 0xbe,
- 0xb0, 0x0a, 0x8c, 0x3d, 0xaa, 0x12, 0xf5, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
- 0xaa, 0x0a, 0x8c, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0xef, 0xc4, 0xbe,
- 0x58, 0x0d, 0x2f, 0xbe, 0x54, 0x70, 0xd6, 0xbe, 0x00, 0x73, 0xf9, 0xbe,
- 0x80, 0x0a, 0x0c, 0xbc, 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
- 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
- 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0x00, 0xce, 0x37, 0xbe,
- 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
- 0xaa, 0x2b, 0x19, 0xbf, 0x00, 0x10, 0xd2, 0xbc, 0x54, 0xec, 0xa1, 0xbe,
- 0x58, 0xcb, 0x14, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0x50, 0x4f, 0x49, 0x3e,
- 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0xd2, 0xbe,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x52, 0xec, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
- 0x54, 0x4f, 0xc9, 0xbe, 0xaa, 0xd0, 0xda, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
- 0x00, 0x8c, 0x9d, 0xbd, 0x50, 0x91, 0x63, 0x3e, 0xa8, 0x12, 0x75, 0xbe,
- 0xb0, 0x8e, 0xc0, 0x3d, 0x54, 0x0d, 0xaf, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
- 0xaa, 0x0a, 0x8c, 0xbe, 0x58, 0xd3, 0x7d, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe,
- 0xd5, 0x19, 0x01, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xdf, 0xbe,
- 0x00, 0x10, 0x52, 0x3d, 0xa8, 0xd0, 0xda, 0x3e, 0x00, 0x10, 0x52, 0xbd,
- 0x00, 0x8c, 0x9d, 0x3d, 0x54, 0x0d, 0xaf, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e,
- 0x00, 0x10, 0x52, 0x3d, 0xaa, 0x0a, 0x8c, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
- 0xa8, 0x8e, 0x40, 0x3e, 0x54, 0x0d, 0xaf, 0x3e, 0x54, 0xec, 0xa1, 0x3e,
- 0xaa, 0xaf, 0xcd, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0xd2, 0x3c,
- 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e,
- 0x00, 0xad, 0xaa, 0x3e, 0xff, 0x8b, 0x1d, 0xbf, 0x00, 0x4a, 0x03, 0x3e,
- 0x00, 0x4a, 0x03, 0xbf, 0x00, 0x10, 0xd2, 0xbc, 0x58, 0x91, 0x63, 0xbe,
- 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x4c, 0x26, 0x3e, 0x50, 0x0d, 0xaf, 0x3d,
- 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x52, 0xec, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
- 0xa8, 0x2b, 0x99, 0x3e, 0x58, 0xd3, 0x7d, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
- 0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
- 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xad, 0xaa, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
- 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0xd2, 0x3c, 0xaa, 0x4c, 0xa6, 0xbe,
- 0x54, 0x2e, 0xbc, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0x28, 0x1f, 0x47, 0x3f,
- 0x54, 0x91, 0xe3, 0x3e, 0x50, 0x91, 0xe3, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
- 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x73, 0xf9, 0x3e,
- 0x00, 0x52, 0x6c, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x10, 0x52, 0xbe,
- 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
- 0xaa, 0x12, 0xf5, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
- 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x0a, 0x8c, 0x3e,
- 0x50, 0x4f, 0x49, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
- 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0x52, 0xbd,
- 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x54, 0x70, 0xd6, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x58, 0x91, 0x63, 0xbe,
- 0xa8, 0x4c, 0x26, 0x3e, 0x2a, 0x61, 0x61, 0xbf, 0xaa, 0x8e, 0xc0, 0xbe,
- 0x50, 0x91, 0xe3, 0xbd, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0xce, 0x37, 0xbe,
- 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
- 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0xce, 0xb7, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
- 0xa8, 0x8e, 0x40, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd, 0x56, 0xaa, 0x87, 0xbe,
- 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x8c, 0x9d, 0x3e,
- 0x54, 0xd3, 0xfd, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0xbe,
- 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0xaa, 0x6d, 0xb3, 0xbe,
- 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
- 0x58, 0xcb, 0x14, 0xbe, 0x2a, 0xbc, 0x1f, 0xbf, 0x00, 0xce, 0x37, 0x3e,
- 0x00, 0x10, 0x52, 0xbe, 0xa8, 0x12, 0x75, 0x3e, 0xaa, 0x6d, 0xb3, 0xbe,
- 0xd5, 0x5b, 0x1b, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d, 0x60, 0x0d, 0x2f, 0x3d,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xd5, 0x19, 0x01, 0xbf,
- 0x54, 0xec, 0xa1, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
- 0x60, 0x0d, 0x2f, 0x3d, 0xb0, 0x12, 0xf5, 0xbd, 0x80, 0x0a, 0x0c, 0xbc,
- 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x54, 0x0d, 0xaf, 0xbe, 0xff, 0x0f, 0x52, 0xbf, 0x54, 0x4f, 0xc9, 0x3e,
- 0x54, 0xec, 0xa1, 0xbe, 0x50, 0xd3, 0x7d, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe,
- 0x54, 0xcb, 0x14, 0x3f, 0x00, 0x10, 0x52, 0xbd, 0xaa, 0x2b, 0x19, 0xbf,
- 0x58, 0x91, 0x63, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0xd5, 0x7c, 0x28, 0xbf,
- 0xaa, 0x0a, 0x0c, 0xbf, 0xb0, 0x0a, 0x8c, 0xbd, 0x2a, 0xa3, 0x7b, 0xbf,
- 0xaa, 0x0a, 0x8c, 0xbe, 0x7f, 0xc1, 0x65, 0xbf, 0xa8, 0x0a, 0x8c, 0x3e,
- 0x55, 0xec, 0x21, 0xbf, 0x60, 0x0d, 0x2f, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe,
- 0x00, 0x10, 0xd2, 0xbc, 0xaa, 0x0a, 0x8c, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
- 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x54, 0xd3, 0xfd, 0xbe,
- 0xa8, 0x8e, 0x40, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x31, 0xdf, 0xbe,
- 0x00, 0x31, 0xdf, 0xbe, 0x7f, 0xa0, 0x58, 0xbf, 0x50, 0x91, 0x63, 0x3e,
- 0x00, 0x31, 0xdf, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0xbe,
- 0x00, 0xce, 0x37, 0xbe, 0xa8, 0x12, 0x75, 0x3e, 0xa8, 0x0a, 0x8c, 0x3e,
- 0x00, 0x10, 0xd2, 0x3c, 0x00, 0xce, 0xb7, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
- 0x00, 0x10, 0xd2, 0x3d, 0xaa, 0x6d, 0xb3, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
- 0x00, 0xad, 0xaa, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0xaa, 0x0a, 0x8c, 0xbe,
- 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0xce, 0x37, 0xbe,
- 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x4a, 0x83, 0xbe, 0x55, 0xaa, 0x07, 0xbf,
- 0x58, 0x91, 0x63, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0x54, 0x70, 0xd6, 0xbe, 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0x50, 0x91, 0x63, 0x3e, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
- 0x00, 0xef, 0xc4, 0xbe, 0x54, 0x70, 0xd6, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
- 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0xd0, 0x5a, 0xbe, 0xb0, 0x12, 0xf5, 0xbd,
- 0x58, 0x91, 0x63, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0xad, 0xaa, 0xbe,
- 0xff, 0xac, 0x2a, 0xbf, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0xa8, 0xd0, 0x5a, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x73, 0xf9, 0xbe,
- 0x50, 0x91, 0xe3, 0x3d, 0xa8, 0x12, 0x75, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
- 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0xce, 0x37, 0xbe,
- 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
- 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc,
- 0xaa, 0xf1, 0xe7, 0xbe, 0x54, 0x91, 0xe3, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
- 0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x73, 0xf9, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
- 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x8c, 0x1d, 0xbe, 0x58, 0x91, 0x63, 0xbe,
- 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x12, 0x75, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
- 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0x3c,
- 0x00, 0x10, 0x52, 0x3e, 0x00, 0xad, 0xaa, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
- 0xc0, 0x0a, 0x8c, 0xbc, 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x6b, 0x90, 0x3e,
- 0xa8, 0x4c, 0x26, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x58, 0xd3, 0x7d, 0xbe,
- 0x00, 0xad, 0xaa, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x50, 0x91, 0xe3, 0x3d,
- 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0x50, 0x4f, 0x49, 0x3e,
- 0x00, 0x8c, 0x9d, 0xbe, 0x55, 0xaa, 0x07, 0xbf, 0xa8, 0x8e, 0x40, 0xbe,
- 0x00, 0x4a, 0x83, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0xa8, 0x8e, 0x40, 0x3e,
- 0x00, 0x10, 0x52, 0xbd, 0xaa, 0x0a, 0x0c, 0xbf, 0x54, 0x4f, 0xc9, 0xbe,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0x0d, 0x2f, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
- 0xa8, 0x4c, 0x26, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x54, 0x0d, 0xaf, 0xbe,
- 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x10, 0x52, 0xbe,
- 0x2a, 0x7a, 0x05, 0xbf, 0x54, 0x0d, 0xaf, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
- 0x00, 0xef, 0xc4, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x4c, 0x26, 0xbe,
- 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
- 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
- 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
- 0xaa, 0x8e, 0xc0, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
- 0x00, 0x8c, 0x1d, 0xbe, 0x54, 0xb2, 0xf0, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
- 0x56, 0xaa, 0x87, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
- 0x00, 0x10, 0x52, 0x3e, 0xa8, 0x0a, 0x8c, 0x3e, 0x7f, 0x1c, 0x24, 0xbf,
- 0xaa, 0xd0, 0xda, 0xbe, 0xd5, 0x3a, 0x0e, 0xbf, 0xb0, 0x0a, 0x8c, 0xbd,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x54, 0x4f, 0xc9, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc,
- 0x2a, 0x1f, 0x47, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d, 0xaa, 0x12, 0xf5, 0xbe,
- 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0xd5, 0x3a, 0x0e, 0xbf,
- 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x4a, 0x83, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
- 0xa8, 0xd0, 0xda, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x4c, 0xa6, 0x3e,
- 0x54, 0xcb, 0x94, 0x3e, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0xad, 0xaa, 0x3e,
- 0xaa, 0x12, 0xf5, 0xbe, 0xff, 0x8b, 0x1d, 0xbf, 0xaa, 0x4c, 0xa6, 0xbe,
- 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xa8, 0x6d, 0xb3, 0x3e,
- 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
- 0x00, 0x6b, 0x90, 0x3e, 0xaa, 0x6d, 0xb3, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
- 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x10, 0x52, 0xbe,
- 0x00, 0x10, 0xd2, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x10, 0xd2, 0xbe,
- 0x50, 0x91, 0x63, 0x3e, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x8c, 0x1d, 0x3e,
- 0xaa, 0x12, 0x75, 0xbf, 0x58, 0xd3, 0x7d, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
- 0x00, 0x10, 0xd2, 0x3c, 0x50, 0x91, 0x63, 0x3e, 0x54, 0x2e, 0xbc, 0xbe,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x10, 0xd2, 0x3e, 0x00, 0x4a, 0x83, 0xbe,
- 0xa8, 0x4c, 0x26, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x4a, 0x83, 0x3e,
- 0xa0, 0x12, 0x75, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x8c, 0x9d, 0x3d,
- 0xb0, 0x8e, 0xc0, 0x3d, 0xa0, 0x12, 0x75, 0x3d, 0xaa, 0xaf, 0xcd, 0xbe,
- 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x10, 0x52, 0xbd,
- 0x58, 0x0d, 0x2f, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x00, 0xce, 0x37, 0x3e,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x4a, 0x83, 0xbe, 0x00, 0xce, 0x37, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x52, 0x6c, 0x3e,
- 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x10, 0x52, 0xbd,
- 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0xce, 0xb7, 0xbe,
- 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x12, 0xf5, 0xbd,
- 0x00, 0x10, 0xd2, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x10, 0x52, 0x3e,
- 0x00, 0xad, 0xaa, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe, 0x54, 0xb2, 0xf0, 0xbe,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x4a, 0x03, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe,
- 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x4c, 0xa6, 0x3e,
- 0xc0, 0x0a, 0x8c, 0x3c, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x10, 0xd2, 0xbc,
- 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x31, 0xdf, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
- 0x00, 0x10, 0x52, 0xbe, 0x54, 0x91, 0xe3, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
- 0xa0, 0x12, 0x75, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x10, 0x52, 0xbd,
- 0x50, 0x0d, 0x2f, 0x3e, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0xaa, 0x87, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
- 0x00, 0xef, 0xc4, 0x3e, 0x58, 0x91, 0x63, 0xbe, 0x00, 0xce, 0x37, 0xbe,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x4a, 0x83, 0xbe, 0x58, 0x91, 0x63, 0xbe,
- 0xa8, 0x8e, 0xc0, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e, 0x60, 0x0d, 0x2f, 0xbd,
- 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x4a, 0x83, 0x3e, 0x54, 0x91, 0xe3, 0xbe,
- 0x54, 0x4f, 0xc9, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
- 0x00, 0x8c, 0x1d, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd,
- 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x10, 0xd2, 0x3c,
- 0xd5, 0x3a, 0x0e, 0xbf, 0x00, 0x10, 0xd2, 0x3d, 0xb0, 0x12, 0xf5, 0xbd,
- 0x58, 0x0d, 0x2f, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x56, 0xaa, 0x87, 0xbe,
- 0x00, 0x10, 0xd2, 0xbc, 0x50, 0x0d, 0x2f, 0x3e, 0x54, 0xd3, 0xfd, 0x3e,
- 0xa8, 0x2b, 0x99, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
- 0x56, 0xaa, 0x87, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
- 0xb0, 0x8e, 0xc0, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x8c, 0x1d, 0xbe,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0x0d, 0xaf, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
- 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x52, 0x6c, 0x3e,
- 0x50, 0x91, 0xe3, 0xbd, 0x54, 0x4f, 0xc9, 0x3e, 0x60, 0x0d, 0x2f, 0x3d,
- 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x00, 0x10, 0x52, 0x3d, 0x50, 0x4f, 0x49, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc,
- 0x50, 0x91, 0xe3, 0x3d, 0x58, 0xcb, 0x14, 0xbe, 0x7f, 0x1c, 0x24, 0xbf,
- 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x4a, 0x03, 0x3f, 0x58, 0xcb, 0x14, 0xbe,
- 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xa0, 0x12, 0xf5, 0x3d,
- 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
- 0xd5, 0x3a, 0x0e, 0xbf, 0xa0, 0x12, 0xf5, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x58, 0xcb, 0x14, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0xaa, 0x6d, 0xb3, 0xbe,
- 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x10, 0x52, 0xbe,
- 0x00, 0x52, 0xec, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
- 0x00, 0x10, 0x52, 0xbd, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0xce, 0xb7, 0xbe,
- 0xb0, 0x0a, 0x8c, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc, 0xaa, 0x2b, 0x19, 0xbf,
- 0x50, 0x0d, 0x2f, 0x3e, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x8c, 0x1d, 0xbe,
- 0xa8, 0x0a, 0x0c, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0x80, 0x0a, 0x0c, 0xbc,
- 0xaa, 0x6d, 0xb3, 0xbe, 0xa8, 0xaf, 0xcd, 0x3e, 0x50, 0x91, 0x63, 0x3e,
- 0x50, 0x0d, 0xaf, 0x3d, 0x50, 0xcb, 0x14, 0x3e, 0x50, 0x91, 0x63, 0x3e,
- 0x00, 0x10, 0x52, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0x3d,
- 0x00, 0x10, 0x52, 0xbd, 0xa8, 0x4c, 0x26, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
- 0x00, 0x6b, 0x90, 0xbe, 0x54, 0x2e, 0xbc, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
- 0x54, 0x2e, 0xbc, 0x3e, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x4a, 0x03, 0xbe,
- 0xa8, 0x0a, 0x8c, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x52, 0xec, 0x3e,
- 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x54, 0x91, 0xe3, 0x3e, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
- 0xb0, 0x8e, 0xc0, 0x3d, 0xb0, 0x0a, 0x8c, 0x3d, 0xb0, 0x0a, 0x8c, 0x3d,
- 0xa0, 0x12, 0x75, 0x3d, 0xb0, 0x12, 0xf5, 0xbd, 0xa8, 0x4c, 0x26, 0xbe,
- 0xa8, 0xd0, 0x5a, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0x0a, 0x0c, 0xbf,
- 0x50, 0x91, 0xe3, 0xbd, 0x54, 0xcb, 0x94, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
- 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0x52, 0xbe,
- 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0x52, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d,
- 0xb0, 0x8e, 0xc0, 0x3d, 0x58, 0xcb, 0x14, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
- 0xb0, 0x0a, 0x8c, 0x3d, 0xaa, 0xf1, 0xe7, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
- 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0x00, 0xce, 0xb7, 0x3e,
- 0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x54, 0xaa, 0x87, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd,
- 0xa0, 0x12, 0x75, 0xbd, 0x54, 0x70, 0xd6, 0x3e, 0x58, 0xcb, 0x14, 0xbe,
- 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x4a, 0x83, 0x3e,
- 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0xd2, 0xbc, 0xa0, 0x0a, 0x0c, 0x3d,
- 0x60, 0x0d, 0x2f, 0x3d, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0x3e,
- 0x50, 0x91, 0xe3, 0x3d, 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0x0d, 0x2f, 0xbe,
- 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe,
- 0xa0, 0x12, 0xf5, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
- 0x00, 0x52, 0x6c, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x2b, 0x99, 0xbe,
- 0x00, 0x10, 0x52, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x4a, 0x03, 0x3e,
- 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0xce, 0x37, 0x3e, 0xb0, 0x12, 0xf5, 0xbd,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x10, 0xd2, 0x3c, 0x54, 0x0d, 0xaf, 0xbe,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x54, 0x2e, 0xbc, 0x3e, 0x60, 0x0d, 0x2f, 0x3d,
- 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x10, 0x52, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d,
- 0x58, 0x0d, 0x2f, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0xef, 0xc4, 0x3e,
- 0xaa, 0x12, 0xf5, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0xaa, 0x87, 0x3e,
- 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x54, 0x2e, 0xbc, 0x3e,
- 0x80, 0x0a, 0x0c, 0xbc, 0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x8e, 0x40, 0x3e,
- 0x00, 0x10, 0x52, 0xbe, 0x00, 0x52, 0x6c, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e,
- 0xa0, 0x0a, 0x0c, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d,
- 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0xff, 0x51, 0x6c, 0xbf,
- 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x4a, 0x83, 0x3e,
- 0x54, 0xcb, 0x94, 0xbe, 0x56, 0xaa, 0x87, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
- 0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x6d, 0xb3, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
- 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
- 0x00, 0x6b, 0x90, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x6b, 0x90, 0xbe,
- 0xa8, 0x0a, 0x8c, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0x54, 0x0d, 0xaf, 0x3e,
- 0x54, 0x4f, 0xc9, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x58, 0x4f, 0x49, 0xbe,
- 0x00, 0x4a, 0x83, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
- 0xb0, 0x8e, 0xc0, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
- 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xce, 0xb7, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
- 0x00, 0x4a, 0x03, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d, 0xa0, 0x12, 0xf5, 0x3d,
- 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x52, 0x6c, 0x3e, 0xa8, 0x12, 0x75, 0xbe,
- 0x00, 0x8c, 0x1d, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
- 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x8e, 0x40, 0x3e, 0x50, 0x91, 0xe3, 0x3d,
- 0x00, 0x31, 0xdf, 0xbe, 0x00, 0x10, 0x52, 0xbe, 0x00, 0xce, 0x37, 0x3e,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x0d, 0x2f, 0x3e, 0x50, 0x91, 0x63, 0x3e,
- 0x54, 0x4f, 0xc9, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x91, 0xe3, 0xbd,
- 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x4c, 0x26, 0x3e,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0xaa, 0x6d, 0xb3, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xd2, 0x3d, 0x54, 0xec, 0xa1, 0xbe,
- 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe, 0x54, 0x91, 0xe3, 0xbe,
- 0x2a, 0xbc, 0x1f, 0xbf, 0xa0, 0x12, 0x75, 0x3d, 0x50, 0x91, 0xe3, 0x3d,
- 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x10, 0xd2, 0x3d,
- 0x00, 0x52, 0x6c, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0x00, 0x10, 0xd2, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x8c, 0x1d, 0x3e,
- 0x00, 0xce, 0xb7, 0x3e, 0x00, 0xef, 0xc4, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe,
- 0x50, 0x91, 0xe3, 0x3d, 0xc0, 0x0a, 0x8c, 0x3c, 0x60, 0x0d, 0x2f, 0xbd,
- 0xa8, 0x4c, 0x26, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x4a, 0x83, 0xbe,
- 0x00, 0x4a, 0x03, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x8c, 0x1d, 0xbe,
- 0x00, 0x10, 0x52, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
- 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x54, 0x2e, 0xbc, 0xbe,
- 0x50, 0x91, 0x63, 0x3e, 0x00, 0x31, 0xdf, 0x3e, 0x54, 0xec, 0xa1, 0x3e,
- 0x00, 0xce, 0xb7, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x10, 0x52, 0x3e,
- 0x54, 0xec, 0xa1, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0x54, 0xaa, 0x87, 0x3e,
- 0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0x50, 0xcb, 0x14, 0x3e,
- 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0xef, 0xc4, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
- 0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
- 0xa8, 0x4c, 0xa6, 0x3e, 0x50, 0x91, 0x63, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0xef, 0xc4, 0xbe,
- 0xb0, 0x12, 0xf5, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
- 0xa0, 0x12, 0xf5, 0x3d, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x8c, 0x1d, 0xbe,
- 0xc0, 0x0a, 0x8c, 0x3c, 0xa0, 0x0a, 0x0c, 0xbd, 0xaa, 0x2b, 0x99, 0xbe,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0xce, 0xb7, 0x3e, 0x00, 0x31, 0xdf, 0x3e,
- 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x4a, 0x83, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
- 0x00, 0x8c, 0x1d, 0x3f, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x4a, 0x83, 0x3e,
- 0x00, 0x73, 0xf9, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x0a, 0x8c, 0x3d,
- 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x73, 0xf9, 0x3e, 0xa8, 0x8e, 0x40, 0xbe,
- 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x60, 0x0d, 0x2f, 0x3d,
- 0x50, 0x4f, 0x49, 0x3e, 0x50, 0x91, 0xe3, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c,
- 0x00, 0xad, 0xaa, 0x3e, 0x00, 0xad, 0xaa, 0x3e, 0x00, 0x10, 0xd2, 0xbe,
- 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x4a, 0x03, 0xbf, 0x58, 0x91, 0x63, 0xbe,
- 0xa8, 0x4c, 0x26, 0x3e, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0x58, 0xd3, 0x7d, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0xaa, 0x0a, 0x8c, 0xbe,
- 0xff, 0x72, 0x79, 0xbf, 0xa8, 0xaf, 0xcd, 0x3e, 0xa8, 0x12, 0x75, 0xbe,
- 0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x8e, 0x40, 0x3e, 0x54, 0x0d, 0xaf, 0x3e,
- 0x00, 0x52, 0xec, 0x3e, 0x50, 0x91, 0xe3, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
- 0xa8, 0xf1, 0xe7, 0x3e, 0x54, 0xec, 0xa1, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
- 0x58, 0x4f, 0x49, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x91, 0xe3, 0xbd,
- 0x54, 0x4f, 0xc9, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
- 0xa8, 0x12, 0xf5, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0xd0, 0x5a, 0x3e,
- 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xce, 0xb7, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
- 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0xef, 0xc4, 0xbe,
- 0xaa, 0x4c, 0xa6, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x4a, 0x03, 0x3f,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0x54, 0xcb, 0x94, 0x3e, 0x54, 0x91, 0xe3, 0xbe, 0x54, 0x2e, 0xbc, 0xbe,
- 0x54, 0x91, 0xe3, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x50, 0x0d, 0xaf, 0xbd,
- 0x00, 0xce, 0xb7, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
- 0xa0, 0x12, 0xf5, 0x3d, 0xaa, 0x8e, 0xc0, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe,
- 0x56, 0xaa, 0x87, 0xbe, 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x10, 0x52, 0xbd,
- 0xa8, 0x4c, 0xa6, 0x3e, 0x50, 0x0d, 0x2f, 0x3e, 0x50, 0x91, 0xe3, 0x3d,
- 0x00, 0x10, 0xd2, 0x3e, 0x00, 0x8c, 0x9d, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
- 0x54, 0x2e, 0xbc, 0x3e, 0x7f, 0xc1, 0x65, 0xbf, 0xb0, 0x12, 0xf5, 0xbd,
- 0x60, 0x0d, 0x2f, 0x3d, 0xd5, 0x19, 0x01, 0xbf, 0x80, 0x0a, 0x0c, 0x3c,
- 0xa8, 0xd0, 0x5a, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x8c, 0x9d, 0xbd,
- 0x00, 0x10, 0xd2, 0xbd, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
- 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x4a, 0x83, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
- 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc,
- 0xaa, 0x2b, 0x99, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
- 0x50, 0x0d, 0x2f, 0x3e, 0x58, 0x91, 0x63, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
- 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x52, 0x6c, 0x3e,
- 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0x52, 0xbe,
- 0x54, 0xcb, 0x94, 0x3e, 0x55, 0xec, 0x21, 0xbf, 0x58, 0x4f, 0x49, 0xbe,
- 0xaa, 0x6d, 0xb3, 0xbe, 0xd5, 0x3a, 0x0e, 0xbf, 0x50, 0x0d, 0xaf, 0x3d,
- 0x55, 0x0d, 0x2f, 0xbf, 0x56, 0xaa, 0x87, 0xbe, 0x54, 0x2e, 0xbc, 0xbe,
- 0xa8, 0x4c, 0x26, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x58, 0x91, 0x63, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0xd0, 0x5a, 0x3e,
- 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0x2b, 0x99, 0x3e,
- 0x00, 0x10, 0x52, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
- 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x8c, 0x9d, 0xbe, 0x54, 0x2e, 0xbc, 0xbe,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
- 0x54, 0xec, 0xa1, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0x4c, 0x26, 0xbe,
- 0x00, 0x10, 0xd2, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
- 0x00, 0x6b, 0x90, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
- 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x73, 0xf9, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe,
- 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x58, 0x91, 0x63, 0xbe,
- 0x00, 0xce, 0x37, 0xbe, 0x54, 0x70, 0xd6, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x8c, 0x9d, 0xbd,
- 0x50, 0x91, 0xe3, 0x3d, 0x54, 0xb2, 0xf0, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
- 0x00, 0x4a, 0x03, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c,
- 0xaa, 0xd0, 0xda, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c,
- 0xa8, 0x0a, 0x0c, 0x3e, 0x58, 0x4f, 0x49, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
- 0x00, 0xce, 0x37, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0x4f, 0xc9, 0x3e,
- 0xa8, 0x4c, 0x26, 0xbe, 0x2a, 0x7a, 0x05, 0xbf, 0x00, 0x8c, 0x9d, 0x3d,
- 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x4a, 0x83, 0x3e,
- 0x50, 0x91, 0x63, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe,
- 0x54, 0x91, 0xe3, 0x3e, 0x54, 0xcb, 0x94, 0xbe, 0x50, 0x0d, 0x2f, 0x3e,
- 0x00, 0x10, 0x52, 0x3e, 0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x73, 0xf9, 0x3e,
- 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x8c, 0x9d, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd,
- 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x8e, 0x40, 0xbe,
- 0x00, 0x6b, 0x90, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe,
- 0x00, 0xad, 0xaa, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x10, 0xd2, 0xbe,
- 0xa8, 0x8e, 0x40, 0x3e, 0xa0, 0x12, 0x75, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe,
- 0x00, 0x31, 0xdf, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
- 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x0a, 0x0c, 0x3e,
- 0x50, 0x91, 0xe3, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc, 0x60, 0x0d, 0x2f, 0xbd,
- 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe,
- 0x00, 0x6b, 0x90, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xaa, 0x2b, 0x99, 0xbe,
- 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e, 0x50, 0x91, 0x63, 0x3e,
- 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x31, 0xdf, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
- 0x00, 0x8c, 0x1d, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x8e, 0xc0, 0xbe,
- 0x00, 0x8c, 0x1d, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
- 0xb0, 0x0a, 0x8c, 0xbd, 0xaa, 0x0a, 0x0c, 0x3f, 0x54, 0x2e, 0xbc, 0x3e,
- 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x8c, 0x1d, 0xbe, 0x50, 0xd3, 0x7d, 0x3e,
- 0xc0, 0x0a, 0x8c, 0xbc, 0xb0, 0x0a, 0x8c, 0x3d, 0x80, 0x0a, 0x0c, 0xbc,
- 0x50, 0x0d, 0x2f, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x50, 0x0d, 0xaf, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0xaa, 0x0a, 0x0c, 0xbf,
- 0xb0, 0x0a, 0x8c, 0x3d, 0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x12, 0x75, 0xbe,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x56, 0xaa, 0x87, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x00, 0x4a, 0x83, 0x3e, 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0x12, 0xf5, 0xbe, 0xd5, 0x3a, 0x0e, 0xbf,
- 0xa8, 0x12, 0x75, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x8c, 0x9d, 0xbd,
- 0x00, 0x8c, 0x1d, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0xcb, 0x94, 0xbe,
- 0x00, 0x10, 0x52, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x52, 0x6c, 0x3e,
- 0x00, 0x10, 0x52, 0xbd, 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
- 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
- 0x7f, 0xfb, 0x16, 0xbf, 0x50, 0xd3, 0x7d, 0x3e, 0xa8, 0x4c, 0x26, 0x3e,
- 0x00, 0xad, 0xaa, 0x3e, 0x00, 0x10, 0xd2, 0x3c, 0x50, 0x0d, 0x2f, 0x3e,
- 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d, 0x7f, 0x5e, 0x3e, 0xbf,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d,
- 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
- 0xa0, 0x12, 0xf5, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x0d, 0xaf, 0x3d,
- 0x00, 0x10, 0xd2, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
- 0xaa, 0xaf, 0xcd, 0xbe, 0x54, 0xec, 0xa1, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
- 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x54, 0x91, 0xe3, 0xbe,
- 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
- 0x54, 0xcb, 0x94, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
- 0x50, 0x0d, 0x2f, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd, 0xd5, 0x3a, 0x0e, 0xbf,
- 0x58, 0x91, 0x63, 0xbe, 0xd5, 0x19, 0x01, 0xbf, 0x80, 0x0a, 0x0c, 0xbc,
- 0xb0, 0x12, 0xf5, 0xbd, 0xd4, 0x19, 0x01, 0x3f, 0x54, 0x4f, 0xc9, 0xbe,
- 0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0xce, 0x37, 0x3e,
- 0x00, 0xce, 0x37, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0x0a, 0x0c, 0xbe,
- 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x4a, 0x83, 0x3e, 0xa8, 0x2b, 0x99, 0x3e,
- 0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0x12, 0xf5, 0xbe, 0x00, 0x10, 0x52, 0x3e,
- 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0xd2, 0x3c, 0x54, 0xcb, 0x94, 0xbe,
- 0x00, 0x10, 0x52, 0xbd, 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0x0d, 0xaf, 0x3e,
- 0xaa, 0x2b, 0x19, 0xbf, 0x54, 0x4f, 0xc9, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
- 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0xad, 0xaa, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
- 0x00, 0x10, 0xd2, 0x3c, 0x50, 0x0d, 0xaf, 0x3d, 0xaa, 0x4c, 0xa6, 0xbe,
- 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x52, 0x6c, 0xbe,
- 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x4a, 0x03, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x58, 0x91, 0x63, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x50, 0x91, 0x63, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc,
- 0x00, 0x8c, 0x9d, 0x3d, 0x58, 0x4f, 0x49, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
- 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0x0d, 0xaf, 0x3d,
- 0xaa, 0x8e, 0xc0, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
- 0x54, 0xb2, 0xf0, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0xbe,
- 0x00, 0x10, 0xd2, 0xbc, 0x54, 0x70, 0xd6, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
- 0x00, 0xce, 0x37, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
- 0x00, 0x31, 0xdf, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0xa8, 0x12, 0x75, 0xbe,
- 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x6b, 0x90, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
- 0x00, 0xef, 0xc4, 0xbe, 0x00, 0x10, 0xd2, 0xbe, 0xd5, 0x3a, 0x0e, 0xbf,
- 0x00, 0xce, 0x37, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
- 0x00, 0x10, 0x52, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x8c, 0x9d, 0xbe,
- 0xa8, 0x8e, 0x40, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
- 0x54, 0x2e, 0xbc, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
- 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0xd2, 0xbd, 0xaa, 0x2b, 0x99, 0xbe,
- 0x80, 0x0a, 0x0c, 0xbc, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
- 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x31, 0xdf, 0xbe, 0xd5, 0x19, 0x81, 0xbf,
- 0xb0, 0x12, 0xf5, 0xbd, 0x54, 0xcb, 0x94, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
- 0x56, 0xaa, 0x87, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0xc0, 0x0a, 0x8c, 0x3c,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x54, 0xcb, 0x94, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x52, 0xec, 0x3e, 0x00, 0x10, 0x52, 0x3e,
- 0xa0, 0x12, 0x75, 0xbd, 0xa8, 0xaf, 0xcd, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
- 0x00, 0x10, 0xd2, 0xbc, 0xa0, 0x12, 0x75, 0xbd, 0x54, 0xcb, 0x94, 0x3e,
- 0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x8c, 0x9d, 0xbd,
- 0x80, 0x0a, 0x0c, 0xbc, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
- 0x00, 0x52, 0x6c, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
- 0x00, 0x10, 0x52, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0x2b, 0x99, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
- 0x58, 0x91, 0x63, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x56, 0xaa, 0x87, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe,
- 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x4c, 0xa6, 0x3e, 0x54, 0xec, 0xa1, 0xbe,
- 0x80, 0xda, 0x09, 0x3f, 0xa8, 0x0a, 0x8c, 0x3e, 0xa8, 0x4c, 0x26, 0x3e,
- 0xaa, 0xd0, 0xda, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
- 0x00, 0x10, 0xd2, 0x3d, 0x00, 0xef, 0xc4, 0x3e, 0x00, 0x10, 0x52, 0x3d,
- 0x80, 0x0a, 0x0c, 0x3c, 0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x0d, 0xaf, 0x3d,
- 0x00, 0x31, 0xdf, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0x50, 0xcb, 0x14, 0x3e,
- 0xa8, 0x0a, 0x8c, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0x60, 0x0d, 0x2f, 0x3d,
- 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x8c, 0x9d, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d,
- 0x50, 0x91, 0xe3, 0x3d, 0xa0, 0x12, 0xf5, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
- 0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
- 0x58, 0x91, 0x63, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x58, 0xcb, 0x14, 0xbe,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x31, 0xdf, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
- 0x00, 0x00, 0x00, 0x00, 0x58, 0x4f, 0x49, 0xbe, 0xaa, 0x0a, 0x0c, 0xbf,
- 0x54, 0x91, 0xe3, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
- 0xc0, 0x0a, 0x8c, 0x3c, 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x4c, 0x26, 0x3e,
- 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x8c, 0x9d, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
- 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0xd2, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
- 0x58, 0x91, 0x63, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
- 0xaa, 0xd0, 0xda, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
- 0x54, 0x91, 0xe3, 0xbe, 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x52, 0xec, 0xbe,
- 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x8c, 0x9d, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd,
- 0xaa, 0x8e, 0xc0, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
- 0xaa, 0x8e, 0xc0, 0xbe, 0xaa, 0x6d, 0x33, 0xbf, 0x00, 0xef, 0xc4, 0xbe,
- 0x50, 0x0d, 0xaf, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x80, 0x0a, 0x0c, 0x3c,
- 0xaa, 0xaf, 0xcd, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0xa0, 0x12, 0xf5, 0x3d,
- 0xb0, 0x0a, 0x8c, 0x3d, 0x2a, 0x61, 0x61, 0xbf, 0xa8, 0x12, 0x75, 0xbe,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x73, 0xf9, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0xa0, 0x12, 0xf5, 0x3d, 0x58, 0x0d, 0x2f, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x58, 0x91, 0x63, 0xbe, 0xb0, 0x12, 0xf5, 0xbd,
- 0xaa, 0xd0, 0xda, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x8c, 0x9d, 0xbe,
- 0x80, 0x0a, 0x0c, 0x3c, 0x58, 0xcb, 0x14, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
- 0xc0, 0x0a, 0x8c, 0x3c, 0x50, 0xd3, 0x7d, 0x3e, 0x00, 0x31, 0xdf, 0x3e,
- 0x54, 0xec, 0xa1, 0x3e, 0x00, 0x10, 0x52, 0x3d, 0xaa, 0x2b, 0x19, 0xbf,
- 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x10, 0xd2, 0xbe, 0xff, 0x8b, 0x1d, 0xbf,
- 0x50, 0x4f, 0x49, 0x3e, 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0x12, 0x75, 0x3e,
- 0x00, 0xce, 0x37, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
- 0xa8, 0x8e, 0x40, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0xaa, 0x4c, 0xa6, 0xbe,
- 0x00, 0x10, 0xd2, 0x3d, 0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
- 0x80, 0x0a, 0x0c, 0xbc, 0x54, 0xb2, 0xf0, 0xbe, 0x00, 0xce, 0x37, 0x3e,
- 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x4a, 0x03, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
- 0x56, 0xaa, 0x87, 0xbe, 0x7f, 0xfb, 0x16, 0xbf, 0x50, 0x0d, 0x2f, 0x3e,
- 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x12, 0x75, 0x3e, 0xd5, 0x3a, 0x0e, 0xbf,
- 0x00, 0x10, 0xd2, 0x3c, 0xa8, 0x2b, 0x99, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe,
- 0xaa, 0x8e, 0xc0, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
- 0x80, 0x0a, 0x0c, 0x3c, 0xaa, 0x4c, 0xa6, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
- 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x8c, 0x9d, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe,
- 0x50, 0x91, 0xe3, 0x3d, 0x00, 0xad, 0xaa, 0x3e, 0xd4, 0x19, 0x01, 0x3f,
- 0xa8, 0x12, 0x75, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x91, 0xe3, 0xbd,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0xd2, 0x3d,
- 0x50, 0x0d, 0x2f, 0x3e, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0xce, 0xb7, 0x3e,
- 0x50, 0x91, 0x63, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
- 0xa8, 0xd0, 0x5a, 0x3e, 0xa0, 0x12, 0x75, 0x3d, 0xa8, 0x4c, 0xa6, 0x3e,
- 0xa8, 0xd0, 0xda, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0xa0, 0x12, 0x75, 0xbd,
- 0x00, 0x4a, 0x03, 0xbe, 0xa8, 0x6d, 0xb3, 0x3e, 0x54, 0x70, 0xd6, 0x3e,
- 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x90, 0x3e,
- 0x00, 0x4a, 0x83, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
- 0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
- 0x00, 0x10, 0x52, 0x3d, 0x00, 0xce, 0x37, 0x3e, 0xa8, 0x12, 0x75, 0x3e,
- 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
- 0x00, 0xce, 0x37, 0x3e, 0xa8, 0x8e, 0xc0, 0x3e, 0x00, 0x10, 0xd2, 0x3d,
- 0xc0, 0x0a, 0x8c, 0xbc, 0xaa, 0x0a, 0x8c, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
- 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x10, 0xd2, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
- 0x00, 0x4a, 0x83, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0xd0, 0xda, 0x3e,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x10, 0x52, 0xbe, 0x00, 0xce, 0x37, 0x3e,
- 0x00, 0x6b, 0x90, 0x3e, 0xa8, 0xd0, 0xda, 0x3e, 0x00, 0xef, 0xc4, 0x3e,
- 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x4a, 0x03, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
- 0x50, 0xcb, 0x14, 0x3e, 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x10, 0x52, 0x3e,
- 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0xa8, 0x8e, 0x40, 0x3e,
- 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
- 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0xd2, 0xbd,
- 0x54, 0x0d, 0xaf, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0xd2, 0x3c, 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0xc0, 0x0a, 0x8c, 0x3c, 0xc0, 0x0a, 0x8c, 0xbc, 0xa8, 0xd0, 0x5a, 0xbe,
- 0xc0, 0x0a, 0x8c, 0x3c, 0x80, 0x0a, 0x0c, 0xbc, 0xaa, 0xd0, 0xda, 0xbe,
- 0xa0, 0x12, 0x75, 0x3d, 0xaa, 0xaf, 0xcd, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
- 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x10, 0x52, 0xbd,
- 0x00, 0x4a, 0x03, 0xbf, 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
- 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
- 0x00, 0xce, 0x37, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0xcb, 0x14, 0x3e,
- 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x56, 0xaa, 0x87, 0xbe,
- 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0x52, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
- 0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x10, 0x52, 0x3e,
- 0xaa, 0x0a, 0x8c, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
- 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
- 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe,
- 0x00, 0x4a, 0x03, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0xaa, 0x6d, 0x33, 0xbf,
- 0xa8, 0x4c, 0x26, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0x0d, 0xaf, 0x3d,
- 0xa8, 0x8e, 0x40, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0xef, 0xc4, 0x3e,
- 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x10, 0x52, 0x3d,
- 0x58, 0x91, 0x63, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0xcb, 0x94, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
- 0x54, 0xec, 0xa1, 0xbe, 0x00, 0x8c, 0x9d, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
- 0x00, 0x4a, 0x03, 0x3e, 0xa8, 0x12, 0x75, 0x3e, 0xff, 0xac, 0x2a, 0xbf,
- 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x10, 0x52, 0xbe,
- 0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x0d, 0x2f, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
- 0x00, 0xef, 0xc4, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x9d, 0xbd,
- 0x00, 0x4a, 0x03, 0xbe, 0xd4, 0x19, 0x01, 0x3f, 0x54, 0x91, 0xe3, 0xbe,
- 0x56, 0xaa, 0x87, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
- 0xd5, 0x5b, 0x1b, 0xbf, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
- 0xaa, 0xf1, 0xe7, 0xbe, 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x10, 0x52, 0x3d,
- 0xaa, 0x2b, 0x99, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d,
- 0xc0, 0x0a, 0x8c, 0x3c, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x52, 0x6c, 0xbe,
- 0x50, 0xcb, 0x14, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd, 0x58, 0xcb, 0x14, 0xbe,
- 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d,
- 0x50, 0x0d, 0xaf, 0x3d, 0x50, 0x4f, 0x49, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
- 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xad, 0xaa, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x00, 0x10, 0x52, 0xbe, 0x00, 0xce, 0x37, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd,
- 0xa8, 0x0a, 0x0c, 0x3e, 0xa0, 0x12, 0x75, 0x3d, 0x00, 0xad, 0xaa, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xaa, 0x12, 0xf5, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
- 0xa8, 0x8e, 0xc0, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
- 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0x52, 0x3d, 0x50, 0x91, 0xe3, 0x3d,
- 0x2a, 0x9b, 0x12, 0xbf, 0x60, 0x0d, 0x2f, 0x3d, 0x56, 0xaa, 0x87, 0xbe,
- 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x10, 0x52, 0x3d, 0x00, 0x4a, 0x03, 0xbe,
- 0xaa, 0x8e, 0xc0, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0xce, 0x37, 0x3e,
- 0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x50, 0x4f, 0x49, 0x3e, 0x58, 0x91, 0x63, 0xbe,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0x4f, 0xc9, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
- 0x00, 0x10, 0xd2, 0x3d, 0x50, 0xcb, 0x14, 0x3e, 0x54, 0xcb, 0x94, 0xbe,
- 0x54, 0xaa, 0x87, 0x3e, 0x54, 0x70, 0xd6, 0xbe, 0x00, 0x52, 0xec, 0xbe,
- 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
- 0xa8, 0x2b, 0x99, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x31, 0xdf, 0xbe,
- 0x00, 0x4a, 0x83, 0x3e, 0x54, 0xb2, 0xf0, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
- 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x10, 0xd2, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
- 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
- 0x00, 0x10, 0x52, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0xce, 0x37, 0xbe,
- 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x52, 0x6c, 0x3e,
- 0xaa, 0x8e, 0xc0, 0xbe, 0x80, 0xda, 0x09, 0xbf, 0x60, 0x0d, 0x2f, 0x3d,
- 0xa0, 0x12, 0x75, 0x3d, 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0xb2, 0xf0, 0xbe,
- 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
- 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0xa0, 0x12, 0x75, 0x3d, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x10, 0x52, 0x3e,
- 0x54, 0x0d, 0xaf, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0x58, 0xcb, 0x14, 0xbe,
- 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x90, 0x3e,
- 0xaa, 0xaf, 0x4d, 0xbf, 0xb0, 0x12, 0xf5, 0xbd, 0x80, 0x0a, 0x0c, 0xbc,
- 0xa8, 0x4c, 0x26, 0xbe, 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e,
- 0xaa, 0x2b, 0x19, 0xbf, 0x55, 0x0d, 0x2f, 0xbf, 0x00, 0x4a, 0x03, 0xbe,
- 0x00, 0x10, 0x52, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x2a, 0x7a, 0x05, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d,
- 0xaa, 0xaf, 0xcd, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
- 0x00, 0x10, 0x52, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x58, 0x0d, 0x2f, 0xbe,
- 0xa0, 0x12, 0x75, 0x3d, 0x60, 0x0d, 0x2f, 0xbd, 0x54, 0xcb, 0x94, 0xbe,
- 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x10, 0xd2, 0xbe,
- 0xa8, 0x0a, 0x0c, 0xbe, 0xff, 0x0f, 0x52, 0xbf, 0x00, 0x8c, 0x1d, 0xbe,
- 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x6b, 0x10, 0xbf, 0xa8, 0x12, 0x75, 0xbe,
- 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x6b, 0x10, 0x3f, 0xa8, 0x0a, 0x8c, 0x3e,
- 0x54, 0xaa, 0x87, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0xaa, 0x4c, 0xa6, 0xbe,
- 0x00, 0x10, 0xd2, 0x3c, 0xa8, 0x6d, 0xb3, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
- 0xa8, 0x2b, 0x99, 0x3e, 0x54, 0xec, 0xa1, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c,
- 0x00, 0x8c, 0x1d, 0x3e, 0x50, 0x0d, 0xaf, 0xbd, 0x2a, 0x9b, 0x12, 0xbf,
- 0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x52, 0x6c, 0x3e,
- 0x80, 0x0a, 0x0c, 0x3c, 0x58, 0xcb, 0x14, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
- 0x00, 0x10, 0xd2, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc, 0xb0, 0x0a, 0x8c, 0x3d,
- 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x4a, 0x03, 0xbe,
- 0x50, 0x0d, 0xaf, 0x3d, 0x50, 0x0d, 0xaf, 0x3d, 0x58, 0xd3, 0x7d, 0xbe,
- 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0x52, 0x3e, 0x50, 0x0d, 0xaf, 0x3d,
- 0xb0, 0x12, 0xf5, 0xbd, 0x54, 0x2e, 0xbc, 0x3e, 0x54, 0x70, 0xd6, 0xbe,
- 0x50, 0x91, 0xe3, 0xbd, 0x7f, 0x7f, 0x4b, 0xbf, 0x00, 0x4a, 0x03, 0xbe,
- 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x4c, 0xa6, 0x3e,
- 0x00, 0xce, 0x37, 0x3e, 0x50, 0x91, 0x63, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
- 0x00, 0x10, 0xd2, 0xbc, 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x8e, 0xc0, 0xbe,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x8c, 0x9d, 0x3d, 0x54, 0x4f, 0xc9, 0x3e,
- 0xa8, 0x0a, 0x8c, 0x3e, 0x58, 0xcb, 0x14, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
- 0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x10, 0x52, 0x3d,
- 0x50, 0x91, 0xe3, 0x3d, 0xa8, 0x4c, 0xa6, 0x3e, 0x00, 0x10, 0xd2, 0x3e,
- 0x00, 0xef, 0xc4, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
- 0x00, 0x10, 0xd2, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0x50, 0x0d, 0xaf, 0x3d,
- 0x00, 0xad, 0x2a, 0x3f, 0xc0, 0x0a, 0x8c, 0x3c, 0x50, 0xcb, 0x14, 0x3e,
- 0x00, 0x52, 0x6c, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d, 0xaa, 0x0a, 0x8c, 0xbe,
- 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe,
- 0xa0, 0x12, 0x75, 0x3d, 0x54, 0x91, 0xe3, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e,
- 0x55, 0xaa, 0x07, 0xbf, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x4a, 0x83, 0x3e,
- 0x50, 0x91, 0xe3, 0x3d, 0xa8, 0x4c, 0x26, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe,
- 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x80, 0x0a, 0x0c, 0x3c,
- 0x54, 0xaa, 0x87, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d, 0xaa, 0xaf, 0xcd, 0xbe,
- 0xb0, 0x0a, 0x8c, 0x3d, 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
- 0x00, 0xce, 0x37, 0xbe, 0x54, 0x70, 0xd6, 0x3e, 0x58, 0xd3, 0x7d, 0xbe,
- 0xaa, 0xd0, 0xda, 0xbe, 0x00, 0x6b, 0x90, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d,
- 0x50, 0x91, 0xe3, 0x3d, 0xd4, 0x7c, 0x28, 0x3f, 0x00, 0x4a, 0x83, 0x3e,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x6b, 0x90, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
- 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x10, 0x52, 0x3e,
- 0x58, 0x4f, 0x49, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x8c, 0x9d, 0xbe,
- 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x8e, 0x40, 0xbe,
- 0xa8, 0x0a, 0x0c, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0x54, 0xcb, 0x94, 0xbe,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
- 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0x8e, 0x40, 0x3e,
- 0xc0, 0x0a, 0x8c, 0xbc, 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x91, 0xe3, 0xbd,
- 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x6b, 0x10, 0xbf,
- 0xc0, 0x0a, 0x8c, 0x3c, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x52, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x0a, 0x8c, 0x3d,
- 0x54, 0x0d, 0xaf, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x4c, 0x26, 0x3e,
- 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
- 0x56, 0xaa, 0x87, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
- 0xaa, 0xd0, 0xda, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
- 0x00, 0x8c, 0x9d, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x8c, 0x9d, 0x3e,
- 0x58, 0xd3, 0x7d, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0xaa, 0xd0, 0xda, 0xbe,
- 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x10, 0xd2, 0x3d, 0x7f, 0x7f, 0x4b, 0xbf,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x8c, 0x1d, 0x3e,
- 0x80, 0xda, 0x09, 0xbf, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x52, 0x6c, 0xbe,
- 0xaa, 0xd0, 0xda, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
- 0x50, 0x0d, 0x2f, 0x3e, 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0xd2, 0x3d,
- 0x50, 0x0d, 0xaf, 0xbd, 0x54, 0xb2, 0xf0, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
- 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
- 0xc0, 0x0a, 0x8c, 0x3c, 0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
- 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xa0, 0x12, 0x75, 0x3d,
- 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x8c, 0x9d, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
- 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0xbd, 0xd5, 0x19, 0x01, 0xbf,
- 0x54, 0xec, 0xa1, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
- 0x54, 0x91, 0xe3, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x2a, 0x9b, 0x12, 0xbf, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x12, 0x75, 0x3e,
- 0x60, 0x0d, 0x2f, 0xbd, 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x10, 0x52, 0x3d,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0xaa, 0x6d, 0xb3, 0xbe,
- 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x8c, 0x1d, 0xbe, 0x54, 0xd3, 0xfd, 0xbe,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
- 0x00, 0x8c, 0x1d, 0xbe, 0x54, 0x4f, 0x49, 0xbf, 0x00, 0x4a, 0x03, 0x3e,
- 0x00, 0x10, 0x52, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
- 0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
- 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x50, 0x0d, 0xaf, 0x3d,
- 0x58, 0x91, 0x63, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
- 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0xbc,
- 0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0xf1, 0xe7, 0x3e, 0x58, 0x91, 0x63, 0xbe,
- 0x50, 0x0d, 0xaf, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
- 0x00, 0x73, 0xf9, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0xbc,
- 0x00, 0xce, 0xb7, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x8c, 0x1d, 0x3e,
- 0x80, 0x0a, 0x0c, 0x3c, 0xaa, 0x4c, 0xa6, 0xbe, 0xd4, 0x19, 0x01, 0x3f,
- 0x00, 0x10, 0xd2, 0xbe, 0x54, 0xaa, 0x87, 0x3e, 0x50, 0x91, 0xe3, 0x3d,
- 0xa8, 0x0a, 0x8c, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d, 0xa8, 0x4c, 0x26, 0x3e,
- 0xaa, 0x0a, 0x0c, 0x3f, 0xa8, 0xd0, 0x5a, 0xbe, 0x7f, 0x7f, 0x4b, 0xbf,
- 0xa8, 0x0a, 0x8c, 0x3e, 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0xef, 0xc4, 0x3e,
- 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
- 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x6b, 0x10, 0x3f, 0x54, 0xcb, 0x94, 0xbe,
- 0xd4, 0x7c, 0x28, 0x3f, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x8c, 0x9d, 0x3d,
- 0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x31, 0xdf, 0xbe,
- 0x00, 0x8c, 0x9d, 0x3d, 0xaa, 0x2b, 0x99, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
- 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x73, 0xf9, 0x3e, 0x54, 0xaa, 0x87, 0x3e,
- 0x2a, 0xfe, 0x39, 0x3f, 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x73, 0xf9, 0x3e,
- 0x54, 0xec, 0xa1, 0x3e, 0xa8, 0xaf, 0xcd, 0x3e, 0x54, 0x2e, 0x3c, 0x3f,
- 0x00, 0x4a, 0x03, 0x3f, 0x54, 0xb2, 0xf0, 0xbe, 0x54, 0xaa, 0x87, 0x3e,
- 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0xa0, 0x0a, 0x0c, 0x3d,
- 0xb0, 0x8e, 0xc0, 0x3d, 0xaa, 0x6d, 0x33, 0xbf, 0x00, 0x4a, 0x03, 0x3e,
- 0x00, 0xce, 0x37, 0x3e, 0x00, 0x31, 0xdf, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
- 0x54, 0x2e, 0xbc, 0xbe, 0xa8, 0x4c, 0x26, 0x3e, 0x58, 0xcb, 0x14, 0xbe,
- 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x0a, 0x0c, 0x3e,
- 0x54, 0xec, 0xa1, 0xbe, 0x55, 0xaa, 0x07, 0xbf, 0xc0, 0x0a, 0x8c, 0x3c,
- 0x58, 0x91, 0x63, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e, 0xa8, 0x8e, 0x40, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x4a, 0x03, 0xbf, 0x00, 0x8c, 0x9d, 0x3d,
- 0x00, 0xad, 0xaa, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
- 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d,
- 0x00, 0x10, 0xd2, 0xbc, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
- 0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
- 0xa0, 0x0a, 0x0c, 0x3d, 0xa8, 0x4c, 0x26, 0x3e, 0x50, 0xcb, 0x14, 0x3e,
- 0x58, 0x91, 0x63, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0xef, 0xc4, 0xbe,
- 0x00, 0x8c, 0x1d, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c, 0x50, 0x0d, 0xaf, 0x3d,
- 0x54, 0xec, 0xa1, 0x3e, 0xd5, 0x5b, 0x1b, 0xbf, 0x00, 0xce, 0x37, 0xbe,
- 0x00, 0x8c, 0x9d, 0x3d, 0x54, 0x4f, 0xc9, 0x3e, 0x80, 0xda, 0x09, 0xbf,
- 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0xaa, 0x87, 0x3e, 0x2a, 0xbc, 0x1f, 0x3f,
- 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
- 0xb0, 0x8e, 0xc0, 0xbd, 0xa8, 0x4c, 0x26, 0x3e, 0x60, 0x0d, 0x2f, 0xbd,
- 0x00, 0xef, 0xc4, 0xbe, 0xaa, 0xd0, 0xda, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
- 0x00, 0x10, 0xd2, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x10, 0x52, 0xbe,
- 0x60, 0x0d, 0x2f, 0x3d, 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
- 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
- 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
- 0x00, 0xad, 0xaa, 0xbe, 0x54, 0x2e, 0xbc, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
- 0xa8, 0x4c, 0x26, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
- 0x00, 0x4a, 0x03, 0xbf, 0x00, 0x10, 0xd2, 0x3c, 0xa0, 0x12, 0x75, 0xbd,
- 0xaa, 0x0a, 0x8c, 0xbe, 0x56, 0xaa, 0x87, 0xbe, 0x55, 0xaa, 0x07, 0xbf,
- 0x00, 0x8c, 0x9d, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x10, 0x52, 0x3e,
- 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xa8, 0x4c, 0x26, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
- 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x10, 0xd2, 0xbe,
- 0x54, 0xcb, 0x94, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
- 0xb0, 0x12, 0xf5, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe,
- 0x00, 0x10, 0x52, 0x3d, 0x50, 0x4f, 0x49, 0x3e, 0x60, 0x0d, 0x2f, 0xbd,
- 0x00, 0x4a, 0x03, 0x3e, 0xa0, 0x12, 0x75, 0x3d, 0xa0, 0x12, 0xf5, 0x3d,
- 0x55, 0xec, 0x21, 0xbf, 0x00, 0x10, 0x52, 0xbd, 0x00, 0xce, 0xb7, 0xbe,
- 0x00, 0x10, 0x52, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x8c, 0x1d, 0x3e,
- 0x54, 0x70, 0xd6, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0x80, 0x0a, 0x0c, 0xbc,
- 0x00, 0x4a, 0x83, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x60, 0x0d, 0x2f, 0x3d, 0xa0, 0x12, 0x75, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe,
- 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x8c, 0x9d, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x54, 0xd3, 0xfd, 0xbe, 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0x00, 0x8c, 0x9d, 0xbd, 0x2a, 0x7a, 0x05, 0xbf, 0x00, 0x8c, 0x1d, 0xbe,
- 0x00, 0xce, 0x37, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0xa8, 0xd0, 0x5a, 0x3e,
- 0x55, 0x0d, 0x2f, 0xbf, 0x80, 0x0a, 0x0c, 0xbc, 0x54, 0xb2, 0xf0, 0xbe,
- 0x00, 0x8c, 0x1d, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
- 0x00, 0x10, 0x52, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0xad, 0xaa, 0x3e,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x50, 0x0d, 0xaf, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e,
- 0xb0, 0x12, 0xf5, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
- 0x00, 0xce, 0x37, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x50, 0x91, 0x63, 0x3e,
- 0x00, 0x8c, 0x9d, 0x3e, 0xaa, 0xaf, 0xcd, 0xbe, 0x54, 0x91, 0xe3, 0x3e,
- 0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe,
- 0x00, 0x10, 0xd2, 0xbc, 0x54, 0x4f, 0xc9, 0x3e, 0x00, 0x52, 0x6c, 0xbe,
- 0xb0, 0x0a, 0x8c, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
- 0xb0, 0x8e, 0xc0, 0x3d, 0x54, 0xaa, 0x07, 0x3f, 0x54, 0xec, 0xa1, 0x3e,
- 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0x52, 0x3e,
- 0x00, 0x4a, 0x83, 0xbe, 0xaa, 0x12, 0xf5, 0xbe, 0x54, 0x91, 0x63, 0xbf,
- 0x54, 0xb2, 0xf0, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
- 0x00, 0xef, 0xc4, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
- 0x50, 0x91, 0xe3, 0x3d, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0x3c,
- 0x50, 0x91, 0xe3, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0xce, 0xb7, 0xbe,
- 0xa8, 0x4c, 0x26, 0x3e, 0xaa, 0xaf, 0xcd, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
- 0x58, 0xcb, 0x14, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0x58, 0xd3, 0x7d, 0xbe,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x31, 0xdf, 0xbe,
- 0x00, 0x10, 0x52, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe, 0x54, 0xaa, 0x87, 0x3e,
- 0x56, 0xaa, 0x87, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0xaa, 0xd0, 0xda, 0xbe,
- 0xff, 0xee, 0x44, 0xbf, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x52, 0xec, 0xbe,
- 0x00, 0x52, 0x6c, 0xbe, 0x54, 0x70, 0xd6, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe,
- 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d,
- 0xa8, 0x0a, 0x0c, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0xce, 0xb7, 0xbe,
- 0x54, 0x2e, 0xbc, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc,
- 0xb0, 0x8e, 0xc0, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
- 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x52, 0xec, 0xbe, 0x54, 0x91, 0xe3, 0xbe,
- 0x60, 0x0d, 0x2f, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0xa0, 0x0a, 0x0c, 0x3d,
- 0x00, 0x4a, 0x83, 0x3e, 0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
- 0x50, 0x91, 0xe3, 0x3d, 0x54, 0xcb, 0x94, 0xbe, 0xaa, 0x12, 0xf5, 0xbe,
- 0xa8, 0x4c, 0x26, 0x3e, 0x54, 0xd3, 0xfd, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
- 0x54, 0x4f, 0xc9, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x4c, 0x26, 0x3e,
- 0x00, 0xce, 0x37, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0x52, 0xbe,
- 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
- 0x00, 0x10, 0x52, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
- 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x4a, 0x03, 0xbe,
- 0x60, 0x0d, 0x2f, 0xbd, 0x54, 0xcb, 0x94, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
- 0x00, 0xce, 0x37, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0x4f, 0xc9, 0x3e,
- 0x00, 0x52, 0xec, 0x3e, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
- 0x00, 0x10, 0x52, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbd, 0x54, 0x2e, 0xbc, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
- 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0xce, 0xb7, 0xbe, 0x58, 0x91, 0x63, 0xbe,
- 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0x3e, 0xff, 0x8b, 0x1d, 0xbf,
- 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0xf1, 0xe7, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
- 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xad, 0xaa, 0xbe,
- 0xd5, 0x19, 0x01, 0xbf, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0xce, 0x37, 0x3e,
- 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x4a, 0x03, 0xbe, 0xa8, 0x8e, 0x40, 0x3e,
- 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x4a, 0x03, 0x3e, 0xb0, 0x12, 0xf5, 0xbd,
- 0xa8, 0x0a, 0x8c, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
- 0x00, 0xce, 0x37, 0x3e, 0x00, 0x6b, 0x90, 0xbe, 0xa8, 0x8e, 0x40, 0x3e,
- 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
- 0x50, 0xd3, 0x7d, 0x3e, 0xa8, 0x8e, 0x40, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x4a, 0x83, 0x3e, 0x58, 0x91, 0x63, 0xbe,
- 0x50, 0x91, 0xe3, 0xbd, 0x55, 0xcb, 0x14, 0xbf, 0x00, 0x52, 0x6c, 0xbe,
- 0xa8, 0x8e, 0x40, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e, 0x80, 0xda, 0x09, 0xbf,
- 0x54, 0xec, 0xa1, 0x3e, 0x58, 0x4f, 0x49, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
- 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
- 0x00, 0x31, 0xdf, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0xaa, 0x87, 0x3e,
- 0xa8, 0x0a, 0x0c, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe, 0xa8, 0x2b, 0x99, 0x3e,
- 0xc0, 0x0a, 0x8c, 0xbc, 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x10, 0xd2, 0xbd,
- 0xa8, 0x6d, 0xb3, 0x3e, 0x2a, 0x9b, 0x12, 0x3f, 0xa0, 0x12, 0x75, 0xbd,
- 0xa0, 0x0a, 0x0c, 0xbd, 0xd4, 0x19, 0x01, 0x3f, 0x54, 0xcb, 0x94, 0x3e,
- 0x7f, 0x5e, 0x3e, 0xbf, 0x60, 0x0d, 0x2f, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x50, 0xcb, 0x14, 0x3e, 0xa8, 0xf1, 0xe7, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
- 0x00, 0xad, 0xaa, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x56, 0xaa, 0x87, 0xbe,
- 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e, 0x80, 0xfb, 0x16, 0x3f,
- 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x91, 0xe3, 0x3d, 0x50, 0x0d, 0xaf, 0x3d,
- 0x00, 0x10, 0x52, 0x3d, 0x00, 0xef, 0xc4, 0xbe, 0x54, 0xaa, 0x87, 0x3e,
- 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x73, 0xf9, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
- 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
- 0x00, 0xce, 0xb7, 0x3e, 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
- 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
- 0xa8, 0x4c, 0x26, 0x3e, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0xce, 0x37, 0xbe,
- 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x58, 0xcb, 0x14, 0xbe,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x54, 0xcb, 0x94, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
- 0x58, 0xd3, 0x7d, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x10, 0x52, 0xbd,
- 0x00, 0x31, 0xdf, 0x3e, 0x00, 0x6b, 0x10, 0xbf, 0x54, 0x2e, 0xbc, 0xbe,
- 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0xd2, 0xbe,
- 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
- 0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0x52, 0x3e,
- 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
- 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x4a, 0x83, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
- 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x0a, 0x8c, 0x3e, 0x58, 0x91, 0x63, 0xbe,
- 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x4a, 0x03, 0xbf, 0x54, 0xcb, 0x94, 0xbe,
- 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x54, 0x91, 0xe3, 0x3e,
- 0x80, 0x0a, 0x0c, 0xbc, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x52, 0x6c, 0xbe,
- 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
- 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0xd0, 0xda, 0xbe,
- 0xa8, 0x8e, 0x40, 0x3e, 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x4a, 0x03, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x54, 0xec, 0xa1, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
- 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0xbd,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x55, 0xaa, 0x07, 0xbf, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x00, 0x10, 0x52, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d, 0x58, 0xcb, 0x14, 0xbe,
- 0x50, 0xd3, 0x7d, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
- 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x52, 0xec, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
- 0x00, 0x73, 0xf9, 0xbe, 0xd5, 0x5b, 0x1b, 0xbf, 0x54, 0x4f, 0xc9, 0xbe,
- 0x00, 0x10, 0x52, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x10, 0xd2, 0xbc,
- 0x00, 0xce, 0xb7, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0x0d, 0x2f, 0xbe,
- 0x58, 0xcb, 0x14, 0xbe, 0x58, 0xd3, 0x7d, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
- 0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xa8, 0xd0, 0x5a, 0x3e,
- 0x00, 0x10, 0x52, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0xa0, 0x12, 0x75, 0x3d,
- 0x80, 0x0a, 0x0c, 0xbc, 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0xf1, 0xe7, 0xbe,
- 0xaa, 0x0a, 0x0c, 0xbf, 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x00, 0x00, 0x00,
- 0xa8, 0x8e, 0x40, 0x3e, 0xff, 0xac, 0x2a, 0xbf, 0x54, 0xd3, 0xfd, 0xbe,
- 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0x80, 0xda, 0x89, 0xbf,
- 0x00, 0x31, 0xdf, 0x3e, 0x58, 0x91, 0x63, 0xbe, 0xa8, 0x2b, 0x99, 0x3e,
- 0x00, 0x10, 0x52, 0xbd, 0xd5, 0x3a, 0x0e, 0xbf, 0x00, 0x52, 0xec, 0xbe,
- 0x00, 0x73, 0xf9, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
- 0x60, 0x0d, 0x2f, 0xbd, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0xd2, 0x3c,
- 0x54, 0x2e, 0xbc, 0x3e, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x54, 0xcb, 0x94, 0x3e, 0x54, 0xcb, 0x94, 0xbe,
- 0xa8, 0x4c, 0x26, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x60, 0x0d, 0x2f, 0xbd,
- 0x54, 0x2e, 0xbc, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0xa0, 0x12, 0x75, 0xbd,
- 0x00, 0x31, 0xdf, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xce, 0xb7, 0xbe,
- 0xa8, 0x8e, 0x40, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x58, 0x91, 0x63, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0x2b, 0x99, 0x3e,
- 0xa8, 0x12, 0x75, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x31, 0xdf, 0x3e,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x52, 0xec, 0x3e, 0x50, 0x0d, 0xaf, 0xbd,
- 0xa8, 0x8e, 0xc0, 0x3e, 0x50, 0xd3, 0x7d, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
- 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x52, 0x6c, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
- 0xa0, 0x12, 0xf5, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
- 0x2a, 0xbc, 0x1f, 0x3f, 0x00, 0x10, 0x52, 0x3d, 0x50, 0xd3, 0x7d, 0x3e,
- 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x4a, 0x83, 0xbe, 0x50, 0x0d, 0xaf, 0x3d,
- 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0xd2, 0x3c, 0x50, 0xcb, 0x14, 0x3e,
- 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x4a, 0x03, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
- 0xb0, 0x12, 0xf5, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe, 0x54, 0x2e, 0xbc, 0x3e,
- 0x50, 0xcb, 0x14, 0x3e, 0xaa, 0x0a, 0x0c, 0xbf, 0x00, 0x10, 0x52, 0xbd,
- 0xaa, 0xd0, 0xda, 0xbe, 0xa8, 0x4c, 0x26, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
- 0x00, 0x10, 0x52, 0x3d, 0x00, 0x73, 0xf9, 0xbe, 0x54, 0x4f, 0xc9, 0xbe,
- 0x50, 0xd3, 0x7d, 0x3e, 0x00, 0x10, 0xd2, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
- 0xb0, 0x12, 0xf5, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
- 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x4c, 0x26, 0xbe, 0xd5, 0x19, 0x01, 0xbf,
- 0x50, 0x91, 0xe3, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
- 0x00, 0x8c, 0x1d, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x00, 0x52, 0xec, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x54, 0xd3, 0xfd, 0xbe,
- 0x80, 0x0a, 0x0c, 0x3c, 0x55, 0xcb, 0x14, 0xbf, 0xb0, 0x12, 0xf5, 0xbd,
- 0x00, 0xce, 0x37, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
- 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xad, 0xaa, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
- 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x60, 0x0d, 0x2f, 0x3d, 0x54, 0x4f, 0xc9, 0xbe, 0xaa, 0x4c, 0xa6, 0xbe,
- 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xce, 0x37, 0xbe, 0xaa, 0xaf, 0x4d, 0xbf,
- 0x00, 0x4a, 0x03, 0xbe, 0x7f, 0xfb, 0x16, 0xbf, 0x58, 0x91, 0x63, 0xbe,
- 0xb0, 0x8e, 0xc0, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x58, 0xd3, 0x7d, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
- 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x50, 0xcb, 0x14, 0x3e,
- 0x50, 0x91, 0x63, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
- 0x00, 0x52, 0xec, 0xbe, 0xaa, 0xd0, 0xda, 0xbe, 0x7f, 0xfb, 0x16, 0xbf,
- 0x54, 0xd3, 0xfd, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x52, 0x6c, 0xbe,
- 0xff, 0x8b, 0x1d, 0xbf, 0xa0, 0x12, 0x75, 0xbd, 0x54, 0x4f, 0xc9, 0xbe,
- 0x54, 0x0d, 0xaf, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbd, 0xa0, 0x12, 0xf5, 0x3d, 0xaa, 0xaf, 0xcd, 0xbe,
- 0x00, 0x73, 0xf9, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x00, 0xce, 0xb7, 0xbe, 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
- 0x00, 0x4a, 0x03, 0x3e, 0x54, 0xcb, 0x94, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
- 0x00, 0x6b, 0x90, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
- 0x00, 0x10, 0xd2, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
- 0x58, 0x4f, 0x49, 0xbe, 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
- 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0xd5, 0x19, 0x01, 0xbf,
- 0x60, 0x0d, 0x2f, 0x3d, 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0xd2, 0xbd,
- 0xa8, 0x4c, 0x26, 0xbe, 0xd4, 0xbe, 0x42, 0xbf, 0x00, 0xad, 0xaa, 0xbe,
- 0xaa, 0x4c, 0xa6, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x80, 0xda, 0x09, 0xbf,
- 0xaa, 0x8e, 0xc0, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0xce, 0xb7, 0xbe,
- 0x54, 0xcb, 0x94, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0x60, 0x0d, 0x2f, 0xbd, 0x58, 0xd3, 0x7d, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
- 0xaa, 0x0a, 0x8c, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x8c, 0x1d, 0x3e,
- 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
- 0x80, 0x0a, 0x0c, 0xbc, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0xa8, 0xd0, 0x5a, 0x3e, 0x54, 0x2e, 0xbc, 0xbe, 0x50, 0xd3, 0x7d, 0x3e,
- 0x00, 0x4a, 0x03, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xa0, 0x12, 0xf5, 0x3d,
- 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x8c, 0x1d, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
- 0xaa, 0x12, 0xf5, 0xbe, 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
- 0x58, 0x91, 0x63, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x31, 0xdf, 0x3e,
- 0xa8, 0x8e, 0xc0, 0x3e, 0x54, 0x70, 0xd6, 0xbe, 0x00, 0xce, 0x37, 0xbe,
- 0x00, 0x52, 0xec, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c, 0x50, 0x91, 0xe3, 0xbd,
- 0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x54, 0x4f, 0xc9, 0xbe,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
- 0x00, 0x10, 0xd2, 0xbd, 0x54, 0xcb, 0x94, 0xbe, 0xaa, 0x0a, 0x0c, 0xbf,
- 0x00, 0x52, 0xec, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0xce, 0x37, 0xbe,
- 0x00, 0x10, 0x52, 0x3e, 0x58, 0x91, 0x63, 0xbe, 0x58, 0x91, 0x63, 0xbe,
- 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x54, 0xd3, 0xfd, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x31, 0xdf, 0xbe,
- 0x58, 0xd3, 0x7d, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
- 0x00, 0x8c, 0x1d, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x4a, 0x83, 0x3e,
- 0x80, 0x0a, 0x0c, 0xbc, 0xc0, 0x0a, 0x8c, 0xbc, 0x58, 0x91, 0x63, 0xbe,
- 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
- 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x8c, 0x9d, 0x3d, 0x60, 0x0d, 0x2f, 0xbd,
- 0x58, 0x91, 0x63, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
- 0x80, 0x0a, 0x0c, 0xbc, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0xce, 0x37, 0xbe,
- 0x58, 0x0d, 0x2f, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0x12, 0x75, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d,
- 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x4a, 0x03, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d,
- 0xaa, 0x6d, 0xb3, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x50, 0x91, 0xe3, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x8c, 0x9d, 0xbe,
- 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0xef, 0xc4, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
- 0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x58, 0xcb, 0x14, 0xbe,
- 0xa0, 0x12, 0x75, 0x3d, 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x4a, 0x03, 0xbe,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
- 0xa8, 0x8e, 0xc0, 0x3e, 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
- 0x50, 0x91, 0xe3, 0xbd, 0x58, 0xd3, 0x7d, 0xbe, 0x54, 0xcb, 0x94, 0x3e,
- 0xb0, 0x0a, 0x8c, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0xce, 0x37, 0x3e,
- 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x8e, 0x40, 0xbe,
- 0x00, 0x6b, 0x90, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0x3c,
- 0x00, 0x4a, 0x03, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x54, 0x70, 0xd6, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0x4f, 0xc9, 0xbe,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e,
- 0x00, 0xce, 0x37, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x10, 0xd2, 0xbc,
- 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x52, 0x6c, 0xbe, 0xa8, 0x4c, 0xa6, 0x3e,
- 0xd5, 0x3a, 0x0e, 0xbf, 0x50, 0x91, 0xe3, 0xbd, 0x50, 0x91, 0xe3, 0x3d,
- 0x80, 0x0a, 0x0c, 0x3c, 0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x0d, 0xaf, 0x3d,
- 0x00, 0xce, 0xb7, 0xbe, 0xd5, 0x5b, 0x1b, 0xbf, 0x54, 0xcb, 0x94, 0xbe,
- 0x54, 0x0d, 0xaf, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x10, 0xd2, 0x3e,
- 0xa8, 0x12, 0x75, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0x60, 0x0d, 0x2f, 0xbd,
- 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x4a, 0x83, 0x3e, 0x00, 0xce, 0xb7, 0xbe,
- 0xa0, 0x0a, 0x0c, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c, 0xa0, 0x12, 0x75, 0xbd,
- 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x50, 0x91, 0xe3, 0x3d,
- 0x54, 0xb2, 0xf0, 0xbe, 0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
- 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
- 0x00, 0x10, 0x52, 0x3d, 0x7f, 0x5e, 0x3e, 0xbf, 0x50, 0x0d, 0xaf, 0xbd,
- 0x00, 0x10, 0x52, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0xb0, 0x12, 0xf5, 0xbd,
- 0x00, 0x4a, 0x03, 0x3e, 0xa8, 0x0a, 0x8c, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
- 0x7f, 0x1c, 0x24, 0xbf, 0x60, 0x0d, 0x2f, 0x3d, 0x2a, 0x7a, 0x05, 0xbf,
- 0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
- 0x00, 0x8c, 0x9d, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x58, 0xcb, 0x14, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
- 0xa8, 0xd0, 0x5a, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0xce, 0xb7, 0x3e,
- 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x6b, 0x90, 0x3e, 0x00, 0x10, 0x52, 0xbe,
- 0x00, 0x4a, 0x03, 0x3f, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
- 0xb0, 0x0a, 0x8c, 0xbd, 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
- 0x00, 0xce, 0x37, 0x3e, 0x50, 0x0d, 0x2f, 0x3e, 0xff, 0xac, 0x2a, 0xbf,
- 0xa8, 0xaf, 0xcd, 0x3e, 0x00, 0x8c, 0x9d, 0xbe, 0xff, 0x30, 0x5f, 0xbf,
- 0x54, 0xcb, 0x14, 0x3f, 0xa8, 0x8e, 0x40, 0x3e, 0x58, 0xcb, 0x14, 0xbe,
- 0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
- 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x10, 0x52, 0xbe,
- 0xaa, 0x12, 0xf5, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x0a, 0x0c, 0x3e,
- 0x00, 0x10, 0x52, 0x3d, 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe,
- 0x58, 0x91, 0x63, 0xbe, 0x00, 0x8c, 0x9d, 0x3d, 0x58, 0x91, 0x63, 0xbe,
- 0x00, 0x10, 0xd2, 0x3d, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0xd2, 0xbc,
- 0xa0, 0x12, 0x75, 0xbd, 0xaa, 0x2b, 0x19, 0x3f, 0xa8, 0x4c, 0x26, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x83, 0x3e, 0xd5, 0x3a, 0x0e, 0xbf,
- 0xa0, 0x12, 0xf5, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0xcb, 0x14, 0x3e,
- 0xa8, 0x12, 0x75, 0xbe, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x10, 0xd2, 0x3d,
- 0x50, 0x91, 0xe3, 0x3d, 0x00, 0xad, 0xaa, 0x3e, 0x50, 0x0d, 0xaf, 0x3d,
- 0x60, 0x0d, 0x2f, 0x3d, 0x54, 0x70, 0xd6, 0xbe, 0xa8, 0x4c, 0xa6, 0x3e,
- 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0x52, 0x3d,
- 0xb0, 0x8e, 0xc0, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0x54, 0xd3, 0xfd, 0xbe,
- 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x10, 0xd2, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
- 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0x00, 0x10, 0x52, 0x3d, 0x50, 0x91, 0x63, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
- 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x8e, 0x40, 0x3e, 0x50, 0x91, 0xe3, 0x3d,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x4a, 0x03, 0x3e,
- 0x80, 0x0a, 0x0c, 0x3c, 0x50, 0x91, 0xe3, 0x3d, 0xa0, 0x12, 0x75, 0x3d,
- 0x00, 0x10, 0x52, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
- 0x54, 0xcb, 0x94, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0x52, 0xbe,
- 0xb0, 0x12, 0xf5, 0xbd, 0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0x52, 0x3d,
- 0x60, 0x0d, 0x2f, 0x3d, 0x60, 0x0d, 0x2f, 0x3d, 0x54, 0x4f, 0xc9, 0xbe,
- 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
- 0x00, 0x10, 0xd2, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
- 0x58, 0x4f, 0x49, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0x52, 0xbe,
- 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0x52, 0xbe, 0x50, 0x0d, 0x2f, 0x3e,
- 0x54, 0x4f, 0xc9, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x50, 0xcb, 0x14, 0x3e,
- 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x31, 0xdf, 0x3e, 0xd4, 0xbe, 0x42, 0xbf,
- 0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x8e, 0x40, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
- 0x00, 0xce, 0xb7, 0xbe, 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x6b, 0x90, 0x3e,
- 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0x52, 0x3d, 0xa0, 0x0a, 0x0c, 0x3d,
- 0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
- 0xa0, 0x0a, 0x0c, 0x3d, 0x58, 0x91, 0x63, 0xbe, 0xaa, 0x8e, 0x40, 0xbf,
- 0x00, 0x8c, 0x1d, 0x3e, 0x7f, 0x7f, 0x4b, 0xbf, 0x00, 0x10, 0xd2, 0xbc,
- 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x10, 0x52, 0xbe,
- 0xaa, 0x8e, 0xc0, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0xb0, 0x12, 0xf5, 0xbd,
- 0xb0, 0x0a, 0x8c, 0x3d, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x6b, 0x90, 0xbe,
- 0x00, 0xce, 0x37, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x91, 0xe3, 0xbd,
- 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x10, 0x52, 0x3d, 0x50, 0xcb, 0x14, 0x3e,
- 0x54, 0xec, 0xa1, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe,
- 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x00, 0x10, 0xd2, 0xbc, 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x4c, 0xa6, 0xbe,
- 0x00, 0x52, 0x6c, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x8c, 0x1d, 0xbe,
- 0x00, 0x10, 0xd2, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x10, 0x52, 0x3d,
- 0x00, 0x31, 0xdf, 0xbe, 0xff, 0x0f, 0x52, 0xbf, 0x54, 0x70, 0xd6, 0x3e,
- 0x50, 0x0d, 0xaf, 0xbd, 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0xce, 0x37, 0x3e,
- 0x00, 0xce, 0x37, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
- 0xa0, 0x12, 0x75, 0x3d, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0x52, 0xbd,
- 0xb0, 0x8e, 0xc0, 0x3d, 0xa8, 0x6d, 0xb3, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
- 0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x12, 0x75, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
- 0x54, 0x0d, 0xaf, 0x3e, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x10, 0x52, 0x3d,
- 0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x50, 0x91, 0xe3, 0xbd,
- 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0x54, 0x0d, 0xaf, 0x3e,
- 0xa8, 0x4c, 0xa6, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
- 0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x0a, 0x8c, 0xbd, 0xaa, 0x12, 0xf5, 0xbe,
- 0x00, 0x10, 0x52, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x12, 0xf5, 0xbd,
- 0x58, 0x0d, 0x2f, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0xce, 0xb7, 0x3e,
- 0x00, 0x4a, 0x03, 0xbe, 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x10, 0x52, 0x3d,
- 0xa8, 0x4c, 0x26, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x8c, 0x9d, 0x3d,
- 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
- 0xaa, 0xaf, 0xcd, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x50, 0x4f, 0x49, 0x3e,
- 0x7f, 0xa0, 0x58, 0xbf, 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x6d, 0xb3, 0x3e,
- 0x54, 0x91, 0xe3, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x00, 0x52, 0x6c, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x4a, 0x03, 0xbe,
- 0xb0, 0x0a, 0x8c, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd, 0xa0, 0x12, 0xf5, 0x3d,
- 0x50, 0x0d, 0xaf, 0xbd, 0x54, 0xaa, 0x87, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
- 0x80, 0x0a, 0x0c, 0xbc, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x73, 0xf9, 0x3e, 0x50, 0x4f, 0x49, 0x3e, 0x54, 0xaa, 0x87, 0x3e,
- 0xd5, 0x19, 0x01, 0xbf, 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x4a, 0x83, 0xbe,
- 0x00, 0x4a, 0x83, 0x3e, 0x54, 0xcb, 0x94, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
- 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0xef, 0xc4, 0x3e, 0xa8, 0xaf, 0xcd, 0x3e,
- 0x00, 0x8c, 0x1d, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x00, 0x10, 0xd2, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
- 0xd5, 0x19, 0x01, 0xbf, 0x54, 0xec, 0xa1, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0xcb, 0x94, 0x3e, 0xb0, 0x12, 0xf5, 0xbd,
- 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x8c, 0x9d, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x10, 0xd2, 0x3c, 0x50, 0x0d, 0xaf, 0x3d,
- 0x50, 0x91, 0xe3, 0x3d, 0xa8, 0xd0, 0xda, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
- 0x58, 0x91, 0x63, 0xbe, 0xaa, 0xd0, 0xda, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
- 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
- 0x50, 0xcb, 0x14, 0x3e, 0x58, 0x4f, 0x49, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
- 0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0x3d,
- 0x7f, 0xfb, 0x16, 0xbf, 0x00, 0x4a, 0x03, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d,
- 0x00, 0x10, 0xd2, 0xbc, 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x91, 0x63, 0x3e,
- 0x00, 0x10, 0x52, 0x3d, 0x00, 0x8c, 0x1d, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
- 0x54, 0x70, 0x56, 0xbf, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x4a, 0x03, 0xbe,
- 0xc0, 0x0a, 0x8c, 0x3c, 0x54, 0x2e, 0xbc, 0x3e, 0xd5, 0x5b, 0x1b, 0xbf,
- 0xa8, 0x8e, 0x40, 0x3e, 0x54, 0x2e, 0xbc, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
- 0x00, 0x10, 0xd2, 0x3e, 0x00, 0x31, 0xdf, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
- 0x00, 0xef, 0xc4, 0x3e, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x10, 0x52, 0xbd, 0xd5, 0x7c, 0x28, 0xbf, 0x00, 0x4a, 0x83, 0x3e,
- 0x2a, 0x9b, 0x12, 0xbf, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0xbd,
- 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0xd5, 0x5b, 0x1b, 0xbf,
- 0x58, 0xcb, 0x14, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0x7f, 0x1c, 0x24, 0xbf,
- 0x2a, 0x7a, 0x05, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0xce, 0xb7, 0xbe,
- 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x10, 0xd2, 0x3c, 0xa8, 0xd0, 0x5a, 0xbe,
- 0xd5, 0x19, 0x01, 0xbf, 0xa8, 0x0a, 0x0c, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
- 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x8c, 0x1d, 0x3e,
- 0x58, 0x91, 0x63, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x50, 0xcb, 0x14, 0x3e,
- 0x00, 0x10, 0xd2, 0xbc, 0xaa, 0x4c, 0xa6, 0xbe, 0x54, 0xaa, 0x87, 0x3e,
- 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
- 0xc0, 0x0a, 0x8c, 0xbc, 0xaa, 0x8e, 0xc0, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
- 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0xaa, 0x0a, 0x0c, 0xbf,
- 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0xbc, 0x54, 0x91, 0xe3, 0x3e,
- 0xa0, 0x12, 0x75, 0x3d, 0x2a, 0x7a, 0x05, 0xbf, 0x00, 0x8c, 0x1d, 0x3e,
- 0x50, 0x91, 0xe3, 0xbd, 0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe,
- 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
- 0x00, 0x31, 0xdf, 0xbe, 0x54, 0x70, 0xd6, 0xbe, 0x00, 0x10, 0x52, 0xbe,
- 0x00, 0x4a, 0x03, 0xbf, 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x54, 0x70, 0xd6, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x31, 0xdf, 0x3e,
- 0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x55, 0xaa, 0x07, 0xbf,
- 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x10, 0xd2, 0xbd, 0xaa, 0xaf, 0x4d, 0xbf,
- 0x00, 0xad, 0xaa, 0x3e, 0x50, 0xd3, 0x7d, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x54, 0x2e, 0xbc, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d,
- 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x10, 0x52, 0x3d,
- 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe,
- 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0xef, 0xc4, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
- 0x00, 0xad, 0xaa, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0x52, 0xbe,
- 0x80, 0xfb, 0x16, 0x3f, 0x2a, 0x7a, 0x05, 0xbf, 0x54, 0xec, 0xa1, 0x3e,
- 0xa8, 0x0a, 0x0c, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
- 0x54, 0x70, 0xd6, 0xbe, 0x50, 0x0d, 0xaf, 0x3d, 0x54, 0xec, 0xa1, 0xbe,
- 0xaa, 0x0a, 0x8c, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc, 0x56, 0xaa, 0x87, 0xbe,
- 0xa0, 0x12, 0x75, 0x3d, 0x60, 0x0d, 0x2f, 0xbd, 0x58, 0x4f, 0x49, 0xbe,
- 0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0x58, 0xcb, 0x14, 0xbe,
- 0x54, 0x70, 0xd6, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
- 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0x50, 0x0d, 0x2f, 0x3e,
- 0x80, 0x0a, 0x0c, 0xbc, 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x0a, 0x8c, 0x3d,
- 0x54, 0xaa, 0x87, 0x3e, 0xa8, 0x8e, 0x40, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
- 0x00, 0xad, 0xaa, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x8c, 0x9d, 0xbd,
- 0xa8, 0x8e, 0x40, 0x3e, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xce, 0x37, 0xbe,
- 0x50, 0x0d, 0xaf, 0x3d, 0x80, 0x0a, 0x0c, 0xbc, 0xc0, 0x0a, 0x8c, 0x3c,
- 0x54, 0xcb, 0x94, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0xa0, 0x12, 0x75, 0xbd,
- 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x8c, 0x1d, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe,
- 0x80, 0x0a, 0x0c, 0xbc, 0x50, 0x0d, 0xaf, 0xbd, 0x50, 0x91, 0xe3, 0xbd,
- 0x00, 0x10, 0x52, 0x3e, 0x50, 0x91, 0x63, 0x3e, 0x50, 0xcb, 0x14, 0x3e,
- 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xaa, 0x6d, 0xb3, 0xbe,
- 0x00, 0x4a, 0x03, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
- 0xb0, 0x12, 0xf5, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0xd2, 0xbc,
- 0x60, 0x0d, 0x2f, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0x3e,
- 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x10, 0xd2, 0xbd, 0x54, 0xb2, 0xf0, 0x3e,
- 0x00, 0x10, 0xd2, 0x3c, 0x58, 0x91, 0x63, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
- 0x50, 0xd3, 0x7d, 0x3e, 0xa8, 0xd0, 0xda, 0x3e, 0x00, 0x10, 0x52, 0x3e,
- 0xa8, 0x0a, 0x0c, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d, 0x56, 0xaa, 0x87, 0xbe,
- 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x4a, 0x03, 0x3e,
- 0xa8, 0x12, 0xf5, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
- 0x00, 0xce, 0x37, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd, 0x54, 0xec, 0xa1, 0xbe,
- 0x00, 0x52, 0x6c, 0xbe, 0xaa, 0x0a, 0x0c, 0xbf, 0x00, 0x10, 0x52, 0xbe,
- 0x58, 0xcb, 0x14, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
- 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
- 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x8c, 0x9d, 0x3e,
- 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x10, 0xd2, 0xbe,
- 0x56, 0xaa, 0x87, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e, 0x58, 0x91, 0x63, 0xbe,
- 0x00, 0x10, 0x52, 0x3d, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x10, 0x52, 0xbd,
- 0xb0, 0x8e, 0xc0, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
- 0x54, 0xb2, 0xf0, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xce, 0xb7, 0xbe,
- 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x6b, 0x90, 0x3e, 0x00, 0x10, 0x52, 0x3d,
- 0x54, 0x91, 0xe3, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
- 0xb0, 0x8e, 0xc0, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
- 0xa0, 0x12, 0x75, 0x3d, 0x00, 0xce, 0x37, 0x3e, 0x58, 0x91, 0x63, 0xbe,
- 0x50, 0x91, 0xe3, 0xbd, 0x58, 0x4f, 0x49, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
- 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x8c, 0x1d, 0xbe,
- 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0xef, 0xc4, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
- 0x54, 0x0d, 0xaf, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
- 0x54, 0xec, 0xa1, 0x3e, 0x00, 0xad, 0xaa, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
- 0x54, 0x91, 0xe3, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0xad, 0xaa, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
- 0xb0, 0x12, 0xf5, 0xbd, 0x58, 0x4f, 0x49, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
- 0x00, 0x8c, 0x1d, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
- 0x58, 0x91, 0x63, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x8c, 0x9d, 0x3d,
- 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
- 0x50, 0x91, 0x63, 0x3e, 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0xce, 0x37, 0x3e,
- 0xa8, 0x4c, 0x26, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0xcb, 0x14, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd,
- 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x00, 0x73, 0xf9, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d,
- 0xb0, 0x12, 0xf5, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x80, 0x0a, 0x0c, 0x3c,
- 0xd5, 0x9d, 0x35, 0xbf, 0x58, 0xcb, 0x14, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
- 0x00, 0x10, 0x52, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x60, 0x0d, 0x2f, 0x3d,
- 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0xd0, 0xda, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
- 0x58, 0xcb, 0x14, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x58, 0x91, 0x63, 0xbe,
- 0x00, 0x73, 0xf9, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
- 0x54, 0x4f, 0xc9, 0x3e, 0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
- 0x00, 0x8c, 0x1d, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc, 0xa8, 0x12, 0x75, 0x3e,
- 0x00, 0x10, 0xd2, 0xbd, 0xaa, 0x2b, 0x99, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
- 0xa8, 0x6d, 0xb3, 0x3e, 0x54, 0xcb, 0x94, 0x3e, 0xa8, 0x12, 0x75, 0x3e,
- 0x54, 0x2e, 0xbc, 0x3e, 0xa0, 0x12, 0x75, 0x3d, 0xa8, 0x2b, 0x99, 0x3e,
- 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x4a, 0x83, 0x3e, 0x50, 0x0d, 0xaf, 0x3d,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0xad, 0xaa, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
- 0x50, 0x91, 0xe3, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
- 0xaa, 0x8e, 0x40, 0xbf, 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x91, 0x63, 0x3e,
- 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x31, 0xdf, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
- 0xa8, 0xf1, 0xe7, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0x52, 0xbe,
- 0xa8, 0x4c, 0xa6, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x9d, 0x3e,
- 0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0xd0, 0xda, 0x3e,
- 0xaa, 0x2b, 0x19, 0xbf, 0x00, 0xef, 0xc4, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e,
- 0x00, 0xce, 0x37, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0x54, 0xec, 0xa1, 0x3e,
- 0x00, 0x4a, 0x03, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0xd3, 0x7d, 0x3e,
- 0x00, 0xce, 0x37, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x9d, 0x3e,
- 0xa0, 0x0a, 0x0c, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x00, 0x00, 0x00,
- 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x4a, 0x03, 0x3e,
- 0xaa, 0x12, 0xf5, 0xbe, 0xaa, 0xd0, 0xda, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
- 0x00, 0x10, 0xd2, 0xbc, 0x00, 0xce, 0xb7, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
- 0xa8, 0x4c, 0x26, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0xa8, 0x12, 0x75, 0xbe,
- 0x00, 0x8c, 0x1d, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
- 0x00, 0x10, 0x52, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xaa, 0x4c, 0xa6, 0xbe,
- 0x58, 0x91, 0x63, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x00, 0xad, 0xaa, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0xce, 0x37, 0x3e,
- 0x00, 0x10, 0x52, 0xbd, 0x00, 0x8c, 0x9d, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
- 0x00, 0x10, 0x52, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0xa8, 0x0a, 0x8c, 0x3e,
- 0xff, 0xee, 0x44, 0xbf, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0xbc,
- 0xa8, 0x4c, 0x26, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x10, 0x52, 0xbd,
- 0x00, 0xce, 0xb7, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0x00, 0xce, 0x37, 0xbe,
- 0xb0, 0x8e, 0xc0, 0x3d, 0xaa, 0x12, 0xf5, 0xbe, 0x00, 0x10, 0x52, 0xbe,
- 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
- 0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0x60, 0x0d, 0x2f, 0xbd,
- 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x12, 0x75, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
- 0x54, 0xb2, 0xf0, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0x12, 0x75, 0x3e,
- 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0x3d,
- 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0xd2, 0xbe, 0xa8, 0x2b, 0x99, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xa8, 0x0a, 0x0c, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
- 0x58, 0x91, 0x63, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0x00, 0xce, 0x37, 0x3e,
- 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0xd3, 0xfd, 0xbe, 0x54, 0x2e, 0xbc, 0xbe,
- 0x00, 0x10, 0x52, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x58, 0x91, 0x63, 0xbe,
- 0x00, 0x4a, 0x83, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0x80, 0xda, 0x09, 0xbf,
- 0xa8, 0x4c, 0xa6, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x8c, 0x9d, 0xbd,
- 0xb0, 0x8e, 0xc0, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0xaa, 0x8e, 0x40, 0xbf,
- 0xa0, 0x0a, 0x0c, 0x3d, 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
- 0xa0, 0x0a, 0x0c, 0x3d, 0x58, 0xcb, 0x14, 0xbe, 0x50, 0x91, 0x63, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xa8, 0x12, 0x75, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
- 0x00, 0x8c, 0x1d, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
- 0xa8, 0x0a, 0x0c, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
- 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x10, 0x52, 0x3d, 0xc0, 0x0a, 0x8c, 0x3c,
- 0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0xce, 0x37, 0xbe,
- 0x7f, 0x5e, 0x3e, 0xbf, 0xaa, 0x4c, 0xa6, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
- 0x00, 0x10, 0xd2, 0x3c, 0x2a, 0x7a, 0x05, 0xbf, 0x50, 0xcb, 0x14, 0x3e,
- 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0xce, 0xb7, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
- 0x58, 0x91, 0x63, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
- 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x8e, 0x40, 0x3e, 0x55, 0xaa, 0x07, 0xbf,
- 0xaa, 0xd0, 0xda, 0xbe, 0x80, 0xda, 0x09, 0xbf, 0x00, 0x10, 0x52, 0xbd,
- 0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0x0d, 0xaf, 0xbe, 0x55, 0x2e, 0x3c, 0xbf,
- 0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x12, 0xf5, 0xbd, 0x50, 0x0d, 0x2f, 0x3e,
- 0x54, 0xd3, 0xfd, 0xbe, 0x7f, 0x3d, 0x31, 0xbf, 0xc0, 0x0a, 0x8c, 0xbc,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0xad, 0xaa, 0xbe,
- 0x54, 0xcb, 0x94, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0x7f, 0xfb, 0x16, 0xbf,
- 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
- 0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
- 0xaa, 0x4c, 0xa6, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x4a, 0x03, 0x3e,
- 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x10, 0xd2, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
- 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0x52, 0xbe, 0x50, 0xd3, 0x7d, 0x3e,
- 0x54, 0xd3, 0xfd, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0xaa, 0xaf, 0xcd, 0xbe,
- 0x00, 0xce, 0x37, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
- 0x54, 0xcb, 0x94, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
- 0x00, 0x52, 0x6c, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
- 0xa0, 0x0a, 0x0c, 0xbd, 0xc0, 0x0a, 0x8c, 0xbc, 0xa8, 0x4c, 0x26, 0xbe,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x80, 0xda, 0x09, 0xbf, 0x58, 0xcb, 0x14, 0xbe,
- 0xd5, 0x5b, 0x1b, 0xbf, 0xb0, 0x12, 0xf5, 0xbd, 0xd5, 0x19, 0x01, 0xbf,
- 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x4a, 0x83, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
- 0x58, 0x91, 0x63, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0x58, 0x4f, 0x49, 0xbe,
- 0x00, 0x52, 0x6c, 0x3e, 0x56, 0xaa, 0x87, 0xbe, 0x50, 0x0d, 0x2f, 0x3e,
- 0x00, 0x73, 0xf9, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
- 0x00, 0x10, 0x52, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e,
- 0x50, 0xd3, 0x7d, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x10, 0xd2, 0xbc,
- 0x50, 0x0d, 0xaf, 0x3d, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x10, 0xd2, 0x3d,
- 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x4a, 0x83, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
- 0xa0, 0x12, 0x75, 0x3d, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x8c, 0x9d, 0xbd,
- 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0xd5, 0x19, 0x01, 0xbf,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x58, 0x0d, 0x2f, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
- 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0x50, 0xcb, 0x14, 0x3e,
- 0xd5, 0x19, 0x01, 0xbf, 0x00, 0xce, 0x37, 0x3e, 0x50, 0x91, 0x63, 0x3e,
- 0xd5, 0x19, 0x01, 0xbf, 0x00, 0x10, 0xd2, 0x3c, 0x60, 0x0d, 0x2f, 0x3d,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x2a, 0x7a, 0x05, 0xbf, 0xaa, 0xaf, 0xcd, 0xbe,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e,
- 0xa8, 0xd0, 0xda, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
- 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
- 0x00, 0x10, 0xd2, 0x3e, 0x00, 0xce, 0x37, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc,
- 0x00, 0x10, 0xd2, 0x3d, 0xaa, 0x4c, 0xa6, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
- 0x00, 0x10, 0xd2, 0xbd, 0x58, 0x91, 0x63, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
- 0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0xd2, 0x3c,
- 0x00, 0x6b, 0x10, 0xbf, 0x54, 0xb2, 0xf0, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
- 0x00, 0x10, 0x52, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
- 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x6b, 0x10, 0xbf, 0x50, 0x0d, 0xaf, 0xbd,
- 0xa8, 0x4c, 0x26, 0x3e, 0x50, 0xd3, 0x7d, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0xaa, 0xd0, 0xda, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
- 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x4c, 0x26, 0x3e, 0x54, 0x2e, 0xbc, 0xbe,
- 0x54, 0xec, 0xa1, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x00, 0xce, 0x37, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
- 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0x8e, 0x40, 0x3e, 0x7f, 0x3d, 0x31, 0xbf,
- 0x00, 0x4a, 0x03, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xa0, 0x12, 0x75, 0xbd,
- 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0xd2, 0x3c,
- 0x00, 0x8c, 0x9d, 0x3d, 0xa0, 0x12, 0x75, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x00, 0x8c, 0x9d, 0xbd, 0xb0, 0x12, 0xf5, 0xbd, 0xa8, 0x2b, 0x99, 0x3e,
- 0xaa, 0x2b, 0x19, 0xbf, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x8c, 0x9d, 0x3e,
- 0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x91, 0xe3, 0x3d, 0xaa, 0x6d, 0xb3, 0xbe,
- 0x50, 0xd3, 0x7d, 0x3e, 0x00, 0x10, 0xd2, 0xbc, 0xaa, 0xf1, 0xe7, 0xbe,
- 0xa8, 0x12, 0x75, 0xbe, 0x2a, 0xdd, 0x2c, 0xbf, 0xa0, 0x12, 0x75, 0xbd,
- 0x00, 0xce, 0x37, 0x3e, 0x00, 0xad, 0xaa, 0x3e, 0x54, 0x2e, 0xbc, 0xbe,
- 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x8c, 0x1d, 0x3e,
- 0x00, 0x4a, 0x03, 0x3e, 0xaa, 0xaf, 0x4d, 0xbf, 0x00, 0xef, 0xc4, 0xbe,
- 0x00, 0x52, 0x6c, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0xa8, 0x4c, 0x26, 0xbe,
- 0x50, 0xd3, 0x7d, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
- 0xa8, 0x0a, 0x0c, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x10, 0x52, 0x3d,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0xad, 0xaa, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e,
- 0xa0, 0x12, 0x75, 0x3d, 0x50, 0xcb, 0x14, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
- 0xa8, 0x12, 0x75, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x56, 0xaa, 0x87, 0xbe,
- 0x50, 0x91, 0x63, 0x3e, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0x58, 0x91, 0x63, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0x58, 0xcb, 0x14, 0xbe,
- 0xb0, 0x0a, 0x8c, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0x8e, 0x40, 0xbe,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x10, 0x52, 0x3d,
- 0x00, 0x10, 0x52, 0xbd, 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
- 0x00, 0x52, 0x6c, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0xa0, 0x12, 0xf5, 0x3d,
- 0xa8, 0x12, 0x75, 0xbe, 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x8e, 0x40, 0xbe,
- 0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xa0, 0x12, 0x75, 0xbd,
- 0xb0, 0x0a, 0x8c, 0xbd, 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0xd0, 0x5a, 0x3e,
- 0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0xa8, 0x12, 0x75, 0xbe,
- 0x00, 0xce, 0x37, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x4a, 0x03, 0xbe,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x55, 0xcb, 0x14, 0xbf, 0x00, 0x6b, 0x90, 0xbe,
- 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
- 0x80, 0x0a, 0x0c, 0xbc, 0x58, 0xcb, 0x14, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
- 0xaa, 0x2b, 0x99, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
- 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
- 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
- 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0xce, 0x37, 0x3e, 0xaa, 0x12, 0xf5, 0xbe,
- 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x4c, 0x26, 0xbe,
- 0xa8, 0x8e, 0x40, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x54, 0xaa, 0x87, 0x3e,
- 0x50, 0xcb, 0x14, 0x3e, 0x54, 0x2e, 0xbc, 0xbe, 0xa8, 0x4c, 0xa6, 0x3e,
- 0xa8, 0x4c, 0x26, 0xbe, 0xd5, 0x5b, 0x1b, 0xbf, 0x00, 0x10, 0xd2, 0x3d,
- 0x60, 0x0d, 0x2f, 0x3d, 0xb0, 0x0a, 0x8c, 0x3d, 0x58, 0x91, 0x63, 0xbe,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0xbd, 0x2a, 0xbc, 0x1f, 0xbf,
- 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x52, 0x6c, 0x3e, 0xaa, 0xf1, 0xe7, 0xbe,
- 0x00, 0x10, 0xd2, 0xbd, 0x00, 0xce, 0x37, 0x3e, 0x00, 0x31, 0xdf, 0xbe,
- 0x58, 0xd3, 0x7d, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
- 0x58, 0x4f, 0x49, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0xaa, 0xf1, 0xe7, 0xbe,
- 0x00, 0xce, 0x37, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
- 0x00, 0x10, 0x52, 0x3e, 0xaa, 0x4c, 0x26, 0xbf, 0x80, 0x0a, 0x0c, 0xbc,
- 0x7f, 0x1c, 0x24, 0xbf, 0x00, 0x4a, 0x83, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
- 0x54, 0x4f, 0xc9, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x4a, 0x83, 0x3e,
- 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x8c, 0x9d, 0x3d, 0x54, 0xd3, 0xfd, 0xbe,
- 0x00, 0xce, 0x37, 0x3e, 0xaa, 0x2b, 0x99, 0xbe, 0x58, 0x91, 0x63, 0xbe,
- 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x9d, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
- 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x10, 0xd2, 0xbd, 0x58, 0xcb, 0x14, 0xbe,
- 0xaa, 0x0a, 0x0c, 0xbf, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0xef, 0xc4, 0xbe,
- 0xff, 0x8b, 0x1d, 0xbf, 0xa8, 0x12, 0x75, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
- 0x00, 0x31, 0xdf, 0x3e, 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x10, 0xd2, 0xbd,
- 0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0x12, 0xf5, 0x3e, 0xa8, 0x8e, 0x40, 0xbe,
- 0xa8, 0xd0, 0x5a, 0xbe, 0x54, 0x2e, 0xbc, 0xbe, 0x58, 0x91, 0x63, 0xbe,
- 0x00, 0x10, 0x52, 0x3d, 0x55, 0x2e, 0x3c, 0xbf, 0x00, 0xce, 0x37, 0x3e,
- 0x00, 0x8c, 0x1d, 0xbe, 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x6b, 0x90, 0xbe,
- 0x00, 0x8c, 0x1d, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x58, 0x0d, 0x2f, 0xbe, 0x54, 0x70, 0xd6, 0xbe,
- 0xaa, 0x4c, 0xa6, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x10, 0xd2, 0xbc,
- 0x00, 0x52, 0xec, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
- 0xa8, 0xf1, 0x67, 0x3f, 0x60, 0x0d, 0x2f, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d,
- 0x58, 0x0d, 0x2f, 0xbe, 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
- 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0x8c, 0x9d, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d,
- 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x52, 0xec, 0x3e, 0x7f, 0x5e, 0x3e, 0xbf,
- 0xa8, 0x0a, 0x8c, 0x3e, 0x56, 0xaa, 0x87, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x00, 0x4a, 0x83, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0x58, 0x4f, 0x49, 0xbe,
- 0x00, 0x4a, 0x03, 0x3e, 0x54, 0x2e, 0xbc, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe,
- 0x58, 0xcb, 0x14, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0x91, 0xe3, 0x3d,
- 0xa0, 0x12, 0x75, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d, 0x58, 0x91, 0x63, 0xbe,
- 0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
- 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x10, 0x52, 0xbe, 0x54, 0xec, 0xa1, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbe, 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x10, 0x52, 0x3d,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
- 0xb0, 0x0a, 0x8c, 0x3d, 0x58, 0xcb, 0x14, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
- 0xc0, 0x0a, 0x8c, 0x3c, 0x80, 0x0a, 0x0c, 0x3c, 0x58, 0x0d, 0x2f, 0xbe,
- 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0xbe, 0x55, 0xaa, 0x07, 0xbf,
- 0xa8, 0x4c, 0x26, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d,
- 0x54, 0xcb, 0x94, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0x2a, 0x7a, 0x05, 0x3f,
- 0x2a, 0x9b, 0x12, 0xbf, 0x00, 0xce, 0xb7, 0xbe, 0x50, 0x0d, 0xaf, 0xbd,
- 0xa8, 0x12, 0x75, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
- 0x00, 0x4a, 0x83, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x4f, 0x49, 0x3e,
- 0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x8c, 0x9d, 0x3d,
- 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0x52, 0xbe, 0x54, 0xaa, 0x07, 0x3f,
- 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x54, 0xaa, 0x87, 0x3e,
- 0x00, 0x10, 0x52, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x2a, 0x7a, 0x05, 0xbf,
- 0xa8, 0xd0, 0x5a, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0xce, 0x37, 0x3e,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xef, 0xc4, 0x3e,
- 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x4a, 0x83, 0x3e, 0x58, 0xd3, 0x7d, 0xbe,
- 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
- 0xaa, 0x0a, 0x8c, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe,
- 0x54, 0xec, 0xa1, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x7f, 0xfb, 0x16, 0xbf,
- 0xa0, 0x0a, 0x0c, 0x3d, 0xa0, 0x12, 0x75, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d,
- 0x54, 0x0d, 0xaf, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0x3d,
- 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x4a, 0x03, 0xbe, 0x50, 0x0d, 0xaf, 0x3d,
- 0x50, 0x91, 0xe3, 0x3d, 0x50, 0x91, 0xe3, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
- 0x54, 0xcb, 0x94, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0x0d, 0xaf, 0x3e,
- 0xa8, 0x4c, 0x26, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x50, 0x91, 0x63, 0x3e,
- 0x80, 0x0a, 0x0c, 0xbc, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xce, 0xb7, 0x3e,
- 0xa8, 0x12, 0x75, 0x3e, 0xa8, 0x8e, 0x40, 0x3e, 0x54, 0xec, 0xa1, 0x3e,
- 0xd4, 0x3a, 0x0e, 0x3f, 0xb0, 0x0a, 0x8c, 0x3d, 0xb0, 0x0a, 0x8c, 0x3d,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0xd3, 0x7d, 0x3e, 0xa8, 0x4c, 0x26, 0x3e,
- 0x00, 0x52, 0x6c, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0x7f, 0x7f, 0x4b, 0xbf,
- 0x00, 0x10, 0xd2, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0xce, 0xb7, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
- 0x00, 0x10, 0xd2, 0xbd, 0xaa, 0x12, 0xf5, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
- 0xaa, 0x2b, 0x99, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0xb0, 0x0a, 0x8c, 0x3d,
- 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0xd2, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
- 0x58, 0x91, 0x63, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x54, 0x4f, 0xc9, 0xbe,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x10, 0x52, 0x3e, 0x2a, 0x82, 0x6e, 0xbf,
- 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x4c, 0x26, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
- 0x50, 0xd3, 0x7d, 0x3e, 0x00, 0x10, 0xd2, 0x3d, 0xaa, 0x6d, 0xb3, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0xce, 0x37, 0x3e,
- 0x50, 0x91, 0x63, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x8c, 0x9d, 0xbe,
- 0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e,
- 0x50, 0x91, 0xe3, 0xbd, 0xaa, 0xf1, 0xe7, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
- 0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x00, 0x8c, 0x9d, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0xad, 0xaa, 0x3e,
- 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x4a, 0x03, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
- 0x58, 0x91, 0x63, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x8c, 0x9d, 0x3d,
- 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0xec, 0xa1, 0xbe, 0x00, 0x8c, 0x9d, 0x3e,
- 0x55, 0xaa, 0x07, 0xbf, 0xa0, 0x12, 0x75, 0xbd, 0xa8, 0x0a, 0x0c, 0xbe,
- 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x52, 0x6c, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c,
- 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x8e, 0x40, 0xbe, 0x7f, 0x1c, 0x24, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x0d, 0xaf, 0x3d,
- 0x54, 0xcb, 0x94, 0xbe, 0x50, 0xd3, 0x7d, 0x3e, 0x54, 0xaa, 0x87, 0x3e,
- 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe,
- 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x2b, 0x99, 0x3e,
- 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x8c, 0x1d, 0xbe, 0xa8, 0x8e, 0x40, 0x3e,
- 0x50, 0x91, 0xe3, 0xbd, 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x4c, 0x26, 0x3e,
- 0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x8c, 0x9d, 0x3e, 0x60, 0x0d, 0x2f, 0x3d,
- 0xa0, 0x12, 0xf5, 0x3d, 0x54, 0x0d, 0xaf, 0xbe, 0x55, 0xcb, 0x14, 0xbf,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0xad, 0xaa, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
- 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x4a, 0x03, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
- 0x54, 0xcb, 0x14, 0x3f, 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x52, 0x6c, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0x52, 0x3d, 0xa8, 0x8e, 0x40, 0x3e,
- 0x50, 0x91, 0x63, 0x3e, 0x58, 0x4f, 0x49, 0xbe, 0xff, 0x30, 0x5f, 0xbf,
- 0x00, 0xef, 0xc4, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0x54, 0x2e, 0xbc, 0x3e,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x10, 0xd2, 0xbc, 0x50, 0xd3, 0x7d, 0x3e,
- 0x00, 0x10, 0x52, 0x3d, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x52, 0x6c, 0xbe,
- 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0x58, 0x91, 0x63, 0xbe,
- 0xa8, 0x8e, 0x40, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d,
- 0x54, 0x4f, 0xc9, 0x3e, 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x2b, 0x99, 0x3e,
- 0xc0, 0x0a, 0x8c, 0xbc, 0xa8, 0x12, 0x75, 0xbe, 0x54, 0x0d, 0xaf, 0x3e,
- 0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x0d, 0xaf, 0xbd, 0xa0, 0x12, 0x75, 0xbd,
- 0x00, 0x8c, 0x9d, 0xbd, 0x50, 0x4f, 0x49, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d,
- 0x00, 0x52, 0x6c, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x4a, 0x03, 0x3e,
- 0x00, 0x4a, 0x83, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x00, 0x10, 0x52, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x58, 0x91, 0x63, 0xbe,
- 0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
- 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x4a, 0x03, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
- 0xb0, 0x8e, 0xc0, 0x3d, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x4a, 0x03, 0xbe,
- 0x54, 0x91, 0xe3, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0xd2, 0xbd,
- 0xa8, 0x12, 0x75, 0xbe, 0xa8, 0xaf, 0xcd, 0x3e, 0x00, 0x31, 0xdf, 0x3e,
- 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x52, 0xec, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
- 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
- 0x54, 0x4f, 0xc9, 0xbe, 0x00, 0xad, 0xaa, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
- 0x00, 0x10, 0x52, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e,
- 0xa0, 0x12, 0x75, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c, 0x58, 0x4f, 0x49, 0xbe,
- 0xa8, 0x4c, 0xa6, 0x3e, 0xff, 0x8b, 0x1d, 0xbf, 0xa0, 0x12, 0x75, 0x3d,
- 0x00, 0xef, 0xc4, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0x8e, 0x40, 0x3e,
- 0xaa, 0x0a, 0x8c, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x10, 0x52, 0xbe,
- 0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x10, 0x52, 0x3d,
- 0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x10, 0xd2, 0x3d,
- 0x2a, 0xfe, 0x39, 0xbf, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x8c, 0x9d, 0x3d,
- 0x00, 0x10, 0x52, 0x3d, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0xd2, 0x3d,
- 0x00, 0x4a, 0x83, 0x3e, 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x6b, 0x10, 0xbf,
- 0xaa, 0xaf, 0xcd, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
- 0x00, 0x10, 0xd2, 0xbd, 0x00, 0xce, 0x37, 0x3e, 0xaa, 0x12, 0xf5, 0xbe,
- 0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
- 0xa8, 0xd0, 0x5a, 0x3e, 0x58, 0xcb, 0x14, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
- 0xa0, 0x0a, 0x0c, 0x3d, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0x3c,
- 0x00, 0x8c, 0x1d, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x6b, 0x90, 0x3e,
- 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xb0, 0x8e, 0xc0, 0x3d,
- 0x00, 0x10, 0xd2, 0x3c, 0x56, 0xaa, 0x87, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
- 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0x50, 0x4f, 0x49, 0x3e,
- 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x10, 0xd2, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc,
- 0xb0, 0x8e, 0xc0, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe, 0x54, 0x91, 0xe3, 0xbe,
- 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x12, 0x75, 0x3e, 0xa8, 0x4c, 0x26, 0x3e,
- 0x00, 0xce, 0xb7, 0x3e, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x8c, 0x1d, 0x3e,
- 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e,
- 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0xaa, 0x2b, 0x99, 0xbe,
- 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x4a, 0x03, 0xbf, 0x00, 0x4a, 0x83, 0xbe,
- 0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x6b, 0x90, 0xbe,
- 0xa8, 0xd0, 0x5a, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x10, 0x52, 0x3e,
- 0x00, 0x10, 0x52, 0xbd, 0x00, 0x4a, 0x83, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
- 0xaa, 0x4c, 0xa6, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0x58, 0x91, 0x63, 0xbe,
- 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x8c, 0x9d, 0x3d,
- 0x58, 0x91, 0x63, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
- 0x54, 0xcb, 0x94, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
- 0x00, 0xce, 0x37, 0x3e, 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x00, 0xce, 0x37, 0x3e, 0xa8, 0x0a, 0x8c, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd,
- 0xb0, 0x8e, 0xc0, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x52, 0xec, 0xbe,
- 0xb0, 0x8e, 0xc0, 0x3d, 0xb0, 0x12, 0xf5, 0xbd, 0xb0, 0x12, 0xf5, 0xbd,
- 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0xaa, 0xf1, 0xe7, 0xbe,
- 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xdf, 0x3e,
- 0x55, 0xcb, 0x14, 0xbf, 0x80, 0x0a, 0x0c, 0xbc, 0x54, 0xd3, 0xfd, 0xbe,
- 0xd4, 0x3a, 0x0e, 0x3f, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x8c, 0x9d, 0xbd,
- 0x60, 0x0d, 0x2f, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0x54, 0xec, 0xa1, 0x3e,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x58, 0x91, 0x63, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc,
- 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0xef, 0xc4, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
- 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x4a, 0x83, 0xbe,
- 0xa0, 0x12, 0x75, 0xbd, 0x00, 0xad, 0xaa, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
- 0xa8, 0xd0, 0x5a, 0x3e, 0x56, 0xaa, 0x87, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
- 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
- 0x00, 0x4a, 0x03, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
- 0x54, 0x70, 0xd6, 0xbe, 0x50, 0xd3, 0x7d, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
- 0x00, 0x10, 0xd2, 0xbd, 0x58, 0xd3, 0x7d, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
- 0xa8, 0x0a, 0x0c, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x10, 0x52, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbd, 0x54, 0x4f, 0xc9, 0x3e, 0x50, 0x0d, 0x2f, 0x3e,
- 0xa0, 0x0a, 0x0c, 0x3d, 0xa0, 0x12, 0x75, 0x3d, 0x54, 0xec, 0xa1, 0xbe,
- 0x50, 0x0d, 0xaf, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x00, 0xad, 0xaa, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
- 0x56, 0xaa, 0x87, 0xbe, 0x00, 0xef, 0xc4, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
- 0x00, 0xce, 0x37, 0x3e, 0x56, 0xaa, 0x87, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
- 0x00, 0x4a, 0x83, 0x3e, 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0x2e, 0xbc, 0xbe,
- 0xaa, 0x4c, 0xa6, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0x50, 0x91, 0xe3, 0xbd,
- 0x00, 0xce, 0x37, 0xbe, 0xb0, 0x12, 0xf5, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe,
- 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0xa0, 0x12, 0x75, 0x3d,
- 0x00, 0xce, 0x37, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
- 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0xad, 0xaa, 0x3e, 0xaa, 0xaf, 0xcd, 0xbe,
- 0x00, 0x10, 0xd2, 0xbc, 0xa0, 0x0a, 0x0c, 0xbd, 0xa0, 0x12, 0x75, 0x3d,
- 0x00, 0x6b, 0x90, 0xbe, 0x54, 0xaa, 0x07, 0x3f, 0x00, 0x10, 0x52, 0xbe,
- 0x58, 0x4f, 0x49, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x52, 0x6c, 0x3e,
- 0x80, 0x0a, 0x0c, 0x3c, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x10, 0x52, 0x3d,
- 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0xec, 0xa1, 0x3e, 0xa0, 0x12, 0x75, 0xbd,
- 0x00, 0x10, 0xd2, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x8e, 0x40, 0x3e,
- 0xa8, 0xaf, 0xcd, 0x3e, 0xc0, 0x0a, 0x8c, 0xbc, 0xb0, 0x12, 0xf5, 0xbd,
- 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0xad, 0xaa, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
- 0x00, 0x10, 0xd2, 0x3d, 0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0x8e, 0x40, 0x3e,
- 0x50, 0xcb, 0x14, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x4c, 0x26, 0x3e,
- 0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0xa8, 0x4c, 0xa6, 0x3e, 0x00, 0x8c, 0x1d, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
- 0x00, 0xce, 0x37, 0xbe, 0x00, 0x6b, 0x10, 0x3f, 0xd4, 0x5b, 0x1b, 0x3f,
- 0x58, 0x0d, 0x2f, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d, 0xc0, 0x0a, 0x8c, 0x3c,
- 0x50, 0xd3, 0x7d, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d, 0xa0, 0x0a, 0x0c, 0x3d,
- 0xa8, 0xf1, 0xe7, 0x3e, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x4a, 0x03, 0x3e,
- 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x52, 0x6c, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
- 0xb0, 0x8e, 0xc0, 0xbd, 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x6b, 0x90, 0xbe,
- 0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0x58, 0x91, 0x63, 0xbe,
- 0x50, 0xcb, 0x14, 0x3e, 0x00, 0x10, 0x52, 0xbd, 0xa0, 0x12, 0x75, 0x3d,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x80, 0x0a, 0x0c, 0x3c, 0x80, 0x0a, 0x0c, 0xbc,
- 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0x55, 0xaa, 0x07, 0xbf,
- 0xa0, 0x12, 0xf5, 0x3d, 0xa0, 0x12, 0x75, 0x3d, 0x54, 0xcb, 0x94, 0x3e,
- 0x50, 0xd3, 0x7d, 0x3e, 0x00, 0x6b, 0x10, 0xbf, 0x00, 0x10, 0xd2, 0xbd,
- 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x31, 0xdf, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
- 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
- 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
- 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0xf1, 0xe7, 0x3e, 0x00, 0x10, 0x52, 0xbe,
- 0x54, 0xd3, 0xfd, 0x3e, 0xaa, 0x0a, 0x8c, 0xbe, 0x80, 0x0a, 0x0c, 0x3c,
- 0x00, 0x10, 0x52, 0xbd, 0x54, 0x4f, 0xc9, 0x3e, 0x2a, 0xfe, 0x39, 0xbf,
- 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0xc0, 0x0a, 0x8c, 0xbc,
- 0xaa, 0x4c, 0xa6, 0xbe, 0xd5, 0x3a, 0x0e, 0xbf, 0xa0, 0x12, 0xf5, 0x3d,
- 0x54, 0xcb, 0x94, 0x3e, 0xaa, 0x0a, 0x0c, 0x3f, 0xa0, 0x0a, 0x0c, 0x3d,
- 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x12, 0xf5, 0x3d,
- 0x00, 0x10, 0x52, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x54, 0xaa, 0x87, 0x3e,
- 0x50, 0x4f, 0x49, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
- 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x73, 0xf9, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
- 0xb0, 0x0a, 0x8c, 0xbd, 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x4a, 0x03, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0xd5, 0x5b, 0x1b, 0xbf, 0x58, 0x0d, 0x2f, 0xbe,
- 0xa8, 0x4c, 0xa6, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0x52, 0xbd,
- 0x54, 0x0d, 0xaf, 0x3e, 0x00, 0x10, 0xd2, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
- 0x50, 0x4f, 0x49, 0x3e, 0x7f, 0x3d, 0x31, 0xbf, 0x50, 0x91, 0xe3, 0xbd,
- 0x00, 0x10, 0xd2, 0x3e, 0x54, 0x91, 0xe3, 0xbe, 0x54, 0x0d, 0xaf, 0x3e,
- 0x00, 0x10, 0x52, 0xbd, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x8c, 0x1d, 0xbe,
- 0x00, 0x8c, 0x9d, 0x3d, 0x54, 0xcb, 0x94, 0x3e, 0xaa, 0xf1, 0xe7, 0xbe,
- 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x00, 0xce, 0x37, 0xbe,
- 0x50, 0x0d, 0xaf, 0xbd, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x8c, 0x9d, 0xbd,
- 0xaa, 0x2b, 0x19, 0xbf, 0xaa, 0x2b, 0x99, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
- 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x10, 0x52, 0x3d, 0x00, 0x10, 0xd2, 0x3c,
- 0x50, 0x0d, 0xaf, 0xbd, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x4a, 0x03, 0xbe,
- 0xb0, 0x0a, 0x8c, 0x3d, 0x2a, 0xbc, 0x9f, 0xbf, 0x50, 0x91, 0xe3, 0x3d,
- 0x60, 0x0d, 0x2f, 0xbd, 0x54, 0x91, 0xe3, 0xbe, 0xa8, 0xaf, 0xcd, 0x3e,
- 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0x52, 0x3d,
- 0xaa, 0x8e, 0xc0, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0xd4, 0x42, 0x77, 0xbf,
- 0x00, 0x10, 0x52, 0x3e, 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x10, 0x52, 0xbd,
- 0x58, 0xd3, 0x7d, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0xef, 0xc4, 0x3e,
- 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
- 0x2a, 0x9b, 0x12, 0xbf, 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0x4c, 0x26, 0x3e,
- 0xaa, 0x12, 0xf5, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x54, 0x0d, 0xaf, 0x3e,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x10, 0xd2, 0xbd,
- 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0x52, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
- 0xd5, 0x19, 0x01, 0xbf, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
- 0xa8, 0xd0, 0xda, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0x58, 0x91, 0x63, 0xbe,
- 0xa8, 0xd0, 0x5a, 0x3e, 0xaa, 0x2b, 0x19, 0xbf, 0xa8, 0x6d, 0xb3, 0x3e,
- 0x80, 0x0a, 0x0c, 0x3c, 0x7f, 0x1c, 0x24, 0xbf, 0x00, 0xad, 0xaa, 0x3e,
- 0xb0, 0x8e, 0xc0, 0x3d, 0x00, 0x8c, 0x1d, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
- 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x58, 0xcb, 0x14, 0xbe,
- 0xa0, 0x0a, 0x0c, 0xbd, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x10, 0xd2, 0x3d,
- 0x50, 0x91, 0xe3, 0x3d, 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0x4f, 0xc9, 0xbe,
- 0x00, 0x52, 0x6c, 0xbe, 0x58, 0xd3, 0x7d, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
- 0xd5, 0x5b, 0x1b, 0xbf, 0xa0, 0x12, 0x75, 0x3d, 0xaa, 0x4c, 0xa6, 0xbe,
- 0x54, 0x4f, 0xc9, 0xbe, 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x4a, 0x83, 0x3e,
- 0x55, 0xaa, 0x07, 0xbf, 0x00, 0x52, 0x6c, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
- 0x50, 0x0d, 0xaf, 0x3d, 0xa0, 0x0a, 0x0c, 0x3d, 0x54, 0x70, 0xd6, 0x3e,
- 0x2a, 0xbc, 0x1f, 0xbf, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
- 0xa8, 0x8e, 0x40, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0xb0, 0x12, 0xf5, 0xbd,
- 0x55, 0x0d, 0x2f, 0xbf, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x4a, 0x03, 0xbe,
- 0x00, 0x52, 0x6c, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd, 0x80, 0x0a, 0x0c, 0xbc,
- 0x00, 0x00, 0x00, 0x00, 0xa0, 0x12, 0x75, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
- 0x00, 0x10, 0x52, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0xd4, 0xdf, 0x4f, 0xbf,
- 0x00, 0x4a, 0x03, 0x3e, 0xaa, 0xf1, 0xe7, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
- 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
- 0x00, 0x4a, 0x03, 0x3e, 0x58, 0xd3, 0x7d, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x54, 0xec, 0xa1, 0x3e, 0x54, 0xaa, 0x87, 0x3e, 0x00, 0x10, 0x52, 0x3e,
- 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0xce, 0xb7, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe,
- 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x31, 0xdf, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x55, 0xec, 0x21, 0xbf, 0xaa, 0xaf, 0xcd, 0xbe, 0x54, 0x70, 0xd6, 0xbe,
- 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x4a, 0x03, 0xbe,
- 0x58, 0x91, 0x63, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x8c, 0x9d, 0xbd,
- 0xaa, 0x0a, 0x8c, 0xbe, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
- 0x50, 0x91, 0xe3, 0xbd, 0xb0, 0x12, 0xf5, 0xbd, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x50, 0x91, 0xe3, 0x3d, 0x50, 0x0d, 0xaf, 0xbd, 0x60, 0x0d, 0x2f, 0xbd,
- 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x54, 0x0d, 0xaf, 0xbe, 0x54, 0x70, 0xd6, 0xbe, 0x54, 0x70, 0xd6, 0xbe,
- 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0xa0, 0x12, 0x75, 0xbd,
- 0x58, 0x0d, 0x2f, 0xbe, 0x2a, 0xbc, 0x1f, 0xbf, 0x00, 0x4a, 0x03, 0xbe,
- 0xa8, 0x12, 0x75, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd, 0x54, 0xcb, 0x94, 0xbe,
- 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0x52, 0x3d,
- 0x54, 0x2e, 0xbc, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
- 0x00, 0x4a, 0x03, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
- 0x50, 0x0d, 0xaf, 0x3d, 0x50, 0x0d, 0xaf, 0x3d, 0x54, 0xec, 0xa1, 0xbe,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x54, 0x91, 0xe3, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
- 0x00, 0x73, 0xf9, 0x3e, 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x4a, 0x83, 0x3e,
- 0x00, 0x10, 0x52, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
- 0xd5, 0x19, 0x01, 0xbf, 0xaa, 0xd0, 0xda, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0x00, 0x10, 0x52, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
- 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x8c, 0x9d, 0x3d, 0xa0, 0x12, 0x75, 0x3d,
- 0xaa, 0x4c, 0xa6, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0x58, 0xd3, 0x7d, 0xbe,
- 0xd4, 0x3a, 0x0e, 0x3f, 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x8e, 0x40, 0x3e,
- 0xaa, 0x0a, 0x8c, 0xbe, 0x54, 0x0d, 0xaf, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
- 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x2b, 0x99, 0x3e,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x60, 0x0d, 0x2f, 0xbd, 0xd5, 0x3a, 0x0e, 0xbf,
- 0xa0, 0x12, 0x75, 0x3d, 0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x8c, 0x9d, 0x3d,
- 0x58, 0x0d, 0x2f, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e,
- 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x6b, 0x90, 0xbe,
- 0x54, 0xcb, 0x94, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0xd2, 0xbc,
- 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0x00, 0x4a, 0x03, 0x3e,
- 0x50, 0x91, 0xe3, 0xbd, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x10, 0x52, 0xbe,
- 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x6b, 0x10, 0xbf, 0x60, 0x0d, 0x2f, 0x3d,
- 0x80, 0x0a, 0x0c, 0x3c, 0x58, 0x91, 0x63, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
- 0x00, 0x10, 0xd2, 0xbc, 0xaa, 0x2b, 0x99, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe,
- 0xd5, 0x5b, 0x1b, 0xbf, 0x00, 0x4a, 0x03, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x54, 0x4f, 0xc9, 0xbe, 0x54, 0xb2, 0xf0, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
- 0x60, 0x0d, 0x2f, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
- 0x50, 0x91, 0xe3, 0xbd, 0x50, 0xcb, 0x14, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd,
- 0xa8, 0x4c, 0x26, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0x54, 0x4f, 0xc9, 0xbe,
- 0x00, 0x10, 0xd2, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x50, 0x4f, 0x49, 0x3e,
- 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x31, 0xdf, 0xbe,
- 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x4a, 0x83, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
- 0x54, 0xec, 0xa1, 0x3e, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0xef, 0xc4, 0xbe,
- 0x54, 0xd3, 0xfd, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x12, 0x75, 0xbe,
- 0xaa, 0xaf, 0xcd, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd, 0xaa, 0x8e, 0xc0, 0xbe,
- 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x4a, 0x83, 0x3e, 0x00, 0x52, 0x6c, 0xbe,
- 0xaa, 0xf1, 0x67, 0xbf, 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
- 0x60, 0x0d, 0x2f, 0xbd, 0x54, 0x70, 0xd6, 0xbe, 0x00, 0x8c, 0x9d, 0x3e,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0xce, 0x37, 0xbe, 0x54, 0xec, 0xa1, 0x3e,
- 0x00, 0x6b, 0x90, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
- 0x00, 0xef, 0xc4, 0x3e, 0xa8, 0x0a, 0x8c, 0x3e, 0x58, 0x91, 0x63, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x4a, 0x83, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x54, 0xec, 0xa1, 0x3e, 0x58, 0xd3, 0x7d, 0xbe, 0x58, 0x91, 0x63, 0xbe,
- 0x00, 0x10, 0x52, 0x3e, 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x6b, 0x90, 0x3e,
- 0x54, 0xaa, 0x87, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe,
- 0x50, 0x91, 0xe3, 0xbd, 0x2a, 0xbc, 0x1f, 0xbf, 0x00, 0x10, 0xd2, 0xbc,
- 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0xa8, 0x4c, 0x26, 0x3e,
- 0x54, 0xcb, 0x94, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e,
- 0x00, 0xad, 0xaa, 0xbe, 0x54, 0xcb, 0x94, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
- 0x00, 0x10, 0x52, 0xbe, 0xd4, 0x5b, 0x1b, 0x3f, 0xa0, 0x0a, 0x0c, 0x3d,
- 0x00, 0x10, 0x52, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0x50, 0xcb, 0x14, 0x3e,
- 0x50, 0x91, 0xe3, 0xbd, 0xa0, 0x12, 0x75, 0xbd, 0x2a, 0x7a, 0x05, 0xbf,
- 0x00, 0x10, 0xd2, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x00, 0x00, 0x00,
- 0x54, 0x0d, 0xaf, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x9d, 0x3e,
- 0x54, 0x91, 0x63, 0xbf, 0xa8, 0x8e, 0x40, 0x3e, 0x7f, 0x3d, 0x31, 0xbf,
- 0xa8, 0x8e, 0x40, 0xbe, 0x54, 0xec, 0xa1, 0x3e, 0xaa, 0x6d, 0xb3, 0xbe,
- 0x80, 0x0a, 0x0c, 0xbc, 0x58, 0xcb, 0x14, 0xbe, 0xb0, 0x12, 0xf5, 0xbd,
- 0xb0, 0x0a, 0x8c, 0x3d, 0x2a, 0xfe, 0x39, 0xbf, 0x50, 0x91, 0x63, 0x3e,
- 0x58, 0xd3, 0x7d, 0xbe, 0x54, 0xec, 0xa1, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
- 0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x4c, 0x26, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd,
- 0xa8, 0x12, 0x75, 0x3e, 0x00, 0x8c, 0x9d, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
- 0x00, 0x31, 0xdf, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0x50, 0x4f, 0x49, 0x3e,
- 0xaa, 0x6d, 0xb3, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x8c, 0x9d, 0x3e,
- 0xb0, 0x0a, 0x8c, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd,
- 0xa8, 0x0a, 0x8c, 0x3e, 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e,
- 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
- 0x00, 0x4a, 0x83, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0xd0, 0xda, 0xbe,
- 0x54, 0xcb, 0x94, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0xa8, 0x12, 0x75, 0x3e,
- 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x10, 0x52, 0x3d, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x56, 0xaa, 0x87, 0xbe, 0x54, 0x0d, 0xaf, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
- 0x00, 0x4a, 0x03, 0x3e, 0x54, 0x4f, 0xc9, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x58, 0xcb, 0x14, 0xbe, 0x55, 0xaa, 0x07, 0xbf,
- 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0x54, 0x91, 0xe3, 0xbe,
- 0xa8, 0x4c, 0x26, 0x3e, 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0x91, 0x63, 0xbe,
- 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x52, 0xec, 0xbe, 0x50, 0x0d, 0xaf, 0x3d,
- 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x6b, 0x90, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
- 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x10, 0x52, 0x3e,
- 0x00, 0x10, 0xd2, 0x3c, 0x60, 0x0d, 0x2f, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x00, 0x6b, 0x90, 0x3e, 0xff, 0xac, 0x2a, 0xbf, 0x00, 0x4a, 0x03, 0xbe,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0xce, 0xb7, 0xbe, 0x54, 0x70, 0xd6, 0xbe,
- 0x54, 0xcb, 0x94, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x58, 0x4f, 0x49, 0xbe,
- 0x50, 0x0d, 0xaf, 0xbd, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x4a, 0x83, 0x3e,
- 0x50, 0xcb, 0x14, 0x3e, 0xa8, 0x8e, 0xc0, 0x3e, 0x80, 0x0a, 0x0c, 0x3c,
- 0x00, 0x00, 0x00, 0x00, 0x54, 0xcb, 0x94, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
- 0xa0, 0x12, 0x75, 0xbd, 0x50, 0x4f, 0x49, 0x3e, 0xb0, 0x0a, 0x8c, 0x3d,
- 0xaa, 0x2b, 0x19, 0xbf, 0xa8, 0xd0, 0x5a, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d,
- 0xa0, 0x12, 0xf5, 0x3d, 0x50, 0xd3, 0x7d, 0x3e, 0xa0, 0x12, 0x75, 0xbd,
- 0xa8, 0x0a, 0x0c, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd,
- 0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x4f, 0x49, 0x3e, 0x2a, 0xfe, 0x39, 0xbf,
- 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x73, 0xf9, 0xbe,
- 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x8c, 0x9d, 0x3e, 0x00, 0x8c, 0x1d, 0xbe,
- 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0x50, 0x4f, 0x49, 0x3e,
- 0x54, 0x4f, 0xc9, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0x50, 0x0d, 0x2f, 0x3e,
- 0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x8e, 0xc0, 0x3e, 0x00, 0x8c, 0x9d, 0x3d,
- 0xaa, 0xf1, 0xe7, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0x00, 0x8c, 0x1d, 0xbe,
- 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x10, 0xd2, 0xbd,
- 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x4a, 0x03, 0x3f,
- 0xa8, 0x8e, 0x40, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd, 0x7f, 0x3d, 0x31, 0xbf,
- 0x00, 0xce, 0x37, 0x3e, 0x00, 0x52, 0xec, 0xbe, 0xa8, 0x8e, 0x40, 0x3e,
- 0xd4, 0x19, 0x01, 0x3f, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0x00, 0x4a, 0x03, 0x3e, 0xaa, 0xf1, 0xe7, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
- 0x00, 0x10, 0xd2, 0xbd, 0x00, 0x52, 0x6c, 0xbe, 0x58, 0x91, 0x63, 0xbe,
- 0xff, 0x8b, 0x1d, 0xbf, 0x00, 0x6b, 0x90, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
- 0xa0, 0x12, 0xf5, 0x3d, 0x58, 0x4f, 0x49, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
- 0x60, 0x0d, 0x2f, 0xbd, 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
- 0x50, 0x0d, 0xaf, 0xbd, 0xa8, 0x4c, 0x26, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x6b, 0x90, 0xbe, 0x00, 0x6b, 0x90, 0xbe,
- 0xa8, 0xd0, 0x5a, 0xbe, 0x54, 0x91, 0xe3, 0x3e, 0x54, 0x91, 0xe3, 0x3e,
- 0x58, 0x0d, 0x2f, 0xbe, 0xd5, 0x19, 0x01, 0xbf, 0xa0, 0x12, 0x75, 0xbd,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0x00, 0x00, 0x00, 0x00,
- 0x54, 0xaa, 0x07, 0x3f, 0x50, 0x0d, 0xaf, 0xbd, 0x58, 0xd3, 0x7d, 0xbe,
- 0x00, 0xce, 0xb7, 0xbe, 0x00, 0x10, 0x52, 0xbe, 0x00, 0x8c, 0x1d, 0x3e,
- 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x4a, 0x83, 0x3e,
- 0x50, 0x91, 0xe3, 0xbd, 0xaa, 0x0a, 0x0c, 0xbf, 0x00, 0x31, 0xdf, 0xbe,
- 0xc0, 0x0a, 0x8c, 0x3c, 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x0a, 0x8c, 0x3d,
- 0x58, 0xcb, 0x14, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
- 0x00, 0x8c, 0x9d, 0x3d, 0xb0, 0x0a, 0x8c, 0x3d, 0xaa, 0xaf, 0xcd, 0xbe,
- 0xb0, 0x12, 0xf5, 0xbd, 0xa8, 0xd0, 0x5a, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d,
- 0xd4, 0x00, 0x5d, 0xbf, 0xa0, 0x12, 0x75, 0xbd, 0x60, 0x0d, 0x2f, 0x3d,
- 0x00, 0x52, 0x6c, 0xbe, 0x54, 0xec, 0xa1, 0x3e, 0xb0, 0x12, 0xf5, 0xbd,
- 0xaa, 0xaf, 0xcd, 0xbe, 0xa8, 0xd0, 0xda, 0x3e, 0xa8, 0x0a, 0x0c, 0x3e,
- 0x00, 0x10, 0xd2, 0xbd, 0x00, 0xce, 0xb7, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
- 0x54, 0xcb, 0x94, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
- 0x80, 0xda, 0x09, 0xbf, 0x58, 0x0d, 0x2f, 0xbe, 0x80, 0x0a, 0x0c, 0xbc,
- 0x54, 0xaa, 0x07, 0x3f, 0xaa, 0x0a, 0x8c, 0xbe, 0x58, 0xd3, 0x7d, 0xbe,
- 0x50, 0x91, 0x63, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0x12, 0x75, 0xbe,
- 0x00, 0x6b, 0x90, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x2a, 0xbc, 0x1f, 0xbf,
- 0x00, 0x00, 0x00, 0x00, 0x50, 0x0d, 0xaf, 0x3d, 0x50, 0x0d, 0x2f, 0x3e,
- 0xaa, 0x2b, 0x99, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0xa8, 0x0a, 0x0c, 0xbe,
- 0x00, 0x6b, 0x90, 0xbe, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
- 0x00, 0x4a, 0x83, 0xbe, 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
- 0xa8, 0xd0, 0x5a, 0x3e, 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x10, 0xd2, 0x3e,
- 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0xd2, 0xbc,
- 0xa8, 0xd0, 0x5a, 0x3e, 0x50, 0xcb, 0x14, 0x3e, 0xb0, 0x0a, 0x8c, 0xbd,
- 0xb0, 0x12, 0xf5, 0xbd, 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0xad, 0x2a, 0x3f,
- 0x00, 0x8c, 0x1d, 0xbe, 0x58, 0xd3, 0x7d, 0xbe, 0x54, 0x2e, 0xbc, 0x3e,
- 0x00, 0x10, 0xd2, 0xbc, 0x54, 0xec, 0xa1, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
- 0x00, 0x4a, 0x03, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
- 0xa8, 0x4c, 0x26, 0x3e, 0xa0, 0x12, 0xf5, 0x3d, 0x54, 0xec, 0xa1, 0xbe,
- 0x54, 0x2e, 0xbc, 0x3e, 0x50, 0x91, 0x63, 0x3e, 0xaa, 0xf1, 0xe7, 0xbe,
- 0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x52, 0x6c, 0x3e, 0x00, 0x4a, 0x03, 0xbe,
- 0x50, 0x91, 0x63, 0x3e, 0x00, 0x4a, 0x03, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
- 0x54, 0x4f, 0xc9, 0x3e, 0x00, 0x8c, 0x9d, 0x3e, 0x58, 0x91, 0x63, 0xbe,
- 0xaa, 0x0a, 0x8c, 0xbe, 0xa8, 0x4c, 0xa6, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
- 0xa8, 0xf1, 0xe7, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0x0a, 0x0c, 0xbe,
- 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0x3c, 0x54, 0xec, 0xa1, 0xbe,
- 0x58, 0xd3, 0x7d, 0xbe, 0x50, 0xd3, 0x7d, 0x3e, 0x80, 0x0a, 0x0c, 0xbc,
- 0xa0, 0x12, 0x75, 0x3d, 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0xce, 0x37, 0x3e,
- 0xaa, 0x0a, 0x8c, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x00, 0x10, 0x52, 0x3d,
- 0x00, 0x10, 0x52, 0xbd, 0x55, 0x0d, 0x2f, 0xbf, 0x50, 0xd3, 0x7d, 0x3e,
- 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x8c, 0x9d, 0x3e,
- 0x54, 0x70, 0xd6, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e, 0xa0, 0x12, 0x75, 0xbd,
- 0xc0, 0x0a, 0x8c, 0xbc, 0xa0, 0x0a, 0x0c, 0x3d, 0xb0, 0x8e, 0xc0, 0x3d,
- 0x00, 0xad, 0xaa, 0x3e, 0x50, 0x0d, 0xaf, 0x3d, 0xa0, 0x12, 0x75, 0xbd,
- 0xa0, 0x12, 0x75, 0xbd, 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0x10, 0xd2, 0x3c,
- 0x56, 0xaa, 0x87, 0xbe, 0x50, 0x91, 0x63, 0x3e, 0xa8, 0xaf, 0xcd, 0x3e,
- 0x54, 0xb2, 0xf0, 0xbe, 0x50, 0xcb, 0x14, 0x3e, 0x54, 0xec, 0xa1, 0x3e,
- 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0xce, 0x37, 0x3e,
- 0x54, 0xaa, 0x07, 0x3f, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
- 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x4a, 0x03, 0x3e, 0x80, 0xfb, 0x16, 0x3f,
- 0x00, 0x73, 0xf9, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x8c, 0x9d, 0x3e,
- 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0x54, 0x0d, 0xaf, 0x3e,
- 0x00, 0x10, 0xd2, 0xbe, 0xff, 0x8b, 0x1d, 0xbf, 0x60, 0x0d, 0x2f, 0x3d,
- 0x58, 0xcb, 0x14, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
- 0x00, 0x10, 0xd2, 0x3c, 0xa8, 0xd0, 0x5a, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d,
- 0x58, 0xcb, 0x14, 0xbe, 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x12, 0xf5, 0xbe,
- 0xb0, 0x12, 0xf5, 0xbd, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0xa8, 0x12, 0x75, 0xbe, 0x00, 0x52, 0xec, 0x3e,
- 0x00, 0x8c, 0x1d, 0xbe, 0x54, 0xaa, 0x87, 0x3e, 0x00, 0x10, 0x52, 0xbd,
- 0x00, 0x8c, 0x9d, 0xbe, 0x58, 0x91, 0x63, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
- 0x54, 0xb2, 0xf0, 0xbe, 0x50, 0x91, 0x63, 0x3e, 0xb0, 0x8e, 0xc0, 0xbd,
- 0xb0, 0x0a, 0x8c, 0x3d, 0x00, 0x8c, 0x9d, 0xbd, 0x58, 0x0d, 0x2f, 0xbe,
- 0xb0, 0x8e, 0xc0, 0x3d, 0xaa, 0x4c, 0x26, 0xbf, 0x00, 0x10, 0x52, 0xbd,
- 0xa8, 0x8e, 0x40, 0x3e, 0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x0a, 0x0c, 0x3e,
- 0x54, 0x4f, 0xc9, 0xbe, 0x50, 0x91, 0xe3, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc,
- 0x50, 0xcb, 0x14, 0x3e, 0x50, 0x91, 0x63, 0x3e, 0x00, 0x8c, 0x1d, 0x3e,
- 0x54, 0x0d, 0xaf, 0x3e, 0x00, 0x10, 0x52, 0x3d, 0x60, 0x0d, 0x2f, 0x3d,
- 0x60, 0x0d, 0x2f, 0xbd, 0xa8, 0xd0, 0x5a, 0x3e, 0x50, 0xd3, 0x7d, 0x3e,
- 0xd5, 0x3a, 0x0e, 0xbf, 0x54, 0xb2, 0xf0, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
- 0x56, 0xaa, 0x87, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x52, 0x6c, 0x3e,
- 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0x10, 0xd2, 0xbd, 0xb0, 0x8e, 0xc0, 0x3d,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x60, 0x0d, 0x2f, 0x3d, 0xa0, 0x0a, 0x0c, 0x3d,
- 0xd5, 0x3a, 0x0e, 0xbf, 0xaa, 0x4c, 0xa6, 0xbe, 0x80, 0xda, 0x09, 0x3f,
- 0x00, 0x8c, 0x1d, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd, 0x54, 0x0d, 0xaf, 0x3e,
- 0x00, 0x4a, 0x03, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
- 0x00, 0x8c, 0x9d, 0xbd, 0x54, 0xec, 0xa1, 0x3e, 0x00, 0x4a, 0x03, 0xbe,
- 0xa8, 0x4c, 0xa6, 0x3e, 0xaa, 0x2b, 0x99, 0xbe, 0x00, 0xef, 0xc4, 0xbe,
- 0x58, 0xd3, 0x7d, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0x0d, 0x2f, 0x3e,
- 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x8c, 0x9d, 0xbe, 0xa8, 0xaf, 0xcd, 0x3e,
- 0xa8, 0x0a, 0x0c, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0x58, 0x4f, 0x49, 0xbe,
- 0x50, 0x91, 0x63, 0x3e, 0x00, 0x8c, 0x1d, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
- 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x6b, 0x10, 0xbf, 0x00, 0x10, 0x52, 0xbd,
- 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0x2b, 0x99, 0xbe,
- 0xaa, 0x6d, 0xb3, 0xbe, 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x91, 0xe3, 0x3d,
- 0x00, 0x10, 0x52, 0x3d, 0x54, 0x0d, 0xaf, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
- 0x60, 0x0d, 0x2f, 0x3d, 0xc0, 0x0a, 0x8c, 0xbc, 0x50, 0xcb, 0x14, 0x3e,
- 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0x52, 0xbd, 0x00, 0x6b, 0x90, 0xbe,
- 0x00, 0x6b, 0x10, 0xbf, 0x50, 0x0d, 0x2f, 0x3e, 0x58, 0x4f, 0x49, 0xbe,
- 0x54, 0xd3, 0xfd, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd, 0x54, 0x70, 0xd6, 0xbe,
- 0x80, 0x0a, 0x0c, 0xbc, 0xa0, 0x0a, 0x0c, 0xbd, 0x58, 0x4f, 0x49, 0xbe,
- 0xaa, 0x4c, 0xa6, 0xbe, 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0xd2, 0xbc,
- 0x58, 0xcb, 0x14, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
- 0xb0, 0x0a, 0x8c, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd, 0xa0, 0x12, 0xf5, 0x3d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x90, 0xbe, 0xaa, 0x6d, 0x33, 0xbf,
- 0x00, 0x8c, 0x9d, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0xa0, 0x0a, 0x0c, 0xbd,
- 0xaa, 0x4c, 0xa6, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
- 0x54, 0xcb, 0x94, 0xbe, 0x00, 0x4a, 0x03, 0x3e, 0xa8, 0x8e, 0x40, 0xbe,
- 0xaa, 0x4c, 0xa6, 0xbe, 0xa8, 0x8e, 0x40, 0xbe, 0x50, 0x91, 0xe3, 0x3d,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x6b, 0x90, 0xbe, 0x58, 0x91, 0x63, 0xbe,
- 0x00, 0x4a, 0x83, 0xbe, 0x80, 0x0a, 0x0c, 0x3c, 0xaa, 0x6d, 0x33, 0xbf,
- 0x00, 0x8c, 0x1d, 0xbe, 0x80, 0xda, 0x09, 0xbf, 0xb0, 0x12, 0xf5, 0xbd,
- 0xb0, 0x12, 0xf5, 0xbd, 0x00, 0x8c, 0x9d, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
- 0xa8, 0x6d, 0xb3, 0x3e, 0xd4, 0x21, 0x6a, 0xbf, 0xa8, 0x8e, 0x40, 0xbe,
- 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x55, 0x0d, 0x2f, 0xbf,
- 0xaa, 0x2b, 0x99, 0xbe, 0xaa, 0x2b, 0x99, 0xbe, 0x54, 0xcb, 0x94, 0xbe,
- 0xb0, 0x12, 0xf5, 0xbd, 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x12, 0x75, 0x3d,
- 0x80, 0x0a, 0x0c, 0x3c, 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x8c, 0x9d, 0xbe,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x56, 0xaa, 0x87, 0xbe, 0x00, 0x00, 0x00, 0x00,
- 0x56, 0xaa, 0x87, 0xbe, 0x7f, 0xe2, 0x72, 0xbf, 0x00, 0x10, 0xd2, 0xbe,
- 0x00, 0xce, 0x37, 0xbe, 0xd5, 0x19, 0x01, 0xbf, 0x00, 0x52, 0xec, 0xbe,
- 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0xd0, 0x5a, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x00, 0x4a, 0x03, 0xbf, 0x00, 0x52, 0x6c, 0x3e,
- 0x00, 0x10, 0xd2, 0x3c, 0x54, 0x4f, 0xc9, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
- 0x50, 0x0d, 0x2f, 0x3e, 0xc0, 0x0a, 0x8c, 0x3c, 0x58, 0x0d, 0x2f, 0xbe,
- 0x50, 0x91, 0xe3, 0x3d, 0x00, 0xce, 0x37, 0x3e, 0x54, 0xcb, 0x94, 0xbe,
- 0xaa, 0xd0, 0xda, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x58, 0xcb, 0x14, 0xbe,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe,
- 0x00, 0x52, 0x6c, 0xbe, 0x00, 0xce, 0xb7, 0x3e, 0xb0, 0x12, 0xf5, 0xbd,
- 0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x73, 0xf9, 0xbe, 0x54, 0xaa, 0x87, 0x3e,
- 0x00, 0xce, 0x37, 0x3e, 0x80, 0x0a, 0x0c, 0x3c, 0x58, 0x4f, 0x49, 0xbe,
- 0xaa, 0x6d, 0xb3, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0x54, 0x4f, 0xc9, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
- 0x00, 0xad, 0xaa, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d, 0xa0, 0x0a, 0x0c, 0x3d,
- 0xb0, 0x12, 0xf5, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
- 0x00, 0xce, 0x37, 0xbe, 0x00, 0x8c, 0x1d, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e,
- 0x00, 0x10, 0x52, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
- 0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0xaa, 0xaf, 0xcd, 0xbe,
- 0x00, 0x10, 0xd2, 0xbc, 0x00, 0x10, 0xd2, 0x3d, 0x50, 0x0d, 0xaf, 0xbd,
- 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x10, 0xd2, 0x3d, 0x54, 0x70, 0xd6, 0xbe,
- 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x4c, 0xa6, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
- 0x54, 0x70, 0xd6, 0xbe, 0x80, 0xda, 0x09, 0xbf, 0x00, 0x8c, 0x1d, 0xbe,
- 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0xd0, 0xda, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
- 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0xd2, 0xbd, 0x54, 0xcb, 0x94, 0x3e,
- 0x54, 0xec, 0xa1, 0xbe, 0x54, 0x91, 0xe3, 0xbe, 0x00, 0x73, 0xf9, 0xbe,
- 0x60, 0x0d, 0x2f, 0x3d, 0xd5, 0x3a, 0x0e, 0xbf, 0x00, 0x10, 0xd2, 0xbc,
- 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x8c, 0x9d, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
- 0xc0, 0x0a, 0x8c, 0x3c, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xad, 0xaa, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbd, 0xaa, 0x2b, 0x19, 0xbf, 0xa8, 0x12, 0x75, 0x3e,
- 0x00, 0x4a, 0x03, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x10, 0x52, 0xbd,
- 0x7f, 0x5e, 0x3e, 0xbf, 0x00, 0x8c, 0x1d, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
- 0x00, 0x10, 0xd2, 0x3d, 0xaa, 0x8e, 0xc0, 0xbe, 0xb0, 0x12, 0xf5, 0xbd,
- 0xaa, 0xaf, 0xcd, 0xbe, 0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x0a, 0x8c, 0x3e,
- 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x10, 0x52, 0x3d, 0x55, 0xec, 0x21, 0xbf,
- 0xa8, 0x4c, 0x26, 0x3e, 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x10, 0xd2, 0xbd,
- 0x00, 0xce, 0xb7, 0x3e, 0x54, 0xd3, 0xfd, 0xbe, 0x54, 0x0d, 0xaf, 0x3e,
- 0xa8, 0x12, 0x75, 0xbe, 0xa8, 0x12, 0x75, 0x3e, 0x00, 0xce, 0x37, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
- 0xc0, 0x0a, 0x8c, 0x3c, 0xa8, 0xd0, 0x5a, 0xbe, 0xa8, 0xd0, 0xda, 0x3e,
- 0x54, 0x70, 0xd6, 0x3e, 0x00, 0xad, 0xaa, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
- 0x00, 0x10, 0x52, 0xbe, 0x00, 0x73, 0xf9, 0xbe, 0x50, 0x0d, 0xaf, 0x3d,
- 0x00, 0xef, 0xc4, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe, 0xb0, 0x8e, 0xc0, 0x3d,
- 0x00, 0xce, 0x37, 0xbe, 0x50, 0x0d, 0xaf, 0xbd, 0xff, 0x8b, 0x1d, 0xbf,
- 0x00, 0xce, 0x37, 0xbe, 0x58, 0xcb, 0x14, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
- 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x4a, 0x03, 0x3e, 0x50, 0xcb, 0x14, 0x3e,
- 0x56, 0xaa, 0x87, 0xbe, 0x54, 0xcb, 0x94, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
- 0xaa, 0xd0, 0xda, 0xbe, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
- 0x00, 0x10, 0x52, 0x3d, 0x54, 0xaa, 0x87, 0x3e, 0xa8, 0x4c, 0x26, 0xbe,
- 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
- 0xaa, 0x0a, 0x8c, 0xbe, 0x2a, 0xbc, 0x1f, 0xbf, 0xc0, 0x0a, 0x8c, 0xbc,
- 0x00, 0xce, 0x37, 0x3e, 0x55, 0xcb, 0x14, 0xbf, 0x50, 0xcb, 0x14, 0x3e,
- 0xa8, 0x4c, 0x26, 0xbe, 0x00, 0xef, 0xc4, 0xbe, 0x00, 0x10, 0x52, 0xbe,
- 0x00, 0x10, 0xd2, 0xbc, 0x54, 0x4f, 0xc9, 0x3e, 0x60, 0x0d, 0x2f, 0xbd,
- 0xa8, 0xd0, 0x5a, 0xbe, 0x54, 0x2e, 0xbc, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
- 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x12, 0xf5, 0x3d, 0x56, 0xaa, 0x87, 0xbe,
- 0xaa, 0xaf, 0xcd, 0xbe, 0x50, 0x91, 0x63, 0x3e, 0xb0, 0x8e, 0xc0, 0x3d,
- 0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0x10, 0xd2, 0xbc, 0x50, 0xcb, 0x14, 0x3e,
- 0x00, 0x6b, 0x90, 0xbe, 0xa8, 0x6d, 0xb3, 0x3e, 0x54, 0xcb, 0x94, 0xbe,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0xec, 0xa1, 0xbe, 0x58, 0xcb, 0x14, 0xbe,
- 0xaa, 0x12, 0xf5, 0xbe, 0xb0, 0x0a, 0x8c, 0x3d, 0xa8, 0x12, 0xf5, 0x3e,
- 0xa8, 0x8e, 0x40, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd, 0x54, 0x2e, 0xbc, 0xbe,
- 0xa0, 0x12, 0x75, 0xbd, 0xd5, 0x3a, 0x0e, 0xbf, 0xc0, 0x0a, 0x8c, 0x3c,
- 0xa8, 0x0a, 0x0c, 0xbe, 0xa8, 0x12, 0x75, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
- 0x00, 0x10, 0x52, 0x3d, 0xb0, 0x0a, 0x8c, 0xbd, 0x60, 0x0d, 0x2f, 0x3d,
- 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x4a, 0x03, 0x3e, 0x00, 0x4a, 0x83, 0x3e,
- 0x60, 0x0d, 0x2f, 0x3d, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x10, 0xd2, 0x3c,
- 0x00, 0x73, 0xf9, 0x3e, 0x54, 0xaa, 0x87, 0x3e, 0x58, 0x0d, 0x2f, 0xbe,
- 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0x8c, 0x1d, 0x3f, 0xaa, 0x8e, 0xc0, 0xbe,
- 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x10, 0x52, 0x3d, 0x54, 0xec, 0xa1, 0x3e,
- 0xaa, 0x6d, 0xb3, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0x54, 0x4f, 0xc9, 0xbe,
- 0xaa, 0xaf, 0xcd, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0x00, 0x6b, 0x10, 0xbf,
- 0x58, 0xd3, 0x7d, 0xbe, 0x2a, 0xbc, 0x1f, 0xbf, 0x58, 0x0d, 0x2f, 0xbe,
- 0x50, 0x91, 0xe3, 0x3d, 0xa8, 0xd0, 0x5a, 0xbe, 0xb0, 0x12, 0xf5, 0xbd,
- 0x60, 0x0d, 0x2f, 0x3d, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x10, 0xd2, 0x3c,
- 0x58, 0xd3, 0x7d, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0xaa, 0x6d, 0xb3, 0xbe,
- 0xb0, 0x8e, 0xc0, 0x3d, 0x50, 0x0d, 0x2f, 0x3e, 0x00, 0x8c, 0x9d, 0x3d,
- 0x00, 0x10, 0xd2, 0x3d, 0x54, 0xcb, 0x94, 0x3e, 0x00, 0x10, 0xd2, 0xbc,
- 0x00, 0x10, 0xd2, 0xbd, 0xc0, 0x0a, 0x8c, 0xbc, 0x58, 0x0d, 0x2f, 0xbe,
- 0x00, 0x00, 0x00, 0x00, 0x58, 0x4f, 0x49, 0xbe, 0xa8, 0x2b, 0x99, 0x3e,
- 0x00, 0x8c, 0x9d, 0x3d, 0xa0, 0x12, 0x75, 0x3d, 0x54, 0xaa, 0x87, 0x3e,
- 0x00, 0x8c, 0x9d, 0x3d, 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x6b, 0x90, 0x3e,
- 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x8c, 0x1d, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
- 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0x58, 0x91, 0x63, 0xbe,
- 0x00, 0x4a, 0x03, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x00, 0x8c, 0x1d, 0x3e,
- 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0xd0, 0x5a, 0x3e, 0x00, 0x8c, 0x9d, 0x3d,
- 0x80, 0x0a, 0x0c, 0x3c, 0x54, 0xcb, 0x94, 0xbe, 0xa0, 0x0a, 0x0c, 0xbd,
- 0xa8, 0x0a, 0x8c, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x8c, 0x9d, 0x3d,
- 0x54, 0xec, 0xa1, 0xbe, 0x00, 0x10, 0xd2, 0x3c, 0xc0, 0x0a, 0x8c, 0xbc,
- 0x00, 0x4a, 0x03, 0xbe, 0x00, 0xef, 0xc4, 0x3e, 0xaa, 0x8e, 0xc0, 0xbe,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x00, 0xce, 0x37, 0x3e, 0x00, 0xad, 0xaa, 0xbe,
- 0x00, 0x8c, 0x1d, 0x3e, 0x50, 0x91, 0xe3, 0x3d, 0x60, 0x0d, 0x2f, 0xbd,
- 0xb0, 0x8e, 0xc0, 0x3d, 0x60, 0x0d, 0x2f, 0xbd, 0x50, 0x91, 0xe3, 0x3d,
- 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x8c, 0x9d, 0xbe,
- 0x00, 0x4a, 0x83, 0x3e, 0xaa, 0xd0, 0xda, 0xbe, 0x00, 0x10, 0x52, 0x3d,
- 0xa8, 0x4c, 0x26, 0x3e, 0x00, 0x10, 0xd2, 0xbe, 0x56, 0xaa, 0x87, 0xbe,
- 0xa0, 0x0a, 0x0c, 0x3d, 0x50, 0x0d, 0x2f, 0x3e, 0xa8, 0x0a, 0x0c, 0xbe,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0xce, 0x37, 0xbe, 0xb0, 0x0a, 0x8c, 0xbd,
- 0xa0, 0x12, 0x75, 0xbd, 0x00, 0x10, 0x52, 0xbe, 0x50, 0x91, 0xe3, 0xbd,
- 0xb0, 0x0a, 0x8c, 0xbd, 0x50, 0x91, 0xe3, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe,
- 0xc0, 0x01, 0x80, 0xbf, 0x54, 0xcb, 0x94, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
- 0x00, 0xef, 0xc4, 0xbe, 0xa8, 0x4c, 0x26, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
- 0x00, 0xce, 0x37, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
- 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x10, 0x52, 0xbd, 0xaa, 0xd0, 0xda, 0xbe,
- 0x00, 0x10, 0x52, 0xbd, 0xc0, 0x0a, 0x8c, 0xbc, 0xaa, 0x4c, 0xa6, 0xbe,
- 0xb0, 0x8e, 0xc0, 0x3d, 0x58, 0x4f, 0x49, 0xbe, 0x00, 0x52, 0x6c, 0x3e,
- 0xa8, 0x2b, 0x99, 0x3e, 0x00, 0x4a, 0x03, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
- 0xaa, 0x6d, 0xb3, 0xbe, 0x58, 0x4f, 0x49, 0xbe, 0xa0, 0x12, 0x75, 0xbd,
- 0x00, 0x00, 0x00, 0x00, 0x50, 0x91, 0xe3, 0x3d, 0xb0, 0x8e, 0xc0, 0xbd,
- 0x50, 0x4f, 0x49, 0x3e, 0x00, 0x10, 0x52, 0x3e, 0x00, 0xce, 0xb7, 0xbe,
- 0x54, 0xcb, 0x94, 0x3e, 0x00, 0xce, 0x37, 0x3e, 0xa0, 0x12, 0x75, 0xbd,
- 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x8c, 0x9d, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
- 0xa8, 0x8e, 0x40, 0x3e, 0x54, 0x70, 0xd6, 0xbe, 0xaa, 0x2b, 0x99, 0xbe,
- 0x00, 0x4a, 0x03, 0xbe, 0xa0, 0x12, 0x75, 0x3d, 0x50, 0x4f, 0x49, 0x3e,
- 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x8c, 0x1d, 0x3e, 0x54, 0xb2, 0xf0, 0xbe,
- 0x00, 0x10, 0xd2, 0xbd, 0x2a, 0x7a, 0x05, 0xbf, 0x00, 0x10, 0x52, 0x3e,
- 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0xce, 0x37, 0x3e,
- 0x58, 0x0d, 0x2f, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0xa0, 0x12, 0x75, 0x3d,
- 0x00, 0x10, 0xd2, 0xbd, 0x80, 0x0a, 0x0c, 0xbc, 0xa8, 0x0a, 0x0c, 0xbe,
- 0xd5, 0x3a, 0x0e, 0xbf, 0x00, 0x6b, 0x90, 0xbe, 0x58, 0x0d, 0x2f, 0xbe,
- 0x00, 0x4a, 0x03, 0x3e, 0xa0, 0x0a, 0x0c, 0x3d, 0x58, 0xcb, 0x14, 0xbe,
- 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0xf1, 0xe7, 0x3e, 0x00, 0x4a, 0x83, 0xbe,
- 0xb0, 0x0a, 0x8c, 0xbd, 0xa8, 0x0a, 0x0c, 0x3e, 0xa0, 0x12, 0xf5, 0x3d,
- 0x00, 0x10, 0xd2, 0xbc, 0xa8, 0x4c, 0x26, 0x3e, 0x60, 0x0d, 0x2f, 0x3d,
- 0x50, 0x91, 0xe3, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x50, 0x0d, 0xaf, 0x3d,
- 0x80, 0x0a, 0x0c, 0x3c, 0xd5, 0x7c, 0x28, 0xbf, 0x00, 0x10, 0xd2, 0xbd,
- 0xa8, 0x6d, 0xb3, 0x3e, 0x54, 0x0d, 0xaf, 0x3e, 0x2a, 0x7a, 0x05, 0xbf,
- 0x50, 0xd3, 0x7d, 0x3e, 0x54, 0xec, 0xa1, 0x3e, 0x00, 0x8c, 0x1d, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x0a, 0x0c, 0x3c, 0xa0, 0x12, 0x75, 0xbd,
- 0xaa, 0xf1, 0xe7, 0xbe, 0x00, 0x10, 0xd2, 0x3d, 0xa8, 0xd0, 0x5a, 0x3e,
- 0x00, 0x4a, 0x03, 0x3f, 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0xce, 0xb7, 0xbe,
- 0xa8, 0x0a, 0x0c, 0xbe, 0x00, 0x10, 0x52, 0x3e, 0x00, 0x10, 0x52, 0x3d,
- 0xa0, 0x0a, 0x0c, 0xbd, 0xa8, 0x12, 0x75, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd,
- 0x54, 0x2e, 0xbc, 0xbe, 0x00, 0x52, 0x6c, 0xbe, 0x00, 0x8c, 0x9d, 0x3e,
- 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x4a, 0x03, 0xbe, 0x54, 0x0d, 0xaf, 0xbe,
- 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0x4a, 0x83, 0x3e, 0xa0, 0x0a, 0x0c, 0xbd,
- 0xa8, 0xd0, 0x5a, 0x3e, 0x54, 0x0d, 0xaf, 0xbe, 0x00, 0x4a, 0x83, 0xbe,
- 0xa8, 0x0a, 0x0c, 0x3e, 0x54, 0x0d, 0xaf, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
- 0x00, 0x52, 0x6c, 0xbe, 0xaa, 0x8e, 0xc0, 0xbe, 0x00, 0xce, 0xb7, 0xbe,
- 0xb0, 0x8e, 0xc0, 0x3d, 0xaa, 0x2b, 0x99, 0xbe, 0x54, 0x2e, 0xbc, 0xbe,
- 0x54, 0x2e, 0xbc, 0xbe, 0x50, 0x91, 0xe3, 0xbd, 0x00, 0x4a, 0x03, 0xbe,
- 0xa8, 0xf1, 0xe7, 0x3e, 0x00, 0x10, 0xd2, 0x3d, 0x00, 0x4a, 0x03, 0xbe,
- 0x58, 0xd3, 0x7d, 0xbe, 0x80, 0x0a, 0x0c, 0xbc, 0xb0, 0x0a, 0x8c, 0xbd,
- 0x54, 0xcb, 0x94, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0x50, 0x91, 0xe3, 0xbd,
- 0x00, 0xce, 0x37, 0xbe, 0x50, 0x91, 0x63, 0x3e, 0x00, 0x8c, 0x1d, 0x3e,
- 0xc0, 0x0a, 0x8c, 0xbc, 0x54, 0xb2, 0xf0, 0xbe, 0xa8, 0x8e, 0x40, 0xbe,
- 0x60, 0x0d, 0x2f, 0xbd, 0xaa, 0x0a, 0x8c, 0xbe, 0xa8, 0x12, 0x75, 0x3e,
- 0x50, 0x0d, 0x2f, 0x3e, 0x58, 0x4f, 0x49, 0xbe, 0xa8, 0x4c, 0x26, 0x3e,
- 0x50, 0x0d, 0xaf, 0xbd, 0xa0, 0x12, 0x75, 0x3d, 0xd5, 0x5b, 0x1b, 0xbf,
- 0x58, 0x0d, 0x2f, 0xbe, 0xa8, 0x12, 0xf5, 0x3e, 0xa8, 0x6d, 0xb3, 0x3e,
- 0xb0, 0x8e, 0xc0, 0xbd, 0x00, 0x8c, 0x9d, 0x3d, 0xa0, 0x12, 0x75, 0x3d,
- 0x50, 0x0d, 0xaf, 0x3d, 0xb0, 0x12, 0xf5, 0xbd, 0x50, 0x0d, 0xaf, 0xbd,
- 0x54, 0xcb, 0x94, 0x3e, 0xa0, 0x12, 0x75, 0xbd, 0xa8, 0x8e, 0x40, 0xbe,
- 0x54, 0x4f, 0xc9, 0x3e, 0x00, 0xce, 0xb7, 0xbe, 0xd5, 0x19, 0x01, 0xbf,
- 0xb0, 0x12, 0xf5, 0xbd, 0x50, 0x0d, 0xaf, 0x3d, 0x80, 0x0a, 0x0c, 0xbc,
- 0x00, 0xce, 0x37, 0xbe, 0x54, 0xec, 0xa1, 0xbe, 0x7f, 0x1c, 0x24, 0xbf,
- 0xa8, 0x0a, 0x0c, 0x3e, 0x00, 0xce, 0x37, 0xbe, 0xa0, 0x12, 0xf5, 0x3d,
- 0xc0, 0x0a, 0x8c, 0xbc, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x8c, 0x9d, 0xbd,
- 0x60, 0x0d, 0x2f, 0xbd, 0x55, 0x0d, 0x2f, 0xbf, 0x00, 0x52, 0x6c, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbe, 0xff, 0x8b, 0x1d, 0xbf, 0x00, 0x8c, 0x1d, 0x3e,
- 0x54, 0x0d, 0xaf, 0xbe, 0x55, 0xaa, 0x07, 0xbf, 0x50, 0x0d, 0xaf, 0xbd,
- 0xaa, 0x2b, 0x19, 0xbf, 0x00, 0xce, 0xb7, 0xbe, 0xd5, 0x19, 0x01, 0xbf,
- 0xa0, 0x12, 0xf5, 0x3d, 0x54, 0x70, 0xd6, 0xbe, 0xa8, 0x4c, 0x26, 0xbe,
- 0xd5, 0x3a, 0x0e, 0xbf, 0xa0, 0x12, 0xf5, 0x3d, 0x54, 0xec, 0xa1, 0xbe,
- 0x00, 0x8c, 0x1d, 0x3e, 0x60, 0x0d, 0x2f, 0xbd, 0xff, 0xac, 0x2a, 0xbf,
- 0x00, 0x10, 0x52, 0xbd, 0x50, 0x0d, 0xaf, 0xbd, 0x00, 0x6b, 0x10, 0xbf,
- 0x50, 0x91, 0xe3, 0xbd, 0xaa, 0x12, 0xf5, 0xbe, 0xc0, 0x0a, 0x8c, 0x3c,
- 0x54, 0xec, 0xa1, 0x3e, 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0x4a, 0x03, 0xbf,
- 0x00, 0xce, 0xb7, 0xbe, 0xa8, 0xd0, 0x5a, 0xbe, 0x00, 0xce, 0x37, 0xbe,
- 0xc0, 0x0a, 0x8c, 0x3c, 0x80, 0x0a, 0x0c, 0xbc, 0x50, 0x91, 0xe3, 0x3d,
- 0x50, 0x91, 0x63, 0x3e, 0xaa, 0x4c, 0xa6, 0xbe, 0x60, 0x0d, 0x2f, 0xbd,
- 0x00, 0x10, 0x52, 0xbd, 0x00, 0x10, 0xd2, 0xbc, 0xa0, 0x12, 0x75, 0xbd,
- 0x00, 0x10, 0x52, 0xbe, 0xaa, 0x0a, 0x8c, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
- 0xaa, 0x8e, 0xc0, 0xbe, 0xa0, 0x12, 0x75, 0xbd, 0x00, 0xad, 0xaa, 0x3e,
- 0x58, 0xcb, 0x14, 0xbe, 0xb0, 0x8e, 0xc0, 0xbd, 0x80, 0x0a, 0x0c, 0x3c,
- 0x80, 0x0a, 0x0c, 0x3c, 0xa8, 0x0a, 0x8c, 0x3e, 0x7f, 0x1c, 0x24, 0xbf,
- 0xb0, 0x12, 0xf5, 0xbd, 0xa0, 0x0a, 0x0c, 0x3d, 0x00, 0x10, 0xd2, 0xbc,
- 0x50, 0x0d, 0xaf, 0x3d, 0x00, 0x10, 0x52, 0xbe, 0x00, 0xad, 0xaa, 0xbe,
- 0x80, 0x0a, 0x0c, 0xbc, 0x80, 0x0a, 0x0c, 0x3c, 0x00, 0x6b, 0x90, 0xbe,
- 0x60, 0x0d, 0x2f, 0x3d, 0xaa, 0x0a, 0x8c, 0xbe, 0x00, 0x52, 0x6c, 0xbe,
- 0x60, 0x0d, 0x2f, 0xbd, 0x00, 0x8c, 0x1d, 0xbe, 0x00, 0x8c, 0x9d, 0xbe,
- 0xa8, 0x0a, 0x8c, 0x3e, 0x00, 0xad, 0xaa, 0xbe, 0x00, 0x4a, 0x03, 0xbe,
- 0x00, 0x8c, 0x9d, 0xbd, 0x00, 0x8c, 0x9d, 0x3d, 0x00, 0x10, 0x52, 0x3d,
- 0x00, 0x10, 0xd2, 0x3c, 0x58, 0x4f, 0x49, 0xbe, 0x60, 0x0d, 0x2f, 0x3d,
- 0xa8, 0xd0, 0x5a, 0x3e, 0xa8, 0x8e, 0x40, 0xbe, 0x00, 0x8c, 0x9d, 0x3e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x83, 0xbe, 0xaa, 0xf1, 0xe7, 0xbe,
- 0x00, 0x6b, 0x90, 0xbe, 0x2a, 0x7a, 0x05, 0xbf, 0xa8, 0x0a, 0x0c, 0x3e,
- 0xaa, 0x4c, 0xa6, 0xbe, 0x00, 0xef, 0xc4, 0xbe, 0x50, 0xcb, 0x14, 0x3e,
- 0xaa, 0x2b, 0x99, 0xbe, 0xa8, 0x8e, 0x40, 0x3e, 0xaa, 0xaf, 0xcd, 0xbe,
- 0x00, 0x4a, 0x83, 0xbe, 0xa0, 0x0a, 0x0c, 0x3d,
-}};
-const int32_t dnn_logits_bias__6__cf__6_shape[1] = {1};
-const union {
- uint8_t bytes[4];
- float values[1];
-} dnn_logits_bias__6__cf__6 = {{
- 0xa9,
- 0x35,
- 0x05,
- 0xc0,
-}};
-const int32_t dnn_logits_kernel__7__cf__7_shape[2] = {59, 1};
-const union {
- uint8_t bytes[236];
- float values[59];
-} dnn_logits_kernel__7__cf__7 = {{
- 0xd8, 0x84, 0x02, 0xbd, 0x58, 0x41, 0x31, 0xbd, 0x32, 0x3a, 0x83, 0x3d,
- 0xce, 0xa0, 0x16, 0xbc, 0xe3, 0xc6, 0xa3, 0x3d, 0x2d, 0x19, 0x03, 0x3d,
- 0x10, 0x9f, 0x8d, 0xbd, 0xac, 0x19, 0x93, 0x3d, 0xdf, 0xbe, 0x87, 0xbd,
- 0xab, 0x00, 0x83, 0x3d, 0xe6, 0x8b, 0x76, 0xbd, 0x37, 0xf7, 0xa5, 0xbd,
- 0x8e, 0x55, 0xb9, 0x3d, 0x48, 0xc0, 0xe2, 0xbb, 0x2c, 0x10, 0x6c, 0x3d,
- 0x9f, 0x14, 0x19, 0xbb, 0x29, 0x15, 0xa6, 0xbd, 0x46, 0xb5, 0xb7, 0xbd,
- 0x5c, 0xf3, 0xf9, 0x3c, 0x12, 0xde, 0x23, 0x3e, 0x65, 0x28, 0x83, 0xbd,
- 0x0e, 0xbb, 0x2e, 0x3d, 0x51, 0x53, 0x11, 0x3d, 0xf9, 0xf7, 0xd8, 0xbd,
- 0x6b, 0x71, 0xec, 0x3d, 0xa0, 0xce, 0xa5, 0xbd, 0xa2, 0xd8, 0xcd, 0xbd,
- 0x6d, 0xda, 0x78, 0x3d, 0xfb, 0x74, 0x85, 0x3e, 0x36, 0x7b, 0x9e, 0x3b,
- 0x05, 0xc9, 0x6b, 0xbd, 0x52, 0x47, 0xda, 0x3d, 0x89, 0x6d, 0x36, 0xbc,
- 0x1f, 0x34, 0x03, 0xbd, 0x43, 0x68, 0xa6, 0x3d, 0xfa, 0xfd, 0x58, 0x3d,
- 0x92, 0x07, 0x53, 0xbb, 0xca, 0xbd, 0x2f, 0xbd, 0xb1, 0x63, 0xd7, 0x3d,
- 0x8b, 0x63, 0xf4, 0x3d, 0xf2, 0x5c, 0xd3, 0x3d, 0xb4, 0xb3, 0x00, 0x3e,
- 0x3c, 0xb2, 0x45, 0xbd, 0x15, 0xbb, 0x9e, 0x3d, 0x2e, 0xab, 0xc8, 0xbd,
- 0x9a, 0xad, 0x99, 0xbc, 0xac, 0xf6, 0x54, 0xbd, 0x7f, 0xf9, 0xa0, 0x3d,
- 0x54, 0xa4, 0xc1, 0x3d, 0xb8, 0x08, 0xb9, 0xbd, 0x0d, 0x84, 0xd1, 0xbc,
- 0x8a, 0x8d, 0x3b, 0x3d, 0xe0, 0x7d, 0xd3, 0xbc, 0xf7, 0xea, 0xfa, 0x3c,
- 0xb2, 0x30, 0x89, 0xbd, 0xbc, 0x6e, 0x8e, 0xbd, 0x80, 0x70, 0x74, 0x3d,
- 0xaf, 0x25, 0x86, 0x3d, 0x99, 0x50, 0x8b, 0x3d,
-}};
-
-} // anonymous namespace
-
-// -----------------------------------------------------------------------------
-// INFERENCE
-// -----------------------------------------------------------------------------
-
-int32_t input_from_feature_columns_input_layer_concat_concat0Shape[2] = {1,
- 173};
-int32_t logits_MatMul_merged_with_dnn_logits_BiasAdd0Shape[2] = {1, 1};
-
-void Inference(
- const float* __restrict input_from_feature_columns_input_layer_concat_concat0 /* shape: 1,173 */
- ,
- float* __restrict logits_MatMul_merged_with_dnn_logits_BiasAdd0 /* shape:
- 1,1 */
- ,
- FixedAllocations* __restrict fixed) {
- const int32_t input_from_feature_columns_input_layer_concat_concat0_shape[] =
- {1, 173};
-
-#if OP_LIB_BENCHMARK
- Singleton<PerOpTimings>::get()->Reset();
-#endif
-
- // dnn/hiddenlayer_0/MatMul_merged_with_dnn/hiddenlayer_0/BiasAdd
- FullyConnected<float>(
- input_from_feature_columns_input_layer_concat_concat0_shape,
- input_from_feature_columns_input_layer_concat_concat0,
- dnn_hiddenlayer_0_kernel__1__cf__1_shape,
- dnn_hiddenlayer_0_kernel__1__cf__1.values,
- dnn_hiddenlayer_0_bias__0__cf__0_shape,
- dnn_hiddenlayer_0_bias__0__cf__0.values, fixed->alloc0);
-
- fixed->shape0[0] = 1;
- fixed->shape0[1] = 117;
-
- // dnn/hiddenlayer_0/Relu
- Relu<float>(2, // rank
- fixed->shape0, fixed->alloc0, fixed->alloc0);
-
- // dnn/hiddenlayer_1/MatMul_merged_with_dnn/hiddenlayer_1/BiasAdd
- FullyConnected<float>(fixed->shape0, fixed->alloc0,
- dnn_hiddenlayer_1_kernel__3__cf__3_shape,
- dnn_hiddenlayer_1_kernel__3__cf__3.values,
- dnn_hiddenlayer_1_bias__2__cf__2_shape,
- dnn_hiddenlayer_1_bias__2__cf__2.values, fixed->alloc1);
-
- fixed->shape0[0] = 1;
- fixed->shape0[1] = 115;
-
- // dnn/hiddenlayer_1/Relu
- Relu<float>(2, // rank
- fixed->shape0, fixed->alloc1, fixed->alloc1);
-
- // dnn/hiddenlayer_2/MatMul_merged_with_dnn/hiddenlayer_2/BiasAdd
- FullyConnected<float>(fixed->shape0, fixed->alloc1,
- dnn_hiddenlayer_2_kernel__5__cf__5_shape,
- dnn_hiddenlayer_2_kernel__5__cf__5.values,
- dnn_hiddenlayer_2_bias__4__cf__4_shape,
- dnn_hiddenlayer_2_bias__4__cf__4.values, fixed->alloc0);
-
- fixed->shape0[0] = 1;
- fixed->shape0[1] = 59;
-
- // dnn/hiddenlayer_2/Relu
- Relu<float>(2, // rank
- fixed->shape0, fixed->alloc0, fixed->alloc0);
-
- // dnn/logits/MatMul_merged_with_dnn/logits/BiasAdd
- FullyConnected<float>(
- fixed->shape0, fixed->alloc0, dnn_logits_kernel__7__cf__7_shape,
- dnn_logits_kernel__7__cf__7.values, dnn_logits_bias__6__cf__6_shape,
- dnn_logits_bias__6__cf__6.values,
- logits_MatMul_merged_with_dnn_logits_BiasAdd0);
-
-#if OP_LIB_BENCHMARK
- Singleton<PerOpTimings>::get()->WriteTimingsToInfoLog();
-#endif
-}
-} // namespace ui::internal_onedevice::alpha_model_v2
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.h b/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.h
deleted file mode 100644
index 97b53666cc2..00000000000
--- a/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.h
+++ /dev/null
@@ -1,40 +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.
-// Code generated by tf.native.
-#ifndef UI_EVENTS_OZONE_EVDEV_TOUCH_FILTER_PALM_MODEL_ONEDEVICE_TRAIN_PALM_DETECTION_FILTER_INFERENCE_V2_H_
-#define UI_EVENTS_OZONE_EVDEV_TOUCH_FILTER_PALM_MODEL_ONEDEVICE_TRAIN_PALM_DETECTION_FILTER_INFERENCE_V2_H_
-#include <cstdint>
-
-namespace ui::internal_onedevice::alpha_model_v2 {
-struct alignas(16) FixedAllocations {
- float alloc0[117];
- float alloc1[115];
- int32_t shape0[2];
-};
-
-extern int32_t input_from_feature_columns_input_layer_concat_concat0Shape[2];
-extern int32_t logits_MatMul_merged_with_dnn_logits_BiasAdd0Shape[2];
-
-#define CHROME_KNOWLEDGE_INPUT_FROM_FEATURE_COLUMNS_INPUT_LAYER_CONCAT_CONCAT0_RANK_V2 \
- 2
-#define CHROME_KNOWLEDGE_INPUT_FROM_FEATURE_COLUMNS_INPUT_LAYER_CONCAT_CONCAT0_DIM0_SIZE_V2 \
- 1
-#define CHROME_KNOWLEDGE_INPUT_FROM_FEATURE_COLUMNS_INPUT_LAYER_CONCAT_CONCAT0_DIM1_SIZE_V2 \
- 173
-#define CHROME_KNOWLEDGE_LOGITS_MATMUL_MERGED_WITH_DNN_LOGITS_BIASADD0_RANK_V2 2
-#define CHROME_KNOWLEDGE_LOGITS_MATMUL_MERGED_WITH_DNN_LOGITS_BIASADD0_DIM0_SIZE_V2 \
- 1
-#define CHROME_KNOWLEDGE_LOGITS_MATMUL_MERGED_WITH_DNN_LOGITS_BIASADD0_DIM1_SIZE_V2 \
- 1
-
-void Inference(
- const float* __restrict input_from_feature_columns_input_layer_concat_concat0 /* shape: 1,173 */
- ,
- float* __restrict logits_MatMul_merged_with_dnn_logits_BiasAdd0 /* shape:
- 1,1 */
- ,
- FixedAllocations* __restrict fixed);
-
-} // namespace ui::internal_onedevice::alpha_model_v2
-#endif // UI_EVENTS_OZONE_EVDEV_TOUCH_FILTER_PALM_MODEL_ONEDEVICE_TRAIN_PALM_DETECTION_FILTER_INFERENCE_V2_H_
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc b/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc
index acf43d8b6fd..0ca6b6b3cf1 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc
+++ b/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc
@@ -20,7 +20,6 @@
#include "base/logging.h"
#include "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.h"
#include "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_beta.h"
-#include "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.h"
#include "ui/events/ozone/features.h"
#define USE_EIGEN 0
@@ -30,7 +29,6 @@ const std::string kBetaVersion = "beta";
}
namespace alpha = internal_onedevice::alpha_model;
-namespace alpha_v2 = internal_onedevice::alpha_model_v2;
namespace beta = internal_onedevice::beta_model;
float OneDeviceTrainNeuralStylusPalmDetectionFilterModel::Inference(
@@ -54,15 +52,9 @@ float OneDeviceTrainNeuralStylusPalmDetectionFilterModel::Inference(
new beta::FixedAllocations());
beta::Inference(&features[0], &output, fixed_allocations.get());
} else {
- if (base::FeatureList::IsEnabled(kEnableNeuralPalmRejectionModelV2)) {
- std::unique_ptr<alpha_v2::FixedAllocations> fixed_allocations(
- new alpha_v2::FixedAllocations());
- alpha_v2::Inference(&features[0], &output, fixed_allocations.get());
- } else {
- std::unique_ptr<alpha::FixedAllocations> fixed_allocations(
- new alpha::FixedAllocations());
- alpha::Inference(&features[0], &output, fixed_allocations.get());
- }
+ std::unique_ptr<alpha::FixedAllocations> fixed_allocations(
+ new alpha::FixedAllocations());
+ alpha::Inference(&features[0], &output, fixed_allocations.get());
}
return output;
}
@@ -95,23 +87,15 @@ void OneDeviceTrainNeuralStylusPalmDetectionFilterModel::Initialize() {
config_.max_neighbor_distance_in_mm = 100.0f;
config_.biggest_near_neighbor_count = 4;
- if (base::FeatureList::IsEnabled(kEnableNeuralPalmRejectionModelV2)) {
- config_.min_sample_count = 3;
- config_.max_sample_count = 6;
- config_.neighbor_min_sample_count = 1;
- config_.output_threshold = 0.90271f;
- expected_feature_size_ = 173;
+ config_.min_sample_count = 3;
+ config_.max_sample_count = 6;
+ config_.neighbor_min_sample_count = 1;
+ config_.output_threshold = 0.90271f;
+ expected_feature_size_ = 173;
- if (base::FeatureList::IsEnabled(kEnableNeuralPalmAdaptiveHold)) {
- config_.nn_delay_start_if_palm = true;
- config_.early_stage_sample_counts = std::unordered_set<uint32_t>({2});
- }
- } else {
- config_.min_sample_count = 5;
- config_.max_sample_count = 12;
- config_.neighbor_min_sample_count = 5;
- config_.output_threshold = 2.519f;
- expected_feature_size_ = 323;
+ if (base::FeatureList::IsEnabled(kEnableNeuralPalmAdaptiveHold)) {
+ config_.nn_delay_start_if_palm = true;
+ config_.early_stage_sample_counts = std::unordered_set<uint32_t>({2});
}
}
}
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.h b/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.h
index 1690c5d2e43..eb020c8b8e0 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.h
+++ b/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.h
@@ -31,9 +31,11 @@ class COMPONENT_EXPORT(EVDEV) OneDeviceTrainNeuralStylusPalmDetectionFilterModel
const NeuralStylusPalmDetectionFilterModelConfig& config() const override;
+ protected:
+ NeuralStylusPalmDetectionFilterModelConfig config_;
+
private:
void Initialize();
- NeuralStylusPalmDetectionFilterModelConfig config_;
size_t expected_feature_size_;
};
diff --git a/chromium/ui/events/ozone/events_ozone.cc b/chromium/ui/events/ozone/events_ozone.cc
index 8476316b789..77b571232ee 100644
--- a/chromium/ui/events/ozone/events_ozone.cc
+++ b/chromium/ui/events/ozone/events_ozone.cc
@@ -44,8 +44,11 @@ bool DispatchEventFromNativeUiEvent(
std::move(callback).Run(&scroll_event);
handled = scroll_event.handled();
} else if (event->IsGestureEvent()) {
- std::move(callback).Run(event);
- handled = event->handled();
+ // TODO(https://crbug.com/1355835: Missing ui::GestureEvent(const
+ // PlatformEvent&) ctor).
+ auto gesture_event = *(event->AsGestureEvent());
+ std::move(callback).Run(&gesture_event);
+ handled = gesture_event.handled();
// TODO(mohsen): Use the same pattern for scroll/touch/wheel events.
// Apparently, there is no need for them to wrap the |event|.
} else {
diff --git a/chromium/ui/events/ozone/features.cc b/chromium/ui/events/ozone/features.cc
index 8e557b7c939..f2c47a51aac 100644
--- a/chromium/ui/events/ozone/features.cc
+++ b/chromium/ui/events/ozone/features.cc
@@ -13,10 +13,7 @@ const base::Feature kEnableNeuralPalmDetectionFilter{
"EnableNeuralPalmDetectionFilter", base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kEnableNeuralPalmAdaptiveHold{
- "EnableNeuralPalmAdaptiveHold", base::FEATURE_DISABLED_BY_DEFAULT};
-
-const base::Feature kEnableNeuralPalmRejectionModelV2{
- "EnableNeuralPalmRejectionModelV2", base::FEATURE_DISABLED_BY_DEFAULT};
+ "EnableNeuralPalmAdaptiveHold", base::FEATURE_ENABLED_BY_DEFAULT};
const base::Feature kEnableNeuralStylusReportFilter{
"EnableNeuralStylusReportFilter", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/chromium/ui/events/ozone/features.h b/chromium/ui/events/ozone/features.h
index 2cdfab53f23..1d2f5648557 100644
--- a/chromium/ui/events/ozone/features.h
+++ b/chromium/ui/events/ozone/features.h
@@ -20,9 +20,6 @@ COMPONENT_EXPORT(EVENTS_OZONE)
extern const base::Feature kEnableNeuralPalmAdaptiveHold;
COMPONENT_EXPORT(EVENTS_OZONE)
-extern const base::Feature kEnableNeuralPalmRejectionModelV2;
-
-COMPONENT_EXPORT(EVENTS_OZONE)
extern const base::Feature kEnableNeuralStylusReportFilter;
COMPONENT_EXPORT(EVENTS_OZONE)
diff --git a/chromium/ui/events/ozone/keyboard/event_auto_repeat_handler.h b/chromium/ui/events/ozone/keyboard/event_auto_repeat_handler.h
index c17e9e1a545..6843d3e0df5 100644
--- a/chromium/ui/events/ozone/keyboard/event_auto_repeat_handler.h
+++ b/chromium/ui/events/ozone/keyboard/event_auto_repeat_handler.h
@@ -7,6 +7,7 @@
#include "base/callback.h"
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
@@ -67,7 +68,7 @@ class COMPONENT_EXPORT(EVENTS_OZONE) EventAutoRepeatHandler {
base::TimeDelta repeat_delay_;
base::TimeDelta repeat_interval_;
- Delegate* delegate_ = nullptr;
+ raw_ptr<Delegate> delegate_ = nullptr;
base::WeakPtrFactory<EventAutoRepeatHandler> weak_ptr_factory_{this};
};
diff --git a/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h b/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h
index 5fba198e0b7..6895fbb33ba 100644
--- a/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h
+++ b/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h
@@ -16,6 +16,7 @@
#include "base/component_export.h"
#include "base/containers/flat_map.h"
#include "base/memory/free_deleter.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/strings/string_piece.h"
@@ -127,7 +128,7 @@ class COMPONENT_EXPORT(EVENTS_OZONE_LAYOUT) XkbKeyboardLayoutEngine
private:
struct XkbKeymapEntry {
std::string layout_name;
- xkb_keymap* keymap;
+ raw_ptr<xkb_keymap> keymap;
};
std::vector<XkbKeymapEntry> xkb_keymaps_;
diff --git a/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc b/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc
index 0194a86e25a..0b138b04776 100644
--- a/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc
+++ b/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc
@@ -10,6 +10,7 @@
#include <tuple>
+#include "base/memory/raw_ptr.h"
#include "build/chromeos_buildflags.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/events/event_constants.h"
@@ -146,8 +147,8 @@ class VkTestXkbKeyboardLayoutEngine : public XkbKeyboardLayoutEngine {
private:
EntryType entry_type_;
- const PrintableEntry* printable_entry_;
- const KeysymEntry* keysym_entry_;
+ raw_ptr<const PrintableEntry> printable_entry_;
+ raw_ptr<const KeysymEntry> keysym_entry_;
};
} // anonymous namespace
diff --git a/chromium/ui/events/platform/x11/x11_event_source.h b/chromium/ui/events/platform/x11/x11_event_source.h
index a63218730b3..170c9e318b5 100644
--- a/chromium/ui/events/platform/x11/x11_event_source.h
+++ b/chromium/ui/events/platform/x11/x11_event_source.h
@@ -11,6 +11,7 @@
#include "base/auto_reset.h"
#include "base/callback.h"
+#include "base/memory/raw_ptr.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/events/events_export.h"
#include "ui/events/platform/platform_event_source.h"
@@ -90,7 +91,7 @@ class EVENTS_EXPORT X11EventSource : public PlatformEventSource,
std::unique_ptr<X11EventWatcher> watcher_;
// The connection to the X11 server used to receive the events.
- x11::Connection* connection_;
+ raw_ptr<x11::Connection> connection_;
// State necessary for UpdateLastSeenServerTime
bool dummy_initialized_;
diff --git a/chromium/ui/events/platform/x11/x11_event_watcher_glib.cc b/chromium/ui/events/platform/x11/x11_event_watcher_glib.cc
index e4099f72235..d690367cc33 100644
--- a/chromium/ui/events/platform/x11/x11_event_watcher_glib.cc
+++ b/chromium/ui/events/platform/x11/x11_event_watcher_glib.cc
@@ -6,6 +6,8 @@
#include <glib.h>
+#include "base/memory/raw_ptr.h"
+
namespace ui {
namespace {
@@ -13,8 +15,8 @@ namespace {
struct GLibX11Source : public GSource {
// Note: The GLibX11Source is created and destroyed by GLib. So its
// constructor/destructor may or may not get called.
- x11::Connection* connection;
- GPollFD* poll_fd;
+ raw_ptr<x11::Connection> connection;
+ raw_ptr<GPollFD> poll_fd;
};
gboolean XSourcePrepare(GSource* source, gint* timeout_ms) {
@@ -27,7 +29,7 @@ gboolean XSourcePrepare(GSource* source, gint* timeout_ms) {
// requests.
// 2. A request was made after XSourceDispatch() when running tasks from
// the task queue.
- auto* connection = static_cast<GLibX11Source*>(source)->connection;
+ auto* connection = static_cast<GLibX11Source*>(source)->connection.get();
connection->Flush();
// Read a pre-buffered response if available to prevent a deadlock where we
@@ -51,7 +53,7 @@ gboolean XSourceCheck(GSource* source) {
gboolean XSourceDispatch(GSource* source,
GSourceFunc unused_func,
gpointer data) {
- auto* connection = static_cast<GLibX11Source*>(source)->connection;
+ auto* connection = static_cast<GLibX11Source*>(source)->connection.get();
connection->Dispatch();
// Flushing here is not strictly required, but when this function returns,
diff --git a/chromium/ui/events/platform/x11/x11_event_watcher_glib.h b/chromium/ui/events/platform/x11/x11_event_watcher_glib.h
index 1196bc6b073..9b9321f8fe4 100644
--- a/chromium/ui/events/platform/x11/x11_event_watcher_glib.h
+++ b/chromium/ui/events/platform/x11/x11_event_watcher_glib.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "ui/events/platform/x11/x11_event_source.h"
using GPollFD = struct _GPollFD;
@@ -31,10 +32,10 @@ class X11EventWatcherGlib : public X11EventWatcher {
void StopWatching() override;
private:
- X11EventSource* event_source_;
+ raw_ptr<X11EventSource> event_source_;
// The GLib event source for X events.
- GSource* x_source_ = nullptr;
+ raw_ptr<GSource, DanglingUntriaged> x_source_ = nullptr;
// The poll attached to |x_source_|.
std::unique_ptr<GPollFD> x_poll_;
diff --git a/chromium/ui/events/x/x11_event_translation.cc b/chromium/ui/events/x/x11_event_translation.cc
index 6f41ebb3126..98613e1c978 100644
--- a/chromium/ui/events/x/x11_event_translation.cc
+++ b/chromium/ui/events/x/x11_event_translation.cc
@@ -46,6 +46,11 @@ class TouchEventX11 : public ui::TouchEvent {
if (type() == ET_TOUCH_RELEASED || type() == ET_TOUCH_CANCELLED)
TouchFactory::GetInstance()->ReleaseSlot(pointer_details().id);
}
+
+ // Event:
+ std::unique_ptr<Event> Clone() const override {
+ return std::make_unique<TouchEventX11>(*this);
+ }
};
Event::Properties GetEventPropertiesFromXEvent(EventType type,
diff --git a/chromium/ui/file_manager/BUILD.gn b/chromium/ui/file_manager/BUILD.gn
index 944dd4e8d66..b06c0ef1b3f 100644
--- a/chromium/ui/file_manager/BUILD.gn
+++ b/chromium/ui/file_manager/BUILD.gn
@@ -6,6 +6,8 @@ import("//chrome/common/features.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/grit/grit_rule.gni")
import("//tools/grit/preprocess_if_expr.gni")
+import("//tools/polymer/html_to_wrapper.gni")
+import("//tools/typescript/ts_definitions.gni")
import("//tools/typescript/ts_library.gni")
import("//ui/file_manager/file_names.gni")
import("//ui/webui/resources/tools/generate_grd.gni")
@@ -38,8 +40,6 @@ group("closure_compile") {
testonly = true
deps = [
- "audio_player/elements:closure_compile",
- "audio_player/js:closure_compile",
"file_manager/background/js:closure_compile",
"file_manager/common/js:closure_compile",
"file_manager/foreground/elements:closure_compile",
@@ -56,14 +56,14 @@ group("closure_compile") {
group("unit_test_data") {
testonly = true
deps = [
- "file_manager/background/js:js_test_gen_html_modules",
- "file_manager/common/js:js_test_gen_html_modules",
- "file_manager/foreground/elements:js_test_gen_html_modules",
- "file_manager/foreground/js:js_test_gen_html_modules",
- "file_manager/foreground/js/metadata:js_test_gen_html_modules",
- "file_manager/foreground/js/ui:js_test_gen_html_modules",
- "file_manager/foreground/js/ui/banners:js_test_gen_html_modules",
- "image_loader:js_test_gen_html_modules",
+ "file_manager/background/js:js_test_type_check",
+ "file_manager/common/js:js_test_type_check",
+ "file_manager/foreground/elements:js_test_type_check",
+ "file_manager/foreground/js:js_test_type_check",
+ "file_manager/foreground/js/metadata:js_test_type_check",
+ "file_manager/foreground/js/ui:js_test_type_check",
+ "file_manager/foreground/js/ui/banners:js_test_type_check",
+ "image_loader:js_test_type_check",
]
data_deps = [ "image_loader:copy_from_filesapp" ]
}
@@ -82,10 +82,10 @@ preprocess_if_expr("preprocess_static") {
deps = [
"//ui/file_manager/file_manager/background/js:js_modules",
- "//ui/file_manager/file_manager/background/js:main_background.m",
+ "//ui/file_manager/file_manager/background/js:main_background",
"//ui/file_manager/file_manager/common/js:js_modules",
"//ui/file_manager/file_manager/foreground/elements:web_components",
- "//ui/file_manager/file_manager/foreground/js:deferred_elements.m",
+ "//ui/file_manager/file_manager/foreground/js:deferred_elements",
"//ui/file_manager/file_manager/foreground/js:main",
]
}
@@ -95,11 +95,10 @@ preprocess_if_expr("preprocess_static_image_loader") {
out_folder = preprocess_folder
out_manifest = "$target_gen_dir/manifest_preprocess_static_image_loader.json"
- in_files = audio_static_js_files + image_loader_static_js_files
+ in_files = image_loader_static_js_files
deps = [
- "//ui/file_manager/audio_player/js:js_modules",
- "//ui/file_manager/image_loader:background.m",
+ "//ui/file_manager/image_loader:background",
"//ui/file_manager/image_loader:js_modules",
]
}
@@ -110,13 +109,13 @@ preprocess_if_expr("preprocess_generated") {
out_folder = preprocess_folder
out_manifest = "$target_gen_dir/manifest_preprocess_generated.json"
- in_files = generated_js_files
+ in_files = generated_js_files + ts_generated_templates
deps = [
+ ":html_wrapper_files",
"//ui/file_manager/base/gn:file_types_data_gen_js",
"//ui/file_manager/file_manager/foreground/elements:elements",
"//ui/file_manager/file_manager/foreground/elements:web_components",
- "//ui/file_manager/file_manager/foreground/js/ui:web_components",
"//ui/file_manager/file_manager/foreground/js/ui/banners:web_components",
]
}
@@ -127,70 +126,143 @@ preprocess_if_expr("preprocess_generated_image_loader") {
out_manifest =
"$target_gen_dir/manifest_preprocess_generated_image_loader.json"
- in_files = audio_generated_js_files + image_loader_generated_js_files
+ in_files = image_loader_generated_js_files
- deps = [
- "//ui/file_manager/audio_player/elements:web_components",
- "//ui/file_manager/image_loader:copy_from_filesapp",
+ deps = [ "//ui/file_manager/image_loader:copy_from_filesapp" ]
+}
+
+ts_library("build_ts") {
+ root_dir = preprocess_folder
+ out_dir = "$target_gen_dir/tsc"
+ tsconfig_base = "tsconfig_base.json"
+ composite = true
+
+ extra_deps = [
+ ":copy_definition",
+ ":copy_fmp",
+ ":copy_ts",
+ ":generate_definitions",
+ ":preprocess_generated",
+ ":preprocess_generated_image_loader",
+ ":preprocess_static",
+ ":preprocess_static_image_loader",
+ ]
+
+ deps = [ "//ui/webui/resources:library" ]
+
+ in_files =
+ static_js_files + generated_js_files + ts_files + ts_generated_templates +
+ image_loader_static_js_files + image_loader_generated_js_files
+
+ definitions = [
+ "$preprocess_folder/file_manager/externs/file_manager_private.js",
+ "$target_gen_dir/file_manager/definitions/file_manager.d.ts",
+ "$target_gen_dir/file_manager/externs/volume_manager.d.ts",
]
}
+ts_library("test_build_ts") {
+ testonly = true
+ root_dir = preprocess_folder
+ out_dir = "$target_gen_dir/tsc"
+ tsconfig_base = "tsconfig_base.json"
+
+ in_files = ts_test_files
+
+ path_mappings = [
+ # for chai_assert.js.
+ "chrome://webui-test/*|" +
+ rebase_path("$root_gen_dir/chrome/test/data/webui/tsc/*",
+ target_gen_dir),
+ ]
+
+ definitions = [
+ "$preprocess_folder/file_manager/externs/file_manager_private.js",
+ "$target_gen_dir/file_manager/definitions/file_error.d.ts",
+ "$target_gen_dir/file_manager/definitions/file_manager.d.ts",
+ "$target_gen_dir/file_manager/externs/volume_manager.d.ts",
+ ]
+
+ deps = [ ":build_ts" ]
+ extra_deps = [
+ ":copy_definition",
+ ":copy_fmp",
+ ":copy_ts",
+ ":generate_definitions",
+ ]
+}
+
+ts_definitions("generate_definitions") {
+ root_dir = "."
+ out_dir = target_gen_dir
+
+ js_files = [
+ "file_manager/common/js/volume_manager_types.js",
+ "file_manager/externs/entry_location.js",
+ "file_manager/externs/files_app_entry_interfaces.js",
+ "file_manager/externs/volume_info.js",
+ "file_manager/externs/volume_info_list.js",
+ "file_manager/externs/volume_manager.js",
+ ]
+}
+
+# Copy definition files to GEN folder, so they can import relatively the
+# generated definitions.
+copy("copy_definition") {
+ sources = [
+ "file_manager/definitions/file_error.d.ts",
+ "file_manager/definitions/file_manager.d.ts",
+ ]
+ outputs = [ "$target_gen_dir/{{source_target_relative}}" ]
+}
+
+copy("copy_ts") {
+ sources = ts_files + ts_test_files
+ outputs = [ "$preprocess_folder/{{source_target_relative}}" ]
+}
+
+copy("copy_fmp") {
+ sources = [ "//third_party/closure_compiler/externs/file_manager_private.js" ]
+ outputs = [ "$preprocess_folder/file_manager/externs/{{source_file_part}}" ]
+}
+
+js_library("js_from_ts") {
+ sources = []
+ foreach(_t, ts_files) {
+ sources += [ "$target_gen_dir/tsc/" + string_replace(_t, ".ts", ".js") ]
+ }
+ extra_deps = [ ":build_ts" ]
+}
+
grd_prefix = "file_manager_gen"
generated_grd = "$target_gen_dir/${grd_prefix}_resources.grd"
generate_grd("build_grd") {
out_grd = generated_grd
- grdp_files = [
- "$target_gen_dir/audio_player/static_resources.grdp",
- "$target_gen_dir/file_manager/static_resources.grdp",
- ]
+ grdp_files = [ "$target_gen_dir/file_manager/static_resources.grdp" ]
deps = [
":build_ts",
- "audio_player:build_static_grdp",
"file_manager:build_static_grdp",
- "//ui/file_manager/audio_player/js:build",
- "//ui/file_manager/audio_player/js:build_background",
- "//ui/file_manager/audio_player/js:build_worker",
- "//ui/file_manager/file_manager:fix_broken_images",
"//ui/file_manager/image_loader:build",
]
input_files_base_dir = rebase_path(target_gen_dir, root_build_dir)
- input_files = [
- "audio_player/js/main.rollup.js",
- "audio_player/js/main_background.rollup.js",
- "audio_player/js/metadata_worker.rollup.js",
- "audio_player/js/shared.m.rollup.js",
- "audio_player/js/runtime_loaded_test_util.rollup.js",
-
- # Fix broken images:
- "file_manager/images/files/ui/arrow_right.svg",
- "file_manager/images/files/ui/state_banner_icon.svg",
- "file_manager/images/files/ui/warning_banner_icon.svg",
- "file_manager/images/files/ui/menu_ng.svg",
-
- "image_loader/background.m.rollup.js",
- ]
+ input_files = [ "image_loader/background.rollup.js" ]
- resource_path_rewrites = [
- "audio_player/js/main.rollup.js|audio_player/js/main.js",
- "audio_player/js/main_background.rollup.js|audio_player/js/main_background.js",
- "audio_player/js/metadata_worker.rollup.js|audio_player/js/metadata_worker.js",
- "audio_player/js/runtime_loaded_test_util.rollup.js|audio_player/js/runtime_loaded_test_util.js",
- "image_loader/background.m.rollup.js|image_loader/background.m.js",
- ]
+ resource_path_rewrites =
+ [ "image_loader/background.rollup.js|image_loader/background.js" ]
if (optimize_webui) {
input_files += [
- "file_manager/background/js/main_background.m.rollup.js",
+ "file_manager/background/js/main_background.rollup.js",
"file_manager/background/js/runtime_loaded_test_util.rollup.js",
- "file_manager/background/js/shared.m.rollup.js",
- "file_manager/foreground/js/deferred_elements.m.rollup.js",
+ "file_manager/background/js/shared.rollup.js",
+ "file_manager/foreground/js/deferred_elements.rollup.js",
"file_manager/foreground/js/main.rollup.js",
"file_manager/foreground/js/metadata_dispatcher.rollup.js",
- "file_manager/foreground/js/shared.m.rollup.js",
+ "file_manager/foreground/js/shared.rollup.js",
"image_loader/image_orientation.js",
"image_loader/lru_cache.js",
@@ -199,9 +271,9 @@ generate_grd("build_grd") {
]
resource_path_rewrites += [
- "file_manager/background/js/main_background.m.rollup.js|file_manager/background/js/main_background.m.js",
+ "file_manager/background/js/main_background.rollup.js|file_manager/background/js/main_background.js",
"file_manager/background/js/runtime_loaded_test_util.rollup.js|file_manager/background/js/runtime_loaded_test_util.js",
- "file_manager/foreground/js/deferred_elements.m.rollup.js|file_manager/foreground/js/deferred_elements.m.js",
+ "file_manager/foreground/js/deferred_elements.rollup.js|file_manager/foreground/js/deferred_elements.js",
"file_manager/foreground/js/main.rollup.js|file_manager/foreground/js/main.js",
"file_manager/foreground/js/metadata_dispatcher.rollup.js|file_manager/foreground/js/metadata/metadata_dispatcher.js",
]
@@ -213,16 +285,8 @@ generate_grd("build_grd") {
"//ui/file_manager/file_manager/foreground/js:build_worker",
]
} else {
- manifest_files = [
- "$target_gen_dir/manifest_preprocess_generated_image_loader.json",
- "$target_gen_dir/manifest_preprocess_static_image_loader.json",
- "$target_gen_dir/tsconfig.manifest",
- ]
-
- deps += [
- ":preprocess_generated_image_loader",
- ":preprocess_static_image_loader",
- ]
+ manifest_files =
+ filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
}
}
@@ -245,23 +309,32 @@ grit("file_manager_gen_resources") {
output_dir = target_gen_dir
}
-copy("copy_ts") {
- sources = ts_files
- outputs = [ "$preprocess_folder/{{source_target_relative}}" ]
+html_to_wrapper("html_wrapper_files") {
+ in_files = ts_templates
}
-ts_library("build_ts") {
- root_dir = preprocess_folder
- out_dir = "$target_gen_dir/tsc"
- tsconfig_base = "tsconfig_base.json"
+# GRD for test files.
+generate_grd("build_tests_grdp") {
+ testonly = true
+ grd_prefix = "file_manager_test"
+ out_grd = "$target_gen_dir/tests_resources.grdp"
- extra_deps = [
- ":copy_ts",
- ":preprocess_generated",
- ":preprocess_static",
- ]
+ input_files_base_dir = rebase_path(".", "//")
+ input_files = unittest_files
+}
- deps = [ "//ui/webui/resources:library" ]
+# GRD for the actual application files that are processed by TS compiler.
+generate_grd("build_tests_gen_grdp") {
+ testonly = true
+ grd_prefix = "file_manager_test"
+ out_grd = "$target_gen_dir/tests_gen_resources.grdp"
- in_files = static_js_files + generated_js_files + ts_files
+ manifest_files =
+ filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ]) +
+ filter_include(get_target_outputs(":test_build_ts"), [ "*.manifest" ])
+
+ deps = [
+ ":build_ts",
+ ":test_build_ts",
+ ]
}
diff --git a/chromium/ui/file_manager/audio_player/BUILD.gn b/chromium/ui/file_manager/audio_player/BUILD.gn
deleted file mode 100644
index 7f7a2ad0dca..00000000000
--- a/chromium/ui/file_manager/audio_player/BUILD.gn
+++ /dev/null
@@ -1,50 +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.
-
-import("//ui/webui/resources/tools/generate_grd.gni")
-
-generated_static_grdp = "$target_gen_dir/static_resources.grdp"
-
-generate_grd("build_static_grdp") {
- out_grd = generated_static_grdp
- grd_prefix = "audio_player"
-
- resource_path_prefix = "audio_player"
-
- input_files_base_dir = rebase_path(".", "//")
-
- input_files = [
- # Images:
- "assets/100/player_button_next.png",
- "assets/100/player_button_pause.png",
- "assets/100/player_button_playlist.png",
- "assets/100/player_button_play.png",
- "assets/100/player_button_previous.png",
- "assets/100/player_button_repeat_one.png",
- "assets/100/player_button_repeat.png",
- "assets/100/player_button_shuffle.png",
- "assets/100/player_button_volume_muted.png",
- "assets/100/player_button_volume.png",
- "assets/100/player_cover_close.png",
- "assets/100/player_cover_open.png",
- "assets/100/player_no_artwork.png",
- "assets/100/playlist_now_playing.png",
- "assets/100/playlist_play.png",
- "assets/200/player_button_next.png",
- "assets/200/player_button_pause.png",
- "assets/200/player_button_playlist.png",
- "assets/200/player_button_play.png",
- "assets/200/player_button_previous.png",
- "assets/200/player_button_repeat_one.png",
- "assets/200/player_button_repeat.png",
- "assets/200/player_button_shuffle.png",
- "assets/200/player_button_volume_muted.png",
- "assets/200/player_button_volume.png",
- "assets/200/player_cover_close.png",
- "assets/200/player_cover_open.png",
- "assets/200/player_no_artwork.png",
- "assets/200/playlist_now_playing.png",
- "assets/200/playlist_play.png",
- ]
-}
diff --git a/chromium/ui/file_manager/audio_player/elements/BUILD.gn b/chromium/ui/file_manager/audio_player/elements/BUILD.gn
deleted file mode 100644
index 9e8d7d9704f..00000000000
--- a/chromium/ui/file_manager/audio_player/elements/BUILD.gn
+++ /dev/null
@@ -1,71 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/html_to_js.gni")
-
-html_to_js("web_components") {
- js_files = [
- "audio_player.js",
- "control_panel.js",
- "track_info_panel.js",
- "track_list.js",
- "repeat_button.js",
- ]
-}
-
-js_library("audio_player") {
- deps = [
- ":control_panel",
- ":track_info_panel",
- ":track_list",
- "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- ]
-}
-
-js_library("control_panel") {
- deps = [
- ":repeat_button",
- "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/file_manager/file_manager/foreground/elements:files_icon_button",
- "//ui/webui/resources/js:assert.m",
- ]
- externs_list =
- [ "//ui/webui/resources/cr_elements/cr_slider/cr_slider_externs.js" ]
-}
-
-js_library("track_info_panel") {
- deps = [
- "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
- ]
-}
-
-js_library("track_list") {
- deps = [
- "//third_party/polymer/v3_0/components-chromium/paper-ripple:paper-ripple",
- "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- ]
-}
-
-js_library("repeat_button") {
- deps = [
- "//third_party/polymer/v3_0/components-chromium/iron-behaviors:iron-button-state",
- "//third_party/polymer/v3_0/components-chromium/iron-behaviors:iron-control-state",
- "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/file_manager/file_manager/foreground/elements:files_toggle_ripple",
- ]
-}
-
-js_type_check("closure_compile") {
- is_polymer3 = true
- closure_flags = default_closure_args + [ "browser_resolver_prefix_replacements=\"chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/=../../ui/file_manager/file_manager/\"" ]
- deps = [
- ":audio_player",
- ":control_panel",
- ":repeat_button",
- ":track_info_panel",
- ":track_list",
- ]
-}
diff --git a/chromium/ui/file_manager/audio_player/js/BUILD.gn b/chromium/ui/file_manager/audio_player/js/BUILD.gn
deleted file mode 100644
index 0185e680489..00000000000
--- a/chromium/ui/file_manager/audio_player/js/BUILD.gn
+++ /dev/null
@@ -1,197 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//chrome/browser/resources/tools/optimize_webui.gni")
-import("//third_party/closure_compiler/compile_js.gni")
-
-group("closure_compile") {
- testonly = true
- deps = [
- ":closure_compile_jsmodules",
- ":closure_compile_polymer",
- ]
-}
-
-group("js_modules") {
- deps = [
- ":audio_player",
- ":background",
- ":error_util",
- ":main",
- ":main_background",
- ":test_util",
- ]
-}
-
-js_type_check("closure_compile_jsmodules") {
- deps = [
- ":background",
- ":error_util",
- ":metadata_worker",
- ]
- closure_flags = default_closure_args + [
- "js_module_root=gen/ui/file_manager/",
- "js_module_root=../../ui/file_manager/",
- ]
-}
-
-js_type_check("closure_compile_polymer") {
- is_polymer3 = true
- closure_flags = default_closure_args + [
- "js_module_root=gen/ui/file_manager/",
- "js_module_root=../../ui/file_manager/",
- "browser_resolver_prefix_replacements=\"chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/=./file_manager/\"",
- "browser_resolver_prefix_replacements=\"chrome-extension://pmfjbimdmchhbnneeidfognadeopoehp/=./image_loader/\"",
- ]
-
- deps = [
- ":audio_player",
- ":main",
- ]
-}
-
-js_library("audio_player") {
- deps = [
- "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/file_manager/audio_player/elements:audio_player",
- "//ui/file_manager/file_manager/common/js:app_util",
- "//ui/file_manager/file_manager/common/js:async_util",
- "//ui/file_manager/file_manager/common/js:filtered_volume_manager",
- "//ui/file_manager/file_manager/common/js:mediasession_types",
- "//ui/file_manager/file_manager/common/js:util",
- "//ui/file_manager/file_manager/common/js:volume_manager_types",
- "//ui/file_manager/file_manager/externs:volume_manager",
- "//ui/file_manager/file_manager/foreground/js/metadata:content_metadata_provider",
- "//ui/file_manager/file_manager/foreground/js/metadata:metadata_model",
- "//ui/webui/resources/js:load_time_data.m",
- ]
-
- externs_list = [
- "//ui/file_manager/file_manager/externs/audio_player_foreground.js",
- "$externs_path/mediasession.js",
- ]
-}
-
-js_library("background") {
- deps = [
- "//ui/file_manager/file_manager/background/js:app_window_wrapper",
- "//ui/file_manager/file_manager/background/js:background_base",
- "//ui/file_manager/file_manager/common/js:file_type",
- "//ui/file_manager/file_manager/common/js:util",
- ]
-}
-
-js_library("error_util") {
-}
-
-js_library("metadata_worker") {
- deps = [
- "//ui/file_manager/file_manager/foreground/js/metadata:metadata_dispatcher",
- ]
-}
-
-js_library("test_util") {
- deps = [
- ":background",
- "//ui/file_manager/file_manager/background/js:test_util_base",
- ]
-}
-
-js_library("main") {
- deps = [ ":audio_player" ]
-}
-
-js_library("main_background") {
- deps = [
- ":background",
- ":error_util",
- ":test_util",
- ]
-}
-
-preprocess_folder =
- rebase_path("$target_gen_dir/../../preprocessed/audio_player/js",
- root_build_dir)
-
-files_app_path =
- rebase_path("$root_gen_dir/ui/file_manager/preprocessed/file_manager",
- root_build_dir)
-image_loader_path =
- rebase_path("$root_gen_dir/ui/file_manager/preprocessed/image_loader",
- root_build_dir)
-optimize_webui("build") {
- host = "audio_player"
-
- input = preprocess_folder
- js_module_in_files = [ "main.js" ]
-
- js_out_files = [ "main.rollup.js" ]
-
- external_paths = [
- "chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj|$files_app_path",
- "chrome-extension://pmfjbimdmchhbnneeidfognadeopoehp|$image_loader_path",
- ]
-
- deps = [
- ":main",
- "//ui/file_manager:preprocess_generated",
- "//ui/file_manager:preprocess_generated_image_loader",
- "//ui/file_manager:preprocess_static",
- "//ui/file_manager:preprocess_static_image_loader",
- "//ui/webui/resources:library",
- "//ui/webui/resources:preprocess",
- ]
-}
-
-optimize_webui("build_worker") {
- host = "audio_player"
-
- input = preprocess_folder
- js_module_in_files = [ "metadata_worker.js" ]
-
- js_out_files = [ "metadata_worker.rollup.js" ]
-
- external_paths = [
- "chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj|$files_app_path",
- "chrome-extension://pmfjbimdmchhbnneeidfognadeopoehp|$image_loader_path",
- ]
-
- deps = [
- "//ui/file_manager:preprocess_generated",
- "//ui/file_manager:preprocess_generated_image_loader",
- "//ui/file_manager:preprocess_static",
- "//ui/file_manager:preprocess_static_image_loader",
- "//ui/webui/resources:preprocess",
- ]
-}
-
-optimize_webui("build_background") {
- host = "audio_player"
-
- input = preprocess_folder
- js_module_in_files = [
- "main_background.js",
- "../../file_manager/background/js/runtime_loaded_test_util.js",
- ]
-
- js_out_files = [
- "main_background.rollup.js",
- "runtime_loaded_test_util.rollup.js",
- "shared.m.rollup.js",
- ]
-
- external_paths = [
- "chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj|$files_app_path",
- "chrome-extension://pmfjbimdmchhbnneeidfognadeopoehp|$image_loader_path",
- ]
-
- deps = [
- ":main_background",
- "//ui/file_manager:preprocess_generated",
- "//ui/file_manager:preprocess_generated_image_loader",
- "//ui/file_manager:preprocess_static",
- "//ui/file_manager:preprocess_static_image_loader",
- "//ui/webui/resources:preprocess",
- ]
-}
diff --git a/chromium/ui/file_manager/base/gn/BUILD.gn b/chromium/ui/file_manager/base/gn/BUILD.gn
index 9999c89e70a..d349a231b2b 100644
--- a/chromium/ui/file_manager/base/gn/BUILD.gn
+++ b/chromium/ui/file_manager/base/gn/BUILD.gn
@@ -19,7 +19,10 @@ source_set("file_types_data_cpp") {
"$root_gen_dir/ui/file_manager/file_types_data.cc",
"$root_gen_dir/ui/file_manager/file_types_data.h",
]
- deps = [ ":file_types_data_gen_cpp" ]
+ deps = [
+ ":file_types_data_gen_cpp",
+ "//base",
+ ]
}
json_data_generator("file_types_data_gen_js") {
diff --git a/chromium/ui/file_manager/base/gn/js_test_gen_html.gni b/chromium/ui/file_manager/base/gn/js_test_gen_html.gni
deleted file mode 100644
index 01b3612fb38..00000000000
--- a/chromium/ui/file_manager/base/gn/js_test_gen_html.gni
+++ /dev/null
@@ -1,104 +0,0 @@
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/closure_compiler/js_unit_tests.gni")
-
-# Describes a list of js_unittest targets that will each have a generated HTML
-# file that imports the test JS module and adds the test* functions to the
-# window to be consumed by the test harness.
-#
-# A companion group target with a "_type_check_auto" suffix is also generated
-# with this template. This depends on a list of js_type_check(..) targets -- one
-# for # each test -- that will type check the test js file and its dependency
-# subtree.
-#
-# Must be declared after the js_library targets it depends on.
-#
-# Note js_type_check() is only in effect if `closure_compile` is set in gn args.
-#
-# Variables:
-# deps:
-# List of js_unittest targets to depend on
-#
-# is_polymer3:
-# Boolean indicating that it's a test for a Polymer 3 element, the only
-# difference is the js_type_check() rule also has the is_polymer3=true.
-#
-#
-# Non-Polymer example:
-# js_test_gen_html("folder_tests") {
-# deps = [
-# ":foo_unittest",
-# ":bar_unittest",
-# ":baz_unittest",
-# ]
-# }
-#
-# group("closure_compile") {
-# # ...
-# ":folder_tests_type_check_auto".
-# }
-#
-# test("browser_tests") {
-# # ...
-# data_deps += [ "//folder:folder_tests" ]
-# }
-#
-# Polymer example:
-# js_test_gen_html("polymer_tests") {
-# is_polymer3 = true
-# deps = [
-# ":element1_unittest",
-# ]
-# }
-#
-template("js_test_gen_html") {
- html_gen_target_name = target_name + "_gen_html"
- action_foreach(html_gen_target_name) {
- script_path = "//ui/file_manager/base/gn/"
- script = "$script_path/js_test_gen_html.py"
- forward_variables_from(invoker, [ "deps" ])
-
- testonly = true
- sources = []
- foreach(dep, deps) {
- sources += get_target_outputs(dep)
- }
-
- outputs = [ "$target_gen_dir/{{source_name_part}}_gen.html" ]
- args = [ "--output" ] + rebase_path(outputs, root_build_dir)
- args += [
- "--src_path",
- rebase_path("//"),
- ]
- args += [ "--input" ] + [ "{{source}}" ]
- }
-
- type_check_deps = []
- foreach(dep, invoker.deps) {
- type_check_target_name = target_name + "_" + dep + "_type_check_auto"
- type_check_deps += [ ":$type_check_target_name" ]
- js_type_check(type_check_target_name) {
- testonly = true
- forward_variables_from(invoker,
- [
- "closure_flags",
- "is_polymer3",
- ])
- deps = [ dep ]
- }
- }
-
- type_check_group_name = target_name + "_type_check_auto"
- group(type_check_group_name) {
- testonly = true
- deps = type_check_deps
- }
-
- group(target_name) {
- data = get_target_outputs(":$html_gen_target_name")
- testonly = true
- deps = [ ":$html_gen_target_name" ]
- }
-}
diff --git a/chromium/ui/file_manager/base/gn/js_test_type_check.gni b/chromium/ui/file_manager/base/gn/js_test_type_check.gni
new file mode 100644
index 00000000000..35454ac6e04
--- /dev/null
+++ b/chromium/ui/file_manager/base/gn/js_test_type_check.gni
@@ -0,0 +1,74 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//third_party/closure_compiler/js_unit_tests.gni")
+
+# Generates one target that depends on a list of `js_type_check(...)` targets --
+# one for each test -- that will type check the test js file and its dependency
+# subtree.
+#
+# Must be declared after the js_library targets it depends on.
+#
+# Note js_type_check() is only in effect if `enable_js_type_check` is set in gn
+# args.
+#
+# Variables:
+# deps:
+# List of js_unittest() targets to depend on.
+#
+# extra_deps:
+# List of other deps that aren't js_unittest().
+#
+# is_polymer3:
+# Boolean indicating that it's a test for a Polymer 3 element, the only
+# difference is the js_type_check() rule also has the is_polymer3=true.
+#
+#
+# Non-Polymer example:
+# js_test_type_check("folder_tests") {
+# deps = [
+# ":foo_unittest",
+# ":bar_unittest",
+# ":baz_unittest",
+# ]
+# }
+#
+# group("closure_compile") {
+# # ...
+# ":folder_tests".
+# }
+#
+# Polymer example:
+# js_test_type_check("polymer_tests") {
+# is_polymer3 = true
+# deps = [
+# ":element1_unittest",
+# ]
+# }
+#
+template("js_test_type_check") {
+ type_check_deps = []
+ foreach(dep, invoker.deps) {
+ type_check_target_name = target_name + "_" + dep
+ type_check_deps += [ ":$type_check_target_name" ]
+ js_type_check(type_check_target_name) {
+ testonly = true
+ forward_variables_from(invoker,
+ [
+ "closure_flags",
+ "is_polymer3",
+ ])
+ deps = [ dep ]
+ if (defined(invoker.extra_deps)) {
+ deps += invoker.extra_deps
+ }
+ }
+ }
+
+ type_check_group_name = target_name
+ group(type_check_group_name) {
+ testonly = true
+ deps = type_check_deps
+ }
+}
diff --git a/chromium/ui/file_manager/file_manager/BUILD.gn b/chromium/ui/file_manager/file_manager/BUILD.gn
index bfccfbbcfa7..cca9a8043fb 100644
--- a/chromium/ui/file_manager/file_manager/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/BUILD.gn
@@ -4,17 +4,6 @@
import("//ui/webui/resources/tools/generate_grd.gni")
-# TODO: Remove this file copy when breadcrumb.js supports only JS modules.
-copy("fix_broken_images") {
- sources = [
- "foreground/images/files/ui/arrow_right.svg",
- "foreground/images/files/ui/menu_ng.svg",
- "foreground/images/files/ui/state_banner_icon.svg",
- "foreground/images/files/ui/warning_banner_icon.svg",
- ]
- outputs = [ "$target_gen_dir/images/files/ui/{{source_file_part}}" ]
-}
-
generated_static_grdp = "$target_gen_dir/static_resources.grdp"
generate_grd("build_static_grdp") {
@@ -38,6 +27,7 @@ generate_grd("build_static_grdp") {
"common/js/file_type.js",
"common/js/files_app_entry_types.js",
"common/js/files_app_state.js",
+ "common/js/icon_util.js",
"common/js/mock_chrome.js",
"common/js/power.js",
"common/js/storage_adapter.js",
@@ -72,12 +62,14 @@ generate_grd("build_static_grdp") {
"foreground/images/files/ui/back.svg",
"foreground/images/files/ui/state_banner_icon.svg",
"foreground/images/files/ui/warning_banner_icon.svg",
+ "foreground/images/files/ui/error_banner_icon.svg",
"foreground/images/files/ui/cloud_import_syncing.svg",
"foreground/images/files/ui/delete.svg",
"foreground/images/files/ui/delete_ng.svg",
"foreground/images/files/ui/drive_logo.svg",
"foreground/images/files/ui/drive_offline_icon.svg",
"foreground/images/files/ui/photos_logo.svg",
+ "foreground/images/files/ui/empty_folder.svg",
"foreground/images/files/ui/external_link.svg",
"foreground/images/files/ui/filetype_placeholder_generic.svg",
"foreground/images/files/ui/holding_space_welcome_image.svg",
diff --git a/chromium/ui/file_manager/file_manager/background/js/BUILD.gn b/chromium/ui/file_manager/file_manager/background/js/BUILD.gn
index bf93b8dabf6..0f88443dd68 100644
--- a/chromium/ui/file_manager/file_manager/background/js/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/background/js/BUILD.gn
@@ -5,7 +5,7 @@
import("//chrome/browser/resources/tools/optimize_webui.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//third_party/closure_compiler/js_unit_tests.gni")
-import("//ui/file_manager/base/gn/js_test_gen_html.gni")
+import("//ui/file_manager/base/gn/js_test_type_check.gni")
import("//ui/webui/resources/js/cr.gni")
# TODO(tapted): This folder should be restricted to file_manager, but related
@@ -14,18 +14,13 @@ import("//ui/webui/resources/js/cr.gni")
# document externally-exposed targets visible with this helper, and hide
# transitive dependencies (but note those transitive dependencies should move
# elsewhere too).
-related_apps = [
- "//ui/file_manager/audio_player/*",
- "//ui/file_manager/file_manager/*",
- "//ui/file_manager/gallery/*",
- "//ui/file_manager/video_player/*",
-]
+related_apps = [ "//ui/file_manager/file_manager/*" ]
group("closure_compile") {
testonly = true
deps = [
":closure_compile_jsmodules",
- ":js_test_gen_html_modules_type_check_auto",
+ ":js_test_type_check",
":test_support_modules_type_check",
]
}
@@ -89,9 +84,10 @@ js_type_check("closure_compile_jsmodules") {
closure_flags =
strict_error_checking_closure_args + [
+ "language_in=ECMASCRIPT_2020",
"js_module_root=./gen/ui",
"js_module_root=../../ui",
- "browser_resolver_prefix_replacements=\"chrome://test/=./\"",
+ "browser_resolver_prefix_replacements=\"chrome://webui-test/=./\"",
"hide_warnings_for=third_party/",
]
}
@@ -110,9 +106,10 @@ js_type_check("test_support_modules_type_check") {
]
closure_flags =
strict_error_checking_closure_args + [
+ "language_in=ECMASCRIPT_2020",
"js_module_root=./gen/ui",
"js_module_root=../../ui",
- "browser_resolver_prefix_replacements=\"chrome://test/=./\"",
+ "browser_resolver_prefix_replacements=\"chrome://webui-test/=./\"",
"hide_warnings_for=third_party/",
]
}
@@ -169,7 +166,7 @@ js_library("background") {
]
}
-js_library("main_background.m") {
+js_library("main_background") {
visibility = []
visibility = [
":*",
@@ -213,12 +210,12 @@ js_library("mock_crostini") {
"//ui/file_manager/file_manager/externs/background:crostini",
]
visibility += [
- "//ui/file_manager/file_manager/foreground/js:file_tasks_unittest.m",
- "//ui/file_manager/file_manager/foreground/js:task_controller_unittest.m",
+ "//ui/file_manager/file_manager/foreground/js:file_tasks_unittest",
+ "//ui/file_manager/file_manager/foreground/js:task_controller_unittest",
]
}
-js_unittest("crostini_unittest.m") {
+js_unittest("crostini_unittest") {
deps = [
":mock_crostini",
"//chrome/test/data/webui:chai_assert",
@@ -247,7 +244,7 @@ js_library("device_handler") {
]
}
-js_unittest("device_handler_unittest.m") {
+js_unittest("device_handler_unittest") {
deps = [
":device_handler",
":mock_progress_center",
@@ -271,9 +268,8 @@ js_library("mock_drive_sync_handler") {
"//ui/file_manager/file_manager/externs/background:drive_sync_handler",
"//ui/webui/resources/js/cr:event_target.m",
]
- visibility += [
- "//ui/file_manager/file_manager/foreground/js:actions_model_unittest.m",
- ]
+ visibility +=
+ [ "//ui/file_manager/file_manager/foreground/js:actions_model_unittest" ]
}
js_library("drive_sync_handler") {
@@ -291,7 +287,7 @@ js_library("drive_sync_handler") {
]
}
-js_unittest("drive_sync_handler_unittest.m") {
+js_unittest("drive_sync_handler_unittest") {
deps = [
":drive_sync_handler",
":mock_progress_center",
@@ -317,7 +313,7 @@ js_library("duplicate_finder") {
]
}
-js_unittest("duplicate_finder_unittest.m") {
+js_unittest("duplicate_finder_unittest") {
deps = [
":duplicate_finder",
":mock_volume_manager",
@@ -344,6 +340,7 @@ js_library("entry_location_impl") {
js_library("file_operation_handler") {
deps = [
+ "//ui/file_manager/file_manager/common/js:api",
"//ui/file_manager/file_manager/common/js:file_operation_common",
"//ui/file_manager/file_manager/common/js:progress_center_common",
"//ui/file_manager/file_manager/common/js:util",
@@ -352,7 +349,7 @@ js_library("file_operation_handler") {
]
}
-js_unittest("file_operation_handler_unittest.m") {
+js_unittest("file_operation_handler_unittest") {
deps = [
":file_operation_handler",
":file_operation_util",
@@ -373,7 +370,7 @@ js_library("mock_file_operation_manager") {
"//ui/webui/resources/js/cr:event_target.m",
]
visibility += [
- "//ui/file_manager/file_manager/foreground/js:directory_model_unittest.m",
+ "//ui/file_manager/file_manager/foreground/js:directory_model_unittest",
]
}
@@ -386,6 +383,7 @@ js_library("file_operation_manager") {
"//ui/file_manager/file_manager/common/js:api",
"//ui/file_manager/file_manager/common/js:async_util",
"//ui/file_manager/file_manager/common/js:file_operation_common",
+ "//ui/file_manager/file_manager/common/js:files_app_entry_types",
"//ui/file_manager/file_manager/common/js:trash",
"//ui/file_manager/file_manager/common/js:util",
"//ui/file_manager/file_manager/common/js:volume_manager_types",
@@ -398,7 +396,7 @@ js_library("file_operation_manager") {
]
}
-js_unittest("file_operation_manager_unittest.m") {
+js_unittest("file_operation_manager_unittest") {
deps = [
":file_operation_manager",
":file_operation_util",
@@ -432,7 +430,7 @@ js_library("metadata_proxy") {
deps = [ "//ui/file_manager/file_manager/common/js:lru_cache" ]
}
-js_unittest("metadata_proxy_unittest.m") {
+js_unittest("metadata_proxy_unittest") {
deps = [
":metadata_proxy",
"//chrome/test/data/webui:chai_assert",
@@ -455,7 +453,7 @@ js_library("import_history") {
]
}
-js_unittest("import_history_unittest.m") {
+js_unittest("import_history_unittest") {
deps = [
":import_history",
"//chrome/test/data/webui:chai_assert",
@@ -499,7 +497,7 @@ js_library("media_import_handler") {
]
}
-js_unittest("media_import_handler_unittest.m") {
+js_unittest("media_import_handler_unittest") {
deps = [
":file_operation_util",
":media_import_handler",
@@ -530,7 +528,7 @@ js_library("mock_media_scanner") {
"//ui/file_manager/file_manager/externs/background:media_scanner",
]
visibility += [
- "//ui/file_manager/file_manager/foreground/js:import_controller_unittest.m",
+ "//ui/file_manager/file_manager/foreground/js:import_controller_unittest",
]
}
@@ -543,11 +541,11 @@ js_library("media_scanner") {
"//ui/webui/resources/js:assert.m",
]
visibility += [
- "//ui/file_manager/file_manager/foreground/js:import_controller_unittest.m",
+ "//ui/file_manager/file_manager/foreground/js:import_controller_unittest",
]
}
-js_unittest("media_scanner_unittest.m") {
+js_unittest("media_scanner_unittest") {
deps = [
":file_operation_util",
":media_scanner",
@@ -587,7 +585,7 @@ js_library("mock_progress_center") {
"//ui/file_manager/file_manager/externs/background:progress_center",
]
visibility +=
- [ "//ui/file_manager/file_manager/foreground/js:file_tasks_unittest.m" ]
+ [ "//ui/file_manager/file_manager/foreground/js:file_tasks_unittest" ]
}
js_library("progress_center") {
@@ -629,12 +627,12 @@ js_library("volume_info_impl") {
"//ui/webui/resources/js:assert.m",
]
visibility += [
- "//ui/file_manager/file_manager/foreground/js:navigation_list_model_unittest.m",
- "//ui/file_manager/file_manager/foreground/js:providers_model_unittest.m",
+ "//ui/file_manager/file_manager/foreground/js:navigation_list_model_unittest",
+ "//ui/file_manager/file_manager/foreground/js:providers_model_unittest",
]
}
-js_unittest("task_queue_unittest.m") {
+js_unittest("task_queue_unittest") {
deps = [
":task_queue",
"//chrome/test/data/webui:chai_assert",
@@ -687,19 +685,20 @@ js_library("trash") {
deps = [
":file_operation_util",
"//ui/file_manager/file_manager/common/js:trash",
+ "//ui/file_manager/file_manager/common/js:util",
"//ui/file_manager/file_manager/externs:volume_manager",
"//ui/webui/resources/js:assert.m",
- "//ui/webui/resources/js:load_time_data.m",
]
}
-js_unittest("trash_unittest.m") {
+js_unittest("trash_unittest") {
deps = [
":mock_volume_manager",
":trash",
"//chrome/test/data/webui:chai_assert",
"//ui/file_manager/file_manager/common/js:mock_entry",
"//ui/file_manager/file_manager/common/js:trash",
+ "//ui/file_manager/file_manager/common/js:util",
"//ui/file_manager/file_manager/common/js:volume_manager_types",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
@@ -714,7 +713,7 @@ js_library("volume_info_list_impl") {
]
}
-js_unittest("mount_metrics_unittest.m") {
+js_unittest("mount_metrics_unittest") {
deps = [
":mount_metrics",
"//chrome/test/data/webui:chai_assert",
@@ -755,7 +754,7 @@ js_library("volume_manager_factory") {
]
}
-js_unittest("volume_manager_unittest.m") {
+js_unittest("volume_manager_unittest") {
deps = [
":volume_info_impl",
":volume_manager_factory",
@@ -779,29 +778,30 @@ js_library("volume_manager_util") {
]
}
-js_test_gen_html("js_test_gen_html_modules") {
+js_test_type_check("js_test_type_check") {
deps = [
- ":crostini_unittest.m",
- ":device_handler_unittest.m",
- ":drive_sync_handler_unittest.m",
- ":duplicate_finder_unittest.m",
- ":file_operation_handler_unittest.m",
- ":file_operation_manager_unittest.m",
- ":import_history_unittest.m",
- ":media_import_handler_unittest.m",
- ":media_scanner_unittest.m",
- ":metadata_proxy_unittest.m",
- ":mount_metrics_unittest.m",
- ":task_queue_unittest.m",
- ":trash_unittest.m",
- ":volume_manager_unittest.m",
+ ":crostini_unittest",
+ ":device_handler_unittest",
+ ":drive_sync_handler_unittest",
+ ":duplicate_finder_unittest",
+ ":file_operation_handler_unittest",
+ ":file_operation_manager_unittest",
+ ":import_history_unittest",
+ ":media_import_handler_unittest",
+ ":media_scanner_unittest",
+ ":metadata_proxy_unittest",
+ ":mount_metrics_unittest",
+ ":task_queue_unittest",
+ ":trash_unittest",
+ ":volume_manager_unittest",
]
closure_flags =
strict_error_checking_closure_args + [
+ "language_in=ECMASCRIPT_2020",
"js_module_root=./gen/ui",
"js_module_root=../../ui",
- "browser_resolver_prefix_replacements=\"chrome://test/=./\"",
+ "browser_resolver_prefix_replacements=\"chrome://webui-test/=./\"",
"hide_warnings_for=third_party/",
]
}
@@ -815,18 +815,19 @@ image_loader_path =
root_build_dir)
optimize_webui("build") {
+ visibility += [ "//ui/file_manager:build_grd" ]
host = "file_manager"
input = tsc_folder
js_module_in_files = [
- "main_background.m.js",
+ "main_background.js",
"runtime_loaded_test_util.js",
]
js_out_files = [
- "main_background.m.rollup.js",
+ "main_background.rollup.js",
"runtime_loaded_test_util.rollup.js",
- "shared.m.rollup.js",
+ "shared.rollup.js",
]
external_paths = [
diff --git a/chromium/ui/file_manager/file_manager/common/js/BUILD.gn b/chromium/ui/file_manager/file_manager/common/js/BUILD.gn
index d2681715d5d..01f7e685d5c 100644
--- a/chromium/ui/file_manager/file_manager/common/js/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/common/js/BUILD.gn
@@ -4,7 +4,7 @@
import("//third_party/closure_compiler/compile_js.gni")
import("//third_party/closure_compiler/js_unit_tests.gni")
-import("//ui/file_manager/base/gn/js_test_gen_html.gni")
+import("//ui/file_manager/base/gn/js_test_type_check.gni")
import("//ui/webui/resources/js/cr.gni")
visibility = [
@@ -16,7 +16,7 @@ group("closure_compile") {
testonly = true
deps = [
":closure_compile_jsmodules",
- ":js_test_gen_html_modules_type_check_auto",
+ ":js_test_type_check",
":test_support_modules_type_check",
]
}
@@ -34,14 +34,15 @@ group("js_modules") {
":files_app_entry_types",
":filtered_volume_manager",
":glitch",
+ ":icon_util",
":importer_common",
":lru_cache",
- ":mediasession_types",
":metrics",
":metrics_base",
":notifications_browser_proxy",
":power",
":progress_center_common",
+ ":recent_date_bucket",
":storage_adapter",
":trash",
":url_constants",
@@ -63,6 +64,7 @@ js_type_check("closure_compile_jsmodules") {
":files_app_entry_types",
":filtered_volume_manager",
":glitch",
+ ":icon_util",
":importer_common",
":lru_cache",
":metrics",
@@ -72,6 +74,7 @@ js_type_check("closure_compile_jsmodules") {
":notifications_browser_proxy",
":power",
":progress_center_common",
+ ":recent_date_bucket",
":storage_adapter",
":trash",
":url_constants",
@@ -81,6 +84,7 @@ js_type_check("closure_compile_jsmodules") {
]
closure_flags = strict_error_checking_closure_args + [
+ "language_in=ECMASCRIPT_2020",
"js_module_root=./gen/ui",
"js_module_root=../../ui",
"hide_warnings_for=third_party/",
@@ -98,9 +102,10 @@ js_type_check("test_support_modules_type_check") {
closure_flags =
strict_error_checking_closure_args + [
+ "language_in=ECMASCRIPT_2020",
"js_module_root=./gen/ui",
"js_module_root=../../ui",
- "browser_resolver_prefix_replacements=\"chrome://test/=./\"",
+ "browser_resolver_prefix_replacements=\"chrome://webui-test/=./\"",
]
}
@@ -132,7 +137,7 @@ js_library("glitch") {
js_library("dialog_type") {
}
-js_unittest("files_app_entry_types_unittest.m") {
+js_unittest("files_app_entry_types_unittest") {
deps = [
":files_app_entry_types",
":mock_entry",
@@ -145,6 +150,7 @@ js_unittest("files_app_entry_types_unittest.m") {
js_library("files_app_entry_types") {
deps = [
+ ":icon_util",
"//ui/file_manager/file_manager/common/js:volume_manager_types",
"//ui/file_manager/file_manager/externs:volume_info",
]
@@ -172,7 +178,7 @@ js_library("file_type") {
]
}
-js_unittest("file_type_unittest.m") {
+js_unittest("file_type_unittest") {
deps = [
":file_type",
":mock_entry",
@@ -205,7 +211,7 @@ js_library("filtered_volume_manager") {
]
}
-js_unittest("filtered_volume_manager_unittest.m") {
+js_unittest("filtered_volume_manager_unittest") {
deps = [
":filtered_volume_manager",
"//chrome/test/data/webui:chai_assert",
@@ -237,7 +243,7 @@ js_library("test_importer_common") {
]
}
-js_unittest("importer_common_unittest.m") {
+js_unittest("importer_common_unittest") {
deps = [
":importer_common",
":mock_entry",
@@ -254,16 +260,13 @@ js_unittest("importer_common_unittest.m") {
js_library("lru_cache") {
}
-js_unittest("lru_cache_unittest.m") {
+js_unittest("lru_cache_unittest") {
deps = [
":lru_cache",
"//chrome/test/data/webui:chai_assert",
]
}
-js_library("mediasession_types") {
-}
-
js_library("metrics") {
visibility = []
visibility = [ "//ui/file_manager/file_manager/*" ]
@@ -297,11 +300,27 @@ js_library("progress_center_common") {
js_library("power") {
}
+js_library("recent_date_bucket") {
+ deps = [
+ ":util",
+ "//ui/file_manager/file_manager/externs:file_manager_private",
+ ]
+}
+
+js_unittest("recent_date_bucket_unittest") {
+ deps = [
+ ":mock_chrome",
+ ":recent_date_bucket",
+ "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:load_time_data.m",
+ ]
+}
+
js_library("storage_adapter") {
externs_list = [ "$externs_path/chrome_extensions.js" ]
}
-js_unittest("storage_adapter_unittest.m") {
+js_unittest("storage_adapter_unittest") {
deps = [
":storage_adapter",
"//chrome/test/data/webui:chai_assert",
@@ -323,11 +342,11 @@ js_library("xfm") {
js_library("trash") {
deps = [
":files_app_entry_types",
+ ":metrics",
":util",
"//ui/file_manager/file_manager/common/js:volume_manager_types",
"//ui/file_manager/file_manager/externs:files_app_entry_interfaces",
"//ui/file_manager/file_manager/externs:volume_manager",
- "//ui/webui/resources/js:assert.m",
]
}
@@ -350,7 +369,6 @@ js_library("util") {
"//ui/file_manager/file_manager/externs:volume_manager",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
- "//ui/webui/resources/js:util.m",
"//ui/webui/resources/js/cr:ui.m",
]
@@ -360,7 +378,7 @@ js_library("util") {
]
}
-js_unittest("util_unittest.m") {
+js_unittest("util_unittest") {
deps = [
":files_app_entry_types",
":mock_entry",
@@ -371,7 +389,7 @@ js_unittest("util_unittest.m") {
]
}
-js_unittest("volume_manager_types_unittest.m") {
+js_unittest("volume_manager_types_unittest") {
deps = [ ":volume_manager_types" ]
}
@@ -382,23 +400,29 @@ js_library("volume_manager_types") {
]
}
-js_test_gen_html("js_test_gen_html_modules") {
+js_library("icon_util") {
+ deps = [ "//ui/file_manager/file_manager/externs:file_manager_private" ]
+}
+
+js_test_type_check("js_test_type_check") {
deps = [
- ":file_type_unittest.m",
- ":files_app_entry_types_unittest.m",
- ":filtered_volume_manager_unittest.m",
- ":importer_common_unittest.m",
- ":lru_cache_unittest.m",
- ":storage_adapter_unittest.m",
- ":util_unittest.m",
- ":volume_manager_types_unittest.m",
+ ":file_type_unittest",
+ ":files_app_entry_types_unittest",
+ ":filtered_volume_manager_unittest",
+ ":importer_common_unittest",
+ ":lru_cache_unittest",
+ ":recent_date_bucket_unittest",
+ ":storage_adapter_unittest",
+ ":util_unittest",
+ ":volume_manager_types_unittest",
]
closure_flags =
strict_error_checking_closure_args + [
+ "language_in=ECMASCRIPT_2020",
"js_module_root=./gen/ui",
"js_module_root=../../ui",
- "browser_resolver_prefix_replacements=\"chrome://test/=./\"",
+ "browser_resolver_prefix_replacements=\"chrome://webui-test/=./\"",
"hide_warnings_for=third_party/",
]
}
diff --git a/chromium/ui/file_manager/file_manager/externs/ts/BUILD.gn b/chromium/ui/file_manager/file_manager/externs/ts/BUILD.gn
new file mode 100644
index 00000000000..5e08c4b6ea7
--- /dev/null
+++ b/chromium/ui/file_manager/file_manager/externs/ts/BUILD.gn
@@ -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.
+
+import("//third_party/closure_compiler/compile_js.gni")
+
+js_library("state") {
+ deps = [ "..:files_app_entry_interfaces" ]
+}
+
+js_library("store") {
+ deps = [ ":state" ]
+}
diff --git a/chromium/ui/file_manager/file_manager/foreground/elements/BUILD.gn b/chromium/ui/file_manager/file_manager/foreground/elements/BUILD.gn
index 9ba2e95be66..47b1fee88eb 100644
--- a/chromium/ui/file_manager/file_manager/foreground/elements/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/foreground/elements/BUILD.gn
@@ -5,7 +5,7 @@
import("//third_party/closure_compiler/compile_js.gni")
import("//third_party/closure_compiler/js_unit_tests.gni")
import("//tools/polymer/html_to_js.gni")
-import("//ui/file_manager/base/gn/js_test_gen_html.gni")
+import("//ui/file_manager/base/gn/js_test_type_check.gni")
visibility = [ "//ui/file_manager/file_manager/foreground/*" ]
@@ -20,13 +20,14 @@ group("closure_compile") {
visibility += [ "//ui/file_manager:closure_compile" ]
deps = [
":closure_compile_jsmodules",
- ":js_test_gen_html_modules_type_check_auto",
+ ":js_test_type_check",
]
}
js_type_check("closure_compile_jsmodules") {
is_polymer3 = true
closure_flags = default_closure_args + [
+ "language_in=ECMASCRIPT_2020",
"js_module_root=gen/ui/file_manager/",
"js_module_root=../../ui/file_manager/",
]
@@ -74,7 +75,6 @@ html_to_js("web_components") {
}
js_library("files_format_dialog") {
- visibility += [ "//ui/file_manager/audio_player/*" ]
deps = [
"//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
@@ -83,15 +83,14 @@ js_library("files_format_dialog") {
"//ui/file_manager/file_manager/common/js:volume_manager_types",
"//ui/file_manager/file_manager/externs:volume_info",
"//ui/file_manager/file_manager/foreground/js:file_rename",
- "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
- "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
- "//ui/webui/resources/cr_elements/cr_input:cr_input.m",
+ "//ui/webui/resources/cr_elements/cr_button:cr_button",
+ "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog",
+ "//ui/webui/resources/cr_elements/cr_input:cr_input",
"//ui/webui/resources/js:i18n_behavior.m",
]
}
js_library("files_icon_button") {
- visibility += [ "//ui/file_manager/audio_player/*" ]
deps = [
":files_toggle_ripple",
"//third_party/polymer/v3_0/components-chromium/iron-behaviors:iron-button-state",
@@ -112,7 +111,7 @@ js_library("files_metadata_entry") {
]
}
-js_unittest("files_password_dialog_unittest.m") {
+js_unittest("files_password_dialog_unittest") {
deps = [
":files_password_dialog",
"//chrome/test/data/webui:chai_assert",
@@ -124,9 +123,9 @@ js_unittest("files_password_dialog_unittest.m") {
js_library("files_password_dialog") {
deps = [
"//ui/file_manager/file_manager/common/js:async_util",
- "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
- "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
- "//ui/webui/resources/cr_elements/cr_input:cr_input.m",
+ "//ui/webui/resources/cr_elements/cr_button:cr_button",
+ "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog",
+ "//ui/webui/resources/cr_elements/cr_input:cr_input",
"//ui/webui/resources/js:load_time_data.m",
]
}
@@ -168,7 +167,7 @@ js_library("files_spinner") {
js_library("files_toast") {
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
+ "//ui/webui/resources/cr_elements/cr_button:cr_button",
]
externs_list =
[ "//ui/webui/resources/cr_elements/cr_toast/cr_toast_externs.js" ]
@@ -176,17 +175,13 @@ js_library("files_toast") {
# TODO(tapted): Move this to //ui/file_manager/base.
js_library("files_toggle_ripple") {
- visibility += [ "//ui/file_manager/audio_player/*" ]
-
- #visibility += [ "//ui/file_manager/gallery/*" ]
-
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
}
# TODO(tapted): Move this to //ui/file_manager/base.
-js_unittest("files_tooltip_unittest.m") {
+js_unittest("files_tooltip_unittest") {
deps = [
":files_tooltip",
"//chrome/test/data/webui:chai_assert",
@@ -200,14 +195,14 @@ js_library("files_tooltip") {
]
}
-js_unittest("files_toast_unittest.m") {
+js_unittest("files_toast_unittest") {
deps = [
":files_toast",
"//chrome/test/data/webui:chai_assert",
]
}
-js_unittest("files_xf_elements_unittest.m") {
+js_unittest("files_xf_elements_unittest") {
deps = [
":xf_display_panel",
"//chrome/test/data/webui:chai_assert",
@@ -220,10 +215,7 @@ js_unittest("files_xf_elements_unittest.m") {
}
js_library("xf_button") {
- deps = [
- "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
- "//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m",
- ]
+ deps = [ "//ui/webui/resources/cr_elements/cr_button:cr_button" ]
}
js_library("xf_circular_progress") {
@@ -237,21 +229,22 @@ js_library("xf_display_panel") {
]
}
-js_test_gen_html("js_test_gen_html_modules") {
+js_test_type_check("js_test_type_check") {
is_polymer3 = true
deps = [
- ":files_password_dialog_unittest.m",
- ":files_toast_unittest.m",
- ":files_tooltip_unittest.m",
- ":files_xf_elements_unittest.m",
+ ":files_password_dialog_unittest",
+ ":files_toast_unittest",
+ ":files_tooltip_unittest",
+ ":files_xf_elements_unittest",
]
closure_flags =
strict_error_checking_closure_args + [
+ "language_in=ECMASCRIPT_2020",
"generate_exports=false",
"js_module_root=./gen/ui",
"js_module_root=../../ui",
- "browser_resolver_prefix_replacements=\"chrome://test/=./\"",
+ "browser_resolver_prefix_replacements=\"chrome://webui-test/=./\"",
"hide_warnings_for=third_party/",
]
}
diff --git a/chromium/ui/file_manager/file_manager/foreground/js/BUILD.gn b/chromium/ui/file_manager/file_manager/foreground/js/BUILD.gn
index 43a02559755..a26e9bce758 100644
--- a/chromium/ui/file_manager/file_manager/foreground/js/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/foreground/js/BUILD.gn
@@ -5,7 +5,7 @@
import("//chrome/browser/resources/tools/optimize_webui.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//third_party/closure_compiler/js_unit_tests.gni")
-import("//ui/file_manager/base/gn/js_test_gen_html.gni")
+import("//ui/file_manager/base/gn/js_test_type_check.gni")
import("//ui/webui/resources/js/cr.gni")
visibility = [
@@ -19,7 +19,7 @@ group("closure_compile") {
visibility += [ "//ui/file_manager:closure_compile" ]
deps = [
":closure_compile_jsmodules",
- ":js_test_gen_html_modules_type_check_auto",
+ ":js_test_type_check",
]
}
@@ -41,6 +41,7 @@ group("js_modules") {
":drive_dialog_controller",
":drop_effect_and_label",
":elements_importer",
+ ":empty_folder_controller",
":fake_android_app_list_model",
":fake_file_selection_handler",
":file_list_model",
@@ -93,6 +94,8 @@ group("js_modules") {
js_type_check("closure_compile_jsmodules") {
is_polymer3 = true
closure_flags = default_closure_args + [
+ "language_in=ECMASCRIPT_2020",
+ "js_module_root=gen/ui/file_manager/tsc/",
"js_module_root=gen/ui/file_manager/",
"js_module_root=../../ui/file_manager/",
"browser_resolver_prefix_replacements=\"chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/=./file_manager/\"",
@@ -109,7 +112,7 @@ js_type_check("closure_compile_jsmodules") {
":constants",
":crossover_search_utils",
":crostini_controller",
- ":deferred_elements.m",
+ ":deferred_elements",
":dialog_action_controller",
":directory_contents",
":directory_model",
@@ -117,6 +120,7 @@ js_type_check("closure_compile_jsmodules") {
":drive_dialog_controller",
":drop_effect_and_label",
":elements_importer",
+ ":empty_folder_controller",
":fake_android_app_list_model",
":fake_file_selection_handler",
":file_list_model",
@@ -162,6 +166,7 @@ js_type_check("closure_compile_jsmodules") {
":thumbnail_loader",
":toolbar_controller",
":webui_command_extender",
+ "//ui/file_manager:js_from_ts",
]
}
@@ -175,7 +180,7 @@ js_library("actions_controller") {
"ui:file_manager_ui",
"//ui/file_manager/file_manager/externs:volume_manager",
"//ui/file_manager/file_manager/externs/background:drive_sync_handler",
- "//ui/webui/resources/js/cr/ui:context_menu_handler.m",
+ "//ui/webui/resources/js/cr/ui:context_menu_handler",
]
}
@@ -199,7 +204,9 @@ js_library("banner_controller") {
deps = [
":constants",
":directory_model",
- "ui/banners:drive_low_space_banner",
+ "ui/banners:drive_low_individual_space_banner",
+ "ui/banners:drive_out_of_individual_space_banner",
+ "ui/banners:drive_out_of_organization_space_banner",
"ui/banners:drive_welcome_banner",
"ui/banners:holding_space_welcome_banner",
"ui/banners:invalid_usb_filesystem_banner",
@@ -219,7 +226,7 @@ js_library("banner_controller") {
]
}
-js_unittest("banner_controller_unittest.m") {
+js_unittest("banner_controller_unittest") {
deps = [
":banner_controller",
":directory_model",
@@ -237,7 +244,7 @@ js_unittest("banner_controller_unittest.m") {
]
}
-js_unittest("banner_util_unittest.m") {
+js_unittest("banner_util_unittest") {
deps = [
":banner_controller",
":directory_model",
@@ -262,7 +269,7 @@ js_library("fake_file_selection_handler") {
]
}
-js_unittest("actions_model_unittest.m") {
+js_unittest("actions_model_unittest") {
deps = [
":actions_model",
":folder_shortcuts_data_model",
@@ -295,6 +302,7 @@ js_library("mock_directory_model") {
deps = [
":directory_contents",
":directory_model",
+ ":file_list_model",
"//ui/file_manager/file_manager/common/js:volume_manager_types",
"//ui/file_manager/file_manager/externs:files_app_entry_interfaces",
"//ui/file_manager/file_manager/externs:volume_info",
@@ -329,6 +337,7 @@ js_library("android_app_list_model") {
js_library("app_state_controller") {
deps = [
":directory_model",
+ ":file_list_model",
"ui:file_manager_ui",
"ui:list_container",
"//ui/file_manager/file_manager/common/js:app_util",
@@ -390,7 +399,7 @@ js_library("dialog_action_controller") {
"//ui/file_manager/file_manager/externs:volume_manager",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:util.m",
- "//ui/webui/resources/js/cr/ui:command.m",
+ "//ui/webui/resources/js/cr/ui:command",
]
}
@@ -401,6 +410,7 @@ js_library("directory_contents") {
"metadata:metadata_model",
"//ui/file_manager/file_manager/common/js:async_util",
"//ui/file_manager/file_manager/common/js:metrics",
+ "//ui/file_manager/file_manager/common/js:trash",
"//ui/file_manager/file_manager/common/js:util",
"//ui/file_manager/file_manager/common/js:volume_manager_types",
"//ui/file_manager/file_manager/externs:files_app_entry_interfaces",
@@ -411,12 +421,14 @@ js_library("directory_contents") {
]
}
-js_unittest("directory_contents_unittest.m") {
+js_unittest("directory_contents_unittest") {
deps = [
":directory_contents",
"//chrome/test/data/webui:chai_assert",
+ "//ui/file_manager/file_manager/common/js:mock_chrome",
"//ui/file_manager/file_manager/common/js:volume_manager_types",
"//ui/file_manager/file_manager/externs:entry_location",
+ "//ui/file_manager/file_manager/externs:volume_info",
"//ui/file_manager/file_manager/externs:volume_manager",
]
}
@@ -438,6 +450,8 @@ js_library("directory_model") {
"//ui/file_manager/file_manager/externs:volume_info",
"//ui/file_manager/file_manager/externs:volume_manager",
"//ui/file_manager/file_manager/externs/background:file_operation_manager",
+ "//ui/file_manager/file_manager/externs/ts:state",
+ "//ui/file_manager/file_manager/externs/ts:store",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:cr.m",
"//ui/webui/resources/js/cr:event_target.m",
@@ -446,7 +460,7 @@ js_library("directory_model") {
]
}
-js_unittest("directory_model_unittest.m") {
+js_unittest("directory_model_unittest") {
deps = [
":directory_contents",
":directory_model",
@@ -471,13 +485,13 @@ js_library("navigation_uma") {
js_library("directory_tree_naming_controller") {
deps = [
":directory_model",
+ "ui:dialogs",
"ui:directory_tree",
"//ui/file_manager/file_manager/common/js:api",
"//ui/file_manager/file_manager/common/js:util",
"//ui/file_manager/file_manager/externs:volume_info",
"//ui/file_manager/file_manager/foreground/js:file_rename",
"//ui/webui/resources/js:assert.m",
- "//ui/webui/resources/js/cr/ui:dialogs.m",
]
}
@@ -493,10 +507,37 @@ js_library("drop_effect_and_label") {
}
js_library("elements_importer") {
- deps = [ ":deferred_elements.m" ]
+ deps = [ ":deferred_elements" ]
+}
+
+js_library("empty_folder_controller") {
+ deps = [
+ ":directory_model",
+ ":file_list_model",
+ "//ui/file_manager/file_manager/common/js:util",
+ "//ui/file_manager/file_manager/externs:files_app_entry_interfaces",
+ "//ui/webui/resources/js:assert.m",
+ ]
}
-js_library("deferred_elements.m") {
+js_unittest("empty_folder_controller_unittest") {
+ deps = [
+ ":directory_model",
+ ":empty_folder_controller",
+ ":file_list_model",
+ ":mock_directory_model",
+ "metadata:mock_metadata",
+ "//chrome/test/data/webui:chai_assert",
+ "//ui/file_manager/file_manager/common/js:files_app_entry_types",
+ "//ui/file_manager/file_manager/common/js:mock_chrome",
+ "//ui/file_manager/file_manager/common/js:util",
+ "//ui/file_manager/file_manager/common/js:volume_manager_types",
+ "//ui/file_manager/file_manager/externs:files_app_entry_interfaces",
+ "//ui/webui/resources/js:load_time_data.m",
+ ]
+}
+
+js_library("deferred_elements") {
visibility += [ "//ui/file_manager:*" ]
deps = [
"//ui/file_manager/file_manager/foreground/elements:files_format_dialog",
@@ -510,7 +551,7 @@ js_library("deferred_elements.m") {
"//ui/file_manager/file_manager/foreground/elements:xf_circular_progress",
"//ui/file_manager/file_manager/foreground/elements:xf_display_panel",
"//ui/file_manager/file_manager/foreground/elements:xf_panel_item",
- "//ui/webui/resources/cr_elements/cr_toggle:cr_toggle.m",
+ "//ui/webui/resources/cr_elements/cr_toggle:cr_toggle",
]
}
@@ -518,14 +559,17 @@ js_library("file_list_model") {
deps = [
"metadata:metadata_model",
"//ui/file_manager/file_manager/common/js:file_type",
+ "//ui/file_manager/file_manager/common/js:recent_date_bucket",
"//ui/file_manager/file_manager/common/js:util",
"//ui/file_manager/file_manager/externs:entry_location",
+ "//ui/file_manager/file_manager/externs:files_app_entry_interfaces",
"//ui/file_manager/file_manager/externs:volume_manager",
+ "//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js/cr/ui:array_data_model.m",
]
}
-js_unittest("file_list_model_unittest.m") {
+js_unittest("file_list_model_unittest") {
deps = [
":file_list_model",
"metadata:metadata_model",
@@ -547,6 +591,7 @@ js_library("file_manager") {
":directory_model",
":directory_tree_naming_controller",
":drive_dialog_controller",
+ ":empty_folder_controller",
":file_manager_commands",
":file_selection",
":file_tasks",
@@ -607,12 +652,11 @@ js_library("file_manager") {
"//ui/file_manager/file_manager/externs/background:progress_center",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
- "//ui/webui/resources/js:util.m",
"//ui/webui/resources/js/cr:event_target.m",
"//ui/webui/resources/js/cr/ui:array_data_model.m",
- "//ui/webui/resources/js/cr/ui:context_menu_handler.m",
+ "//ui/webui/resources/js/cr/ui:context_menu_handler",
"//ui/webui/resources/js/cr/ui:list.m",
- "//ui/webui/resources/js/cr/ui:menu.m",
+ "//ui/webui/resources/js/cr/ui:menu",
]
}
@@ -652,13 +696,13 @@ js_library("file_manager_commands") {
"//ui/file_manager/file_manager/externs:volume_manager",
"//ui/file_manager/file_manager/foreground/elements:files_format_dialog",
"//ui/webui/resources/js:assert.m",
- "//ui/webui/resources/js/cr/ui:command.m",
- "//ui/webui/resources/js/cr/ui:context_menu_handler.m",
+ "//ui/webui/resources/js/cr/ui:command",
+ "//ui/webui/resources/js/cr/ui:context_menu_handler",
"//ui/webui/resources/js/cr/ui:list.m",
]
}
-js_unittest("file_manager_commands_unittest.m") {
+js_unittest("file_manager_commands_unittest") {
deps = [
":file_manager_commands",
":file_tasks",
@@ -718,11 +762,11 @@ js_library("file_tasks") {
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js/cr:ui.m",
- "//ui/webui/resources/js/cr/ui:menu.m",
+ "//ui/webui/resources/js/cr/ui:menu",
]
}
-js_unittest("file_tasks_unittest.m") {
+js_unittest("file_tasks_unittest") {
deps = [
":directory_model",
":file_tasks",
@@ -757,9 +801,11 @@ js_library("file_transfer_controller") {
"ui:directory_tree",
"ui:drag_selector",
"ui:list_container",
+ "ui:tree",
"//ui/file_manager/file_manager/common/js:api",
"//ui/file_manager/file_manager/common/js:file_type",
"//ui/file_manager/file_manager/common/js:progress_center_common",
+ "//ui/file_manager/file_manager/common/js:trash",
"//ui/file_manager/file_manager/common/js:util",
"//ui/file_manager/file_manager/common/js:volume_manager_types",
"//ui/file_manager/file_manager/externs:entry_location",
@@ -770,14 +816,12 @@ js_library("file_transfer_controller") {
"//ui/file_manager/file_manager/externs/background:progress_center",
"//ui/file_manager/file_manager/foreground/elements:files_toast",
"//ui/webui/resources/js:assert.m",
- "//ui/webui/resources/js:util.m",
- "//ui/webui/resources/js/cr/ui:command.m",
+ "//ui/webui/resources/js/cr/ui:command",
"//ui/webui/resources/js/cr/ui:list.m",
- "//ui/webui/resources/js/cr/ui:tree",
]
}
-js_unittest("file_transfer_controller_unittest.m") {
+js_unittest("file_transfer_controller_unittest") {
deps = [
":fake_file_selection_handler",
":file_list_model",
@@ -796,16 +840,16 @@ js_unittest("file_transfer_controller_unittest.m") {
"//ui/file_manager/file_manager/common/js:dialog_type",
"//ui/file_manager/file_manager/common/js:mock_chrome",
"//ui/file_manager/file_manager/common/js:mock_entry",
+ "//ui/file_manager/file_manager/common/js:util",
"//ui/file_manager/file_manager/common/js:volume_manager_types",
"//ui/file_manager/file_manager/externs:volume_manager",
"//ui/file_manager/file_manager/externs/background:file_operation_manager",
"//ui/file_manager/file_manager/externs/background:import_history",
"//ui/file_manager/file_manager/externs/background:progress_center",
"//ui/file_manager/file_manager/foreground/elements:files_toast",
- "//ui/webui/resources/cr_elements/cr_input:cr_input.m",
- "//ui/webui/resources/js:util.m",
+ "//ui/webui/resources/cr_elements/cr_input:cr_input",
"//ui/webui/resources/js/cr:ui.m",
- "//ui/webui/resources/js/cr/ui:command.m",
+ "//ui/webui/resources/js/cr/ui:command",
"//ui/webui/resources/js/cr/ui:list_selection_model.m",
]
}
@@ -821,7 +865,7 @@ js_library("file_type_filters_controller") {
]
}
-js_unittest("file_type_filters_controller_unittest.m") {
+js_unittest("file_type_filters_controller_unittest") {
deps = [
":directory_model",
":file_type_filters_controller",
@@ -913,7 +957,7 @@ js_library("import_controller") {
]
}
-js_unittest("import_controller_unittest.m") {
+js_unittest("import_controller_unittest") {
deps = [
":import_controller",
"//chrome/test/data/webui:chai_assert",
@@ -961,7 +1005,7 @@ js_library("list_thumbnail_loader") {
]
}
-js_unittest("list_thumbnail_loader_unittest.m") {
+js_unittest("list_thumbnail_loader_unittest") {
deps = [
":directory_model",
":file_list_model",
@@ -975,6 +1019,7 @@ js_unittest("list_thumbnail_loader_unittest.m") {
"//ui/file_manager/file_manager/common/js:volume_manager_types",
"//ui/file_manager/file_manager/externs:volume_manager",
"//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js/cr:event_target.m",
]
}
@@ -1002,6 +1047,7 @@ js_library("main_window_component") {
"//ui/file_manager/file_manager/common/js:dialog_type",
"//ui/file_manager/file_manager/common/js:metrics",
"//ui/file_manager/file_manager/common/js:util",
+ "//ui/file_manager/file_manager/common/js:volume_manager_types",
"//ui/file_manager/file_manager/externs:directory_change_event",
"//ui/file_manager/file_manager/externs:volume_manager",
]
@@ -1042,12 +1088,12 @@ js_library("naming_controller") {
":directory_contents",
":directory_model",
":file_selection",
+ "ui:dialogs",
"ui:list_container",
"//ui/file_manager/file_manager/common/js:api",
"//ui/file_manager/file_manager/common/js:util",
"//ui/file_manager/file_manager/foreground/js:file_rename",
"//ui/webui/resources/js:assert.m",
- "//ui/webui/resources/js/cr/ui:dialogs.m",
]
}
@@ -1064,12 +1110,11 @@ js_library("navigation_list_model") {
"//ui/file_manager/file_manager/externs:files_app_entry_interfaces",
"//ui/file_manager/file_manager/externs:volume_info",
"//ui/file_manager/file_manager/externs:volume_manager",
- "//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js/cr:event_target.m",
]
}
-js_unittest("navigation_list_model_unittest.m") {
+js_unittest("navigation_list_model_unittest") {
deps = [
":android_app_list_model",
":directory_model",
@@ -1098,7 +1143,7 @@ js_library("path_component") {
]
}
-js_unittest("path_component_unittest.m") {
+js_unittest("path_component_unittest") {
deps = [
":path_component",
"//chrome/test/data/webui:chai_assert",
@@ -1117,7 +1162,7 @@ js_library("providers_model") {
]
}
-js_unittest("providers_model_unittest.m") {
+js_unittest("providers_model_unittest") {
deps = [
":providers_model",
"//chrome/test/data/webui:chai_assert",
@@ -1188,6 +1233,8 @@ js_library("scan_controller") {
":file_selection",
":spinner_controller",
"ui:list_container",
+ "//ui/file_manager/file_manager/common/js:metrics",
+ "//ui/file_manager/file_manager/common/js:volume_manager_types",
]
}
@@ -1195,7 +1242,6 @@ js_library("search_controller") {
deps = [
":directory_model",
":task_controller",
- "ui:breadcrumb_controller",
"ui:file_manager_ui",
"ui:search_box",
"//ui/file_manager/file_manager/common/js:util",
@@ -1208,10 +1254,10 @@ js_library("search_controller") {
js_library("selection_menu_controller") {
deps = [
"ui:multi_menu_button",
+ "//ui/file_manager/file_manager/common/js:util",
"//ui/file_manager/file_manager/foreground/elements:files_toggle_ripple",
"//ui/file_manager/file_manager/foreground/elements:files_tooltip",
- "//ui/webui/resources/js:util.m",
- "//ui/webui/resources/js/cr/ui:menu.m",
+ "//ui/webui/resources/js/cr/ui:menu",
]
}
@@ -1219,15 +1265,15 @@ js_library("sort_menu_controller") {
deps = [
":file_list_model",
"ui:multi_menu_button",
+ "//ui/file_manager/file_manager/common/js:util",
"//ui/file_manager/file_manager/foreground/elements:files_toggle_ripple",
- "//ui/webui/resources/js:util.m",
]
}
js_library("spinner_controller") {
}
-js_unittest("spinner_controller_unittest.m") {
+js_unittest("spinner_controller_unittest") {
deps = [
":spinner_controller",
"//chrome/test/data/webui:chai_assert",
@@ -1249,16 +1295,17 @@ js_library("task_controller") {
"ui:file_manager_ui",
"//ui/file_manager/file_manager/common/js:dialog_type",
"//ui/file_manager/file_manager/common/js:util",
+ "//ui/file_manager/file_manager/common/js:volume_manager_types",
"//ui/file_manager/file_manager/externs:volume_manager",
"//ui/file_manager/file_manager/externs/background:crostini",
"//ui/file_manager/file_manager/externs/background:progress_center",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
- "//ui/webui/resources/js/cr/ui:command.m",
+ "//ui/webui/resources/js/cr/ui:command",
]
}
-js_unittest("task_controller_unittest.m") {
+js_unittest("task_controller_unittest") {
deps = [
":directory_model",
":fake_file_selection_handler",
@@ -1281,7 +1328,7 @@ js_unittest("task_controller_unittest.m") {
"//ui/file_manager/file_manager/externs/background:progress_center",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js/cr:ui.m",
- "//ui/webui/resources/js/cr/ui:command.m",
+ "//ui/webui/resources/js/cr/ui:command",
]
}
@@ -1304,7 +1351,7 @@ js_library("thumbnail_loader") {
]
}
-js_unittest("thumbnail_loader_unittest.m") {
+js_unittest("thumbnail_loader_unittest") {
deps = [
":thumbnail_loader",
"//chrome/test/data/webui:chai_assert",
@@ -1326,52 +1373,56 @@ js_library("toolbar_controller") {
"//ui/file_manager/file_manager/common/js:volume_manager_types",
"//ui/file_manager/file_manager/externs:volume_manager",
"//ui/webui/resources/js:assert.m",
- "//ui/webui/resources/js:util.m",
- "//ui/webui/resources/js/cr/ui:command.m",
+ "//ui/webui/resources/js/cr/ui:command",
]
}
js_library("webui_command_extender") {
deps = [
"//ui/webui/resources/js:cr.m",
- "//ui/webui/resources/js/cr/ui:command.m",
+ "//ui/webui/resources/js/cr/ui:command",
]
}
-js_test_gen_html("js_test_gen_html_modules") {
+js_test_type_check("js_test_type_check") {
is_polymer3 = true
deps = [
- ":actions_model_unittest.m",
- ":banner_controller_unittest.m",
- ":banner_util_unittest.m",
- ":directory_contents_unittest.m",
- ":directory_model_unittest.m",
- ":file_list_model_unittest.m",
- ":file_manager_commands_unittest.m",
- ":file_tasks_unittest.m",
- ":file_transfer_controller_unittest.m",
- ":file_type_filters_controller_unittest.m",
- ":import_controller_unittest.m",
- ":list_thumbnail_loader_unittest.m",
- ":navigation_list_model_unittest.m",
- ":path_component_unittest.m",
- ":providers_model_unittest.m",
- ":spinner_controller_unittest.m",
- ":task_controller_unittest.m",
- ":thumbnail_loader_unittest.m",
+ ":actions_model_unittest",
+ ":banner_controller_unittest",
+ ":banner_util_unittest",
+ ":directory_contents_unittest",
+ ":directory_model_unittest",
+ ":empty_folder_controller_unittest",
+ ":file_list_model_unittest",
+ ":file_manager_commands_unittest",
+ ":file_tasks_unittest",
+ ":file_transfer_controller_unittest",
+ ":file_type_filters_controller_unittest",
+ ":import_controller_unittest",
+ ":list_thumbnail_loader_unittest",
+ ":navigation_list_model_unittest",
+ ":path_component_unittest",
+ ":providers_model_unittest",
+ ":spinner_controller_unittest",
+ ":task_controller_unittest",
+ ":thumbnail_loader_unittest",
]
closure_flags = strict_error_checking_closure_args + [
+ "language_in=ECMASCRIPT_2020",
"generate_exports=false",
+ "js_module_root=gen/ui/file_manager/tsc/",
"js_module_root=./gen/ui",
"js_module_root=../../ui/file_manager/",
"js_module_root=./gen/ui/file_manager/",
"jscomp_off=duplicate",
- "browser_resolver_prefix_replacements=\"chrome://test/=./\"",
+ "browser_resolver_prefix_replacements=\"chrome://webui-test/=./\"",
"browser_resolver_prefix_replacements=\"chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/=./file_manager/\"",
"browser_resolver_prefix_replacements=\"chrome-extension://pmfjbimdmchhbnneeidfognadeopoehp/=./image_loader/\"",
"hide_warnings_for=third_party/",
+ "hide_warnings_for=gen/ui/file_manager/tsc/",
]
+ extra_deps = [ "//ui/file_manager:js_from_ts" ]
}
tsc_folder =
@@ -1383,18 +1434,19 @@ image_loader_path =
root_build_dir)
optimize_webui("build") {
+ visibility += [ "//ui/file_manager:build_grd" ]
host = "file_manager"
input = tsc_folder
js_module_in_files = [
"main.js",
- "deferred_elements.m.js",
+ "deferred_elements.js",
]
js_out_files = [
"main.rollup.js",
- "deferred_elements.m.rollup.js",
- "shared.m.rollup.js",
+ "deferred_elements.rollup.js",
+ "shared.rollup.js",
]
external_paths = [
@@ -1410,6 +1462,7 @@ optimize_webui("build") {
}
optimize_webui("build_worker") {
+ visibility += [ "//ui/file_manager:build_grd" ]
host = "file_manager"
input = tsc_folder
diff --git a/chromium/ui/file_manager/file_manager/foreground/js/metadata/BUILD.gn b/chromium/ui/file_manager/file_manager/foreground/js/metadata/BUILD.gn
index 7a32d2e6c3a..1d1a5719062 100644
--- a/chromium/ui/file_manager/file_manager/foreground/js/metadata/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/foreground/js/metadata/BUILD.gn
@@ -4,7 +4,7 @@
import("//third_party/closure_compiler/compile_js.gni")
import("//third_party/closure_compiler/js_unit_tests.gni")
-import("//ui/file_manager/base/gn/js_test_gen_html.gni")
+import("//ui/file_manager/base/gn/js_test_type_check.gni")
import("//ui/webui/resources/js/cr.gni")
# TODO(tapted): This entire folder should move to //ui/file_manager/base.
@@ -14,7 +14,7 @@ group("closure_compile") {
testonly = true
deps = [
":closure_compile_jsmodules",
- ":js_test_gen_html_modules_type_check_auto",
+ ":js_test_type_check",
]
}
@@ -49,6 +49,7 @@ group("js_modules") {
js_type_check("closure_compile_jsmodules") {
closure_flags = default_closure_args + [
+ "language_in=ECMASCRIPT_2020",
"js_module_root=gen/ui/file_manager/",
"js_module_root=../../ui/file_manager/",
"browser_resolver_prefix_replacements=\"chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/=./file_manager/\"",
@@ -99,7 +100,7 @@ js_library("content_metadata_provider") {
]
}
-js_unittest("content_metadata_provider_unittest.m") {
+js_unittest("content_metadata_provider_unittest") {
deps = [
":content_metadata_provider",
":metadata_request",
@@ -112,6 +113,7 @@ js_library("dlp_metadata_provider") {
deps = [
":metadata_item",
":metadata_provider",
+ "//ui/file_manager/file_manager/common/js:api",
]
}
@@ -128,7 +130,7 @@ js_library("exif_parser") {
]
}
-js_unittest("exif_parser_unittest.m") {
+js_unittest("exif_parser_unittest") {
deps = [
":byte_reader",
":exif_constants",
@@ -149,7 +151,7 @@ js_library("external_metadata_provider") {
]
}
-js_unittest("external_metadata_provider_unittest.m") {
+js_unittest("external_metadata_provider_unittest") {
deps = [
":external_metadata_provider",
":metadata_request",
@@ -166,7 +168,7 @@ js_library("file_system_metadata_provider") {
]
}
-js_unittest("file_system_metadata_provider_unittest.m") {
+js_unittest("file_system_metadata_provider_unittest") {
deps = [
":file_system_metadata_provider",
":metadata_request",
@@ -196,7 +198,7 @@ js_library("id3_parser") {
js_library("image_orientation") {
}
-js_unittest("image_orientation_unittest.m") {
+js_unittest("image_orientation_unittest") {
deps = [
":image_orientation",
"//chrome/test/data/webui:chai_assert",
@@ -218,7 +220,7 @@ js_library("metadata_cache_item") {
]
}
-js_unittest("metadata_cache_item_unittest.m") {
+js_unittest("metadata_cache_item_unittest") {
deps = [
":metadata_cache_item",
":metadata_item",
@@ -236,7 +238,7 @@ js_library("metadata_cache_set") {
]
}
-js_unittest("metadata_cache_set_unittest.m") {
+js_unittest("metadata_cache_set_unittest") {
deps = [
":metadata_cache_set",
"//chrome/test/data/webui:chai_assert",
@@ -272,7 +274,7 @@ js_library("metadata_model") {
]
}
-js_unittest("metadata_model_unittest.m") {
+js_unittest("metadata_model_unittest") {
deps = [
":metadata_model",
":metadata_provider",
@@ -314,6 +316,7 @@ js_library("mpeg_parser") {
js_library("multi_metadata_provider") {
deps = [
":content_metadata_provider",
+ ":dlp_metadata_provider",
":external_metadata_provider",
":file_system_metadata_provider",
":metadata_item",
@@ -325,9 +328,10 @@ js_library("multi_metadata_provider") {
]
}
-js_unittest("multi_metadata_provider_unittest.m") {
+js_unittest("multi_metadata_provider_unittest") {
deps = [
":content_metadata_provider",
+ ":dlp_metadata_provider",
":external_metadata_provider",
":file_system_metadata_provider",
":metadata_request",
@@ -346,7 +350,7 @@ js_library("thumbnail_model") {
]
}
-js_unittest("thumbnail_model_unittest.m") {
+js_unittest("thumbnail_model_unittest") {
deps = [
":metadata_item",
":metadata_model",
@@ -356,25 +360,26 @@ js_unittest("thumbnail_model_unittest.m") {
]
}
-js_test_gen_html("js_test_gen_html_modules") {
+js_test_type_check("js_test_type_check") {
deps = [
- ":content_metadata_provider_unittest.m",
- ":exif_parser_unittest.m",
- ":external_metadata_provider_unittest.m",
- ":file_system_metadata_provider_unittest.m",
- ":image_orientation_unittest.m",
- ":metadata_cache_item_unittest.m",
- ":metadata_cache_set_unittest.m",
- ":metadata_model_unittest.m",
- ":multi_metadata_provider_unittest.m",
- ":thumbnail_model_unittest.m",
+ ":content_metadata_provider_unittest",
+ ":exif_parser_unittest",
+ ":external_metadata_provider_unittest",
+ ":file_system_metadata_provider_unittest",
+ ":image_orientation_unittest",
+ ":metadata_cache_item_unittest",
+ ":metadata_cache_set_unittest",
+ ":metadata_model_unittest",
+ ":multi_metadata_provider_unittest",
+ ":thumbnail_model_unittest",
]
closure_flags = strict_error_checking_closure_args + [
+ "language_in=ECMASCRIPT_2020",
"js_module_root=./gen/ui",
"js_module_root=../../ui/file_manager/",
"js_module_root=./gen/ui/file_manager/",
- "browser_resolver_prefix_replacements=\"chrome://test/=./\"",
+ "browser_resolver_prefix_replacements=\"chrome://webui-test/=./\"",
"browser_resolver_prefix_replacements=\"chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/=./file_manager/\"",
"browser_resolver_prefix_replacements=\"chrome-extension://pmfjbimdmchhbnneeidfognadeopoehp/=./image_loader/\"",
"hide_warnings_for=third_party/",
diff --git a/chromium/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn b/chromium/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn
index be7a2b34072..aa107c50239 100644
--- a/chromium/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn
@@ -5,7 +5,7 @@
import("//third_party/closure_compiler/compile_js.gni")
import("//third_party/closure_compiler/js_unit_tests.gni")
import("//tools/polymer/html_to_js.gni")
-import("//ui/file_manager/base/gn/js_test_gen_html.gni")
+import("//ui/file_manager/base/gn/js_test_type_check.gni")
import("//ui/webui/resources/js/cr.gni")
visibility = [ "//ui/file_manager/file_manager/foreground/*" ]
@@ -15,7 +15,7 @@ group("closure_compile") {
visibility += [ "//ui/file_manager:closure_compile" ]
deps = [
":closure_compile_jsmodules",
- ":js_test_gen_html_modules_type_check_auto",
+ ":js_test_type_check",
]
}
@@ -25,11 +25,11 @@ group("js_modules") {
":action_model_ui",
":actions_submenu",
":autocomplete_list",
- ":breadcrumb_controller",
":combobutton",
":commandbutton",
":default_task_dialog",
":dialog_footer",
+ ":dialogs",
":directory_tree",
":drag_selector",
":file_grid",
@@ -52,21 +52,21 @@ group("js_modules") {
":progress_center_panel",
":providers_menu",
":search_box",
+ ":splitter",
+ ":tree",
]
}
-html_to_js("web_components") {
- visibility += [ "//ui/file_manager/*" ]
- js_files = [ "breadcrumb.js" ]
-}
-
js_type_check("closure_compile_jsmodules") {
is_polymer3 = true
closure_flags = default_closure_args + [
+ "language_in=ECMASCRIPT_2020",
+ "js_module_root=gen/ui/file_manager/tsc/",
"js_module_root=../../ui/file_manager/",
"js_module_root=gen/ui/file_manager/",
"browser_resolver_prefix_replacements=\"chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/=./file_manager/\"",
"browser_resolver_prefix_replacements=\"chrome-extension://pmfjbimdmchhbnneeidfognadeopoehp/=./image_loader/\"",
+ "hide_warnings_for=gen/ui/file_manager/tsc/",
]
deps = [
@@ -74,12 +74,11 @@ js_type_check("closure_compile_jsmodules") {
":action_model_ui",
":actions_submenu",
":autocomplete_list",
- ":breadcrumb",
- ":breadcrumb_controller",
":combobutton",
":commandbutton",
":default_task_dialog",
":dialog_footer",
+ ":dialogs",
":directory_tree",
":drag_selector",
":file_grid",
@@ -102,12 +101,15 @@ js_type_check("closure_compile_jsmodules") {
":progress_center_panel",
":providers_menu",
":search_box",
+ ":splitter",
+ ":tree",
"table:table",
"table:table_column",
"table:table_column_model",
"table:table_header",
"table:table_list",
"table:table_splitter",
+ "//ui/file_manager:js_from_ts",
]
}
@@ -125,35 +127,20 @@ js_library("actions_submenu") {
deps = [
"//ui/file_manager/file_manager/common/js:util",
"//ui/file_manager/file_manager/foreground/js:actions_model",
- "//ui/webui/resources/js:util.m",
- "//ui/webui/resources/js/cr/ui:command.m",
- "//ui/webui/resources/js/cr/ui:menu.m",
- "//ui/webui/resources/js/cr/ui:menu_item.m",
+ "//ui/webui/resources/js/cr/ui:command",
+ "//ui/webui/resources/js/cr/ui:menu",
+ "//ui/webui/resources/js/cr/ui:menu_item",
]
}
-js_unittest("actions_submenu_unittest.m") {
+js_unittest("actions_submenu_unittest") {
deps = [
":actions_submenu",
"//chrome/test/data/webui:chai_assert",
"//ui/file_manager/file_manager/common/js:util",
"//ui/file_manager/file_manager/foreground/js:mock_actions_model",
"//ui/webui/resources/js:assert.m",
- "//ui/webui/resources/js/cr/ui:menu.m",
- ]
-}
-
-js_library("breadcrumb") {
- externs_list = [
- "//ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu_externs.js",
- ]
-}
-
-js_unittest("breadcrumb_unittest.m") {
- deps = [
- ":breadcrumb",
- "//chrome/test/data/webui:chai_assert",
- "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js/cr/ui:menu",
]
}
@@ -163,7 +150,7 @@ js_library("combobutton") {
":multi_menu_button",
"//ui/file_manager/file_manager/common/js:util",
"//ui/webui/resources/js/cr:ui.m",
- "//ui/webui/resources/js/cr/ui:menu_item.m",
+ "//ui/webui/resources/js/cr/ui:menu_item",
]
externs_list = [ "//ui/file_manager/file_manager/externs/paper_elements.js" ]
@@ -174,7 +161,7 @@ js_library("commandbutton") {
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:cr.m",
"//ui/webui/resources/js/cr:ui.m",
- "//ui/webui/resources/js/cr/ui:command.m",
+ "//ui/webui/resources/js/cr/ui:command",
]
}
@@ -194,14 +181,19 @@ js_library("dialog_footer") {
"//ui/file_manager/file_manager/common/js:file_type",
"//ui/file_manager/file_manager/common/js:util",
"//ui/file_manager/file_manager/foreground/js:file_list_model",
- "//ui/webui/resources/cr_elements/cr_input:cr_input.m",
- "//ui/webui/resources/js:util.m",
+ "//ui/webui/resources/cr_elements/cr_input:cr_input",
]
}
+js_library("dialogs") {
+}
+
js_library("directory_tree") {
deps = [
+ ":tree",
"//ui/file_manager/file_manager/common/js:file_type",
+ "//ui/file_manager/file_manager/common/js:files_app_entry_types",
+ "//ui/file_manager/file_manager/common/js:icon_util",
"//ui/file_manager/file_manager/common/js:metrics",
"//ui/file_manager/file_manager/common/js:util",
"//ui/file_manager/file_manager/common/js:volume_manager_types",
@@ -216,16 +208,15 @@ js_library("directory_tree") {
"//ui/file_manager/file_manager/foreground/js/metadata:metadata_model",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:cr.m",
- "//ui/webui/resources/js/cr/ui:command.m",
- "//ui/webui/resources/js/cr/ui:context_menu_handler.m",
- "//ui/webui/resources/js/cr/ui:menu.m",
- "//ui/webui/resources/js/cr/ui:tree",
+ "//ui/webui/resources/js/cr/ui:command",
+ "//ui/webui/resources/js/cr/ui:context_menu_handler",
+ "//ui/webui/resources/js/cr/ui:menu",
]
visibility +=
[ "//ui/file_manager/file_manager/externs:command_handler_deps" ]
}
-js_unittest("directory_tree_unittest.m") {
+js_unittest("directory_tree_unittest") {
deps = [
":directory_tree",
"//chrome/test/data/webui:chai_assert",
@@ -266,6 +257,7 @@ js_library("file_grid") {
"//ui/file_manager/file_manager/externs:files_app_entry_interfaces",
"//ui/file_manager/file_manager/externs:volume_manager",
"//ui/file_manager/file_manager/externs/background:import_history",
+ "//ui/file_manager/file_manager/foreground/js:file_list_model",
"//ui/file_manager/file_manager/foreground/js:list_thumbnail_loader",
"//ui/file_manager/file_manager/foreground/js/metadata:metadata_model",
"//ui/webui/resources/js:assert.m",
@@ -278,6 +270,24 @@ js_library("file_grid") {
]
}
+js_unittest("file_grid_unittest") {
+ deps = [
+ ":a11y_announce",
+ ":file_grid",
+ "//chrome/test/data/webui:chai_assert",
+ "//ui/file_manager/file_manager/background/js:mock_volume_manager",
+ "//ui/file_manager/file_manager/common/js:files_app_entry_types",
+ "//ui/file_manager/file_manager/common/js:mock_chrome",
+ "//ui/file_manager/file_manager/common/js:volume_manager_types",
+ "//ui/file_manager/file_manager/externs/background:import_history",
+ "//ui/file_manager/file_manager/foreground/js:file_list_model",
+ "//ui/file_manager/file_manager/foreground/js/metadata:metadata_model",
+ "//ui/file_manager/file_manager/foreground/js/metadata:mock_metadata",
+ "//ui/webui/resources/js:load_time_data.m",
+ "//ui/webui/resources/js/cr/ui:list_selection_model.m",
+ ]
+}
+
js_library("file_list_selection_model") {
deps = [
"//ui/webui/resources/js/cr/ui:list_selection_model.m",
@@ -285,7 +295,7 @@ js_library("file_list_selection_model") {
]
}
-js_unittest("file_list_selection_model_unittest.m") {
+js_unittest("file_list_selection_model_unittest") {
deps = [
":file_list_selection_model",
"//chrome/test/data/webui:chai_assert",
@@ -294,13 +304,13 @@ js_unittest("file_list_selection_model_unittest.m") {
js_library("file_manager_dialog_base") {
deps = [
+ ":dialogs",
"//ui/file_manager/file_manager/common/js:util",
"//ui/file_manager/file_manager/common/js:xfm",
- "//ui/webui/resources/js/cr/ui:dialogs.m",
]
}
-js_unittest("file_manager_dialog_base_unittest.m") {
+js_unittest("file_manager_dialog_base_unittest") {
deps = [
":file_manager_dialog_base",
"//chrome/test/data/webui:chai_assert",
@@ -314,10 +324,10 @@ js_library("file_manager_ui") {
":a11y_announce",
":action_model_ui",
":actions_submenu",
- ":breadcrumb_controller",
":combobutton",
":default_task_dialog",
":dialog_footer",
+ ":dialogs",
":directory_tree",
":file_grid",
":file_table",
@@ -333,6 +343,7 @@ js_library("file_manager_ui") {
":progress_center_panel",
":providers_menu",
":search_box",
+ ":splitter",
"//ui/file_manager/file_manager/common/js:dialog_type",
"//ui/file_manager/file_manager/common/js:util",
"//ui/file_manager/file_manager/common/js:volume_manager_types",
@@ -344,14 +355,16 @@ js_library("file_manager_ui") {
"//ui/file_manager/file_manager/foreground/js:launch_param",
"//ui/file_manager/file_manager/foreground/js:providers_model",
"//ui/webui/resources/js:assert.m",
- "//ui/webui/resources/js:util.m",
"//ui/webui/resources/js/cr:ui.m",
- "//ui/webui/resources/js/cr/ui:context_menu_handler.m",
- "//ui/webui/resources/js/cr/ui:dialogs.m",
- "//ui/webui/resources/js/cr/ui:menu.m",
- "//ui/webui/resources/js/cr/ui:menu_item.m",
- "//ui/webui/resources/js/cr/ui:splitter",
+ "//ui/webui/resources/js/cr/ui:context_menu_handler",
+ "//ui/webui/resources/js/cr/ui:menu",
+ "//ui/webui/resources/js/cr/ui:menu_item",
+ ]
+
+ externs_list = [
+ "//ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu_externs.js",
]
+
visibility +=
[ "//ui/file_manager/file_manager/externs:command_handler_deps" ]
}
@@ -368,33 +381,28 @@ js_library("file_table") {
deps = [
":a11y_announce",
":drag_selector",
- ":file_list_selection_model",
":file_metadata_formatter",
":file_table_list",
"table:table",
"table:table_column",
"table:table_column_model",
- "table:table_list",
"//ui/file_manager/file_manager/common/js:async_util",
"//ui/file_manager/file_manager/common/js:file_type",
"//ui/file_manager/file_manager/common/js:importer_common",
"//ui/file_manager/file_manager/common/js:util",
- "//ui/file_manager/file_manager/externs:entry_location",
"//ui/file_manager/file_manager/externs:files_app_entry_interfaces",
"//ui/file_manager/file_manager/externs:volume_manager",
"//ui/file_manager/file_manager/externs/background:import_history",
+ "//ui/file_manager/file_manager/foreground/elements:files_tooltip",
"//ui/file_manager/file_manager/foreground/js:file_list_model",
"//ui/file_manager/file_manager/foreground/js:list_thumbnail_loader",
"//ui/file_manager/file_manager/foreground/js/metadata:metadata_model",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:cr.m",
- "//ui/webui/resources/js/cr/ui:list.m",
- "//ui/webui/resources/js/cr/ui:list_item.m",
- "//ui/webui/resources/js/cr/ui:list_selection_model.m",
]
}
-js_unittest("file_table_unittest.m") {
+js_unittest("file_table_unittest") {
deps = [
":file_table",
"table:table_column",
@@ -405,13 +413,16 @@ js_unittest("file_table_unittest.m") {
js_library("file_table_list") {
deps = [
":a11y_announce",
+ ":drag_selector",
":file_list_selection_model",
":file_tap_handler",
+ "table:table",
"table:table_list",
"//ui/file_manager/file_manager/common/js:file_type",
"//ui/file_manager/file_manager/common/js:util",
"//ui/file_manager/file_manager/externs:entry_location",
"//ui/file_manager/file_manager/externs:files_app_entry_interfaces",
+ "//ui/file_manager/file_manager/foreground/js:file_list_model",
"//ui/file_manager/file_manager/foreground/js/metadata:metadata_model",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:cr.m",
@@ -422,7 +433,7 @@ js_library("file_table_list") {
]
}
-js_unittest("file_table_list_unittest.m") {
+js_unittest("file_table_list_unittest") {
deps = [
":a11y_announce",
":file_list_selection_model",
@@ -433,10 +444,10 @@ js_unittest("file_table_list_unittest.m") {
"//ui/file_manager/file_manager/common/js:files_app_entry_types",
"//ui/file_manager/file_manager/common/js:volume_manager_types",
"//ui/file_manager/file_manager/externs/background:import_history",
- "//ui/file_manager/file_manager/foreground/js:directory_model",
"//ui/file_manager/file_manager/foreground/js:file_list_model",
"//ui/file_manager/file_manager/foreground/js/metadata:metadata_model",
"//ui/file_manager/file_manager/foreground/js/metadata:mock_metadata",
+ "//ui/webui/resources/js:load_time_data.m",
]
}
@@ -444,7 +455,7 @@ js_library("file_tap_handler") {
deps = [ "//ui/webui/resources/js:assert.m" ]
}
-js_unittest("file_tap_handler_unittest.m") {
+js_unittest("file_tap_handler_unittest") {
deps = [
":file_tap_handler",
"//chrome/test/data/webui:chai_assert",
@@ -456,8 +467,8 @@ js_unittest("file_tap_handler_unittest.m") {
js_library("files_alert_dialog") {
deps = [
+ ":dialogs",
"//ui/file_manager/file_manager/common/js:util",
- "//ui/webui/resources/js/cr/ui:dialogs.m",
]
}
@@ -465,16 +476,16 @@ js_library("files_alert_dialog") {
js_library("files_confirm_dialog") {
deps = [
+ ":dialogs",
"//ui/file_manager/file_manager/common/js:util",
- "//ui/webui/resources/js/cr/ui:dialogs.m",
]
}
js_library("files_menu") {
deps = [
"//ui/webui/resources/js:assert.m",
- "//ui/webui/resources/js/cr/ui:menu.m",
- "//ui/webui/resources/js/cr/ui:menu_item.m",
+ "//ui/webui/resources/js/cr/ui:menu",
+ "//ui/webui/resources/js/cr/ui:menu_item",
]
externs_list = [ "//ui/file_manager/file_manager/externs/paper_elements.js" ]
}
@@ -484,7 +495,6 @@ js_library("gear_menu") {
"//ui/file_manager/file_manager/common/js:util",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
- "//ui/webui/resources/js:util.m",
]
}
@@ -496,7 +506,7 @@ js_library("install_linux_package_dialog") {
]
}
-js_unittest("install_linux_package_dialog_unittest.m") {
+js_unittest("install_linux_package_dialog_unittest") {
deps = [
":install_linux_package_dialog",
"//chrome/test/data/webui:chai_assert",
@@ -507,8 +517,8 @@ js_unittest("install_linux_package_dialog_unittest.m") {
js_library("import_crostini_image_dialog") {
deps = [
+ ":dialogs",
"//ui/file_manager/file_manager/common/js:util",
- "//ui/webui/resources/js/cr/ui:dialogs.m",
]
}
@@ -522,7 +532,6 @@ js_library("list_container") {
"//ui/file_manager/file_manager/foreground/js:list_thumbnail_loader",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:cr.m",
- "//ui/webui/resources/js:util.m",
"//ui/webui/resources/js/cr/ui:list.m",
"//ui/webui/resources/js/cr/ui:list_item.m",
"//ui/webui/resources/js/cr/ui:list_selection_model.m",
@@ -530,25 +539,13 @@ js_library("list_container") {
]
}
-js_library("breadcrumb_controller") {
- deps = [
- ":breadcrumb",
- ":list_container",
- "//ui/file_manager/file_manager/common/js:metrics",
- "//ui/file_manager/file_manager/externs:files_app_entry_interfaces",
- "//ui/file_manager/file_manager/externs:volume_manager",
- "//ui/file_manager/file_manager/foreground/js:path_component",
- "//ui/webui/resources/js/cr:event_target.m",
- ]
-}
-
js_library("multi_menu") {
deps = [
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:event_tracker.m",
"//ui/webui/resources/js/cr:ui.m",
- "//ui/webui/resources/js/cr/ui:menu.m",
- "//ui/webui/resources/js/cr/ui:menu_item.m",
+ "//ui/webui/resources/js/cr/ui:menu",
+ "//ui/webui/resources/js/cr/ui:menu_item",
]
}
@@ -559,22 +556,22 @@ js_library("multi_menu_button") {
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:event_tracker.m",
"//ui/webui/resources/js/cr:ui.m",
- "//ui/webui/resources/js/cr/ui:menu.m",
- "//ui/webui/resources/js/cr/ui:menu_button.m",
- "//ui/webui/resources/js/cr/ui:menu_item.m",
- "//ui/webui/resources/js/cr/ui:position_util.m",
+ "//ui/webui/resources/js/cr/ui:menu",
+ "//ui/webui/resources/js/cr/ui:menu_button",
+ "//ui/webui/resources/js/cr/ui:menu_item",
+ "//ui/webui/resources/js/cr/ui:position_util",
]
}
-js_unittest("multi_menu_unittest.m") {
+js_unittest("multi_menu_unittest") {
deps = [
":multi_menu_button",
"//chrome/test/data/webui:chai_assert",
"//ui/file_manager/file_manager/common/js:util",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js/cr:ui.m",
- "//ui/webui/resources/js/cr/ui:command.m",
- "//ui/webui/resources/js/cr/ui:menu.m",
+ "//ui/webui/resources/js/cr/ui:command",
+ "//ui/webui/resources/js/cr/ui:menu",
]
}
@@ -595,7 +592,7 @@ js_library("providers_menu") {
"//ui/file_manager/file_manager/foreground/js:providers_model",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js/cr:ui.m",
- "//ui/webui/resources/js/cr/ui:menu.m",
+ "//ui/webui/resources/js/cr/ui:menu",
]
}
@@ -608,13 +605,32 @@ js_library("search_box") {
"//ui/file_manager/file_manager/foreground/elements:files_toggle_ripple",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:cr.m",
- "//ui/webui/resources/js:util.m",
"//ui/webui/resources/js/cr:event_target.m",
"//ui/webui/resources/js/cr/ui:list_item.m",
]
externs_list = [ "//ui/file_manager/file_manager/externs/search_item.js" ]
}
+js_library("splitter") {
+ deps = [
+ "//ui/webui/resources/js:cr.m",
+ "//ui/webui/resources/js/cr:ui.m",
+ ]
+}
+
+js_unittest("splitter_unittest") {
+ deps = [
+ ":splitter",
+ "//chrome/test/data/webui:chai_assert",
+ "//ui/webui/resources/js:util.m",
+ "//ui/webui/resources/js/cr:ui.m",
+ ]
+}
+
+js_library("tree") {
+ deps = [ "//ui/webui/resources/js:assert.m" ]
+}
+
js_library("autocomplete_list") {
deps = [
"//ui/webui/resources/js:cr.m",
@@ -622,32 +638,34 @@ js_library("autocomplete_list") {
"//ui/webui/resources/js/cr/ui:list.m",
"//ui/webui/resources/js/cr/ui:list_item.m",
"//ui/webui/resources/js/cr/ui:list_single_selection_model.m",
- "//ui/webui/resources/js/cr/ui:position_util.m",
+ "//ui/webui/resources/js/cr/ui:position_util",
]
}
-js_test_gen_html("js_test_gen_html_modules") {
+js_test_type_check("js_test_type_check") {
deps = [
- ":actions_submenu_unittest.m",
- ":breadcrumb_unittest.m",
- ":directory_tree_unittest.m",
- ":file_list_selection_model_unittest.m",
- ":file_manager_dialog_base_unittest.m",
- ":file_table_list_unittest.m",
- ":file_table_unittest.m",
- ":file_tap_handler_unittest.m",
- ":install_linux_package_dialog_unittest.m",
- ":multi_menu_unittest.m",
+ ":actions_submenu_unittest",
+ ":directory_tree_unittest",
+ ":file_grid_unittest",
+ ":file_list_selection_model_unittest",
+ ":file_manager_dialog_base_unittest",
+ ":file_table_list_unittest",
+ ":file_table_unittest",
+ ":file_tap_handler_unittest",
+ ":install_linux_package_dialog_unittest",
+ ":multi_menu_unittest",
+ ":splitter_unittest",
]
is_polymer3 = true
closure_flags = strict_error_checking_closure_args + [
+ "language_in=ECMASCRIPT_2020",
"generate_exports=false",
"js_module_root=./gen/ui",
"js_module_root=../../ui/file_manager/",
"js_module_root=./gen/ui/file_manager/",
"jscomp_off=duplicate",
- "browser_resolver_prefix_replacements=\"chrome://test/=./\"",
+ "browser_resolver_prefix_replacements=\"chrome://webui-test/=./\"",
"browser_resolver_prefix_replacements=\"chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/=./file_manager/\"",
"browser_resolver_prefix_replacements=\"chrome-extension://pmfjbimdmchhbnneeidfognadeopoehp/=./image_loader/\"",
"hide_warnings_for=third_party/",
diff --git a/chromium/ui/file_manager/file_manager/foreground/js/ui/banners/BUILD.gn b/chromium/ui/file_manager/file_manager/foreground/js/ui/banners/BUILD.gn
index 171b5352561..49f8b428ff8 100644
--- a/chromium/ui/file_manager/file_manager/foreground/js/ui/banners/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/foreground/js/ui/banners/BUILD.gn
@@ -5,7 +5,7 @@
import("//third_party/closure_compiler/compile_js.gni")
import("//third_party/closure_compiler/js_unit_tests.gni")
import("//tools/polymer/html_to_js.gni")
-import("//ui/file_manager/base/gn/js_test_gen_html.gni")
+import("//ui/file_manager/base/gn/js_test_type_check.gni")
visibility = [ "//ui/file_manager/file_manager/foreground/*" ]
@@ -14,14 +14,16 @@ group("closure_compile") {
visibility += [ "//ui/file_manager:closure_compile" ]
deps = [
":closure_compile_jsmodules",
- ":js_test_gen_html_modules_type_check_auto",
+ ":js_test_type_check",
]
}
html_to_js("web_components") {
visibility += [ "//ui/file_manager/*" ]
js_files = [
- "drive_low_space_banner.js",
+ "drive_low_individual_space_banner.js",
+ "drive_out_of_individual_space_banner.js",
+ "drive_out_of_organization_space_banner.js",
"drive_offline_pinning_banner.js",
"drive_welcome_banner.js",
"educational_banner.js",
@@ -39,6 +41,7 @@ html_to_js("web_components") {
js_type_check("closure_compile_jsmodules") {
is_polymer3 = true
closure_flags = default_closure_args + [
+ "language_in=ECMASCRIPT_2020",
"js_module_root=../../ui/file_manager/",
"js_module_root=gen/ui/file_manager/",
"browser_resolver_prefix_replacements=\"chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/=./file_manager/\"",
@@ -46,8 +49,10 @@ js_type_check("closure_compile_jsmodules") {
]
deps = [
- ":drive_low_space_banner",
+ ":drive_low_individual_space_banner",
":drive_offline_pinning_banner",
+ ":drive_out_of_individual_space_banner",
+ ":drive_out_of_organization_space_banner",
":drive_welcome_banner",
":educational_banner",
":holding_space_welcome_banner",
@@ -87,7 +92,25 @@ js_library("local_disk_low_space_banner") {
]
}
-js_library("drive_low_space_banner") {
+js_library("drive_low_individual_space_banner") {
+ deps = [
+ ":warning_banner",
+ "//ui/file_manager/file_manager/common/js:util",
+ "//ui/file_manager/file_manager/common/js:volume_manager_types",
+ "//ui/file_manager/file_manager/externs:banner",
+ ]
+}
+
+js_library("drive_out_of_individual_space_banner") {
+ deps = [
+ ":warning_banner",
+ "//ui/file_manager/file_manager/common/js:util",
+ "//ui/file_manager/file_manager/common/js:volume_manager_types",
+ "//ui/file_manager/file_manager/externs:banner",
+ ]
+}
+
+js_library("drive_out_of_organization_space_banner") {
deps = [
":warning_banner",
"//ui/file_manager/file_manager/common/js:util",
@@ -121,7 +144,7 @@ js_library("educational_banner") {
]
}
-js_unittest("educational_banner_unittest.m") {
+js_unittest("educational_banner_unittest") {
deps = [
":educational_banner",
"//chrome/test/data/webui:chai_assert",
@@ -156,7 +179,7 @@ js_library("state_banner") {
]
}
-js_unittest("state_banner_unittest.m") {
+js_unittest("state_banner_unittest") {
deps = [
":state_banner",
"//chrome/test/data/webui:chai_assert",
@@ -180,7 +203,7 @@ js_library("warning_banner") {
]
}
-js_unittest("warning_banner_unittest.m") {
+js_unittest("warning_banner_unittest") {
deps = [
":warning_banner",
"//chrome/test/data/webui:chai_assert",
@@ -189,21 +212,22 @@ js_unittest("warning_banner_unittest.m") {
]
}
-js_test_gen_html("js_test_gen_html_modules") {
+js_test_type_check("js_test_type_check") {
deps = [
- ":educational_banner_unittest.m",
- ":state_banner_unittest.m",
- ":warning_banner_unittest.m",
+ ":educational_banner_unittest",
+ ":state_banner_unittest",
+ ":warning_banner_unittest",
]
is_polymer3 = true
closure_flags = strict_error_checking_closure_args + [
+ "language_in=ECMASCRIPT_2020",
"generate_exports=false",
"js_module_root=./gen/ui",
"js_module_root=../../ui/file_manager/",
"js_module_root=./gen/ui/file_manager/",
"jscomp_off=duplicate",
- "browser_resolver_prefix_replacements=\"chrome://test/=./\"",
+ "browser_resolver_prefix_replacements=\"chrome://webui-test/=./\"",
"browser_resolver_prefix_replacements=\"chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/=./file_manager/\"",
"browser_resolver_prefix_replacements=\"chrome-extension://pmfjbimdmchhbnneeidfognadeopoehp/=./image_loader/\"",
"hide_warnings_for=third_party/",
diff --git a/chromium/ui/file_manager/file_manager/foreground/js/ui/table/BUILD.gn b/chromium/ui/file_manager/file_manager/foreground/js/ui/table/BUILD.gn
index 8cd3fb1e1f4..443cf7c7900 100644
--- a/chromium/ui/file_manager/file_manager/foreground/js/ui/table/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/foreground/js/ui/table/BUILD.gn
@@ -62,8 +62,8 @@ js_library("table_list") {
js_library("table_splitter") {
deps = [
+ "//ui/file_manager/file_manager/foreground/js/ui:splitter",
"//ui/webui/resources/js:cr.m",
"//ui/webui/resources/js/cr:event_target.m",
- "//ui/webui/resources/js/cr/ui:splitter",
]
}
diff --git a/chromium/ui/file_manager/file_names.gni b/chromium/ui/file_manager/file_names.gni
index febc286fa6b..1f3a4944aff 100644
--- a/chromium/ui/file_manager/file_names.gni
+++ b/chromium/ui/file_manager/file_names.gni
@@ -1,16 +1,6 @@
# Static files are used as-is from the repository.
-audio_static_js_files = [
- "audio_player/js/audio_player.js",
- "audio_player/js/background.js",
- "audio_player/js/error_util.js",
- "audio_player/js/main.js",
- "audio_player/js/main_background.js",
- "audio_player/js/metadata_worker.js",
- "audio_player/js/test_util.js",
-]
-
image_loader_static_js_files = [
- "image_loader/background.m.js",
+ "image_loader/background.js",
"image_loader/cache.js",
"image_loader/image_loader.js",
"image_loader/image_loader_client.js",
@@ -37,12 +27,15 @@ static_js_files = [
"file_manager/background/js/file_operation_util.js",
"file_manager/background/js/import_history.js",
"file_manager/background/js/launcher.js",
- "file_manager/background/js/main_background.m.js",
+ "file_manager/background/js/main_background.js",
"file_manager/background/js/media_import_handler.js",
"file_manager/background/js/media_scanner.js",
"file_manager/background/js/metadata_proxy.js",
"file_manager/background/js/metrics_start.js",
+
+ # TODO(lucmult): Check if we can move those mocks to the test files section.
"file_manager/background/js/mock_crostini.js",
+ "file_manager/background/js/mock_drive_sync_handler.js",
"file_manager/background/js/mock_file_operation_manager.js",
"file_manager/background/js/mock_media_scanner.js",
"file_manager/background/js/mock_progress_center.js",
@@ -73,9 +66,9 @@ static_js_files = [
"file_manager/common/js/files_app_entry_types.js",
"file_manager/common/js/files_app_state.js",
"file_manager/common/js/filtered_volume_manager.js",
+ "file_manager/common/js/icon_util.js",
"file_manager/common/js/importer_common.js",
"file_manager/common/js/lru_cache.js",
- "file_manager/common/js/mediasession_types.js",
"file_manager/common/js/metrics.js",
"file_manager/common/js/metrics_base.js",
"file_manager/common/js/mock_chrome.js",
@@ -83,6 +76,7 @@ static_js_files = [
"file_manager/common/js/notifications_browser_proxy.js",
"file_manager/common/js/power.js",
"file_manager/common/js/progress_center_common.js",
+ "file_manager/common/js/recent_date_bucket.js",
"file_manager/common/js/storage_adapter.js",
"file_manager/common/js/test_error_reporting.js",
"file_manager/common/js/test_importer_common.js",
@@ -119,6 +113,8 @@ static_js_files = [
"file_manager/externs/volume_info.js",
"file_manager/externs/volume_info_list.js",
"file_manager/externs/volume_manager.js",
+ "file_manager/externs/ts/state.js",
+ "file_manager/externs/ts/store.js",
# Files app Foreground:
"file_manager/foreground/js/actions_controller.js",
@@ -130,7 +126,7 @@ static_js_files = [
"file_manager/foreground/js/constants.js",
"file_manager/foreground/js/crossover_search_utils.js",
"file_manager/foreground/js/crostini_controller.js",
- "file_manager/foreground/js/deferred_elements.m.js",
+ "file_manager/foreground/js/deferred_elements.js",
"file_manager/foreground/js/dialog_action_controller.js",
"file_manager/foreground/js/directory_contents.js",
"file_manager/foreground/js/directory_model.js",
@@ -138,6 +134,7 @@ static_js_files = [
"file_manager/foreground/js/drive_dialog_controller.js",
"file_manager/foreground/js/drop_effect_and_label.js",
"file_manager/foreground/js/elements_importer.js",
+ "file_manager/foreground/js/empty_folder_controller.js",
"file_manager/foreground/js/fake_android_app_list_model.js",
"file_manager/foreground/js/fake_file_selection_handler.js",
"file_manager/foreground/js/file_list_model.js",
@@ -221,6 +218,7 @@ static_js_files = [
"file_manager/foreground/js/ui/commandbutton.js",
"file_manager/foreground/js/ui/default_task_dialog.js",
"file_manager/foreground/js/ui/dialog_footer.js",
+ "file_manager/foreground/js/ui/dialogs.js",
"file_manager/foreground/js/ui/directory_tree.js",
"file_manager/foreground/js/ui/drag_selector.js",
"file_manager/foreground/js/ui/file_grid.js",
@@ -238,18 +236,19 @@ static_js_files = [
"file_manager/foreground/js/ui/import_crostini_image_dialog.js",
"file_manager/foreground/js/ui/install_linux_package_dialog.js",
"file_manager/foreground/js/ui/list_container.js",
- "file_manager/foreground/js/ui/breadcrumb_controller.js",
"file_manager/foreground/js/ui/multi_menu.js",
"file_manager/foreground/js/ui/multi_menu_button.js",
"file_manager/foreground/js/ui/progress_center_panel.js",
"file_manager/foreground/js/ui/providers_menu.js",
"file_manager/foreground/js/ui/search_box.js",
+ "file_manager/foreground/js/ui/splitter.js",
"file_manager/foreground/js/ui/table/table.js",
"file_manager/foreground/js/ui/table/table_column.js",
"file_manager/foreground/js/ui/table/table_column_model.js",
"file_manager/foreground/js/ui/table/table_header.js",
"file_manager/foreground/js/ui/table/table_list.js",
"file_manager/foreground/js/ui/table/table_splitter.js",
+ "file_manager/foreground/js/ui/tree.js",
]
# END: static_js_files.
@@ -257,20 +256,37 @@ static_js_files = [
ts_files = [
"file_manager/lib/base_store.ts",
"file_manager/state/store.ts",
- "file_manager/state/state.ts",
- "file_manager/state/reducers.ts",
+ "file_manager/state/reducers/root.ts",
+ "file_manager/state/reducers/all_entries.ts",
+ "file_manager/state/reducers/current_directory.ts",
+ "file_manager/state/reducers/search.ts",
+ "file_manager/state/actions.ts",
+ "file_manager/state/file_key.ts",
+ "file_manager/widgets/xf_breadcrumb.ts",
+ "file_manager/containers/breadcrumb_container.ts",
]
-# Generated files are built from the repository and the final JS files is only
-# available in the "gen/" folder.
-audio_generated_js_files = [
- "audio_player/elements/audio_player.js",
- "audio_player/elements/control_panel.js",
- "audio_player/elements/repeat_button.js",
- "audio_player/elements/track_info_panel.js",
- "audio_player/elements/track_list.js",
+# HTML template files that are used to generate the ".html.ts"
+ts_templates = [ "file_manager/widgets/xf_breadcrumb.html" ]
+
+ts_test_files = [
+ # Lib:
+ "file_manager/lib/base_store_unittest.ts",
+
+ # Reducers:
+ "file_manager/state/reducers/all_entries_unittest.ts",
+
+ # Widgets:
+ "file_manager/widgets/xf_breadcrumb_unittest.ts",
]
+ts_generated_templates = []
+foreach(_t, ts_templates) {
+ ts_generated_templates += [ _t + ".ts" ]
+}
+
+# Generated files are built from the repository and the final JS files is only
+# available in the "gen/" folder.
image_loader_generated_js_files = [
"image_loader/image_orientation.js",
"image_loader/lru_cache.js",
@@ -298,7 +314,9 @@ generated_js_files = [
"file_manager/foreground/elements/xf_circular_progress.js",
"file_manager/foreground/elements/xf_display_panel.js",
"file_manager/foreground/elements/xf_panel_item.js",
- "file_manager/foreground/js/ui/banners/drive_low_space_banner.js",
+ "file_manager/foreground/js/ui/banners/drive_low_individual_space_banner.js",
+ "file_manager/foreground/js/ui/banners/drive_out_of_individual_space_banner.js",
+ "file_manager/foreground/js/ui/banners/drive_out_of_organization_space_banner.js",
"file_manager/foreground/js/ui/banners/drive_offline_pinning_banner.js",
"file_manager/foreground/js/ui/banners/drive_welcome_banner.js",
"file_manager/foreground/js/ui/banners/educational_banner.js",
@@ -310,6 +328,102 @@ generated_js_files = [
"file_manager/foreground/js/ui/banners/state_banner.js",
"file_manager/foreground/js/ui/banners/trash_banner.js",
"file_manager/foreground/js/ui/banners/warning_banner.js",
- "file_manager/foreground/js/ui/breadcrumb.js",
]
+
# END: generated_js_files.
+
+# Test files:
+unittest_files = [
+ # Common:
+ "file_manager/common/js/async_util_unittest.js",
+ "file_manager/common/js/util_unittest.js",
+ "file_manager/common/js/filtered_volume_manager_unittest.js",
+ "file_manager/common/js/file_type_unittest.js",
+ "file_manager/common/js/lru_cache_unittest.js",
+ "file_manager/common/js/importer_common_unittest.js",
+ "file_manager/common/js/files_app_entry_types_unittest.js",
+ "file_manager/common/js/recent_date_bucket_unittest.js",
+ "file_manager/common/js/storage_adapter_unittest.js",
+ "file_manager/common/js/volume_manager_types_unittest.js",
+
+ # Background:
+ "file_manager/background/js/mount_metrics_unittest.js",
+ "file_manager/background/js/drive_sync_handler_unittest.js",
+ "file_manager/background/js/media_import_handler_unittest.js",
+ "file_manager/background/js/task_queue_unittest.js",
+ "file_manager/background/js/file_operation_handler_unittest.js",
+ "file_manager/background/js/file_operation_manager_unittest.js",
+ "file_manager/background/js/trash_unittest.js",
+ "file_manager/background/js/duplicate_finder_unittest.js",
+ "file_manager/background/js/volume_manager_unittest.js",
+ "file_manager/background/js/media_scanner_unittest.js",
+ "file_manager/background/js/import_history_unittest.js",
+ "file_manager/background/js/metadata_proxy_unittest.js",
+ "file_manager/background/js/crostini_unittest.js",
+ "file_manager/background/js/device_handler_unittest.js",
+
+ # Foreground:
+ "file_manager/foreground/elements/files_password_dialog_unittest.js",
+ "file_manager/foreground/elements/files_xf_elements_unittest.js",
+ "file_manager/foreground/elements/files_toast_unittest.js",
+ "file_manager/foreground/elements/files_tooltip_unittest.js",
+ "file_manager/foreground/js/metadata/image_orientation_unittest.js",
+ "file_manager/foreground/js/metadata/metadata_cache_item_unittest.js",
+ "file_manager/foreground/js/metadata/exif_parser_unittest.js",
+ "file_manager/foreground/js/metadata/thumbnail_model_unittest.js",
+ "file_manager/foreground/js/metadata/metadata_model_unittest.js",
+ "file_manager/foreground/js/metadata/content_metadata_provider_unittest.js",
+ "file_manager/foreground/js/metadata/external_metadata_provider_unittest.js",
+ "file_manager/foreground/js/metadata/file_system_metadata_provider_unittest.js",
+ "file_manager/foreground/js/metadata/metadata_cache_set_unittest.js",
+ "file_manager/foreground/js/metadata/multi_metadata_provider_unittest.js",
+ "file_manager/foreground/js/file_manager_commands_unittest.js",
+ "file_manager/foreground/js/task_controller_unittest.js",
+ "file_manager/foreground/js/thumbnail_loader_unittest.js",
+ "file_manager/foreground/js/directory_contents_unittest.js",
+ "file_manager/foreground/js/file_list_model_unittest.js",
+ "file_manager/foreground/js/banner_controller_unittest.js",
+ "file_manager/foreground/js/providers_model_unittest.js",
+ "file_manager/foreground/js/spinner_controller_unittest.js",
+ "file_manager/foreground/js/banner_util_unittest.js",
+ "file_manager/foreground/js/list_thumbnail_loader_unittest.js",
+ "file_manager/foreground/js/file_type_filters_controller_unittest.js",
+ "file_manager/foreground/js/path_component_unittest.js",
+ "file_manager/foreground/js/actions_model_unittest.js",
+ "file_manager/foreground/js/empty_folder_controller_unittest.js",
+ "file_manager/foreground/js/ui/file_manager_dialog_base_unittest.js",
+ "file_manager/foreground/js/ui/actions_submenu_unittest.js",
+ "file_manager/foreground/js/ui/file_table_unittest.js",
+ "file_manager/foreground/js/ui/file_tap_handler_unittest.js",
+ "file_manager/foreground/js/ui/install_linux_package_dialog_unittest.js",
+ "file_manager/foreground/js/ui/file_table_list_unittest.js",
+ "file_manager/foreground/js/ui/file_grid_unittest.js",
+ "file_manager/foreground/js/ui/multi_menu_unittest.js",
+ "file_manager/foreground/js/ui/splitter_unittest.js",
+ "file_manager/foreground/js/ui/banners/state_banner_unittest.js",
+ "file_manager/foreground/js/ui/banners/educational_banner_unittest.js",
+ "file_manager/foreground/js/ui/banners/warning_banner_unittest.js",
+ "file_manager/foreground/js/ui/file_list_selection_model_unittest.js",
+ "file_manager/foreground/js/ui/directory_tree_unittest.js",
+ "file_manager/foreground/js/navigation_list_model_unittest.js",
+ "file_manager/foreground/js/directory_model_unittest.js",
+ "file_manager/foreground/js/file_tasks_unittest.js",
+ "file_manager/foreground/js/file_transfer_controller_unittest.js",
+ "file_manager/foreground/js/import_controller_unittest.js",
+
+ # Image Loader:
+ "image_loader/scheduler_unittest.js",
+ "image_loader/image_loader_unittest.js",
+ "image_loader/cache_unittest.js",
+ "image_loader/image_loader_client_unittest.js",
+]
+
+# Files that don't have the generated HTML, but are used for tests.
+unittest_files += [
+ # Test harness
+ "base/js/test_harness.html",
+ "base/js/test_harness.js",
+
+ "file_manager/common/js/mock_util.js",
+]
+# END: Test files.
diff --git a/chromium/ui/file_manager/image_loader/BUILD.gn b/chromium/ui/file_manager/image_loader/BUILD.gn
index 56678dec7c3..f998277ba47 100644
--- a/chromium/ui/file_manager/image_loader/BUILD.gn
+++ b/chromium/ui/file_manager/image_loader/BUILD.gn
@@ -5,17 +5,18 @@
import("//chrome/browser/resources/tools/optimize_webui.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//third_party/closure_compiler/js_unit_tests.gni")
-import("//ui/file_manager/base/gn/js_test_gen_html.gni")
+import("//ui/file_manager/base/gn/js_test_type_check.gni")
js_type_check("closure_compile_jsmodules") {
closure_flags = default_closure_args + [
+ "language_in=ECMASCRIPT_2020",
"jscomp_error=strictCheckTypes",
"js_module_root=gen/ui/file_manager/",
"js_module_root=../../ui/file_manager/",
"browser_resolver_prefix_replacements=\"chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/=./file_manager/\"",
]
deps = [
- ":background.m",
+ ":background",
":cache",
":image_loader_client",
":image_loader_util",
@@ -26,13 +27,13 @@ js_type_check("closure_compile_jsmodules") {
]
}
-js_library("background.m") {
+js_library("background") {
}
js_library("cache") {
}
-js_unittest("cache_unittest.m") {
+js_unittest("cache_unittest") {
deps = [
":load_image_request",
"//chrome/test/data/webui:chai_assert",
@@ -70,7 +71,7 @@ js_library("image_loader") {
]
}
-js_unittest("image_loader_unittest.m") {
+js_unittest("image_loader_unittest") {
deps = [
":image_loader_util",
":image_orientation",
@@ -106,7 +107,7 @@ js_library("image_loader_client") {
]
}
-js_unittest("image_loader_client_unittest.m") {
+js_unittest("image_loader_client_unittest") {
deps = [
":image_loader_client",
":load_image_request",
@@ -141,7 +142,7 @@ js_library("scheduler") {
deps = [ ":image_request_task" ]
}
-js_unittest("scheduler_unittest.m") {
+js_unittest("scheduler_unittest") {
deps = [
":image_request_task",
":scheduler",
@@ -149,19 +150,20 @@ js_unittest("scheduler_unittest.m") {
]
}
-js_test_gen_html("js_test_gen_html_modules") {
+js_test_type_check("js_test_type_check") {
deps = [
- ":cache_unittest.m",
- ":image_loader_client_unittest.m",
- ":image_loader_unittest.m",
- ":scheduler_unittest.m",
+ ":cache_unittest",
+ ":image_loader_client_unittest",
+ ":image_loader_unittest",
+ ":scheduler_unittest",
]
closure_flags = strict_error_checking_closure_args + [
+ "language_in=ECMASCRIPT_2020",
"js_module_root=./gen/ui",
"js_module_root=../../ui/file_manager/",
"js_module_root=./gen/ui/file_manager/",
- "browser_resolver_prefix_replacements=\"chrome://test/=./\"",
+ "browser_resolver_prefix_replacements=\"chrome://webui-test/=./\"",
"browser_resolver_prefix_replacements=\"chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/=./file_manager/\"",
]
}
@@ -170,7 +172,7 @@ group("closure_compile") {
testonly = true
deps = [
":closure_compile_jsmodules",
- ":js_test_gen_html_modules_type_check_auto",
+ ":js_test_type_check",
]
}
@@ -203,9 +205,9 @@ optimize_webui("build") {
host = "image_loader"
input = preprocess_folder
- js_module_in_files = [ "background.m.js" ]
+ js_module_in_files = [ "background.js" ]
- js_out_files = [ "background.m.rollup.js" ]
+ js_out_files = [ "background.rollup.js" ]
external_paths = [
"chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj|$files_app_path",
@@ -213,7 +215,7 @@ optimize_webui("build") {
]
deps = [
- ":background.m",
+ ":background",
"//ui/file_manager:preprocess_generated",
"//ui/file_manager:preprocess_generated_image_loader",
"//ui/file_manager:preprocess_static",
diff --git a/chromium/ui/file_manager/integration_tests/BUILD.gn b/chromium/ui/file_manager/integration_tests/BUILD.gn
index e0e4bc9b82e..a10edea5069 100644
--- a/chromium/ui/file_manager/integration_tests/BUILD.gn
+++ b/chromium/ui/file_manager/integration_tests/BUILD.gn
@@ -19,9 +19,10 @@ js_type_check("closure_compile") {
]
closure_flags =
strict_error_checking_closure_args + [
+ "language_in=ECMASCRIPT_2020",
"js_module_root=./gen/ui",
"js_module_root=../../ui",
- "browser_resolver_prefix_replacements=\"chrome://test/=./\"",
+ "browser_resolver_prefix_replacements=\"chrome://webui-test/=./\"",
"hide_warnings_for=third_party/",
]
}
diff --git a/chromium/ui/file_manager/integration_tests/file_manager/BUILD.gn b/chromium/ui/file_manager/integration_tests/file_manager/BUILD.gn
index bf585e398eb..b3060fca240 100644
--- a/chromium/ui/file_manager/integration_tests/file_manager/BUILD.gn
+++ b/chromium/ui/file_manager/integration_tests/file_manager/BUILD.gn
@@ -16,6 +16,7 @@ js_type_check("closure_compile") {
":crostini",
":directory_tree",
":directory_tree_context_menu",
+ ":dlp",
":drive_specific",
":file_dialog",
":file_display",
@@ -58,9 +59,10 @@ js_type_check("closure_compile") {
closure_flags =
strict_error_checking_closure_args + [
+ "language_in=ECMASCRIPT_2020",
"js_module_root=gen/ui/file_manager/",
"js_module_root=../../ui/file_manager/",
- "browser_resolver_prefix_replacements=\"chrome://test/=./\"",
+ "browser_resolver_prefix_replacements=\"chrome://webui-test/=./\"",
"hide_warnings_for=third_party/",
]
}
@@ -136,6 +138,14 @@ js_library("directory_tree_context_menu") {
]
}
+js_library("dlp") {
+ testonly = true
+ deps = [
+ ":test_data",
+ "//ui/file_manager/integration_tests:testcase",
+ ]
+}
+
js_library("drive_specific") {
testonly = true
deps = [
@@ -360,6 +370,7 @@ js_library("tasks") {
js_library("toolbar") {
testonly = true
deps = [
+ ":tasks",
":test_data",
"//ui/file_manager/integration_tests:testcase",
]
@@ -376,6 +387,7 @@ js_library("transfer") {
js_library("trash") {
testonly = true
deps = [
+ ":tasks",
":test_data",
"//ui/file_manager/integration_tests:testcase",
]
diff --git a/chromium/ui/gfx/BUILD.gn b/chromium/ui/gfx/BUILD.gn
index af6bc49befd..a32cc340d4a 100644
--- a/chromium/ui/gfx/BUILD.gn
+++ b/chromium/ui/gfx/BUILD.gn
@@ -306,8 +306,6 @@ component("gfx") {
sources += [
"platform_font_skia.cc",
"platform_font_skia.h",
- "skia_font_delegate.cc",
- "skia_font_delegate.h",
]
}
@@ -367,6 +365,7 @@ component("gfx") {
if (is_win) {
libs = [
"setupapi.lib",
+ "dwmapi.lib",
"dwrite.lib",
]
deps += [ "//components/crash/core/common" ]
@@ -382,6 +381,9 @@ component("gfx") {
}
# Linux.
+ if (is_linux) {
+ deps += [ "//ui/linux:linux_ui" ]
+ }
if (is_linux || is_chromeos) {
deps += [ "//third_party/fontconfig" ]
}
@@ -419,6 +421,8 @@ component("color_space") {
"color_transform.h",
"display_color_spaces.cc",
"display_color_spaces.h",
+ "hdr_metadata.cc",
+ "hdr_metadata.h",
"hdr_static_metadata.cc",
"hdr_static_metadata.h",
"icc_profile.cc",
@@ -543,8 +547,6 @@ source_set("memory_buffer_sources") {
"gpu_fence.h",
"gpu_fence_handle.cc",
"gpu_fence_handle.h",
- "hdr_metadata.cc",
- "hdr_metadata.h",
"native_pixmap.h",
"overlay_priority_hint.h",
"overlay_transform.h",
@@ -670,27 +672,6 @@ static_library("test_support") {
}
}
-if (is_mac) {
- component("gfx_io_surface_hdr_metadata") {
- sources = [
- "mac/io_surface_hdr_metadata.cc",
- "mac/io_surface_hdr_metadata.h",
- ]
- defines = [ "IS_GFX_IO_SURFACE_HDR_METADATA_IMPL" ]
-
- # This is a separate component from the other sources because it depends on
- # the mojo serialize and deserialize methods.
- deps = [
- ":gfx",
- "//ui/gfx/mojom:mojom",
- ]
- frameworks = [
- "CoreFoundation.framework",
- "IOSurface.framework",
- ]
- }
-}
-
test("gfx_unittests") {
sources = [
"animation/keyframe/keyframe_animation_unittest.cc",
@@ -711,11 +692,11 @@ test("gfx_unittests") {
"text_elider_unittest.cc",
"text_utils_unittest.cc",
]
+ if (is_linux) {
+ sources += [ "font_render_params_linux_unittest.cc" ]
+ }
if (is_linux || is_chromeos) {
- sources += [
- "font_fallback_linux_unittest.cc",
- "font_render_params_linux_unittest.cc",
- ]
+ sources += [ "font_fallback_linux_unittest.cc" ]
}
if (is_mac) {
sources += [
@@ -850,10 +831,6 @@ test("gfx_unittests") {
deps += [ "//ui/resources:ui_test_pak_bundle_data" ]
}
- if (is_mac) {
- deps += [ ":gfx_io_surface_hdr_metadata" ]
- }
-
if (is_android) {
deps += [ "//ui/android:ui_java" ]
}
@@ -904,6 +881,10 @@ test("gfx_unittests") {
]
}
+ if (is_linux) {
+ deps += [ "//ui/linux:test_support" ]
+ }
+
if (is_linux || is_chromeos) {
sources += [
"linux/fontconfig_util_unittest.cc",
@@ -913,11 +894,10 @@ test("gfx_unittests") {
}
if (is_fuchsia) {
- # TODO(https://crbug.com/1287051): fuchsia.sys.Launcher is used to launch
- # fuchsia-pkg://fuchsia.com/fonts#meta/fonts.cmx with specific test
- # args.
- use_cfv2 = false
- deps += [ "//skia:test_fonts" ]
+ use_cfv1 = false
+ deps += [ "//skia:test_fonts_cfv2" ]
+ additional_manifest_fragments =
+ [ "//build/config/fuchsia/test/test_fonts.shard.test-cml" ]
}
}
diff --git a/chromium/ui/gfx/DEPS b/chromium/ui/gfx/DEPS
index bff94453a22..73262fa7085 100644
--- a/chromium/ui/gfx/DEPS
+++ b/chromium/ui/gfx/DEPS
@@ -8,6 +8,7 @@ include_rules = [
"+third_party/skia",
"+third_party/test_fonts",
"+ui/ios",
+ "+ui/linux",
"+ui/ozone/buildflags.h",
"-testing/gmock",
diff --git a/chromium/ui/gfx/android/java_bitmap.cc b/chromium/ui/gfx/android/java_bitmap.cc
index 1b9d9e025a0..6aadd5b7ca6 100644
--- a/chromium/ui/gfx/android/java_bitmap.cc
+++ b/chromium/ui/gfx/android/java_bitmap.cc
@@ -133,7 +133,7 @@ SkBitmap CreateSkBitmapFromJavaBitmap(const JavaBitmap& jbitmap) {
// compositor relies on this.
SkPixmap src = WrapJavaBitmapAsPixmap(jbitmap);
const size_t min_row_bytes = src.info().minRowBytes();
- const size_t row_bytes = base::bits::AlignUp(min_row_bytes, 4u);
+ const size_t row_bytes = base::bits::AlignUp(min_row_bytes, size_t{4});
SkBitmap skbitmap;
skbitmap.allocPixels(src.info(), row_bytes);
diff --git a/chromium/ui/gfx/animation/BUILD.gn b/chromium/ui/gfx/animation/BUILD.gn
index 78761079e49..b241d3c4422 100644
--- a/chromium/ui/gfx/animation/BUILD.gn
+++ b/chromium/ui/gfx/animation/BUILD.gn
@@ -45,12 +45,8 @@ component("animation") {
sources += [ "animation_win.cc" ]
}
- if (is_linux || is_chromeos_lacros) {
- sources += [
- "animation_linux.cc",
- "animation_settings_provider_linux.cc",
- "animation_settings_provider_linux.h",
- ]
+ if (is_linux) {
+ sources += [ "animation_linux.cc" ]
}
if (!is_android) {
@@ -84,5 +80,9 @@ component("animation") {
deps += [ "//ui/gfx:gfx_jni_headers" ]
}
+ if (is_linux) {
+ deps += [ "//ui/linux:linux_ui" ]
+ }
+
defines = [ "ANIMATION_IMPLEMENTATION" ]
}
diff --git a/chromium/ui/gfx/animation/animation.cc b/chromium/ui/gfx/animation/animation.cc
index e381b4fea57..fc4b7e469ae 100644
--- a/chromium/ui/gfx/animation/animation.cc
+++ b/chromium/ui/gfx/animation/animation.cc
@@ -82,8 +82,8 @@ int Animation::CurrentValueBetween(int start, int target) const {
gfx::Rect Animation::CurrentValueBetween(const gfx::Rect& start_bounds,
const gfx::Rect& target_bounds) const {
- return Tween::RectValueBetween(
- GetCurrentValue(), start_bounds, target_bounds);
+ return Tween::RectValueBetween(GetCurrentValue(), start_bounds,
+ target_bounds);
}
void Animation::SetContainer(AnimationContainer* container) {
@@ -112,8 +112,8 @@ bool Animation::ShouldRenderRichAnimation() {
RichAnimationRenderMode::FORCE_ENABLED;
}
-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS_ASH) || \
- BUILDFLAG(IS_IOS) || BUILDFLAG(IS_FUCHSIA)
+#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_IOS) || \
+ BUILDFLAG(IS_FUCHSIA)
// static
bool Animation::ShouldRenderRichAnimationImpl() {
return true;
@@ -137,7 +137,7 @@ void Animation::UpdatePrefersReducedMotion() {
prefers_reduced_motion_ = false;
}
#endif // !BUILDFLAG(IS_ANDROID)
-#endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS_ASH) ||
+#endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) ||
// BUILDFLAG(IS_IOS) || BUILDFLAG(IS_FUCHSIA)
// static
diff --git a/chromium/ui/gfx/animation/animation_linux.cc b/chromium/ui/gfx/animation/animation_linux.cc
index 0bcce53e57f..9216c40313c 100644
--- a/chromium/ui/gfx/animation/animation_linux.cc
+++ b/chromium/ui/gfx/animation/animation_linux.cc
@@ -4,17 +4,17 @@
#include "ui/gfx/animation/animation.h"
-#include "ui/gfx/animation/animation_settings_provider_linux.h"
+#include "ui/linux/linux_ui.h"
namespace gfx {
namespace {
-// GTK only has a global setting for whether animations should be enabled. So
-// use it for all of the specific settings that Chrome needs.
+// Linux toolkits only have a global setting for whether animations should be
+// enabled. So use it for all of the specific settings that Chrome needs.
bool AnimationsEnabled() {
- auto* provider = AnimationSettingsProviderLinux::GetInstance();
- return !provider || provider->AnimationsEnabled();
+ auto* linux_ui = ui::LinuxUi::instance();
+ return !linux_ui || linux_ui->AnimationsEnabled();
}
} // namespace
diff --git a/chromium/ui/gfx/animation/animation_settings_provider_linux.cc b/chromium/ui/gfx/animation/animation_settings_provider_linux.cc
deleted file mode 100644
index e4d4c6c2b67..00000000000
--- a/chromium/ui/gfx/animation/animation_settings_provider_linux.cc
+++ /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.
-
-#include "ui/gfx/animation/animation_settings_provider_linux.h"
-
-#include "base/check_op.h"
-
-namespace gfx {
-
-// static
-AnimationSettingsProviderLinux* AnimationSettingsProviderLinux::instance_ =
- nullptr;
-
-// static
-AnimationSettingsProviderLinux* AnimationSettingsProviderLinux::GetInstance() {
- return instance_;
-}
-
-AnimationSettingsProviderLinux::AnimationSettingsProviderLinux() {
- DCHECK(!instance_);
- instance_ = this;
-}
-
-AnimationSettingsProviderLinux::~AnimationSettingsProviderLinux() {
- DCHECK_EQ(instance_, this);
- instance_ = nullptr;
-}
-
-} // namespace gfx
diff --git a/chromium/ui/gfx/animation/animation_settings_provider_linux.h b/chromium/ui/gfx/animation/animation_settings_provider_linux.h
deleted file mode 100644
index 8664544cc9f..00000000000
--- a/chromium/ui/gfx/animation/animation_settings_provider_linux.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 UI_GFX_ANIMATION_ANIMATION_SETTINGS_PROVIDER_LINUX_H_
-#define UI_GFX_ANIMATION_ANIMATION_SETTINGS_PROVIDER_LINUX_H_
-
-#include "ui/gfx/animation/animation_export.h"
-
-namespace gfx {
-
-class ANIMATION_EXPORT AnimationSettingsProviderLinux {
- public:
- AnimationSettingsProviderLinux(const AnimationSettingsProviderLinux&) =
- delete;
- AnimationSettingsProviderLinux& operator=(
- const AnimationSettingsProviderLinux&) = delete;
-
- virtual ~AnimationSettingsProviderLinux();
-
- // Indicates if animations are enabled by the toolkit.
- virtual bool AnimationsEnabled() const = 0;
-
- static AnimationSettingsProviderLinux* GetInstance();
-
- protected:
- AnimationSettingsProviderLinux();
-
- private:
- static AnimationSettingsProviderLinux* instance_;
-};
-
-} // namespace gfx
-
-#endif // UI_GFX_ANIMATION_ANIMATION_SETTINGS_PROVIDER_LINUX_H_
diff --git a/chromium/ui/gfx/animation/tween.cc b/chromium/ui/gfx/animation/tween.cc
index c348a312113..15931c801f0 100644
--- a/chromium/ui/gfx/animation/tween.cc
+++ b/chromium/ui/gfx/animation/tween.cc
@@ -149,9 +149,41 @@ uint8_t BlendColorComponents(uint8_t start,
return FloatToColorByte(blended_premultiplied / blended_alpha);
}
+float BlendColorComponentsFloat(float start,
+ float target,
+ float start_alpha,
+ float target_alpha,
+ float blended_alpha,
+ double progress) {
+ // Since progress can be outside [0, 1], blending can produce a value outside
+ // [0, 1].
+ float blended_premultiplied = Tween::FloatValueBetween(
+ progress, start * start_alpha, target * target_alpha);
+ return blended_premultiplied / blended_alpha;
+}
+
} // namespace
// static
+SkColor4f Tween::ColorValueBetween(double value,
+ SkColor4f start,
+ SkColor4f target) {
+ float start_a = start.fA;
+ float target_a = target.fA;
+ float blended_a = FloatValueBetween(value, start_a, target_a);
+ if (blended_a <= 0.f)
+ return SkColors::kTransparent;
+ blended_a = std::min(blended_a, 1.f);
+
+ auto blended_r = BlendColorComponentsFloat(start.fR, target.fR, start_a,
+ target_a, blended_a, value);
+ auto blended_g = BlendColorComponentsFloat(start.fG, target.fG, start_a,
+ target_a, blended_a, value);
+ auto blended_b = BlendColorComponentsFloat(start.fB, target.fB, start_a,
+ target_a, blended_a, value);
+
+ return SkColor4f{blended_r, blended_g, blended_b, blended_a};
+}
SkColor Tween::ColorValueBetween(double value, SkColor start, SkColor target) {
float start_a = SkColorGetA(start) / 255.f;
float target_a = SkColorGetA(target) / 255.f;
diff --git a/chromium/ui/gfx/animation/tween.h b/chromium/ui/gfx/animation/tween.h
index 80a4c60235c..8c6c52803df 100644
--- a/chromium/ui/gfx/animation/tween.h
+++ b/chromium/ui/gfx/animation/tween.h
@@ -107,6 +107,9 @@ class ANIMATION_EXPORT Tween {
static double CalculateValue(Type type, double state);
// Conveniences for getting a value between a start and end point.
+ static SkColor4f ColorValueBetween(double value,
+ SkColor4f start,
+ SkColor4f target);
static SkColor ColorValueBetween(double value, SkColor start, SkColor target);
static double DoubleValueBetween(double value, double start, double target);
static float FloatValueBetween(double value, float start, float target);
diff --git a/chromium/ui/gfx/bidi_line_iterator.h b/chromium/ui/gfx/bidi_line_iterator.h
index 751a1b2f760..bac09180e51 100644
--- a/chromium/ui/gfx/bidi_line_iterator.h
+++ b/chromium/ui/gfx/bidi_line_iterator.h
@@ -9,7 +9,6 @@
#include <string>
#include "base/i18n/rtl.h"
-#include "base/memory/raw_ptr.h"
#include "third_party/icu/source/common/unicode/ubidi.h"
#include "third_party/icu/source/common/unicode/uchar.h"
#include "ui/gfx/gfx_export.h"
diff --git a/chromium/ui/gfx/break_list.h b/chromium/ui/gfx/break_list.h
index 19c947f5afa..5e872cc33a6 100644
--- a/chromium/ui/gfx/break_list.h
+++ b/chromium/ui/gfx/break_list.h
@@ -28,8 +28,8 @@ template <typename T>
class BreakList {
public:
// The break type and const iterator, typedef'ed for convenience.
- typedef std::pair<size_t, T> Break;
- typedef typename std::vector<Break>::const_iterator const_iterator;
+ using Break = std::pair<size_t, T>;
+ using const_iterator = typename std::vector<Break>::const_iterator;
// Initialize a break at position 0 with the default or supplied |value|.
BreakList();
@@ -38,22 +38,27 @@ class BreakList {
const std::vector<Break>& breaks() const { return breaks_; }
// Clear the breaks and set a break at position 0 with the supplied |value|.
- void SetValue(T value);
+ // Returns whether or not the breaks changed while applying the |value|.
+ bool SetValue(T value);
// Adjust the breaks to apply |value| over the supplied |range|.
- void ApplyValue(T value, const Range& range);
+ // Range |range| must be between [0, max_).
+ // Returns true if the breaks changed while applying the |value|.
+ bool ApplyValue(T value, const Range& range);
// Set the max position and trim any breaks at or beyond that position.
void SetMax(size_t max);
size_t max() const { return max_; }
- // Get the break applicable to |position| (at or preceeding |position|).
- typename std::vector<Break>::iterator GetBreak(size_t position);
- typename std::vector<Break>::const_iterator GetBreak(size_t position) const;
+ // Get the break applicable to |position| (at or preceding |position|).
+ // |position| must be between [0, max_).
+ // Returns a valid iterator. Can't return |break_.end()|.
+ const_iterator GetBreak(size_t position) const;
// Get the range of the supplied break; returns the break's start position and
// the next break's start position (or |max_| for the terminal break).
- Range GetRange(const typename BreakList<T>::const_iterator& i) const;
+ // Iterator |i| must be valid and must not be |break_.end()|.
+ Range GetRange(const const_iterator& i) const;
// Comparison functions for testing purposes.
bool EqualsValueForTesting(T value) const;
@@ -66,38 +71,46 @@ class BreakList {
#endif
std::vector<Break> breaks_;
- size_t max_;
+ size_t max_ = 0;
};
-template<class T>
-BreakList<T>::BreakList() : breaks_(1, Break(0, T())), max_(0) {
-}
+template <class T>
+BreakList<T>::BreakList() : breaks_(1, Break(0, T())) {}
-template<class T>
-BreakList<T>::BreakList(T value) : breaks_(1, Break(0, value)), max_(0) {
-}
+template <class T>
+BreakList<T>::BreakList(T value) : breaks_(1, Break(0, value)) {}
+
+template <class T>
+bool BreakList<T>::SetValue(T value) {
+ // Return false if setting |value| does not change the breaks.
+ if (breaks_.size() == 1 && breaks_[0].second == value)
+ return false;
-template<class T>
-void BreakList<T>::SetValue(T value) {
breaks_.clear();
breaks_.push_back(Break(0, value));
+ return true;
}
-template<class T>
-void BreakList<T>::ApplyValue(T value, const Range& range) {
+template <class T>
+bool BreakList<T>::ApplyValue(T value, const Range& range) {
if (!range.IsValid() || range.is_empty())
- return;
+ return false;
DCHECK(!breaks_.empty());
DCHECK(!range.is_reversed());
DCHECK(Range(0, static_cast<uint32_t>(max_)).Contains(range));
+ // Return false if setting |value| does not change the breaks.
+ const_iterator start = GetBreak(range.start());
+ if (start->second == value && GetRange(start).Contains(range))
+ return false;
+
// Erase any breaks in |range|, then add start and end breaks as needed.
- typename std::vector<Break>::iterator start = GetBreak(range.start());
start += start->first < range.start() ? 1 : 0;
- typename std::vector<Break>::iterator end = GetBreak(range.end());
+ const_iterator end =
+ range.end() == max_ ? breaks_.cend() - 1 : GetBreak(range.end());
T trailing_value = end->second;
- typename std::vector<Break>::iterator i =
- start == breaks_.end() ? start : breaks_.erase(start, end + 1);
+ const_iterator i =
+ start == breaks_.cend() ? start : breaks_.erase(start, end + 1);
if (range.start() == 0 || (i - 1)->second != value)
i = breaks_.insert(i, Break(range.start(), value)) + 1;
if (trailing_value != value && range.end() != max_)
@@ -106,13 +119,18 @@ void BreakList<T>::ApplyValue(T value, const Range& range) {
#ifndef NDEBUG
CheckBreaks();
#endif
+
+ return true;
}
template<class T>
void BreakList<T>::SetMax(size_t max) {
- typename std::vector<Break>::iterator i = GetBreak(max);
- i += (i == breaks_.begin() || i->first < max) ? 1 : 0;
- breaks_.erase(i, breaks_.end());
+ if (max < max_) {
+ const_iterator i = GetBreak(max);
+ if (i == breaks_.begin() || i->first < max)
+ i++;
+ breaks_.erase(i, breaks_.end());
+ }
max_ = max;
#ifndef NDEBUG
@@ -120,26 +138,26 @@ void BreakList<T>::SetMax(size_t max) {
#endif
}
-template<class T>
-typename std::vector<std::pair<size_t, T> >::iterator BreakList<T>::GetBreak(
- size_t position) {
- typename std::vector<Break>::iterator i = breaks_.end() - 1;
- for (; i != breaks_.begin() && i->first > position; --i);
- return i;
-}
-
-template<class T>
-typename std::vector<std::pair<size_t, T> >::const_iterator
- BreakList<T>::GetBreak(size_t position) const {
- typename std::vector<Break>::const_iterator i = breaks_.end() - 1;
- for (; i != breaks_.begin() && i->first > position; --i);
- return i;
+template <class T>
+typename BreakList<T>::const_iterator BreakList<T>::GetBreak(
+ size_t position) const {
+ DCHECK(!breaks_.empty());
+ DCHECK_LT(position, max_);
+ // Find the iterator with a 'strictly greater' position and return the
+ // previous one.
+ return std::upper_bound(breaks_.cbegin(), breaks_.cend(), position,
+ [](size_t offset, const Break& value) {
+ return offset < value.first;
+ }) -
+ 1;
}
template<class T>
Range BreakList<T>::GetRange(
const typename BreakList<T>::const_iterator& i) const {
- const typename BreakList<T>::const_iterator next = i + 1;
+ // BreakLists are never empty. Iterator should always be valid.
+ DCHECK(i != breaks_.end());
+ const const_iterator next = i + 1;
return Range(i->first, next == breaks_.end() ? max_ : next->first);
}
@@ -161,6 +179,7 @@ bool BreakList<T>::EqualsForTesting(const std::vector<Break>& breaks) const {
#ifndef NDEBUG
template <class T>
void BreakList<T>::CheckBreaks() {
+ DCHECK(!breaks_.empty()) << "BreakList cannot be empty";
DCHECK_EQ(breaks_[0].first, 0U) << "The first break must be at position 0.";
for (size_t i = 0; i < breaks_.size() - 1; ++i) {
DCHECK_LT(breaks_[i].first, breaks_[i + 1].first) << "Break out of order.";
diff --git a/chromium/ui/gfx/break_list_unittest.cc b/chromium/ui/gfx/break_list_unittest.cc
index c862df9c44c..e58aac16d6b 100644
--- a/chromium/ui/gfx/break_list_unittest.cc
+++ b/chromium/ui/gfx/break_list_unittest.cc
@@ -28,6 +28,21 @@ TEST_F(BreakListTest, SetValue) {
EXPECT_TRUE(color_breaks.EqualsValueForTesting(SK_ColorBLACK));
}
+TEST_F(BreakListTest, SetValueChanged) {
+ BreakList<bool> breaks(false);
+ EXPECT_FALSE(breaks.SetValue(false));
+ EXPECT_TRUE(breaks.SetValue(true));
+ EXPECT_FALSE(breaks.SetValue(true));
+ EXPECT_TRUE(breaks.SetValue(false));
+
+ const size_t max = 99;
+ breaks.SetMax(max);
+ breaks.ApplyValue(true, Range(0, 2));
+ breaks.ApplyValue(true, Range(3, 6));
+ EXPECT_TRUE(breaks.SetValue(false));
+ EXPECT_FALSE(breaks.SetValue(false));
+}
+
TEST_F(BreakListTest, ApplyValue) {
BreakList<bool> breaks(false);
const size_t max = 99;
@@ -102,6 +117,27 @@ TEST_F(BreakListTest, ApplyValue) {
EXPECT_TRUE(breaks.EqualsForTesting(overlap));
}
+TEST_F(BreakListTest, ApplyValueChanged) {
+ BreakList<bool> breaks(false);
+ const size_t max = 99;
+ breaks.SetMax(max);
+
+ // Set two ranges.
+ EXPECT_TRUE(breaks.ApplyValue(true, Range(0, 5)));
+ EXPECT_TRUE(breaks.ApplyValue(true, Range(9, 10)));
+
+ // Setting sub-ranges should be a no-op.
+ EXPECT_FALSE(breaks.ApplyValue(true, Range(0, 2)));
+ EXPECT_FALSE(breaks.ApplyValue(true, Range(1, 3)));
+
+ // Merge the two ranges.
+ EXPECT_TRUE(breaks.ApplyValue(true, Range(2, 10)));
+
+ // Setting sub-ranges should be a no-op.
+ EXPECT_FALSE(breaks.ApplyValue(true, Range(0, 2)));
+ EXPECT_FALSE(breaks.ApplyValue(true, Range(1, 3)));
+}
+
TEST_F(BreakListTest, SetMax) {
// Ensure values adjust to accommodate max position changes.
BreakList<bool> breaks(false);
@@ -144,17 +180,9 @@ TEST_F(BreakListTest, GetBreakAndRange) {
size_t break_index;
Range range;
} cases[] = {
- { 0, 0, Range(0, 1) },
- { 1, 1, Range(1, 2) },
- { 2, 2, Range(2, 4) },
- { 3, 2, Range(2, 4) },
- { 4, 3, Range(4, 6) },
- { 5, 3, Range(4, 6) },
- { 6, 4, Range(6, 8) },
- { 7, 4, Range(6, 8) },
- // Positions at or beyond the max simply return the last break and range.
- { 8, 4, Range(6, 8) },
- { 9, 4, Range(6, 8) },
+ {0, 0, Range(0, 1)}, {1, 1, Range(1, 2)}, {2, 2, Range(2, 4)},
+ {3, 2, Range(2, 4)}, {4, 3, Range(4, 6)}, {5, 3, Range(4, 6)},
+ {6, 4, Range(6, 8)}, {7, 4, Range(6, 8)},
};
for (size_t i = 0; i < std::size(cases); ++i) {
diff --git a/chromium/ui/gfx/canvas.cc b/chromium/ui/gfx/canvas.cc
index 8b525dcd3db..08925029f28 100644
--- a/chromium/ui/gfx/canvas.cc
+++ b/chromium/ui/gfx/canvas.cc
@@ -162,7 +162,7 @@ void Canvas::DrawColor(SkColor color) {
}
void Canvas::DrawColor(SkColor color, SkBlendMode mode) {
- canvas_->drawColor(color, mode);
+ canvas_->drawColor(SkColor4f::FromColor(color), mode);
}
void Canvas::FillRect(const Rect& rect, SkColor color) {
diff --git a/chromium/ui/gfx/color_conversion_sk_filter_cache.cc b/chromium/ui/gfx/color_conversion_sk_filter_cache.cc
index 49c0934dff6..6c9a3a32c95 100644
--- a/chromium/ui/gfx/color_conversion_sk_filter_cache.cc
+++ b/chromium/ui/gfx/color_conversion_sk_filter_cache.cc
@@ -21,9 +21,6 @@ namespace gfx {
namespace {
-const base::Feature kToneMappingV2{"ToneMappingV2",
- base::FEATURE_ENABLED_BY_DEFAULT};
-
// Additional YUV information to skia renderer to draw 9- and 10- bits color.
struct YUVInput {
float offset = 0.f;
@@ -39,6 +36,7 @@ bool ColorConversionSkFilterCache::Key::Key::operator==(
const Key& other) const {
return src == other.src && dst == other.dst &&
sdr_max_luminance_nits == other.sdr_max_luminance_nits &&
+ src_hdr_metadata == other.src_hdr_metadata &&
dst_max_luminance_relative == other.dst_max_luminance_relative;
}
@@ -53,12 +51,15 @@ bool ColorConversionSkFilterCache::Key::operator<(const Key& other) const {
other.dst_max_luminance_relative);
}
-ColorConversionSkFilterCache::Key::Key(const gfx::ColorSpace& src,
- const gfx::ColorSpace& dst,
- float sdr_max_luminance_nits,
- float dst_max_luminance_relative)
+ColorConversionSkFilterCache::Key::Key(
+ const gfx::ColorSpace& src,
+ const gfx::ColorSpace& dst,
+ absl::optional<gfx::HDRMetadata> src_hdr_metadata,
+ float sdr_max_luminance_nits,
+ float dst_max_luminance_relative)
: src(src),
dst(dst),
+ src_hdr_metadata(src_hdr_metadata),
sdr_max_luminance_nits(sdr_max_luminance_nits),
dst_max_luminance_relative(dst_max_luminance_relative) {}
@@ -67,14 +68,16 @@ sk_sp<SkColorFilter> ColorConversionSkFilterCache::Get(
const gfx::ColorSpace& dst,
float resource_offset,
float resource_multiplier,
+ absl::optional<gfx::HDRMetadata> src_hdr_metadata,
float sdr_max_luminance_nits,
float dst_max_luminance_relative) {
// Set unused parameters to bogus values, so that they do not result in
// different keys for the same conversion.
if (!src.IsToneMappedByDefault()) {
- // If the source is not going to be tone mapped, then
- // `dst_max_luminance_relative` will not be used, so set it to a nonsense
- // value.
+ // If the source is not going to be tone mapped, then `src_hdr_metadata`
+ // and `dst_max_luminance_relative` will not be used, so set them nonsense
+ // values.
+ src_hdr_metadata = absl::nullopt;
dst_max_luminance_relative = 0;
// If neither source nor destination will use `sdr_max_luminance_nits`, then
@@ -84,25 +87,20 @@ sk_sp<SkColorFilter> ColorConversionSkFilterCache::Get(
}
}
- const Key key(src, dst, sdr_max_luminance_nits, dst_max_luminance_relative);
+ const Key key(src, dst, src_hdr_metadata, sdr_max_luminance_nits,
+ dst_max_luminance_relative);
sk_sp<SkRuntimeEffect>& effect = cache_[key];
if (!effect) {
gfx::ColorTransform::Options options;
-
- static const bool tone_mapping_v2_enabled =
- base::FeatureList::IsEnabled(kToneMappingV2);
- if (tone_mapping_v2_enabled)
- options.tone_map_pq_and_hlg_to_dst = true;
- else
- options.tone_map_pq_and_hlg_to_sdr = dst_max_luminance_relative == 1.f;
-
+ options.tone_map_pq_and_hlg_to_dst = true;
options.sdr_max_luminance_nits = key.sdr_max_luminance_nits;
// TODO(https://crbug.com/1286076): Ensure that, when tone mapping using
// `dst_max_luminance_relative` is implemented, the gfx::ColorTransform's
// SkShaderSource not depend on that parameter (rather, that it be left
// as a uniform in the shader). If that is not the case, then it will need
// to be part of the key.
+ options.src_hdr_metadata = src_hdr_metadata;
options.dst_max_luminance_relative = dst_max_luminance_relative;
std::unique_ptr<gfx::ColorTransform> transform =
gfx::ColorTransform::NewColorTransform(src, dst, options);
@@ -150,11 +148,15 @@ sk_sp<SkImage> ColorConversionSkFilterCache::ConvertImage(
sk_sp<SkColorSpace> target_color_space,
float sdr_max_luminance_nits,
float dst_max_luminance_relative,
+ bool enable_tone_mapping,
GrDirectContext* context) {
sk_sp<SkColorSpace> image_sk_color_space = image->refColorSpace();
if (!image_sk_color_space)
return image->makeColorSpace(target_color_space, context);
+ if (!enable_tone_mapping)
+ return image->makeColorSpace(target_color_space, context);
+
gfx::ColorSpace image_color_space(*image_sk_color_space);
switch (image_color_space.GetTransferID()) {
case ColorSpace::TransferID::PQ:
@@ -200,7 +202,8 @@ sk_sp<SkImage> ColorConversionSkFilterCache::ConvertImage(
sk_sp<SkColorFilter> filter =
Get(image_color_space, gfx::ColorSpace(*target_color_space),
/*resource_offset=*/0, /*resource_multiplier=*/1,
- sdr_max_luminance_nits, dst_max_luminance_relative);
+ /*src_hdr_metadata=*/absl::nullopt, sdr_max_luminance_nits,
+ dst_max_luminance_relative);
SkPaint paint;
paint.setBlendMode(SkBlendMode::kSrc);
paint.setColorFilter(filter);
diff --git a/chromium/ui/gfx/color_conversion_sk_filter_cache.h b/chromium/ui/gfx/color_conversion_sk_filter_cache.h
index 4dd1ecbbc93..add7773f132 100644
--- a/chromium/ui/gfx/color_conversion_sk_filter_cache.h
+++ b/chromium/ui/gfx/color_conversion_sk_filter_cache.h
@@ -6,10 +6,12 @@
#define UI_GFX_COLOR_CONVERSION_SK_FILTER_CACHE_H_
#include "base/containers/flat_map.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/skia/include/core/SkRefCnt.h"
#include "ui/gfx/color_space.h"
#include "ui/gfx/color_space_export.h"
#include "ui/gfx/gfx_export.h"
+#include "ui/gfx/hdr_metadata.h"
class GrDirectContext;
class SkImage;
@@ -27,14 +29,15 @@ class COLOR_SPACE_EXPORT ColorConversionSkFilterCache {
~ColorConversionSkFilterCache();
// Retrieve an SkColorFilter to transform `src` to `dst`. The filter also
- // applies the offset `resource_offset` and then scales by
- // `resource_multiplier`.
- // TODO(https://crbug.com/1286076): Apply tone mapping using
- // `sdr_max_luminance_nits` and `dst_max_luminance_relative`.
+ // applies the offset `src_resource_offset` and then scales by
+ // `src_resource_multiplier`. Apply tone mapping of `src` is HLG or PQ,
+ // using `sdr_max_luminance_nits`, `src_hdr_metadata`, and
+ // `dst_max_luminance_relative` as parameters.
sk_sp<SkColorFilter> Get(const gfx::ColorSpace& src,
const gfx::ColorSpace& dst,
float resource_offset,
float resource_multiplier,
+ absl::optional<gfx::HDRMetadata> src_hdr_metadata,
float sdr_max_luminance_nits,
float dst_max_luminance_relative);
@@ -50,17 +53,20 @@ class COLOR_SPACE_EXPORT ColorConversionSkFilterCache {
sk_sp<SkColorSpace> target_color_space,
float sdr_max_luminance_nits,
float dst_max_luminance_relative,
+ bool enable_tone_mapping,
GrDirectContext* context);
public:
struct Key {
Key(const gfx::ColorSpace& src,
const gfx::ColorSpace& dst,
+ absl::optional<gfx::HDRMetadata> src_hdr_metadata,
float sdr_max_luminance_nits,
float dst_max_luminance_relative);
gfx::ColorSpace src;
gfx::ColorSpace dst;
+ absl::optional<gfx::HDRMetadata> src_hdr_metadata;
float sdr_max_luminance_nits = 0.f;
float dst_max_luminance_relative = 0.f;
@@ -73,6 +79,7 @@ class COLOR_SPACE_EXPORT ColorConversionSkFilterCache {
float resource_offset,
float resource_multiplier,
float sdr_max_luminance_nits,
+ absl::optional<gfx::HDRMetadata> src_hdr_metadata,
float dst_max_luminance_relative);
base::flat_map<Key, sk_sp<SkRuntimeEffect>> cache_;
diff --git a/chromium/ui/gfx/color_space_win.cc b/chromium/ui/gfx/color_space_win.cc
index 2f32286832e..d24c5d6829f 100644
--- a/chromium/ui/gfx/color_space_win.cc
+++ b/chromium/ui/gfx/color_space_win.cc
@@ -5,7 +5,7 @@
#include "ui/gfx/color_space_win.h"
#include "base/logging.h"
-#include "third_party/skia/include/third_party/skcms/skcms.h"
+#include "third_party/skia/modules/skcms/skcms.h"
namespace gfx {
diff --git a/chromium/ui/gfx/color_transform.cc b/chromium/ui/gfx/color_transform.cc
index c7f9d753e07..86bbceb5ccb 100644
--- a/chromium/ui/gfx/color_transform.cc
+++ b/chromium/ui/gfx/color_transform.cc
@@ -16,7 +16,7 @@
#include "base/strings/string_number_conversions.h"
#include "third_party/skia/include/core/SkColor.h"
#include "third_party/skia/include/core/SkM44.h"
-#include "third_party/skia/include/third_party/skcms/skcms.h"
+#include "third_party/skia/modules/skcms/skcms.h"
#include "ui/gfx/color_space.h"
#include "ui/gfx/icc_profile.h"
#include "ui/gfx/skia_color_space_util.h"
@@ -144,6 +144,21 @@ float ToLinear(ColorSpace::TransferID id, float v) {
return 0;
}
+// Return the maximum luminance to be used for tone mapping a PQ signal, with
+// the indicated metadata.
+float GetToneMapPQMaxLuminanceNits(
+ const absl::optional<gfx::HDRMetadata>& hdr_metadata) {
+ if (hdr_metadata) {
+ if (hdr_metadata->max_content_light_level > 0)
+ return hdr_metadata->max_content_light_level;
+ if (hdr_metadata->color_volume_metadata.luminance_max > 0.f) {
+ return hdr_metadata->color_volume_metadata.luminance_max;
+ }
+ }
+ // The maximum value that ColorTransformPQToLinear can produce.
+ return 10000.f;
+}
+
} // namespace
class ColorTransformMatrix;
@@ -917,135 +932,6 @@ class ColorTransformFromBT2020CL : public ColorTransformStep {
}
};
-class ColorTransformPQToneMapToLinear : public ColorTransformStep {
- public:
- static float ToLinearToneMap(float v) {
- v = max(0.0f, v);
- return min(2.3f * pow(v, 2.8f), v / 5.0f + 0.8f);
- }
-
- static float ToLinearPQ(float v) {
- v = max(0.0f, v);
- float m1 = (2610.0f / 4096.0f) / 4.0f;
- float m2 = (2523.0f / 4096.0f) * 128.0f;
- float c1 = 3424.0f / 4096.0f;
- float c2 = (2413.0f / 4096.0f) * 32.0f;
- float c3 = (2392.0f / 4096.0f) * 32.0f;
- float p = pow(v, 1.0f / m2);
- v = powf(max(p - c1, 0.0f) / (c2 - c3 * p), 1.0f / m1);
- v *= 10000.0f / ColorSpace::kDefaultSDRWhiteLevel;
- return v;
- }
-
- // Assumes BT2020 primaries.
- static float Luma(const ColorTransform::TriStim& c) {
- return c.x() * 0.2627f + c.y() * 0.6780f + c.z() * 0.0593f;
- }
-
- static ColorTransform::TriStim ClipToWhite(ColorTransform::TriStim* c) {
- float maximum = max(max(c->x(), c->y()), c->z());
- if (maximum > 1.0f) {
- float l = Luma(*c);
- c->Scale(1.0f / maximum);
- ColorTransform::TriStim white(1.0f, 1.0f, 1.0f);
- white.Scale((1.0f - 1.0f / maximum) * l / Luma(white));
- ColorTransform::TriStim black(0.0f, 0.0f, 0.0f);
- *c += white - black;
- }
- return *c;
- }
-
- void Transform(ColorTransform::TriStim* colors, size_t num) const override {
- for (size_t i = 0; i < num; i++) {
- ColorTransform::TriStim ret(ToLinearToneMap(colors[i].x()),
- ToLinearToneMap(colors[i].y()),
- ToLinearToneMap(colors[i].z()));
- if (Luma(ret) > 0.0) {
- ColorTransform::TriStim smpte2084(ToLinearPQ(colors[i].x()),
- ToLinearPQ(colors[i].y()),
- ToLinearPQ(colors[i].z()));
- smpte2084.Scale(Luma(ret) / Luma(smpte2084));
- ret = ClipToWhite(&smpte2084);
- }
- colors[i] = ret;
- }
- }
-
- void AppendShaderSource(std::stringstream* hdr,
- std::stringstream* src,
- size_t step_index) const override {
- auto sdr_white_level =
- base::NumberToString(ColorSpace::kDefaultSDRWhiteLevel);
- *hdr << "vec3 PQToneMapStep" << step_index << "(vec3 color) {\n"
- << " vec3 result = max(color, 0.0);\n"
- << " result =\n"
- << " min(2.3 * pow(result, vec3(2.8)), result / 5.0 + 0.8);\n"
- << " vec3 luma_vec = vec3(0.2627, 0.6780, 0.0593);\n"
- << " float luma = dot(result, luma_vec);\n"
- << " if (luma > 0.0) {\n"
- << " result = max(color, 0.0);\n"
- << " float m1 = (2610.0 / 4096.0) / 4.0;\n"
- << " float m2 = (2523.0 / 4096.0) * 128.0;\n"
- << " float c1 = 3424.0 / 4096.0;\n"
- << " float c2 = (2413.0 / 4096.0) * 32.0;\n"
- << " float c3 = (2392.0 / 4096.0) * 32.0;\n"
- << " vec3 p = pow(max(result, 0.0), vec3(1.0 / m2));\n"
- << " result =\n"
- << " pow(max(p - c1, 0.0) / (c2 - c3 * p), vec3(1.0 / m1));\n"
- << " result *= 10000.0 / " + sdr_white_level + ".0;\n"
- << " result *= luma / dot(result, luma_vec);\n"
- << " float c_max = max(max(result.x, result.y), result.z);\n"
- << " if (c_max > 1.0) {\n"
- << " luma = dot(result, luma_vec);\n"
- << " float s = 1.0 / c_max;\n"
- << " result *= s;\n"
- << " vec3 white = vec3(1.0);\n"
- << " white *= (1.0 - s) * luma / dot(white, luma_vec);\n"
- << " result += white - vec3(0.0);\n"
- << " }\n"
- << " }\n"
- << " return result;\n"
- << "}\n";
- *src << " color.rgb = PQToneMapStep" << step_index << "(color.rgb);\n";
- }
-
- void AppendSkShaderSource(std::stringstream* src) const override {
- auto sdr_white_level =
- base::NumberToString(ColorSpace::kDefaultSDRWhiteLevel);
- *src << "{\n"
- << " half4 result = max(color, 0.0);\n"
- << " result =\n"
- << " min(2.3 * pow(result, half4(2.8)), result / 5.0 + 0.8);\n"
- << " half4 luma_vec = half4(0.2627, 0.6780, 0.0593, 0.0);\n"
- << " half luma = dot(result, luma_vec);\n"
- << " if (luma > 0.0) {\n"
- << " result = max(color, 0.0);\n"
- << " half m1 = (2610.0 / 4096.0) / 4.0;\n"
- << " half m2 = (2523.0 / 4096.0) * 128.0;\n"
- << " half c1 = 3424.0 / 4096.0;\n"
- << " half c2 = (2413.0 / 4096.0) * 32.0;\n"
- << " half c3 = (2392.0 / 4096.0) * 32.0;\n"
- << " half4 p = pow(max(result, 0.0), half4(1.0 / m2));\n"
- << " result =\n"
- << " pow(max(p - c1, 0.0) / (c2 - c3 * p), half4(1.0 / m1));\n"
- << " result *= 10000.0 / " + sdr_white_level + ".0;\n"
- << " result *= luma / dot(result, luma_vec);\n"
- << " half c_max = max(max(result.x, result.y), result.z);\n"
- << " if (c_max > 1.0) {\n"
- << " luma = dot(result, luma_vec);\n"
- << " half s = 1.0 / c_max;\n"
- << " result *= s;\n"
- << " half4 white = half4(1.0);\n"
- << " white *= (1.0 - s) * luma / dot(white, luma_vec);\n"
- << " result += white - half4(0.0);\n"
- << " }\n"
- << " }\n"
- << " result.a = color.a;\n"
- << " color = result;\n"
- << "}\n";
- }
-};
-
// Apply the HLG OOTF for a specified maximum luminance.
class ColorTransformHLGOOTF : public ColorTransformStep {
public:
@@ -1188,13 +1074,7 @@ void ColorTransformInternal::AppendColorSpaceToColorSpaceTransform(
switch (src.GetTransferID()) {
case ColorSpace::TransferID::HLG:
- if (options.tone_map_pq_and_hlg_to_sdr) {
- // HLG is designed such that treating it as 2.2 gamma content works
- // well.
- constexpr skcms_TransferFunction kGamma22 = {2.2, 1, 0, 0, 0, 0, 0};
- steps_.push_back(std::make_unique<ColorTransformSkTransferFn>(
- kGamma22, src.HasExtendedSkTransferFn()));
- } else if (options.tone_map_pq_and_hlg_to_dst) {
+ if (options.tone_map_pq_and_hlg_to_dst) {
// Convert to linear with a maximum value of 1.
steps_.push_back(std::make_unique<ColorTransformHLGToLinear>(
12.f * ColorSpace::kDefaultSDRWhiteLevel));
@@ -1204,12 +1084,8 @@ void ColorTransformInternal::AppendColorSpaceToColorSpaceTransform(
}
break;
case ColorSpace::TransferID::PQ:
- if (options.tone_map_pq_and_hlg_to_sdr) {
- steps_.push_back(std::make_unique<ColorTransformPQToneMapToLinear>());
- } else {
- steps_.push_back(std::make_unique<ColorTransformPQToLinear>(
- options.sdr_max_luminance_nits));
- }
+ steps_.push_back(std::make_unique<ColorTransformPQToLinear>(
+ options.sdr_max_luminance_nits));
break;
case ColorSpace::TransferID::PIECEWISE_HDR: {
skcms_TransferFunction fn;
@@ -1258,9 +1134,9 @@ void ColorTransformInternal::AppendColorSpaceToColorSpaceTransform(
break;
}
case ColorSpace::TransferID::PQ: {
- // The maximum value that ColorTransformPQToLinear can produce.
const float src_max_luminance_relative =
- 10000 / options.sdr_max_luminance_nits;
+ GetToneMapPQMaxLuminanceNits(options.src_hdr_metadata) /
+ options.sdr_max_luminance_nits;
if (src_max_luminance_relative > options.dst_max_luminance_relative) {
const ColorSpace rec2020_linear(
ColorSpace::PrimaryID::BT2020, ColorSpace::TransferID::LINEAR,
diff --git a/chromium/ui/gfx/color_transform.h b/chromium/ui/gfx/color_transform.h
index 11a56bca404..2bc8d22ea4e 100644
--- a/chromium/ui/gfx/color_transform.h
+++ b/chromium/ui/gfx/color_transform.h
@@ -8,9 +8,11 @@
#include <memory>
#include <string>
+#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/color_space.h"
#include "ui/gfx/color_space_export.h"
#include "ui/gfx/geometry/point3_f.h"
+#include "ui/gfx/hdr_metadata.h"
namespace gfx {
@@ -24,10 +26,6 @@ class COLOR_SPACE_EXPORT ColorTransform {
uint32_t src_bit_depth = kDefaultBitDepth;
uint32_t dst_bit_depth = kDefaultBitDepth;
- // If set to true, then PQ and HLG inputs are tone mapped to fit into
- // the SDR range.
- bool tone_map_pq_and_hlg_to_sdr = false;
-
// If set to true, then map PQ and HLG imputs such that their maximum
// luminance will be `dst_max_luminance_relative`.
bool tone_map_pq_and_hlg_to_dst = false;
@@ -37,6 +35,9 @@ class COLOR_SPACE_EXPORT ColorTransform {
// TODO(https://crbug.com/1286082): Use this value in the transform.
float sdr_max_luminance_nits = ColorSpace::kDefaultSDRWhiteLevel;
+ // Used for tone mapping PQ sources.
+ absl::optional<gfx::HDRMetadata> src_hdr_metadata;
+
// The maximum luminance value for the destination, as a multiple of
// `sdr_max_luminance_nits` (so this is 1 for SDR displays).
// TODO(https://crbug.com/1286076): Use this value for transforming
diff --git a/chromium/ui/gfx/color_transform_unittest.cc b/chromium/ui/gfx/color_transform_unittest.cc
index b9272c6e3a6..7d77fba128d 100644
--- a/chromium/ui/gfx/color_transform_unittest.cc
+++ b/chromium/ui/gfx/color_transform_unittest.cc
@@ -901,60 +901,4 @@ TEST(ColorSpaceTest, PiecewiseHDR) {
}
}
-TEST(ColorSpaceTest, HLGHDRToSDR) {
- ColorSpace hlg_cs(ColorSpace::PrimaryID::BT709, ColorSpace::TransferID::HLG);
- ColorSpace dest_sdr_cs(ColorSpace::PrimaryID::BT709,
- ColorSpace::TransferID::LINEAR);
- gfx::ColorTransform::Options sdr_options;
- sdr_options.tone_map_pq_and_hlg_to_sdr = true;
- auto sdr_transform =
- ColorTransform::NewColorTransform(hlg_cs, dest_sdr_cs, sdr_options);
-
- // HLG conversion will produce values above 1 w/o intervention.
- ColorTransform::TriStim sdr_val = {1, 1, 1};
- sdr_transform->Transform(&sdr_val, 1);
- EXPECT_FLOAT_EQ(sdr_val.x(), 1);
- EXPECT_FLOAT_EQ(sdr_val.y(), 1);
- EXPECT_FLOAT_EQ(sdr_val.z(), 1);
-
- ColorSpace dest_hdr_cs(ColorSpace::PrimaryID::BT709,
- ColorSpace::TransferID::LINEAR_HDR);
- gfx::ColorTransform::Options hdr_options;
- hdr_options.tone_map_pq_and_hlg_to_sdr = false;
- auto hdr_transform =
- ColorTransform::NewColorTransform(hlg_cs, dest_hdr_cs, hdr_options);
-
- ColorTransform::TriStim hdr_val = {1, 1, 1};
- hdr_transform->Transform(&hdr_val, 1);
- EXPECT_NE(sdr_val, hdr_val);
-}
-
-TEST(ColorSpaceTest, PQHDRToSDR) {
- ColorSpace pq_cs(ColorSpace::PrimaryID::BT709, ColorSpace::TransferID::PQ);
- ColorSpace dest_sdr_cs(ColorSpace::PrimaryID::BT709,
- ColorSpace::TransferID::LINEAR);
- gfx::ColorTransform::Options sdr_options;
- sdr_options.tone_map_pq_and_hlg_to_sdr = true;
- auto sdr_transform =
- ColorTransform::NewColorTransform(pq_cs, dest_sdr_cs, sdr_options);
-
- // PQ conversion will produce values above 1 w/o intervention.
- ColorTransform::TriStim sdr_val = {1, 1, 1};
- sdr_transform->Transform(&sdr_val, 1);
- EXPECT_FLOAT_EQ(sdr_val.x(), 1);
- EXPECT_FLOAT_EQ(sdr_val.y(), 1);
- EXPECT_FLOAT_EQ(sdr_val.z(), 1);
-
- ColorSpace dest_hdr_cs(ColorSpace::PrimaryID::BT709,
- ColorSpace::TransferID::LINEAR_HDR);
- gfx::ColorTransform::Options hdr_options;
- hdr_options.tone_map_pq_and_hlg_to_sdr = false;
- auto hdr_transform =
- ColorTransform::NewColorTransform(pq_cs, dest_hdr_cs, hdr_options);
-
- ColorTransform::TriStim hdr_val = {1, 1, 1};
- hdr_transform->Transform(&hdr_val, 1);
- EXPECT_NE(sdr_val, hdr_val);
-}
-
} // namespace gfx
diff --git a/chromium/ui/gfx/delegated_ink_metadata.h b/chromium/ui/gfx/delegated_ink_metadata.h
index 3952ec973b9..c9b9c2148a9 100644
--- a/chromium/ui/gfx/delegated_ink_metadata.h
+++ b/chromium/ui/gfx/delegated_ink_metadata.h
@@ -66,7 +66,8 @@ class GFX_EXPORT DelegatedInkMetadata {
// Use mask to distinguish from DelegatedInkPoint::trace_id().
// Using microseconds provides uniqueness of trace_id per
// DelegatedInkMetadata.
- return timestamp_.since_origin().InMicroseconds() | (uint64_t{1} << 63);
+ return static_cast<uint64_t>(timestamp_.since_origin().InMicroseconds()) |
+ (uint64_t{1} << 63);
}
std::string ToString() const;
diff --git a/chromium/ui/gfx/display_color_spaces.cc b/chromium/ui/gfx/display_color_spaces.cc
index 0a3556fdf75..48e13ef042a 100644
--- a/chromium/ui/gfx/display_color_spaces.cc
+++ b/chromium/ui/gfx/display_color_spaces.cc
@@ -6,6 +6,7 @@
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
+#include "third_party/skia/include/core/SkColorSpace.h"
namespace gfx {
@@ -120,6 +121,12 @@ bool DisplayColorSpaces::SupportsHDR() const {
GetOutputColorSpace(ContentColorUsage::kHDR, true).IsHDR();
}
+SkColorSpacePrimaries DisplayColorSpaces::GetPrimaries() const {
+ // TODO(https://crbug.com/1274220): Store this directly, rather than inferring
+ // it from the raster color space.
+ return GetRasterColorSpace().GetColorSpacePrimaries();
+}
+
ColorSpace DisplayColorSpaces::GetScreenInfoColorSpace() const {
return GetOutputColorSpace(ContentColorUsage::kHDR, false /* needs_alpha */);
}
diff --git a/chromium/ui/gfx/display_color_spaces.h b/chromium/ui/gfx/display_color_spaces.h
index 7a7fbd73fae..5253f9cb82b 100644
--- a/chromium/ui/gfx/display_color_spaces.h
+++ b/chromium/ui/gfx/display_color_spaces.h
@@ -112,6 +112,9 @@ class COLOR_SPACE_EXPORT DisplayColorSpaces {
// Return true if the HDR color spaces are, indeed, HDR.
bool SupportsHDR() const;
+ // Return the primaries that define the color gamut of the display.
+ SkColorSpacePrimaries GetPrimaries() const;
+
// Output as a vector of strings. This is a helper function for printing in
// about:gpu. All output vectors will be the same length. Each entry will be
// the configuration name, its buffer format, and its color space.
diff --git a/chromium/ui/gfx/font_fallback_linux.cc b/chromium/ui/gfx/font_fallback_linux.cc
index a172655c886..5fcad63e26e 100644
--- a/chromium/ui/gfx/font_fallback_linux.cc
+++ b/chromium/ui/gfx/font_fallback_linux.cc
@@ -14,6 +14,7 @@
#include "base/files/file_path.h"
#include "base/lazy_instance.h"
#include "base/memory/ptr_util.h"
+#include "base/memory/raw_ptr.h"
#include "base/no_destructor.h"
#include "base/strings/string_piece.h"
#include "base/trace_event/trace_event.h"
@@ -176,7 +177,7 @@ class FallbackFontEntry {
FontRenderParams font_params_;
// Font code points coverage.
- FcCharSet* charset_;
+ raw_ptr<FcCharSet> charset_;
};
using FallbackFontEntries = std::vector<FallbackFontEntry>;
@@ -415,7 +416,7 @@ class CachedFont {
FallbackFontData fallback_font_;
// supported_characters_ is owned by the parent
// FcFontSet and should never be freed.
- FcCharSet* supported_characters_;
+ raw_ptr<FcCharSet> supported_characters_;
};
class CachedFontSet {
@@ -502,7 +503,7 @@ class CachedFontSet {
}
}
- FcFontSet* font_set_; // Owned by this object.
+ raw_ptr<FcFontSet> font_set_; // Owned by this object.
// CachedFont has a FcCharset* which points into the FcFontSet.
// If the FcFontSet is ever destroyed, the fallback list
// must be cleared first.
diff --git a/chromium/ui/gfx/font_render_params_linux.cc b/chromium/ui/gfx/font_render_params_linux.cc
index 42bb770bf44..81684678751 100644
--- a/chromium/ui/gfx/font_render_params_linux.cc
+++ b/chromium/ui/gfx/font_render_params_linux.cc
@@ -23,9 +23,12 @@
#include "ui/gfx/font.h"
#include "ui/gfx/font_render_params_linux.h"
#include "ui/gfx/linux/fontconfig_util.h"
-#include "ui/gfx/skia_font_delegate.h"
#include "ui/gfx/switches.h"
+#if BUILDFLAG(IS_LINUX)
+#include "ui/linux/linux_ui.h"
+#endif
+
namespace gfx {
namespace {
@@ -209,9 +212,10 @@ FontRenderParams GetFontRenderParams(const FontRenderParamsQuery& query,
// Start with the delegate's settings, but let Fontconfig have the final say.
FontRenderParams params;
- const SkiaFontDelegate* delegate = SkiaFontDelegate::instance();
- if (delegate)
- params = delegate->GetDefaultFontRenderParams();
+#if BUILDFLAG(IS_LINUX)
+ if (const auto* linux_ui = ui::LinuxUi::instance())
+ params = linux_ui->GetDefaultFontRenderParams();
+#endif
QueryFontconfig(actual_query, &params, family_out);
if (!params.antialiasing) {
// Cairo forces full hinting when antialiasing is disabled, since anything
diff --git a/chromium/ui/gfx/font_render_params_linux_unittest.cc b/chromium/ui/gfx/font_render_params_linux_unittest.cc
index bd81696b313..50e80353fdd 100644
--- a/chromium/ui/gfx/font_render_params_linux_unittest.cc
+++ b/chromium/ui/gfx/font_render_params_linux_unittest.cc
@@ -9,6 +9,7 @@
#include "base/check_op.h"
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
+#include "base/memory/raw_ptr.h"
#include "base/notreached.h"
#include "base/strings/stringprintf.h"
#include "build/build_config.h"
@@ -17,7 +18,7 @@
#include "third_party/test_fonts/fontconfig/fontconfig_util_linux.h"
#include "ui/gfx/font.h"
#include "ui/gfx/linux/fontconfig_util.h"
-#include "ui/gfx/skia_font_delegate.h"
+#include "ui/linux/fake_linux_ui.h"
namespace gfx {
@@ -35,16 +36,16 @@ const char kFontconfigMatchFontHeader[] = " <match target=\"font\">\n";
const char kFontconfigMatchPatternHeader[] = " <match target=\"pattern\">\n";
const char kFontconfigMatchFooter[] = " </match>\n";
-// Implementation of SkiaFontDelegate that returns a canned FontRenderParams
+// Implementation of LinuxUi that returns a canned FontRenderParams
// struct. This is used to isolate tests from the system's local configuration.
-class TestFontDelegate : public SkiaFontDelegate {
+class TestFontDelegate : public ui::FakeLinuxUi {
public:
- TestFontDelegate() {}
+ TestFontDelegate() = default;
TestFontDelegate(const TestFontDelegate&) = delete;
TestFontDelegate& operator=(const TestFontDelegate&) = delete;
- ~TestFontDelegate() override {}
+ ~TestFontDelegate() override = default;
void set_params(const FontRenderParams& params) { params_ = params; }
@@ -54,7 +55,7 @@ class TestFontDelegate : public SkiaFontDelegate {
void GetDefaultFontDescription(std::string* family_out,
int* size_pixels_out,
int* style_out,
- Font::Weight* weight_out,
+ int* weight_out,
FontRenderParams* params_out) const override {
NOTIMPLEMENTED();
}
@@ -110,8 +111,9 @@ std::string CreateFontconfigAliasStanza(const std::string& original_family,
class FontRenderParamsTest : public testing::Test {
public:
FontRenderParamsTest() {
- original_font_delegate_ = SkiaFontDelegate::instance();
- SkiaFontDelegate::SetInstance(&test_font_delegate_);
+ auto test_font_delegate = std::make_unique<TestFontDelegate>();
+ test_font_delegate_ = test_font_delegate.get();
+ ui::LinuxUi::SetInstance(std::move(test_font_delegate));
ClearFontRenderParamsCacheForTest();
// Create a new fontconfig configuration and load the default fonts
@@ -136,57 +138,54 @@ class FontRenderParamsTest : public testing::Test {
OverrideGlobalFontConfigForTesting(original_config_);
FcConfigDestroy(override_config_);
- SkiaFontDelegate::SetInstance(
- const_cast<SkiaFontDelegate*>(original_font_delegate_));
+ ui::LinuxUi::SetInstance(nullptr);
+ test_font_delegate_ = nullptr;
}
protected:
- const SkiaFontDelegate* original_font_delegate_;
- TestFontDelegate test_font_delegate_;
+ raw_ptr<TestFontDelegate> test_font_delegate_;
- FcConfig* override_config_ = nullptr;
- FcConfig* original_config_ = nullptr;
+ raw_ptr<FcConfig> override_config_ = nullptr;
+ raw_ptr<FcConfig> original_config_ = nullptr;
};
TEST_F(FontRenderParamsTest, Default) {
ASSERT_TRUE(LoadConfigDataIntoFontconfig(
std::string(kFontconfigFileHeader) +
- // Specify the desired defaults via a font match rather than a pattern
- // match (since this is the style generally used in
- // /etc/fonts/conf.d).
- kFontconfigMatchFontHeader +
- CreateFontconfigEditStanza("antialias", "bool", "true") +
- CreateFontconfigEditStanza("autohint", "bool", "true") +
- CreateFontconfigEditStanza("hinting", "bool", "true") +
- CreateFontconfigEditStanza("hintstyle", "const", "hintslight") +
- CreateFontconfigEditStanza("rgba", "const", "rgb") +
- kFontconfigMatchFooter +
- // Add a font match for Arimo. Since it specifies a family, it
- // shouldn't take effect when querying default settings.
- kFontconfigMatchFontHeader +
- CreateFontconfigTestStanza("family", "eq", "string", "Arimo") +
- CreateFontconfigEditStanza("antialias", "bool", "true") +
- CreateFontconfigEditStanza("autohint", "bool", "false") +
- CreateFontconfigEditStanza("hinting", "bool", "true") +
- CreateFontconfigEditStanza("hintstyle", "const", "hintfull") +
- CreateFontconfigEditStanza("rgba", "const", "none") +
- kFontconfigMatchFooter +
- // Add font matches for fonts between 10 and 20 points or pixels.
- // Since they specify sizes, they also should not affect the defaults.
- kFontconfigMatchFontHeader +
- CreateFontconfigTestStanza("size", "more_eq", "double", "10.0") +
- CreateFontconfigTestStanza("size", "less_eq", "double", "20.0") +
- CreateFontconfigEditStanza("antialias", "bool", "false") +
- kFontconfigMatchFooter + kFontconfigMatchFontHeader +
- CreateFontconfigTestStanza("pixel_size", "more_eq", "double",
- "10.0") +
- CreateFontconfigTestStanza("pixel_size", "less_eq", "double",
- "20.0") +
- CreateFontconfigEditStanza("antialias", "bool", "false") +
- kFontconfigMatchFooter + kFontconfigFileFooter));
-
- FontRenderParams params = GetFontRenderParams(
- FontRenderParamsQuery(), NULL);
+ // Specify the desired defaults via a font match rather than a pattern
+ // match (since this is the style generally used in
+ // /etc/fonts/conf.d).
+ kFontconfigMatchFontHeader +
+ CreateFontconfigEditStanza("antialias", "bool", "true") +
+ CreateFontconfigEditStanza("autohint", "bool", "true") +
+ CreateFontconfigEditStanza("hinting", "bool", "true") +
+ CreateFontconfigEditStanza("hintstyle", "const", "hintslight") +
+ CreateFontconfigEditStanza("rgba", "const", "rgb") +
+ kFontconfigMatchFooter +
+ // Add a font match for Arimo. Since it specifies a family, it
+ // shouldn't take effect when querying default settings.
+ kFontconfigMatchFontHeader +
+ CreateFontconfigTestStanza("family", "eq", "string", "Arimo") +
+ CreateFontconfigEditStanza("antialias", "bool", "true") +
+ CreateFontconfigEditStanza("autohint", "bool", "false") +
+ CreateFontconfigEditStanza("hinting", "bool", "true") +
+ CreateFontconfigEditStanza("hintstyle", "const", "hintfull") +
+ CreateFontconfigEditStanza("rgba", "const", "none") +
+ kFontconfigMatchFooter +
+ // Add font matches for fonts between 10 and 20 points or pixels.
+ // Since they specify sizes, they also should not affect the defaults.
+ kFontconfigMatchFontHeader +
+ CreateFontconfigTestStanza("size", "more_eq", "double", "10.0") +
+ CreateFontconfigTestStanza("size", "less_eq", "double", "20.0") +
+ CreateFontconfigEditStanza("antialias", "bool", "false") +
+ kFontconfigMatchFooter + kFontconfigMatchFontHeader +
+ CreateFontconfigTestStanza("pixel_size", "more_eq", "double", "10.0") +
+ CreateFontconfigTestStanza("pixel_size", "less_eq", "double", "20.0") +
+ CreateFontconfigEditStanza("antialias", "bool", "false") +
+ kFontconfigMatchFooter + kFontconfigFileFooter));
+
+ FontRenderParams params =
+ GetFontRenderParams(FontRenderParamsQuery(), nullptr);
EXPECT_TRUE(params.antialiasing);
EXPECT_TRUE(params.autohinter);
EXPECT_TRUE(params.use_bitmaps);
@@ -199,31 +198,31 @@ TEST_F(FontRenderParamsTest, Default) {
TEST_F(FontRenderParamsTest, Size) {
ASSERT_TRUE(LoadConfigDataIntoFontconfig(
std::string(kFontconfigFileHeader) + kFontconfigMatchPatternHeader +
- CreateFontconfigEditStanza("antialias", "bool", "true") +
- CreateFontconfigEditStanza("hinting", "bool", "true") +
- CreateFontconfigEditStanza("hintstyle", "const", "hintfull") +
- CreateFontconfigEditStanza("rgba", "const", "none") +
- kFontconfigMatchFooter + kFontconfigMatchPatternHeader +
- CreateFontconfigTestStanza("pixelsize", "less_eq", "double", "10") +
- CreateFontconfigEditStanza("antialias", "bool", "false") +
- kFontconfigMatchFooter + kFontconfigMatchPatternHeader +
- CreateFontconfigTestStanza("size", "more_eq", "double", "20") +
- CreateFontconfigEditStanza("hintstyle", "const", "hintslight") +
- CreateFontconfigEditStanza("rgba", "const", "rgb") +
- kFontconfigMatchFooter + kFontconfigFileFooter));
+ CreateFontconfigEditStanza("antialias", "bool", "true") +
+ CreateFontconfigEditStanza("hinting", "bool", "true") +
+ CreateFontconfigEditStanza("hintstyle", "const", "hintfull") +
+ CreateFontconfigEditStanza("rgba", "const", "none") +
+ kFontconfigMatchFooter + kFontconfigMatchPatternHeader +
+ CreateFontconfigTestStanza("pixelsize", "less_eq", "double", "10") +
+ CreateFontconfigEditStanza("antialias", "bool", "false") +
+ kFontconfigMatchFooter + kFontconfigMatchPatternHeader +
+ CreateFontconfigTestStanza("size", "more_eq", "double", "20") +
+ CreateFontconfigEditStanza("hintstyle", "const", "hintslight") +
+ CreateFontconfigEditStanza("rgba", "const", "rgb") +
+ kFontconfigMatchFooter + kFontconfigFileFooter));
// The defaults should be used when the supplied size isn't matched by the
// second or third blocks.
FontRenderParamsQuery query;
query.pixel_size = 12;
- FontRenderParams params = GetFontRenderParams(query, NULL);
+ FontRenderParams params = GetFontRenderParams(query, nullptr);
EXPECT_TRUE(params.antialiasing);
EXPECT_EQ(FontRenderParams::HINTING_FULL, params.hinting);
EXPECT_EQ(FontRenderParams::SUBPIXEL_RENDERING_NONE,
params.subpixel_rendering);
query.pixel_size = 10;
- params = GetFontRenderParams(query, NULL);
+ params = GetFontRenderParams(query, nullptr);
EXPECT_FALSE(params.antialiasing);
EXPECT_EQ(FontRenderParams::HINTING_FULL, params.hinting);
EXPECT_EQ(FontRenderParams::SUBPIXEL_RENDERING_NONE,
@@ -231,7 +230,7 @@ TEST_F(FontRenderParamsTest, Size) {
query.pixel_size = 0;
query.point_size = 20;
- params = GetFontRenderParams(query, NULL);
+ params = GetFontRenderParams(query, nullptr);
EXPECT_TRUE(params.antialiasing);
EXPECT_EQ(FontRenderParams::HINTING_SLIGHT, params.hinting);
EXPECT_EQ(FontRenderParams::SUBPIXEL_RENDERING_RGB,
@@ -243,41 +242,41 @@ TEST_F(FontRenderParamsTest, Style) {
// hinting for italic text.
ASSERT_TRUE(LoadConfigDataIntoFontconfig(
std::string(kFontconfigFileHeader) + kFontconfigMatchPatternHeader +
- CreateFontconfigEditStanza("antialias", "bool", "true") +
- CreateFontconfigEditStanza("hinting", "bool", "true") +
- CreateFontconfigEditStanza("hintstyle", "const", "hintslight") +
- CreateFontconfigEditStanza("rgba", "const", "rgb") +
- kFontconfigMatchFooter + kFontconfigMatchPatternHeader +
- CreateFontconfigTestStanza("weight", "eq", "const", "bold") +
- CreateFontconfigEditStanza("rgba", "const", "none") +
- kFontconfigMatchFooter + kFontconfigMatchPatternHeader +
- CreateFontconfigTestStanza("slant", "eq", "const", "italic") +
- CreateFontconfigEditStanza("hinting", "bool", "false") +
- kFontconfigMatchFooter + kFontconfigFileFooter));
+ CreateFontconfigEditStanza("antialias", "bool", "true") +
+ CreateFontconfigEditStanza("hinting", "bool", "true") +
+ CreateFontconfigEditStanza("hintstyle", "const", "hintslight") +
+ CreateFontconfigEditStanza("rgba", "const", "rgb") +
+ kFontconfigMatchFooter + kFontconfigMatchPatternHeader +
+ CreateFontconfigTestStanza("weight", "eq", "const", "bold") +
+ CreateFontconfigEditStanza("rgba", "const", "none") +
+ kFontconfigMatchFooter + kFontconfigMatchPatternHeader +
+ CreateFontconfigTestStanza("slant", "eq", "const", "italic") +
+ CreateFontconfigEditStanza("hinting", "bool", "false") +
+ kFontconfigMatchFooter + kFontconfigFileFooter));
FontRenderParamsQuery query;
query.style = Font::NORMAL;
- FontRenderParams params = GetFontRenderParams(query, NULL);
+ FontRenderParams params = GetFontRenderParams(query, nullptr);
EXPECT_EQ(FontRenderParams::HINTING_SLIGHT, params.hinting);
EXPECT_EQ(FontRenderParams::SUBPIXEL_RENDERING_RGB,
params.subpixel_rendering);
query.weight = Font::Weight::BOLD;
- params = GetFontRenderParams(query, NULL);
+ params = GetFontRenderParams(query, nullptr);
EXPECT_EQ(FontRenderParams::HINTING_SLIGHT, params.hinting);
EXPECT_EQ(FontRenderParams::SUBPIXEL_RENDERING_NONE,
params.subpixel_rendering);
query.weight = Font::Weight::NORMAL;
query.style = Font::ITALIC;
- params = GetFontRenderParams(query, NULL);
+ params = GetFontRenderParams(query, nullptr);
EXPECT_EQ(FontRenderParams::HINTING_NONE, params.hinting);
EXPECT_EQ(FontRenderParams::SUBPIXEL_RENDERING_RGB,
params.subpixel_rendering);
query.weight = Font::Weight::BOLD;
query.style = Font::ITALIC;
- params = GetFontRenderParams(query, NULL);
+ params = GetFontRenderParams(query, nullptr);
EXPECT_EQ(FontRenderParams::HINTING_NONE, params.hinting);
EXPECT_EQ(FontRenderParams::SUBPIXEL_RENDERING_NONE,
params.subpixel_rendering);
@@ -287,15 +286,15 @@ TEST_F(FontRenderParamsTest, Scalable) {
// Load a config that only enables antialiasing for scalable fonts.
ASSERT_TRUE(LoadConfigDataIntoFontconfig(
std::string(kFontconfigFileHeader) + kFontconfigMatchPatternHeader +
- CreateFontconfigEditStanza("antialias", "bool", "false") +
- kFontconfigMatchFooter + kFontconfigMatchPatternHeader +
- CreateFontconfigTestStanza("scalable", "eq", "bool", "true") +
- CreateFontconfigEditStanza("antialias", "bool", "true") +
- kFontconfigMatchFooter + kFontconfigFileFooter));
+ CreateFontconfigEditStanza("antialias", "bool", "false") +
+ kFontconfigMatchFooter + kFontconfigMatchPatternHeader +
+ CreateFontconfigTestStanza("scalable", "eq", "bool", "true") +
+ CreateFontconfigEditStanza("antialias", "bool", "true") +
+ kFontconfigMatchFooter + kFontconfigFileFooter));
// Check that we specifically ask how scalable fonts should be rendered.
- FontRenderParams params = GetFontRenderParams(
- FontRenderParamsQuery(), NULL);
+ FontRenderParams params =
+ GetFontRenderParams(FontRenderParamsQuery(), nullptr);
EXPECT_TRUE(params.antialiasing);
}
@@ -303,18 +302,18 @@ TEST_F(FontRenderParamsTest, UseBitmaps) {
// Load a config that enables embedded bitmaps for fonts <= 10 pixels.
ASSERT_TRUE(LoadConfigDataIntoFontconfig(
std::string(kFontconfigFileHeader) + kFontconfigMatchPatternHeader +
- CreateFontconfigEditStanza("embeddedbitmap", "bool", "false") +
- kFontconfigMatchFooter + kFontconfigMatchPatternHeader +
- CreateFontconfigTestStanza("pixelsize", "less_eq", "double", "10") +
- CreateFontconfigEditStanza("embeddedbitmap", "bool", "true") +
- kFontconfigMatchFooter + kFontconfigFileFooter));
+ CreateFontconfigEditStanza("embeddedbitmap", "bool", "false") +
+ kFontconfigMatchFooter + kFontconfigMatchPatternHeader +
+ CreateFontconfigTestStanza("pixelsize", "less_eq", "double", "10") +
+ CreateFontconfigEditStanza("embeddedbitmap", "bool", "true") +
+ kFontconfigMatchFooter + kFontconfigFileFooter));
FontRenderParamsQuery query;
- FontRenderParams params = GetFontRenderParams(query, NULL);
+ FontRenderParams params = GetFontRenderParams(query, nullptr);
EXPECT_FALSE(params.use_bitmaps);
query.pixel_size = 5;
- params = GetFontRenderParams(query, NULL);
+ params = GetFontRenderParams(query, nullptr);
EXPECT_TRUE(params.use_bitmaps);
}
@@ -323,16 +322,16 @@ TEST_F(FontRenderParamsTest, ForceFullHintingWhenAntialiasingIsDisabled) {
// subpixel rendering.
ASSERT_TRUE(LoadConfigDataIntoFontconfig(
std::string(kFontconfigFileHeader) + kFontconfigMatchPatternHeader +
- CreateFontconfigEditStanza("antialias", "bool", "false") +
- CreateFontconfigEditStanza("hinting", "bool", "false") +
- CreateFontconfigEditStanza("hintstyle", "const", "hintnone") +
- CreateFontconfigEditStanza("rgba", "const", "rgb") +
- kFontconfigMatchFooter + kFontconfigFileFooter));
+ CreateFontconfigEditStanza("antialias", "bool", "false") +
+ CreateFontconfigEditStanza("hinting", "bool", "false") +
+ CreateFontconfigEditStanza("hintstyle", "const", "hintnone") +
+ CreateFontconfigEditStanza("rgba", "const", "rgb") +
+ kFontconfigMatchFooter + kFontconfigFileFooter));
// Full hinting should be forced. See the comment in GetFontRenderParams() for
// more information.
- FontRenderParams params = GetFontRenderParams(
- FontRenderParamsQuery(), NULL);
+ FontRenderParams params =
+ GetFontRenderParams(FontRenderParamsQuery(), nullptr);
EXPECT_FALSE(params.antialiasing);
EXPECT_EQ(FontRenderParams::HINTING_FULL, params.hinting);
EXPECT_EQ(FontRenderParams::SUBPIXEL_RENDERING_NONE,
@@ -343,7 +342,7 @@ TEST_F(FontRenderParamsTest, ForceFullHintingWhenAntialiasingIsDisabled) {
TEST_F(FontRenderParamsTest, ForceSubpixelPositioning) {
{
FontRenderParams params =
- GetFontRenderParams(FontRenderParamsQuery(), NULL);
+ GetFontRenderParams(FontRenderParamsQuery(), nullptr);
EXPECT_TRUE(params.antialiasing);
EXPECT_FALSE(params.subpixel_positioning);
SetFontRenderParamsDeviceScaleFactor(1.0f);
@@ -353,7 +352,7 @@ TEST_F(FontRenderParamsTest, ForceSubpixelPositioning) {
// Subpixel positioning should be forced.
{
FontRenderParams params =
- GetFontRenderParams(FontRenderParamsQuery(), NULL);
+ GetFontRenderParams(FontRenderParamsQuery(), nullptr);
EXPECT_TRUE(params.antialiasing);
EXPECT_TRUE(params.subpixel_positioning);
SetFontRenderParamsDeviceScaleFactor(1.0f);
@@ -376,22 +375,21 @@ TEST_F(FontRenderParamsTest, ForceSubpixelPositioning) {
}
TEST_F(FontRenderParamsTest, OnlySetConfiguredValues) {
- // Configure the SkiaFontDelegate (which queries GtkSettings on desktop
- // Linux) to request subpixel rendering.
+ // Configure the LinuxUi to request subpixel rendering.
FontRenderParams system_params;
system_params.subpixel_rendering = FontRenderParams::SUBPIXEL_RENDERING_RGB;
- test_font_delegate_.set_params(system_params);
+ test_font_delegate_->set_params(system_params);
// Load a Fontconfig config that enables antialiasing but doesn't say anything
// about subpixel rendering.
ASSERT_TRUE(LoadConfigDataIntoFontconfig(
std::string(kFontconfigFileHeader) + kFontconfigMatchPatternHeader +
- CreateFontconfigEditStanza("antialias", "bool", "true") +
- kFontconfigMatchFooter + kFontconfigFileFooter));
+ CreateFontconfigEditStanza("antialias", "bool", "true") +
+ kFontconfigMatchFooter + kFontconfigFileFooter));
// The subpixel rendering setting from the delegate should make it through.
- FontRenderParams params = GetFontRenderParams(
- FontRenderParamsQuery(), NULL);
+ FontRenderParams params =
+ GetFontRenderParams(FontRenderParamsQuery(), nullptr);
EXPECT_EQ(system_params.subpixel_rendering, params.subpixel_rendering);
}
@@ -404,7 +402,7 @@ TEST_F(FontRenderParamsTest, NoFontconfigMatch) {
system_params.antialiasing = true;
system_params.hinting = FontRenderParams::HINTING_MEDIUM;
system_params.subpixel_rendering = FontRenderParams::SUBPIXEL_RENDERING_RGB;
- test_font_delegate_.set_params(system_params);
+ test_font_delegate_->set_params(system_params);
FontRenderParamsQuery query;
query.families.push_back("Arimo");
@@ -439,11 +437,11 @@ TEST_F(FontRenderParamsTest, SubstituteFamily) {
// Configure Fontconfig to use Tinos for both Helvetica and Arimo.
ASSERT_TRUE(LoadConfigDataIntoFontconfig(
std::string(kFontconfigFileHeader) +
- CreateFontconfigAliasStanza("Helvetica", "Tinos") +
- kFontconfigMatchPatternHeader +
- CreateFontconfigTestStanza("family", "eq", "string", "Arimo") +
- CreateFontconfigEditStanza("family", "string", "Tinos") +
- kFontconfigMatchFooter + kFontconfigFileFooter));
+ CreateFontconfigAliasStanza("Helvetica", "Tinos") +
+ kFontconfigMatchPatternHeader +
+ CreateFontconfigTestStanza("family", "eq", "string", "Arimo") +
+ CreateFontconfigEditStanza("family", "string", "Tinos") +
+ kFontconfigMatchFooter + kFontconfigFileFooter));
FontRenderParamsQuery query;
query.families.push_back("Helvetica");
diff --git a/chromium/ui/gfx/geometry/linear_gradient.cc b/chromium/ui/gfx/geometry/linear_gradient.cc
index ea769b35db8..ef7ca2606c7 100644
--- a/chromium/ui/gfx/geometry/linear_gradient.cc
+++ b/chromium/ui/gfx/geometry/linear_gradient.cc
@@ -28,16 +28,16 @@ LinearGradient::LinearGradient(int16_t angle) : angle_(angle) {}
LinearGradient::LinearGradient(const LinearGradient& copy) = default;
-void LinearGradient::AddStep(float percent, uint8_t alpha) {
+void LinearGradient::AddStep(float fraction, uint8_t alpha) {
DCHECK_LT(step_count_, kMaxStepSize);
- DCHECK_GE(percent, 0);
- DCHECK_LE(percent, 100);
- // make sure the step's percent is monotonically increasing.
- DCHECK(step_count_ ? steps_[step_count_ - 1].percent < percent : true)
+ DCHECK_GE(fraction, 0);
+ DCHECK_LE(fraction, 1);
+ // make sure the step's fraction is monotonically increasing.
+ DCHECK(step_count_ ? steps_[step_count_ - 1].fraction < fraction : true)
<< base::StringPrintf("prev[%zu]=%f, next[%zu]=%f", step_count_ - 1,
- steps_[step_count_ - 1].percent, step_count_,
- steps_[step_count_].percent);
- steps_[step_count_].percent = percent;
+ steps_[step_count_ - 1].fraction, step_count_,
+ fraction);
+ steps_[step_count_].fraction = fraction;
steps_[step_count_++].alpha = alpha;
}
@@ -45,10 +45,13 @@ void LinearGradient::ReverseSteps() {
std::reverse(steps_.begin(), steps_.end());
std::rotate(steps_.begin(), steps_.end() - step_count_, steps_.end());
for (size_t i = 0; i < step_count_; i++)
- steps_[i].percent = 100.f - steps_[i].percent;
+ steps_[i].fraction = 1.f - steps_[i].fraction;
}
void LinearGradient::Transform(const gfx::Transform& transform) {
+ if (transform.IsIdentity())
+ return;
+
gfx::PointF origin, end;
float radian = gfx::DegToRad(static_cast<float>(angle_));
float y = -sin(radian);
@@ -57,19 +60,17 @@ void LinearGradient::Transform(const gfx::Transform& transform) {
transform.TransformPoint(&origin);
transform.TransformPoint(&end);
gfx::Vector2dF diff = end - origin;
- int16_t new_angle =
- -static_cast<int16_t>(gfx::RadToDeg(atan2(diff.y(), diff.x())));
- angle_ = new_angle;
+ float new_angle = gfx::RadToDeg(atan2(diff.y(), diff.x()));
+ angle_ = -static_cast<int16_t>(std::round(new_angle));
}
std::string LinearGradient::ToString() const {
std::string result = base::StringPrintf(
- "LinearGradient{angle=%u, step_count=%zu [", angle_, step_count_);
- for (size_t i = 0; i < step_count_; i++) {
+ "LinearGradient{angle=%d, step_count=%zu [", angle_, step_count_);
+ for (size_t i = 0; i < step_count_; ++i) {
if (i)
result += " - ";
- result += base::NumberToString(steps_[i].percent) + ":" +
- base::NumberToString(static_cast<int>(steps_[i].alpha));
+ result += base::StringPrintf("%f:%u", steps_[i].fraction, steps_[i].alpha);
}
return result + "]}";
}
diff --git a/chromium/ui/gfx/geometry/linear_gradient.h b/chromium/ui/gfx/geometry/linear_gradient.h
index 1ad025fec13..aa574512d37 100644
--- a/chromium/ui/gfx/geometry/linear_gradient.h
+++ b/chromium/ui/gfx/geometry/linear_gradient.h
@@ -26,9 +26,8 @@ class Transform;
class GEOMETRY_SKIA_EXPORT LinearGradient {
public:
struct Step {
- constexpr Step() = default;
- // Percent that defines a position in diagonal, from 0 to 100.
- float percent = 0;
+ // Fraction that defines a position in diagonal, from 0 to 1.
+ float fraction = 0;
// Alpha, from 0 to 255.
uint8_t alpha = 0;
};
@@ -45,7 +44,7 @@ class GEOMETRY_SKIA_EXPORT LinearGradient {
bool IsEmpty() const { return !step_count_; }
// Add a new step. Adding more than 6 results in DCHECK or ignored.
- void AddStep(float percent, uint8_t alpha);
+ void AddStep(float fraction, uint8_t alpha);
// Get step information.
const StepArray& steps() const { return steps_; }
@@ -54,9 +53,9 @@ class GEOMETRY_SKIA_EXPORT LinearGradient {
// Gets/Sets an angle (in degrees).
int16_t angle() const { return angle_; }
- void set_angle(int16_t degree) { angle_ = degree % 360; }
+ void set_angle(int16_t degree) { angle_ = degree; }
- // Reverse the step 180 degree.
+ // Reverse the steps.
void ReverseSteps();
// Transform the angle.
@@ -73,7 +72,7 @@ class GEOMETRY_SKIA_EXPORT LinearGradient {
inline bool operator==(const LinearGradient::Step& lhs,
const LinearGradient::Step& rhs) {
- return lhs.percent == rhs.percent && lhs.alpha == rhs.alpha;
+ return lhs.fraction == rhs.fraction && lhs.alpha == rhs.alpha;
}
inline bool operator==(const LinearGradient& lhs, const LinearGradient& rhs) {
diff --git a/chromium/ui/gfx/geometry/linear_gradient_unittest.cc b/chromium/ui/gfx/geometry/linear_gradient_unittest.cc
index 79c6ffb6a4b..bf29ee52ec4 100644
--- a/chromium/ui/gfx/geometry/linear_gradient_unittest.cc
+++ b/chromium/ui/gfx/geometry/linear_gradient_unittest.cc
@@ -15,31 +15,31 @@ TEST(LinearGradientTest, Basic) {
LinearGradient gradient(45);
EXPECT_TRUE(gradient.IsEmpty());
- gradient.AddStep(10, 0);
- gradient.AddStep(50, 50);
- gradient.AddStep(80, 1);
+ gradient.AddStep(.1, 0);
+ gradient.AddStep(.5, 50);
+ gradient.AddStep(.8, 1);
EXPECT_FALSE(gradient.IsEmpty());
EXPECT_EQ(45, gradient.angle());
EXPECT_EQ(3u, gradient.step_count());
- EXPECT_EQ(gradient.steps()[0].percent, 10);
+ EXPECT_FLOAT_EQ(gradient.steps()[0].fraction, .1);
EXPECT_EQ(gradient.steps()[0].alpha, 0);
- EXPECT_EQ(gradient.steps()[1].percent, 50);
+ EXPECT_FLOAT_EQ(gradient.steps()[1].fraction, .5);
EXPECT_EQ(gradient.steps()[1].alpha, 50);
- EXPECT_EQ(gradient.steps()[2].percent, 80);
+ EXPECT_FLOAT_EQ(gradient.steps()[2].fraction, .8);
EXPECT_EQ(gradient.steps()[2].alpha, 1);
LinearGradient gradient2(90);
- gradient2.AddStep(10, 0);
- gradient2.AddStep(50, 50);
- gradient2.AddStep(80, 1);
+ gradient2.AddStep(.1, 0);
+ gradient2.AddStep(.5, 50);
+ gradient2.AddStep(.8, 1);
EXPECT_NE(gradient, gradient2);
gradient2.set_angle(45);
EXPECT_EQ(gradient, gradient2);
- gradient2.AddStep(90, 0);
+ gradient2.AddStep(.9, 0);
EXPECT_NE(gradient, gradient2);
}
@@ -48,20 +48,20 @@ TEST(LinearGradientTest, Reverse) {
// Make sure reversing an empty LinearGradient doesn't cause an issue.
gradient.ReverseSteps();
- gradient.AddStep(10, 0);
- gradient.AddStep(50, 50);
- gradient.AddStep(80, 1);
+ gradient.AddStep(.1, 0);
+ gradient.AddStep(.5, 50);
+ gradient.AddStep(.8, 1);
gradient.ReverseSteps();
EXPECT_EQ(45, gradient.angle());
EXPECT_EQ(3u, gradient.step_count());
- EXPECT_EQ(gradient.steps()[0].percent, 20);
+ EXPECT_FLOAT_EQ(gradient.steps()[0].fraction, .2);
EXPECT_EQ(gradient.steps()[0].alpha, 1);
- EXPECT_EQ(gradient.steps()[1].percent, 50);
+ EXPECT_FLOAT_EQ(gradient.steps()[1].fraction, .5);
EXPECT_EQ(gradient.steps()[1].alpha, 50);
- EXPECT_EQ(gradient.steps()[2].percent, 90);
+ EXPECT_FLOAT_EQ(gradient.steps()[2].fraction, .9);
EXPECT_EQ(gradient.steps()[2].alpha, 0);
}
diff --git a/chromium/ui/gfx/geometry/mask_filter_info.cc b/chromium/ui/gfx/geometry/mask_filter_info.cc
index 77621089d25..dd56b66ae68 100644
--- a/chromium/ui/gfx/geometry/mask_filter_info.cc
+++ b/chromium/ui/gfx/geometry/mask_filter_info.cc
@@ -17,15 +17,19 @@ bool MaskFilterInfo::Transform(const gfx::Transform& transform) {
if (!transform.TransformRRectF(&rounded_corner_bounds_))
return false;
- if (!gradient_mask_.IsEmpty())
- gradient_mask_.Transform(transform);
+ if (gradient_mask_ && !gradient_mask_->IsEmpty())
+ gradient_mask_->Transform(transform);
return true;
}
std::string MaskFilterInfo::ToString() const {
- return "MaskFilterInfo{" + rounded_corner_bounds_.ToString() +
- ", gradient_mask=" + gradient_mask_.ToString() + "}";
+ std::string result = "MaskFilterInfo{" + rounded_corner_bounds_.ToString();
+
+ if (gradient_mask_)
+ result += ", gradient_mask=" + gradient_mask_->ToString() + "}";
+
+ return result;
}
} // namespace gfx
diff --git a/chromium/ui/gfx/geometry/mask_filter_info.h b/chromium/ui/gfx/geometry/mask_filter_info.h
index 6c33e8c40ba..22cc295cd24 100644
--- a/chromium/ui/gfx/geometry/mask_filter_info.h
+++ b/chromium/ui/gfx/geometry/mask_filter_info.h
@@ -5,6 +5,7 @@
#ifndef UI_GFX_GEOMETRY_MASK_FILTER_INFO_H_
#define UI_GFX_GEOMETRY_MASK_FILTER_INFO_H_
+#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/geometry/geometry_skia_export.h"
#include "ui/gfx/geometry/linear_gradient.h"
#include "ui/gfx/geometry/rect_f.h"
@@ -41,11 +42,16 @@ class GEOMETRY_SKIA_EXPORT MaskFilterInfo {
rounded_corner_bounds_.GetType() != RRectF::Type::kRect;
}
- const gfx::LinearGradient& gradient_mask() const { return gradient_mask_; }
+ const absl::optional<gfx::LinearGradient>& gradient_mask() const {
+ return gradient_mask_;
+ }
// True if this contains an effective gradient mask (requires filter bounds).
bool HasGradientMask() const {
- return !rounded_corner_bounds_.IsEmpty() && !gradient_mask_.IsEmpty();
+ if (rounded_corner_bounds_.IsEmpty())
+ return false;
+
+ return gradient_mask_ && !gradient_mask_->IsEmpty();
}
// True if this contains no effective mask information.
@@ -63,11 +69,12 @@ class GEOMETRY_SKIA_EXPORT MaskFilterInfo {
RRectF rounded_corner_bounds_;
// Shader based linear gradient mask to be applied to a layer.
- gfx::LinearGradient gradient_mask_ = gfx::LinearGradient::GetEmpty();
+ absl::optional<gfx::LinearGradient> gradient_mask_;
};
inline bool operator==(const MaskFilterInfo& lhs, const MaskFilterInfo& rhs) {
- return lhs.rounded_corner_bounds() == rhs.rounded_corner_bounds();
+ return (lhs.rounded_corner_bounds() == rhs.rounded_corner_bounds()) &&
+ (lhs.gradient_mask() == rhs.gradient_mask());
}
inline bool operator!=(const MaskFilterInfo& lhs, const MaskFilterInfo& rhs) {
diff --git a/chromium/ui/gfx/geometry/matrix44.cc b/chromium/ui/gfx/geometry/matrix44.cc
index 000ce8f6d40..a0f04f3d3f5 100644
--- a/chromium/ui/gfx/geometry/matrix44.cc
+++ b/chromium/ui/gfx/geometry/matrix44.cc
@@ -727,10 +727,6 @@ typedef void (*Map2Procf)(const SkScalar mat[][4],
const float src2[],
int count,
float dst4[]);
-typedef void (*Map2Procd)(const SkScalar mat[][4],
- const double src2[],
- int count,
- double dst4[]);
static void map2_if(const SkScalar mat[][4],
const float* SK_RESTRICT src2,
@@ -746,20 +742,6 @@ static void map2_if(const SkScalar mat[][4],
}
}
-static void map2_id(const SkScalar mat[][4],
- const double* SK_RESTRICT src2,
- int count,
- double* SK_RESTRICT dst4) {
- for (int i = 0; i < count; ++i) {
- dst4[0] = src2[0];
- dst4[1] = src2[1];
- dst4[2] = 0;
- dst4[3] = 1;
- src2 += 2;
- dst4 += 4;
- }
-}
-
static void map2_tf(const SkScalar mat[][4],
const float* SK_RESTRICT src2,
int count,
@@ -777,20 +759,6 @@ static void map2_tf(const SkScalar mat[][4],
}
}
-static void map2_td(const SkScalar mat[][4],
- const double* SK_RESTRICT src2,
- int count,
- double* SK_RESTRICT dst4) {
- for (int n = 0; n < count; ++n) {
- dst4[0] = src2[0] + mat[3][0];
- dst4[1] = src2[1] + mat[3][1];
- dst4[2] = mat[3][2];
- dst4[3] = 1;
- src2 += 2;
- dst4 += 4;
- }
-}
-
static void map2_sf(const SkScalar mat[][4],
const float* SK_RESTRICT src2,
int count,
@@ -806,20 +774,6 @@ static void map2_sf(const SkScalar mat[][4],
}
}
-static void map2_sd(const SkScalar mat[][4],
- const double* SK_RESTRICT src2,
- int count,
- double* SK_RESTRICT dst4) {
- for (int n = 0; n < count; ++n) {
- dst4[0] = mat[0][0] * src2[0] + mat[3][0];
- dst4[1] = mat[1][1] * src2[1] + mat[3][1];
- dst4[2] = mat[3][2];
- dst4[3] = 1;
- src2 += 2;
- dst4 += 4;
- }
-}
-
static void map2_af(const SkScalar mat[][4],
const float* SK_RESTRICT src2,
int count,
@@ -840,22 +794,6 @@ static void map2_af(const SkScalar mat[][4],
}
}
-static void map2_ad(const SkScalar mat[][4],
- const double* SK_RESTRICT src2,
- int count,
- double* SK_RESTRICT dst4) {
- for (int n = 0; n < count; ++n) {
- double sx = src2[0];
- double sy = src2[1];
- dst4[0] = mat[0][0] * sx + mat[1][0] * sy + mat[3][0];
- dst4[1] = mat[0][1] * sx + mat[1][1] * sy + mat[3][1];
- dst4[2] = mat[0][2] * sx + mat[1][2] * sy + mat[3][2];
- dst4[3] = 1;
- src2 += 2;
- dst4 += 4;
- }
-}
-
static void map2_pf(const SkScalar mat[][4],
const float* SK_RESTRICT src2,
int count,
@@ -873,21 +811,6 @@ static void map2_pf(const SkScalar mat[][4],
}
}
-static void map2_pd(const SkScalar mat[][4],
- const double* SK_RESTRICT src2,
- int count,
- double* SK_RESTRICT dst4) {
- for (int n = 0; n < count; ++n) {
- double sx = src2[0];
- double sy = src2[1];
- for (int i = 0; i < 4; i++) {
- dst4[i] = mat[0][i] * sx + mat[1][i] * sy + mat[3][i];
- }
- src2 += 2;
- dst4 += 4;
- }
-}
-
void Matrix44::map2(const float src2[], int count, float dst4[]) const {
static const Map2Procf gProc[] = {map2_if, map2_tf, map2_sf, map2_sf,
map2_af, map2_af, map2_af, map2_af};
@@ -897,55 +820,6 @@ void Matrix44::map2(const float src2[], int count, float dst4[]) const {
proc(fMat, src2, count, dst4);
}
-void Matrix44::map2(const double src2[], int count, double dst4[]) const {
- static const Map2Procd gProc[] = {map2_id, map2_td, map2_sd, map2_sd,
- map2_ad, map2_ad, map2_ad, map2_ad};
-
- TypeMask mask = this->getType();
- Map2Procd proc = (mask & kPerspective_Mask) ? map2_pd : gProc[mask];
- proc(fMat, src2, count, dst4);
-}
-
-bool Matrix44::preserves2dAxisAlignment(SkScalar epsilon) const {
- // Can't check (mask & kPerspective_Mask) because Z isn't relevant here.
- if (0 != perspX() || 0 != perspY())
- return false;
-
- // A matrix with two non-zeroish values in any of the upper right
- // rows or columns will skew. If only one value in each row or
- // column is non-zeroish, we get a scale plus perhaps a 90-degree
- // rotation.
- int col0 = 0;
- int col1 = 0;
- int row0 = 0;
- int row1 = 0;
-
- // Must test against epsilon, not 0, because we can get values
- // around 6e-17 in the matrix that "should" be 0.
-
- if (SkScalarAbs(fMat[0][0]) > epsilon) {
- col0++;
- row0++;
- }
- if (SkScalarAbs(fMat[0][1]) > epsilon) {
- col1++;
- row0++;
- }
- if (SkScalarAbs(fMat[1][0]) > epsilon) {
- col0++;
- row1++;
- }
- if (SkScalarAbs(fMat[1][1]) > epsilon) {
- col1++;
- row1++;
- }
- if (col0 > 1 || col1 > 1 || row0 > 1 || row1 > 1) {
- return false;
- }
-
- return true;
-}
-
///////////////////////////////////////////////////////////////////////////////
Matrix44::Matrix44(const SkMatrix& src) {
diff --git a/chromium/ui/gfx/geometry/matrix44.h b/chromium/ui/gfx/geometry/matrix44.h
index 223031d51e9..21885f9ba00 100644
--- a/chromium/ui/gfx/geometry/matrix44.h
+++ b/chromium/ui/gfx/geometry/matrix44.h
@@ -18,40 +18,6 @@ struct CATransform3D;
namespace gfx {
-struct Vector4 {
- SkScalar fData[4];
-
- Vector4() { this->set(0, 0, 0, 1); }
- Vector4(const Vector4& src) { memcpy(fData, src.fData, sizeof(fData)); }
- Vector4(SkScalar x, SkScalar y, SkScalar z, SkScalar w = SK_Scalar1) {
- fData[0] = x;
- fData[1] = y;
- fData[2] = z;
- fData[3] = w;
- }
-
- Vector4& operator=(const Vector4& src) {
- memcpy(fData, src.fData, sizeof(fData));
- return *this;
- }
-
- bool operator==(const Vector4& v) const {
- return fData[0] == v.fData[0] && fData[1] == v.fData[1] &&
- fData[2] == v.fData[2] && fData[3] == v.fData[3];
- }
- bool operator!=(const Vector4& v) const { return !(*this == v); }
- bool equals(SkScalar x, SkScalar y, SkScalar z, SkScalar w = SK_Scalar1) {
- return fData[0] == x && fData[1] == y && fData[2] == z && fData[3] == w;
- }
-
- void set(SkScalar x, SkScalar y, SkScalar z, SkScalar w = SK_Scalar1) {
- fData[0] = x;
- fData[1] = y;
- fData[2] = z;
- fData[3] = w;
- }
-};
-
// This is the underlying data structure of Transform. Don't use this type
// directly. The public methods can be called through Transform::matrix().
class GEOMETRY_SKIA_EXPORT Matrix44 {
@@ -217,16 +183,6 @@ class GEOMETRY_SKIA_EXPORT Matrix44 {
Matrix44& preScale(SkScalar sx, SkScalar sy, SkScalar sz);
Matrix44& postScale(SkScalar sx, SkScalar sy, SkScalar sz);
- inline Matrix44& setScale(SkScalar scale) {
- return this->setScale(scale, scale, scale);
- }
- inline Matrix44& preScale(SkScalar scale) {
- return this->preScale(scale, scale, scale);
- }
- inline Matrix44& postScale(SkScalar scale) {
- return this->postScale(scale, scale, scale);
- }
-
// Sets this matrix to rotate about the specified unit-length axis vector,
// by an angle specified by its sin() and cos(). This does not attempt to
// verify that axis(x, y, z).length() == 1 or that the sin, cos values are
@@ -265,12 +221,6 @@ class GEOMETRY_SKIA_EXPORT Matrix44 {
void mapScalars(const SkScalar src[4], SkScalar dst[4]) const;
inline void mapScalars(SkScalar vec[4]) const { this->mapScalars(vec, vec); }
- friend Vector4 operator*(const Matrix44& m, const Vector4& src) {
- Vector4 dst;
- m.mapScalars(src.fData, dst.fData);
- return dst;
- }
-
/**
* map an array of [x, y, 0, 1] through the matrix, returning an array
* of [x', y', z', w'].
@@ -280,19 +230,6 @@ class GEOMETRY_SKIA_EXPORT Matrix44 {
* @param dst4 array of [x', y', z', w'] quads as the output.
*/
void map2(const float src2[], int count, float dst4[]) const;
- void map2(const double src2[], int count, double dst4[]) const;
-
- /** Returns true if transformating an axis-aligned square in 2d by this matrix
- will produce another 2d axis-aligned square; typically means the matrix
- is a scale with perhaps a 90-degree rotation. A 3d rotation through 90
- degrees into a perpendicular plane collapses a square to a line, but
- is still considered to be axis-aligned.
-
- By default, tolerates very slight error due to float imprecisions;
- a 90-degree rotation can still end up with 10^-17 of
- "non-axis-aligned" result.
- */
- bool preserves2dAxisAlignment(SkScalar epsilon = SK_ScalarNearlyZero) const;
double determinant() const;
diff --git a/chromium/ui/gfx/geometry/rect_f.cc b/chromium/ui/gfx/geometry/rect_f.cc
index c9084cff393..cb4d68475f6 100644
--- a/chromium/ui/gfx/geometry/rect_f.cc
+++ b/chromium/ui/gfx/geometry/rect_f.cc
@@ -8,6 +8,7 @@
#include <limits>
#include "base/check.h"
+#include "base/check_op.h"
#include "base/numerics/safe_conversions.h"
#include "base/strings/stringprintf.h"
#include "build/build_config.h"
@@ -148,6 +149,19 @@ void RectF::UnionEvenIfEmpty(const RectF& rect) {
float rb = std::max(bottom(), rect.bottom());
SetRect(rx, ry, rr - rx, rb - ry);
+
+ // Due to floating errors and SizeF::clamp(), the new rect may not fully
+ // contain the original rects at the right/bottom side. Expand the rect in
+ // the case.
+ constexpr auto kFloatMax = std::numeric_limits<float>::max();
+ if (UNLIKELY(right() < rr && width() < kFloatMax)) {
+ size_.SetToNextWidth();
+ DCHECK_GE(right(), rr);
+ }
+ if (UNLIKELY(bottom() < rb && height() < kFloatMax)) {
+ size_.SetToNextHeight();
+ DCHECK_GE(bottom(), rb);
+ }
}
void RectF::Subtract(const RectF& rect) {
diff --git a/chromium/ui/gfx/geometry/rect_f_unittest.cc b/chromium/ui/gfx/geometry/rect_f_unittest.cc
index b30d275325d..b6b9f459126 100644
--- a/chromium/ui/gfx/geometry/rect_f_unittest.cc
+++ b/chromium/ui/gfx/geometry/rect_f_unittest.cc
@@ -159,6 +159,35 @@ TEST(RectFTest, UnionEvenIfEmpty) {
RectF(8.8f, 9.9f, 2.2f, 0)));
}
+TEST(RectFTest, UnionEnsuresContainWithFloatingError) {
+ for (float f = 0.1f; f < 5; f += 0.1f) {
+ RectF r1(1, 2, 3, 4);
+ r1.Scale(f, f + 0.05f);
+ RectF r2 = r1 + Vector2dF(10.f + f, f - 10.f);
+ RectF r3 = UnionRects(r1, r2);
+ EXPECT_TRUE(r3.Contains(r1));
+ EXPECT_TRUE(r3.Contains(r2));
+ }
+}
+
+TEST(RectFTest, UnionIfEmptyResultTinySize) {
+ RectF r1(1e-15f, 0, 0, 0);
+ RectF r2(0, 1e-15f, 0, 0);
+ RectF r3 = UnionRectsEvenIfEmpty(r1, r2);
+ EXPECT_FALSE(r3.IsEmpty());
+ EXPECT_TRUE(r3.Contains(r1));
+ EXPECT_TRUE(r3.Contains(r2));
+}
+
+TEST(RectFTest, UnionMaxRects) {
+ constexpr float kMaxFloat = std::numeric_limits<float>::max();
+ constexpr float kMinFloat = std::numeric_limits<float>::min();
+ gfx::RectF r1(kMinFloat, 0, kMaxFloat, kMaxFloat);
+ gfx::RectF r2(0, kMinFloat, kMaxFloat, kMaxFloat);
+ // This should not trigger DCHECK failure.
+ r1.Union(r2);
+}
+
TEST(RectFTest, CenterPoint) {
PointF center;
diff --git a/chromium/ui/gfx/geometry/resize_utils.cc b/chromium/ui/gfx/geometry/resize_utils.cc
index e3a70eb9d1a..e6a2ababcf4 100644
--- a/chromium/ui/gfx/geometry/resize_utils.cc
+++ b/chromium/ui/gfx/geometry/resize_utils.cc
@@ -35,34 +35,47 @@ bool IsResizingHorizontally(ResizeEdge resize_edge) {
void SizeRectToAspectRatio(ResizeEdge resize_edge,
float aspect_ratio,
const Size& min_window_size,
- const Size& max_window_size,
+ absl::optional<Size> max_window_size,
Rect* rect) {
DCHECK_GT(aspect_ratio, 0.0f);
- DCHECK_GE(max_window_size.width(), min_window_size.width());
- DCHECK_GE(max_window_size.height(), min_window_size.height());
+ if (max_window_size.has_value()) {
+ DCHECK_GE(max_window_size->width(), min_window_size.width());
+ DCHECK_GE(max_window_size->height(), min_window_size.height());
+ DCHECK(Rect(rect->origin(), *max_window_size).Contains(*rect))
+ << rect->ToString() << " is larger than the maximum size "
+ << max_window_size->ToString();
+ }
DCHECK(rect->Contains(Rect(rect->origin(), min_window_size)))
<< rect->ToString() << " is smaller than the minimum size "
<< min_window_size.ToString();
- DCHECK(Rect(rect->origin(), max_window_size).Contains(*rect))
- << rect->ToString() << " is larger than the maximum size "
- << max_window_size.ToString();
Size new_size = rect->size();
if (IsResizingHorizontally(resize_edge)) {
new_size.set_height(base::ClampRound(new_size.width() / aspect_ratio));
if (min_window_size.height() > new_size.height() ||
- new_size.height() > max_window_size.height()) {
- new_size.set_height(base::clamp(new_size.height(),
- min_window_size.height(),
- max_window_size.height()));
+ (max_window_size.has_value() &&
+ new_size.height() > max_window_size->height())) {
+ if (max_window_size.has_value()) {
+ new_size.set_height(base::clamp(new_size.height(),
+ min_window_size.height(),
+ max_window_size->height()));
+ } else {
+ new_size.set_height(min_window_size.height());
+ }
new_size.set_width(base::ClampRound(new_size.height() * aspect_ratio));
}
} else {
new_size.set_width(base::ClampRound(new_size.height() * aspect_ratio));
if (min_window_size.width() > new_size.width() ||
- new_size.width() > max_window_size.width()) {
- new_size.set_width(base::clamp(new_size.width(), min_window_size.width(),
- max_window_size.width()));
+ (max_window_size.has_value() &&
+ new_size.width() > max_window_size->width())) {
+ if (max_window_size.has_value()) {
+ new_size.set_width(base::clamp(new_size.width(),
+ min_window_size.width(),
+ max_window_size->width()));
+ } else {
+ new_size.set_width(min_window_size.width());
+ }
new_size.set_height(base::ClampRound(new_size.width() / aspect_ratio));
}
}
@@ -70,7 +83,9 @@ void SizeRectToAspectRatio(ResizeEdge resize_edge,
// The dimensions might still be outside of the allowed ranges at this point.
// This happens when the aspect ratio makes it impossible to fit |rect|
// within the size limits without letter-/pillarboxing.
- new_size.SetToMin(max_window_size);
+ if (max_window_size.has_value())
+ new_size.SetToMin(*max_window_size);
+
new_size.SetToMax(min_window_size);
// |rect| bounds before sizing to aspect ratio.
diff --git a/chromium/ui/gfx/geometry/resize_utils.h b/chromium/ui/gfx/geometry/resize_utils.h
index 318a31bdb01..ddb0da430c4 100644
--- a/chromium/ui/gfx/geometry/resize_utils.h
+++ b/chromium/ui/gfx/geometry/resize_utils.h
@@ -5,6 +5,7 @@
#ifndef UI_GFX_GEOMETRY_RESIZE_UTILS_H_
#define UI_GFX_GEOMETRY_RESIZE_UTILS_H_
+#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/geometry/geometry_export.h"
namespace gfx {
@@ -28,12 +29,10 @@ enum class ResizeEdge {
// |min_window_size| and |max_window_size| are expected to adhere to the
// given aspect ratio.
// |aspect_ratio| must be valid and is found using width / height.
-// TODO(apacible): |max_window_size| is expected to be non-empty. Handle
-// unconstrained max sizes and sizing when windows are maximized.
void GEOMETRY_EXPORT SizeRectToAspectRatio(ResizeEdge resize_edge,
float aspect_ratio,
const Size& min_window_size,
- const Size& max_window_size,
+ absl::optional<Size> max_window_size,
Rect* rect);
} // namespace gfx
diff --git a/chromium/ui/gfx/geometry/resize_utils_unittest.cc b/chromium/ui/gfx/geometry/resize_utils_unittest.cc
index bf1e90bcc2c..d7db548b7f5 100644
--- a/chromium/ui/gfx/geometry/resize_utils_unittest.cc
+++ b/chromium/ui/gfx/geometry/resize_utils_unittest.cc
@@ -53,16 +53,16 @@ struct SizingParams {
ResizeEdge resize_edge{};
float aspect_ratio = 0.0f;
Size min_size;
- Size max_size;
+ absl::optional<Size> max_size;
Rect input_rect;
Rect expected_output_rect;
std::string ToString() const {
- return base::StrCat({HitTestToString(resize_edge),
- " ratio=", base::NumberToString(aspect_ratio), " [",
- min_size.ToString(), "..", max_size.ToString(), "] ",
- input_rect.ToString(), " -> ",
- expected_output_rect.ToString()});
+ return base::StrCat(
+ {HitTestToString(resize_edge), " ratio=",
+ base::NumberToString(aspect_ratio), " [", min_size.ToString(), "..",
+ max_size.has_value() ? max_size->ToString() : "nullopt", "] ",
+ input_rect.ToString(), " -> ", expected_output_rect.ToString()});
}
};
@@ -121,6 +121,11 @@ const SizingParams kSizeRectToSquareAspectRatioTestCases[] = {
kMaxSizeHorizontal,
Rect(100, 100, kMaxSizeHorizontal.height(), kMaxSizeHorizontal.height()),
Rect(100, 100, kMaxSizeHorizontal.height(), kMaxSizeHorizontal.height())},
+
+ // Dragging the top-left resizer left.
+ // No max size specified.
+ {ResizeEdge::kTopLeft, kAspectRatioSquare, kMinSizeHorizontal,
+ absl::nullopt, Rect(102, 100, 22, 24), Rect(102, 102, 22, 22)},
};
const SizingParams kSizeRectToHorizontalAspectRatioTestCases[] = {
@@ -143,6 +148,11 @@ const SizingParams kSizeRectToHorizontalAspectRatioTestCases[] = {
kMaxSizeHorizontal,
Rect(100, 100, kMaxSizeHorizontal.width(), kMaxSizeHorizontal.height()),
Rect(100, 100, kMaxSizeHorizontal.width(), kMaxSizeHorizontal.height())},
+
+ // Dragging the left resizer left.
+ // No max size specified.
+ {ResizeEdge::kLeft, kAspectRatioHorizontal, kMinSizeHorizontal,
+ absl::nullopt, Rect(96, 100, 48, 22), Rect(96, 98, 48, 24)},
};
const SizingParams kSizeRectToVerticalAspectRatioTestCases[] = {
@@ -163,6 +173,11 @@ const SizingParams kSizeRectToVerticalAspectRatioTestCases[] = {
{ResizeEdge::kTop, kAspectRatioVertical, kMinSizeVertical, kMaxSizeVertical,
Rect(100, 100, kMaxSizeVertical.width(), kMaxSizeVertical.height()),
Rect(100, 100, kMaxSizeVertical.width(), kMaxSizeVertical.height())},
+
+ // Dragging the right resizer right.
+ // No max size specified.
+ {ResizeEdge::kRight, kAspectRatioVertical, kMinSizeVertical, absl::nullopt,
+ Rect(100, 100, 24, 44), Rect(100, 100, 24, 48)},
};
INSTANTIATE_TEST_SUITE_P(
diff --git a/chromium/ui/gfx/geometry/size.h b/chromium/ui/gfx/geometry/size.h
index 4358414654d..412968b306a 100644
--- a/chromium/ui/gfx/geometry/size.h
+++ b/chromium/ui/gfx/geometry/size.h
@@ -52,7 +52,9 @@ class GEOMETRY_EXPORT Size {
// Returns a checked numeric representation of the area.
base::CheckedNumeric<int> GetCheckedArea() const;
- uint64_t Area64() const { return static_cast<uint64_t>(width_) * height_; }
+ uint64_t Area64() const {
+ return static_cast<uint64_t>(width_) * static_cast<uint64_t>(height_);
+ }
void SetSize(int width, int height) {
set_width(width);
diff --git a/chromium/ui/gfx/geometry/size_f.h b/chromium/ui/gfx/geometry/size_f.h
index b6acf9e6093..de8955b3ee3 100644
--- a/chromium/ui/gfx/geometry/size_f.h
+++ b/chromium/ui/gfx/geometry/size_f.h
@@ -66,6 +66,10 @@ class GEOMETRY_EXPORT SizeF {
void SetToMin(const SizeF& other);
void SetToMax(const SizeF& other);
+ // Expands width/height to the next representable value.
+ void SetToNextWidth() { width_ = next(width_); }
+ void SetToNextHeight() { height_ = next(height_); }
+
constexpr bool IsEmpty() const { return !width() || !height(); }
constexpr bool IsZero() const { return !width() && !height(); }
@@ -93,6 +97,11 @@ class GEOMETRY_EXPORT SizeF {
static constexpr float clamp(float f) { return f > kTrivial ? f : 0.f; }
+ static float next(float f) {
+ return std::nextafter(std::max(kTrivial, f),
+ std::numeric_limits<float>::max());
+ }
+
float width_;
float height_;
};
diff --git a/chromium/ui/gfx/geometry/transform_util_unittest.cc b/chromium/ui/gfx/geometry/transform_util_unittest.cc
index a504768f329..51defa671e1 100644
--- a/chromium/ui/gfx/geometry/transform_util_unittest.cc
+++ b/chromium/ui/gfx/geometry/transform_util_unittest.cc
@@ -336,7 +336,7 @@ TEST(TransformUtilTest, TransformBetweenRects) {
EXPECT_EQ(dst_rect, dst_in_parent_coordinates);
};
- std::vector<const std::pair<const RectF, const RectF>> test_cases{
+ std::vector<std::pair<const RectF, const RectF>> test_cases{
{RectF(0.f, 0.f, 2.f, 3.f), RectF(3.f, 5.f, 4.f, 9.f)},
{RectF(10.f, 7.f, 2.f, 6.f), RectF(4.f, 2.f, 1.f, 12.f)},
{RectF(0.f, 0.f, 3.f, 5.f), RectF(0.f, 0.f, 6.f, 2.5f)}};
diff --git a/chromium/ui/gfx/gpu_memory_buffer.cc b/chromium/ui/gfx/gpu_memory_buffer.cc
index a49e5bb559f..c8d60c159a5 100644
--- a/chromium/ui/gfx/gpu_memory_buffer.cc
+++ b/chromium/ui/gfx/gpu_memory_buffer.cc
@@ -69,6 +69,4 @@ GpuMemoryBufferHandle GpuMemoryBufferHandle::Clone() const {
void GpuMemoryBuffer::SetColorSpace(const ColorSpace& color_space) {}
-void GpuMemoryBuffer::SetHDRMetadata(const HDRMetadata& hdr_metadata) {}
-
} // namespace gfx
diff --git a/chromium/ui/gfx/gpu_memory_buffer.h b/chromium/ui/gfx/gpu_memory_buffer.h
index 7bb66fa2ade..1ab6446a4cf 100644
--- a/chromium/ui/gfx/gpu_memory_buffer.h
+++ b/chromium/ui/gfx/gpu_memory_buffer.h
@@ -14,7 +14,6 @@
#include "ui/gfx/generic_shared_memory_id.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/gfx_export.h"
-#include "ui/gfx/hdr_metadata.h"
#if defined(USE_OZONE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
#include "ui/gfx/native_pixmap_handle.h"
@@ -28,8 +27,6 @@
#include "base/android/scoped_hardware_buffer_handle.h"
#endif
-extern "C" typedef struct _ClientBuffer* ClientBuffer;
-
namespace base {
namespace trace_event {
class ProcessMemoryDump;
@@ -77,7 +74,7 @@ struct GFX_EXPORT GpuMemoryBufferHandle {
GpuMemoryBufferId id{0};
base::UnsafeSharedMemoryRegion region;
uint32_t offset = 0;
- int32_t stride = 0;
+ uint32_t stride = 0;
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
NativePixmapHandle native_pixmap_handle;
#elif BUILDFLAG(IS_MAC)
@@ -125,10 +122,6 @@ class GFX_EXPORT GpuMemoryBuffer {
// as an overlay. Note that this will not impact texturing from the buffer.
virtual void SetColorSpace(const ColorSpace& color_space);
- // Set the HDR metadata for use when this buffer is used as an overlay. Note
- // that this will not impact texturing from the buffer.
- virtual void SetHDRMetadata(const HDRMetadata& hdr_metadata);
-
// Returns a unique identifier associated with buffer.
virtual GpuMemoryBufferId GetId() const = 0;
@@ -140,9 +133,6 @@ class GFX_EXPORT GpuMemoryBuffer {
// caller takes ownership of the returned handle.
virtual GpuMemoryBufferHandle CloneHandle() const = 0;
- // Type-checking downcast routine.
- virtual ClientBuffer AsClientBuffer() = 0;
-
// Dumps information about the memory backing the GpuMemoryBuffer to |pmd|.
// The memory usage is attributed to |buffer_dump_guid|.
// |tracing_process_id| uniquely identifies the process owning the memory.
diff --git a/chromium/ui/gfx/hdr_metadata.h b/chromium/ui/gfx/hdr_metadata.h
index c06f9e2078f..a50da186098 100644
--- a/chromium/ui/gfx/hdr_metadata.h
+++ b/chromium/ui/gfx/hdr_metadata.h
@@ -5,13 +5,13 @@
#ifndef UI_GFX_HDR_METADATA_H_
#define UI_GFX_HDR_METADATA_H_
+#include "ui/gfx/color_space_export.h"
#include "ui/gfx/geometry/point_f.h"
-#include "ui/gfx/gfx_export.h"
namespace gfx {
// SMPTE ST 2086 color volume metadata.
-struct GFX_EXPORT ColorVolumeMetadata {
+struct COLOR_SPACE_EXPORT ColorVolumeMetadata {
using Chromaticity = PointF;
Chromaticity primary_r;
Chromaticity primary_g;
@@ -33,7 +33,7 @@ struct GFX_EXPORT ColorVolumeMetadata {
};
// HDR metadata common for HDR10 and WebM/VP9-based HDR formats.
-struct GFX_EXPORT HDRMetadata {
+struct COLOR_SPACE_EXPORT HDRMetadata {
ColorVolumeMetadata color_volume_metadata;
// Max content light level (CLL), i.e. maximum brightness level present in the
// stream), in nits.
diff --git a/chromium/ui/gfx/icc_profile.cc b/chromium/ui/gfx/icc_profile.cc
index 59d427267eb..5525e5efd68 100644
--- a/chromium/ui/gfx/icc_profile.cc
+++ b/chromium/ui/gfx/icc_profile.cc
@@ -13,7 +13,7 @@
#include "base/logging.h"
#include "base/synchronization/lock.h"
#include "third_party/skia/include/core/SkColorSpace.h"
-#include "third_party/skia/include/third_party/skcms/skcms.h"
+#include "third_party/skia/modules/skcms/skcms.h"
#include "ui/gfx/skia_color_space_util.h"
namespace gfx {
diff --git a/chromium/ui/gfx/icc_profile.h b/chromium/ui/gfx/icc_profile.h
index 542f703fbf9..11ed3276df9 100644
--- a/chromium/ui/gfx/icc_profile.h
+++ b/chromium/ui/gfx/icc_profile.h
@@ -11,7 +11,7 @@
#include "base/gtest_prod_util.h"
#include "base/memory/ref_counted.h"
-#include "third_party/skia/include/third_party/skcms/skcms.h"
+#include "third_party/skia/modules/skcms/skcms.h"
#include "ui/gfx/color_space.h"
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);
diff --git a/chromium/ui/gfx/ipc/gfx_param_traits.cc b/chromium/ui/gfx/ipc/gfx_param_traits.cc
index 0499ab32703..3bdf65579dc 100644
--- a/chromium/ui/gfx/ipc/gfx_param_traits.cc
+++ b/chromium/ui/gfx/ipc/gfx_param_traits.cc
@@ -9,6 +9,7 @@
#include <string>
+#include "base/format_macros.h"
#include "base/strings/stringprintf.h"
#include "build/build_config.h"
#include "ui/gfx/ipc/geometry/gfx_param_traits.h"
@@ -21,8 +22,8 @@
namespace IPC {
void ParamTraits<gfx::Range>::Write(base::Pickle* m, const gfx::Range& r) {
- m->WriteUInt32(r.start());
- m->WriteUInt32(r.end());
+ m->WriteUInt32(static_cast<uint32_t>(r.start()));
+ m->WriteUInt32(static_cast<uint32_t>(r.end()));
}
bool ParamTraits<gfx::Range>::Read(const base::Pickle* m,
@@ -37,7 +38,7 @@ bool ParamTraits<gfx::Range>::Read(const base::Pickle* m,
}
void ParamTraits<gfx::Range>::Log(const gfx::Range& r, std::string* l) {
- l->append(base::StringPrintf("(%d, %d)", r.start(), r.end()));
+ l->append(base::StringPrintf("(%" PRIuS ", %" PRIuS ")", r.start(), r.end()));
}
#if BUILDFLAG(IS_MAC)
diff --git a/chromium/ui/gfx/ipc/skia/gfx_skia_param_traits.cc b/chromium/ui/gfx/ipc/skia/gfx_skia_param_traits.cc
index 21a3b7f8ad8..844e357f723 100644
--- a/chromium/ui/gfx/ipc/skia/gfx_skia_param_traits.cc
+++ b/chromium/ui/gfx/ipc/skia/gfx_skia_param_traits.cc
@@ -65,8 +65,7 @@ void ParamTraits<SkImageInfo>::Log(const SkImageInfo& p, std::string* l) {
void ParamTraits<SkBitmap>::Write(base::Pickle* m, const SkBitmap& p) {
WriteParam(m, p.info());
size_t pixel_size = p.computeByteSize();
- m->WriteData(reinterpret_cast<const char*>(p.getPixels()),
- static_cast<int>(pixel_size));
+ m->WriteData(reinterpret_cast<const char*>(p.getPixels()), pixel_size);
}
bool ParamTraits<SkBitmap>::Read(const base::Pickle* m,
@@ -77,15 +76,14 @@ bool ParamTraits<SkBitmap>::Read(const base::Pickle* m,
return false;
const char* bitmap_data;
- int bitmap_data_size = 0;
+ size_t bitmap_data_size = 0;
if (!iter->ReadData(&bitmap_data, &bitmap_data_size))
return false;
- // ReadData() only returns true if bitmap_data_size >= 0.
if (!r->tryAllocPixels(image_info))
return false;
- if (static_cast<size_t>(bitmap_data_size) != r->computeByteSize())
+ if (bitmap_data_size != r->computeByteSize())
return false;
memcpy(r->getPixels(), bitmap_data, bitmap_data_size);
return true;
diff --git a/chromium/ui/gfx/linux/client_native_pixmap_dmabuf.h b/chromium/ui/gfx/linux/client_native_pixmap_dmabuf.h
index b7e1cb05d24..6154b29e57e 100644
--- a/chromium/ui/gfx/linux/client_native_pixmap_dmabuf.h
+++ b/chromium/ui/gfx/linux/client_native_pixmap_dmabuf.h
@@ -11,6 +11,7 @@
#include <memory>
#include "base/files/scoped_file.h"
+#include "base/memory/raw_ptr.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gfx/client_native_pixmap.h"
#include "ui/gfx/geometry/size.h"
@@ -51,7 +52,7 @@ class ClientNativePixmapDmaBuf : public gfx::ClientNativePixmap {
PlaneInfo(PlaneInfo&& plane_info);
~PlaneInfo();
- void* data = nullptr;
+ raw_ptr<void> data = nullptr;
size_t offset = 0;
size_t size = 0;
};
diff --git a/chromium/ui/gfx/linux/fontconfig_util.cc b/chromium/ui/gfx/linux/fontconfig_util.cc
index 6f877d8fd75..25022a1a1a0 100644
--- a/chromium/ui/gfx/linux/fontconfig_util.cc
+++ b/chromium/ui/gfx/linux/fontconfig_util.cc
@@ -6,6 +6,7 @@
#include <fontconfig/fontconfig.h>
+#include "base/memory/raw_ptr.h"
#include "base/no_destructor.h"
#include "ui/gfx/font_render_params.h"
@@ -65,7 +66,7 @@ class GFX_EXPORT GlobalFontConfig {
}
private:
- FcConfig* fc_config_ = nullptr;
+ raw_ptr<FcConfig> fc_config_ = nullptr;
};
// Converts Fontconfig FC_HINT_STYLE to FontRenderParams::Hinting.
diff --git a/chromium/ui/gfx/linux/gbm_wrapper.cc b/chromium/ui/gfx/linux/gbm_wrapper.cc
index 4be43d55b37..7546a3327f4 100644
--- a/chromium/ui/gfx/linux/gbm_wrapper.cc
+++ b/chromium/ui/gfx/linux/gbm_wrapper.cc
@@ -9,6 +9,7 @@
#include <utility>
#include "base/logging.h"
+#include "base/memory/raw_ptr.h"
#include "base/posix/eintr_wrapper.h"
#include "skia/ext/legacy_display_globals.h"
#include "third_party/skia/include/core/SkSurface.h"
@@ -256,7 +257,7 @@ class Buffer final : public ui::GbmBuffer {
buffer->mmap_data_ = nullptr;
}
- gbm_bo* const bo_;
+ const raw_ptr<gbm_bo> bo_;
void* mmap_data_ = nullptr;
const uint32_t format_;
@@ -399,7 +400,7 @@ class Device final : public ui::GbmDevice {
}
private:
- gbm_device* const device_;
+ const raw_ptr<gbm_device> device_;
};
} // namespace gbm_wrapper
diff --git a/chromium/ui/gfx/mac/io_surface.cc b/chromium/ui/gfx/mac/io_surface.cc
index e030f01e72d..961b730933d 100644
--- a/chromium/ui/gfx/mac/io_surface.cc
+++ b/chromium/ui/gfx/mac/io_surface.cc
@@ -53,6 +53,7 @@ int32_t BytesPerElement(gfx::BufferFormat format, int plane) {
case gfx::BufferFormat::BGRA_8888:
case gfx::BufferFormat::BGRX_8888:
case gfx::BufferFormat::RGBA_8888:
+ case gfx::BufferFormat::RGBX_8888:
case gfx::BufferFormat::BGRA_1010102:
DCHECK_EQ(plane, 0);
return 4;
@@ -71,7 +72,6 @@ int32_t BytesPerElement(gfx::BufferFormat format, int plane) {
}
case gfx::BufferFormat::BGR_565:
case gfx::BufferFormat::RGBA_4444:
- case gfx::BufferFormat::RGBX_8888:
case gfx::BufferFormat::RGBA_1010102:
case gfx::BufferFormat::YVU_420:
NOTREACHED();
@@ -99,6 +99,7 @@ uint32_t BufferFormatToIOSurfacePixelFormat(gfx::BufferFormat format) {
case gfx::BufferFormat::BGRA_8888:
case gfx::BufferFormat::BGRX_8888:
case gfx::BufferFormat::RGBA_8888:
+ case gfx::BufferFormat::RGBX_8888:
return 'BGRA';
case gfx::BufferFormat::RGBA_F16:
return 'RGhA';
@@ -108,7 +109,6 @@ uint32_t BufferFormatToIOSurfacePixelFormat(gfx::BufferFormat format) {
return 'x420';
case gfx::BufferFormat::BGR_565:
case gfx::BufferFormat::RGBA_4444:
- case gfx::BufferFormat::RGBX_8888:
case gfx::BufferFormat::RGBA_1010102:
// Technically RGBA_1010102 should be accepted as 'R10k', but then it won't
// be supported by CGLTexImageIOSurface2D(), so it's best to reject it here.
@@ -253,12 +253,13 @@ IOSurfaceRef CreateIOSurface(const gfx::Size& size,
const size_t plane_width = (size.width() + factor - 1) / factor;
const size_t plane_height = (size.height() + factor - 1) / factor;
const size_t plane_bytes_per_element = BytesPerElement(format, plane);
- const size_t plane_bytes_per_row = IOSurfaceAlignProperty(
- kIOSurfacePlaneBytesPerRow,
- base::bits::AlignUp(plane_width, 2) * plane_bytes_per_element);
+ const size_t plane_bytes_per_row =
+ IOSurfaceAlignProperty(kIOSurfacePlaneBytesPerRow,
+ base::bits::AlignUp(plane_width, size_t{2}) *
+ plane_bytes_per_element);
const size_t plane_bytes_alloc = IOSurfaceAlignProperty(
kIOSurfacePlaneSize,
- base::bits::AlignUp(plane_height, 2) * plane_bytes_per_row);
+ base::bits::AlignUp(plane_height, size_t{2}) * plane_bytes_per_row);
const size_t plane_offset =
IOSurfaceAlignProperty(kIOSurfacePlaneOffset, total_bytes_alloc);
diff --git a/chromium/ui/gfx/mac/io_surface_hdr_metadata.cc b/chromium/ui/gfx/mac/io_surface_hdr_metadata.cc
deleted file mode 100644
index f4250246550..00000000000
--- a/chromium/ui/gfx/mac/io_surface_hdr_metadata.cc
+++ /dev/null
@@ -1,42 +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 "ui/gfx/mac/io_surface_hdr_metadata.h"
-
-#include "base/mac/foundation_util.h"
-#include "base/mac/scoped_cftyperef.h"
-#include "ui/gfx/mojom/hdr_metadata.mojom.h"
-
-namespace gfx {
-
-namespace {
-
-// The key under which HDR metadata is attached to an IOSurface.
-const CFStringRef kCrIOSurfaceHDRMetadataKey =
- CFSTR("CrIOSurfaceHDRMetadataKey");
-
-} // namespace
-
-void IOSurfaceSetHDRMetadata(IOSurfaceRef io_surface,
- gfx::HDRMetadata hdr_metadata) {
- std::vector<uint8_t> std_data =
- gfx::mojom::HDRMetadata::Serialize(&hdr_metadata);
- base::ScopedCFTypeRef<CFDataRef> cf_data(
- CFDataCreate(nullptr, std_data.data(), std_data.size()));
- IOSurfaceSetValue(io_surface, kCrIOSurfaceHDRMetadataKey, cf_data);
-}
-
-bool IOSurfaceGetHDRMetadata(IOSurfaceRef io_surface,
- gfx::HDRMetadata& hdr_metadata) {
- base::ScopedCFTypeRef<CFTypeRef> cf_untyped(
- IOSurfaceCopyValue(io_surface, kCrIOSurfaceHDRMetadataKey));
- CFDataRef cf_data = base::mac::CFCast<CFDataRef>(cf_untyped);
- if (!cf_data)
- return false;
- const UInt8* raw_data = CFDataGetBytePtr(cf_data);
- std::vector<uint8_t> std_data(raw_data, raw_data + CFDataGetLength(cf_data));
- return gfx::mojom::HDRMetadata::Deserialize(std_data, &hdr_metadata);
-}
-
-} // namespace gfx
diff --git a/chromium/ui/gfx/mac/io_surface_hdr_metadata.h b/chromium/ui/gfx/mac/io_surface_hdr_metadata.h
deleted file mode 100644
index 1bee4842c19..00000000000
--- a/chromium/ui/gfx/mac/io_surface_hdr_metadata.h
+++ /dev/null
@@ -1,31 +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 UI_GFX_MAC_IO_SURFACE_HDR_METADATA_H_
-#define UI_GFX_MAC_IO_SURFACE_HDR_METADATA_H_
-
-#include <IOSurface/IOSurface.h>
-
-#include "base/component_export.h"
-
-namespace gfx {
-
-struct HDRMetadata;
-
-// Attach |hdr_metadata| to |io_surface|. After this is called, any other
-// process that has opened |io_surface| will be able to read |hdr_metadata|
-// using the function IOSurfaceGetHDRMetadata.
-void COMPONENT_EXPORT(GFX_IO_SURFACE_HDR_METADATA)
- IOSurfaceSetHDRMetadata(IOSurfaceRef io_surface,
- gfx::HDRMetadata hdr_metadata);
-
-// Retrieve in |hdr_metadata| the value that was attached to |io_surface|. This
-// will return false on failure.
-bool COMPONENT_EXPORT(GFX_IO_SURFACE_HDR_METADATA)
- IOSurfaceGetHDRMetadata(IOSurfaceRef io_surface,
- gfx::HDRMetadata& hdr_metadata);
-
-} // namespace gfx
-
-#endif // UI_GFX_MAC_IO_SURFACE_HDR_METADATA_H_
diff --git a/chromium/ui/gfx/mac/io_surface_unittest.cc b/chromium/ui/gfx/mac/io_surface_unittest.cc
index 31eef23d755..02603d48218 100644
--- a/chromium/ui/gfx/mac/io_surface_unittest.cc
+++ b/chromium/ui/gfx/mac/io_surface_unittest.cc
@@ -4,35 +4,11 @@
#include "ui/gfx/mac/io_surface.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/gfx/hdr_metadata.h"
-#include "ui/gfx/mac/io_surface_hdr_metadata.h"
namespace gfx {
namespace {
-// Check that empty NSBezierPath is returned for empty SkPath.
-TEST(IOSurface, HDRMetadata) {
- gfx::HDRMetadata in;
- in.color_volume_metadata.primary_r = PointF(1.0, 2.0);
- in.color_volume_metadata.primary_g = PointF(4.0, 5.0);
- in.color_volume_metadata.primary_b = PointF(7.0, 8.0);
- in.color_volume_metadata.white_point = PointF(10.0, 11.0);
- in.color_volume_metadata.luminance_max = 13;
- in.color_volume_metadata.luminance_min = 14;
- in.max_content_light_level = 15;
- in.max_frame_average_light_level = 16;
-
- base::ScopedCFTypeRef<IOSurfaceRef> io_surface(
- CreateIOSurface(gfx::Size(100, 100), gfx::BufferFormat::BGRA_8888));
-
- gfx::HDRMetadata out;
- EXPECT_FALSE(IOSurfaceGetHDRMetadata(io_surface, out));
- IOSurfaceSetHDRMetadata(io_surface, in);
- EXPECT_TRUE(IOSurfaceGetHDRMetadata(io_surface, out));
- EXPECT_EQ(in, out);
-}
-
TEST(IOSurface, OddSizeMultiPlanar) {
base::ScopedCFTypeRef<IOSurfaceRef> io_surface(
CreateIOSurface(gfx::Size(101, 99), gfx::BufferFormat::YUV_420_BIPLANAR));
diff --git a/chromium/ui/gfx/mojom/BUILD.gn b/chromium/ui/gfx/mojom/BUILD.gn
index f577092a5e8..40fb1e3be2f 100644
--- a/chromium/ui/gfx/mojom/BUILD.gn
+++ b/chromium/ui/gfx/mojom/BUILD.gn
@@ -361,6 +361,9 @@ mojom("native_handle_types") {
if (is_linux || is_chromeos || use_ozone) {
enabled_features = [ "supports_native_pixmap" ]
}
+ if (is_linux || is_chromeos) {
+ enabled_features += [ "is_linux_or_chromeos_ash" ]
+ }
public_deps = [ "//mojo/public/mojom/base" ]
generate_java = true
webui_module_path = "chrome://resources/mojo/ui/gfx/mojom"
diff --git a/chromium/ui/gfx/mojom/linear_gradient.mojom b/chromium/ui/gfx/mojom/linear_gradient.mojom
index c95519c1c51..b535aa19fa3 100644
--- a/chromium/ui/gfx/mojom/linear_gradient.mojom
+++ b/chromium/ui/gfx/mojom/linear_gradient.mojom
@@ -6,7 +6,7 @@ module gfx.mojom;
// See ui/gfx/geometry/linear_gradient.h.
struct Step {
- float percent;
+ float fraction;
uint8 alpha;
};
diff --git a/chromium/ui/gfx/mojom/linear_gradient_mojom_traits.cc b/chromium/ui/gfx/mojom/linear_gradient_mojom_traits.cc
index 07d741f655d..25057da6ffe 100644
--- a/chromium/ui/gfx/mojom/linear_gradient_mojom_traits.cc
+++ b/chromium/ui/gfx/mojom/linear_gradient_mojom_traits.cc
@@ -18,7 +18,7 @@ bool StructTraits<gfx::mojom::LinearGradientDataView, gfx::LinearGradient>::
return false;
for (int i = 0; i < data.step_count(); ++i) {
- out->AddStep(steps_data[i].percent, steps_data[i].alpha);
+ out->AddStep(steps_data[i].fraction, steps_data[i].alpha);
}
out->set_angle(data.angle());
diff --git a/chromium/ui/gfx/mojom/linear_gradient_mojom_traits.h b/chromium/ui/gfx/mojom/linear_gradient_mojom_traits.h
index 09412c3907e..1480d0add88 100644
--- a/chromium/ui/gfx/mojom/linear_gradient_mojom_traits.h
+++ b/chromium/ui/gfx/mojom/linear_gradient_mojom_traits.h
@@ -12,8 +12,8 @@ namespace mojo {
template <>
struct StructTraits<gfx::mojom::StepDataView, gfx::LinearGradient::Step> {
- static float percent(const gfx::LinearGradient::Step& input) {
- return input.percent;
+ static float fraction(const gfx::LinearGradient::Step& input) {
+ return input.fraction;
}
static uint8_t alpha(const gfx::LinearGradient::Step& input) {
@@ -22,7 +22,7 @@ struct StructTraits<gfx::mojom::StepDataView, gfx::LinearGradient::Step> {
static bool Read(gfx::mojom::StepDataView data,
gfx::LinearGradient::Step* out) {
- out->percent = data.percent();
+ out->fraction = data.fraction();
out->alpha = data.alpha();
return true;
}
diff --git a/chromium/ui/gfx/mojom/mask_filter_info.mojom b/chromium/ui/gfx/mojom/mask_filter_info.mojom
index 55bd480ccd7..9d42d6e04eb 100644
--- a/chromium/ui/gfx/mojom/mask_filter_info.mojom
+++ b/chromium/ui/gfx/mojom/mask_filter_info.mojom
@@ -5,9 +5,10 @@
module gfx.mojom;
import "ui/gfx/mojom/rrect_f.mojom";
+import "ui/gfx/mojom/linear_gradient.mojom";
-// See ui/gfx/mask_filter_info.h.
+// See ui/gfx/geometry/mask_filter_info.h.
struct MaskFilterInfo {
gfx.mojom.RRectF rounded_corner_bounds;
- // TODO(crbug.com/1039003): add gradient mask field
+ gfx.mojom.LinearGradient? gradient_mask;
};
diff --git a/chromium/ui/gfx/mojom/mask_filter_info_mojom_traits.cc b/chromium/ui/gfx/mojom/mask_filter_info_mojom_traits.cc
index 683762ae549..a7d4a7af949 100644
--- a/chromium/ui/gfx/mojom/mask_filter_info_mojom_traits.cc
+++ b/chromium/ui/gfx/mojom/mask_filter_info_mojom_traits.cc
@@ -12,7 +12,15 @@ bool StructTraits<gfx::mojom::MaskFilterInfoDataView, gfx::MaskFilterInfo>::
gfx::RRectF bounds;
if (!data.ReadRoundedCornerBounds(&bounds))
return false;
- *out = gfx::MaskFilterInfo(bounds);
+
+ absl::optional<gfx::LinearGradient> gradient_mask;
+ if (!data.ReadGradientMask(&gradient_mask))
+ return false;
+
+ if (gradient_mask && !gradient_mask->IsEmpty())
+ *out = gfx::MaskFilterInfo(bounds, gradient_mask.value());
+ else
+ *out = gfx::MaskFilterInfo(bounds);
return true;
}
diff --git a/chromium/ui/gfx/mojom/mask_filter_info_mojom_traits.h b/chromium/ui/gfx/mojom/mask_filter_info_mojom_traits.h
index 849742a91ff..0bb53003b0d 100644
--- a/chromium/ui/gfx/mojom/mask_filter_info_mojom_traits.h
+++ b/chromium/ui/gfx/mojom/mask_filter_info_mojom_traits.h
@@ -5,7 +5,9 @@
#ifndef UI_GFX_MOJOM_MASK_FILTER_INFO_MOJOM_TRAITS_H_
#define UI_GFX_MOJOM_MASK_FILTER_INFO_MOJOM_TRAITS_H_
+#include "ui/gfx/geometry/linear_gradient.h"
#include "ui/gfx/geometry/mask_filter_info.h"
+#include "ui/gfx/mojom/linear_gradient_mojom_traits.h"
#include "ui/gfx/mojom/mask_filter_info.mojom-shared.h"
#include "ui/gfx/mojom/rrect_f_mojom_traits.h"
@@ -17,6 +19,11 @@ struct StructTraits<gfx::mojom::MaskFilterInfoDataView, gfx::MaskFilterInfo> {
return info.rounded_corner_bounds();
}
+ static const absl::optional<gfx::LinearGradient>& gradient_mask(
+ const gfx::MaskFilterInfo& info) {
+ return info.gradient_mask();
+ }
+
static bool Read(gfx::mojom::MaskFilterInfoDataView data,
gfx::MaskFilterInfo* out);
};
diff --git a/chromium/ui/gfx/mojom/mojom_traits_unittest.cc b/chromium/ui/gfx/mojom/mojom_traits_unittest.cc
index 2ba0059d289..40681acf91e 100644
--- a/chromium/ui/gfx/mojom/mojom_traits_unittest.cc
+++ b/chromium/ui/gfx/mojom/mojom_traits_unittest.cc
@@ -147,7 +147,7 @@ TEST_F(StructTraitsTest, AcceleratedWidget) {
TEST_F(StructTraitsTest, GpuMemoryBufferHandle) {
const gfx::GpuMemoryBufferId kId(99);
const uint32_t kOffset = 126;
- const int32_t kStride = 256;
+ const uint32_t kStride = 256;
base::UnsafeSharedMemoryRegion shared_memory_region =
base::UnsafeSharedMemoryRegion::Create(1024);
ASSERT_TRUE(shared_memory_region.IsValid());
diff --git a/chromium/ui/gfx/mojom/native_handle_types.mojom b/chromium/ui/gfx/mojom/native_handle_types.mojom
index d8079b38104..ea664c8e9b4 100644
--- a/chromium/ui/gfx/mojom/native_handle_types.mojom
+++ b/chromium/ui/gfx/mojom/native_handle_types.mojom
@@ -23,11 +23,12 @@ struct NativePixmapPlane {
struct NativePixmapHandle {
array<NativePixmapPlane> planes;
- [EnableIf=is_linux]
- uint64 modifier;
- [EnableIf=is_chromeos_ash]
+ [EnableIf=is_linux_or_chromeos_ash]
uint64 modifier;
+ [EnableIf=is_linux_or_chromeos_ash]
+ bool supports_zero_copy_webgpu_import;
+
[EnableIf=is_fuchsia]
mojo_base.mojom.UnguessableToken? buffer_collection_id;
[EnableIf=is_fuchsia]
diff --git a/chromium/ui/gfx/mojom/native_handle_types_mojom_traits.cc b/chromium/ui/gfx/mojom/native_handle_types_mojom_traits.cc
index 78cc177333d..a0a320a0137 100644
--- a/chromium/ui/gfx/mojom/native_handle_types_mojom_traits.cc
+++ b/chromium/ui/gfx/mojom/native_handle_types_mojom_traits.cc
@@ -47,6 +47,8 @@ bool StructTraits<
gfx::NativePixmapHandle* out) {
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
out->modifier = data.modifier();
+ out->supports_zero_copy_webgpu_import =
+ data.supports_zero_copy_webgpu_import();
#endif
#if BUILDFLAG(IS_FUCHSIA)
diff --git a/chromium/ui/gfx/mojom/native_handle_types_mojom_traits.h b/chromium/ui/gfx/mojom/native_handle_types_mojom_traits.h
index 7bd369ccbd7..ffeb3b51d7a 100644
--- a/chromium/ui/gfx/mojom/native_handle_types_mojom_traits.h
+++ b/chromium/ui/gfx/mojom/native_handle_types_mojom_traits.h
@@ -59,6 +59,13 @@ struct COMPONENT_EXPORT(GFX_NATIVE_HANDLE_TYPES_SHARED_MOJOM_TRAITS)
}
#endif
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+ static bool supports_zero_copy_webgpu_import(
+ const gfx::NativePixmapHandle& pixmap_handle) {
+ return pixmap_handle.supports_zero_copy_webgpu_import;
+ }
+#endif
+
#if BUILDFLAG(IS_FUCHSIA)
static const absl::optional<base::UnguessableToken>& buffer_collection_id(
const gfx::NativePixmapHandle& pixmap_handle) {
diff --git a/chromium/ui/gfx/overlay_plane_data.cc b/chromium/ui/gfx/overlay_plane_data.cc
index fb90ed6344a..bfd3d1920e1 100644
--- a/chromium/ui/gfx/overlay_plane_data.cc
+++ b/chromium/ui/gfx/overlay_plane_data.cc
@@ -20,7 +20,7 @@ OverlayPlaneData::OverlayPlaneData(
const gfx::RRectF& rounded_corners,
const gfx::ColorSpace& color_space,
const absl::optional<HDRMetadata>& hdr_metadata,
- absl::optional<SkColor> color,
+ absl::optional<SkColor4f> color,
bool is_solid_color)
: z_order(z_order),
plane_transform(plane_transform),
diff --git a/chromium/ui/gfx/overlay_plane_data.h b/chromium/ui/gfx/overlay_plane_data.h
index f9d330333ed..99488b0db14 100644
--- a/chromium/ui/gfx/overlay_plane_data.h
+++ b/chromium/ui/gfx/overlay_plane_data.h
@@ -31,7 +31,7 @@ struct GFX_EXPORT OverlayPlaneData {
const gfx::RRectF& rounded_corners,
const gfx::ColorSpace& color_space,
const absl::optional<HDRMetadata>& hdr_metadata,
- absl::optional<SkColor> color = absl::nullopt,
+ absl::optional<SkColor4f> color = absl::nullopt,
bool is_solid_color = false);
~OverlayPlaneData();
@@ -76,7 +76,7 @@ struct GFX_EXPORT OverlayPlaneData {
// Represents either a background of this overlay or a color of a solid color
// quad, which can be checked via the |is_solid_color|.
- absl::optional<SkColor> color;
+ absl::optional<SkColor4f> color;
// Set if this is a solid color quad.
bool is_solid_color;
diff --git a/chromium/ui/gfx/platform_font_skia.cc b/chromium/ui/gfx/platform_font_skia.cc
index 4a829602b5d..cefc3fe7429 100644
--- a/chromium/ui/gfx/platform_font_skia.cc
+++ b/chromium/ui/gfx/platform_font_skia.cc
@@ -22,13 +22,16 @@
#include "ui/gfx/font.h"
#include "ui/gfx/font_list.h"
#include "ui/gfx/font_render_params.h"
-#include "ui/gfx/skia_font_delegate.h"
#include "ui/gfx/text_utils.h"
#if BUILDFLAG(IS_WIN)
#include "ui/gfx/system_fonts_win.h"
#endif
+#if BUILDFLAG(IS_LINUX)
+#include "ui/linux/linux_ui.h"
+#endif
+
namespace gfx {
namespace {
@@ -163,13 +166,17 @@ void PlatformFontSkia::EnsuresDefaultFontIsInitialized() {
weight = system_font.GetWeight();
#endif // BUILDFLAG(IS_WIN)
- // On Linux, SkiaFontDelegate is used to query the native toolkit (e.g.
- // GTK+) for the default UI font.
- const SkiaFontDelegate* delegate = SkiaFontDelegate::instance();
- if (delegate) {
- delegate->GetDefaultFontDescription(&family, &size_pixels, &style, &weight,
- &params);
- } else if (default_font_description_) {
+#if BUILDFLAG(IS_LINUX)
+ // On Linux, LinuxUi is used to query the native toolkit (e.g.
+ // GTK) for the default UI font.
+ if (const auto* linux_ui = ui::LinuxUi::instance()) {
+ int weight_int;
+ linux_ui->GetDefaultFontDescription(
+ &family, &size_pixels, &style, static_cast<int*>(&weight_int), &params);
+ weight = static_cast<Font::Weight>(weight_int);
+ } else
+#endif
+ if (default_font_description_) {
#if BUILDFLAG(IS_CHROMEOS)
// On ChromeOS, a FontList font description string is stored as a
// translatable resource and passed in via SetDefaultFontDescription().
diff --git a/chromium/ui/gfx/platform_font_skia_unittest.cc b/chromium/ui/gfx/platform_font_skia_unittest.cc
index d2ad3c7ca47..6060900a2d1 100644
--- a/chromium/ui/gfx/platform_font_skia_unittest.cc
+++ b/chromium/ui/gfx/platform_font_skia_unittest.cc
@@ -15,17 +15,20 @@
#include "ui/gfx/font.h"
#include "ui/gfx/font_names_testing.h"
#include "ui/gfx/font_render_params.h"
-#include "ui/gfx/skia_font_delegate.h"
#if BUILDFLAG(IS_WIN)
#include "ui/gfx/system_fonts_win.h"
#endif
+#if BUILDFLAG(IS_LINUX)
+#include "ui/linux/fake_linux_ui.h"
+#endif
+
namespace gfx {
-// Implementation of SkiaFontDelegate used to control the default font
-// description.
-class TestFontDelegate : public SkiaFontDelegate {
+#if BUILDFLAG(IS_LINUX)
+// Implementation of LinuxUi used to control the default font description.
+class TestFontDelegate : public ui::FakeLinuxUi {
public:
TestFontDelegate() = default;
@@ -48,12 +51,12 @@ class TestFontDelegate : public SkiaFontDelegate {
void GetDefaultFontDescription(std::string* family_out,
int* size_pixels_out,
int* style_out,
- Font::Weight* weight_out,
+ int* weight_out,
FontRenderParams* params_out) const override {
*family_out = family_;
*size_pixels_out = size_pixels_;
*style_out = style_;
- *weight_out = weight_;
+ *weight_out = static_cast<int>(weight_);
*params_out = params_;
}
@@ -76,36 +79,33 @@ class PlatformFontSkiaTest : public testing::Test {
~PlatformFontSkiaTest() override = default;
void SetUp() override {
- original_font_delegate_ = SkiaFontDelegate::instance();
- SkiaFontDelegate::SetInstance(&test_font_delegate_);
+ DCHECK_EQ(ui::LinuxUi::instance(), nullptr);
+ auto test_font_delegate = std::make_unique<TestFontDelegate>();
+ test_font_delegate_ = test_font_delegate.get();
+ ui::LinuxUi::SetInstance(std::move(test_font_delegate));
PlatformFontSkia::ReloadDefaultFont();
}
void TearDown() override {
- DCHECK_EQ(&test_font_delegate_, SkiaFontDelegate::instance());
- SkiaFontDelegate::SetInstance(
- const_cast<SkiaFontDelegate*>(original_font_delegate_.get()));
+ DCHECK_EQ(test_font_delegate_, ui::LinuxUi::instance());
+ ui::LinuxUi::SetInstance(nullptr);
PlatformFontSkia::ReloadDefaultFont();
}
protected:
- TestFontDelegate test_font_delegate_;
-
- private:
- // Originally-registered delegate.
- raw_ptr<const SkiaFontDelegate> original_font_delegate_;
+ TestFontDelegate* test_font_delegate_ = nullptr;
};
// Test that PlatformFontSkia's default constructor initializes the instance
// with the correct parameters.
TEST_F(PlatformFontSkiaTest, DefaultFont) {
- test_font_delegate_.set_family(kTestFontName);
- test_font_delegate_.set_size_pixels(13);
- test_font_delegate_.set_style(Font::NORMAL);
+ test_font_delegate_->set_family(kTestFontName);
+ test_font_delegate_->set_size_pixels(13);
+ test_font_delegate_->set_style(Font::NORMAL);
FontRenderParams params;
params.antialiasing = false;
params.hinting = FontRenderParams::HINTING_FULL;
- test_font_delegate_.set_params(params);
+ test_font_delegate_->set_params(params);
scoped_refptr<gfx::PlatformFontSkia> font(new gfx::PlatformFontSkia());
EXPECT_EQ(kTestFontName, font->GetFontName());
EXPECT_EQ(13, font->GetFontSize());
@@ -115,10 +115,10 @@ TEST_F(PlatformFontSkiaTest, DefaultFont) {
EXPECT_EQ(params.hinting, font->GetFontRenderParams().hinting);
// Drop the old default font and check that new settings are loaded.
- test_font_delegate_.set_family(kSymbolFontName);
- test_font_delegate_.set_size_pixels(15);
- test_font_delegate_.set_style(gfx::Font::ITALIC);
- test_font_delegate_.set_weight(gfx::Font::Weight::BOLD);
+ test_font_delegate_->set_family(kSymbolFontName);
+ test_font_delegate_->set_size_pixels(15);
+ test_font_delegate_->set_style(gfx::Font::ITALIC);
+ test_font_delegate_->set_weight(gfx::Font::Weight::BOLD);
PlatformFontSkia::ReloadDefaultFont();
scoped_refptr<gfx::PlatformFontSkia> font2(new gfx::PlatformFontSkia());
EXPECT_EQ(kSymbolFontName, font2->GetFontName());
@@ -126,6 +126,7 @@ TEST_F(PlatformFontSkiaTest, DefaultFont) {
EXPECT_NE(font2->GetStyle() & Font::ITALIC, 0);
EXPECT_EQ(gfx::Font::Weight::BOLD, font2->GetWeight());
}
+#endif // BUILDFLAG(IS_LINUX)
TEST(PlatformFontSkiaRenderParamsTest, DefaultFontRenderParams) {
scoped_refptr<PlatformFontSkia> default_font(new PlatformFontSkia());
diff --git a/chromium/ui/gfx/range/mojom/range_mojom_traits.h b/chromium/ui/gfx/range/mojom/range_mojom_traits.h
index 5db4501e6c8..381f0091bb5 100644
--- a/chromium/ui/gfx/range/mojom/range_mojom_traits.h
+++ b/chromium/ui/gfx/range/mojom/range_mojom_traits.h
@@ -13,8 +13,12 @@ namespace mojo {
template <>
struct StructTraits<gfx::mojom::RangeDataView, gfx::Range> {
- static uint32_t start(const gfx::Range& r) { return r.start(); }
- static uint32_t end(const gfx::Range& r) { return r.end(); }
+ static uint32_t start(const gfx::Range& r) {
+ return static_cast<uint32_t>(r.start());
+ }
+ static uint32_t end(const gfx::Range& r) {
+ return static_cast<uint32_t>(r.end());
+ }
static bool Read(gfx::mojom::RangeDataView data, gfx::Range* out) {
out->set_start(data.start());
out->set_end(data.end());
diff --git a/chromium/ui/gfx/range/mojom/range_mojom_traits_unittest.cc b/chromium/ui/gfx/range/mojom/range_mojom_traits_unittest.cc
index ba49cb82c2a..31392d66b4c 100644
--- a/chromium/ui/gfx/range/mojom/range_mojom_traits_unittest.cc
+++ b/chromium/ui/gfx/range/mojom/range_mojom_traits_unittest.cc
@@ -46,14 +46,17 @@ class RangeStructTraitsTest : public testing::Test,
} // namespace
TEST_F(RangeStructTraitsTest, Range) {
- const uint32_t start = 1234;
- const uint32_t end = 5678;
+ const size_t start = 1234;
+ const size_t end = 5678;
gfx::Range input(start, end);
mojo::Remote<mojom::RangeTraitsTestService> remote = GetTraitsTestRemote();
gfx::Range output;
remote->EchoRange(input, &output);
EXPECT_EQ(start, output.start());
EXPECT_EQ(end, output.end());
+
+ remote->EchoRange(gfx::Range::InvalidRange(), &output);
+ EXPECT_FALSE(output.IsValid());
}
TEST_F(RangeStructTraitsTest, RangeF) {
diff --git a/chromium/ui/gfx/range/range.cc b/chromium/ui/gfx/range/range.cc
index 699040e7bae..e2a194b6291 100644
--- a/chromium/ui/gfx/range/range.cc
+++ b/chromium/ui/gfx/range/range.cc
@@ -6,12 +6,13 @@
#include <inttypes.h>
+#include "base/format_macros.h"
#include "base/strings/stringprintf.h"
namespace gfx {
std::string Range::ToString() const {
- return base::StringPrintf("{%" PRIu32 ",%" PRIu32 "}", start(), end());
+ return base::StringPrintf("{%" PRIuS ",%" PRIuS "}", start(), end());
}
std::ostream& operator<<(std::ostream& os, const Range& range) {
diff --git a/chromium/ui/gfx/range/range.h b/chromium/ui/gfx/range/range.h
index b3708e41f7d..c2aceb22241 100644
--- a/chromium/ui/gfx/range/range.h
+++ b/chromium/ui/gfx/range/range.h
@@ -13,6 +13,7 @@
#include <ostream>
#include <string>
+#include "base/numerics/safe_conversions.h"
#include "build/build_config.h"
#include "ui/gfx/range/gfx_range_export.h"
@@ -37,10 +38,12 @@ class GFX_RANGE_EXPORT Range {
constexpr Range() : Range(0) {}
// Initializes the range with a start and end.
- constexpr Range(uint32_t start, uint32_t end) : start_(start), end_(end) {}
+ constexpr Range(size_t start, size_t end)
+ : start_(base::checked_cast<uint32_t>(start)),
+ end_(base::checked_cast<uint32_t>(end)) {}
// Initializes the range with the same start and end positions.
- constexpr explicit Range(uint32_t position) : Range(position, position) {}
+ constexpr explicit Range(size_t position) : Range(position, position) {}
// Platform constructors.
#if BUILDFLAG(IS_APPLE)
@@ -52,27 +55,28 @@ class GFX_RANGE_EXPORT Range {
return Range(std::numeric_limits<uint32_t>::max());
}
- // Checks if the range is valid through comparison to InvalidRange().
+ // Checks if the range is valid through comparison to InvalidRange(). If this
+ // is not valid, you must not call start()/end().
constexpr bool IsValid() const { return *this != InvalidRange(); }
// Getters and setters.
- constexpr uint32_t start() const { return start_; }
- void set_start(uint32_t start) { start_ = start; }
+ constexpr size_t start() const { return start_; }
+ void set_start(size_t start) { start_ = base::checked_cast<uint32_t>(start); }
- constexpr uint32_t end() const { return end_; }
- void set_end(uint32_t end) { end_ = end; }
+ constexpr size_t end() const { return end_; }
+ void set_end(size_t end) { end_ = base::checked_cast<uint32_t>(end); }
// Returns the absolute value of the length.
- constexpr uint32_t length() const { return GetMax() - GetMin(); }
+ constexpr size_t length() const { return GetMax() - GetMin(); }
constexpr bool is_reversed() const { return start() > end(); }
constexpr bool is_empty() const { return start() == end(); }
// Returns the minimum and maximum values.
- constexpr uint32_t GetMin() const {
+ constexpr size_t GetMin() const {
return start() < end() ? start() : end();
}
- constexpr uint32_t GetMax() const {
+ constexpr size_t GetMax() const {
return start() > end() ? start() : end();
}
@@ -109,8 +113,8 @@ class GFX_RANGE_EXPORT Range {
// If they don't intersect, it returns an InvalidRange().
// The returned range is always empty or forward (never reversed).
constexpr Range Intersect(const Range& range) const {
- const uint32_t min = std::max(GetMin(), range.GetMin());
- const uint32_t max = std::min(GetMax(), range.GetMax());
+ const size_t min = std::max(GetMin(), range.GetMin());
+ const size_t max = std::min(GetMax(), range.GetMax());
return (min < max || Contains(range) || range.Contains(*this))
? Range(min, max)
: InvalidRange();
@@ -129,8 +133,7 @@ class GFX_RANGE_EXPORT Range {
private:
// Note: we use uint32_t instead of size_t because this struct is sent over
- // IPC which could span 32 & 64 bit processes. This is fine since text spans
- // shouldn't exceed UINT32_MAX even on 64 bit builds.
+ // IPC which could span 32 & 64 bit processes.
uint32_t start_;
uint32_t end_;
};
diff --git a/chromium/ui/gfx/range/range_mac.mm b/chromium/ui/gfx/range/range_mac.mm
index cc1aa1ee4e2..6818cd5fe3d 100644
--- a/chromium/ui/gfx/range/range_mac.mm
+++ b/chromium/ui/gfx/range/range_mac.mm
@@ -22,8 +22,6 @@ Range& Range::operator=(const NSRange& range) {
*this = InvalidRange();
} else {
set_start(range.location);
- // Don't overflow |end_|.
- DCHECK_LE(range.length, std::numeric_limits<size_t>::max() - start());
set_end(start() + range.length);
}
return *this;
diff --git a/chromium/ui/gfx/render_text.cc b/chromium/ui/gfx/render_text.cc
index 7fb46dbdee7..851249f8355 100644
--- a/chromium/ui/gfx/render_text.cc
+++ b/chromium/ui/gfx/render_text.cc
@@ -144,9 +144,15 @@ sk_sp<cc::PaintShader> CreateFadeShader(const FontList& font_list,
const SkPoint points[2] = { PointToSkPoint(text_rect.origin()),
PointToSkPoint(text_rect.top_right()) };
+ // TODO(crbug/1308932): Remove this helper vector colors4f and make all
+ // SkColor4f.
+ std::vector<SkColor4f> colors4f;
+ colors4f.reserve(colors.size());
+ for (auto& c : colors)
+ colors4f.push_back(SkColor4f::FromColor(c));
return cc::PaintShader::MakeLinearGradient(
- &points[0], &colors[0], &positions[0], static_cast<int>(colors.size()),
- SkTileMode::kClamp);
+ &points[0], &colors4f[0], &positions[0],
+ static_cast<int>(colors4f.size()), SkTileMode::kClamp);
}
// Converts a FontRenderParams::Hinting value to the corresponding
@@ -191,12 +197,14 @@ typename BreakList<T>::const_iterator IncrementBreakListIteratorToPosition(
const BreakList<T>& break_list,
typename BreakList<T>::const_iterator iter,
size_t position) {
- for (; iter != break_list.breaks().end(); ++iter) {
+ DCHECK_LT(position, break_list.max());
+ for (;;) {
+ CHECK(iter != break_list.breaks().end());
const Range range = break_list.GetRange(iter);
if (position >= range.start() && position < range.end())
- break;
+ return iter;
+ ++iter;
}
- return iter;
}
// Replaces the unicode control characters, control characters and PUA (Private
@@ -526,7 +534,7 @@ void RenderText::SetText(const std::u16string& text) {
if (directionality_mode_ == DIRECTIONALITY_FROM_TEXT)
text_direction_ = base::i18n::UNKNOWN_DIRECTION;
- obscured_reveal_index_ = -1;
+ obscured_reveal_index_ = absl::nullopt;
OnTextAttributeChanged();
}
@@ -534,7 +542,7 @@ void RenderText::AppendText(const std::u16string& text) {
text_ += text;
UpdateStyleLengths();
cached_bounds_and_offset_valid_ = false;
- obscured_reveal_index_ = -1;
+ obscured_reveal_index_ = absl::nullopt;
// Invalidate the cached text direction if it depends on the text contents.
if (directionality_mode_ == DIRECTIONALITY_FROM_TEXT)
@@ -572,20 +580,22 @@ void RenderText::SetFontList(const FontList& font_list) {
}
void RenderText::SetCursorEnabled(bool cursor_enabled) {
- cursor_enabled_ = cursor_enabled;
- cached_bounds_and_offset_valid_ = false;
+ if (cursor_enabled_ != cursor_enabled) {
+ cursor_enabled_ = cursor_enabled;
+ cached_bounds_and_offset_valid_ = false;
+ }
}
void RenderText::SetObscured(bool obscured) {
if (obscured != obscured_) {
obscured_ = obscured;
- obscured_reveal_index_ = -1;
+ obscured_reveal_index_ = absl::nullopt;
cached_bounds_and_offset_valid_ = false;
OnTextAttributeChanged();
}
}
-void RenderText::SetObscuredRevealIndex(int index) {
+void RenderText::SetObscuredRevealIndex(absl::optional<size_t> index) {
if (obscured_reveal_index_ != index) {
obscured_reveal_index_ = index;
cached_bounds_and_offset_valid_ = false;
@@ -609,8 +619,10 @@ void RenderText::SetMultiline(bool multiline) {
}
void RenderText::SetMaxLines(size_t max_lines) {
- max_lines_ = max_lines;
- OnDisplayTextAttributeChanged();
+ if (max_lines_ != max_lines) {
+ max_lines_ = max_lines;
+ OnDisplayTextAttributeChanged();
+ }
}
size_t RenderText::GetNumLines() {
@@ -778,7 +790,7 @@ void RenderText::MoveCursor(BreakType break_type,
bool RenderText::SetSelection(const SelectionModel& model) {
// Enforce valid selection model components.
- uint32_t text_length = static_cast<uint32_t>(text().length());
+ size_t text_length = text().length();
std::vector<Range> ranges = model.GetAllSelections();
for (auto& range : ranges) {
range = {std::min(range.start(), text_length),
@@ -804,7 +816,7 @@ bool RenderText::MoveCursorToPoint(const Point& point,
}
bool RenderText::SelectRange(const Range& range, bool primary) {
- uint32_t text_length = static_cast<uint32_t>(text().length());
+ size_t text_length = text().length();
Range sel(std::min(range.start(), text_length),
std::min(range.end(), text_length));
// Allow selection bounds at valid indices amid multi-character graphemes.
@@ -854,61 +866,61 @@ void RenderText::SetCompositionRange(const Range& composition_range) {
}
void RenderText::SetColor(SkColor value) {
- colors_.SetValue(value);
- OnLayoutTextAttributeChanged(false);
+ if (colors_.SetValue(value))
+ OnLayoutTextAttributeChanged(false);
}
void RenderText::ApplyColor(SkColor value, const Range& range) {
- colors_.ApplyValue(value, range);
- OnLayoutTextAttributeChanged(false);
+ if (colors_.ApplyValue(value, range))
+ OnLayoutTextAttributeChanged(false);
}
void RenderText::SetBaselineStyle(BaselineStyle value) {
- baselines_.SetValue(value);
- OnLayoutTextAttributeChanged(false);
+ if (baselines_.SetValue(value))
+ OnLayoutTextAttributeChanged(false);
}
void RenderText::ApplyBaselineStyle(BaselineStyle value, const Range& range) {
- baselines_.ApplyValue(value, range);
- OnLayoutTextAttributeChanged(false);
+ if (baselines_.ApplyValue(value, range))
+ OnLayoutTextAttributeChanged(false);
}
void RenderText::ApplyFontSizeOverride(int font_size_override,
const Range& range) {
- font_size_overrides_.ApplyValue(font_size_override, range);
- OnLayoutTextAttributeChanged(false);
+ if (font_size_overrides_.ApplyValue(font_size_override, range))
+ OnLayoutTextAttributeChanged(false);
}
void RenderText::SetStyle(TextStyle style, bool value) {
- styles_[style].SetValue(value);
-
- cached_bounds_and_offset_valid_ = false;
- // TODO(oshima|msw): Not all style change requires layout changes.
- // Consider optimizing based on the type of change.
- OnLayoutTextAttributeChanged(false);
+ if (styles_[style].SetValue(value)) {
+ cached_bounds_and_offset_valid_ = false;
+ // TODO(oshima|msw): Not all style change requires layout changes.
+ // Consider optimizing based on the type of change.
+ OnLayoutTextAttributeChanged(false);
+ }
}
void RenderText::ApplyStyle(TextStyle style, bool value, const Range& range) {
- styles_[style].ApplyValue(value, range);
-
- cached_bounds_and_offset_valid_ = false;
- // TODO(oshima|msw): Not all style change requires layout changes.
- // Consider optimizing based on the type of change.
- OnLayoutTextAttributeChanged(false);
+ if (styles_[style].ApplyValue(value, range)) {
+ cached_bounds_and_offset_valid_ = false;
+ // TODO(oshima|msw): Not all style change requires layout changes.
+ // Consider optimizing based on the type of change.
+ OnLayoutTextAttributeChanged(false);
+ }
}
void RenderText::SetWeight(Font::Weight weight) {
- weights_.SetValue(weight);
-
- cached_bounds_and_offset_valid_ = false;
- OnLayoutTextAttributeChanged(false);
+ if (weights_.SetValue(weight)) {
+ cached_bounds_and_offset_valid_ = false;
+ OnLayoutTextAttributeChanged(false);
+ }
}
void RenderText::ApplyWeight(Font::Weight weight, const Range& range) {
- weights_.ApplyValue(weight, range);
-
- cached_bounds_and_offset_valid_ = false;
- OnLayoutTextAttributeChanged(false);
+ if (weights_.ApplyValue(weight, range)) {
+ cached_bounds_and_offset_valid_ = false;
+ OnLayoutTextAttributeChanged(false);
+ }
}
bool RenderText::GetStyle(TextStyle style) const {
@@ -1538,8 +1550,8 @@ void RenderText::EnsureLayoutTextUpdated() const {
// Ensures the reveal index is at a codepoint boundary (e.g. not in a middle
// of a surrogate pairs).
size_t reveal_index = text_.size();
- if (obscured_reveal_index_ != -1) {
- reveal_index = base::checked_cast<size_t>(obscured_reveal_index_);
+ if (obscured_reveal_index_.has_value()) {
+ reveal_index = obscured_reveal_index_.value();
// Move |reveal_index| to the beginning of the surrogate pair, if needed.
if (reveal_index < text_.size())
U16_SET_CP_START(text_.data(), 0, reveal_index);
@@ -1680,7 +1692,6 @@ void RenderText::UpdateDisplayText(float text_width) {
static_cast<float>(display_rect_.width()),
elide_behavior_));
} else {
- bool was_elided = text_elided_;
text_elided_ = false;
display_text_.clear();
@@ -1705,12 +1716,7 @@ void RenderText::UpdateDisplayText(float text_width) {
Elide(text_to_elide, 0,
static_cast<float>(display_rect_.width()),
ELIDE_TAIL));
- // Have GetLineBreaks() re-calculate.
- line_breaks_.SetMax(0);
} else {
- // If elision changed, re-calculate.
- if (was_elided)
- line_breaks_.SetMax(0);
// Initial state above is fine.
return;
}
@@ -1720,26 +1726,6 @@ void RenderText::UpdateDisplayText(float text_width) {
display_text_.clear();
}
-const BreakList<size_t>& RenderText::GetLineBreaks() {
- if (line_breaks_.max() != 0)
- return line_breaks_;
-
- const std::u16string& layout_text = GetDisplayText();
- const size_t text_length = layout_text.length();
- line_breaks_.SetValue(0);
- line_breaks_.SetMax(text_length);
- base::i18n::BreakIterator iter(layout_text,
- base::i18n::BreakIterator::BREAK_LINE);
- const bool success = iter.Init();
- DCHECK(success);
- if (success) {
- do {
- line_breaks_.ApplyValue(iter.pos(), Range(iter.pos(), text_length));
- } while (iter.Advance());
- }
- return line_breaks_;
-}
-
Point RenderText::ToViewPoint(const PointF& point, size_t line) {
if (GetNumLines() == 1) {
return Point(base::ClampCeil(Clamp(point.x())),
@@ -1939,7 +1925,8 @@ int RenderText::GetLineContainingYCoord(float text_y) {
bool RenderText::RangeContainsCaret(const Range& range,
size_t caret_pos,
LogicalCursorDirection caret_affinity) {
- // NB: exploits unsigned wraparound (WG14/N1124 section 6.2.5 paragraph 9).
+ if (caret_pos == 0 && caret_affinity == CURSOR_BACKWARD)
+ return false;
size_t adjacent = (caret_affinity == CURSOR_BACKWARD) ?
caret_pos - 1 : caret_pos + 1;
return range.Contains(Range(caret_pos, adjacent));
@@ -2011,7 +1998,6 @@ void RenderText::OnTextAttributeChanged() {
layout_text_.clear();
display_text_.clear();
text_elided_ = false;
- line_breaks_.SetMax(0);
layout_text_up_to_date_ = false;
diff --git a/chromium/ui/gfx/render_text.h b/chromium/ui/gfx/render_text.h
index 983cba19002..d6e7a79fb9d 100644
--- a/chromium/ui/gfx/render_text.h
+++ b/chromium/ui/gfx/render_text.h
@@ -297,10 +297,10 @@ class GFX_EXPORT RenderText {
// Makes a char in obscured text at |index| to be revealed. |index| should be
// a UTF16 text index. If there is a previous revealed index, the previous one
- // is cleared and only the last set index will be revealed. If |index| is -1
- // or out of range, no char will be revealed. The revealed index is also
- // cleared when SetText or SetObscured is called.
- void SetObscuredRevealIndex(int index);
+ // is cleared and only the last set index will be revealed. If |index| is
+ // nullopt or out of range, no char will be revealed. The revealed index is
+ // also cleared when SetText or SetObscured is called.
+ void SetObscuredRevealIndex(absl::optional<size_t> index);
// For obscured (password) fields, the extra spacing between glyphs.
int obscured_glyph_spacing() const { return obscured_glyph_spacing_; }
@@ -768,9 +768,6 @@ class GFX_EXPORT RenderText {
// Update the display text.
void UpdateDisplayText(float text_width);
- // Returns display text positions that are suitable for breaking lines.
- const BreakList<size_t>& GetLineBreaks();
-
// Convert points from the text space to the view space. Handles the display
// area, display offset, application LTR/RTL mode and multiline. |line| is the
// index of the line in which |point| is found, and is required to be passed
@@ -971,7 +968,7 @@ class GFX_EXPORT RenderText {
// A flag to obscure actual text with asterisks for password fields.
bool obscured_ = false;
// The index at which the char should be revealed in the obscured text.
- int obscured_reveal_index_ = -1;
+ absl::optional<size_t> obscured_reveal_index_;
// The maximum length of text to display, 0 forgoes a hard limit.
size_t truncate_length_ = 0;
@@ -1038,9 +1035,6 @@ class GFX_EXPORT RenderText {
// Text shadows to be drawn.
ShadowValues shadows_;
- // A list of valid display text line break positions.
- BreakList<size_t> line_breaks_;
-
// Text shaping computed by EnsureLayout. This should be invalidated upon
// OnLayoutTextAttributeChanged and OnDisplayTextAttributeChanged calls.
std::unique_ptr<internal::ShapedText> shaped_text_;
diff --git a/chromium/ui/gfx/render_text_api_fuzzer.cc b/chromium/ui/gfx/render_text_api_fuzzer.cc
index 02a238b692f..38f7a3bf6e3 100644
--- a/chromium/ui/gfx/render_text_api_fuzzer.cc
+++ b/chromium/ui/gfx/render_text_api_fuzzer.cc
@@ -12,17 +12,16 @@
#include "base/logging.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/task_environment.h"
+#include "base/test/test_discardable_memory_allocator.h"
#include "base/test/test_timeouts.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "ui/gfx/canvas.h"
+#include "ui/gfx/font_util.h"
#include "ui/gfx/render_text.h"
-// TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is
-// complete.
-#if BUILDFLAG(IS_ANDROID) || \
- (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
-#include "base/test/test_discardable_memory_allocator.h"
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+#include "third_party/test_fonts/fontconfig/fontconfig_util_linux.h"
#endif
namespace {
@@ -41,25 +40,21 @@ struct Environment {
TestTimeouts::Initialize(),
base::test::TaskEnvironment::MainThreadType::UI)) {
logging::SetMinLogLevel(logging::LOG_FATAL);
-// TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is
-// complete.
-#if BUILDFLAG(IS_ANDROID) || \
- (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
+
// Some platforms require discardable memory to use bitmap fonts.
base::DiscardableMemoryAllocator::SetInstance(
&discardable_memory_allocator);
-#endif
+
CHECK(base::i18n::InitializeICU());
+
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+ test_fonts::SetUpFontconfig();
+#endif
+ gfx::InitializeFonts();
gfx::FontList::SetDefaultFontDescription(kFontDescription);
}
-// TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is
-// complete.
-#if BUILDFLAG(IS_ANDROID) || \
- (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
base::TestDiscardableMemoryAllocator discardable_memory_allocator;
-#endif
-
base::AtExitManager at_exit_manager;
base::test::TaskEnvironment task_environment;
};
@@ -164,24 +159,44 @@ gfx::WordWrapBehavior ConsumeWordWrap(FuzzedDataProvider* fdp) {
}
}
-gfx::ElideBehavior ConsumeElideBehavior(FuzzedDataProvider* fdp) {
- switch (fdp->ConsumeIntegralInRange(0, 7)) {
- case 0:
- return gfx::NO_ELIDE;
- case 1:
- return gfx::TRUNCATE;
- case 2:
- return gfx::ELIDE_HEAD;
- case 3:
- return gfx::ELIDE_MIDDLE;
- case 4:
- return gfx::ELIDE_TAIL;
- case 5:
- return gfx::ELIDE_EMAIL;
- case 6:
- return gfx::FADE_TAIL;
- default:
- return gfx::NO_ELIDE;
+gfx::ElideBehavior ConsumeElideBehavior(FuzzedDataProvider* fdp,
+ bool generate_only_homogeneous_styles) {
+ if (generate_only_homogeneous_styles) {
+ // The styles are guaranteed to be homogenous and it is safe to generate
+ // any eliding behavior.
+ switch (fdp->ConsumeIntegralInRange(0, 7)) {
+ case 0:
+ return gfx::NO_ELIDE;
+ case 1:
+ return gfx::TRUNCATE;
+ case 2:
+ return gfx::ELIDE_HEAD;
+ case 3:
+ return gfx::ELIDE_MIDDLE;
+ case 4:
+ return gfx::ELIDE_TAIL;
+ case 5:
+ return gfx::ELIDE_EMAIL;
+ case 6:
+ return gfx::FADE_TAIL;
+ default:
+ return gfx::NO_ELIDE;
+ }
+ } else {
+ // Only generate eliding behaviors that are compatible with non homogeneous
+ // text. Remove this when http://crbug.com/1085014 is fixed.
+ switch (fdp->ConsumeIntegralInRange(0, 4)) {
+ case 0:
+ return gfx::NO_ELIDE;
+ case 1:
+ return gfx::TRUNCATE;
+ case 2:
+ return gfx::ELIDE_TAIL;
+ case 3:
+ return gfx::FADE_TAIL;
+ default:
+ return gfx::NO_ELIDE;
+ }
}
}
@@ -211,6 +226,16 @@ gfx::Range ConsumeRange(FuzzedDataProvider* fdp, size_t max) {
return gfx::Range(start, end);
}
+// Eliding behaviors are not all fully supported by RenderText. Ignore
+// unsupported cases. This is causing clusterfuzz to fail with invalid
+// tests (http://crbug.com/1185542). Remove when https://crbug.com/1085014 is
+// fixed.
+bool DoesDisplayRangeSupportElideBehavior(const gfx::RenderText* render_text) {
+ const gfx::ElideBehavior behavior = render_text->elide_behavior();
+ return behavior != gfx::ELIDE_HEAD && behavior != gfx::ELIDE_MIDDLE &&
+ behavior != gfx::ELIDE_EMAIL;
+}
+
const int kMaxStringLength = 128;
} // anonymous namespace
@@ -223,6 +248,14 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
gfx::Canvas canvas;
FuzzedDataProvider fdp(data, size);
+ if (size == 0)
+ return 0;
+
+ // Eliding and Styles are not well supported by RenderText. DCHECKs are
+ // present in RenderText code to avoid any incorrect uses but the fuzzer
+ // should not generate them until full support (http://crbug.com/1283159).
+ const bool generate_only_homogeneous_styles = fdp.ConsumeBool();
+
while (fdp.remaining_bytes() != 0) {
const RenderTextAPI command = fdp.ConsumeEnum<RenderTextAPI>();
switch (command) {
@@ -283,7 +316,9 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
break;
case RenderTextAPI::kSetMultiline:
- render_text->SetMultiline(fdp.ConsumeBool());
+ if (generate_only_homogeneous_styles) {
+ render_text->SetMultiline(fdp.ConsumeBool());
+ }
break;
case RenderTextAPI::kSetMaxLines:
@@ -307,9 +342,11 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
break;
case RenderTextAPI::kApplyColor:
- render_text->ApplyColor(
- ConsumeSkColor(&fdp),
- ConsumeRange(&fdp, render_text->text().length()));
+ if (!generate_only_homogeneous_styles) {
+ render_text->ApplyColor(
+ ConsumeSkColor(&fdp),
+ ConsumeRange(&fdp, render_text->text().length()));
+ }
break;
case RenderTextAPI::kSetStyle:
@@ -317,9 +354,11 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
break;
case RenderTextAPI::kApplyStyle:
- render_text->ApplyStyle(
- ConsumeStyle(&fdp), fdp.ConsumeBool(),
- ConsumeRange(&fdp, render_text->text().length()));
+ if (!generate_only_homogeneous_styles) {
+ render_text->ApplyStyle(
+ ConsumeStyle(&fdp), fdp.ConsumeBool(),
+ ConsumeRange(&fdp, render_text->text().length()));
+ }
break;
case RenderTextAPI::kSetWeight:
@@ -327,9 +366,11 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
break;
case RenderTextAPI::kApplyWeight:
- render_text->ApplyWeight(
- ConsumeWeight(&fdp),
- ConsumeRange(&fdp, render_text->text().length()));
+ if (!generate_only_homogeneous_styles) {
+ render_text->ApplyWeight(
+ ConsumeWeight(&fdp),
+ ConsumeRange(&fdp, render_text->text().length()));
+ }
break;
case RenderTextAPI::kSetDirectionalityMode:
@@ -337,7 +378,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
break;
case RenderTextAPI::kSetElideBehavior:
- render_text->SetElideBehavior(ConsumeElideBehavior(&fdp));
+ render_text->SetElideBehavior(
+ ConsumeElideBehavior(&fdp, generate_only_homogeneous_styles));
break;
case RenderTextAPI::kIsGraphemeBoundary:
@@ -365,10 +407,18 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
fdp.ConsumeIntegralInRange<int>(0, 30)));
break;
case RenderTextAPI::kGetSubstringBounds:
+ // RenderText doesn't support that case (https://crbug.com/1085014).
+ if (!DoesDisplayRangeSupportElideBehavior(render_text.get()))
+ break;
+
render_text->GetSubstringBounds(
ConsumeRange(&fdp, render_text->text().length()));
break;
case RenderTextAPI::kGetCursorSpan:
+ // RenderText doesn't support that case (https://crbug.com/1085014).
+ if (!DoesDisplayRangeSupportElideBehavior(render_text.get()))
+ break;
+
render_text->GetCursorSpan(
ConsumeRange(&fdp, render_text->text().length()));
break;
diff --git a/chromium/ui/gfx/render_text_fuzzer.cc b/chromium/ui/gfx/render_text_fuzzer.cc
index dc2a26c10fb..de1d7aec058 100644
--- a/chromium/ui/gfx/render_text_fuzzer.cc
+++ b/chromium/ui/gfx/render_text_fuzzer.cc
@@ -11,8 +11,13 @@
#include "base/test/test_timeouts.h"
#include "build/build_config.h"
#include "ui/gfx/canvas.h"
+#include "ui/gfx/font_util.h"
#include "ui/gfx/render_text.h"
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+#include "third_party/test_fonts/fontconfig/fontconfig_util_linux.h"
+#endif
+
namespace {
#if BUILDFLAG(IS_WIN)
@@ -31,6 +36,11 @@ struct Environment {
logging::SetMinLogLevel(logging::LOG_FATAL);
CHECK(base::i18n::InitializeICU());
+
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+ test_fonts::SetUpFontconfig();
+#endif
+ gfx::InitializeFonts();
gfx::FontList::SetDefaultFontDescription(kFontDescription);
}
diff --git a/chromium/ui/gfx/render_text_harfbuzz.cc b/chromium/ui/gfx/render_text_harfbuzz.cc
index cd779904454..42d798e9b85 100644
--- a/chromium/ui/gfx/render_text_harfbuzz.cc
+++ b/chromium/ui/gfx/render_text_harfbuzz.cc
@@ -413,7 +413,6 @@ class HarfBuzzLineBreaker {
float glyph_height_for_test,
WordWrapBehavior word_wrap_behavior,
const std::u16string& text,
- const BreakList<size_t>* words,
const internal::TextRunList& run_list)
: max_width_((max_width == 0) ? SK_ScalarMax : SkIntToScalar(max_width)),
min_baseline_(min_baseline),
@@ -421,7 +420,6 @@ class HarfBuzzLineBreaker {
glyph_height_for_test_(glyph_height_for_test),
word_wrap_behavior_(word_wrap_behavior),
text_(text),
- words_(words),
run_list_(run_list),
max_descent_(0),
max_ascent_(0),
@@ -448,10 +446,17 @@ class HarfBuzzLineBreaker {
// Constructs multiple lines for |text_| based on words iteration approach.
void ConstructMultiLines() {
- DCHECK(words_);
- for (auto iter = words_->breaks().begin(); iter != words_->breaks().end();
- iter++) {
- const Range word_range = words_->GetRange(iter);
+ // Get an iterator that pass through valid line breaking positions.
+ // See https://www.unicode.org/reports/tr14/tr14-11.html for lines breaking.
+ base::i18n::BreakIterator words(text_,
+ base::i18n::BreakIterator::BREAK_LINE);
+ const bool success = words.Init();
+ DCHECK(success);
+ if (!success)
+ return;
+
+ while (words.Advance()) {
+ const Range word_range = Range(words.prev(), words.pos());
std::vector<internal::LineSegment> word_segments;
SkScalar word_width = GetWordWidth(word_range, &word_segments);
@@ -674,8 +679,7 @@ class HarfBuzzLineBreaker {
}
const size_t valid_end_pos = std::max(
- segment.char_range.start(),
- static_cast<uint32_t>(FindValidBoundaryBefore(text_, end_pos)));
+ segment.char_range.start(), FindValidBoundaryBefore(text_, end_pos));
if (end_pos != valid_end_pos) {
end_pos = valid_end_pos;
width = run.GetGlyphWidthForCharRange(
@@ -687,9 +691,8 @@ class HarfBuzzLineBreaker {
// not separate surrogate pair or combining characters.
// See RenderTextHarfBuzzTest.Multiline_MinWidth for an example.
if (width == 0 && available_width_ == max_width_) {
- end_pos = std::min(
- segment.char_range.end(),
- static_cast<uint32_t>(FindValidBoundaryAfter(text_, end_pos + 1)));
+ end_pos = std::min(segment.char_range.end(),
+ FindValidBoundaryAfter(text_, end_pos + 1));
}
return end_pos;
@@ -699,7 +702,6 @@ class HarfBuzzLineBreaker {
// segments based on its runs.
SkScalar GetWordWidth(const Range& word_range,
std::vector<internal::LineSegment>* segments) const {
- DCHECK(words_);
if (word_range.is_empty() || segments == nullptr)
return 0;
size_t run_start_index = run_list_.GetRunIndexAt(word_range.start());
@@ -745,7 +747,6 @@ class HarfBuzzLineBreaker {
const float glyph_height_for_test_;
const WordWrapBehavior word_wrap_behavior_;
const std::u16string& text_;
- const raw_ptr<const BreakList<size_t>> words_;
const internal::TextRunList& run_list_;
// Stores the resulting lines.
@@ -1705,7 +1706,7 @@ void RenderTextHarfBuzz::EnsureLayout() {
display_rect().width(),
DetermineBaselineCenteringText(height, font_list()), height,
glyph_height_for_test_, word_wrap_behavior(), GetDisplayText(),
- multiline() ? &GetLineBreaks() : nullptr, *run_list);
+ *run_list);
if (multiline())
line_breaker.ConstructMultiLines();
@@ -1713,7 +1714,9 @@ void RenderTextHarfBuzz::EnsureLayout() {
line_breaker.ConstructSingleLine();
std::vector<internal::Line> lines;
line_breaker.FinalizeLines(&lines, &total_size_);
- if (multiline() && max_lines()) {
+ // In multiline, only ELIDE_TAIL is supported. max_lines_ is not used
+ // otherwise.
+ if (multiline() && max_lines() && elide_behavior() == ELIDE_TAIL) {
// TODO(crbug.com/866720): no more than max_lines() should be rendered.
// Remove the IsHomogeneous() condition for the following DCHECK when the
// bug is fixed.
diff --git a/chromium/ui/gfx/render_text_unittest.cc b/chromium/ui/gfx/render_text_unittest.cc
index fe40f1c6d2c..ab7dfc85ddc 100644
--- a/chromium/ui/gfx/render_text_unittest.cc
+++ b/chromium/ui/gfx/render_text_unittest.cc
@@ -511,12 +511,14 @@ class RenderTextTest : public testing::Test {
size_t logical_index = run_list->visual_to_logical(i);
const internal::TextRunHarfBuzz& run = *run_list->runs()[logical_index];
if (run.range.length() == 1) {
- result.append(base::StringPrintf("[%d]", run.range.start()));
+ result.append(base::StringPrintf("[%" PRIuS "]", run.range.start()));
} else if (run.font_params.is_rtl) {
- result.append(base::StringPrintf("[%d<-%d]", run.range.end() - 1,
+ result.append(base::StringPrintf("[%" PRIuS "<-%" PRIuS "]",
+ run.range.end() - 1,
run.range.start()));
} else {
- result.append(base::StringPrintf("[%d->%d]", run.range.start(),
+ result.append(base::StringPrintf("[%" PRIuS "->%" PRIuS "]",
+ run.range.start(),
run.range.end() - 1));
}
}
@@ -1070,7 +1072,7 @@ TEST_F(RenderTextTest, SelectWithTranslucentBackground) {
SkImageInfo::MakeN32Premul(kCanvasSize.width(), kCanvasSize.height()));
cc::SkiaPaintCanvas paint_canvas(bitmap);
Canvas canvas(&paint_canvas, 1.0f);
- paint_canvas.clear(SK_ColorWHITE);
+ paint_canvas.clear(SkColors::kWhite);
SetGlyphWidth(kGlyphWidth);
RenderText* render_text = GetRenderText();
@@ -1320,7 +1322,7 @@ TEST_F(RenderTextTest, RevealObscuredText) {
render_text->GetDisplayText());
// Invalid reveal index.
- render_text->RenderText::SetObscuredRevealIndex(-1);
+ render_text->RenderText::SetObscuredRevealIndex(absl::nullopt);
EXPECT_EQ(no_seuss, render_text->GetDisplayText());
render_text->RenderText::SetObscuredRevealIndex(seuss.length() + 1);
EXPECT_EQ(no_seuss, render_text->GetDisplayText());
@@ -7423,7 +7425,7 @@ TEST_F(RenderTextTest, DISABLED_TextDoesntClip) {
render_text->SetColor(SK_ColorBLACK);
for (auto* string : kTestStrings) {
- paint_canvas.clear(SK_ColorWHITE);
+ paint_canvas.clear(SkColors::kWhite);
render_text->SetText(base::UTF8ToUTF16(string));
render_text->ApplyBaselineStyle(SUPERSCRIPT, Range(1, 2));
render_text->ApplyBaselineStyle(SUPERIOR, Range(3, 4));
@@ -7494,7 +7496,7 @@ TEST_F(RenderTextTest, DISABLED_TextDoesClip) {
render_text->SetColor(SK_ColorBLACK);
for (auto* string : kTestStrings) {
- paint_canvas.clear(SK_ColorWHITE);
+ paint_canvas.clear(SkColors::kWhite);
render_text->SetText(base::UTF8ToUTF16(string));
const Size string_size = render_text->GetStringSize();
int fake_width = string_size.width() / 2;
@@ -8565,8 +8567,7 @@ TEST_F(RenderTextTest, Clusterfuzz_Issue_1298286) {
gfx::FontList font_list;
gfx::Rect field(2119635455, font_list.GetHeight());
- std::unique_ptr<gfx::RenderText> render_text =
- gfx::RenderText::CreateRenderText();
+ RenderText* render_text = GetRenderText();
render_text->SetFontList(font_list);
render_text->SetHorizontalAlignment(ALIGN_RIGHT);
render_text->SetDirectionalityMode(DIRECTIONALITY_FROM_UI);
@@ -8574,7 +8575,7 @@ TEST_F(RenderTextTest, Clusterfuzz_Issue_1298286) {
render_text->SetDisplayRect(field);
render_text->SetCursorEnabled(true);
- gfx::test::RenderTextTestApi render_text_test_api(render_text.get());
+ gfx::test::RenderTextTestApi render_text_test_api(render_text);
render_text_test_api.SetGlyphWidth(2016371456);
EXPECT_FALSE(render_text->multiline());
@@ -8595,8 +8596,7 @@ TEST_F(RenderTextTest, Clusterfuzz_Issue_1299054) {
gfx::FontList font_list;
gfx::Rect field(-1334808765, font_list.GetHeight());
- std::unique_ptr<gfx::RenderText> render_text =
- gfx::RenderText::CreateRenderText();
+ RenderText* render_text = GetRenderText();
render_text->SetFontList(font_list);
render_text->SetHorizontalAlignment(ALIGN_CENTER);
render_text->SetDirectionalityMode(DIRECTIONALITY_FROM_TEXT);
@@ -8604,7 +8604,7 @@ TEST_F(RenderTextTest, Clusterfuzz_Issue_1299054) {
render_text->SetDisplayRect(field);
render_text->SetCursorEnabled(false);
- gfx::test::RenderTextTestApi render_text_test_api(render_text.get());
+ gfx::test::RenderTextTestApi render_text_test_api(render_text);
render_text_test_api.SetGlyphWidth(1778384896);
const Vector2d& offset = render_text->GetUpdatedDisplayOffset();
@@ -8622,4 +8622,15 @@ TEST_F(RenderTextTest, Clusterfuzz_Issue_1287804) {
EXPECT_EQ(RangeF(0, 0), render_text->GetCursorSpan(Range(0, 0)));
}
+TEST_F(RenderTextTest, Clusterfuzz_Issue_1193815) {
+ RenderText* render_text = GetRenderText();
+ gfx::FontList font_list;
+ render_text->SetFontList(font_list);
+ render_text->Draw(canvas());
+ render_text->SetText(u"F\r");
+ render_text->SetMaxLines(1);
+ render_text->SetMultiline(true);
+ render_text->Draw(canvas());
+}
+
} // namespace gfx
diff --git a/chromium/ui/gfx/selection_model.cc b/chromium/ui/gfx/selection_model.cc
index a792731f0fc..98d557c26c9 100644
--- a/chromium/ui/gfx/selection_model.cc
+++ b/chromium/ui/gfx/selection_model.cc
@@ -66,7 +66,7 @@ std::string SelectionModel::ToString() const {
for (auto selection : secondary_selections()) {
str += ",";
if (selection.is_empty())
- base::StringAppendF(&str, "%" PRIu32, selection.end());
+ base::StringAppendF(&str, "%" PRIuS, selection.end());
else
str += selection.ToString();
}
diff --git a/chromium/ui/gfx/skia_font_delegate.cc b/chromium/ui/gfx/skia_font_delegate.cc
deleted file mode 100644
index f7c24c5f5b8..00000000000
--- a/chromium/ui/gfx/skia_font_delegate.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/gfx/skia_font_delegate.h"
-
-namespace {
-
-gfx::SkiaFontDelegate* g_skia_font_delegate = 0;
-
-} // namespace
-
-namespace gfx {
-
-void SkiaFontDelegate::SetInstance(SkiaFontDelegate* instance) {
- g_skia_font_delegate = instance;
-}
-
-const SkiaFontDelegate* SkiaFontDelegate::instance() {
- return g_skia_font_delegate;
-}
-
-} // namespace gfx
diff --git a/chromium/ui/gfx/skia_font_delegate.h b/chromium/ui/gfx/skia_font_delegate.h
deleted file mode 100644
index 05636e98fab..00000000000
--- a/chromium/ui/gfx/skia_font_delegate.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_GFX_SKIA_FONT_DELEGATE_H_
-#define UI_GFX_SKIA_FONT_DELEGATE_H_
-
-#include <memory>
-#include <string>
-
-#include "ui/gfx/font_render_params.h"
-#include "ui/gfx/gfx_export.h"
-
-namespace gfx {
-
-// Allows a Linux platform-specific overriding of font preferences.
-class GFX_EXPORT SkiaFontDelegate {
- public:
- virtual ~SkiaFontDelegate() {}
-
- // Sets the dynamically loaded singleton that provides font preferences.
- // This pointer is not owned, and if this method is called a second time,
- // the first instance is not deleted.
- static void SetInstance(SkiaFontDelegate* instance);
-
- // Returns a SkiaFontDelegate instance for the toolkit used in
- // the user's desktop environment.
- //
- // Can return NULL, in case no toolkit has been set. (For example, if we're
- // running with the "--ash" flag.)
- static const SkiaFontDelegate* instance();
-
- // Returns the default font rendering settings.
- virtual FontRenderParams GetDefaultFontRenderParams() const = 0;
-
- // Returns details about the default UI font. |style_out| holds a bitfield of
- // gfx::Font::Style values.
- virtual void GetDefaultFontDescription(
- std::string* family_out,
- int* size_pixels_out,
- int* style_out,
- Font::Weight* weight_out,
- FontRenderParams* params_out) const = 0;
-};
-
-} // namespace gfx
-
-#endif // UI_GFX_SKIA_FONT_DELEGATE_H_
diff --git a/chromium/ui/gfx/skia_paint_util.cc b/chromium/ui/gfx/skia_paint_util.cc
index 7bc2d44cb49..b25b305dae3 100644
--- a/chromium/ui/gfx/skia_paint_util.cc
+++ b/chromium/ui/gfx/skia_paint_util.cc
@@ -61,7 +61,9 @@ sk_sp<cc::PaintShader> CreateGradientShader(const gfx::Point& start_point,
const gfx::Point& end_point,
SkColor start_color,
SkColor end_color) {
- SkColor grad_colors[2] = {start_color, end_color};
+ // TODO(crbug/1308932): Remove FromColor and make all SkColor4f.
+ SkColor4f grad_colors[2] = {SkColor4f::FromColor(start_color),
+ SkColor4f::FromColor(end_color)};
SkPoint grad_points[2] = {gfx::PointToSkPoint(start_point),
gfx::PointToSkPoint(end_point)};
diff --git a/chromium/ui/gfx/swap_result.h b/chromium/ui/gfx/swap_result.h
index 39a62d54e92..03e50112c7f 100644
--- a/chromium/ui/gfx/swap_result.h
+++ b/chromium/ui/gfx/swap_result.h
@@ -41,15 +41,13 @@ struct SwapTimings {
// dicontinuities in associated UMA data.
base::TimeTicks swap_end;
- // When Display Compositor thread scheduled work to GPU Thread. For GLRenderer
- // it's when InProcessCommandBuffer::Flush() happens, for SkiaRenderer it's
- // PostTask time for FinishPaintRenderPass or SwapBuffers whichever comes
- // first.
+ // When Display Compositor thread scheduled work to GPU Thread. For
+ // SkiaRenderer it's PostTask time for FinishPaintRenderPass or SwapBuffers
+ // whichever comes first.
base::TimeTicks viz_scheduled_draw;
// When GPU thread started draw submitted by Display Compositor thread. For
- // GLRenderer it's InProcessCommandBuffer::FlushOnGpuThread, for SkiaRenderer
- // it's FinishPaintRenderPass/SwapBuffers.
+ // SkiaRenderer it's FinishPaintRenderPass/SwapBuffers.
base::TimeTicks gpu_started_draw;
// When GPU scheduler removed the last required dependency.
diff --git a/chromium/ui/gfx/win/hwnd_util.cc b/chromium/ui/gfx/win/hwnd_util.cc
index b7ac93e6287..258a9844ef5 100644
--- a/chromium/ui/gfx/win/hwnd_util.cc
+++ b/chromium/ui/gfx/win/hwnd_util.cc
@@ -4,6 +4,7 @@
#include "ui/gfx/win/hwnd_util.h"
+#include <dwmapi.h> // DWMWA_CLOAKED
#include <windows.h>
#include "base/debug/gdi_debug_util_win.h"
@@ -114,6 +115,13 @@ void* GetWindowUserData(HWND hwnd) {
return reinterpret_cast<void*>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
}
+bool IsWindowCloaked(HWND hwnd) {
+ BOOL is_cloaked = FALSE;
+ return SUCCEEDED(DwmGetWindowAttribute(hwnd, DWMWA_CLOAKED, &is_cloaked,
+ sizeof(is_cloaked))) &&
+ is_cloaked;
+}
+
absl::optional<bool> IsWindowOnCurrentVirtualDesktop(
HWND window,
Microsoft::WRL::ComPtr<IVirtualDesktopManager> virtual_desktop_manager) {
diff --git a/chromium/ui/gfx/win/hwnd_util.h b/chromium/ui/gfx/win/hwnd_util.h
index 06529229c44..a17c5a7943d 100644
--- a/chromium/ui/gfx/win/hwnd_util.h
+++ b/chromium/ui/gfx/win/hwnd_util.h
@@ -33,6 +33,11 @@ GFX_EXPORT void* GetWindowUserData(HWND hwnd);
// of its children.
GFX_EXPORT bool DoesWindowBelongToActiveWindow(HWND window);
+// Returns true if the specified window is cloaked. Windows 10 and later
+// have cloaked windows which are windows with WS_VISIBLE attribute but not
+// displayed.
+GFX_EXPORT bool IsWindowCloaked(HWND hwnd);
+
// Returns true if `window` is on the current virtual desktop, false if isn't,
// and absl::nullopt if a COM method fails. Since this calls COM methods,
// it can only be called from a COM thread.
diff --git a/chromium/ui/gfx/x/connection.h b/chromium/ui/gfx/x/connection.h
index 57c14b3d2d9..a21e84a5ca7 100644
--- a/chromium/ui/gfx/x/connection.h
+++ b/chromium/ui/gfx/x/connection.h
@@ -9,6 +9,7 @@
#include "base/component_export.h"
#include "base/containers/circular_deque.h"
#include "base/containers/flat_map.h"
+#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "base/sequence_checker.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
@@ -261,7 +262,7 @@ class COMPONENT_EXPORT(X11) Connection : public XProto,
// The response must already have been obtained using WaitForResponse().
void TakeResponse(RawReply* reply, std::unique_ptr<Error>* error);
- Connection* connection = nullptr;
+ raw_ptr<Connection, DanglingUntriaged> connection = nullptr;
SequenceType sequence = 0;
bool generates_reply = false;
const char* request_name_for_tracing = nullptr;
@@ -325,7 +326,7 @@ class COMPONENT_EXPORT(X11) Connection : public XProto,
uint32_t GenerateIdImpl();
- xcb_connection_t* connection_ = nullptr;
+ raw_ptr<xcb_connection_t, DanglingUntriaged> connection_ = nullptr;
std::unique_ptr<XlibDisplay> xlib_display_;
bool synchronous_ = false;
@@ -336,9 +337,9 @@ class COMPONENT_EXPORT(X11) Connection : public XProto,
std::string display_string_;
int default_screen_id_ = 0;
Setup setup_;
- Screen* default_screen_ = nullptr;
- Depth* default_root_depth_ = nullptr;
- VisualType* default_root_visual_ = nullptr;
+ raw_ptr<Screen> default_screen_ = nullptr;
+ raw_ptr<Depth> default_root_depth_ = nullptr;
+ raw_ptr<VisualType> default_root_visual_ = nullptr;
base::flat_map<VisualId, VisualInfo> default_screen_visuals_;
@@ -349,7 +350,7 @@ class COMPONENT_EXPORT(X11) Connection : public XProto,
base::ObserverList<EventObserver>::Unchecked event_observers_;
// The Event currently being dispatched, or nullptr if there is none.
- const Event* dispatching_event_ = nullptr;
+ raw_ptr<const Event> dispatching_event_ = nullptr;
base::circular_deque<Request> requests_;
// The sequence ID of requests_.front(), or if |requests_| is empty, then the
diff --git a/chromium/ui/gfx/x/event.h b/chromium/ui/gfx/x/event.h
index dd2335149e4..66e611e5060 100644
--- a/chromium/ui/gfx/x/event.h
+++ b/chromium/ui/gfx/x/event.h
@@ -9,6 +9,7 @@
#include <utility>
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted_memory.h"
#include "base/memory/scoped_refptr.h"
#include "ui/gfx/x/xproto.h"
@@ -54,7 +55,7 @@ class COMPONENT_EXPORT(X11) Event {
template <typename T>
T* As() {
if (type_id_ == T::type_id)
- return reinterpret_cast<T*>(event_);
+ return reinterpret_cast<T*>(event_.get());
return nullptr;
}
@@ -90,11 +91,11 @@ class COMPONENT_EXPORT(X11) Event {
// XProto event state.
int type_id_ = 0;
void (*deleter_)(void*) = nullptr;
- void* event_ = nullptr;
+ raw_ptr<void, DanglingUntriaged> event_ = nullptr;
// This member points to a field in |event_|, or may be nullptr if there's no
// associated window for the event. It's owned by |event_|, not us.
- Window* window_ = nullptr;
+ raw_ptr<Window, DanglingUntriaged> window_ = nullptr;
};
} // namespace x11
diff --git a/chromium/ui/gfx/x/keyboard_state.cc b/chromium/ui/gfx/x/keyboard_state.cc
index 147b6c0668e..7c7162ee1d1 100644
--- a/chromium/ui/gfx/x/keyboard_state.cc
+++ b/chromium/ui/gfx/x/keyboard_state.cc
@@ -5,6 +5,7 @@
#include "ui/gfx/x/keyboard_state.h"
#include "base/i18n/case_conversion.h"
+#include "base/memory/raw_ptr.h"
#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/future.h"
#include "ui/gfx/x/keysyms/keysyms.h"
@@ -84,7 +85,7 @@ class CoreKeyboardState : public KeyboardState {
&mode_switch_, &num_lock_);
}
- Connection* const connection_;
+ const raw_ptr<Connection> connection_;
GetKeyboardMappingReply keyboard_mapping_;
uint16_t lock_meaning_ = 0;
uint8_t mode_switch_ = 0;
@@ -124,7 +125,7 @@ class XkbKeyboardState : public KeyboardState {
map_ = std::move(*response.reply);
}
- Connection* const connection_;
+ const raw_ptr<Connection> connection_;
Xkb::GetMapReply map_;
};
diff --git a/chromium/ui/gfx/x/property_cache.h b/chromium/ui/gfx/x/property_cache.h
index 1004b07626a..90be1739cfa 100644
--- a/chromium/ui/gfx/x/property_cache.h
+++ b/chromium/ui/gfx/x/property_cache.h
@@ -9,6 +9,7 @@
#include "base/component_export.h"
#include "base/containers/flat_map.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted_memory.h"
#include "base/memory/weak_ptr.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
@@ -72,7 +73,7 @@ class COMPONENT_EXPORT(X11) PropertyCache : public EventObserver {
void OnGetPropertyResponse(PropertyValue* value,
GetPropertyResponse response);
- Connection* connection_;
+ raw_ptr<Connection> connection_;
Window window_;
XScopedEventSelector event_selector_;
base::flat_map<Atom, PropertyValue> properties_;
diff --git a/chromium/ui/gfx/x/property_cache_unittest.cc b/chromium/ui/gfx/x/property_cache_unittest.cc
index ffc39d6d5e4..a464cde6b56 100644
--- a/chromium/ui/gfx/x/property_cache_unittest.cc
+++ b/chromium/ui/gfx/x/property_cache_unittest.cc
@@ -6,6 +6,7 @@
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/x/x11_atom_cache.h"
#include "ui/gfx/x/xproto.h"
@@ -39,7 +40,7 @@ class PropertyCacheTest : public testing::Test {
connection_ = nullptr;
}
- Connection* connection_ = nullptr;
+ raw_ptr<Connection> connection_ = nullptr;
Window window_ = Window::None;
};
diff --git a/chromium/ui/gfx/x/scoped_ignore_errors.h b/chromium/ui/gfx/x/scoped_ignore_errors.h
index baa48b5fd5a..96fc78a1f4e 100644
--- a/chromium/ui/gfx/x/scoped_ignore_errors.h
+++ b/chromium/ui/gfx/x/scoped_ignore_errors.h
@@ -6,6 +6,7 @@
#define UI_GFX_X_SCOPED_IGNORE_ERRORS_H_
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
#include "ui/gfx/x/connection.h"
namespace x11 {
@@ -17,7 +18,7 @@ class COMPONENT_EXPORT(X11) ScopedIgnoreErrors {
~ScopedIgnoreErrors();
private:
- Connection* const connection_;
+ const raw_ptr<Connection> connection_;
Connection::ErrorHandler old_error_handler_;
};
diff --git a/chromium/ui/gfx/x/window_cache.h b/chromium/ui/gfx/x/window_cache.h
index 2d11968d962..fa6c0bd59fa 100644
--- a/chromium/ui/gfx/x/window_cache.h
+++ b/chromium/ui/gfx/x/window_cache.h
@@ -12,6 +12,7 @@
#include "base/component_export.h"
#include "base/containers/circular_deque.h"
#include "base/containers/flat_set.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/geometry/insets.h"
@@ -36,7 +37,7 @@ class ScopedShapeEventSelector {
~ScopedShapeEventSelector();
private:
- Connection* const connection_;
+ const raw_ptr<Connection> connection_;
const Window window_;
};
@@ -150,7 +151,7 @@ class COMPONENT_EXPORT(X11) WindowCache : public EventObserver {
static WindowCache* instance_;
- Connection* const connection_;
+ const raw_ptr<Connection> connection_;
const Window root_;
const Atom gtk_frame_extents_;
std::unique_ptr<XScopedEventSelector> root_events_;
diff --git a/chromium/ui/gfx/x/window_cache_unittest.cc b/chromium/ui/gfx/x/window_cache_unittest.cc
index c88dbfd5c28..0fbd304e342 100644
--- a/chromium/ui/gfx/x/window_cache_unittest.cc
+++ b/chromium/ui/gfx/x/window_cache_unittest.cc
@@ -4,6 +4,7 @@
#include "ui/gfx/x/window_cache.h"
+#include "base/memory/raw_ptr.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/x/connection.h"
@@ -61,7 +62,7 @@ class WindowCacheTest : public testing::Test {
connection_ = nullptr;
}
- Connection* connection_;
+ raw_ptr<Connection> connection_;
Window root_container_ = Window::None;
Window root_ = Window::None;
std::unique_ptr<WindowCache> cache_;
diff --git a/chromium/ui/gfx/x/x11_atom_cache.h b/chromium/ui/gfx/x/x11_atom_cache.h
index 3035f42691a..14bd3fa736e 100644
--- a/chromium/ui/gfx/x/x11_atom_cache.h
+++ b/chromium/ui/gfx/x/x11_atom_cache.h
@@ -9,6 +9,7 @@
#include <string>
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
#include "ui/gfx/x/xproto.h"
namespace base {
@@ -47,7 +48,7 @@ class COMPONENT_EXPORT(X11) X11AtomCache {
// On failure, None is returned.
Atom GetAtom(const std::string&) const;
- Connection* connection_;
+ raw_ptr<Connection> connection_;
// Using std::map, as it is possible for thousands of atoms to be registered.
mutable std::map<std::string, Atom> cached_atoms_;
diff --git a/chromium/ui/gfx/x/xlib_support.cc b/chromium/ui/gfx/x/xlib_support.cc
index 281c318287b..aa362ed1193 100644
--- a/chromium/ui/gfx/x/xlib_support.cc
+++ b/chromium/ui/gfx/x/xlib_support.cc
@@ -32,7 +32,7 @@ XlibXcbLoader* GetXlibXcbLoader() {
} // namespace
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
void InitXlib() {
auto* xlib_loader = GetXlibLoader();
if (xlib_loader->loaded())
@@ -53,17 +53,17 @@ void InitXlib() {
SetXlibErrorHandler();
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
void SetXlibErrorHandler() {
GetXlibLoader()->XSetErrorHandler(XlibErrorHandler);
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
void XlibFree(void* data) {
GetXlibLoader()->XFree(data);
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
XlibDisplay::XlibDisplay(const std::string& address) {
InitXlib();
@@ -71,7 +71,7 @@ XlibDisplay::XlibDisplay(const std::string& address) {
: address.c_str());
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
XlibDisplay::~XlibDisplay() {
if (!display_)
return;
@@ -81,10 +81,12 @@ XlibDisplay::~XlibDisplay() {
// events, they will just queue up and leak memory. This check makes sure
// |display_| never had any pending events before it is closed.
CHECK(!loader->XPending(display_));
- loader->XCloseDisplay(display_);
+ // ExtractAsDangling clears the underlying pointer and returns another raw_ptr
+ // instance that is allowed to dangle.
+ loader->XCloseDisplay(display_.ExtractAsDangling());
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
XlibDisplayWrapper::XlibDisplayWrapper(struct _XDisplay* display,
XlibDisplayType type)
: display_(display), type_(type) {
@@ -94,7 +96,7 @@ XlibDisplayWrapper::XlibDisplayWrapper(struct _XDisplay* display,
GetXlibLoader()->XSynchronize(display_, true);
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
XlibDisplayWrapper::~XlibDisplayWrapper() {
if (!display_)
return;
@@ -119,7 +121,7 @@ XlibDisplayWrapper& XlibDisplayWrapper::operator=(XlibDisplayWrapper&& other) {
return *this;
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
struct xcb_connection_t* XlibDisplayWrapper::GetXcbConnection() {
return GetXlibXcbLoader()->XGetXCBConnection(display_);
}
diff --git a/chromium/ui/gfx/x/xlib_support.h b/chromium/ui/gfx/x/xlib_support.h
index 26accef2418..91edc322feb 100644
--- a/chromium/ui/gfx/x/xlib_support.h
+++ b/chromium/ui/gfx/x/xlib_support.h
@@ -9,6 +9,7 @@
#include <string>
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
struct _XDisplay;
struct xcb_connection_t;
@@ -47,7 +48,7 @@ class COMPONENT_EXPORT(X11) XlibDisplay {
explicit XlibDisplay(const std::string& address);
- struct _XDisplay* display_ = nullptr;
+ raw_ptr<struct _XDisplay> display_ = nullptr;
};
// A temporary wrapper around an unowned Xlib display that adds behavior
@@ -71,7 +72,7 @@ class COMPONENT_EXPORT(X11) XlibDisplayWrapper {
friend class Connection;
- struct _XDisplay* display_;
+ raw_ptr<struct _XDisplay> display_;
XlibDisplayType type_;
};
diff --git a/chromium/ui/gfx/x/xproto_internal.cc b/chromium/ui/gfx/x/xproto_internal.cc
index e0ffe7ef608..a73b9a7bc49 100644
--- a/chromium/ui/gfx/x/xproto_internal.cc
+++ b/chromium/ui/gfx/x/xproto_internal.cc
@@ -14,7 +14,7 @@ MallocedRefCountedMemory::MallocedRefCountedMemory(void* data)
: data_(reinterpret_cast<uint8_t*>(data)) {}
const uint8_t* MallocedRefCountedMemory::front() const {
- return data_;
+ return data_.get();
}
size_t MallocedRefCountedMemory::size() const {
@@ -23,9 +23,7 @@ size_t MallocedRefCountedMemory::size() const {
return 0;
}
-MallocedRefCountedMemory::~MallocedRefCountedMemory() {
- free(data_);
-}
+MallocedRefCountedMemory::~MallocedRefCountedMemory() = default;
OffsetRefCountedMemory::OffsetRefCountedMemory(
scoped_refptr<base::RefCountedMemory> memory,
diff --git a/chromium/ui/gfx/x/xproto_internal.h b/chromium/ui/gfx/x/xproto_internal.h
index 6bf0f5142c4..e69c9f42502 100644
--- a/chromium/ui/gfx/x/xproto_internal.h
+++ b/chromium/ui/gfx/x/xproto_internal.h
@@ -5,6 +5,8 @@
#ifndef UI_GFX_X_XPROTO_INTERNAL_H_
#define UI_GFX_X_XPROTO_INTERNAL_H_
+#include "base/memory/raw_ptr.h"
+
#ifndef IS_X11_IMPL
#error "This file should only be included by //ui/gfx/x:xprotos"
#endif
@@ -53,9 +55,16 @@ class COMPONENT_EXPORT(X11) MallocedRefCountedMemory
size_t size() const override;
private:
+ struct deleter {
+ void operator()(uint8_t* data) {
+ if (data) {
+ free(data);
+ }
+ }
+ };
~MallocedRefCountedMemory() override;
- uint8_t* const data_;
+ std::unique_ptr<uint8_t, deleter> data_;
};
// Wraps another RefCountedMemory, giving a view into it. Similar to
diff --git a/chromium/ui/gfx/x/xproto_types.h b/chromium/ui/gfx/x/xproto_types.h
index e670fcec166..488e98d44f1 100644
--- a/chromium/ui/gfx/x/xproto_types.h
+++ b/chromium/ui/gfx/x/xproto_types.h
@@ -12,6 +12,7 @@
#include "base/callback.h"
#include "base/component_export.h"
#include "base/memory/free_deleter.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted_memory.h"
#include "base/memory/scoped_refptr.h"
@@ -49,7 +50,7 @@ struct COMPONENT_EXPORT(X11) ReadBuffer {
scoped_refptr<base::RefCountedMemory> data;
size_t offset = 0;
- const int* fds = nullptr;
+ raw_ptr<const int> fds = nullptr;
};
// Wraps data to write to the connection.
diff --git a/chromium/ui/gl/BUILD.gn b/chromium/ui/gl/BUILD.gn
index 26656fcebcd..d0c51c01d85 100644
--- a/chromium/ui/gl/BUILD.gn
+++ b/chromium/ui/gl/BUILD.gn
@@ -343,6 +343,8 @@ component("gl") {
"delegated_ink_point_renderer_gpu.h",
"direct_composition_child_surface_win.cc",
"direct_composition_child_surface_win.h",
+ "direct_composition_support.cc",
+ "direct_composition_support.h",
"direct_composition_surface_win.cc",
"direct_composition_surface_win.h",
"gl_angle_util_win.cc",
diff --git a/chromium/ui/gl/EGL/eglextchromium.h b/chromium/ui/gl/EGL/eglextchromium.h
deleted file mode 100644
index 1fbdc16cc3d..00000000000
--- a/chromium/ui/gl/EGL/eglextchromium.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file contains Chromium-specific EGL extensions declarations.
-
-#ifndef UI_GL_EGL_EGLEXTCHROMIUM_H_
-#define UI_GL_EGL_EGLEXTCHROMIUM_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <EGL/eglplatform.h>
-
-/* EGLSyncControlCHROMIUM requires 64-bit uint support */
-#if KHRONOS_SUPPORT_INT64
-#ifndef EGL_CHROMIUM_sync_control
-#define EGL_CHROMIUM_sync_control 1
-typedef khronos_uint64_t EGLuint64CHROMIUM;
-#ifdef EGL_EGLEXT_PROTOTYPES
-EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncValuesCHROMIUM(
- EGLDisplay dpy, EGLSurface surface, EGLuint64CHROMIUM *ust,
- EGLuint64CHROMIUM *msc, EGLuint64CHROMIUM *sbc);
-#endif /* EGL_EGLEXT_PROTOTYPES */
-typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCVALUESCHROMIUMPROC)
- (EGLDisplay dpy, EGLSurface surface, EGLuint64CHROMIUM *ust,
- EGLuint64CHROMIUM *msc, EGLuint64CHROMIUM *sbc);
-#endif /* EGL_CHROMIUM_sync_control */
-
-#ifndef EGL_ANGLE_sync_control_rate
-#define EGL_ANGLE_sync_control_rate 1
-#ifdef EGL_EGLEXT_PROTOTYPES
-EGLAPI EGLBoolean EGLAPIENTRY eglGetMscRateANGLE(EGLDisplay dpy,
- EGLSurface surface,
- EGLint* numerator,
- EGLint* denominator);
-#endif /* EGL_EGLEXT_PROTOTYPES */
-typedef EGLBoolean(EGLAPIENTRYP PFNEGLGETMSCRATEANGLEPROC)(EGLDisplay dpy,
- EGLSurface surface,
- EGLint* numerator,
- EGLint* denominator);
-#endif /* EGL_ANGLE_sync_control_rate */
-#endif /* KHRONOS_SUPPORT_INT64 */
-
-#ifdef __cplusplus
-}
-#endif
-
-#define // UI_GL_EGL_EGLEXTCHROMIUM_H_
diff --git a/chromium/ui/gl/OWNERS b/chromium/ui/gl/OWNERS
index 4e4ae03af1d..3f7ad686add 100644
--- a/chromium/ui/gl/OWNERS
+++ b/chromium/ui/gl/OWNERS
@@ -1,8 +1,9 @@
-backer@chromium.org
geofflang@chromium.org
kbr@chromium.org
+penghuang@chromium.org
sunnyps@chromium.org
zmo@chromium.org
+
per-file *gl_image*=dcastagna@chromium.org
per-file *_ozone*=spang@chromium.org
per-file *surface_control*=vasilyt@chromium.org
diff --git a/chromium/ui/gl/android/scoped_java_surface.cc b/chromium/ui/gl/android/scoped_java_surface.cc
index 74534d7952b..b4693fb1cdf 100644
--- a/chromium/ui/gl/android/scoped_java_surface.cc
+++ b/chromium/ui/gl/android/scoped_java_surface.cc
@@ -4,6 +4,8 @@
#include "ui/gl/android/scoped_java_surface.h"
+#include <utility>
+
#include "base/check.h"
#include "ui/gl/android/surface_texture.h"
#include "ui/gl/surface_jni_headers/Surface_jni.h"
@@ -52,8 +54,7 @@ void ScopedJavaSurface::ReleaseSurfaceIfNeeded() {
void ScopedJavaSurface::MoveFrom(ScopedJavaSurface& other) {
ReleaseSurfaceIfNeeded();
- JNIEnv* env = base::android::AttachCurrentThread();
- j_surface_.Reset(env, other.j_surface_.Release());
+ j_surface_ = std::move(other.j_surface_);
auto_release_ = other.auto_release_;
is_protected_ = other.is_protected_;
}
diff --git a/chromium/ui/gl/ca_renderer_layer_params.cc b/chromium/ui/gl/ca_renderer_layer_params.cc
index b5275055dd0..72a0279b6c6 100644
--- a/chromium/ui/gl/ca_renderer_layer_params.cc
+++ b/chromium/ui/gl/ca_renderer_layer_params.cc
@@ -19,6 +19,7 @@ CARendererLayerParams::CARendererLayerParams(
unsigned edge_aa_mask,
float opacity,
unsigned filter,
+ absl::optional<gfx::HDRMetadata> hdr_metadata,
gfx::ProtectedVideoType protected_video_type)
: is_clipped(is_clipped),
clip_rect(clip_rect),
@@ -32,6 +33,7 @@ CARendererLayerParams::CARendererLayerParams(
edge_aa_mask(edge_aa_mask),
opacity(opacity),
filter(filter),
+ hdr_metadata(hdr_metadata),
protected_video_type(protected_video_type) {}
CARendererLayerParams::CARendererLayerParams(
diff --git a/chromium/ui/gl/ca_renderer_layer_params.h b/chromium/ui/gl/ca_renderer_layer_params.h
index c8e472287ef..a2c128586ba 100644
--- a/chromium/ui/gl/ca_renderer_layer_params.h
+++ b/chromium/ui/gl/ca_renderer_layer_params.h
@@ -8,12 +8,14 @@
#include <vector>
#include "base/memory/raw_ptr.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/rect_f.h"
#include "ui/gfx/geometry/rrect_f.h"
#include "ui/gfx/geometry/transform.h"
+#include "ui/gfx/hdr_metadata.h"
#include "ui/gfx/video_types.h"
#include "ui/gl/gl_export.h"
@@ -44,6 +46,7 @@ struct GL_EXPORT CARendererLayerParams {
unsigned edge_aa_mask,
float opacity,
unsigned filter,
+ absl::optional<gfx::HDRMetadata> hdr_metadata,
gfx::ProtectedVideoType protected_video_type);
CARendererLayerParams(const CARendererLayerParams& other);
~CARendererLayerParams();
@@ -60,6 +63,7 @@ struct GL_EXPORT CARendererLayerParams {
unsigned edge_aa_mask;
float opacity;
unsigned filter;
+ absl::optional<gfx::HDRMetadata> hdr_metadata;
gfx::ProtectedVideoType protected_video_type;
// This is a subset of cc::FilterOperation::FilterType.
diff --git a/chromium/ui/gl/dc_layer_tree.cc b/chromium/ui/gl/dc_layer_tree.cc
index e378551fa42..1a627f28824 100644
--- a/chromium/ui/gl/dc_layer_tree.cc
+++ b/chromium/ui/gl/dc_layer_tree.cc
@@ -12,7 +12,7 @@
#include "base/metrics/histogram_functions.h"
#include "base/trace_event/trace_event.h"
#include "ui/gl/direct_composition_child_surface_win.h"
-#include "ui/gl/direct_composition_surface_win.h"
+#include "ui/gl/direct_composition_support.h"
#include "ui/gl/gl_angle_util_win.h"
#include "ui/gl/swap_chain_presenter.h"
@@ -50,7 +50,7 @@ bool DCLayerTree::Initialize(HWND window) {
d3d11_device_ = QueryD3D11DeviceObjectFromANGLE();
DCHECK(d3d11_device_);
- dcomp_device_ = DirectCompositionSurfaceWin::GetDirectCompositionDevice();
+ dcomp_device_ = GetDirectCompositionDevice();
DCHECK(dcomp_device_);
Microsoft::WRL::ComPtr<IDCompositionDesktopDevice> desktop_device;
@@ -91,7 +91,7 @@ VideoProcessorWrapper* DCLayerTree::InitializeVideoProcessor(
if (FAILED(d3d11_device_.As(&video_processor_wrapper.video_device))) {
DLOG(ERROR) << "Failed to retrieve video device from D3D11 device";
DCHECK(false);
- DirectCompositionSurfaceWin::DisableOverlays();
+ DisableDirectCompositionOverlays();
return nullptr;
}
DCHECK(video_processor_wrapper.video_device);
@@ -134,7 +134,7 @@ VideoProcessorWrapper* DCLayerTree::InitializeVideoProcessor(
<< std::hex << hr;
// It might fail again next time. Disable overlay support so
// overlay processor will stop sending down overlay frames.
- DirectCompositionSurfaceWin::DisableOverlays();
+ DisableDirectCompositionOverlays();
return nullptr;
}
hr = video_processor_wrapper.video_device->CreateVideoProcessor(
@@ -145,7 +145,7 @@ VideoProcessorWrapper* DCLayerTree::InitializeVideoProcessor(
<< hr;
// It might fail again next time. Disable overlay support so
// overlay processor will stop sending down overlay frames.
- DirectCompositionSurfaceWin::DisableOverlays();
+ DisableDirectCompositionOverlays();
return nullptr;
}
// Auto stream processing (the default) can hurt power consumption.
diff --git a/chromium/ui/gl/dc_renderer_layer_params.h b/chromium/ui/gl/dc_renderer_layer_params.h
index c9c9ceddfb9..1545df31c63 100644
--- a/chromium/ui/gl/dc_renderer_layer_params.h
+++ b/chromium/ui/gl/dc_renderer_layer_params.h
@@ -56,6 +56,8 @@ struct GL_EXPORT DCRendererLayerParams {
gfx::ProtectedVideoType::kClear;
gfx::HDRMetadata hdr_metadata;
+
+ bool is_video_fullscreen_mode;
};
} // namespace ui
diff --git a/chromium/ui/gl/delegated_ink_point_renderer_gpu_unittest.cc b/chromium/ui/gl/delegated_ink_point_renderer_gpu_unittest.cc
index d5e1089fad4..33778d0684c 100644
--- a/chromium/ui/gl/delegated_ink_point_renderer_gpu_unittest.cc
+++ b/chromium/ui/gl/delegated_ink_point_renderer_gpu_unittest.cc
@@ -13,6 +13,7 @@
#include "ui/base/win/hidden_window.h"
#include "ui/gfx/geometry/vector2d_f.h"
#include "ui/gl/dc_layer_tree.h"
+#include "ui/gl/direct_composition_support.h"
#include "ui/gl/direct_composition_surface_win.h"
#include "ui/gl/gl_angle_util_win.h"
#include "ui/gl/gl_context.h"
@@ -100,7 +101,7 @@ class DelegatedInkPointRendererGpuTest : public testing::Test {
// Without this, the following check always fails.
display_ = gl::init::InitializeGLNoExtensionsOneOff(/*init_bindings=*/true,
/*system_device_id=*/0);
- if (!gl::DirectCompositionSurfaceWin::GetDirectCompositionDevice()) {
+ if (!gl::DirectCompositionSupported()) {
LOG(WARNING)
<< "GL implementation not using DirectComposition, skipping test.";
return;
diff --git a/chromium/ui/gl/direct_composition_child_surface_win.cc b/chromium/ui/gl/direct_composition_child_surface_win.cc
index 377a7cd2b9d..2fa82bc0faa 100644
--- a/chromium/ui/gl/direct_composition_child_surface_win.cc
+++ b/chromium/ui/gl/direct_composition_child_surface_win.cc
@@ -19,7 +19,7 @@
#include "base/win/windows_version.h"
#include "ui/gfx/color_space_win.h"
#include "ui/gfx/native_widget_types.h"
-#include "ui/gl/direct_composition_surface_win.h"
+#include "ui/gl/direct_composition_support.h"
#include "ui/gl/egl_util.h"
#include "ui/gl/gl_angle_util_win.h"
#include "ui/gl/gl_bindings.h"
@@ -45,8 +45,6 @@ namespace {
// is made current, then this surface will be suspended.
IDCompositionSurface* g_current_surface = nullptr;
-bool g_direct_composition_swap_chain_failed = false;
-
// If damage_rect / full_chrome_rect >= kForceFullDamageThreshold, present
// the swap chain with full damage.
float kForceFullDamageThreshold = 0.6f;
@@ -64,6 +62,17 @@ bool IsVerifyDrawOffsetEnabled() {
features::kDirectCompositionVerifyDrawOffset);
}
+bool IsWaitableSwapChainEnabled() {
+ // Waitable swap chains were first enabled in Win 8.1/DXGI 1.3
+ return (base::win::GetVersion() >= base::win::Version::WIN8_1) &&
+ base::FeatureList::IsEnabled(features::kDXGIWaitableSwapChain);
+}
+
+UINT GetMaxWaitableQueuedFrames() {
+ return static_cast<UINT>(
+ features::kDXGIWaitableSwapChainMaxQueuedFrames.Get());
+}
+
} // namespace
DirectCompositionChildSurfaceWin::PendingFrame::PendingFrame(
@@ -99,16 +108,12 @@ DirectCompositionChildSurfaceWin::~DirectCompositionChildSurfaceWin() {
bool DirectCompositionChildSurfaceWin::Initialize(GLSurfaceFormat format) {
d3d11_device_ = QueryD3D11DeviceObjectFromANGLE();
- dcomp_device_ = DirectCompositionSurfaceWin::GetDirectCompositionDevice();
+ dcomp_device_ = GetDirectCompositionDevice();
if (!dcomp_device_)
return false;
EGLint pbuffer_attribs[] = {
- EGL_WIDTH,
- 1,
- EGL_HEIGHT,
- 1,
- EGL_NONE,
+ EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE,
};
default_surface_ = eglCreatePbufferSurface(display_->GetDisplay(),
@@ -157,7 +162,7 @@ bool DirectCompositionChildSurfaceWin::ReleaseDrawTexture(bool will_discard) {
dcomp_surface_serial_++;
} else if (!will_discard) {
const bool use_swap_chain_tearing =
- DirectCompositionSurfaceWin::AllowTearing();
+ DirectCompositionSwapChainTearingEnabled();
UINT interval =
first_swap_ || !vsync_enabled_ || use_swap_chain_tearing ? 0 : 1;
UINT flags = use_swap_chain_tearing ? DXGI_PRESENT_ALLOW_TEARING : 0;
@@ -175,7 +180,7 @@ bool DirectCompositionChildSurfaceWin::ReleaseDrawTexture(bool will_discard) {
}
TRACE_EVENT2(
"gpu", "DirectCompositionChildSurfaceWin::PresentSwapChain",
- "interval", interval, "dirty_rect",
+ "has_alpha", has_alpha_, "dirty_rect",
actually_force_full_damage ? "full_damage" : swap_rect_.ToString());
if (actually_force_full_damage) {
hr = swap_chain_->Present(interval, flags);
@@ -392,7 +397,7 @@ bool DirectCompositionChildSurfaceWin::SetDrawRectangle(
DLOG(ERROR) << "CreateSurface failed with error " << std::hex << hr;
// Disable direct composition because CreateSurface might fail again next
// time.
- g_direct_composition_swap_chain_failed = true;
+ SetDirectCompositionSwapChainFailed();
return false;
}
@@ -427,9 +432,12 @@ bool DirectCompositionChildSurfaceWin::SetDrawRectangle(
desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
desc.AlphaMode =
has_alpha_ ? DXGI_ALPHA_MODE_PREMULTIPLIED : DXGI_ALPHA_MODE_IGNORE;
- desc.Flags = DirectCompositionSurfaceWin::AllowTearing()
- ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING
- : 0;
+ desc.Flags = 0;
+ if (DirectCompositionSwapChainTearingEnabled())
+ desc.Flags |= DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING;
+ if (IsWaitableSwapChainEnabled())
+ desc.Flags |= DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT;
+
HRESULT hr = dxgi_factory->CreateSwapChainForComposition(
d3d11_device_.Get(), &desc, nullptr, &swap_chain_);
first_swap_ = true;
@@ -445,7 +453,7 @@ bool DirectCompositionChildSurfaceWin::SetDrawRectangle(
<< std::hex << hr;
// Disable direct composition because SwapChain creation might fail again
// next time.
- g_direct_composition_swap_chain_failed = true;
+ SetDirectCompositionSwapChainFailed();
return false;
}
@@ -458,6 +466,11 @@ bool DirectCompositionChildSurfaceWin::SetDrawRectangle(
gfx::ColorSpaceWin::GetDXGIColorSpace(color_space_));
DCHECK(SUCCEEDED(hr))
<< "SetColorSpace1 failed with error " << std::hex << hr;
+ if (IsWaitableSwapChainEnabled()) {
+ hr = swap_chain->SetMaximumFrameLatency(GetMaxWaitableQueuedFrames());
+ DCHECK(SUCCEEDED(hr))
+ << "SetMaximumFrameLatency failed with error " << std::hex << hr;
+ }
}
}
@@ -565,9 +578,11 @@ bool DirectCompositionChildSurfaceWin::Resize(
if (swap_chain_ && resize_only) {
UINT buffer_count = gl::DirectCompositionRootSurfaceBufferCount();
DXGI_FORMAT format = gfx::ColorSpaceWin::GetDXGIFormat(color_space_);
- UINT flags = DirectCompositionSurfaceWin::AllowTearing()
- ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING
- : 0;
+ UINT flags = 0;
+ if (DirectCompositionSwapChainTearingEnabled())
+ flags |= DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING;
+ if (IsWaitableSwapChainEnabled())
+ flags |= DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT;
HRESULT hr = swap_chain_->ResizeBuffers(buffer_count, size.width(),
size.height(), format, flags);
UMA_HISTOGRAM_BOOLEAN("GPU.DirectComposition.SwapChainResizeResult",
@@ -764,9 +779,4 @@ void DirectCompositionChildSurfaceWin::CopyOffscreenTextureToDrawTexture() {
offscreen_texture_.Get(), 0, &box);
}
-// static
-bool DirectCompositionChildSurfaceWin::IsDirectCompositionSwapChainFailed() {
- return g_direct_composition_swap_chain_failed;
-}
-
} // namespace gl
diff --git a/chromium/ui/gl/direct_composition_support.cc b/chromium/ui/gl/direct_composition_support.cc
new file mode 100644
index 00000000000..9e4b8043926
--- /dev/null
+++ b/chromium/ui/gl/direct_composition_support.cc
@@ -0,0 +1,788 @@
+// 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/gl/direct_composition_support.h"
+
+#include <dxgi1_6.h>
+
+#include "base/command_line.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/synchronization/lock.h"
+#include "base/win/windows_version.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gl/gl_angle_util_win.h"
+#include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_display.h"
+#include "ui/gl/gl_features.h"
+#include "ui/gl/gl_implementation.h"
+#include "ui/gl/gl_switches.h"
+
+namespace gl {
+namespace {
+// Whether the overlay caps are valid or not. GUARDED_BY GetOverlayLock().
+bool g_overlay_caps_valid = false;
+// Indicates support for either NV12 or YUY2 overlays. GUARDED_BY
+// GetOverlayLock().
+bool g_supports_overlays = false;
+// Whether the GPU can support hardware overlays or not.
+bool g_supports_hardware_overlays = false;
+// Whether the DecodeSwapChain is disabled or not.
+bool g_decode_swap_chain_disabled = false;
+// Whether to force the nv12 overlay support.
+bool g_force_nv12_overlay_support = false;
+// Whether software overlays have been disabled.
+bool g_disable_sw_overlays = false;
+
+// The lock to guard g_overlay_caps_valid and g_supports_overlays.
+base::Lock& GetOverlayLock() {
+ static base::NoDestructor<base::Lock> overlay_lock;
+ return *overlay_lock;
+}
+
+bool SupportsOverlays() {
+ base::AutoLock auto_lock(GetOverlayLock());
+ return g_supports_overlays;
+}
+
+bool SupportsHardwareOverlays() {
+ base::AutoLock auto_lock(GetOverlayLock());
+ return g_supports_hardware_overlays;
+}
+
+void SetSupportsOverlays(bool support) {
+ base::AutoLock auto_lock(GetOverlayLock());
+ g_supports_overlays = support;
+}
+
+void SetSupportsHardwareOverlays(bool support) {
+ base::AutoLock auto_lock(GetOverlayLock());
+ g_supports_hardware_overlays = support;
+}
+
+bool SupportsSoftwareOverlays() {
+ return base::FeatureList::IsEnabled(
+ features::kDirectCompositionSoftwareOverlays) &&
+ !g_disable_sw_overlays;
+}
+
+bool OverlayCapsValid() {
+ base::AutoLock auto_lock(GetOverlayLock());
+ return g_overlay_caps_valid;
+}
+
+void SetOverlayCapsValid(bool valid) {
+ base::AutoLock auto_lock(GetOverlayLock());
+ g_overlay_caps_valid = valid;
+}
+
+// A warpper of IDXGIOutput4::CheckOverlayColorSpaceSupport()
+bool CheckOverlayColorSpaceSupport(
+ DXGI_FORMAT dxgi_format,
+ DXGI_COLOR_SPACE_TYPE dxgi_color_space,
+ Microsoft::WRL::ComPtr<IDXGIOutput> output,
+ Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device) {
+ UINT color_space_support_flags = 0;
+ Microsoft::WRL::ComPtr<IDXGIOutput4> output4;
+ if (FAILED(output.As(&output4)) ||
+ FAILED(output4->CheckOverlayColorSpaceSupport(
+ dxgi_format, dxgi_color_space, d3d11_device.Get(),
+ &color_space_support_flags)))
+ return false;
+ return (color_space_support_flags &
+ DXGI_OVERLAY_COLOR_SPACE_SUPPORT_FLAG_PRESENT);
+}
+
+// Used for adjusting overlay size to monitor size.
+gfx::Size g_primary_monitor_size;
+
+// The number of all visible display monitors on a desktop.
+int g_num_monitors = 0;
+
+// Global direct composition device.
+IDCompositionDevice2* g_dcomp_device = nullptr;
+// Whether swap chain present failed and direct composition should be disabled.
+bool g_direct_composition_swap_chain_failed = false;
+
+// Preferred overlay format set when detecting overlay support during
+// initialization. Set to NV12 by default so that it's used when enabling
+// overlays using command line flags.
+DXGI_FORMAT g_overlay_format_used = DXGI_FORMAT_NV12;
+DXGI_FORMAT g_overlay_format_used_hdr = DXGI_FORMAT_UNKNOWN;
+
+// These are the raw support info, which shouldn't depend on field trial state,
+// or command line flags. GUARDED_BY GetOverlayLock().
+UINT g_nv12_overlay_support_flags = 0;
+UINT g_yuy2_overlay_support_flags = 0;
+UINT g_bgra8_overlay_support_flags = 0;
+UINT g_rgb10a2_overlay_support_flags = 0;
+
+// When this is set, if NV12 or YUY2 overlays are supported, set BGRA8 overlays
+// as supported as well.
+bool g_enable_bgra8_overlays_with_yuv_overlay_support = false;
+
+// Force enabling DXGI_FORMAT_R10G10B10A2_UNORM format for overlay. Intel
+// celake and Tigerlake fail to report the cap of this HDR overlay format.
+// TODO(magchen@): Remove this workaround when this cap is fixed in the Intel
+// drivers.
+bool g_force_rgb10a2_overlay_support = false;
+
+// Per Intel's request, only use NV12 for overlay when
+// COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709 is also supported. At least one Intel
+// Gen9 SKU does not support NV12 overlays and it cannot be screened by the
+// device id.
+bool g_check_ycbcr_studio_g22_left_p709_for_nv12_support = false;
+
+void SetOverlaySupportFlagsForFormats(UINT nv12_flags,
+ UINT yuy2_flags,
+ UINT bgra8_flags,
+ UINT rgb10a2_flags) {
+ base::AutoLock auto_lock(GetOverlayLock());
+ g_nv12_overlay_support_flags = nv12_flags;
+ g_yuy2_overlay_support_flags = yuy2_flags;
+ g_bgra8_overlay_support_flags = bgra8_flags;
+ g_rgb10a2_overlay_support_flags = rgb10a2_flags;
+}
+
+bool FlagsSupportsOverlays(UINT flags) {
+ return (flags & (DXGI_OVERLAY_SUPPORT_FLAG_DIRECT |
+ DXGI_OVERLAY_SUPPORT_FLAG_SCALING));
+}
+
+void GetGpuDriverOverlayInfo(bool* supports_overlays,
+ bool* supports_hardware_overlays,
+ DXGI_FORMAT* overlay_format_used,
+ DXGI_FORMAT* overlay_format_used_hdr,
+ UINT* nv12_overlay_support_flags,
+ UINT* yuy2_overlay_support_flags,
+ UINT* bgra8_overlay_support_flags,
+ UINT* rgb10a2_overlay_support_flags) {
+ // Initialization
+ *supports_overlays = false;
+ *supports_hardware_overlays = false;
+ *overlay_format_used = DXGI_FORMAT_NV12;
+ *overlay_format_used_hdr = DXGI_FORMAT_R10G10B10A2_UNORM;
+ *nv12_overlay_support_flags = 0;
+ *yuy2_overlay_support_flags = 0;
+ *bgra8_overlay_support_flags = 0;
+ *rgb10a2_overlay_support_flags = 0;
+
+ // Check for DirectComposition support first to prevent likely crashes.
+ if (!DirectCompositionSupported())
+ return;
+
+ // Before Windows 10 Anniversary Update (Redstone 1), overlay planes wouldn't
+ // be assigned to non-UWP apps.
+ if (base::win::GetVersion() < base::win::Version::WIN10_RS1)
+ return;
+
+ Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device =
+ QueryD3D11DeviceObjectFromANGLE();
+ if (!d3d11_device) {
+ DLOG(ERROR) << "Failed to retrieve D3D11 device";
+ return;
+ }
+
+ Microsoft::WRL::ComPtr<IDXGIDevice> dxgi_device;
+ if (FAILED(d3d11_device.As(&dxgi_device))) {
+ DLOG(ERROR) << "Failed to retrieve DXGI device";
+ return;
+ }
+
+ Microsoft::WRL::ComPtr<IDXGIAdapter> dxgi_adapter;
+ if (FAILED(dxgi_device->GetAdapter(&dxgi_adapter))) {
+ DLOG(ERROR) << "Failed to retrieve DXGI adapter";
+ return;
+ }
+
+ // This will fail if the D3D device is "Microsoft Basic Display Adapter".
+ Microsoft::WRL::ComPtr<ID3D11VideoDevice> video_device;
+ if (FAILED(d3d11_device.As(&video_device))) {
+ DLOG(ERROR) << "Failed to retrieve video device";
+ return;
+ }
+
+ unsigned int i = 0;
+ while (true) {
+ Microsoft::WRL::ComPtr<IDXGIOutput> output;
+ if (FAILED(dxgi_adapter->EnumOutputs(i++, &output)))
+ break;
+ DCHECK(output);
+ Microsoft::WRL::ComPtr<IDXGIOutput3> output3;
+ if (FAILED(output.As(&output3)))
+ continue;
+ DCHECK(output3);
+ output3->CheckOverlaySupport(DXGI_FORMAT_NV12, d3d11_device.Get(),
+ nv12_overlay_support_flags);
+ output3->CheckOverlaySupport(DXGI_FORMAT_YUY2, d3d11_device.Get(),
+ yuy2_overlay_support_flags);
+ output3->CheckOverlaySupport(DXGI_FORMAT_B8G8R8A8_UNORM, d3d11_device.Get(),
+ bgra8_overlay_support_flags);
+ // Today it still returns false, which blocks Chrome from using HDR
+ // overlays.
+ output3->CheckOverlaySupport(DXGI_FORMAT_R10G10B10A2_UNORM,
+ d3d11_device.Get(),
+ rgb10a2_overlay_support_flags);
+ if (FlagsSupportsOverlays(*nv12_overlay_support_flags)) {
+ // NV12 format is preferred if it's supported.
+ *overlay_format_used = DXGI_FORMAT_NV12;
+ *supports_hardware_overlays = true;
+
+ if (g_check_ycbcr_studio_g22_left_p709_for_nv12_support &&
+ !CheckOverlayColorSpaceSupport(
+ DXGI_FORMAT_NV12, DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709,
+ output, d3d11_device)) {
+ // Some new Intel drivers only claim to support unscaled overlays, but
+ // scaled overlays still work. It's possible DWM works around it by
+ // performing an extra scaling Blt before calling the driver. Even when
+ // scaled overlays aren't actually supported, presentation using the
+ // overlay path should be relatively efficient.
+ *supports_hardware_overlays = false;
+ }
+ }
+ if (!*supports_hardware_overlays &&
+ FlagsSupportsOverlays(*yuy2_overlay_support_flags)) {
+ // If NV12 isn't supported, fallback to YUY2 if it's supported.
+ *overlay_format_used = DXGI_FORMAT_YUY2;
+ *supports_hardware_overlays = true;
+ }
+ if (g_enable_bgra8_overlays_with_yuv_overlay_support) {
+ if (FlagsSupportsOverlays(*nv12_overlay_support_flags))
+ *bgra8_overlay_support_flags = *nv12_overlay_support_flags;
+ else if (FlagsSupportsOverlays(*yuy2_overlay_support_flags))
+ *bgra8_overlay_support_flags = *yuy2_overlay_support_flags;
+ }
+
+ // RGB10A2 overlay is used for displaying HDR content. In Intel's
+ // platform, RGB10A2 overlay is enabled only when
+ // DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 is supported.
+ if (FlagsSupportsOverlays(*rgb10a2_overlay_support_flags)) {
+ if (!CheckOverlayColorSpaceSupport(
+ DXGI_FORMAT_R10G10B10A2_UNORM,
+ DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020, output, d3d11_device))
+ *rgb10a2_overlay_support_flags = 0;
+ }
+ if (g_force_rgb10a2_overlay_support) {
+ *rgb10a2_overlay_support_flags = DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
+ }
+
+ // Early out after the first output that reports overlay support. All
+ // outputs are expected to report the same overlay support according to
+ // Microsoft's WDDM documentation:
+ // https://docs.microsoft.com/en-us/windows-hardware/drivers/display/multiplane-overlay-hardware-requirements
+ // TODO(sunnyps): If the above is true, then we can only look at first
+ // output instead of iterating over all outputs.
+ if (*supports_hardware_overlays)
+ break;
+ }
+
+ *supports_overlays = *supports_hardware_overlays;
+ if (*supports_hardware_overlays || !SupportsSoftwareOverlays()) {
+ return;
+ }
+
+ // If no devices with hardware overlay support were found use software ones.
+ *supports_overlays = true;
+ *nv12_overlay_support_flags = 0;
+ *yuy2_overlay_support_flags = 0;
+ *bgra8_overlay_support_flags = 0;
+ *rgb10a2_overlay_support_flags = 0;
+
+ // Software overlays always use NV12 because it's slightly more efficient and
+ // YUY2 was only used because Skylake doesn't support NV12 hardware overlays.
+ *overlay_format_used = DXGI_FORMAT_NV12;
+}
+
+void UpdateOverlaySupport() {
+ if (OverlayCapsValid())
+ return;
+ SetOverlayCapsValid(true);
+
+ bool supports_overlays = false;
+ bool supports_hardware_overlays = false;
+ DXGI_FORMAT overlay_format_used = DXGI_FORMAT_NV12;
+ DXGI_FORMAT overlay_format_used_hdr = DXGI_FORMAT_R10G10B10A2_UNORM;
+ UINT nv12_overlay_support_flags = 0;
+ UINT yuy2_overlay_support_flags = 0;
+ UINT bgra8_overlay_support_flags = 0;
+ UINT rgb10a2_overlay_support_flags = 0;
+
+ GetGpuDriverOverlayInfo(
+ &supports_overlays, &supports_hardware_overlays, &overlay_format_used,
+ &overlay_format_used_hdr, &nv12_overlay_support_flags,
+ &yuy2_overlay_support_flags, &bgra8_overlay_support_flags,
+ &rgb10a2_overlay_support_flags);
+
+ if (g_force_nv12_overlay_support) {
+ supports_overlays = true;
+ nv12_overlay_support_flags = DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
+ overlay_format_used = DXGI_FORMAT_NV12;
+ }
+
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kDirectCompositionVideoSwapChainFormat)) {
+ std::string override_format =
+ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ switches::kDirectCompositionVideoSwapChainFormat);
+ if (override_format == kSwapChainFormatNV12) {
+ overlay_format_used = DXGI_FORMAT_NV12;
+ } else if (override_format == kSwapChainFormatYUY2) {
+ overlay_format_used = DXGI_FORMAT_YUY2;
+ } else if (override_format == kSwapChainFormatBGRA) {
+ overlay_format_used = DXGI_FORMAT_B8G8R8A8_UNORM;
+ } else {
+ DLOG(ERROR) << "Invalid value for switch "
+ << switches::kDirectCompositionVideoSwapChainFormat;
+ }
+ }
+
+ // Record histograms.
+ if (supports_overlays) {
+ base::UmaHistogramSparse("GPU.DirectComposition.OverlayFormatUsed3",
+ overlay_format_used);
+ }
+ base::UmaHistogramBoolean("GPU.DirectComposition.OverlaysSupported",
+ supports_overlays);
+ base::UmaHistogramBoolean("GPU.DirectComposition.HardwareOverlaysSupported",
+ supports_hardware_overlays);
+
+ // Update global caps.
+ SetSupportsOverlays(supports_overlays);
+ SetSupportsHardwareOverlays(supports_hardware_overlays);
+ SetOverlaySupportFlagsForFormats(
+ nv12_overlay_support_flags, yuy2_overlay_support_flags,
+ bgra8_overlay_support_flags, rgb10a2_overlay_support_flags);
+ g_overlay_format_used = overlay_format_used;
+ g_overlay_format_used_hdr = overlay_format_used_hdr;
+}
+
+void UpdateMonitorInfo() {
+ g_num_monitors = GetSystemMetrics(SM_CMONITORS);
+
+ MONITORINFO monitor_info;
+ monitor_info.cbSize = sizeof(monitor_info);
+ if (GetMonitorInfo(MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY),
+ &monitor_info)) {
+ g_primary_monitor_size = gfx::Rect(monitor_info.rcMonitor).size();
+ } else {
+ g_primary_monitor_size = gfx::Size();
+ }
+}
+
+} // namespace
+
+void InitializeDirectComposition(GLDisplayEGL* display) {
+ DCHECK(!g_dcomp_device);
+
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kDisableDirectComposition))
+ return;
+
+ // Direct composition can only be used with ANGLE.
+ if (gl::GetGLImplementation() != gl::kGLImplementationEGLANGLE)
+ return;
+
+ // Blocklist direct composition if MCTU.dll or MCTUX.dll are injected. These
+ // are user mode drivers for display adapters from Magic Control Technology
+ // Corporation.
+ if (GetModuleHandle(TEXT("MCTU.dll")) || GetModuleHandle(TEXT("MCTUX.dll"))) {
+ DLOG(ERROR) << "Blocklisted due to third party modules";
+ return;
+ }
+
+ // EGL_KHR_no_config_context surface compatibility is required to be able to
+ // MakeCurrent with the default pbuffer surface.
+ if (!display->ext->b_EGL_KHR_no_config_context) {
+ DLOG(ERROR) << "EGL_KHR_no_config_context not supported";
+ return;
+ }
+
+ Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device =
+ QueryD3D11DeviceObjectFromANGLE();
+ if (!d3d11_device) {
+ DLOG(ERROR) << "Failed to retrieve D3D11 device";
+ return;
+ }
+
+ // This will fail if the D3D device is "Microsoft Basic Display Adapter".
+ Microsoft::WRL::ComPtr<ID3D11VideoDevice> video_device;
+ if (FAILED(d3d11_device.As(&video_device))) {
+ DLOG(ERROR) << "Failed to retrieve video device";
+ return;
+ }
+
+ // Load DLL at runtime since older Windows versions don't have dcomp.
+ HMODULE dcomp_module = ::GetModuleHandle(L"dcomp.dll");
+ if (!dcomp_module) {
+ DLOG(ERROR) << "Failed to load dcomp.dll";
+ return;
+ }
+
+ using PFN_DCOMPOSITION_CREATE_DEVICE2 = HRESULT(WINAPI*)(
+ IUnknown * renderingDevice, REFIID iid, void** dcompositionDevice);
+ PFN_DCOMPOSITION_CREATE_DEVICE2 create_device_function =
+ reinterpret_cast<PFN_DCOMPOSITION_CREATE_DEVICE2>(
+ ::GetProcAddress(dcomp_module, "DCompositionCreateDevice2"));
+ if (!create_device_function) {
+ DLOG(ERROR) << "GetProcAddress failed for DCompositionCreateDevice2";
+ return;
+ }
+
+ Microsoft::WRL::ComPtr<IDXGIDevice> dxgi_device;
+ d3d11_device.As(&dxgi_device);
+
+ Microsoft::WRL::ComPtr<IDCompositionDesktopDevice> desktop_device;
+ HRESULT hr =
+ create_device_function(dxgi_device.Get(), IID_PPV_ARGS(&desktop_device));
+ if (FAILED(hr)) {
+ DLOG(ERROR) << "DCompositionCreateDevice2 failed with error 0x" << std::hex
+ << hr;
+ return;
+ }
+
+ Microsoft::WRL::ComPtr<IDCompositionDevice2> dcomp_device;
+ hr = desktop_device.As(&dcomp_device);
+ if (FAILED(hr)) {
+ DLOG(ERROR) << "Failed to retrieve IDCompositionDevice2 with error 0x"
+ << std::hex << hr;
+ return;
+ }
+
+ g_dcomp_device = dcomp_device.Detach();
+ DCHECK(g_dcomp_device);
+}
+
+void ShutdownDirectComposition() {
+ if (g_dcomp_device) {
+ g_dcomp_device->Release();
+ g_dcomp_device = nullptr;
+ }
+}
+
+IDCompositionDevice2* GetDirectCompositionDevice() {
+ return g_dcomp_device;
+}
+
+bool DirectCompositionSupported() {
+ return g_dcomp_device && !g_direct_composition_swap_chain_failed;
+}
+
+bool DirectCompositionOverlaysSupported() {
+ // Always initialize and record overlay support information irrespective of
+ // command line flags.
+ UpdateOverlaySupport();
+
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ // Enable flag should be checked before the disable flag, so we could
+ // overwrite GPU driver bug workarounds in testing.
+ if (command_line->HasSwitch(switches::kEnableDirectCompositionVideoOverlays))
+ return true;
+ if (command_line->HasSwitch(switches::kDisableDirectCompositionVideoOverlays))
+ return false;
+
+ return SupportsOverlays();
+}
+
+bool DirectCompositionHardwareOverlaysSupported() {
+ UpdateOverlaySupport();
+ return SupportsHardwareOverlays();
+}
+
+bool DirectCompositionDecodeSwapChainSupported() {
+ if (!g_decode_swap_chain_disabled) {
+ UpdateOverlaySupport();
+ return GetDirectCompositionSDROverlayFormat() == DXGI_FORMAT_NV12;
+ }
+ return false;
+}
+
+void DisableDirectCompositionDecodeSwapChain() {
+ g_decode_swap_chain_disabled = true;
+}
+
+void DisableDirectCompositionOverlays() {
+ SetSupportsOverlays(false);
+ DirectCompositionOverlayCapsMonitor::GetInstance()
+ ->NotifyOverlayCapsChanged();
+}
+
+void DisableDirectCompositionSoftwareOverlays() {
+ g_disable_sw_overlays = true;
+}
+
+bool DirectCompositionScaledOverlaysSupported() {
+ UpdateOverlaySupport();
+ if (g_overlay_format_used == DXGI_FORMAT_NV12) {
+ return (g_nv12_overlay_support_flags & DXGI_OVERLAY_SUPPORT_FLAG_SCALING) ||
+ (SupportsOverlays() && SupportsSoftwareOverlays());
+ } else if (g_overlay_format_used == DXGI_FORMAT_YUY2) {
+ return !!(g_yuy2_overlay_support_flags & DXGI_OVERLAY_SUPPORT_FLAG_SCALING);
+ } else {
+ DCHECK_EQ(g_overlay_format_used, DXGI_FORMAT_B8G8R8A8_UNORM);
+ // Assume scaling is supported for BGRA overlays.
+ return true;
+ }
+}
+
+UINT GetDirectCompositionOverlaySupportFlags(DXGI_FORMAT format) {
+ UpdateOverlaySupport();
+ base::AutoLock auto_lock(GetOverlayLock());
+ UINT support_flag = 0;
+ switch (format) {
+ case DXGI_FORMAT_NV12:
+ support_flag = g_nv12_overlay_support_flags;
+ break;
+ case DXGI_FORMAT_YUY2:
+ support_flag = g_yuy2_overlay_support_flags;
+ break;
+ case DXGI_FORMAT_B8G8R8A8_UNORM:
+ support_flag = g_bgra8_overlay_support_flags;
+ break;
+ case DXGI_FORMAT_R10G10B10A2_UNORM:
+ support_flag = g_rgb10a2_overlay_support_flags;
+ break;
+ default:
+ NOTREACHED();
+ break;
+ }
+ return support_flag;
+}
+
+gfx::Size GetDirectCompositionPrimaryMonitorSize() {
+ if (g_primary_monitor_size.IsEmpty())
+ UpdateMonitorInfo();
+ return g_primary_monitor_size;
+}
+
+int GetDirectCompositionNumMonitors() {
+ if (g_num_monitors == 0)
+ UpdateMonitorInfo();
+ return g_num_monitors;
+}
+
+DXGI_FORMAT GetDirectCompositionSDROverlayFormat() {
+ return g_overlay_format_used;
+}
+
+void SetDirectCompositionScaledOverlaysSupportedForTesting(bool supported) {
+ UpdateOverlaySupport();
+ if (supported) {
+ g_nv12_overlay_support_flags |= DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
+ g_yuy2_overlay_support_flags |= DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
+ g_rgb10a2_overlay_support_flags |= DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
+ } else {
+ g_nv12_overlay_support_flags &= ~DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
+ g_yuy2_overlay_support_flags &= ~DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
+ g_rgb10a2_overlay_support_flags &= ~DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
+ }
+ g_disable_sw_overlays = !supported;
+ SetSupportsHardwareOverlays(supported);
+ DCHECK_EQ(supported, DirectCompositionScaledOverlaysSupported());
+}
+
+void SetDirectCompositionOverlayFormatUsedForTesting(DXGI_FORMAT format) {
+ DCHECK(format == DXGI_FORMAT_NV12 || format == DXGI_FORMAT_YUY2 ||
+ format == DXGI_FORMAT_B8G8R8A8_UNORM);
+ UpdateOverlaySupport();
+ g_overlay_format_used = format;
+ DCHECK_EQ(format, GetDirectCompositionSDROverlayFormat());
+}
+
+gfx::mojom::DXGIInfoPtr GetDirectCompositionHDRMonitorDXGIInfo() {
+ auto result_info = gfx::mojom::DXGIInfo::New();
+ // HDR support was introduced in Windows 10 Creators Update.
+ if (base::win::GetVersion() < base::win::Version::WIN10_RS2)
+ return result_info;
+
+ // Only direct composition surface can allocate HDR swap chains.
+ if (!DirectCompositionSupported())
+ return result_info;
+
+ HRESULT hr = S_OK;
+ Microsoft::WRL::ComPtr<IDXGIFactory1> factory;
+ hr = CreateDXGIFactory1(IID_PPV_ARGS(&factory));
+ if (FAILED(hr)) {
+ DLOG(ERROR) << "Failed to create DXGI factory.";
+ return result_info;
+ }
+
+ bool hdr_monitor_found = false;
+ for (UINT adapter_index = 0;; ++adapter_index) {
+ Microsoft::WRL::ComPtr<IDXGIAdapter> adapter;
+ hr = factory->EnumAdapters(adapter_index, &adapter);
+ if (hr == DXGI_ERROR_NOT_FOUND)
+ break;
+ if (FAILED(hr)) {
+ DLOG(ERROR) << "Unexpected error creating DXGI adapter.";
+ break;
+ }
+
+ for (UINT output_index = 0;; ++output_index) {
+ Microsoft::WRL::ComPtr<IDXGIOutput> output;
+ hr = adapter->EnumOutputs(output_index, &output);
+ if (hr == DXGI_ERROR_NOT_FOUND)
+ break;
+ if (FAILED(hr)) {
+ DLOG(ERROR) << "Unexpected error creating DXGI adapter.";
+ break;
+ }
+
+ Microsoft::WRL::ComPtr<IDXGIOutput6> output6;
+ hr = output->QueryInterface(IID_PPV_ARGS(&output6));
+ if (FAILED(hr)) {
+ DLOG(WARNING) << "IDXGIOutput6 is required for HDR detection.";
+ continue;
+ }
+
+ DXGI_OUTPUT_DESC1 desc;
+ if (FAILED(output6->GetDesc1(&desc))) {
+ DLOG(ERROR) << "Unexpected error getting output descriptor.";
+ continue;
+ }
+
+ auto result_output = gfx::mojom::DXGIOutputDesc::New();
+ result_output->device_name = desc.DeviceName;
+ result_output->hdr_enabled =
+ desc.ColorSpace == DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020;
+ result_output->min_luminance = desc.MinLuminance;
+ result_output->max_luminance = desc.MaxLuminance;
+ result_output->max_full_frame_luminance = desc.MaxFullFrameLuminance;
+ hdr_monitor_found |= result_output->hdr_enabled;
+ result_info->output_descs.push_back(std::move(result_output));
+ }
+ }
+
+ UMA_HISTOGRAM_BOOLEAN("GPU.Output.HDR", hdr_monitor_found);
+ return result_info;
+}
+
+bool DXGISwapChainTearingSupported() {
+ static const bool supported = [] {
+ Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device =
+ QueryD3D11DeviceObjectFromANGLE();
+ if (!d3d11_device) {
+ DLOG(ERROR) << "Not using swap chain tearing because failed to retrieve "
+ "D3D11 device from ANGLE";
+ return false;
+ }
+ Microsoft::WRL::ComPtr<IDXGIDevice> dxgi_device;
+ d3d11_device.As(&dxgi_device);
+ DCHECK(dxgi_device);
+ Microsoft::WRL::ComPtr<IDXGIAdapter> dxgi_adapter;
+ dxgi_device->GetAdapter(&dxgi_adapter);
+ DCHECK(dxgi_adapter);
+ Microsoft::WRL::ComPtr<IDXGIFactory5> dxgi_factory;
+ if (FAILED(dxgi_adapter->GetParent(IID_PPV_ARGS(&dxgi_factory)))) {
+ DLOG(ERROR) << "Not using swap chain tearing because failed to retrieve "
+ "IDXGIFactory5 interface";
+ return false;
+ }
+
+ BOOL present_allow_tearing = FALSE;
+ DCHECK(dxgi_factory);
+ if (FAILED(dxgi_factory->CheckFeatureSupport(
+ DXGI_FEATURE_PRESENT_ALLOW_TEARING, &present_allow_tearing,
+ sizeof(present_allow_tearing)))) {
+ DLOG(ERROR)
+ << "Not using swap chain tearing because CheckFeatureSupport failed";
+ return false;
+ }
+ return !!present_allow_tearing;
+ }();
+ return supported;
+}
+
+bool DirectCompositionSwapChainTearingEnabled() {
+ return DXGISwapChainTearingSupported() && !features::UseGpuVsync();
+}
+
+void SetDirectCompositionOverlayWorkarounds(
+ const DirectCompositionOverlayWorkarounds& workarounds) {
+ // This has to be set before initializing overlay caps.
+ DCHECK(!OverlayCapsValid());
+ g_enable_bgra8_overlays_with_yuv_overlay_support =
+ workarounds.enable_bgra8_overlays_with_yuv_overlay_support;
+ g_force_nv12_overlay_support = workarounds.force_nv12_overlay_support;
+ g_force_rgb10a2_overlay_support = workarounds.force_rgb10a2_overlay_support;
+ g_check_ycbcr_studio_g22_left_p709_for_nv12_support =
+ workarounds.check_ycbcr_studio_g22_left_p709_for_nv12_support;
+}
+
+void SetDirectCompositionSwapChainFailed() {
+ if (!g_direct_composition_swap_chain_failed) {
+ g_direct_composition_swap_chain_failed = true;
+ DirectCompositionOverlayCapsMonitor::GetInstance()
+ ->NotifyOverlayCapsChanged();
+ }
+}
+
+void SetDirectCompositionMonitorInfoForTesting(
+ int num_monitors,
+ const gfx::Size& primary_monitor_size) {
+ g_num_monitors = num_monitors;
+ g_primary_monitor_size = primary_monitor_size;
+}
+
+// For DirectComposition Display Monitor.
+DirectCompositionOverlayCapsMonitor::DirectCompositionOverlayCapsMonitor()
+ : observer_list_(new base::ObserverListThreadSafe<
+ DirectCompositionOverlayCapsObserver>()) {
+ ui::GpuSwitchingManager::GetInstance()->AddObserver(this);
+}
+
+DirectCompositionOverlayCapsMonitor::~DirectCompositionOverlayCapsMonitor() {
+ ui::GpuSwitchingManager::GetInstance()->RemoveObserver(this);
+}
+
+// static
+DirectCompositionOverlayCapsMonitor*
+DirectCompositionOverlayCapsMonitor::GetInstance() {
+ static base::NoDestructor<DirectCompositionOverlayCapsMonitor>
+ direct_compoisition_overlay_cap_monitor;
+ return direct_compoisition_overlay_cap_monitor.get();
+}
+
+void DirectCompositionOverlayCapsMonitor::AddObserver(
+ DirectCompositionOverlayCapsObserver* observer) {
+ observer_list_->AddObserver(observer);
+}
+
+void DirectCompositionOverlayCapsMonitor::RemoveObserver(
+ DirectCompositionOverlayCapsObserver* observer) {
+ observer_list_->RemoveObserver(observer);
+}
+
+void DirectCompositionOverlayCapsMonitor::NotifyOverlayCapsChanged() {
+ observer_list_->Notify(
+ FROM_HERE, &DirectCompositionOverlayCapsObserver::OnOverlayCapsChanged);
+}
+
+// Called from GpuSwitchingObserver on the GPU main thread.
+void DirectCompositionOverlayCapsMonitor::OnGpuSwitched(
+ gl::GpuPreference active_gpu_heuristic) {}
+
+// Called from GpuSwitchingObserver on the GPU main thread.
+void DirectCompositionOverlayCapsMonitor::OnDisplayAdded() {
+ SetOverlayCapsValid(false);
+ UpdateOverlaySupport();
+ UpdateMonitorInfo();
+
+ NotifyOverlayCapsChanged();
+}
+
+// Called from GpuSwitchingObserver on the GPU main thread.
+void DirectCompositionOverlayCapsMonitor::OnDisplayRemoved() {
+ SetOverlayCapsValid(false);
+ UpdateOverlaySupport();
+ UpdateMonitorInfo();
+
+ NotifyOverlayCapsChanged();
+}
+
+// Called from GpuSwitchingObserver on the GPU main thread.
+void DirectCompositionOverlayCapsMonitor::OnDisplayMetricsChanged() {
+ UpdateMonitorInfo();
+}
+
+} // namespace gl
diff --git a/chromium/ui/gl/direct_composition_support.h b/chromium/ui/gl/direct_composition_support.h
new file mode 100644
index 00000000000..0451fb813d6
--- /dev/null
+++ b/chromium/ui/gl/direct_composition_support.h
@@ -0,0 +1,169 @@
+// 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_GL_DIRECT_COMPOSITION_SUPPORT_H_
+#define UI_GL_DIRECT_COMPOSITION_SUPPORT_H_
+
+#include <d3d11.h>
+#include <dcomp.h>
+#include <windows.h>
+#include <wrl/client.h>
+
+#include "base/no_destructor.h"
+#include "base/observer_list_threadsafe.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/mojom/dxgi_info.mojom.h"
+#include "ui/gl/gl_export.h"
+#include "ui/gl/gpu_switching_observer.h"
+
+namespace gl {
+
+class GLDisplayEGL;
+
+GL_EXPORT void InitializeDirectComposition(GLDisplayEGL* display);
+GL_EXPORT void ShutdownDirectComposition();
+
+// Retrieves the global direct composition device. InitializeDirectComposition
+// must be called on GPU process startup before the device is retrieved, and
+// ShutdownDirectComposition must be called at process shutdown.
+GL_EXPORT IDCompositionDevice2* GetDirectCompositionDevice();
+
+// Returns true if direct composition is supported. We prefer to use direct
+// composition even without hardware overlays, because it allows us to bypass
+// blitting by DWM to the window redirection surface by using a flip mode swap
+// chain. Overridden with --disable-direct-composition.
+GL_EXPORT bool DirectCompositionSupported();
+
+// Returns true if video overlays are supported and should be used. Overridden
+// with --enable-direct-composition-video-overlays and
+// --disable-direct-composition-video-overlays. This function is thread safe.
+GL_EXPORT bool DirectCompositionOverlaysSupported();
+
+// Returns true if hardware overlays are supported. This function is thread
+// safe.
+GL_EXPORT bool DirectCompositionHardwareOverlaysSupported();
+
+// After this is called, overlay support is disabled during the current GPU
+// process' lifetime.
+GL_EXPORT void DisableDirectCompositionOverlays();
+
+// Similar to the above but disables software overlay support.
+GL_EXPORT void DisableDirectCompositionSoftwareOverlays();
+
+// Returns true if zero copy decode swap chain is supported.
+GL_EXPORT bool DirectCompositionDecodeSwapChainSupported();
+GL_EXPORT void DisableDirectCompositionDecodeSwapChain();
+
+// Returns true if scaled hardware overlays are supported.
+GL_EXPORT bool DirectCompositionScaledOverlaysSupported();
+
+// Returns preferred overlay format set when detecting overlay support.
+GL_EXPORT DXGI_FORMAT GetDirectCompositionSDROverlayFormat();
+
+// Returns overlay support flags for the given format.
+// Caller should check for DXGI_OVERLAY_SUPPORT_FLAG_DIRECT and
+// DXGI_OVERLAY_SUPPORT_FLAG_SCALING bits.
+// This function is thread safe.
+GL_EXPORT UINT GetDirectCompositionOverlaySupportFlags(DXGI_FORMAT format);
+
+// Returns true if swap chain tearing flag is supported.
+GL_EXPORT bool DXGISwapChainTearingSupported();
+
+// Returns true if tearing should be used for dcomp root and video swap chains.
+GL_EXPORT bool DirectCompositionSwapChainTearingEnabled();
+
+// Returns true if there is an HDR capable display connected.
+GL_EXPORT gfx::mojom::DXGIInfoPtr GetDirectCompositionHDRMonitorDXGIInfo();
+
+// Set direct composition swap chain failure so that direct composition is
+// marked as unsupported from now on.
+GL_EXPORT void SetDirectCompositionSwapChainFailed();
+
+struct DirectCompositionOverlayWorkarounds {
+ // On Intel GPUs where YUV overlays are supported, BGRA8 overlays are
+ // supported as well but IDXGIOutput3::CheckOverlaySupport() returns
+ // unsupported. So allow manually enabling BGRA8 overlay support.
+ bool enable_bgra8_overlays_with_yuv_overlay_support = false;
+
+ // Forces to enable NV12 overlay support regardless of the query results from
+ // IDXGIOutput3::CheckOverlaySupport().
+ bool force_nv12_overlay_support = false;
+
+ // Forces to enable RGBA101010A2 overlay support regardless of the query
+ // results from IDXGIOutput3::CheckOverlaySupport().
+ bool force_rgb10a2_overlay_support = false;
+
+ // Enable NV12 overlay support only when
+ // DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709 is supported.
+ bool check_ycbcr_studio_g22_left_p709_for_nv12_support = false;
+};
+GL_EXPORT void SetDirectCompositionOverlayWorkarounds(
+ const DirectCompositionOverlayWorkarounds& workarounds);
+
+// Returns monitor size.
+GL_EXPORT gfx::Size GetDirectCompositionPrimaryMonitorSize();
+
+// Get the current number of all visible display monitors on the desktop.
+GL_EXPORT int GetDirectCompositionNumMonitors();
+
+// Testing helpers.
+GL_EXPORT void SetDirectCompositionScaledOverlaysSupportedForTesting(
+ bool value);
+GL_EXPORT void SetDirectCompositionOverlayFormatUsedForTesting(
+ DXGI_FORMAT format);
+GL_EXPORT void SetDirectCompositionMonitorInfoForTesting(
+ int num_monitors,
+ const gfx::Size& primary_monitor_size);
+
+class GL_EXPORT DirectCompositionOverlayCapsObserver
+ : public base::CheckedObserver {
+ public:
+ virtual void OnOverlayCapsChanged() = 0;
+
+ protected:
+ DirectCompositionOverlayCapsObserver() = default;
+ ~DirectCompositionOverlayCapsObserver() override = default;
+};
+
+// Upon receiving display notifications from ui::GpuSwitchingManager,
+// DirectCompositionOverlayCapsMonitor updates its overlay caps with the new
+// display setting and notifies DirectCompositionOverlayCapsObserver for the
+// overlay cap change.
+class GL_EXPORT DirectCompositionOverlayCapsMonitor
+ : public ui::GpuSwitchingObserver {
+ public:
+ DirectCompositionOverlayCapsMonitor(
+ const DirectCompositionOverlayCapsMonitor&) = delete;
+ DirectCompositionOverlayCapsMonitor& operator=(
+ const DirectCompositionOverlayCapsMonitor&) = delete;
+
+ static DirectCompositionOverlayCapsMonitor* GetInstance();
+
+ // DirectCompositionOverlayCapsMonitor is running on GpuMain thread.
+ // AddObserver()/RemoveObserver() are thread safe.
+ void AddObserver(DirectCompositionOverlayCapsObserver* observer);
+ void RemoveObserver(DirectCompositionOverlayCapsObserver* observer);
+
+ // Called when the overlay caps have changed.
+ void NotifyOverlayCapsChanged();
+
+ // Implements GpuSwitchingObserver.
+ void OnGpuSwitched(gl::GpuPreference active_gpu_heuristic) override;
+ void OnDisplayAdded() override;
+ void OnDisplayRemoved() override;
+ void OnDisplayMetricsChanged() override;
+
+ private:
+ friend class base::NoDestructor<DirectCompositionOverlayCapsMonitor>;
+
+ DirectCompositionOverlayCapsMonitor();
+ ~DirectCompositionOverlayCapsMonitor() override;
+
+ scoped_refptr<
+ base::ObserverListThreadSafe<DirectCompositionOverlayCapsObserver>>
+ observer_list_;
+};
+} // namespace gl
+
+#endif // UI_GL_DIRECT_COMPOSITION_SUPPORT_H_
diff --git a/chromium/ui/gl/direct_composition_surface_win.cc b/chromium/ui/gl/direct_composition_surface_win.cc
index 480c3800584..ed8b90ea10d 100644
--- a/chromium/ui/gl/direct_composition_surface_win.cc
+++ b/chromium/ui/gl/direct_composition_surface_win.cc
@@ -4,383 +4,16 @@
#include "ui/gl/direct_composition_surface_win.h"
-#include <dxgi1_6.h>
-
#include <memory>
#include <utility>
#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/metrics/histogram_functions.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/no_destructor.h"
-#include "base/synchronization/lock.h"
#include "base/trace_event/trace_event.h"
-#include "base/trace_event/traced_value.h"
-#include "base/win/windows_version.h"
#include "ui/gl/dc_layer_tree.h"
#include "ui/gl/direct_composition_child_surface_win.h"
-#include "ui/gl/gl_angle_util_win.h"
-#include "ui/gl/gl_bindings.h"
-#include "ui/gl/gl_features.h"
-#include "ui/gl/gl_implementation.h"
-#include "ui/gl/gl_switches.h"
-#include "ui/gl/gpu_switching_manager.h"
+#include "ui/gl/direct_composition_support.h"
namespace gl {
-namespace {
-// Whether the overlay caps are valid or not. GUARDED_BY GetOverlayLock().
-bool g_overlay_caps_valid = false;
-// Indicates support for either NV12 or YUY2 overlays. GUARDED_BY
-// GetOverlayLock().
-bool g_supports_overlays = false;
-// Whether the GPU can support hardware overlays or not.
-bool g_supports_hardware_overlays = false;
-// Whether the DecodeSwapChain is disabled or not.
-bool g_decode_swap_chain_disabled = false;
-// Whether to force the nv12 overlay support.
-bool g_force_nv12_overlay_support = false;
-// Whether software overlays have been disabled.
-bool g_disable_sw_overlays = false;
-
-// The lock to guard g_overlay_caps_valid and g_supports_overlays.
-base::Lock& GetOverlayLock() {
- static base::NoDestructor<base::Lock> overlay_lock;
- return *overlay_lock;
-}
-
-bool SupportsOverlays() {
- base::AutoLock auto_lock(GetOverlayLock());
- return g_supports_overlays;
-}
-
-bool SupportsHardwareOverlays() {
- base::AutoLock auto_lock(GetOverlayLock());
- return g_supports_hardware_overlays;
-}
-
-void SetSupportsOverlays(bool support) {
- base::AutoLock auto_lock(GetOverlayLock());
- g_supports_overlays = support;
-}
-
-void SetSupportsHardwareOverlays(bool support) {
- base::AutoLock auto_lock(GetOverlayLock());
- g_supports_hardware_overlays = support;
-}
-
-bool SupportsSoftwareOverlays() {
- return base::FeatureList::IsEnabled(
- features::kDirectCompositionSoftwareOverlays) &&
- !g_disable_sw_overlays;
-}
-
-bool OverlayCapsValid() {
- base::AutoLock auto_lock(GetOverlayLock());
- return g_overlay_caps_valid;
-}
-void SetOverlayCapsValid(bool valid) {
- base::AutoLock auto_lock(GetOverlayLock());
- g_overlay_caps_valid = valid;
-}
-// A warpper of IDXGIOutput4::CheckOverlayColorSpaceSupport()
-bool CheckOverlayColorSpaceSupport(
- DXGI_FORMAT dxgi_format,
- DXGI_COLOR_SPACE_TYPE dxgi_color_space,
- Microsoft::WRL::ComPtr<IDXGIOutput> output,
- Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device) {
- UINT color_space_support_flags = 0;
- Microsoft::WRL::ComPtr<IDXGIOutput4> output4;
- if (FAILED(output.As(&output4)) ||
- FAILED(output4->CheckOverlayColorSpaceSupport(
- dxgi_format, dxgi_color_space, d3d11_device.Get(),
- &color_space_support_flags)))
- return false;
- return (color_space_support_flags &
- DXGI_OVERLAY_COLOR_SPACE_SUPPORT_FLAG_PRESENT);
-}
-
-// Used for adjusting overlay size to monitor size.
-gfx::Size g_primary_monitor_size;
-
-// The number of all visible display monitors on a desktop.
-int g_num_of_monitors = 0;
-
-Microsoft::WRL::ComPtr<IDCompositionDevice2> g_dcomp_device;
-
-DirectCompositionSurfaceWin::OverlayHDRInfoUpdateCallback
- g_overlay_hdr_gpu_info_callback;
-
-// Preferred overlay format set when detecting overlay support during
-// initialization. Set to NV12 by default so that it's used when enabling
-// overlays using command line flags.
-DXGI_FORMAT g_overlay_format_used = DXGI_FORMAT_NV12;
-DXGI_FORMAT g_overlay_format_used_hdr = DXGI_FORMAT_UNKNOWN;
-
-// These are the raw support info, which shouldn't depend on field trial state,
-// or command line flags. GUARDED_BY GetOverlayLock().
-UINT g_nv12_overlay_support_flags = 0;
-UINT g_yuy2_overlay_support_flags = 0;
-UINT g_bgra8_overlay_support_flags = 0;
-UINT g_rgb10a2_overlay_support_flags = 0;
-
-// When this is set, if NV12 or YUY2 overlays are supported, set BGRA8 overlays
-// as supported as well.
-bool g_enable_bgra8_overlays_with_yuv_overlay_support = false;
-
-// Force enabling DXGI_FORMAT_R10G10B10A2_UNORM format for overlay. Intel
-// celake and Tigerlake fail to report the cap of this HDR overlay format.
-// TODO(magchen@): Remove this workaround when this cap is fixed in the Intel
-// drivers.
-bool g_force_rgb10a2_overlay_support = false;
-
-// Per Intel's request, only use NV12 for overlay when
-// COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709 is also supported. At least one Intel
-// Gen9 SKU does not support NV12 overlays and it cannot be screened by the
-// device id.
-bool g_check_ycbcr_studio_g22_left_p709_for_nv12_support = false;
-
-void SetOverlaySupportFlagsForFormats(UINT nv12_flags,
- UINT yuy2_flags,
- UINT bgra8_flags,
- UINT rgb10a2_flags) {
- base::AutoLock auto_lock(GetOverlayLock());
- g_nv12_overlay_support_flags = nv12_flags;
- g_yuy2_overlay_support_flags = yuy2_flags;
- g_bgra8_overlay_support_flags = bgra8_flags;
- g_rgb10a2_overlay_support_flags = rgb10a2_flags;
-}
-
-bool FlagsSupportsOverlays(UINT flags) {
- return (flags & (DXGI_OVERLAY_SUPPORT_FLAG_DIRECT |
- DXGI_OVERLAY_SUPPORT_FLAG_SCALING));
-}
-
-void GetGpuDriverOverlayInfo(bool* supports_overlays,
- bool* supports_hardware_overlays,
- DXGI_FORMAT* overlay_format_used,
- DXGI_FORMAT* overlay_format_used_hdr,
- UINT* nv12_overlay_support_flags,
- UINT* yuy2_overlay_support_flags,
- UINT* bgra8_overlay_support_flags,
- UINT* rgb10a2_overlay_support_flags) {
- // Initialization
- *supports_overlays = false;
- *supports_hardware_overlays = false;
- *overlay_format_used = DXGI_FORMAT_NV12;
- *overlay_format_used_hdr = DXGI_FORMAT_R10G10B10A2_UNORM;
- *nv12_overlay_support_flags = 0;
- *yuy2_overlay_support_flags = 0;
- *bgra8_overlay_support_flags = 0;
- *rgb10a2_overlay_support_flags = 0;
-
- // Check for DirectComposition support first to prevent likely crashes.
- if (!DirectCompositionSurfaceWin::IsDirectCompositionSupported())
- return;
-
- // Before Windows 10 Anniversary Update (Redstone 1), overlay planes wouldn't
- // be assigned to non-UWP apps.
- if (base::win::GetVersion() < base::win::Version::WIN10_RS1)
- return;
-
- Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device =
- QueryD3D11DeviceObjectFromANGLE();
- if (!d3d11_device) {
- DLOG(ERROR) << "Failed to retrieve D3D11 device";
- return;
- }
-
- Microsoft::WRL::ComPtr<IDXGIDevice> dxgi_device;
- if (FAILED(d3d11_device.As(&dxgi_device))) {
- DLOG(ERROR) << "Failed to retrieve DXGI device";
- return;
- }
-
- Microsoft::WRL::ComPtr<IDXGIAdapter> dxgi_adapter;
- if (FAILED(dxgi_device->GetAdapter(&dxgi_adapter))) {
- DLOG(ERROR) << "Failed to retrieve DXGI adapter";
- return;
- }
-
- // This will fail if the D3D device is "Microsoft Basic Display Adapter".
- Microsoft::WRL::ComPtr<ID3D11VideoDevice> video_device;
- if (FAILED(d3d11_device.As(&video_device))) {
- DLOG(ERROR) << "Failed to retrieve video device";
- return;
- }
-
- unsigned int i = 0;
- while (true) {
- Microsoft::WRL::ComPtr<IDXGIOutput> output;
- if (FAILED(dxgi_adapter->EnumOutputs(i++, &output)))
- break;
- DCHECK(output);
- Microsoft::WRL::ComPtr<IDXGIOutput3> output3;
- if (FAILED(output.As(&output3)))
- continue;
- DCHECK(output3);
- output3->CheckOverlaySupport(DXGI_FORMAT_NV12, d3d11_device.Get(),
- nv12_overlay_support_flags);
- output3->CheckOverlaySupport(DXGI_FORMAT_YUY2, d3d11_device.Get(),
- yuy2_overlay_support_flags);
- output3->CheckOverlaySupport(DXGI_FORMAT_B8G8R8A8_UNORM, d3d11_device.Get(),
- bgra8_overlay_support_flags);
- // Today it still returns false, which blocks Chrome from using HDR
- // overlays.
- output3->CheckOverlaySupport(DXGI_FORMAT_R10G10B10A2_UNORM,
- d3d11_device.Get(),
- rgb10a2_overlay_support_flags);
- if (FlagsSupportsOverlays(*nv12_overlay_support_flags)) {
- // NV12 format is preferred if it's supported.
- *overlay_format_used = DXGI_FORMAT_NV12;
- *supports_hardware_overlays = true;
-
- if (g_check_ycbcr_studio_g22_left_p709_for_nv12_support &&
- !CheckOverlayColorSpaceSupport(
- DXGI_FORMAT_NV12, DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709,
- output, d3d11_device)) {
- // Some new Intel drivers only claim to support unscaled overlays, but
- // scaled overlays still work. It's possible DWM works around it by
- // performing an extra scaling Blt before calling the driver. Even when
- // scaled overlays aren't actually supported, presentation using the
- // overlay path should be relatively efficient.
- *supports_hardware_overlays = false;
- }
- }
- if (!*supports_hardware_overlays &&
- FlagsSupportsOverlays(*yuy2_overlay_support_flags)) {
- // If NV12 isn't supported, fallback to YUY2 if it's supported.
- *overlay_format_used = DXGI_FORMAT_YUY2;
- *supports_hardware_overlays = true;
- }
- if (g_enable_bgra8_overlays_with_yuv_overlay_support) {
- if (FlagsSupportsOverlays(*nv12_overlay_support_flags))
- *bgra8_overlay_support_flags = *nv12_overlay_support_flags;
- else if (FlagsSupportsOverlays(*yuy2_overlay_support_flags))
- *bgra8_overlay_support_flags = *yuy2_overlay_support_flags;
- }
-
- // RGB10A2 overlay is used for displaying HDR content. In Intel's
- // platform, RGB10A2 overlay is enabled only when
- // DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 is supported.
- if (FlagsSupportsOverlays(*rgb10a2_overlay_support_flags)) {
- if (!CheckOverlayColorSpaceSupport(
- DXGI_FORMAT_R10G10B10A2_UNORM,
- DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020, output, d3d11_device))
- *rgb10a2_overlay_support_flags = 0;
- }
- if (g_force_rgb10a2_overlay_support) {
- *rgb10a2_overlay_support_flags = DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
- }
-
- // Early out after the first output that reports overlay support. All
- // outputs are expected to report the same overlay support according to
- // Microsoft's WDDM documentation:
- // https://docs.microsoft.com/en-us/windows-hardware/drivers/display/multiplane-overlay-hardware-requirements
- // TODO(sunnyps): If the above is true, then we can only look at first
- // output instead of iterating over all outputs.
- if (*supports_hardware_overlays)
- break;
- }
-
- *supports_overlays = *supports_hardware_overlays;
- if (*supports_hardware_overlays || !SupportsSoftwareOverlays()) {
- return;
- }
-
- // If no devices with hardware overlay support were found use software ones.
- *supports_overlays = true;
- *nv12_overlay_support_flags = 0;
- *yuy2_overlay_support_flags = 0;
- *bgra8_overlay_support_flags = 0;
- *rgb10a2_overlay_support_flags = 0;
-
- // Software overlays always use NV12 because it's slightly more efficient and
- // YUY2 was only used because Skylake doesn't support NV12 hardware overlays.
- *overlay_format_used = DXGI_FORMAT_NV12;
-}
-
-void UpdateOverlaySupport() {
- if (OverlayCapsValid())
- return;
- SetOverlayCapsValid(true);
-
- bool supports_overlays = false;
- bool supports_hardware_overlays = false;
- DXGI_FORMAT overlay_format_used = DXGI_FORMAT_NV12;
- DXGI_FORMAT overlay_format_used_hdr = DXGI_FORMAT_R10G10B10A2_UNORM;
- UINT nv12_overlay_support_flags = 0;
- UINT yuy2_overlay_support_flags = 0;
- UINT bgra8_overlay_support_flags = 0;
- UINT rgb10a2_overlay_support_flags = 0;
-
- GetGpuDriverOverlayInfo(
- &supports_overlays, &supports_hardware_overlays, &overlay_format_used,
- &overlay_format_used_hdr, &nv12_overlay_support_flags,
- &yuy2_overlay_support_flags, &bgra8_overlay_support_flags,
- &rgb10a2_overlay_support_flags);
-
- if (g_force_nv12_overlay_support) {
- supports_overlays = true;
- nv12_overlay_support_flags = DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
- overlay_format_used = DXGI_FORMAT_NV12;
- }
-
- if (base::CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kDirectCompositionVideoSwapChainFormat)) {
- std::string override_format =
- base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
- switches::kDirectCompositionVideoSwapChainFormat);
- if (override_format == kSwapChainFormatNV12) {
- overlay_format_used = DXGI_FORMAT_NV12;
- } else if (override_format == kSwapChainFormatYUY2) {
- overlay_format_used = DXGI_FORMAT_YUY2;
- } else if (override_format == kSwapChainFormatBGRA) {
- overlay_format_used = DXGI_FORMAT_B8G8R8A8_UNORM;
- } else {
- DLOG(ERROR) << "Invalid value for switch "
- << switches::kDirectCompositionVideoSwapChainFormat;
- }
- }
-
- // Record histograms.
- if (supports_overlays) {
- base::UmaHistogramSparse("GPU.DirectComposition.OverlayFormatUsed3",
- overlay_format_used);
- }
- base::UmaHistogramBoolean("GPU.DirectComposition.OverlaysSupported",
- supports_overlays);
- base::UmaHistogramBoolean("GPU.DirectComposition.HardwareOverlaysSupported",
- supports_hardware_overlays);
-
- // Update global caps.
- SetSupportsOverlays(supports_overlays);
- SetSupportsHardwareOverlays(supports_hardware_overlays);
- SetOverlaySupportFlagsForFormats(
- nv12_overlay_support_flags, yuy2_overlay_support_flags,
- bgra8_overlay_support_flags, rgb10a2_overlay_support_flags);
- g_overlay_format_used = overlay_format_used;
- g_overlay_format_used_hdr = overlay_format_used_hdr;
-}
-
-void RunOverlayHdrGpuInfoUpdateCallback() {
- if (g_overlay_hdr_gpu_info_callback)
- g_overlay_hdr_gpu_info_callback.Run();
-}
-
-void UpdateMonitorInfo() {
- g_num_of_monitors = GetSystemMetrics(SM_CMONITORS);
-
- MONITORINFO monitor_info;
- monitor_info.cbSize = sizeof(monitor_info);
- if (GetMonitorInfo(MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY),
- &monitor_info)) {
- g_primary_monitor_size = gfx::Rect(monitor_info.rcMonitor).size();
- } else {
- g_primary_monitor_size = gfx::Size();
- }
-}
-} // namespace
DirectCompositionSurfaceWin::DirectCompositionSurfaceWin(
GLDisplayEGL* display,
@@ -400,396 +33,14 @@ DirectCompositionSurfaceWin::DirectCompositionSurfaceWin(
settings.disable_nv12_dynamic_textures,
settings.disable_vp_scaling,
settings.disable_vp_super_resolution,
- settings.no_downscaled_overlay_promotion)) {
- ui::GpuSwitchingManager::GetInstance()->AddObserver(this);
-}
+ settings.no_downscaled_overlay_promotion)) {}
DirectCompositionSurfaceWin::~DirectCompositionSurfaceWin() {
- ui::GpuSwitchingManager::GetInstance()->RemoveObserver(this);
Destroy();
}
-// static
-void DirectCompositionSurfaceWin::InitializeOneOff(GLDisplayEGL* display) {
- DCHECK(!g_dcomp_device);
-
- if (base::CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kDisableDirectComposition))
- return;
-
- // Direct composition can only be used with ANGLE.
- if (gl::GetGLImplementation() != gl::kGLImplementationEGLANGLE)
- return;
-
- // Blocklist direct composition if MCTU.dll or MCTUX.dll are injected. These
- // are user mode drivers for display adapters from Magic Control Technology
- // Corporation.
- if (GetModuleHandle(TEXT("MCTU.dll")) || GetModuleHandle(TEXT("MCTUX.dll"))) {
- DLOG(ERROR) << "Blocklisted due to third party modules";
- return;
- }
-
- // EGL_KHR_no_config_context surface compatibility is required to be able to
- // MakeCurrent with the default pbuffer surface.
- if (!display->IsEGLNoConfigContextSupported()) {
- DLOG(ERROR) << "EGL_KHR_no_config_context not supported";
- return;
- }
-
- Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device =
- QueryD3D11DeviceObjectFromANGLE();
- if (!d3d11_device) {
- DLOG(ERROR) << "Failed to retrieve D3D11 device";
- return;
- }
-
- // This will fail if the D3D device is "Microsoft Basic Display Adapter".
- Microsoft::WRL::ComPtr<ID3D11VideoDevice> video_device;
- if (FAILED(d3d11_device.As(&video_device))) {
- DLOG(ERROR) << "Failed to retrieve video device";
- return;
- }
-
- // Load DLL at runtime since older Windows versions don't have dcomp.
- HMODULE dcomp_module = ::GetModuleHandle(L"dcomp.dll");
- if (!dcomp_module) {
- DLOG(ERROR) << "Failed to load dcomp.dll";
- return;
- }
-
- using PFN_DCOMPOSITION_CREATE_DEVICE2 = HRESULT(WINAPI*)(
- IUnknown * renderingDevice, REFIID iid, void** dcompositionDevice);
- PFN_DCOMPOSITION_CREATE_DEVICE2 create_device_function =
- reinterpret_cast<PFN_DCOMPOSITION_CREATE_DEVICE2>(
- ::GetProcAddress(dcomp_module, "DCompositionCreateDevice2"));
- if (!create_device_function) {
- DLOG(ERROR) << "GetProcAddress failed for DCompositionCreateDevice2";
- return;
- }
-
- Microsoft::WRL::ComPtr<IDXGIDevice> dxgi_device;
- d3d11_device.As(&dxgi_device);
-
- Microsoft::WRL::ComPtr<IDCompositionDesktopDevice> desktop_device;
- HRESULT hr =
- create_device_function(dxgi_device.Get(), IID_PPV_ARGS(&desktop_device));
- if (FAILED(hr)) {
- DLOG(ERROR) << "DCompositionCreateDevice2 failed with error 0x" << std::hex
- << hr;
- return;
- }
-
- hr = desktop_device.As(&g_dcomp_device);
- if (FAILED(hr)) {
- DLOG(ERROR) << "Failed to retrieve IDCompositionDevice2 with error 0x"
- << std::hex << hr;
- return;
- }
- DCHECK(g_dcomp_device);
-}
-
-// static
-void DirectCompositionSurfaceWin::ShutdownOneOff() {
- g_dcomp_device.Reset();
-}
-
-// static
-const Microsoft::WRL::ComPtr<IDCompositionDevice2>&
-DirectCompositionSurfaceWin::GetDirectCompositionDevice() {
- return g_dcomp_device;
-}
-
-// static
-bool DirectCompositionSurfaceWin::IsDirectCompositionSupported() {
- bool swap_chain_failed =
- DirectCompositionChildSurfaceWin::IsDirectCompositionSwapChainFailed();
- return g_dcomp_device && !swap_chain_failed;
-}
-
-// static
-bool DirectCompositionSurfaceWin::AreOverlaysSupported() {
- // Always initialize and record overlay support information irrespective of
- // command line flags.
- UpdateOverlaySupport();
-
- base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
- // Enable flag should be checked before the disable flag, so we could
- // overwrite GPU driver bug workarounds in testing.
- if (command_line->HasSwitch(switches::kEnableDirectCompositionVideoOverlays))
- return true;
- if (command_line->HasSwitch(switches::kDisableDirectCompositionVideoOverlays))
- return false;
-
- return SupportsOverlays();
-}
-
-bool DirectCompositionSurfaceWin::AreHardwareOverlaysSupported() {
- UpdateOverlaySupport();
- return SupportsHardwareOverlays();
-}
-
-// static
-bool DirectCompositionSurfaceWin::IsDecodeSwapChainSupported() {
- if (!g_decode_swap_chain_disabled) {
- UpdateOverlaySupport();
- return GetOverlayFormatUsedForSDR() == DXGI_FORMAT_NV12;
- }
- return false;
-}
-
-// static
-void DirectCompositionSurfaceWin::DisableDecodeSwapChain() {
- g_decode_swap_chain_disabled = true;
-}
-
-// static
-void DirectCompositionSurfaceWin::DisableOverlays() {
- SetSupportsOverlays(false);
- RunOverlayHdrGpuInfoUpdateCallback();
-}
-
-// static
-void DirectCompositionSurfaceWin::DisableSoftwareOverlays() {
- g_disable_sw_overlays = true;
-}
-
-// static
-void DirectCompositionSurfaceWin::InvalidateOverlayCaps() {
- SetOverlayCapsValid(false);
-}
-
-// static
-bool DirectCompositionSurfaceWin::AreScaledOverlaysSupported() {
- UpdateOverlaySupport();
- if (g_overlay_format_used == DXGI_FORMAT_NV12) {
- return (g_nv12_overlay_support_flags & DXGI_OVERLAY_SUPPORT_FLAG_SCALING) ||
- (SupportsOverlays() && SupportsSoftwareOverlays());
- } else if (g_overlay_format_used == DXGI_FORMAT_YUY2) {
- return !!(g_yuy2_overlay_support_flags & DXGI_OVERLAY_SUPPORT_FLAG_SCALING);
- } else {
- DCHECK_EQ(g_overlay_format_used, DXGI_FORMAT_B8G8R8A8_UNORM);
- // Assume scaling is supported for BGRA overlays.
- return true;
- }
-}
-
-// static
-UINT DirectCompositionSurfaceWin::GetOverlaySupportFlags(DXGI_FORMAT format) {
- UpdateOverlaySupport();
- base::AutoLock auto_lock(GetOverlayLock());
- UINT support_flag = 0;
- switch (format) {
- case DXGI_FORMAT_NV12:
- support_flag = g_nv12_overlay_support_flags;
- break;
- case DXGI_FORMAT_YUY2:
- support_flag = g_yuy2_overlay_support_flags;
- break;
- case DXGI_FORMAT_B8G8R8A8_UNORM:
- support_flag = g_bgra8_overlay_support_flags;
- break;
- case DXGI_FORMAT_R10G10B10A2_UNORM:
- support_flag = g_rgb10a2_overlay_support_flags;
- break;
- default:
- NOTREACHED();
- break;
- }
- return support_flag;
-}
-
-// static
-gfx::Size DirectCompositionSurfaceWin::GetPrimaryMonitorSize() {
- return g_primary_monitor_size;
-}
-
-// static
-int DirectCompositionSurfaceWin::GetNumOfMonitors() {
- return g_num_of_monitors;
-}
-
-// static
-DXGI_FORMAT DirectCompositionSurfaceWin::GetOverlayFormatUsedForSDR() {
- return g_overlay_format_used;
-}
-
-// static
-void DirectCompositionSurfaceWin::SetScaledOverlaysSupportedForTesting(
- bool supported) {
- UpdateOverlaySupport();
- if (supported) {
- g_nv12_overlay_support_flags |= DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
- g_yuy2_overlay_support_flags |= DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
- g_rgb10a2_overlay_support_flags |= DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
- } else {
- g_nv12_overlay_support_flags &= ~DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
- g_yuy2_overlay_support_flags &= ~DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
- g_rgb10a2_overlay_support_flags &= ~DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
- }
- g_disable_sw_overlays = !supported;
- SetSupportsHardwareOverlays(supported);
- DCHECK_EQ(supported, AreScaledOverlaysSupported());
-}
-
-// static
-void DirectCompositionSurfaceWin::SetOverlayFormatUsedForTesting(
- DXGI_FORMAT format) {
- DCHECK(format == DXGI_FORMAT_NV12 || format == DXGI_FORMAT_YUY2 ||
- format == DXGI_FORMAT_B8G8R8A8_UNORM);
- UpdateOverlaySupport();
- g_overlay_format_used = format;
- DCHECK_EQ(format, GetOverlayFormatUsedForSDR());
-}
-
-// static
-gfx::mojom::DXGIInfoPtr DirectCompositionSurfaceWin::GetDXGIInfo() {
- auto result_info = gfx::mojom::DXGIInfo::New();
- // HDR support was introduced in Windows 10 Creators Update.
- if (base::win::GetVersion() < base::win::Version::WIN10_RS2)
- return result_info;
-
- // Only direct composition surface can allocate HDR swap chains.
- if (!IsDirectCompositionSupported())
- return result_info;
-
- HRESULT hr = S_OK;
- Microsoft::WRL::ComPtr<IDXGIFactory1> factory;
- hr = CreateDXGIFactory1(IID_PPV_ARGS(&factory));
- if (FAILED(hr)) {
- DLOG(ERROR) << "Failed to create DXGI factory.";
- return result_info;
- }
-
- bool hdr_monitor_found = false;
- for (UINT adapter_index = 0;; ++adapter_index) {
- Microsoft::WRL::ComPtr<IDXGIAdapter> adapter;
- hr = factory->EnumAdapters(adapter_index, &adapter);
- if (hr == DXGI_ERROR_NOT_FOUND)
- break;
- if (FAILED(hr)) {
- DLOG(ERROR) << "Unexpected error creating DXGI adapter.";
- break;
- }
-
- for (UINT output_index = 0;; ++output_index) {
- Microsoft::WRL::ComPtr<IDXGIOutput> output;
- hr = adapter->EnumOutputs(output_index, &output);
- if (hr == DXGI_ERROR_NOT_FOUND)
- break;
- if (FAILED(hr)) {
- DLOG(ERROR) << "Unexpected error creating DXGI adapter.";
- break;
- }
-
- Microsoft::WRL::ComPtr<IDXGIOutput6> output6;
- hr = output->QueryInterface(IID_PPV_ARGS(&output6));
- if (FAILED(hr)) {
- DLOG(WARNING) << "IDXGIOutput6 is required for HDR detection.";
- continue;
- }
-
- DXGI_OUTPUT_DESC1 desc;
- if (FAILED(output6->GetDesc1(&desc))) {
- DLOG(ERROR) << "Unexpected error getting output descriptor.";
- continue;
- }
-
- auto result_output = gfx::mojom::DXGIOutputDesc::New();
- result_output->device_name = desc.DeviceName;
- result_output->hdr_enabled =
- desc.ColorSpace == DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020;
- result_output->min_luminance = desc.MinLuminance;
- result_output->max_luminance = desc.MaxLuminance;
- result_output->max_full_frame_luminance = desc.MaxFullFrameLuminance;
- hdr_monitor_found |= result_output->hdr_enabled;
- result_info->output_descs.push_back(std::move(result_output));
- }
- }
-
- UMA_HISTOGRAM_BOOLEAN("GPU.Output.HDR", hdr_monitor_found);
- return result_info;
-}
-
-// static
-bool DirectCompositionSurfaceWin::IsSwapChainTearingSupported() {
- static const bool supported = [] {
- Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device =
- QueryD3D11DeviceObjectFromANGLE();
- if (!d3d11_device) {
- DLOG(ERROR) << "Not using swap chain tearing because failed to retrieve "
- "D3D11 device from ANGLE";
- return false;
- }
- Microsoft::WRL::ComPtr<IDXGIDevice> dxgi_device;
- d3d11_device.As(&dxgi_device);
- DCHECK(dxgi_device);
- Microsoft::WRL::ComPtr<IDXGIAdapter> dxgi_adapter;
- dxgi_device->GetAdapter(&dxgi_adapter);
- DCHECK(dxgi_adapter);
- Microsoft::WRL::ComPtr<IDXGIFactory5> dxgi_factory;
- if (FAILED(dxgi_adapter->GetParent(IID_PPV_ARGS(&dxgi_factory)))) {
- DLOG(ERROR) << "Not using swap chain tearing because failed to retrieve "
- "IDXGIFactory5 interface";
- return false;
- }
-
- BOOL present_allow_tearing = FALSE;
- DCHECK(dxgi_factory);
- if (FAILED(dxgi_factory->CheckFeatureSupport(
- DXGI_FEATURE_PRESENT_ALLOW_TEARING, &present_allow_tearing,
- sizeof(present_allow_tearing)))) {
- DLOG(ERROR)
- << "Not using swap chain tearing because CheckFeatureSupport failed";
- return false;
- }
- return !!present_allow_tearing;
- }();
- return supported;
-}
-
-// static
-bool DirectCompositionSurfaceWin::AllowTearing() {
- // Swap chain tearing is used only if vsync is disabled explicitly.
- return !features::UseGpuVsync() &&
- DirectCompositionSurfaceWin::IsSwapChainTearingSupported();
-}
-
-// static
-void DirectCompositionSurfaceWin::SetOverlayHDRGpuInfoUpdateCallback(
- OverlayHDRInfoUpdateCallback callback) {
- g_overlay_hdr_gpu_info_callback = std::move(callback);
-}
-
-// static
-void DirectCompositionSurfaceWin::EnableBGRA8OverlaysWithYUVOverlaySupport() {
- // This has to be set before initializing overlay caps.
- DCHECK(!OverlayCapsValid());
- g_enable_bgra8_overlays_with_yuv_overlay_support = true;
-}
-
-// static
-void DirectCompositionSurfaceWin::ForceNV12OverlaySupport() {
- // This has to be set before initializing overlay caps.
- DCHECK(!OverlayCapsValid());
- g_force_nv12_overlay_support = true;
-}
-
-// static
-void DirectCompositionSurfaceWin::ForceRgb10a2OverlaySupport() {
- // This has to be set before initializing overlay caps.
- DCHECK(!OverlayCapsValid());
- g_force_rgb10a2_overlay_support = true;
-}
-// static
-void DirectCompositionSurfaceWin::
- SetCheckYCbCrStudioG22LeftP709ForNv12Support() {
- // This has to be set before initializing overlay caps.
- DCHECK(!OverlayCapsValid());
- g_check_ycbcr_studio_g22_left_p709_for_nv12_support = true;
-}
-
bool DirectCompositionSurfaceWin::Initialize(GLSurfaceFormat format) {
- if (!IsDirectCompositionSupported()) {
+ if (!DirectCompositionSupported()) {
DLOG(ERROR) << "Direct composition not supported";
return false;
}
@@ -804,7 +55,6 @@ bool DirectCompositionSurfaceWin::Initialize(GLSurfaceFormat format) {
if (!root_surface_->Initialize(GLSurfaceFormat()))
return false;
- UpdateMonitorInfo();
return true;
}
@@ -817,8 +67,8 @@ void DirectCompositionSurfaceWin::Destroy() {
// that if DWM.exe crashes, the Chromium window will become black until
// the next Commit.
layer_tree_.reset();
- if (g_dcomp_device)
- g_dcomp_device->Commit();
+ if (auto* dcomp_device = GetDirectCompositionDevice())
+ dcomp_device->Commit();
}
gfx::Size DirectCompositionSurfaceWin::GetSize() {
@@ -916,17 +166,11 @@ bool DirectCompositionSurfaceWin::SupportsDCLayers() const {
bool DirectCompositionSurfaceWin::SupportsProtectedVideo() const {
// TODO(magchen): Check the gpu driver date (or a function) which we know this
// new support is enabled.
- return AreOverlaysSupported();
+ return DirectCompositionOverlaysSupported();
}
-bool DirectCompositionSurfaceWin::SetDrawRectangle(const gfx::Rect& rectangle) {
- bool result = root_surface_->SetDrawRectangle(rectangle);
- if (!result &&
- DirectCompositionChildSurfaceWin::IsDirectCompositionSwapChainFailed()) {
- RunOverlayHdrGpuInfoUpdateCallback();
- }
-
- return result;
+bool DirectCompositionSurfaceWin::SetDrawRectangle(const gfx::Rect& rect) {
+ return root_surface_->SetDrawRectangle(rect);
}
gfx::Vector2d DirectCompositionSurfaceWin::GetDrawOffset() const {
@@ -941,29 +185,6 @@ void DirectCompositionSurfaceWin::SetGpuVSyncEnabled(bool enabled) {
root_surface_->SetGpuVSyncEnabled(enabled);
}
-void DirectCompositionSurfaceWin::OnGpuSwitched(
- gl::GpuPreference active_gpu_heuristic) {}
-
-void DirectCompositionSurfaceWin::OnDisplayAdded() {
- InvalidateOverlayCaps();
- UpdateOverlaySupport();
- UpdateMonitorInfo();
- layer_tree_->GetHDRMetadataHelper()->UpdateDisplayMetadata();
- RunOverlayHdrGpuInfoUpdateCallback();
-}
-
-void DirectCompositionSurfaceWin::OnDisplayRemoved() {
- InvalidateOverlayCaps();
- UpdateOverlaySupport();
- UpdateMonitorInfo();
- layer_tree_->GetHDRMetadataHelper()->UpdateDisplayMetadata();
- RunOverlayHdrGpuInfoUpdateCallback();
-}
-
-void DirectCompositionSurfaceWin::OnDisplayMetricsChanged() {
- UpdateMonitorInfo();
-}
-
bool DirectCompositionSurfaceWin::SupportsDelegatedInk() {
return layer_tree_->SupportsDelegatedInk();
}
@@ -1009,11 +230,4 @@ void DirectCompositionSurfaceWin::GetSwapChainVisualInfoForTesting(
index, transform, offset, clip_rect);
}
-void DirectCompositionSurfaceWin::SetMonitorInfoForTesting(
- int num_of_monitors,
- gfx::Size monitor_size) {
- g_num_of_monitors = num_of_monitors;
- g_primary_monitor_size = monitor_size;
-}
-
} // namespace gl
diff --git a/chromium/ui/gl/direct_composition_surface_win.h b/chromium/ui/gl/direct_composition_surface_win.h
index 0e2a094f68d..010612c1409 100644
--- a/chromium/ui/gl/direct_composition_surface_win.h
+++ b/chromium/ui/gl/direct_composition_surface_win.h
@@ -10,15 +10,13 @@
#include <dcomp.h>
#include <wrl/client.h>
-#include "base/callback.h"
+#include "base/memory/scoped_refptr.h"
#include "base/time/time.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "ui/gfx/geometry/transform.h"
-#include "ui/gfx/mojom/dxgi_info.mojom.h"
#include "ui/gl/child_window_win.h"
#include "ui/gl/gl_export.h"
#include "ui/gl/gl_surface_egl.h"
-#include "ui/gl/gpu_switching_observer.h"
#include "ui/gl/vsync_observer.h"
namespace gfx {
@@ -32,8 +30,7 @@ namespace gl {
class DCLayerTree;
class DirectCompositionChildSurfaceWin;
-class GL_EXPORT DirectCompositionSurfaceWin : public GLSurfaceEGL,
- public ui::GpuSwitchingObserver {
+class GL_EXPORT DirectCompositionSurfaceWin : public GLSurfaceEGL {
public:
using VSyncCallback =
base::RepeatingCallback<void(base::TimeTicks, base::TimeDelta)>;
@@ -60,91 +57,6 @@ class GL_EXPORT DirectCompositionSurfaceWin : public GLSurfaceEGL,
DirectCompositionSurfaceWin& operator=(const DirectCompositionSurfaceWin&) =
delete;
- static void InitializeOneOff(GLDisplayEGL* display);
- static void ShutdownOneOff();
-
- static const Microsoft::WRL::ComPtr<IDCompositionDevice2>&
- GetDirectCompositionDevice();
-
- // Returns true if direct composition is supported. We prefer to use direct
- // composition even without hardware overlays, because it allows us to bypass
- // blitting by DWM to the window redirection surface by using a flip mode swap
- // chain. Overridden with --disable-direct-composition.
- static bool IsDirectCompositionSupported();
-
- // Returns true if video overlays are supported and should be used. Overridden
- // with --enable-direct-composition-video-overlays and
- // --disable-direct-composition-video-overlays. This function is thread safe.
- static bool AreOverlaysSupported();
-
- // Returns if the GPU supports hardware overlays. This function is thread
- // safe.
- static bool AreHardwareOverlaysSupported();
-
- // Returns true if zero copy decode swap chain is supported.
- static bool IsDecodeSwapChainSupported();
- static void DisableDecodeSwapChain();
-
- // After this is called, overlay support is disabled during the
- // current GPU process' lifetime.
- static void DisableOverlays();
-
- // Similar to the above but disables software overlay support.
- static void DisableSoftwareOverlays();
-
- // Indicate the overlay caps are invalid.
- static void InvalidateOverlayCaps();
-
- // Returns true if scaled hardware overlays are supported.
- static bool AreScaledOverlaysSupported();
-
- // Returns preferred overlay format set when detecting overlay support.
- static DXGI_FORMAT GetOverlayFormatUsedForSDR();
-
- // Returns monitor size.
- static gfx::Size GetPrimaryMonitorSize();
-
- // Get the current number of all visible display monitors on the desktop.
- static int GetNumOfMonitors();
-
- // Returns overlay support flags for the given format.
- // Caller should check for DXGI_OVERLAY_SUPPORT_FLAG_DIRECT and
- // DXGI_OVERLAY_SUPPORT_FLAG_SCALING bits.
- // This function is thread safe.
- static UINT GetOverlaySupportFlags(DXGI_FORMAT format);
-
- // Returns true if there is an HDR capable display connected.
- static gfx::mojom::DXGIInfoPtr GetDXGIInfo();
-
- // Returns true if swap chain tearing is supported.
- static bool IsSwapChainTearingSupported();
-
- static bool AllowTearing();
-
- static void SetScaledOverlaysSupportedForTesting(bool value);
-
- static void SetOverlayFormatUsedForTesting(DXGI_FORMAT format);
-
- static void SetOverlayHDRGpuInfoUpdateCallback(
- OverlayHDRInfoUpdateCallback callback);
-
- // On Intel GPUs where YUV overlays are supported, BGRA8 overlays are
- // supported as well but IDXGIOutput3::CheckOverlaySupport() returns
- // unsupported. So allow manually enabling BGRA8 overlay support.
- static void EnableBGRA8OverlaysWithYUVOverlaySupport();
-
- // Forces to enable NV12 overlay support regardless of the query results from
- // IDXGIOutput3::CheckOverlaySupport().
- static void ForceNV12OverlaySupport();
-
- // Forces to enable RGBA101010A2 overlay support regardless of the query
- // results from IDXGIOutput3::CheckOverlaySupport().
- static void ForceRgb10a2OverlaySupport();
-
- // Enable NV12 overlay support only when
- // DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709 is supported.
- static void SetCheckYCbCrStudioG22LeftP709ForNv12Support();
-
// GLSurfaceEGL implementation.
bool Initialize(GLSurfaceFormat format) override;
void Destroy() override;
@@ -182,12 +94,6 @@ class GL_EXPORT DirectCompositionSurfaceWin : public GLSurfaceEGL,
std::unique_ptr<ui::DCRendererLayerParams> params) override;
void SetFrameRate(float frame_rate) override;
- // Implements GpuSwitchingObserver.
- void OnGpuSwitched(gl::GpuPreference active_gpu_heuristic) override;
- void OnDisplayAdded() override;
- void OnDisplayRemoved() override;
- void OnDisplayMetricsChanged() override;
-
bool SupportsDelegatedInk() override;
void SetDelegatedInkTrailStartPoint(
std::unique_ptr<gfx::DelegatedInkMetadata> metadata) override;
@@ -213,8 +119,6 @@ class GL_EXPORT DirectCompositionSurfaceWin : public GLSurfaceEGL,
gfx::Point* offset,
gfx::Rect* clip_rect) const;
- void SetMonitorInfoForTesting(int num_of_monitors, gfx::Size monitor_size);
-
DCLayerTree* GetLayerTreeForTesting() { return layer_tree_.get(); }
protected:
diff --git a/chromium/ui/gl/direct_composition_surface_win_unittest.cc b/chromium/ui/gl/direct_composition_surface_win_unittest.cc
index 879ed3cea3a..ee3abd5ebce 100644
--- a/chromium/ui/gl/direct_composition_surface_win_unittest.cc
+++ b/chromium/ui/gl/direct_composition_surface_win_unittest.cc
@@ -27,6 +27,7 @@
#include "ui/gfx/geometry/transform.h"
#include "ui/gl/dc_renderer_layer_params.h"
#include "ui/gl/direct_composition_child_surface_win.h"
+#include "ui/gl/direct_composition_support.h"
#include "ui/gl/gl_angle_util_win.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_context.h"
@@ -126,7 +127,7 @@ class DirectCompositionSurfaceTest : public testing::Test {
// Without this, the following check always fails.
display_ = gl::init::InitializeGLNoExtensionsOneOff(
/*init_bindings=*/true, /*system_device_id=*/0);
- if (!DirectCompositionSurfaceWin::GetDirectCompositionDevice()) {
+ if (!DirectCompositionSupported()) {
LOG(WARNING) << "DirectComposition not supported, skipping test.";
return;
}
@@ -134,9 +135,8 @@ class DirectCompositionSurfaceTest : public testing::Test {
context_ = CreateGLContext(surface_);
if (surface_)
surface_->SetEnableDCLayers(true);
- DirectCompositionSurfaceWin::SetScaledOverlaysSupportedForTesting(false);
- DirectCompositionSurfaceWin::SetOverlayFormatUsedForTesting(
- DXGI_FORMAT_NV12);
+ SetDirectCompositionScaledOverlaysSupportedForTesting(false);
+ SetDirectCompositionOverlayFormatUsedForTesting(DXGI_FORMAT_NV12);
}
void TearDown() override {
@@ -414,7 +414,7 @@ TEST_F(DirectCompositionSurfaceTest, SwapchainSizeWithScaledOverlays) {
// HW supports scaled overlays.
// The input texture size is maller than the window size.
- DirectCompositionSurfaceWin::SetScaledOverlaysSupportedForTesting(true);
+ SetDirectCompositionScaledOverlaysSupportedForTesting(true);
// Onscreen quad.
gfx::Rect quad_rect = gfx::Rect(100, 100);
@@ -932,7 +932,7 @@ TEST_F(DirectCompositionPixelTest, SkipVideoLayerEmptyContentsRect) {
return;
// Swap chain size is overridden to onscreen size only if scaled overlays
// are supported.
- DirectCompositionSurfaceWin::SetScaledOverlaysSupportedForTesting(true);
+ SetDirectCompositionScaledOverlaysSupportedForTesting(true);
gfx::Size window_size(100, 100);
EXPECT_TRUE(surface_->Resize(window_size, 1.0, gfx::ColorSpace(), true));
@@ -984,7 +984,7 @@ TEST_F(DirectCompositionPixelTest, NV12SwapChain) {
return;
// Swap chain size is overridden to onscreen rect size only if scaled overlays
// are supported.
- DirectCompositionSurfaceWin::SetScaledOverlaysSupportedForTesting(true);
+ SetDirectCompositionScaledOverlaysSupportedForTesting(true);
gfx::Size window_size(100, 100);
gfx::Size texture_size(50, 50);
@@ -1025,9 +1025,9 @@ TEST_F(DirectCompositionPixelTest, YUY2SwapChain) {
// Swap chain size is overridden to onscreen rect size only if scaled overlays
// are supported.
- DirectCompositionSurfaceWin::SetScaledOverlaysSupportedForTesting(true);
+ SetDirectCompositionScaledOverlaysSupportedForTesting(true);
// By default NV12 is used, so set it to YUY2 explicitly.
- DirectCompositionSurfaceWin::SetOverlayFormatUsedForTesting(DXGI_FORMAT_YUY2);
+ SetDirectCompositionOverlayFormatUsedForTesting(DXGI_FORMAT_YUY2);
gfx::Size window_size(100, 100);
gfx::Size texture_size(50, 50);
@@ -1061,7 +1061,7 @@ TEST_F(DirectCompositionPixelTest, NonZeroBoundsOffset) {
return;
// Swap chain size is overridden to onscreen rect size only if scaled overlays
// are supported.
- DirectCompositionSurfaceWin::SetScaledOverlaysSupportedForTesting(true);
+ SetDirectCompositionScaledOverlaysSupportedForTesting(true);
gfx::Size window_size(100, 100);
gfx::Size texture_size(50, 50);
@@ -1099,7 +1099,7 @@ TEST_F(DirectCompositionPixelTest, ResizeVideoLayer) {
return;
// Swap chain size is overridden to onscreen rect size only if scaled overlays
// are supported.
- DirectCompositionSurfaceWin::SetScaledOverlaysSupportedForTesting(true);
+ SetDirectCompositionScaledOverlaysSupportedForTesting(true);
gfx::Size window_size(100, 100);
EXPECT_TRUE(surface_->Resize(window_size, 1.0, gfx::ColorSpace(), true));
@@ -1170,9 +1170,9 @@ TEST_F(DirectCompositionPixelTest, ResizeVideoLayer) {
// (3) Test if swap chain is adjusted to fit the monitor when overlay scaling
// is not supported and video on-screen size is slightly smaller than the
// monitor. Clipping is on.
- DirectCompositionSurfaceWin::SetScaledOverlaysSupportedForTesting(false);
+ SetDirectCompositionScaledOverlaysSupportedForTesting(false);
gfx::Size monitor_size = window_size;
- surface_->SetMonitorInfoForTesting(1, window_size);
+ SetDirectCompositionMonitorInfoForTesting(1, window_size);
gfx::Rect on_screen_rect =
gfx::Rect(0, 0, monitor_size.width() - 2, monitor_size.height() - 2);
{
@@ -1206,7 +1206,7 @@ TEST_F(DirectCompositionPixelTest, ResizeVideoLayer) {
// (4) Test if the final on-screen size is adjusted to fit the monitor when
// overlay scaling is supported and video on-screen size is slightly bigger
// than the monitor. Clipping is off.
- DirectCompositionSurfaceWin::SetScaledOverlaysSupportedForTesting(true);
+ SetDirectCompositionScaledOverlaysSupportedForTesting(true);
on_screen_rect =
gfx::Rect(0, 0, monitor_size.width() + 2, monitor_size.height() + 2);
{
@@ -1511,7 +1511,7 @@ void RunBufferCountTest(scoped_refptr<DirectCompositionSurfaceWin> surface,
return;
if (for_video) {
- DirectCompositionSurfaceWin::SetScaledOverlaysSupportedForTesting(true);
+ SetDirectCompositionScaledOverlaysSupportedForTesting(true);
EXPECT_TRUE(surface->SetEnableDCLayers(true));
} else {
EXPECT_TRUE(surface->SetEnableDCLayers(false));
diff --git a/chromium/ui/gl/egl_api_unittest.cc b/chromium/ui/gl/egl_api_unittest.cc
index b4521673d4f..4a7596acb00 100644
--- a/chromium/ui/gl/egl_api_unittest.cc
+++ b/chromium/ui/gl/egl_api_unittest.cc
@@ -8,6 +8,7 @@
#include "build/build_config.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gl/gl_display.h"
+#include "ui/gl/gl_display_manager.h"
#include "ui/gl/gl_egl_api_implementation.h"
#include "ui/gl/gl_surface_egl.h"
#include "ui/gl/gl_switches.h"
@@ -52,10 +53,11 @@ class EGLApiTest : public testing::Test {
if (disabled_extensions) {
SetDisabledExtensionsEGL(disabled_extensions);
}
- g_driver_egl.ext.InitializeClientExtensionSettings();
- display_ = GLSurfaceEGL::InitializeDisplay(
- EGLDisplayPlatform(EGL_DEFAULT_DISPLAY), /*system_device_id=*/0);
- g_driver_egl.ext.InitializeExtensionSettings(display_);
+ display_ =
+ GLDisplayManagerEGL::GetInstance()->GetDisplay(GpuPreference::kDefault);
+ // Clear the display so InitializeDisplay() will re-initialize it.
+ display_->SetDisplay(EGL_NO_DISPLAY);
+ display_->InitializeDisplay(EGLDisplayPlatform(EGL_DEFAULT_DISPLAY));
}
void SetFakeExtensionString(const char* fake_string,
@@ -126,11 +128,11 @@ TEST_F(EGLApiTest, DisabledExtensionBitTest) {
SetFakeExtensionString(kFakeExtensions, kFakeClientExtensions);
InitializeAPI(nullptr);
- EXPECT_TRUE(g_driver_egl.ext.b_EGL_KHR_fence_sync);
+ EXPECT_TRUE(this->display_->ext->b_EGL_KHR_fence_sync);
InitializeAPI(kFakeDisabledExtensions);
- EXPECT_FALSE(g_driver_egl.ext.b_EGL_KHR_fence_sync);
+ EXPECT_FALSE(this->display_->ext->b_EGL_KHR_fence_sync);
}
TEST_F(EGLApiTest, DisabledExtensionStringTest) {
diff --git a/chromium/ui/gl/features.gni b/chromium/ui/gl/features.gni
index a357e3dec60..43fd604ae42 100644
--- a/chromium/ui/gl/features.gni
+++ b/chromium/ui/gl/features.gni
@@ -5,7 +5,7 @@
import("//build/config/chromecast_build.gni")
import("//build/config/chromeos/ui_mode.gni")
import("//build/config/chromeos/ui_mode.gni")
-import("//build/util/version.gni")
+import("//chrome/version.gni")
declare_args() {
# Should ANGLE be linked statically?
diff --git a/chromium/ui/gl/generate_bindings.py b/chromium/ui/gl/generate_bindings.py
index ab5602d8747..aceaf5eb04f 100755
--- a/chromium/ui/gl/generate_bindings.py
+++ b/chromium/ui/gl/generate_bindings.py
@@ -2814,21 +2814,29 @@ EGL_EXTENSIONS_EXTRA = [
'EGL_ANGLE_display_semaphore_share_group',
'EGL_ANGLE_display_texture_share_group',
'EGL_ANGLE_context_virtualization',
+ 'EGL_ANGLE_create_context_backwards_compatible',
'EGL_ANGLE_create_context_client_arrays',
'EGL_ANGLE_create_context_webgl_compatibility',
'EGL_ANGLE_external_context_and_surface',
+ 'EGL_ANGLE_keyed_mutex',
+ 'EGL_ANGLE_program_cache_control',
+ 'EGL_ANGLE_robust_resource_initialization',
'EGL_ANGLE_surface_orientation',
'EGL_ANGLE_window_fixed_size',
+ 'EGL_ARM_implicit_external_sync',
'EGL_CHROMIUM_create_context_bind_generates_resource',
'EGL_EXT_create_context_robustness',
'EGL_EXT_gl_colorspace_display_p3',
'EGL_EXT_gl_colorspace_display_p3_passthrough',
+ 'EGL_EXT_image_dma_buf_import',
'EGL_EXT_pixel_format_float',
'EGL_IMG_context_priority',
+ 'EGL_KHR_create_context',
'EGL_KHR_gl_colorspace',
'EGL_KHR_no_config_context',
'EGL_KHR_surfaceless_context',
'EGL_NV_robustness_video_memory_purge',
+ 'EGL_NOK_texture_from_pixmap',
]
GLX_FUNCTIONS = [
@@ -3017,8 +3025,6 @@ FUNCTION_SETS = [
],
[EGL_FUNCTIONS, 'egl', [
'EGL/eglext.h',
- # Files below are Chromium-specific and shipped with Chromium sources.
- 'EGL/eglextchromium.h',
],
[
'EGL_ANGLE_d3d_share_handle_client_buffer',
@@ -3117,9 +3123,6 @@ namespace gl {
class GLContext;
""" % {'name': set_name.upper()})
- if set_name == 'egl':
- file.write("class GLDisplayEGL;\n")
-
# Write typedefs for function pointer types. Always use the GL name for the
# typedef.
file.write('\n')
@@ -3130,25 +3133,34 @@ class GLContext;
# Write declarations for booleans indicating which extensions are available.
file.write('\n')
if set_name == 'egl':
- file.write('struct GL_EXPORT ExtensionsEGL {\n')
+ file.write('struct GL_EXPORT ClientExtensionsEGL {\n')
+ for extension in sorted(used_client_extensions):
+ file.write(' bool b_%s;\n' % extension)
+ file.write(
+"""
+
+ void InitializeClientExtensionSettings();
+
+ private:
+ static std::string GetClientExtensions();
+};
+
+struct GL_EXPORT DisplayExtensionsEGL {
+""")
else:
+ assert len(used_client_extensions) == 0
file.write("struct Extensions%s {\n" % set_name.upper())
- for extension in sorted(used_client_extensions):
- file.write(' bool b_%s;\n' % extension)
+
for extension in sorted(used_extensions):
file.write(' bool b_%s;\n' % extension)
if set_name == 'egl':
file.write(
"""
- void InitializeClientExtensionSettings();
- void InitializeExtensionSettings(GLDisplayEGL* display);
- void UpdateConditionalExtensionSettings(GLDisplayEGL* display);
+ void InitializeExtensionSettings(EGLDisplay display);
+ void UpdateConditionalExtensionSettings(EGLDisplay display);
- static std::string GetPlatformExtensions(GLDisplayEGL* display);
-
- private:
- static std::string GetClientExtensions();
+ static std::string GetPlatformExtensions(EGLDisplay display);
""")
file.write('};\n')
file.write('\n')
@@ -3312,8 +3324,6 @@ def GenerateSource(file, functions, set_name, used_extensions,
'ui/gl/gl_implementation.h',
'ui/gl/gl_version_info.h',
set_header_name ]
- if set_name == 'egl':
- include_list.append('ui/gl/gl_display.h')
includes_string = "\n".join(["#include \"{0}\"".format(h)
for h in sorted(include_list)])
@@ -3440,7 +3450,7 @@ void DriverGL::InitializeDynamicBindings(const GLVersionInfo* ver,
""")
elif set_name == 'egl':
file.write("""\
-void ExtensionsEGL::InitializeClientExtensionSettings() {
+void ClientExtensionsEGL::InitializeClientExtensionSettings() {
std::string client_extensions(GetClientExtensions());
[[maybe_unused]] gfx::ExtensionSet extensions(
gfx::MakeExtensionSet(client_extensions));
@@ -3480,7 +3490,7 @@ void Driver%s::InitializeExtensionBindings() {
file.write("""\
}
-void ExtensionsEGL::InitializeExtensionSettings(GLDisplayEGL* display) {
+void DisplayExtensionsEGL::InitializeExtensionSettings(EGLDisplay display) {
std::string platform_extensions(GetPlatformExtensions(display));
[[maybe_unused]] gfx::ExtensionSet extensions(
gfx::MakeExtensionSet(platform_extensions));
diff --git a/chromium/ui/gl/gl_angle_util_vulkan.cc b/chromium/ui/gl/gl_angle_util_vulkan.cc
index c0099aaa90b..03a1dfc6f64 100644
--- a/chromium/ui/gl/gl_angle_util_vulkan.cc
+++ b/chromium/ui/gl/gl_angle_util_vulkan.cc
@@ -12,14 +12,13 @@
namespace gl {
namespace {
EGLDeviceEXT GetEGLDeviceFromANGLE() {
- EGLDisplay egl_display =
- gl::GLSurfaceEGL::GetGLDisplayEGL()->GetHardwareDisplay();
+ EGLDisplay egl_display = gl::GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay();
if (egl_display == EGL_NO_DISPLAY) {
LOG(ERROR) << "Failed to retrieve EGLDisplay";
return nullptr;
}
- if (!gl::GLSurfaceEGL::GetGLDisplayEGL()->IsEGLQueryDeviceSupported()) {
+ if (!gl::g_driver_egl.client_ext.b_EGL_EXT_device_query) {
LOG(ERROR) << "EGL_EXT_device_query not supported";
return nullptr;
}
diff --git a/chromium/ui/gl/gl_angle_util_win.cc b/chromium/ui/gl/gl_angle_util_win.cc
index 3427df230aa..c6d795265ff 100644
--- a/chromium/ui/gl/gl_angle_util_win.cc
+++ b/chromium/ui/gl/gl_angle_util_win.cc
@@ -17,14 +17,13 @@ namespace gl {
void* QueryDeviceObjectFromANGLE(int object_type) {
TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE");
- EGLDisplay egl_display =
- gl::GLSurfaceEGL::GetGLDisplayEGL()->GetHardwareDisplay();
+ EGLDisplay egl_display = gl::GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay();
if (egl_display == EGL_NO_DISPLAY) {
DVLOG(1) << "Failed to retrieve EGLDisplay";
return nullptr;
}
- if (!gl::GLSurfaceEGL::GetGLDisplayEGL()->IsEGLQueryDeviceSupported()) {
+ if (!gl::g_driver_egl.client_ext.b_EGL_EXT_device_query) {
DVLOG(1) << "EGL_EXT_device_query not supported";
return nullptr;
}
diff --git a/chromium/ui/gl/gl_bindings.cc b/chromium/ui/gl/gl_bindings.cc
index 4889a32cb91..42b1f6ecb61 100644
--- a/chromium/ui/gl/gl_bindings.cc
+++ b/chromium/ui/gl/gl_bindings.cc
@@ -23,7 +23,8 @@
namespace gl {
#if defined(USE_EGL)
-void ExtensionsEGL::UpdateConditionalExtensionSettings(GLDisplayEGL* display) {
+void DisplayExtensionsEGL::UpdateConditionalExtensionSettings(
+ EGLDisplay display) {
// For the moment, only two extensions can be conditionally disabled
// through GPU driver bug workarounds mechanism:
// EGL_KHR_fence_sync
@@ -42,17 +43,15 @@ void ExtensionsEGL::UpdateConditionalExtensionSettings(GLDisplayEGL* display) {
}
// static
-std::string ExtensionsEGL::GetPlatformExtensions(GLDisplayEGL* display) {
- DCHECK(display);
- EGLDisplay egl_display = display->GetHardwareDisplay();
- if (egl_display == EGL_NO_DISPLAY)
+std::string DisplayExtensionsEGL::GetPlatformExtensions(EGLDisplay display) {
+ if (display == EGL_NO_DISPLAY)
return "";
- const char* str = eglQueryString(egl_display, EGL_EXTENSIONS);
+ const char* str = eglQueryString(display, EGL_EXTENSIONS);
return str ? std::string(str) : "";
}
// static
-std::string ExtensionsEGL::GetClientExtensions() {
+std::string ClientExtensionsEGL::GetClientExtensions() {
const char* str = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
return str ? std::string(str) : "";
}
diff --git a/chromium/ui/gl/gl_bindings.h b/chromium/ui/gl/gl_bindings.h
index 1d5b792ec8b..65ef00ae1d3 100644
--- a/chromium/ui/gl/gl_bindings.h
+++ b/chromium/ui/gl/gl_bindings.h
@@ -193,9 +193,6 @@ struct XVisualInfo;
// GL_CHROMIUM_texture_filtering_hint
#define GL_TEXTURE_FILTERING_HINT_CHROMIUM 0x8AF0
-// GL_CHROMIUM_texture_storage_image
-#define GL_SCANOUT_CHROMIUM 0x6000
-
// GL_OES_texure_3D
#define GL_SAMPLER_3D_OES 0x8B5F
@@ -544,7 +541,7 @@ struct GL_EXPORT DriverEGL {
void ClearBindings();
ProcsEGL fn;
- ExtensionsEGL ext;
+ ClientExtensionsEGL client_ext;
};
#endif
diff --git a/chromium/ui/gl/gl_bindings_autogen_egl.cc b/chromium/ui/gl/gl_bindings_autogen_egl.cc
index 105d03f665e..7b03af6503e 100644
--- a/chromium/ui/gl/gl_bindings_autogen_egl.cc
+++ b/chromium/ui/gl/gl_bindings_autogen_egl.cc
@@ -13,7 +13,6 @@
#include "base/trace_event/trace_event.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_context.h"
-#include "ui/gl/gl_display.h"
#include "ui/gl/gl_egl_api_implementation.h"
#include "ui/gl/gl_enums.h"
#include "ui/gl/gl_implementation.h"
@@ -227,7 +226,7 @@ void DriverEGL::InitializeStaticBindings() {
reinterpret_cast<eglWaitSyncKHRProc>(GetGLProcAddress("eglWaitSyncKHR"));
}
-void ExtensionsEGL::InitializeClientExtensionSettings() {
+void ClientExtensionsEGL::InitializeClientExtensionSettings() {
std::string client_extensions(GetClientExtensions());
[[maybe_unused]] gfx::ExtensionSet extensions(
gfx::MakeExtensionSet(client_extensions));
@@ -266,7 +265,7 @@ void ExtensionsEGL::InitializeClientExtensionSettings() {
gfx::HasExtension(extensions, "EGL_MESA_platform_surfaceless");
}
-void ExtensionsEGL::InitializeExtensionSettings(GLDisplayEGL* display) {
+void DisplayExtensionsEGL::InitializeExtensionSettings(EGLDisplay display) {
std::string platform_extensions(GetPlatformExtensions(display));
[[maybe_unused]] gfx::ExtensionSet extensions(
gfx::MakeExtensionSet(platform_extensions));
@@ -285,6 +284,8 @@ void ExtensionsEGL::InitializeExtensionSettings(GLDisplayEGL* display) {
gfx::HasExtension(extensions, "EGL_ANDROID_native_fence_sync");
b_EGL_ANGLE_context_virtualization =
gfx::HasExtension(extensions, "EGL_ANGLE_context_virtualization");
+ b_EGL_ANGLE_create_context_backwards_compatible = gfx::HasExtension(
+ extensions, "EGL_ANGLE_create_context_backwards_compatible");
b_EGL_ANGLE_create_context_client_arrays =
gfx::HasExtension(extensions, "EGL_ANGLE_create_context_client_arrays");
b_EGL_ANGLE_create_context_webgl_compatibility = gfx::HasExtension(
@@ -297,10 +298,16 @@ void ExtensionsEGL::InitializeExtensionSettings(GLDisplayEGL* display) {
gfx::HasExtension(extensions, "EGL_ANGLE_display_texture_share_group");
b_EGL_ANGLE_external_context_and_surface =
gfx::HasExtension(extensions, "EGL_ANGLE_external_context_and_surface");
+ b_EGL_ANGLE_keyed_mutex =
+ gfx::HasExtension(extensions, "EGL_ANGLE_keyed_mutex");
b_EGL_ANGLE_power_preference =
gfx::HasExtension(extensions, "EGL_ANGLE_power_preference");
+ b_EGL_ANGLE_program_cache_control =
+ gfx::HasExtension(extensions, "EGL_ANGLE_program_cache_control");
b_EGL_ANGLE_query_surface_pointer =
gfx::HasExtension(extensions, "EGL_ANGLE_query_surface_pointer");
+ b_EGL_ANGLE_robust_resource_initialization =
+ gfx::HasExtension(extensions, "EGL_ANGLE_robust_resource_initialization");
b_EGL_ANGLE_stream_producer_d3d_texture =
gfx::HasExtension(extensions, "EGL_ANGLE_stream_producer_d3d_texture");
b_EGL_ANGLE_surface_d3d_texture_2d_share_handle = gfx::HasExtension(
@@ -313,6 +320,8 @@ void ExtensionsEGL::InitializeExtensionSettings(GLDisplayEGL* display) {
gfx::HasExtension(extensions, "EGL_ANGLE_vulkan_image");
b_EGL_ANGLE_window_fixed_size =
gfx::HasExtension(extensions, "EGL_ANGLE_window_fixed_size");
+ b_EGL_ARM_implicit_external_sync =
+ gfx::HasExtension(extensions, "EGL_ARM_implicit_external_sync");
b_EGL_CHROMIUM_create_context_bind_generates_resource = gfx::HasExtension(
extensions, "EGL_CHROMIUM_create_context_bind_generates_resource");
b_EGL_CHROMIUM_sync_control =
@@ -323,6 +332,8 @@ void ExtensionsEGL::InitializeExtensionSettings(GLDisplayEGL* display) {
gfx::HasExtension(extensions, "EGL_EXT_gl_colorspace_display_p3");
b_EGL_EXT_gl_colorspace_display_p3_passthrough = gfx::HasExtension(
extensions, "EGL_EXT_gl_colorspace_display_p3_passthrough");
+ b_EGL_EXT_image_dma_buf_import =
+ gfx::HasExtension(extensions, "EGL_EXT_image_dma_buf_import");
b_EGL_EXT_image_dma_buf_import_modifiers =
gfx::HasExtension(extensions, "EGL_EXT_image_dma_buf_import_modifiers");
b_EGL_EXT_image_flush_external =
@@ -331,6 +342,8 @@ void ExtensionsEGL::InitializeExtensionSettings(GLDisplayEGL* display) {
gfx::HasExtension(extensions, "EGL_EXT_pixel_format_float");
b_EGL_IMG_context_priority =
gfx::HasExtension(extensions, "EGL_IMG_context_priority");
+ b_EGL_KHR_create_context =
+ gfx::HasExtension(extensions, "EGL_KHR_create_context");
b_EGL_KHR_fence_sync = gfx::HasExtension(extensions, "EGL_KHR_fence_sync");
b_EGL_KHR_gl_colorspace =
gfx::HasExtension(extensions, "EGL_KHR_gl_colorspace");
@@ -350,6 +363,8 @@ void ExtensionsEGL::InitializeExtensionSettings(GLDisplayEGL* display) {
b_EGL_KHR_wait_sync = gfx::HasExtension(extensions, "EGL_KHR_wait_sync");
b_EGL_MESA_image_dma_buf_export =
gfx::HasExtension(extensions, "EGL_MESA_image_dma_buf_export");
+ b_EGL_NOK_texture_from_pixmap =
+ gfx::HasExtension(extensions, "EGL_NOK_texture_from_pixmap");
b_EGL_NV_post_sub_buffer =
gfx::HasExtension(extensions, "EGL_NV_post_sub_buffer");
b_EGL_NV_robustness_video_memory_purge =
diff --git a/chromium/ui/gl/gl_bindings_autogen_egl.h b/chromium/ui/gl/gl_bindings_autogen_egl.h
index 12452829e2c..0113878ba86 100644
--- a/chromium/ui/gl/gl_bindings_autogen_egl.h
+++ b/chromium/ui/gl/gl_bindings_autogen_egl.h
@@ -16,7 +16,6 @@
namespace gl {
class GLContext;
-class GLDisplayEGL;
typedef EGLBoolean(GL_BINDING_CALL* eglBindAPIProc)(EGLenum api);
typedef EGLBoolean(GL_BINDING_CALL* eglBindTexImageProc)(EGLDisplay dpy,
@@ -314,7 +313,7 @@ typedef EGLint(GL_BINDING_CALL* eglWaitSyncKHRProc)(EGLDisplay dpy,
EGLSyncKHR sync,
EGLint flags);
-struct GL_EXPORT ExtensionsEGL {
+struct GL_EXPORT ClientExtensionsEGL {
bool b_EGL_ANGLE_display_power_preference;
bool b_EGL_ANGLE_feature_control;
bool b_EGL_ANGLE_platform_angle;
@@ -332,6 +331,14 @@ struct GL_EXPORT ExtensionsEGL {
bool b_EGL_EXT_platform_device;
bool b_EGL_KHR_debug;
bool b_EGL_MESA_platform_surfaceless;
+
+ void InitializeClientExtensionSettings();
+
+ private:
+ static std::string GetClientExtensions();
+};
+
+struct GL_EXPORT DisplayExtensionsEGL {
bool b_EGL_ANDROID_blob_cache;
bool b_EGL_ANDROID_create_native_client_buffer;
bool b_EGL_ANDROID_front_buffer_auto_refresh;
@@ -339,29 +346,36 @@ struct GL_EXPORT ExtensionsEGL {
bool b_EGL_ANDROID_get_native_client_buffer;
bool b_EGL_ANDROID_native_fence_sync;
bool b_EGL_ANGLE_context_virtualization;
+ bool b_EGL_ANGLE_create_context_backwards_compatible;
bool b_EGL_ANGLE_create_context_client_arrays;
bool b_EGL_ANGLE_create_context_webgl_compatibility;
bool b_EGL_ANGLE_d3d_share_handle_client_buffer;
bool b_EGL_ANGLE_display_semaphore_share_group;
bool b_EGL_ANGLE_display_texture_share_group;
bool b_EGL_ANGLE_external_context_and_surface;
+ bool b_EGL_ANGLE_keyed_mutex;
bool b_EGL_ANGLE_power_preference;
+ bool b_EGL_ANGLE_program_cache_control;
bool b_EGL_ANGLE_query_surface_pointer;
+ bool b_EGL_ANGLE_robust_resource_initialization;
bool b_EGL_ANGLE_stream_producer_d3d_texture;
bool b_EGL_ANGLE_surface_d3d_texture_2d_share_handle;
bool b_EGL_ANGLE_surface_orientation;
bool b_EGL_ANGLE_sync_control_rate;
bool b_EGL_ANGLE_vulkan_image;
bool b_EGL_ANGLE_window_fixed_size;
+ bool b_EGL_ARM_implicit_external_sync;
bool b_EGL_CHROMIUM_create_context_bind_generates_resource;
bool b_EGL_CHROMIUM_sync_control;
bool b_EGL_EXT_create_context_robustness;
bool b_EGL_EXT_gl_colorspace_display_p3;
bool b_EGL_EXT_gl_colorspace_display_p3_passthrough;
+ bool b_EGL_EXT_image_dma_buf_import;
bool b_EGL_EXT_image_dma_buf_import_modifiers;
bool b_EGL_EXT_image_flush_external;
bool b_EGL_EXT_pixel_format_float;
bool b_EGL_IMG_context_priority;
+ bool b_EGL_KHR_create_context;
bool b_EGL_KHR_fence_sync;
bool b_EGL_KHR_gl_colorspace;
bool b_EGL_KHR_gl_texture_2D_image;
@@ -374,20 +388,17 @@ struct GL_EXPORT ExtensionsEGL {
bool b_EGL_KHR_swap_buffers_with_damage;
bool b_EGL_KHR_wait_sync;
bool b_EGL_MESA_image_dma_buf_export;
+ bool b_EGL_NOK_texture_from_pixmap;
bool b_EGL_NV_post_sub_buffer;
bool b_EGL_NV_robustness_video_memory_purge;
bool b_EGL_NV_stream_consumer_gltexture_yuv;
bool b_GL_CHROMIUM_egl_android_native_fence_sync_hack;
bool b_GL_CHROMIUM_egl_khr_fence_sync_hack;
- void InitializeClientExtensionSettings();
- void InitializeExtensionSettings(GLDisplayEGL* display);
- void UpdateConditionalExtensionSettings(GLDisplayEGL* display);
-
- static std::string GetPlatformExtensions(GLDisplayEGL* display);
+ void InitializeExtensionSettings(EGLDisplay display);
+ void UpdateConditionalExtensionSettings(EGLDisplay display);
- private:
- static std::string GetClientExtensions();
+ static std::string GetPlatformExtensions(EGLDisplay display);
};
struct ProcsEGL {
diff --git a/chromium/ui/gl/gl_context.cc b/chromium/ui/gl/gl_context.cc
index 9362605f039..6584e72abe4 100644
--- a/chromium/ui/gl/gl_context.cc
+++ b/chromium/ui/gl/gl_context.cc
@@ -187,6 +187,12 @@ void GLContext::DirtyVirtualContextState() {
current_virtual_context_ = nullptr;
}
+#if defined(USE_EGL)
+GLDisplayEGL* GLContext::GetGLDisplayEGL() {
+ return nullptr;
+}
+#endif // USE_EGL
+
#if BUILDFLAG(IS_APPLE)
constexpr uint64_t kInvalidFenceId = 0;
@@ -298,8 +304,6 @@ bool GLContext::LosesAllContextsOnContextLost() {
case kGLImplementationEGLGLES2:
case kGLImplementationEGLANGLE:
return true;
- case kGLImplementationAppleGL:
- return false;
case kGLImplementationMockGL:
case kGLImplementationStubGL:
return false;
diff --git a/chromium/ui/gl/gl_context.h b/chromium/ui/gl/gl_context.h
index 84662347031..80df6c6d97e 100644
--- a/chromium/ui/gl/gl_context.h
+++ b/chromium/ui/gl/gl_context.h
@@ -29,6 +29,7 @@ class ColorSpace;
} // namespace gfx
namespace gl {
+class GLDisplayEGL;
class YUVToRGBConverter;
} // namespace gl
@@ -247,6 +248,12 @@ class GL_EXPORT GLContext : public base::RefCounted<GLContext>,
// context is made current.
void DirtyVirtualContextState();
+#if defined(USE_EGL)
+ // Returns GLDisplayEGL this context belongs to if this context is a
+ // GLContextEGL; returns nullptr otherwise.
+ virtual GLDisplayEGL* GetGLDisplayEGL();
+#endif // USE_EGL
+
#if BUILDFLAG(IS_APPLE)
// Create a fence for all work submitted to this context so far, and return a
// monotonically increasing handle to it. This returned handle never needs to
diff --git a/chromium/ui/gl/gl_context_cgl.cc b/chromium/ui/gl/gl_context_cgl.cc
index 7aa2655a1de..2ced0498a42 100644
--- a/chromium/ui/gl/gl_context_cgl.cc
+++ b/chromium/ui/gl/gl_context_cgl.cc
@@ -45,11 +45,6 @@ static CGLPixelFormatObj GetPixelFormat() {
attribs.push_back(kCGLPFAAllowOfflineRenderers);
g_support_renderer_switching = true;
}
- if (GetGLImplementation() == kGLImplementationAppleGL) {
- attribs.push_back(kCGLPFARendererID);
- attribs.push_back((CGLPixelFormatAttribute) kCGLRendererGenericFloatID);
- g_support_renderer_switching = false;
- }
if (GetGLImplementation() == kGLImplementationDesktopGLCoreProfile) {
attribs.push_back(kCGLPFAOpenGLProfile);
attribs.push_back((CGLPixelFormatAttribute)kCGLOGLPVersion_3_2_Core);
diff --git a/chromium/ui/gl/gl_context_egl.cc b/chromium/ui/gl/gl_context_egl.cc
index 66404d3c940..f22f7cc770e 100644
--- a/chromium/ui/gl/gl_context_egl.cc
+++ b/chromium/ui/gl/gl_context_egl.cc
@@ -87,6 +87,11 @@
#define EGL_CONTEXT_VIRTUALIZATION_GROUP_ANGLE 0x3481
#endif /* EGL_ANGLE_context_virtualization */
+#ifndef EGL_ANGLE_program_cache_control
+#define EGL_ANGLE_program_cache_control 1
+#define EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE 0x3459
+#endif /* EGL_ANGLE_program_cache_control */
+
using ui::GetLastEGLErrorString;
namespace gl {
@@ -130,7 +135,7 @@ bool GLContextEGL::Initialize(GLSurface* compatible_surface,
// Always prefer to use EGL_KHR_no_config_context so that all surfaces and
// contexts are compatible
- if (!gl_display_->IsEGLNoConfigContextSupported()) {
+ if (!gl_display_->ext->b_EGL_KHR_no_config_context) {
config_ = compatible_surface->GetConfig();
EGLint config_renderable_type = 0;
if (!eglGetConfigAttrib(gl_display_->GetDisplay(), config_,
@@ -158,7 +163,7 @@ bool GLContextEGL::Initialize(GLSurface* compatible_surface,
// EGL_KHR_create_context allows requesting both a major and minor context
// version
- if (gl_display_->HasEGLExtension("EGL_KHR_create_context")) {
+ if (gl_display_->ext->b_EGL_KHR_create_context) {
context_attributes.push_back(EGL_CONTEXT_MAJOR_VERSION);
context_attributes.push_back(context_client_major_version);
@@ -176,7 +181,7 @@ bool GLContextEGL::Initialize(GLSurface* compatible_surface,
bool is_swangle = IsSoftwareGLImplementation(GetGLImplementationParts());
- if (gl_display_->IsCreateContextRobustnessSupported() || is_swangle) {
+ if (gl_display_->ext->b_EGL_EXT_create_context_robustness || is_swangle) {
DVLOG(1) << "EGL_EXT_create_context_robustness supported.";
context_attributes.push_back(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT);
context_attributes.push_back(
@@ -186,7 +191,7 @@ bool GLContextEGL::Initialize(GLSurface* compatible_surface,
EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT);
context_attributes.push_back(EGL_LOSE_CONTEXT_ON_RESET_EXT);
- if (gl_display_->IsRobustnessVideoMemoryPurgeSupported()) {
+ if (gl_display_->ext->b_EGL_NV_robustness_video_memory_purge) {
context_attributes.push_back(
EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV);
context_attributes.push_back(EGL_TRUE);
@@ -204,7 +209,7 @@ bool GLContextEGL::Initialize(GLSurface* compatible_surface,
return false;
}
- if (gl_display_->IsCreateContextBindGeneratesResourceSupported()) {
+ if (gl_display_->ext->b_EGL_CHROMIUM_create_context_bind_generates_resource) {
context_attributes.push_back(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM);
context_attributes.push_back(attribs.bind_generates_resource ? EGL_TRUE
: EGL_FALSE);
@@ -212,7 +217,7 @@ bool GLContextEGL::Initialize(GLSurface* compatible_surface,
DCHECK(attribs.bind_generates_resource);
}
- if (gl_display_->IsCreateContextWebGLCompatabilitySupported()) {
+ if (gl_display_->ext->b_EGL_ANGLE_create_context_webgl_compatibility) {
context_attributes.push_back(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE);
context_attributes.push_back(
attribs.webgl_compatibility_context ? EGL_TRUE : EGL_FALSE);
@@ -234,7 +239,7 @@ bool GLContextEGL::Initialize(GLSurface* compatible_surface,
}
}
- if (gl_display_->IsDisplayTextureShareGroupSupported()) {
+ if (gl_display_->ext->b_EGL_ANGLE_display_texture_share_group) {
context_attributes.push_back(EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE);
context_attributes.push_back(
attribs.global_texture_share_group ? EGL_TRUE : EGL_FALSE);
@@ -242,7 +247,7 @@ bool GLContextEGL::Initialize(GLSurface* compatible_surface,
DCHECK(!attribs.global_texture_share_group);
}
- if (gl_display_->IsDisplaySemaphoreShareGroupSupported()) {
+ if (gl_display_->ext->b_EGL_ANGLE_display_semaphore_share_group) {
context_attributes.push_back(EGL_DISPLAY_SEMAPHORE_SHARE_GROUP_ANGLE);
context_attributes.push_back(
attribs.global_semaphore_share_group ? EGL_TRUE : EGL_FALSE);
@@ -250,13 +255,14 @@ bool GLContextEGL::Initialize(GLSurface* compatible_surface,
DCHECK(!attribs.global_semaphore_share_group);
}
- if (gl_display_->IsCreateContextClientArraysSupported()) {
+ if (gl_display_->ext->b_EGL_ANGLE_create_context_client_arrays) {
// Disable client arrays if the context supports it
context_attributes.push_back(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE);
context_attributes.push_back(EGL_FALSE);
}
- if (gl_display_->IsRobustResourceInitSupported() || is_swangle) {
+ if (gl_display_->ext->b_EGL_ANGLE_robust_resource_initialization ||
+ is_swangle) {
context_attributes.push_back(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE);
context_attributes.push_back(
(attribs.robust_resource_initialization || is_swangle) ? EGL_TRUE
@@ -265,15 +271,14 @@ bool GLContextEGL::Initialize(GLSurface* compatible_surface,
DCHECK(!attribs.robust_resource_initialization);
}
- if (gl_display_->HasEGLExtension(
- "EGL_ANGLE_create_context_backwards_compatible")) {
+ if (gl_display_->ext->b_EGL_ANGLE_create_context_backwards_compatible) {
// Request a specific context version. The Passthrough command decoder
// relies on the returned context being the exact version it requested.
context_attributes.push_back(EGL_CONTEXT_OPENGL_BACKWARDS_COMPATIBLE_ANGLE);
context_attributes.push_back(EGL_FALSE);
}
- if (gl_display_->IsANGLEPowerPreferenceSupported()) {
+ if (gl_display_->ext->b_EGL_ANGLE_power_preference) {
GpuPreference pref = attribs.gpu_preference;
pref = GLSurface::AdjustGpuPreference(pref);
switch (pref) {
@@ -293,7 +298,7 @@ bool GLContextEGL::Initialize(GLSurface* compatible_surface,
}
}
- if (gl_display_->IsANGLEExternalContextAndSurfaceSupported()) {
+ if (gl_display_->ext->b_EGL_ANGLE_external_context_and_surface) {
if (attribs.angle_create_from_external_context) {
context_attributes.push_back(EGL_EXTERNAL_CONTEXT_ANGLE);
context_attributes.push_back(EGL_TRUE);
@@ -304,12 +309,20 @@ bool GLContextEGL::Initialize(GLSurface* compatible_surface,
}
}
- if (gl_display_->IsANGLEContextVirtualizationSupported()) {
+ if (gl_display_->ext->b_EGL_ANGLE_context_virtualization) {
context_attributes.push_back(EGL_CONTEXT_VIRTUALIZATION_GROUP_ANGLE);
context_attributes.push_back(
static_cast<EGLint>(attribs.angle_context_virtualization_group_number));
}
+ // Skia manages program cache by itself.
+ // For WebGL program, it should manage program by itself too.
+ if (gl_display_->ext->b_EGL_ANGLE_program_cache_control) {
+ context_attributes.push_back(
+ EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE);
+ context_attributes.push_back(EGL_FALSE);
+ }
+
// Append final EGL_NONE to signal the context attributes are finished
context_attributes.push_back(EGL_NONE);
context_attributes.push_back(EGL_NONE);
@@ -322,7 +335,7 @@ bool GLContextEGL::Initialize(GLSurface* compatible_surface,
// If EGL_KHR_no_config_context is in use and context creation failed,
// it might indicate that an unsupported ES version was requested. Try
// falling back to a lower version.
- if (!context_ && gl_display_->IsEGLNoConfigContextSupported() &&
+ if (!context_ && gl_display_->ext->b_EGL_KHR_no_config_context &&
eglGetError() == EGL_BAD_MATCH) {
// Set up the list of versions to try: 3.1 -> 3.0 -> 2.0
std::vector<std::pair<EGLint, EGLint>> candidate_versions;
@@ -395,7 +408,7 @@ YUVToRGBConverter* GLContextEGL::GetYUVToRGBConverter(
}
void GLContextEGL::SetVisibility(bool visibility) {
- if (gl_display_->IsANGLEPowerPreferenceSupported()) {
+ if (gl_display_->ext->b_EGL_ANGLE_power_preference) {
// It doesn't matter whether this context was explicitly allocated
// with a power preference - ANGLE will take care of any default behavior.
if (visibility) {
@@ -406,6 +419,10 @@ void GLContextEGL::SetVisibility(bool visibility) {
}
}
+GLDisplayEGL* GLContextEGL::GetGLDisplayEGL() {
+ return gl_display_;
+}
+
void GLContextEGL::ReleaseYUVToRGBConvertersAndBackpressureFences() {
#if BUILDFLAG(IS_APPLE)
bool has_backpressure_fences = HasBackpressureFences();
@@ -551,7 +568,7 @@ unsigned int GLContextEGL::CheckStickyGraphicsResetStatusImpl() {
DCHECK(g_current_gl_driver);
const ExtensionsGL& ext = g_current_gl_driver->ext;
if ((graphics_reset_status_ == GL_NO_ERROR) &&
- gl_display_->IsCreateContextRobustnessSupported() &&
+ gl_display_->ext->b_EGL_EXT_create_context_robustness &&
(ext.b_GL_KHR_robustness || ext.b_GL_EXT_robustness ||
ext.b_GL_ARB_robustness)) {
graphics_reset_status_ = glGetGraphicsResetStatusARB();
diff --git a/chromium/ui/gl/gl_context_egl.h b/chromium/ui/gl/gl_context_egl.h
index 52ed0cf37df..1934498bde8 100644
--- a/chromium/ui/gl/gl_context_egl.h
+++ b/chromium/ui/gl/gl_context_egl.h
@@ -7,6 +7,7 @@
#include <map>
+#include "base/memory/raw_ptr.h"
#include "ui/gl/gl_context.h"
#include "ui/gl/gl_export.h"
@@ -37,6 +38,7 @@ class GL_EXPORT GLContextEGL : public GLContextReal {
YUVToRGBConverter* GetYUVToRGBConverter(
const gfx::ColorSpace& color_space) override;
void SetVisibility(bool visibility) override;
+ GLDisplayEGL* GetGLDisplayEGL() override;
protected:
~GLContextEGL() override;
@@ -46,7 +48,7 @@ class GL_EXPORT GLContextEGL : public GLContextReal {
void ReleaseYUVToRGBConvertersAndBackpressureFences();
EGLContext context_ = nullptr;
- GLDisplayEGL* gl_display_ = nullptr;
+ raw_ptr<GLDisplayEGL> gl_display_ = nullptr;
EGLConfig config_ = nullptr;
unsigned int graphics_reset_status_ = 0; // GL_NO_ERROR;
bool unbind_fbo_on_makecurrent_ = false;
diff --git a/chromium/ui/gl/gl_context_glx.h b/chromium/ui/gl/gl_context_glx.h
index 0f3a6a3a250..5b89e16114d 100644
--- a/chromium/ui/gl/gl_context_glx.h
+++ b/chromium/ui/gl/gl_context_glx.h
@@ -5,6 +5,7 @@
#ifndef UI_GL_GL_CONTEXT_GLX_H_
#define UI_GL_GL_CONTEXT_GLX_H_
+#include "base/memory/raw_ptr.h"
#include "ui/gfx/x/connection.h"
#include "ui/gl/gl_context.h"
#include "ui/gl/gl_export.h"
@@ -36,8 +37,8 @@ class GL_EXPORT GLContextGLX : public GLContextReal {
private:
void Destroy();
- void* context_ = nullptr;
- x11::Connection* connection_ = nullptr;
+ raw_ptr<void> context_ = nullptr;
+ raw_ptr<x11::Connection> connection_ = nullptr;
unsigned int graphics_reset_status_ = 0; // GL_NO_ERROR
};
diff --git a/chromium/ui/gl/gl_display.cc b/chromium/ui/gl/gl_display.cc
index 5c1ca88af38..d1761467570 100644
--- a/chromium/ui/gl/gl_display.cc
+++ b/chromium/ui/gl/gl_display.cc
@@ -3,153 +3,1039 @@
// found in the LICENSE file.
#include "ui/gl/gl_display.h"
+
+#include <string>
+#include <type_traits>
+#include <vector>
+
+#include "base/command_line.h"
+#include "base/containers/contains.h"
+#include "base/debug/crash_logging.h"
+#include "base/export_template.h"
+#include "base/logging.h"
+#include "base/metrics/histogram_macros.h"
#include "base/notreached.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_split.h"
+#include "base/system/sys_info.h"
+#include "build/build_config.h"
+#include "ui/gl/angle_platform_impl.h"
+#include "ui/gl/egl_util.h"
+#include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_context_egl.h"
+#include "ui/gl/gl_display_egl_util.h"
+#include "ui/gl/gl_implementation.h"
#include "ui/gl/gl_surface.h"
#if defined(USE_GLX)
#include "ui/gl/glx_util.h"
#endif // defined(USE_GLX)
+#if defined(USE_OZONE)
+#include "ui/ozone/buildflags.h"
+#endif // defined(USE_OZONE)
+
+#if BUILDFLAG(IS_ANDROID)
+#include <android/native_window_jni.h>
+#include "base/android/build_info.h"
+#endif
+
+// From ANGLE's egl/eglext.h.
+
+#ifndef EGL_ANGLE_platform_angle
+#define EGL_ANGLE_platform_angle 1
+#define EGL_PLATFORM_ANGLE_ANGLE 0x3202
+#define EGL_PLATFORM_ANGLE_TYPE_ANGLE 0x3203
+#define EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE 0x3204
+#define EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE 0x3205
+#define EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE 0x3206
+#define EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE 0x3451
+#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE 0x3209
+#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_EGL_ANGLE 0x348E
+#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE 0x320A
+#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE 0x345E
+#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE 0x3487
+#define EGL_PLATFORM_ANGLE_NATIVE_PLATFORM_TYPE_ANGLE 0x348F
+#endif /* EGL_ANGLE_platform_angle */
+
+#ifndef EGL_ANGLE_platform_angle_d3d
+#define EGL_ANGLE_platform_angle_d3d 1
+#define EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE 0x3207
+#define EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE 0x3208
+#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_D3D_WARP_ANGLE 0x320B
+#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_D3D_REFERENCE_ANGLE 0x320C
+#endif /* EGL_ANGLE_platform_angle_d3d */
+
+#ifndef EGL_ANGLE_platform_angle_d3d_luid
+#define EGL_ANGLE_platform_angle_d3d_luid 1
+#define EGL_PLATFORM_ANGLE_D3D_LUID_HIGH_ANGLE 0x34A0
+#define EGL_PLATFORM_ANGLE_D3D_LUID_LOW_ANGLE 0x34A1
+#endif /* EGL_ANGLE_platform_angle_d3d_luid */
+
+#ifndef EGL_ANGLE_platform_angle_d3d11on12
+#define EGL_ANGLE_platform_angle_d3d11on12 1
+#define EGL_PLATFORM_ANGLE_D3D11ON12_ANGLE 0x3488
+#endif /* EGL_ANGLE_platform_angle_d3d11on12 */
+
+#ifndef EGL_ANGLE_platform_angle_opengl
+#define EGL_ANGLE_platform_angle_opengl 1
+#define EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE 0x320D
+#define EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE 0x320E
+#endif /* EGL_ANGLE_platform_angle_opengl */
+
+#ifndef EGL_ANGLE_platform_angle_null
+#define EGL_ANGLE_platform_angle_null 1
+#define EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE 0x33AE
+#endif /* EGL_ANGLE_platform_angle_null */
+
+#ifndef EGL_ANGLE_platform_angle_vulkan
+#define EGL_ANGLE_platform_angle_vulkan 1
+#define EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE 0x3450
+#define EGL_PLATFORM_VULKAN_DISPLAY_MODE_HEADLESS_ANGLE 0x34A5
+#endif /* EGL_ANGLE_platform_angle_vulkan */
+
+#ifndef EGL_ANGLE_platform_angle_metal
+#define EGL_ANGLE_platform_angle_metal 1
+#define EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE 0x3489
+#endif /* EGL_ANGLE_platform_angle_metal */
+
+#ifndef EGL_ANGLE_x11_visual
+#define EGL_ANGLE_x11_visual 1
+#define EGL_X11_VISUAL_ID_ANGLE 0x33A3
+#endif /* EGL_ANGLE_x11_visual */
+
+#ifndef EGL_ANGLE_direct_composition
+#define EGL_ANGLE_direct_composition 1
+#define EGL_DIRECT_COMPOSITION_ANGLE 0x33A5
+#endif /* EGL_ANGLE_direct_composition */
+
+#ifndef EGL_ANGLE_display_robust_resource_initialization
+#define EGL_ANGLE_display_robust_resource_initialization 1
+#define EGL_DISPLAY_ROBUST_RESOURCE_INITIALIZATION_ANGLE 0x3453
+#endif /* EGL_ANGLE_display_robust_resource_initialization */
+
+#ifndef EGL_ANGLE_display_power_preference
+#define EGL_ANGLE_display_power_preference 1
+#define EGL_POWER_PREFERENCE_ANGLE 0x3482
+#define EGL_LOW_POWER_ANGLE 0x0001
+#define EGL_HIGH_POWER_ANGLE 0x0002
+#endif /* EGL_ANGLE_power_preference */
+
+#ifndef EGL_ANGLE_platform_angle_device_id
+#define EGL_ANGLE_platform_angle_device_id
+#define EGL_PLATFORM_ANGLE_DEVICE_ID_HIGH_ANGLE 0x34D6
+#define EGL_PLATFORM_ANGLE_DEVICE_ID_LOW_ANGLE 0x34D7
+#endif /* EGL_ANGLE_platform_angle_device_id */
+
+// From ANGLE's egl/eglext.h.
+#ifndef EGL_ANGLE_feature_control
+#define EGL_ANGLE_feature_control 1
+#define EGL_FEATURE_NAME_ANGLE 0x3460
+#define EGL_FEATURE_CATEGORY_ANGLE 0x3461
+#define EGL_FEATURE_DESCRIPTION_ANGLE 0x3462
+#define EGL_FEATURE_BUG_ANGLE 0x3463
+#define EGL_FEATURE_STATUS_ANGLE 0x3464
+#define EGL_FEATURE_COUNT_ANGLE 0x3465
+#define EGL_FEATURE_OVERRIDES_ENABLED_ANGLE 0x3466
+#define EGL_FEATURE_OVERRIDES_DISABLED_ANGLE 0x3467
+#define EGL_FEATURE_ALL_DISABLED_ANGLE 0x3469
+#endif /* EGL_ANGLE_feature_control */
+
+using ui::GetLastEGLErrorString;
+
namespace gl {
-GLDisplay::GLDisplay(uint64_t system_device_id)
- : system_device_id_(system_device_id) {}
+namespace {
-GLDisplay::~GLDisplay() = default;
+std::vector<const char*> GetAttribArrayFromStringVector(
+ const std::vector<std::string>& strings) {
+ std::vector<const char*> attribs;
+ for (const std::string& item : strings) {
+ attribs.push_back(item.c_str());
+ }
+ attribs.push_back(nullptr);
+ return attribs;
+}
-#if defined(USE_EGL)
-GLDisplayEGL::GLDisplayEGL(uint64_t system_device_id)
- : GLDisplay(system_device_id) {
- display_ = EGL_NO_DISPLAY;
+std::vector<std::string> GetStringVectorFromCommandLine(
+ const base::CommandLine* command_line,
+ const char switch_name[]) {
+ std::string command_string = command_line->GetSwitchValueASCII(switch_name);
+ return base::SplitString(command_string, ", ;", base::TRIM_WHITESPACE,
+ base::SPLIT_WANT_NONEMPTY);
}
-GLDisplayEGL::~GLDisplayEGL() = default;
+EGLDisplay GetPlatformANGLEDisplay(
+ EGLNativeDisplayType display,
+ EGLenum platform_type,
+ const std::vector<std::string>& enabled_features,
+ const std::vector<std::string>& disabled_features,
+ const std::vector<EGLAttrib>& extra_display_attribs) {
+ std::vector<EGLAttrib> display_attribs(extra_display_attribs);
-EGLDisplay GLDisplayEGL::GetDisplay() {
- return display_;
-}
+ display_attribs.push_back(EGL_PLATFORM_ANGLE_TYPE_ANGLE);
+ display_attribs.push_back(static_cast<EGLAttrib>(platform_type));
-void GLDisplayEGL::SetDisplay(EGLDisplay display) {
- display_ = display;
+ if (platform_type == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) {
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ if (command_line->HasSwitch(switches::kUseAdapterLuid)) {
+ // If the LUID is specified, the format is <high part>,<low part>. Split
+ // and add them to the EGL_ANGLE_platform_angle_d3d_luid ext attributes.
+ std::string luid =
+ command_line->GetSwitchValueASCII(switches::kUseAdapterLuid);
+ size_t comma = luid.find(',');
+ if (comma != std::string::npos) {
+ int32_t high;
+ uint32_t low;
+ if (!base::StringToInt(luid.substr(0, comma), &high) ||
+ !base::StringToUint(luid.substr(comma + 1), &low))
+ return EGL_NO_DISPLAY;
+
+ display_attribs.push_back(EGL_PLATFORM_ANGLE_D3D_LUID_HIGH_ANGLE);
+ display_attribs.push_back(high);
+
+ display_attribs.push_back(EGL_PLATFORM_ANGLE_D3D_LUID_LOW_ANGLE);
+ display_attribs.push_back(low);
+ }
+ }
+ }
+
+ GLDisplayEglUtil::GetInstance()->GetPlatformExtraDisplayAttribs(
+ platform_type, &display_attribs);
+
+ std::vector<const char*> enabled_features_attribs =
+ GetAttribArrayFromStringVector(enabled_features);
+ std::vector<const char*> disabled_features_attribs =
+ GetAttribArrayFromStringVector(disabled_features);
+ if (g_driver_egl.client_ext.b_EGL_ANGLE_feature_control) {
+ if (!enabled_features_attribs.empty()) {
+ display_attribs.push_back(EGL_FEATURE_OVERRIDES_ENABLED_ANGLE);
+ display_attribs.push_back(
+ reinterpret_cast<EGLAttrib>(enabled_features_attribs.data()));
+ }
+ if (!disabled_features_attribs.empty()) {
+ display_attribs.push_back(EGL_FEATURE_OVERRIDES_DISABLED_ANGLE);
+ display_attribs.push_back(
+ reinterpret_cast<EGLAttrib>(disabled_features_attribs.data()));
+ }
+ }
+ // TODO(dbehr) Add an attrib to Angle to pass EGL platform.
+
+ if (g_driver_egl.client_ext.b_EGL_ANGLE_display_power_preference) {
+ GpuPreference pref =
+ GLSurface::AdjustGpuPreference(GpuPreference::kDefault);
+ switch (pref) {
+ case GpuPreference::kDefault:
+ // Don't request any GPU, let ANGLE and the native driver decide.
+ break;
+ case GpuPreference::kLowPower:
+ display_attribs.push_back(EGL_POWER_PREFERENCE_ANGLE);
+ display_attribs.push_back(EGL_LOW_POWER_ANGLE);
+ break;
+ case GpuPreference::kHighPerformance:
+ display_attribs.push_back(EGL_POWER_PREFERENCE_ANGLE);
+ display_attribs.push_back(EGL_HIGH_POWER_ANGLE);
+ break;
+ default:
+ NOTREACHED();
+ }
+ }
+
+ display_attribs.push_back(EGL_NONE);
+
+ // This is an EGL 1.5 function that we know ANGLE supports. It's used to pass
+ // EGLAttribs (pointers) instead of EGLints into the display
+ return eglGetPlatformDisplay(EGL_PLATFORM_ANGLE_ANGLE,
+ reinterpret_cast<void*>(display),
+ &display_attribs[0]);
}
-EGLDisplay GLDisplayEGL::GetHardwareDisplay() {
- return GetDisplay();
+EGLDisplay GetDisplayFromType(
+ DisplayType display_type,
+ EGLDisplayPlatform native_display,
+ const std::vector<std::string>& enabled_angle_features,
+ const std::vector<std::string>& disabled_angle_features,
+ bool disable_all_angle_features,
+ uint64_t system_device_id) {
+ std::vector<EGLAttrib> extra_display_attribs;
+ if (disable_all_angle_features) {
+ extra_display_attribs.push_back(EGL_FEATURE_ALL_DISABLED_ANGLE);
+ extra_display_attribs.push_back(EGL_TRUE);
+ }
+ if (system_device_id != 0 &&
+ g_driver_egl.client_ext.b_EGL_ANGLE_platform_angle_device_id) {
+ uint32_t low_part = system_device_id & 0xffffffff;
+ extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_ID_LOW_ANGLE);
+ extra_display_attribs.push_back(low_part);
+
+ uint32_t high_part = (system_device_id >> 32) & 0xffffffff;
+ extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_ID_HIGH_ANGLE);
+ extra_display_attribs.push_back(high_part);
+ }
+ EGLNativeDisplayType display = native_display.GetDisplay();
+ switch (display_type) {
+ case DEFAULT:
+ case SWIFT_SHADER: {
+ if (native_display.GetPlatform() != 0) {
+ return eglGetPlatformDisplay(native_display.GetPlatform(),
+ reinterpret_cast<void*>(display), nullptr);
+ }
+ return eglGetDisplay(display);
+ }
+ case ANGLE_D3D9:
+ return GetPlatformANGLEDisplay(
+ display, EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE, enabled_angle_features,
+ disabled_angle_features, extra_display_attribs);
+ case ANGLE_D3D11:
+ return GetPlatformANGLEDisplay(
+ display, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, enabled_angle_features,
+ disabled_angle_features, extra_display_attribs);
+ case ANGLE_D3D11_NULL:
+ extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
+ extra_display_attribs.push_back(
+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE);
+ return GetPlatformANGLEDisplay(
+ display, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, enabled_angle_features,
+ disabled_angle_features, extra_display_attribs);
+ case ANGLE_OPENGL:
+ return GetPlatformANGLEDisplay(
+ display, EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, enabled_angle_features,
+ disabled_angle_features, extra_display_attribs);
+ case ANGLE_OPENGL_EGL:
+ extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
+ extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_EGL_ANGLE);
+ return GetPlatformANGLEDisplay(
+ display, EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, enabled_angle_features,
+ disabled_angle_features, extra_display_attribs);
+ case ANGLE_OPENGL_NULL:
+ extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
+ extra_display_attribs.push_back(
+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE);
+ return GetPlatformANGLEDisplay(
+ display, EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE, enabled_angle_features,
+ disabled_angle_features, extra_display_attribs);
+ case ANGLE_OPENGLES:
+ return GetPlatformANGLEDisplay(
+ display, EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE,
+ enabled_angle_features, disabled_angle_features,
+ extra_display_attribs);
+ case ANGLE_OPENGLES_EGL:
+ extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
+ extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_EGL_ANGLE);
+ return GetPlatformANGLEDisplay(
+ display, EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE,
+ enabled_angle_features, disabled_angle_features,
+ extra_display_attribs);
+ case ANGLE_OPENGLES_NULL:
+ extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
+ extra_display_attribs.push_back(
+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE);
+ return GetPlatformANGLEDisplay(
+ display, EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE,
+ enabled_angle_features, disabled_angle_features,
+ extra_display_attribs);
+ case ANGLE_NULL:
+ return GetPlatformANGLEDisplay(
+ display, EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE, enabled_angle_features,
+ disabled_angle_features, extra_display_attribs);
+ case ANGLE_VULKAN:
+ return GetPlatformANGLEDisplay(
+ display, EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE, enabled_angle_features,
+ disabled_angle_features, extra_display_attribs);
+ case ANGLE_VULKAN_NULL:
+ extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
+ extra_display_attribs.push_back(
+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE);
+ return GetPlatformANGLEDisplay(
+ display, EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE, enabled_angle_features,
+ disabled_angle_features, extra_display_attribs);
+ case ANGLE_D3D11on12:
+ extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_D3D11ON12_ANGLE);
+ extra_display_attribs.push_back(EGL_TRUE);
+ return GetPlatformANGLEDisplay(
+ display, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, enabled_angle_features,
+ disabled_angle_features, extra_display_attribs);
+ case ANGLE_SWIFTSHADER:
+ extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
+ extra_display_attribs.push_back(
+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE);
+#if defined(USE_OZONE)
+#if BUILDFLAG(IS_CHROMEOS) && BUILDFLAG(OZONE_PLATFORM_X11)
+ extra_display_attribs.push_back(
+ EGL_PLATFORM_ANGLE_NATIVE_PLATFORM_TYPE_ANGLE);
+ extra_display_attribs.push_back(
+ EGL_PLATFORM_VULKAN_DISPLAY_MODE_HEADLESS_ANGLE);
+#endif // BUILDFLAG(OZONE_PLATFORM_X11)
+#endif // defined(USE_OZONE)
+ return GetPlatformANGLEDisplay(
+ display, EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE, enabled_angle_features,
+ disabled_angle_features, extra_display_attribs);
+ case ANGLE_METAL:
+ return GetPlatformANGLEDisplay(
+ display, EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE, enabled_angle_features,
+ disabled_angle_features, extra_display_attribs);
+ case ANGLE_METAL_NULL:
+ extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
+ extra_display_attribs.push_back(
+ EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE);
+ return GetPlatformANGLEDisplay(
+ display, EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE, enabled_angle_features,
+ disabled_angle_features, extra_display_attribs);
+ default:
+ NOTREACHED();
+ return EGL_NO_DISPLAY;
+ }
}
-EGLNativeDisplayType GLDisplayEGL::GetNativeDisplay() {
- return native_display.GetDisplay();
+ANGLEImplementation GetANGLEImplementationFromDisplayType(
+ DisplayType display_type) {
+ switch (display_type) {
+ case ANGLE_D3D9:
+ return ANGLEImplementation::kD3D9;
+ case ANGLE_D3D11:
+ case ANGLE_D3D11_NULL:
+ case ANGLE_D3D11on12:
+ return ANGLEImplementation::kD3D11;
+ case ANGLE_OPENGL:
+ case ANGLE_OPENGL_NULL:
+ return ANGLEImplementation::kOpenGL;
+ case ANGLE_OPENGLES:
+ case ANGLE_OPENGLES_NULL:
+ return ANGLEImplementation::kOpenGLES;
+ case ANGLE_NULL:
+ return ANGLEImplementation::kNull;
+ case ANGLE_VULKAN:
+ case ANGLE_VULKAN_NULL:
+ return ANGLEImplementation::kVulkan;
+ case ANGLE_SWIFTSHADER:
+ return ANGLEImplementation::kSwiftShader;
+ case ANGLE_METAL:
+ case ANGLE_METAL_NULL:
+ return ANGLEImplementation::kMetal;
+ default:
+ return ANGLEImplementation::kNone;
+ }
}
-DisplayType GLDisplayEGL::GetDisplayType() {
- return display_type;
+const char* DisplayTypeString(DisplayType display_type) {
+ switch (display_type) {
+ case DEFAULT:
+ return "Default";
+ case SWIFT_SHADER:
+ return "SwiftShader";
+ case ANGLE_D3D9:
+ return "D3D9";
+ case ANGLE_D3D11:
+ return "D3D11";
+ case ANGLE_D3D11_NULL:
+ return "D3D11Null";
+ case ANGLE_OPENGL:
+ return "OpenGL";
+ case ANGLE_OPENGL_NULL:
+ return "OpenGLNull";
+ case ANGLE_OPENGLES:
+ return "OpenGLES";
+ case ANGLE_OPENGLES_NULL:
+ return "OpenGLESNull";
+ case ANGLE_NULL:
+ return "Null";
+ case ANGLE_VULKAN:
+ return "Vulkan";
+ case ANGLE_VULKAN_NULL:
+ return "VulkanNull";
+ case ANGLE_D3D11on12:
+ return "D3D11on12";
+ case ANGLE_SWIFTSHADER:
+ return "SwANGLE";
+ case ANGLE_OPENGL_EGL:
+ return "OpenGLEGL";
+ case ANGLE_OPENGLES_EGL:
+ return "OpenGLESEGL";
+ case ANGLE_METAL:
+ return "Metal";
+ case ANGLE_METAL_NULL:
+ return "MetalNull";
+ default:
+ NOTREACHED();
+ return "Err";
+ }
}
-bool GLDisplayEGL::HasEGLClientExtension(const char* name) {
- if (!egl_client_extensions)
- return false;
- return GLSurface::ExtensionsContain(egl_client_extensions, name);
+void AddInitDisplay(std::vector<DisplayType>* init_displays,
+ DisplayType display_type) {
+ // Make sure to not add the same display type twice.
+ if (!base::Contains(*init_displays, display_type))
+ init_displays->push_back(display_type);
}
-bool GLDisplayEGL::HasEGLExtension(const char* name) {
- return GLSurface::ExtensionsContain(egl_extensions, name);
+const char* GetDebugMessageTypeString(EGLint source) {
+ switch (source) {
+ case EGL_DEBUG_MSG_CRITICAL_KHR:
+ return "Critical";
+ case EGL_DEBUG_MSG_ERROR_KHR:
+ return "Error";
+ case EGL_DEBUG_MSG_WARN_KHR:
+ return "Warning";
+ case EGL_DEBUG_MSG_INFO_KHR:
+ return "Info";
+ default:
+ return "UNKNOWN";
+ }
}
-bool GLDisplayEGL::IsCreateContextRobustnessSupported() {
- return egl_create_context_robustness_supported;
+void EGLAPIENTRY LogEGLDebugMessage(EGLenum error,
+ const char* command,
+ EGLint message_type,
+ EGLLabelKHR thread_label,
+ EGLLabelKHR object_label,
+ const char* message) {
+ std::string formatted_message = std::string("EGL Driver message (") +
+ GetDebugMessageTypeString(message_type) +
+ ") " + command + ": " + message;
+
+ // Assume that all labels that have been set are strings
+ if (thread_label) {
+ formatted_message += " thread: ";
+ formatted_message += static_cast<const char*>(thread_label);
+ }
+ if (object_label) {
+ formatted_message += " object: ";
+ formatted_message += static_cast<const char*>(object_label);
+ }
+
+ if (message_type == EGL_DEBUG_MSG_CRITICAL_KHR ||
+ message_type == EGL_DEBUG_MSG_ERROR_KHR) {
+ LOG(ERROR) << formatted_message;
+ } else {
+ DVLOG(1) << formatted_message;
+ }
}
-bool GLDisplayEGL::IsRobustnessVideoMemoryPurgeSupported() {
- return egl_robustness_video_memory_purge_supported;
+void GetEGLInitDisplays(bool supports_angle_d3d,
+ bool supports_angle_opengl,
+ bool supports_angle_null,
+ bool supports_angle_vulkan,
+ bool supports_angle_swiftshader,
+ bool supports_angle_egl,
+ bool supports_angle_metal,
+ const base::CommandLine* command_line,
+ std::vector<DisplayType>* init_displays) {
+ // If we're already requesting software GL, make sure we don't fallback to the
+ // GPU
+ bool forceSoftwareGL = IsSoftwareGLImplementation(GetGLImplementationParts());
+
+ std::string requested_renderer =
+ forceSoftwareGL ? kANGLEImplementationSwiftShaderName
+ : command_line->GetSwitchValueASCII(switches::kUseANGLE);
+
+ bool use_angle_default =
+ !forceSoftwareGL &&
+ (!command_line->HasSwitch(switches::kUseANGLE) ||
+ requested_renderer == kANGLEImplementationDefaultName);
+
+ if (supports_angle_null &&
+ requested_renderer == kANGLEImplementationNullName) {
+ AddInitDisplay(init_displays, ANGLE_NULL);
+ return;
+ }
+
+ // If no display has been explicitly requested and the DefaultANGLEOpenGL
+ // experiment is enabled, try creating OpenGL displays first.
+ // TODO(oetuaho@nvidia.com): Only enable this path on specific GPUs with a
+ // blocklist entry. http://crbug.com/693090
+ if (supports_angle_opengl && use_angle_default &&
+ base::FeatureList::IsEnabled(features::kDefaultANGLEOpenGL)) {
+ AddInitDisplay(init_displays, ANGLE_OPENGL);
+ AddInitDisplay(init_displays, ANGLE_OPENGLES);
+ }
+
+ if (supports_angle_metal && use_angle_default &&
+ base::FeatureList::IsEnabled(features::kDefaultANGLEMetal)) {
+ AddInitDisplay(init_displays, ANGLE_METAL);
+ }
+
+ if (supports_angle_vulkan && use_angle_default &&
+ features::IsDefaultANGLEVulkan()) {
+ AddInitDisplay(init_displays, ANGLE_VULKAN);
+ }
+
+ if (supports_angle_d3d) {
+ if (use_angle_default) {
+ // Default mode for ANGLE - try D3D11, else try D3D9
+ if (!command_line->HasSwitch(switches::kDisableD3D11)) {
+ AddInitDisplay(init_displays, ANGLE_D3D11);
+ }
+ AddInitDisplay(init_displays, ANGLE_D3D9);
+ } else {
+ if (requested_renderer == kANGLEImplementationD3D11Name) {
+ AddInitDisplay(init_displays, ANGLE_D3D11);
+ } else if (requested_renderer == kANGLEImplementationD3D9Name) {
+ AddInitDisplay(init_displays, ANGLE_D3D9);
+ } else if (requested_renderer == kANGLEImplementationD3D11NULLName) {
+ AddInitDisplay(init_displays, ANGLE_D3D11_NULL);
+ } else if (requested_renderer == kANGLEImplementationD3D11on12Name) {
+ AddInitDisplay(init_displays, ANGLE_D3D11on12);
+ }
+ }
+ }
+
+ if (supports_angle_opengl) {
+ if (use_angle_default && !supports_angle_d3d) {
+#if BUILDFLAG(IS_ANDROID)
+ // Don't request desktopGL on android
+ AddInitDisplay(init_displays, ANGLE_OPENGLES);
+#else
+ AddInitDisplay(init_displays, ANGLE_OPENGL);
+ AddInitDisplay(init_displays, ANGLE_OPENGLES);
+#endif // BUILDFLAG(IS_ANDROID)
+ } else {
+ if (requested_renderer == kANGLEImplementationOpenGLName) {
+ AddInitDisplay(init_displays, ANGLE_OPENGL);
+ } else if (requested_renderer == kANGLEImplementationOpenGLESName) {
+ AddInitDisplay(init_displays, ANGLE_OPENGLES);
+ } else if (requested_renderer == kANGLEImplementationOpenGLNULLName) {
+ AddInitDisplay(init_displays, ANGLE_OPENGL_NULL);
+ } else if (requested_renderer == kANGLEImplementationOpenGLESNULLName) {
+ AddInitDisplay(init_displays, ANGLE_OPENGLES_NULL);
+ } else if (requested_renderer == kANGLEImplementationOpenGLEGLName &&
+ supports_angle_egl) {
+ AddInitDisplay(init_displays, ANGLE_OPENGL_EGL);
+ } else if (requested_renderer == kANGLEImplementationOpenGLESEGLName &&
+ supports_angle_egl) {
+ AddInitDisplay(init_displays, ANGLE_OPENGLES_EGL);
+ }
+ }
+ }
+
+ if (supports_angle_vulkan) {
+ if (use_angle_default) {
+ if (!supports_angle_d3d && !supports_angle_opengl) {
+ AddInitDisplay(init_displays, ANGLE_VULKAN);
+ }
+ } else if (requested_renderer == kANGLEImplementationVulkanName) {
+ AddInitDisplay(init_displays, ANGLE_VULKAN);
+ } else if (requested_renderer == kANGLEImplementationVulkanNULLName) {
+ AddInitDisplay(init_displays, ANGLE_VULKAN_NULL);
+ }
+ }
+
+ if (supports_angle_swiftshader) {
+ if (requested_renderer == kANGLEImplementationSwiftShaderName ||
+ requested_renderer == kANGLEImplementationSwiftShaderForWebGLName) {
+ AddInitDisplay(init_displays, ANGLE_SWIFTSHADER);
+ }
+ }
+
+ if (supports_angle_metal) {
+ if (use_angle_default) {
+ if (!supports_angle_opengl) {
+ AddInitDisplay(init_displays, ANGLE_METAL);
+ }
+ } else if (requested_renderer == kANGLEImplementationMetalName) {
+ AddInitDisplay(init_displays, ANGLE_METAL);
+ } else if (requested_renderer == kANGLEImplementationMetalNULLName) {
+ AddInitDisplay(init_displays, ANGLE_METAL_NULL);
+ }
+ }
+
+ // If no displays are available due to missing angle extensions or invalid
+ // flags, request the default display.
+ if (init_displays->empty()) {
+ init_displays->push_back(DEFAULT);
+ }
}
-bool GLDisplayEGL::IsCreateContextBindGeneratesResourceSupported() {
- return egl_create_context_bind_generates_resource_supported;
+} // namespace
+
+void GetEGLInitDisplaysForTesting(bool supports_angle_d3d,
+ bool supports_angle_opengl,
+ bool supports_angle_null,
+ bool supports_angle_vulkan,
+ bool supports_angle_swiftshader,
+ bool supports_angle_egl,
+ bool supports_angle_metal,
+ const base::CommandLine* command_line,
+ std::vector<DisplayType>* init_displays) {
+ GetEGLInitDisplays(supports_angle_d3d, supports_angle_opengl,
+ supports_angle_null, supports_angle_vulkan,
+ supports_angle_swiftshader, supports_angle_egl,
+ supports_angle_metal, command_line, init_displays);
}
-bool GLDisplayEGL::IsCreateContextWebGLCompatabilitySupported() {
- return egl_create_context_webgl_compatability_supported;
+GLDisplay::GLDisplay(uint64_t system_device_id, DisplayPlatform type)
+ : system_device_id_(system_device_id), type_(type) {}
+
+GLDisplay::~GLDisplay() = default;
+
+template <typename GLDisplayPlatform>
+GLDisplayPlatform* GLDisplay::GetAs() {
+ bool type_checked = false;
+ switch (type_) {
+ case NONE:
+ NOTREACHED();
+ break;
+
+ case EGL:
+#if defined(USE_EGL)
+ type_checked = std::is_same<GLDisplayPlatform, GLDisplayEGL>::value;
+#endif // defined(USE_EGL)
+ break;
+
+ case X11:
+#if defined(USE_GLX)
+ type_checked = std::is_same<GLDisplayPlatform, GLDisplayX11>::value;
+#endif // defined(USE_GLX)
+ break;
+ }
+ if (type_checked)
+ return static_cast<GLDisplayPlatform*>(this);
+
+ return nullptr;
}
-bool GLDisplayEGL::IsEGLSurfacelessContextSupported() {
- return egl_surfaceless_context_supported;
+#if defined(USE_EGL)
+template EXPORT_TEMPLATE_DEFINE(GL_EXPORT)
+ GLDisplayEGL* GLDisplay::GetAs<GLDisplayEGL>();
+#endif // defined(USE_EGL)
+
+#if defined(USE_GLX)
+template EXPORT_TEMPLATE_DEFINE(GL_EXPORT)
+ GLDisplayX11* GLDisplay::GetAs<GLDisplayX11>();
+#endif // defined(USE_GLX)
+
+#if defined(USE_EGL)
+GLDisplayEGL::EGLGpuSwitchingObserver::EGLGpuSwitchingObserver(
+ EGLDisplay display)
+ : display_(display) {
+ DCHECK(display != EGL_NO_DISPLAY);
}
-bool GLDisplayEGL::IsEGLContextPrioritySupported() {
- return egl_context_priority_supported;
+void GLDisplayEGL::EGLGpuSwitchingObserver::OnGpuSwitched(
+ GpuPreference active_gpu_heuristic) {
+ eglHandleGPUSwitchANGLE(display_);
}
-bool GLDisplayEGL::IsEGLNoConfigContextSupported() {
- return egl_no_config_context_supported;
+GLDisplayEGL::GLDisplayEGL(uint64_t system_device_id)
+ : GLDisplay(system_device_id, EGL), display_(EGL_NO_DISPLAY) {
+ ext = std::make_unique<DisplayExtensionsEGL>();
}
-bool GLDisplayEGL::IsRobustResourceInitSupported() {
- return egl_robust_resource_init_supported;
+GLDisplayEGL::~GLDisplayEGL() = default;
+
+EGLDisplay GLDisplayEGL::GetDisplay() {
+ return display_;
}
-bool GLDisplayEGL::IsDisplayTextureShareGroupSupported() {
- return egl_display_texture_share_group_supported;
+void GLDisplayEGL::Shutdown() {
+ if (display_ == EGL_NO_DISPLAY)
+ return;
+
+ if (gpu_switching_observer_.get()) {
+ ui::GpuSwitchingManager::GetInstance()->RemoveObserver(
+ gpu_switching_observer_.get());
+ gpu_switching_observer_.reset();
+ }
+
+ angle::ResetPlatform(display_);
+ DCHECK(g_driver_egl.fn.eglTerminateFn);
+ eglTerminate(display_);
+
+ display_ = EGL_NO_DISPLAY;
+ egl_surfaceless_context_supported_ = false;
+ egl_context_priority_supported_ = false;
+ egl_android_native_fence_sync_supported_ = false;
}
-bool GLDisplayEGL::IsDisplaySemaphoreShareGroupSupported() {
- return egl_display_semaphore_share_group_supported;
+bool GLDisplayEGL::IsInitialized() {
+ return display_ != EGL_NO_DISPLAY;
}
-bool GLDisplayEGL::IsCreateContextClientArraysSupported() {
- return egl_create_context_client_arrays_supported;
+void GLDisplayEGL::SetDisplay(EGLDisplay display) {
+ display_ = display;
}
-bool GLDisplayEGL::IsAndroidNativeFenceSyncSupported() {
- return egl_android_native_fence_sync_supported;
+EGLDisplayPlatform GLDisplayEGL::GetNativeDisplay() const {
+ return native_display_;
}
-bool GLDisplayEGL::IsPixelFormatFloatSupported() {
- return egl_ext_pixel_format_float_supported;
+DisplayType GLDisplayEGL::GetDisplayType() const {
+ return display_type_;
}
-bool GLDisplayEGL::IsANGLEFeatureControlSupported() {
- return egl_angle_feature_control_supported;
+// static
+GLDisplayEGL* GLDisplayEGL::GetDisplayForCurrentContext() {
+ GLContext* context = GLContext::GetCurrent();
+ return context ? context->GetGLDisplayEGL() : nullptr;
}
-bool GLDisplayEGL::IsANGLEPowerPreferenceSupported() {
- return egl_angle_power_preference_supported;
+bool GLDisplayEGL::IsEGLSurfacelessContextSupported() {
+ return egl_surfaceless_context_supported_;
}
-bool GLDisplayEGL::IsANGLEDisplayPowerPreferenceSupported() {
- return egl_angle_display_power_preference_supported;
+bool GLDisplayEGL::IsEGLContextPrioritySupported() {
+ return egl_context_priority_supported_;
}
-bool GLDisplayEGL::IsANGLEPlatformANGLEDeviceIdSupported() {
- return egl_angle_platform_angle_device_id_supported;
+bool GLDisplayEGL::IsAndroidNativeFenceSyncSupported() {
+ return egl_android_native_fence_sync_supported_;
}
bool GLDisplayEGL::IsANGLEExternalContextAndSurfaceSupported() {
- return egl_angle_external_context_and_surface_supported;
+ return this->ext->b_EGL_ANGLE_external_context_and_surface;
}
-bool GLDisplayEGL::IsANGLEContextVirtualizationSupported() {
- return egl_angle_context_virtualization_supported;
+bool GLDisplayEGL::Initialize(EGLDisplayPlatform native_display) {
+ if (display_ != EGL_NO_DISPLAY)
+ return true;
+
+ if (!InitializeDisplay(native_display))
+ return false;
+ InitializeCommon();
+
+ if (ext->b_EGL_ANGLE_power_preference) {
+ gpu_switching_observer_ =
+ std::make_unique<EGLGpuSwitchingObserver>(display_);
+ ui::GpuSwitchingManager::GetInstance()->AddObserver(
+ gpu_switching_observer_.get());
+ }
+ return true;
}
-bool GLDisplayEGL::IsANGLEVulkanImageSupported() {
- return egl_angle_vulkan_image_supported;
+void GLDisplayEGL::InitializeForTesting() {
+ display_ = eglGetCurrentDisplay();
+ ext->InitializeExtensionSettings(display_);
+ InitializeCommon();
}
-bool GLDisplayEGL::IsEGLQueryDeviceSupported() {
- return egl_ext_query_device_supported;
+bool GLDisplayEGL::InitializeExtensionSettings() {
+ if (display_ == EGL_NO_DISPLAY)
+ return false;
+ ext->UpdateConditionalExtensionSettings(display_);
+ return true;
}
+// InitializeDisplay is necessary because the static binding code
+// needs a full Display init before it can query the Display extensions.
+bool GLDisplayEGL::InitializeDisplay(EGLDisplayPlatform native_display) {
+ if (display_ != EGL_NO_DISPLAY)
+ return true;
+
+ native_display_ = native_display;
+
+ bool supports_egl_debug = g_driver_egl.client_ext.b_EGL_KHR_debug;
+ if (supports_egl_debug) {
+ EGLAttrib controls[] = {
+ EGL_DEBUG_MSG_CRITICAL_KHR,
+ EGL_TRUE,
+ EGL_DEBUG_MSG_ERROR_KHR,
+ EGL_TRUE,
+ EGL_DEBUG_MSG_WARN_KHR,
+ EGL_TRUE,
+ EGL_DEBUG_MSG_INFO_KHR,
+ EGL_TRUE,
+ EGL_NONE,
+ EGL_NONE,
+ };
+
+ eglDebugMessageControlKHR(&LogEGLDebugMessage, controls);
+ }
+
+ bool supports_angle_d3d = false;
+ bool supports_angle_opengl = false;
+ bool supports_angle_null = false;
+ bool supports_angle_vulkan = false;
+ bool supports_angle_swiftshader = false;
+ bool supports_angle_egl = false;
+ bool supports_angle_metal = false;
+ // Check for availability of ANGLE extensions.
+ if (g_driver_egl.client_ext.b_EGL_ANGLE_platform_angle) {
+ supports_angle_d3d = g_driver_egl.client_ext.b_EGL_ANGLE_platform_angle_d3d;
+ supports_angle_opengl =
+ g_driver_egl.client_ext.b_EGL_ANGLE_platform_angle_opengl;
+ supports_angle_null =
+ g_driver_egl.client_ext.b_EGL_ANGLE_platform_angle_null;
+ supports_angle_vulkan =
+ g_driver_egl.client_ext.b_EGL_ANGLE_platform_angle_vulkan;
+ supports_angle_swiftshader =
+ g_driver_egl.client_ext
+ .b_EGL_ANGLE_platform_angle_device_type_swiftshader;
+ supports_angle_egl = g_driver_egl.client_ext
+ .b_EGL_ANGLE_platform_angle_device_type_egl_angle;
+ supports_angle_metal =
+ g_driver_egl.client_ext.b_EGL_ANGLE_platform_angle_metal;
+ }
+
+ bool supports_angle = supports_angle_d3d || supports_angle_opengl ||
+ supports_angle_null || supports_angle_vulkan ||
+ supports_angle_swiftshader || supports_angle_metal;
+
+ std::vector<DisplayType> init_displays;
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+ GetEGLInitDisplays(supports_angle_d3d, supports_angle_opengl,
+ supports_angle_null, supports_angle_vulkan,
+ supports_angle_swiftshader, supports_angle_egl,
+ supports_angle_metal, command_line, &init_displays);
+
+ std::vector<std::string> enabled_angle_features =
+ GetStringVectorFromCommandLine(command_line,
+ switches::kEnableANGLEFeatures);
+ std::vector<std::string> disabled_angle_features =
+ GetStringVectorFromCommandLine(command_line,
+ switches::kDisableANGLEFeatures);
+
+ bool disable_all_angle_features =
+ command_line->HasSwitch(switches::kDisableGpuDriverBugWorkarounds);
+
+ for (size_t disp_index = 0; disp_index < init_displays.size(); ++disp_index) {
+ DisplayType display_type = init_displays[disp_index];
+ EGLDisplay display = GetDisplayFromType(
+ display_type, native_display, enabled_angle_features,
+ disabled_angle_features, disable_all_angle_features, system_device_id_);
+ if (display == EGL_NO_DISPLAY) {
+ LOG(ERROR) << "EGL display query failed with error "
+ << GetLastEGLErrorString();
+ }
+
+ // Init ANGLE platform now that we have the global display.
+ if (supports_angle) {
+ if (!angle::InitializePlatform(display)) {
+ LOG(ERROR) << "ANGLE Platform initialization failed.";
+ }
+
+ SetANGLEImplementation(
+ GetANGLEImplementationFromDisplayType(display_type));
+ }
+
+ // The platform may need to unset its platform specific display env in case
+ // of vulkan if the platform doesn't support Vulkan surface.
+ absl::optional<base::ScopedEnvironmentVariableOverride> unset_display;
+ if (display_type == ANGLE_VULKAN) {
+ unset_display = GLDisplayEglUtil::GetInstance()
+ ->MaybeGetScopedDisplayUnsetForVulkan();
+ }
+
+ if (!eglInitialize(display, nullptr, nullptr)) {
+ bool is_last = disp_index == init_displays.size() - 1;
+
+ LOG(ERROR) << "eglInitialize " << DisplayTypeString(display_type)
+ << " failed with error " << GetLastEGLErrorString()
+ << (is_last ? "" : ", trying next display type");
+ continue;
+ }
+
+ std::ostringstream display_type_string;
+ auto gl_implementation = GetGLImplementationParts();
+ display_type_string << GetGLImplementationGLName(gl_implementation);
+ if (gl_implementation.gl == kGLImplementationEGLANGLE) {
+ display_type_string << ":" << DisplayTypeString(display_type);
+ }
+
+ static auto* egl_display_type_key = base::debug::AllocateCrashKeyString(
+ "egl-display-type", base::debug::CrashKeySize::Size32);
+ base::debug::SetCrashKeyString(egl_display_type_key,
+ display_type_string.str());
+
+ UMA_HISTOGRAM_ENUMERATION("GPU.EGLDisplayType", display_type,
+ DISPLAY_TYPE_MAX);
+ display_ = display;
+ display_type_ = display_type;
+ ext->InitializeExtensionSettings(display);
+ return true;
+ }
+
+ return false;
+}
+
+void GLDisplayEGL::InitializeCommon() {
+ // According to https://source.android.com/compatibility/android-cdd.html the
+ // EGL_IMG_context_priority extension is mandatory for Virtual Reality High
+ // Performance support, but due to a bug in Android Nougat the extension
+ // isn't being reported even when it's present. As a fallback, check if other
+ // related extensions that were added for VR support are present, and assume
+ // that this implies context priority is also supported. See also:
+ // https://github.com/googlevr/gvr-android-sdk/issues/330
+ egl_context_priority_supported_ =
+ ext->b_EGL_IMG_context_priority ||
+ (ext->b_EGL_ANDROID_front_buffer_auto_refresh &&
+ ext->b_EGL_ANDROID_create_native_client_buffer);
+
+ // Check if SurfacelessEGL is supported.
+ egl_surfaceless_context_supported_ = ext->b_EGL_KHR_surfaceless_context;
+
+ // TODO(oetuaho@nvidia.com): Surfaceless is disabled on Android as a temporary
+ // workaround, since code written for Android WebView takes different paths
+ // based on whether GL surface objects have underlying EGL surface handles,
+ // conflicting with the use of surfaceless. ANGLE can still expose surfacelss
+ // because it is emulated with pbuffers if native support is not present. See
+ // https://crbug.com/382349.
+
+#if BUILDFLAG(IS_ANDROID)
+ // Use the WebGL compatibility extension for detecting ANGLE. ANGLE always
+ // exposes it.
+ bool is_angle = ext->b_EGL_ANGLE_create_context_webgl_compatibility;
+ if (!is_angle) {
+ egl_surfaceless_context_supported_ = false;
+ }
+#endif // BUILDFLAG(IS_ANDROID)
+
+ if (egl_surfaceless_context_supported_) {
+ // EGL_KHR_surfaceless_context is supported but ensure
+ // GL_OES_surfaceless_context is also supported. We need a current context
+ // to query for supported GL extensions.
+ scoped_refptr<GLSurface> surface =
+ new SurfacelessEGL(this, gfx::Size(1, 1));
+ scoped_refptr<GLContext> context = InitializeGLContext(
+ new GLContextEGL(nullptr), surface.get(), GLContextAttribs());
+ if (!context || !context->MakeCurrent(surface.get()))
+ egl_surfaceless_context_supported_ = false;
+
+ // Ensure context supports GL_OES_surfaceless_context.
+ if (egl_surfaceless_context_supported_) {
+ egl_surfaceless_context_supported_ =
+ context->HasExtension("GL_OES_surfaceless_context");
+ context->ReleaseCurrent(surface.get());
+ }
+ }
+
+ // The native fence sync extension is a bit complicated. It's reported as
+ // present for ChromeOS, but Android currently doesn't report this extension
+ // even when it's present, and older devices and Android emulator may export
+ // a useless wrapper function. See crbug.com/775707 for details. In short, if
+ // the symbol is present and we're on Android N or newer and we are not on
+ // Android emulator, assume that it's usable even if the extension wasn't
+ // reported. TODO(https://crbug.com/1086781): Once this is fixed at the
+ // Android level, update the heuristic to trust the reported extension from
+ // that version onward.
+ egl_android_native_fence_sync_supported_ =
+ ext->b_EGL_ANDROID_native_fence_sync;
+#if BUILDFLAG(IS_ANDROID)
+ if (!egl_android_native_fence_sync_supported_ &&
+ base::android::BuildInfo::GetInstance()->sdk_int() >=
+ base::android::SDK_VERSION_NOUGAT &&
+ g_driver_egl.fn.eglDupNativeFenceFDANDROIDFn &&
+ base::SysInfo::GetAndroidHardwareEGL() != "swiftshader" &&
+ base::SysInfo::GetAndroidHardwareEGL() != "emulation") {
+ egl_android_native_fence_sync_supported_ = true;
+ }
+#endif // BUILDFLAG(IS_ANDROID)
+}
#endif // defined(USE_EGL)
#if defined(USE_GLX)
GLDisplayX11::GLDisplayX11(uint64_t system_device_id)
- : GLDisplay(system_device_id) {}
+ : GLDisplay(system_device_id, X11) {}
GLDisplayX11::~GLDisplayX11() = default;
void* GLDisplayX11::GetDisplay() {
return x11::Connection::Get()->GetXlibDisplay();
}
+
+void GLDisplayX11::Shutdown() {}
+
+bool GLDisplayX11::IsInitialized() {
+ return true;
+}
#endif // defined(USE_GLX)
} // namespace gl
diff --git a/chromium/ui/gl/gl_display.h b/chromium/ui/gl/gl_display.h
index 5260daf0109..b44710c0fd7 100644
--- a/chromium/ui/gl/gl_display.h
+++ b/chromium/ui/gl/gl_display.h
@@ -7,14 +7,23 @@
#include <stdint.h>
+#include <memory>
+#include <vector>
+
#include "ui/gl/gl_export.h"
#if defined(USE_EGL)
#include <EGL/egl.h>
+
+#include "ui/gl/gpu_switching_manager.h"
#endif // defined(USE_EGL)
-namespace gl {
+namespace base {
+class CommandLine;
+} // namespace base
+namespace gl {
+struct DisplayExtensionsEGL;
template <typename GLDisplayPlatform>
class GLDisplayManager;
@@ -62,6 +71,23 @@ enum DisplayType {
DISPLAY_TYPE_MAX = 19,
};
+enum DisplayPlatform {
+ NONE = 0,
+ EGL = 1,
+ X11 = 2,
+};
+
+GL_EXPORT void GetEGLInitDisplaysForTesting(
+ bool supports_angle_d3d,
+ bool supports_angle_opengl,
+ bool supports_angle_null,
+ bool supports_angle_vulkan,
+ bool supports_angle_swiftshader,
+ bool supports_angle_egl,
+ bool supports_angle_metal,
+ const base::CommandLine* command_line,
+ std::vector<DisplayType>* init_displays);
+
class GL_EXPORT GLDisplay {
public:
GLDisplay(const GLDisplay&) = delete;
@@ -72,11 +98,17 @@ class GL_EXPORT GLDisplay {
virtual ~GLDisplay();
virtual void* GetDisplay() = 0;
+ virtual void Shutdown() = 0;
+ virtual bool IsInitialized() = 0;
+
+ template <typename GLDisplayPlatform>
+ GLDisplayPlatform* GetAs();
protected:
- explicit GLDisplay(uint64_t system_device_id);
+ GLDisplay(uint64_t system_device_id, DisplayPlatform type);
uint64_t system_device_id_ = 0;
+ DisplayPlatform type_ = NONE;
};
#if defined(USE_EGL)
@@ -87,79 +119,55 @@ class GL_EXPORT GLDisplayEGL : public GLDisplay {
~GLDisplayEGL() override;
- EGLDisplay GetDisplay() override;
- void SetDisplay(EGLDisplay display);
+ static GLDisplayEGL* GetDisplayForCurrentContext();
- EGLDisplay GetHardwareDisplay();
+ EGLDisplay GetDisplay() override;
+ void Shutdown() override;
+ bool IsInitialized() override;
- EGLNativeDisplayType GetNativeDisplay();
- DisplayType GetDisplayType();
+ void SetDisplay(EGLDisplay display);
+ EGLDisplayPlatform GetNativeDisplay() const;
+ DisplayType GetDisplayType() const;
- bool HasEGLClientExtension(const char* name);
- bool HasEGLExtension(const char* name);
- bool IsCreateContextRobustnessSupported();
- bool IsRobustnessVideoMemoryPurgeSupported();
- bool IsCreateContextBindGeneratesResourceSupported();
- bool IsCreateContextWebGLCompatabilitySupported();
bool IsEGLSurfacelessContextSupported();
bool IsEGLContextPrioritySupported();
- bool IsEGLNoConfigContextSupported();
- bool IsRobustResourceInitSupported();
- bool IsDisplayTextureShareGroupSupported();
- bool IsDisplaySemaphoreShareGroupSupported();
- bool IsCreateContextClientArraysSupported();
bool IsAndroidNativeFenceSyncSupported();
- bool IsPixelFormatFloatSupported();
- bool IsANGLEFeatureControlSupported();
- bool IsANGLEPowerPreferenceSupported();
- bool IsANGLEDisplayPowerPreferenceSupported();
- bool IsANGLEPlatformANGLEDeviceIdSupported();
bool IsANGLEExternalContextAndSurfaceSupported();
- bool IsANGLEContextVirtualizationSupported();
- bool IsANGLEVulkanImageSupported();
- bool IsEGLQueryDeviceSupported();
-
- EGLDisplayPlatform native_display = EGLDisplayPlatform(EGL_DEFAULT_DISPLAY);
-
- DisplayType display_type = DisplayType::DEFAULT;
-
- const char* egl_client_extensions = nullptr;
- const char* egl_extensions = nullptr;
- bool egl_create_context_robustness_supported = false;
- bool egl_robustness_video_memory_purge_supported = false;
- bool egl_create_context_bind_generates_resource_supported = false;
- bool egl_create_context_webgl_compatability_supported = false;
- bool egl_sync_control_supported = false;
- bool egl_sync_control_rate_supported = false;
- bool egl_window_fixed_size_supported = false;
- bool egl_surfaceless_context_supported = false;
- bool egl_surface_orientation_supported = false;
- bool egl_context_priority_supported = false;
- bool egl_khr_colorspace = false;
- bool egl_ext_colorspace_display_p3 = false;
- bool egl_ext_colorspace_display_p3_passthrough = false;
- bool egl_no_config_context_supported = false;
- bool egl_robust_resource_init_supported = false;
- bool egl_display_texture_share_group_supported = false;
- bool egl_display_semaphore_share_group_supported = false;
- bool egl_create_context_client_arrays_supported = false;
- bool egl_android_native_fence_sync_supported = false;
- bool egl_ext_pixel_format_float_supported = false;
- bool egl_angle_feature_control_supported = false;
- bool egl_angle_power_preference_supported = false;
- bool egl_angle_display_power_preference_supported = false;
- bool egl_angle_platform_angle_device_id_supported = false;
- bool egl_angle_external_context_and_surface_supported = false;
- bool egl_ext_query_device_supported = false;
- bool egl_angle_context_virtualization_supported = false;
- bool egl_angle_vulkan_image_supported = false;
+
+ bool Initialize(EGLDisplayPlatform native_display);
+ void InitializeForTesting();
+ bool InitializeExtensionSettings();
+
+ std::unique_ptr<DisplayExtensionsEGL> ext;
private:
friend class GLDisplayManager<GLDisplayEGL>;
+ friend class EGLApiTest;
+
+ class EGLGpuSwitchingObserver final : public ui::GpuSwitchingObserver {
+ public:
+ explicit EGLGpuSwitchingObserver(EGLDisplay display);
+ ~EGLGpuSwitchingObserver() override = default;
+ void OnGpuSwitched(GpuPreference active_gpu_heuristic) override;
+
+ private:
+ EGLDisplay display_ = EGL_NO_DISPLAY;
+ };
explicit GLDisplayEGL(uint64_t system_device_id);
- EGLDisplay display_;
+ bool InitializeDisplay(EGLDisplayPlatform native_display);
+ void InitializeCommon();
+
+ EGLDisplay display_ = EGL_NO_DISPLAY;
+ EGLDisplayPlatform native_display_ = EGLDisplayPlatform(EGL_DEFAULT_DISPLAY);
+ DisplayType display_type_ = DisplayType::DEFAULT;
+
+ bool egl_surfaceless_context_supported_ = false;
+ bool egl_context_priority_supported_ = false;
+ bool egl_android_native_fence_sync_supported_ = false;
+
+ std::unique_ptr<EGLGpuSwitchingObserver> gpu_switching_observer_;
};
#endif // defined(USE_EGL)
@@ -172,6 +180,8 @@ class GL_EXPORT GLDisplayX11 : public GLDisplay {
~GLDisplayX11() override;
void* GetDisplay() override;
+ void Shutdown() override;
+ bool IsInitialized() override;
private:
friend class GLDisplayManager<GLDisplayX11>;
diff --git a/chromium/ui/gl/gl_display_manager.cc b/chromium/ui/gl/gl_display_manager.cc
index ed233f45ac0..c1cb2a0a3eb 100644
--- a/chromium/ui/gl/gl_display_manager.cc
+++ b/chromium/ui/gl/gl_display_manager.cc
@@ -6,10 +6,10 @@
namespace gl {
#if defined(USE_EGL)
-template class GLDisplayManager<GLDisplayEGL>;
+template class EXPORT_TEMPLATE_DEFINE(GL_EXPORT) GLDisplayManager<GLDisplayEGL>;
#endif
#if defined(USE_GLX)
-template class GLDisplayManager<GLDisplayX11>;
+template class EXPORT_TEMPLATE_DEFINE(GL_EXPORT) GLDisplayManager<GLDisplayX11>;
#endif
} // namespace gl
diff --git a/chromium/ui/gl/gl_display_manager.h b/chromium/ui/gl/gl_display_manager.h
index 3225c7d2795..54a908f3f4d 100644
--- a/chromium/ui/gl/gl_display_manager.h
+++ b/chromium/ui/gl/gl_display_manager.h
@@ -10,6 +10,7 @@
#include <vector>
#include "base/check.h"
+#include "base/export_template.h"
#include "base/no_destructor.h"
#include "base/synchronization/lock.h"
#include "base/thread_annotations.h"
@@ -20,7 +21,7 @@
namespace gl {
template <typename GLDisplayPlatform>
-class GL_EXPORT GLDisplayManager {
+class GLDisplayManager {
public:
// Getter for the singleton. This will return nullptr on failure.
// This should only be called inside the ui/gl module. In component build,
@@ -72,8 +73,9 @@ class GL_EXPORT GLDisplayManager {
return GetDisplay(system_device_id);
}
- GLDisplayPlatform* GetDefaultDisplay() {
- return GetDisplay(GpuPreference::kDefault);
+ bool IsEmpty() {
+ base::AutoLock auto_lock(lock_);
+ return displays_.empty();
}
private:
@@ -95,10 +97,16 @@ class GL_EXPORT GLDisplayManager {
#if defined(USE_EGL)
using GLDisplayManagerEGL = GLDisplayManager<GLDisplayEGL>;
+
+extern template class EXPORT_TEMPLATE_DECLARE(GL_EXPORT)
+ GLDisplayManager<GLDisplayEGL>;
#endif
#if defined(USE_GLX)
using GLDisplayManagerX11 = GLDisplayManager<GLDisplayX11>;
+
+extern template class EXPORT_TEMPLATE_DECLARE(GL_EXPORT)
+ GLDisplayManager<GLDisplayX11>;
#endif
} // namespace gl
diff --git a/chromium/ui/gl/gl_egl_api_implementation.cc b/chromium/ui/gl/gl_egl_api_implementation.cc
index 0261916cd83..d384bbd300f 100644
--- a/chromium/ui/gl/gl_egl_api_implementation.cc
+++ b/chromium/ui/gl/gl_egl_api_implementation.cc
@@ -24,6 +24,7 @@ void InitializeStaticGLBindingsEGL() {
}
g_current_egl_context = g_egl_wrapper->api();
+ g_driver_egl.client_ext.InitializeClientExtensionSettings();
}
void ClearBindingsEGL() {
@@ -135,7 +136,7 @@ void SetDisabledExtensionsEGL(const std::string& disabled_extensions) {
}
bool InitializeExtensionSettingsOneOffEGL(GLDisplayEGL* display) {
- return GLSurfaceEGL::InitializeExtensionSettingsOneOff(display);
+ return display->InitializeExtensionSettings();
}
} // namespace gl
diff --git a/chromium/ui/gl/gl_enums_implementation_autogen.h b/chromium/ui/gl/gl_enums_implementation_autogen.h
index 02e8d9a2fe0..eff22cc620c 100644
--- a/chromium/ui/gl/gl_enums_implementation_autogen.h
+++ b/chromium/ui/gl/gl_enums_implementation_autogen.h
@@ -965,10 +965,6 @@ static const GLEnums::EnumToString enum_to_string_table[] = {
"GL_MULTISAMPLE_BUFFER_BIT6_QCOM",
},
{
- 0x6000,
- "GL_SCANOUT_CHROMIUM",
- },
- {
0x6003,
"GL_GET_ERROR_QUERY_CHROMIUM",
},
diff --git a/chromium/ui/gl/gl_fence.cc b/chromium/ui/gl/gl_fence.cc
index e4dc6595f86..8bcc77fcfad 100644
--- a/chromium/ui/gl/gl_fence.cc
+++ b/chromium/ui/gl/gl_fence.cc
@@ -8,6 +8,7 @@
#include "build/build_config.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_display.h"
#include "ui/gl/gl_fence_arb.h"
#include "ui/gl/gl_fence_egl.h"
#include "ui/gl/gl_fence_nv.h"
@@ -18,9 +19,13 @@
#include "ui/gl/gl_fence_apple.h"
#endif
-#if defined(USE_EGL) && BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_APPLE)
+#if defined(USE_EGL)
+#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_APPLE)
#define USE_GL_FENCE_ANDROID_NATIVE_FENCE_SYNC
#include "ui/gl/gl_fence_android_native_fence_sync.h"
+#endif
+
+#include "ui/gl/gl_context_egl.h"
#include "ui/gl/gl_surface_egl.h"
#endif
@@ -38,13 +43,17 @@ GLFence::~GLFence() {
bool GLFence::IsSupported() {
DCHECK(g_current_gl_version && g_current_gl_driver);
+#if !BUILDFLAG(IS_APPLE) && defined(USE_EGL)
+ GLDisplayEGL* display = GLDisplayEGL::GetDisplayForCurrentContext();
+#endif // !ISAPPLE && USE_EGL
+
return g_current_gl_driver->ext.b_GL_ARB_sync ||
g_current_gl_version->is_es3 ||
g_current_gl_version->is_desktop_core_profile ||
#if BUILDFLAG(IS_APPLE)
g_current_gl_driver->ext.b_GL_APPLE_fence ||
-#else
- g_driver_egl.ext.b_EGL_KHR_fence_sync ||
+#elif defined(USE_EGL)
+ (display && display->ext->b_EGL_KHR_fence_sync) ||
#endif
g_current_gl_driver->ext.b_GL_NV_fence;
}
@@ -54,29 +63,36 @@ std::unique_ptr<GLFence> GLFence::Create() {
<< "Trying to create fence with no context";
std::unique_ptr<GLFence> fence;
-#if !BUILDFLAG(IS_APPLE)
- if (g_driver_egl.ext.b_EGL_KHR_fence_sync &&
- g_driver_egl.ext.b_EGL_KHR_wait_sync) {
+
+#if !BUILDFLAG(IS_APPLE) && defined(USE_EGL)
+ GLDisplayEGL* display = GLDisplayEGL::GetDisplayForCurrentContext();
+ if (display && display->ext->b_EGL_KHR_fence_sync &&
+ display->ext->b_EGL_KHR_wait_sync) {
// Prefer GLFenceEGL which doesn't require GL context switching.
fence = GLFenceEGL::Create();
DCHECK(fence);
- } else
-#endif
- if (g_current_gl_driver->ext.b_GL_ARB_sync ||
- g_current_gl_version->is_es3 ||
- g_current_gl_version->is_desktop_core_profile) {
+ DCHECK(GLFence::IsSupported());
+ return fence;
+ }
+#endif // !IS_APPLE && USE_EGL
+
+ if (g_current_gl_driver->ext.b_GL_ARB_sync || g_current_gl_version->is_es3 ||
+ g_current_gl_version->is_desktop_core_profile) {
// Prefer ARB_sync which supports server-side wait.
fence = std::make_unique<GLFenceARB>();
+ DCHECK(fence);
#if BUILDFLAG(IS_APPLE)
} else if (g_current_gl_driver->ext.b_GL_APPLE_fence) {
fence = std::make_unique<GLFenceAPPLE>();
-#else
- } else if (g_driver_egl.ext.b_EGL_KHR_fence_sync) {
+ DCHECK(fence);
+#elif defined(USE_EGL)
+ } else if (display && display->ext->b_EGL_KHR_fence_sync) {
fence = GLFenceEGL::Create();
DCHECK(fence);
#endif
} else if (g_current_gl_driver->ext.b_GL_NV_fence) {
fence = std::make_unique<GLFenceNV>();
+ DCHECK(fence);
}
DCHECK_EQ(!!fence.get(), GLFence::IsSupported());
diff --git a/chromium/ui/gl/gl_fence_egl.cc b/chromium/ui/gl/gl_fence_egl.cc
index ca41f9d831b..277bda51957 100644
--- a/chromium/ui/gl/gl_fence_egl.cc
+++ b/chromium/ui/gl/gl_fence_egl.cc
@@ -7,6 +7,7 @@
#include "base/memory/ptr_util.h"
#include "ui/gl/egl_util.h"
#include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_surface_egl.h"
namespace gl {
@@ -79,7 +80,8 @@ EGLint GLFenceEGL::ClientWaitWithTimeoutNanos(EGLTimeKHR timeout) {
}
void GLFenceEGL::ServerWait() {
- if (!g_driver_egl.ext.b_EGL_KHR_wait_sync) {
+ GLDisplayEGL* display = GLSurfaceEGL::GetGLDisplayEGL();
+ if (!display->ext->b_EGL_KHR_wait_sync) {
ClientWait();
return;
}
diff --git a/chromium/ui/gl/gl_gl_api_implementation.cc b/chromium/ui/gl/gl_gl_api_implementation.cc
index 5e968167c72..8a21953c4c4 100644
--- a/chromium/ui/gl/gl_gl_api_implementation.cc
+++ b/chromium/ui/gl/gl_gl_api_implementation.cc
@@ -6,6 +6,7 @@
#include <vector>
+#include "base/command_line.h"
#include "base/containers/contains.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
@@ -241,26 +242,23 @@ void SetCurrentGL(CurrentGL* current) {
g_current_gl_context_tls->Set(new_current);
}
-GLApi::GLApi() {
-}
+GLApi::GLApi() = default;
-GLApi::~GLApi() {
-}
+GLApi::~GLApi() = default;
GLApiBase::GLApiBase() : driver_(nullptr) {}
-GLApiBase::~GLApiBase() {
-}
+GLApiBase::~GLApiBase() = default;
void GLApiBase::InitializeBase(DriverGL* driver) {
driver_ = driver;
}
-RealGLApi::RealGLApi() {
-}
+RealGLApi::RealGLApi()
+ : logging_enabled_(base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnableGPUServiceLogging)) {}
-RealGLApi::~RealGLApi() {
-}
+RealGLApi::~RealGLApi() = default;
void RealGLApi::Initialize(DriverGL* driver) {
InitializeBase(driver);
@@ -426,8 +424,11 @@ void RealGLApi::glReadPixelsFn(GLint x,
}
void RealGLApi::glClearFn(GLbitfield mask) {
- if (!g_null_draw_bindings_enabled)
+ if (!g_null_draw_bindings_enabled) {
GLApiBase::glClearFn(mask);
+ } else if (logging_enabled_) {
+ LOG(WARNING) << "Skipped glClear()";
+ }
}
void RealGLApi::glClearColorFn(GLclampf red,
@@ -446,16 +447,22 @@ void RealGLApi::glClearColorFn(GLclampf red,
}
void RealGLApi::glDrawArraysFn(GLenum mode, GLint first, GLsizei count) {
- if (!g_null_draw_bindings_enabled)
+ if (!g_null_draw_bindings_enabled) {
GLApiBase::glDrawArraysFn(mode, first, count);
+ } else if (logging_enabled_) {
+ LOG(WARNING) << "Skipped glDrawArrays()";
+ }
}
void RealGLApi::glDrawElementsFn(GLenum mode,
GLsizei count,
GLenum type,
const void* indices) {
- if (!g_null_draw_bindings_enabled)
+ if (!g_null_draw_bindings_enabled) {
GLApiBase::glDrawElementsFn(mode, count, type, indices);
+ } else if (logging_enabled_) {
+ LOG(WARNING) << "Skipped glDrawElements()";
+ }
}
void RealGLApi::glClearDepthFn(GLclampd depth) {
@@ -561,17 +568,14 @@ void RealGLApi::set_version(std::unique_ptr<GLVersionInfo> version) {
version_ = std::move(version);
}
-TraceGLApi::~TraceGLApi() {
-}
+TraceGLApi::~TraceGLApi() = default;
LogGLApi::LogGLApi(GLApi* gl_api) : gl_api_(gl_api) {}
-LogGLApi::~LogGLApi() {}
+LogGLApi::~LogGLApi() = default;
-NoContextGLApi::NoContextGLApi() {
-}
+NoContextGLApi::NoContextGLApi() = default;
-NoContextGLApi::~NoContextGLApi() {
-}
+NoContextGLApi::~NoContextGLApi() = default;
} // namespace gl
diff --git a/chromium/ui/gl/gl_gl_api_implementation.h b/chromium/ui/gl/gl_gl_api_implementation.h
index 8c89e563bbf..3c063bdaca1 100644
--- a/chromium/ui/gl/gl_gl_api_implementation.h
+++ b/chromium/ui/gl/gl_gl_api_implementation.h
@@ -149,6 +149,7 @@ class GL_EXPORT RealGLApi : public GLApiBase {
// Compute |filtered_exts_| & |filtered_exts_str_| from |disabled_ext_|.
void InitializeFilteredExtensionsIfNeeded();
+ const bool logging_enabled_;
std::vector<std::string> disabled_exts_;
// Filtered GL_EXTENSIONS we return to glGetString(i) calls.
std::vector<std::string> filtered_exts_;
diff --git a/chromium/ui/gl/gl_glx_api_implementation.h b/chromium/ui/gl/gl_glx_api_implementation.h
index 97a21ee6a95..14fe8025d70 100644
--- a/chromium/ui/gl/gl_glx_api_implementation.h
+++ b/chromium/ui/gl/gl_glx_api_implementation.h
@@ -8,6 +8,7 @@
#include <string>
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "gl_bindings.h"
#include "ui/gl/gl_export.h"
@@ -35,7 +36,7 @@ class GL_EXPORT GLXApiBase : public GLXApi {
~GLXApiBase() override;
void InitializeBase(DriverGLX* driver);
- DriverGLX* driver_;
+ raw_ptr<DriverGLX> driver_;
};
class GL_EXPORT RealGLXApi : public GLXApiBase {
@@ -66,7 +67,7 @@ class GL_EXPORT LogGLXApi : public GLXApi {
#include "gl_bindings_api_autogen_glx.h"
private:
- GLXApi* glx_api_;
+ raw_ptr<GLXApi> glx_api_;
};
// Inserts a TRACE for every GLX call.
@@ -83,7 +84,7 @@ class GL_EXPORT TraceGLXApi : public GLXApi {
#include "gl_bindings_api_autogen_glx.h"
private:
- GLXApi* glx_api_;
+ raw_ptr<GLXApi> glx_api_;
};
} // namespace gl
diff --git a/chromium/ui/gl/gl_image.h b/chromium/ui/gl/gl_image.h
index 1b9e72d96cd..18c6c121b08 100644
--- a/chromium/ui/gl/gl_image.h
+++ b/chromium/ui/gl/gl_image.h
@@ -95,7 +95,11 @@ class GL_EXPORT GLImage : public base::RefCounted<GLImage> {
const gfx::Point& offset,
const gfx::Rect& rect);
- // Set the color space when image is used as an overlay.
+ // Set the color space when image is used as an overlay. The color space may
+ // also be useful for images backed by YUV buffers: if the GL driver can
+ // sample the YUV buffer as RGB, we need to tell it the encoding (BT.601,
+ // BT.709, or BT.2020) and range (limited or null), and |color_space| conveys
+ // this.
virtual void SetColorSpace(const gfx::ColorSpace& color_space);
const gfx::ColorSpace& color_space() const { return color_space_; }
diff --git a/chromium/ui/gl/gl_image_d3d.cc b/chromium/ui/gl/gl_image_d3d.cc
index 00cce3905af..b98cac6771c 100644
--- a/chromium/ui/gl/gl_image_d3d.cc
+++ b/chromium/ui/gl/gl_image_d3d.cc
@@ -39,9 +39,8 @@ GLImageD3D::GLImageD3D(const gfx::Size& size,
GLImageD3D::~GLImageD3D() {
if (egl_image_ != EGL_NO_IMAGE_KHR) {
- if (eglDestroyImageKHR(
- GLSurfaceEGL::GetGLDisplayEGL()->GetHardwareDisplay(),
- egl_image_) == EGL_FALSE) {
+ if (eglDestroyImageKHR(GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay(),
+ egl_image_) == EGL_FALSE) {
DLOG(ERROR) << "Error destroying EGLImage: "
<< ui::GetLastEGLErrorString();
}
@@ -58,7 +57,7 @@ bool GLImageD3D::Initialize() {
static_cast<EGLint>(plane_index_),
EGL_NONE};
egl_image_ =
- eglCreateImageKHR(GLSurfaceEGL::GetGLDisplayEGL()->GetHardwareDisplay(),
+ eglCreateImageKHR(GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay(),
EGL_NO_CONTEXT, EGL_D3D11_TEXTURE_ANGLE,
static_cast<EGLClientBuffer>(texture_.Get()), attribs);
if (egl_image_ == EGL_NO_IMAGE_KHR) {
diff --git a/chromium/ui/gl/gl_image_dxgi.cc b/chromium/ui/gl/gl_image_dxgi.cc
index 15c1166be99..6eb0822ce9a 100644
--- a/chromium/ui/gl/gl_image_dxgi.cc
+++ b/chromium/ui/gl/gl_image_dxgi.cc
@@ -64,16 +64,14 @@ EGLConfig ChooseCompatibleConfig(gfx::BufferFormat format) {
EGL_NONE};
EGLint num_config;
- EGLDisplay display =
- gl::GLSurfaceEGL::GetGLDisplayEGL()->GetHardwareDisplay();
+ EGLDisplay display = gl::GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay();
EGLBoolean result =
eglChooseConfig(display, attrib_list, nullptr, 0, &num_config);
if (result != EGL_TRUE)
return nullptr;
std::vector<EGLConfig> all_configs(num_config);
- result =
- eglChooseConfig(gl::GLSurfaceEGL::GetGLDisplayEGL()->GetHardwareDisplay(),
- attrib_list, all_configs.data(), num_config, &num_config);
+ result = eglChooseConfig(display, attrib_list, all_configs.data(), num_config,
+ &num_config);
if (result != EGL_TRUE)
return nullptr;
for (EGLConfig config : all_configs) {
@@ -127,8 +125,8 @@ EGLSurface CreatePbuffer(const Microsoft::WRL::ComPtr<ID3D11Texture2D>& texture,
EGL_NONE};
return eglCreatePbufferFromClientBuffer(
- gl::GLSurfaceEGL::GetGLDisplayEGL()->GetHardwareDisplay(),
- EGL_D3D_TEXTURE_ANGLE, texture.Get(), config, pBufferAttributes);
+ gl::GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay(), EGL_D3D_TEXTURE_ANGLE,
+ texture.Get(), config, pBufferAttributes);
}
} // namespace
@@ -174,9 +172,8 @@ bool GLImageDXGI::BindTexImage(unsigned target) {
return false;
}
- return eglBindTexImage(
- gl::GLSurfaceEGL::GetGLDisplayEGL()->GetHardwareDisplay(),
- surface_, EGL_BACK_BUFFER) == EGL_TRUE;
+ return eglBindTexImage(gl::GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay(),
+ surface_, EGL_BACK_BUFFER) == EGL_TRUE;
}
bool GLImageDXGI::CopyTexImage(unsigned target) {
@@ -224,7 +221,7 @@ void GLImageDXGI::ReleaseTexImage(unsigned target) {
keyed_mutex_->ReleaseSync(KEY_RELEASE);
- eglReleaseTexImage(gl::GLSurfaceEGL::GetGLDisplayEGL()->GetHardwareDisplay(),
+ eglReleaseTexImage(gl::GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay(),
surface_, EGL_BACK_BUFFER);
}
@@ -267,13 +264,12 @@ void GLImageDXGI::SetTexture(
GLImageDXGI::~GLImageDXGI() {
if (handle_.Get()) {
if (surface_ != EGL_NO_SURFACE) {
- eglDestroySurface(
- gl::GLSurfaceEGL::GetGLDisplayEGL()->GetHardwareDisplay(), surface_);
+ eglDestroySurface(gl::GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay(),
+ surface_);
}
} else if (stream_) {
- EGLDisplay egl_display =
- gl::GLSurfaceEGL::GetGLDisplayEGL()->GetHardwareDisplay();
- eglDestroyStreamKHR(egl_display, stream_);
+ eglDestroyStreamKHR(gl::GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay(),
+ stream_);
}
}
@@ -303,8 +299,7 @@ bool CopyingGLImageDXGI::Initialize() {
DLOG(ERROR) << "CreateTexture2D failed: " << std::hex << hr;
return false;
}
- EGLDisplay egl_display =
- gl::GLSurfaceEGL::GetGLDisplayEGL()->GetHardwareDisplay();
+ EGLDisplay egl_display = gl::GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay();
EGLAttrib frame_attributes[] = {
EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE, 0, EGL_NONE,
diff --git a/chromium/ui/gl/gl_image_egl.cc b/chromium/ui/gl/gl_image_egl.cc
index 2baaa0c1b5d..791b031a4b2 100644
--- a/chromium/ui/gl/gl_image_egl.cc
+++ b/chromium/ui/gl/gl_image_egl.cc
@@ -20,7 +20,7 @@ GLImageEGL::~GLImageEGL() {
return;
const EGLBoolean result = eglDestroyImageKHR(
- GLSurfaceEGL::GetGLDisplayEGL()->GetHardwareDisplay(), egl_image_);
+ GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay(), egl_image_);
if (result == EGL_FALSE)
DLOG(ERROR) << "Error destroying EGLImage: " << ui::GetLastEGLErrorString();
}
@@ -31,9 +31,8 @@ bool GLImageEGL::Initialize(EGLContext context,
const EGLint* attrs) {
DCHECK(thread_checker_.CalledOnValidThread());
DCHECK_EQ(EGL_NO_IMAGE_KHR, egl_image_);
- egl_image_ =
- eglCreateImageKHR(GLSurfaceEGL::GetGLDisplayEGL()->GetHardwareDisplay(),
- context, target, buffer, attrs);
+ egl_image_ = eglCreateImageKHR(GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay(),
+ context, target, buffer, attrs);
const bool success = egl_image_ != EGL_NO_IMAGE_KHR;
if (!success)
LOG(ERROR) << "Error creating EGLImage: " << ui::GetLastEGLErrorString();
diff --git a/chromium/ui/gl/gl_image_glx_native_pixmap.cc b/chromium/ui/gl/gl_image_glx_native_pixmap.cc
index 54f86ede486..faccfef6cee 100644
--- a/chromium/ui/gl/gl_image_glx_native_pixmap.cc
+++ b/chromium/ui/gl/gl_image_glx_native_pixmap.cc
@@ -4,80 +4,16 @@
#include "ui/gl/gl_image_glx_native_pixmap.h"
-#include <unistd.h>
-
-#include "base/posix/eintr_wrapper.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gfx/linux/native_pixmap_dmabuf.h"
#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/dri3.h"
-#include "ui/gfx/x/future.h"
#include "ui/gfx/x/glx.h"
-#include "ui/gfx/x/xproto_types.h"
#include "ui/gl/buffer_format_utils.h"
-#include "ui/gl/gl_bindings.h"
+#include "ui/gl/glx_util.h"
namespace gl {
-namespace {
-
-int Depth(gfx::BufferFormat format) {
- switch (format) {
- case gfx::BufferFormat::BGR_565:
- return 16;
- case gfx::BufferFormat::BGRX_8888:
- return 24;
- case gfx::BufferFormat::BGRA_1010102:
- // It's unclear why this is 32 instead of 30.
- return 32;
- case gfx::BufferFormat::BGRA_8888:
- return 32;
- default:
- NOTREACHED();
- return 0;
- }
-}
-
-int Bpp(gfx::BufferFormat format) {
- switch (format) {
- case gfx::BufferFormat::BGR_565:
- return 16;
- case gfx::BufferFormat::BGRX_8888:
- case gfx::BufferFormat::BGRA_1010102:
- case gfx::BufferFormat::BGRA_8888:
- return 32;
- default:
- NOTREACHED();
- return 0;
- }
-}
-
-x11::Pixmap XPixmapFromNativePixmap(
- const gfx::NativePixmapDmaBuf& native_pixmap,
- int depth,
- int bpp) {
- auto fd = HANDLE_EINTR(dup(native_pixmap.GetDmaBufFd(0)));
- if (fd < 0)
- return x11::Pixmap::None;
- x11::RefCountedFD ref_counted_fd(fd);
-
- auto* connection = x11::Connection::Get();
- x11::Pixmap pixmap_id = connection->GenerateId<x11::Pixmap>();
- // This should be synced. Otherwise, glXCreatePixmap may fail on ChromeOS
- // with "failed to create a drawable" error.
- connection->dri3()
- .PixmapFromBuffer(pixmap_id, connection->default_root(),
- native_pixmap.GetDmaBufPlaneSize(0),
- native_pixmap.GetBufferSize().width(),
- native_pixmap.GetBufferSize().height(),
- native_pixmap.GetDmaBufPitch(0), depth, bpp,
- ref_counted_fd)
- .Sync();
- return pixmap_id;
-}
-
-} // namespace
-
GLImageGLXNativePixmap::GLImageGLXNativePixmap(const gfx::Size& size,
gfx::BufferFormat format,
gfx::BufferPlane plane)
@@ -92,8 +28,7 @@ bool GLImageGLXNativePixmap::Initialize(
native_pixmap_ = pixmap;
return GLImageGLX::Initialize(XPixmapFromNativePixmap(
- *static_cast<gfx::NativePixmapDmaBuf*>(native_pixmap_.get()),
- Depth(format()), Bpp(format())));
+ *static_cast<gfx::NativePixmapDmaBuf*>(native_pixmap_.get()), format()));
}
bool GLImageGLXNativePixmap::CanImportNativePixmap() {
diff --git a/chromium/ui/gl/gl_image_io_surface.mm b/chromium/ui/gl/gl_image_io_surface.mm
index aff5e328002..180a2bbe1e2 100644
--- a/chromium/ui/gl/gl_image_io_surface.mm
+++ b/chromium/ui/gl/gl_image_io_surface.mm
@@ -71,6 +71,7 @@ GLenum TextureFormat(gfx::BufferFormat format) {
case gfx::BufferFormat::BGRA_8888:
case gfx::BufferFormat::BGRX_8888: // See https://crbug.com/595948.
case gfx::BufferFormat::RGBA_8888:
+ case gfx::BufferFormat::RGBX_8888:
case gfx::BufferFormat::RGBA_F16:
case gfx::BufferFormat::BGRA_1010102:
return GL_RGBA;
@@ -80,7 +81,6 @@ GLenum TextureFormat(gfx::BufferFormat format) {
return GL_RGB_YCBCR_P010_CHROMIUM;
case gfx::BufferFormat::BGR_565:
case gfx::BufferFormat::RGBA_4444:
- case gfx::BufferFormat::RGBX_8888:
case gfx::BufferFormat::RGBA_1010102:
case gfx::BufferFormat::YVU_420:
NOTREACHED() << gfx::BufferFormatToString(format);
@@ -431,6 +431,8 @@ void GLImageIOSurface::OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd,
base::trace_event::MemoryAllocatorDump::kNameSize,
base::trace_event::MemoryAllocatorDump::kUnitsBytes,
static_cast<uint64_t>(size_bytes));
+ anonymous_dump->AddScalar("width", "pixels", size_.width());
+ anonymous_dump->AddScalar("height", "pixels", size_.height());
}
}
@@ -520,6 +522,7 @@ bool GLImageIOSurface::ValidFormat(gfx::BufferFormat format) {
case gfx::BufferFormat::BGRA_8888:
case gfx::BufferFormat::BGRX_8888:
case gfx::BufferFormat::RGBA_8888:
+ case gfx::BufferFormat::RGBX_8888:
case gfx::BufferFormat::RGBA_F16:
case gfx::BufferFormat::BGRA_1010102:
case gfx::BufferFormat::YUV_420_BIPLANAR:
@@ -527,7 +530,6 @@ bool GLImageIOSurface::ValidFormat(gfx::BufferFormat format) {
return true;
case gfx::BufferFormat::BGR_565:
case gfx::BufferFormat::RGBA_4444:
- case gfx::BufferFormat::RGBX_8888:
case gfx::BufferFormat::RGBA_1010102:
case gfx::BufferFormat::YVU_420:
return false;
diff --git a/chromium/ui/gl/gl_image_io_surface_egl.mm b/chromium/ui/gl/gl_image_io_surface_egl.mm
index c03ad34ad53..411d6862f72 100644
--- a/chromium/ui/gl/gl_image_io_surface_egl.mm
+++ b/chromium/ui/gl/gl_image_io_surface_egl.mm
@@ -45,6 +45,7 @@ InternalFormatType BufferFormatToInternalFormatType(gfx::BufferFormat format) {
case gfx::BufferFormat::RG_1616:
return {GL_RG, GL_UNSIGNED_SHORT};
case gfx::BufferFormat::BGRX_8888:
+ case gfx::BufferFormat::RGBX_8888:
return {GL_RGB, GL_UNSIGNED_BYTE};
case gfx::BufferFormat::BGRA_8888:
case gfx::BufferFormat::RGBA_8888:
@@ -55,7 +56,6 @@ InternalFormatType BufferFormatToInternalFormatType(gfx::BufferFormat format) {
return {GL_RGB10_A2, GL_UNSIGNED_INT_2_10_10_10_REV};
case gfx::BufferFormat::BGR_565:
case gfx::BufferFormat::RGBA_4444:
- case gfx::BufferFormat::RGBX_8888:
case gfx::BufferFormat::RGBA_1010102:
case gfx::BufferFormat::YVU_420:
case gfx::BufferFormat::YUV_420_BIPLANAR:
@@ -113,7 +113,7 @@ GLenum TargetGetterFromGLTarget(GLint gl_target) {
GLImageIOSurfaceEGL::GLImageIOSurfaceEGL(const gfx::Size& size,
unsigned internalformat)
: GLImageIOSurface(size, internalformat),
- display_(GLSurfaceEGL::GetGLDisplayEGL()->GetHardwareDisplay()),
+ display_(GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay()),
pbuffer_(EGL_NO_SURFACE),
dummy_config_(nullptr),
texture_target_(EGL_TEXTURE_RECTANGLE_ANGLE),
@@ -126,7 +126,7 @@ GLImageIOSurfaceEGL::GLImageIOSurfaceEGL(const gfx::Size& size,
EGLBoolean result =
eglChooseConfig(display_, nullptr, &dummy_config_, 1, &numConfigs);
DCHECK(result == EGL_TRUE);
- DCHECK(numConfigs = 1);
+ DCHECK_EQ(numConfigs, 1);
DCHECK(dummy_config_ != nullptr);
const char* extensions = eglQueryString(display_, EGL_EXTENSIONS);
if (GLSurface::ExtensionsContain(extensions,
diff --git a/chromium/ui/gl/gl_image_native_pixmap.cc b/chromium/ui/gl/gl_image_native_pixmap.cc
index effe6136790..c539c8e64c3 100644
--- a/chromium/ui/gl/gl_image_native_pixmap.cc
+++ b/chromium/ui/gl/gl_image_native_pixmap.cc
@@ -131,12 +131,10 @@ GLImageNativePixmap::GLImageNativePixmap(const gfx::Size& size,
: GLImageEGL(size),
format_(format),
plane_(plane),
- has_image_flush_external_(
- gl::GLSurfaceEGL::GetGLDisplayEGL()->HasEGLExtension(
- "EGL_EXT_image_flush_external")),
- has_image_dma_buf_export_(
- gl::GLSurfaceEGL::GetGLDisplayEGL()->HasEGLExtension(
- "EGL_MESA_image_dma_buf_export")) {}
+ has_image_flush_external_(gl::GLSurfaceEGL::GetGLDisplayEGL()
+ ->ext->b_EGL_EXT_image_flush_external),
+ has_image_dma_buf_export_(gl::GLSurfaceEGL::GetGLDisplayEGL()
+ ->ext->b_EGL_MESA_image_dma_buf_export) {}
GLImageNativePixmap::~GLImageNativePixmap() {}
@@ -159,14 +157,38 @@ bool GLImageNativePixmap::Initialize(scoped_refptr<gfx::NativePixmap> pixmap) {
if (format_ == gfx::BufferFormat::YUV_420_BIPLANAR ||
format_ == gfx::BufferFormat::YVU_420) {
- // TODO(b/220336463): setting these attributes to EGL_ITU_REC601_EXT and
- // EGL_YUV_NARROW_RANGE_EXT always is not necessarily correct. We need to
- // plumb enough information so that we can determine the right values for
- // these attributes.
+ // TODO(b/233667677): since https://crrev.com/c/3662252, the only NV12
+ // quads that we allow to be promoted to overlays are those that use the
+ // BT.709 primaries (approximately the same as the BT.601 primaries) with
+ // limited range. Furthermore, since https://crrev.com/c/2336347, we force
+ // the DRM/KMS driver to use BT.601 with limited range. Therefore, for
+ // compositing purposes, we need to a) use EGL_ITU_REC601_EXT for any
+ // video frames that might be promoted to overlays - we shouldn't use
+ // EGL_ITU_REC709_EXT because we might then see a slight difference in
+ // compositing vs. overlays (note that the BT.601 and BT.709 primaries are
+ // very close to each other, so this shouldn't be a huge correctness
+ // issue); b) use EGL_ITU_REC2020_EXT for BT.2020 frames in order to
+ // composite them correctly (and we won't need to worry about a difference
+ // in compositing vs. overlays in this case since those frames won't be
+ // promoted to overlays). We'll need to revisit this once we plumb the
+ // color space and range to DRM/KMS.
attrs.push_back(EGL_YUV_COLOR_SPACE_HINT_EXT);
- attrs.push_back(EGL_ITU_REC601_EXT);
+ switch (color_space_.GetPrimaryID()) {
+ case gfx::ColorSpace::PrimaryID::BT2020:
+ attrs.push_back(EGL_ITU_REC2020_EXT);
+ break;
+ default:
+ attrs.push_back(EGL_ITU_REC601_EXT);
+ }
+
attrs.push_back(EGL_SAMPLE_RANGE_HINT_EXT);
- attrs.push_back(EGL_YUV_NARROW_RANGE_EXT);
+ switch (color_space_.GetRangeID()) {
+ case gfx::ColorSpace::RangeID::FULL:
+ attrs.push_back(EGL_YUV_FULL_RANGE_EXT);
+ break;
+ default:
+ attrs.push_back(EGL_YUV_NARROW_RANGE_EXT);
+ }
}
if (plane_ == gfx::BufferPlane::DEFAULT) {
@@ -174,8 +196,8 @@ bool GLImageNativePixmap::Initialize(scoped_refptr<gfx::NativePixmap> pixmap) {
EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT,
EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT};
bool has_dma_buf_import_modifier =
- gl::GLSurfaceEGL::GetGLDisplayEGL()->HasEGLExtension(
- "EGL_EXT_image_dma_buf_import_modifiers");
+ gl::GLSurfaceEGL::GetGLDisplayEGL()
+ ->ext->b_EGL_EXT_image_dma_buf_import_modifiers;
for (size_t attrs_plane = 0; attrs_plane < pixmap->GetNumberOfPlanes();
++attrs_plane) {
@@ -271,8 +293,8 @@ gfx::NativePixmapHandle GLImageNativePixmap::ExportHandle() {
EGLuint64KHR modifiers = 0;
if (!eglExportDMABUFImageQueryMESA(
- GLSurfaceEGL::GetGLDisplayEGL()->GetHardwareDisplay(), egl_image_,
- &fourcc, &num_planes, &modifiers)) {
+ GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay(), egl_image_, &fourcc,
+ &num_planes, &modifiers)) {
LOG(ERROR) << "Error querying EGLImage: " << ui::GetLastEGLErrorString();
return gfx::NativePixmapHandle();
}
@@ -308,9 +330,9 @@ gfx::NativePixmapHandle GLImageNativePixmap::ExportHandle() {
// It is specified for eglExportDMABUFImageMESA that the app is responsible
// for closing any fds retrieved.
- if (!eglExportDMABUFImageMESA(
- GLSurfaceEGL::GetGLDisplayEGL()->GetHardwareDisplay(), egl_image_,
- &fds[0], &strides[0], &offsets[0])) {
+ if (!eglExportDMABUFImageMESA(GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay(),
+ egl_image_, &fds[0], &strides[0],
+ &offsets[0])) {
LOG(ERROR) << "Error exporting EGLImage: " << ui::GetLastEGLErrorString();
return gfx::NativePixmapHandle();
}
@@ -370,8 +392,7 @@ void GLImageNativePixmap::Flush() {
if (!has_image_flush_external_)
return;
- EGLDisplay display =
- gl::GLSurfaceEGL::GetGLDisplayEGL()->GetHardwareDisplay();
+ EGLDisplay display = gl::GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay();
const EGLAttrib attribs[] = {
EGL_NONE,
};
diff --git a/chromium/ui/gl/gl_image_native_pixmap.h b/chromium/ui/gl/gl_image_native_pixmap.h
index 686dbe3c868..34524885079 100644
--- a/chromium/ui/gl/gl_image_native_pixmap.h
+++ b/chromium/ui/gl/gl_image_native_pixmap.h
@@ -37,7 +37,6 @@ class GL_EXPORT GLImageNativePixmap : public gl::GLImageEGL {
bool CopyTexSubImage(unsigned target,
const gfx::Point& offset,
const gfx::Rect& rect) override;
- void SetColorSpace(const gfx::ColorSpace& color_space) override {}
void Flush() override;
void OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd,
uint64_t process_tracing_id,
diff --git a/chromium/ui/gl/gl_image_native_pixmap_unittest.cc b/chromium/ui/gl/gl_image_native_pixmap_unittest.cc
index ebff0dff31a..3ef55f5c9a8 100644
--- a/chromium/ui/gl/gl_image_native_pixmap_unittest.cc
+++ b/chromium/ui/gl/gl_image_native_pixmap_unittest.cc
@@ -44,12 +44,10 @@ class GLImageNativePixmapTestDelegate : public GLImageTestDelegateBase {
}
bool SkipTest(GLDisplay* display) const override {
- const std::string dmabuf_import_ext = "EGL_MESA_image_dma_buf_export";
- std::string platform_extensions(ExtensionsEGL::GetPlatformExtensions(
- static_cast<GLDisplayEGL*>(display)));
- gfx::ExtensionSet extensions(gfx::MakeExtensionSet(platform_extensions));
- if (!gfx::HasExtension(extensions, dmabuf_import_ext)) {
- LOG(WARNING) << "Skip test, missing extension " << dmabuf_import_ext;
+ GLDisplayEGL* display_egl = static_cast<GLDisplayEGL*>(display);
+ if (!display_egl->ext->b_EGL_MESA_image_dma_buf_export) {
+ LOG(WARNING) << "Skip test, missing extension "
+ << "EGL_MESA_image_dma_buf_export";
return true;
}
diff --git a/chromium/ui/gl/gl_implementation.cc b/chromium/ui/gl/gl_implementation.cc
index a3cec15e679..e2c8b8d554a 100644
--- a/chromium/ui/gl/gl_implementation.cc
+++ b/chromium/ui/gl/gl_implementation.cc
@@ -68,9 +68,6 @@ std::string GLImplementationParts::ToString() const {
case GLImplementation::kGLImplementationDesktopGLCoreProfile:
s << "desktop-gl-core-profile";
break;
- case GLImplementation::kGLImplementationAppleGL:
- s << "apple-gl";
- break;
case GLImplementation::kGLImplementationEGLGLES2:
s << "egl-gles2";
break;
@@ -133,10 +130,6 @@ const struct {
} kGLImplementationNamePairs[] = {
{kGLImplementationDesktopName, kANGLEImplementationNoneName,
GLImplementationParts(kGLImplementationDesktopGL)},
-#if BUILDFLAG(IS_APPLE)
- {kGLImplementationAppleName, kANGLEImplementationNoneName,
- GLImplementationParts(kGLImplementationAppleGL)},
-#endif
{kGLImplementationEGLName, kANGLEImplementationNoneName,
GLImplementationParts(kGLImplementationEGLGLES2)},
{kGLImplementationANGLEName, kANGLEImplementationNoneName,
@@ -193,6 +186,12 @@ GLGetProcAddressProc g_get_proc_address;
void CleanupNativeLibraries(void* due_to_fallback) {
if (g_libraries) {
+#if BUILDFLAG(IS_MAC)
+ // Mac `NativeLibrary` is heap-allocated, so always unload to ensure they're
+ // freed.
+ for (auto* library : *g_libraries)
+ base::UnloadNativeLibrary(library);
+#else
// We do not call base::UnloadNativeLibrary() for these libraries as
// unloading libGL without closing X display is not allowed. See
// https://crbug.com/250813 for details.
@@ -207,6 +206,7 @@ void CleanupNativeLibraries(void* due_to_fallback) {
for (auto* library : *g_libraries)
base::UnloadNativeLibrary(library);
}
+#endif // BUILDFLAG(IS_MAC)
delete g_libraries;
g_libraries = nullptr;
}
@@ -365,8 +365,7 @@ ANGLEImplementation GetANGLEImplementation() {
bool HasDesktopGLFeatures() {
return kGLImplementationDesktopGL == g_gl_implementation.gl ||
- kGLImplementationDesktopGLCoreProfile == g_gl_implementation.gl ||
- kGLImplementationAppleGL == g_gl_implementation.gl;
+ kGLImplementationDesktopGLCoreProfile == g_gl_implementation.gl;
}
void AddGLNativeLibrary(base::NativeLibrary library) {
diff --git a/chromium/ui/gl/gl_implementation.h b/chromium/ui/gl/gl_implementation.h
index 497152c1342..fa82bedda19 100644
--- a/chromium/ui/gl/gl_implementation.h
+++ b/chromium/ui/gl/gl_implementation.h
@@ -34,9 +34,9 @@ enum GLImplementation {
kGLImplementationNone = 0,
kGLImplementationDesktopGL = 1,
kGLImplementationDesktopGLCoreProfile = 2,
- // Note: 3 used to be legacy SwiftShader, so 3 is skipped and should not be
- // reused.
- kGLImplementationAppleGL = 4,
+ // Note: 3 and 4 are skipped and should not be reused.
+ // 3 used to be legacy SwiftShader.
+ // 4 used to be Apple's software GL.
kGLImplementationEGLGLES2 = 5, // Native EGL/GLES2
kGLImplementationMockGL = 6,
kGLImplementationStubGL = 7,
diff --git a/chromium/ui/gl/gl_surface.cc b/chromium/ui/gl/gl_surface.cc
index a7bf3f558ca..b4f6d1c6ad0 100644
--- a/chromium/ui/gl/gl_surface.cc
+++ b/chromium/ui/gl/gl_surface.cc
@@ -16,7 +16,6 @@
#include "ui/gfx/swap_result.h"
#include "ui/gl/dc_renderer_layer_params.h"
#include "ui/gl/gl_context.h"
-#include "ui/gl/gl_image.h"
#include "ui/gl/gl_implementation.h"
#include "ui/gl/gl_surface_format.h"
#include "ui/gl/gl_switches.h"
diff --git a/chromium/ui/gl/gl_surface.h b/chromium/ui/gl/gl_surface.h
index 877818d8fa7..ee970d63ad6 100644
--- a/chromium/ui/gl/gl_surface.h
+++ b/chromium/ui/gl/gl_surface.h
@@ -26,7 +26,6 @@
#include "ui/gfx/swap_result.h"
#include "ui/gl/gl_display.h"
#include "ui/gl/gl_export.h"
-#include "ui/gl/gl_image.h"
#include "ui/gl/gl_implementation.h"
#include "ui/gl/gl_surface_format.h"
#include "ui/gl/gpu_preference.h"
@@ -36,6 +35,7 @@ namespace mojom {
class DelegatedInkPointRenderer;
} // namespace mojom
class ColorSpace;
+struct OverlayPlaneData;
class GpuFence;
class VSyncProvider;
} // namespace gfx
@@ -48,6 +48,7 @@ struct DCRendererLayerParams;
namespace gl {
class GLContext;
+class GLImage;
class EGLTimestampClient;
// Encapsulates a surface that can be rendered to with GL, hiding platform
diff --git a/chromium/ui/gl/gl_surface_egl.cc b/chromium/ui/gl/gl_surface_egl.cc
index b14b63d76a7..0ecfa9aaf73 100644
--- a/chromium/ui/gl/gl_surface_egl.cc
+++ b/chromium/ui/gl/gl_surface_egl.cc
@@ -12,35 +12,24 @@
#include <sstream>
#include <vector>
-#include "base/command_line.h"
-#include "base/containers/contains.h"
-#include "base/debug/crash_logging.h"
#include "base/lazy_instance.h"
#include "base/logging.h"
#include "base/memory/raw_ptr.h"
-#include "base/metrics/histogram_macros.h"
#include "base/scoped_environment_variable_override.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
#include "base/system/sys_info.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "ui/events/platform/platform_event_dispatcher.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/gpu_fence.h"
-#include "ui/gl/angle_platform_impl.h"
#include "ui/gl/egl_util.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_context.h"
-#include "ui/gl/gl_context_egl.h"
#include "ui/gl/gl_display_egl_util.h"
#include "ui/gl/gl_display_manager.h"
-#include "ui/gl/gl_image.h"
-#include "ui/gl/gl_implementation.h"
#include "ui/gl/gl_surface_presentation_helper.h"
#include "ui/gl/gl_surface_stub.h"
#include "ui/gl/gl_utils.h"
-#include "ui/gl/gpu_switching_manager.h"
#include "ui/gl/scoped_make_current.h"
#include "ui/gl/sync_control_vsync_provider.h"
@@ -75,73 +64,11 @@
// From ANGLE's egl/eglext.h.
-#ifndef EGL_ANGLE_platform_angle
-#define EGL_ANGLE_platform_angle 1
-#define EGL_PLATFORM_ANGLE_ANGLE 0x3202
-#define EGL_PLATFORM_ANGLE_TYPE_ANGLE 0x3203
-#define EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE 0x3204
-#define EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE 0x3205
-#define EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE 0x3206
-#define EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE 0x3451
-#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE 0x3209
-#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_EGL_ANGLE 0x348E
-#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE 0x320A
-#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE 0x345E
-#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE 0x3487
-#define EGL_PLATFORM_ANGLE_NATIVE_PLATFORM_TYPE_ANGLE 0x348F
-#endif /* EGL_ANGLE_platform_angle */
-
-#ifndef EGL_ANGLE_platform_angle_d3d
-#define EGL_ANGLE_platform_angle_d3d 1
-#define EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE 0x3207
-#define EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE 0x3208
-#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_D3D_WARP_ANGLE 0x320B
-#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_D3D_REFERENCE_ANGLE 0x320C
-#endif /* EGL_ANGLE_platform_angle_d3d */
-
-#ifndef EGL_ANGLE_platform_angle_d3d_luid
-#define EGL_ANGLE_platform_angle_d3d_luid 1
-#define EGL_PLATFORM_ANGLE_D3D_LUID_HIGH_ANGLE 0x34A0
-#define EGL_PLATFORM_ANGLE_D3D_LUID_LOW_ANGLE 0x34A1
-#endif /* EGL_ANGLE_platform_angle_d3d_luid */
-
-#ifndef EGL_ANGLE_platform_angle_d3d11on12
-#define EGL_ANGLE_platform_angle_d3d11on12 1
-#define EGL_PLATFORM_ANGLE_D3D11ON12_ANGLE 0x3488
-#endif /* EGL_ANGLE_platform_angle_d3d11on12 */
-
-#ifndef EGL_ANGLE_platform_angle_opengl
-#define EGL_ANGLE_platform_angle_opengl 1
-#define EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE 0x320D
-#define EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE 0x320E
-#endif /* EGL_ANGLE_platform_angle_opengl */
-
-#ifndef EGL_ANGLE_platform_angle_null
-#define EGL_ANGLE_platform_angle_null 1
-#define EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE 0x33AE
-#endif /* EGL_ANGLE_platform_angle_null */
-
-#ifndef EGL_ANGLE_platform_angle_vulkan
-#define EGL_ANGLE_platform_angle_vulkan 1
-#define EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE 0x3450
-#define EGL_PLATFORM_VULKAN_DISPLAY_MODE_HEADLESS_ANGLE 0x34A5
-#endif /* EGL_ANGLE_platform_angle_vulkan */
-
#ifndef EGL_ANGLE_robust_resource_initialization
#define EGL_ANGLE_robust_resource_initialization 1
#define EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE 0x3453
#endif /* EGL_ANGLE_display_robust_resource_initialization */
-#ifndef EGL_ANGLE_platform_angle_metal
-#define EGL_ANGLE_platform_angle_metal 1
-#define EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE 0x3489
-#endif /* EGL_ANGLE_platform_angle_metal */
-
-#ifndef EGL_ANGLE_x11_visual
-#define EGL_ANGLE_x11_visual 1
-#define EGL_X11_VISUAL_ID_ANGLE 0x33A3
-#endif /* EGL_ANGLE_x11_visual */
-
#ifndef EGL_ANGLE_surface_orientation
#define EGL_ANGLE_surface_orientation
#define EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE 0x33A7
@@ -150,54 +77,12 @@
#define EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE 0x0002
#endif /* EGL_ANGLE_surface_orientation */
-#ifndef EGL_ANGLE_direct_composition
-#define EGL_ANGLE_direct_composition 1
-#define EGL_DIRECT_COMPOSITION_ANGLE 0x33A5
-#endif /* EGL_ANGLE_direct_composition */
-
-#ifndef EGL_ANGLE_display_robust_resource_initialization
-#define EGL_ANGLE_display_robust_resource_initialization 1
-#define EGL_DISPLAY_ROBUST_RESOURCE_INITIALIZATION_ANGLE 0x3453
-#endif /* EGL_ANGLE_display_robust_resource_initialization */
-
-#ifndef EGL_ANGLE_display_power_preference
-#define EGL_ANGLE_display_power_preference 1
-#define EGL_POWER_PREFERENCE_ANGLE 0x3482
-#define EGL_LOW_POWER_ANGLE 0x0001
-#define EGL_HIGH_POWER_ANGLE 0x0002
-#endif /* EGL_ANGLE_power_preference */
-
-#ifndef EGL_ANGLE_platform_angle_device_id
-#define EGL_ANGLE_platform_angle_device_id
-#define EGL_PLATFORM_ANGLE_DEVICE_ID_HIGH_ANGLE 0x34D6
-#define EGL_PLATFORM_ANGLE_DEVICE_ID_LOW_ANGLE 0x34D7
-#endif /* EGL_ANGLE_platform_angle_device_id */
-
-// From ANGLE's egl/eglext.h.
-#ifndef EGL_ANGLE_feature_control
-#define EGL_ANGLE_feature_control 1
-#define EGL_FEATURE_NAME_ANGLE 0x3460
-#define EGL_FEATURE_CATEGORY_ANGLE 0x3461
-#define EGL_FEATURE_DESCRIPTION_ANGLE 0x3462
-#define EGL_FEATURE_BUG_ANGLE 0x3463
-#define EGL_FEATURE_STATUS_ANGLE 0x3464
-#define EGL_FEATURE_COUNT_ANGLE 0x3465
-#define EGL_FEATURE_OVERRIDES_ENABLED_ANGLE 0x3466
-#define EGL_FEATURE_OVERRIDES_DISABLED_ANGLE 0x3467
-#define EGL_FEATURE_ALL_DISABLED_ANGLE 0x3469
-#endif /* EGL_ANGLE_feature_control */
-
using ui::GetLastEGLErrorString;
-using ui::PlatformEvent;
namespace gl {
namespace {
-class EGLGpuSwitchingObserver;
-
-EGLGpuSwitchingObserver* g_egl_gpu_switching_observer = nullptr;
-
constexpr const char kSwapEventTraceCategories[] = "gpu";
constexpr size_t kMaxTimestampsSupportable = 9;
@@ -228,7 +113,7 @@ class EGLSyncControlVSyncProvider : public SyncControlVSyncProvider {
static bool IsSupported(GLDisplayEGL* display) {
DCHECK(display);
return SyncControlVSyncProvider::IsSupported() &&
- display->egl_sync_control_supported;
+ display->ext->b_EGL_CHROMIUM_sync_control;
}
protected:
@@ -249,7 +134,7 @@ class EGLSyncControlVSyncProvider : public SyncControlVSyncProvider {
}
bool GetMscRate(int32_t* numerator, int32_t* denominator) override {
- if (!display_->egl_sync_control_rate_supported) {
+ if (!display_->ext->b_EGL_ANGLE_sync_control_rate) {
return false;
}
@@ -265,350 +150,6 @@ class EGLSyncControlVSyncProvider : public SyncControlVSyncProvider {
raw_ptr<GLDisplayEGL> display_;
};
-class EGLGpuSwitchingObserver final : public ui::GpuSwitchingObserver {
- public:
- explicit EGLGpuSwitchingObserver(GLDisplayEGL* display) : display_(display) {
- DCHECK(display_);
- }
-
- void OnGpuSwitched(gl::GpuPreference active_gpu_heuristic) override {
- DCHECK(display_->IsANGLEPowerPreferenceSupported());
- eglHandleGPUSwitchANGLE(display_->GetDisplay());
- }
-
- private:
- raw_ptr<GLDisplayEGL> display_ = nullptr;
-};
-
-std::vector<const char*> GetAttribArrayFromStringVector(
- const std::vector<std::string>& strings) {
- std::vector<const char*> attribs;
- for (const std::string& item : strings) {
- attribs.push_back(item.c_str());
- }
- attribs.push_back(0);
- return attribs;
-}
-
-std::vector<std::string> GetStringVectorFromCommandLine(
- const base::CommandLine* command_line,
- const char switch_name[]) {
- std::string command_string = command_line->GetSwitchValueASCII(switch_name);
- return base::SplitString(command_string, ", ;", base::TRIM_WHITESPACE,
- base::SPLIT_WANT_NONEMPTY);
-}
-
-EGLDisplay GetPlatformANGLEDisplay(
- GLDisplayEGL* gl_display,
- EGLenum platform_type,
- const std::vector<std::string>& enabled_features,
- const std::vector<std::string>& disabled_features,
- const std::vector<EGLAttrib>& extra_display_attribs) {
- std::vector<EGLAttrib> display_attribs(extra_display_attribs);
-
- display_attribs.push_back(EGL_PLATFORM_ANGLE_TYPE_ANGLE);
- display_attribs.push_back(static_cast<EGLAttrib>(platform_type));
-
- if (platform_type == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) {
- base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
- if (command_line->HasSwitch(switches::kUseAdapterLuid)) {
- // If the LUID is specified, the format is <high part>,<low part>. Split
- // and add them to the EGL_ANGLE_platform_angle_d3d_luid ext attributes.
- std::string luid =
- command_line->GetSwitchValueASCII(switches::kUseAdapterLuid);
- size_t comma = luid.find(',');
- if (comma != std::string::npos) {
- int32_t high;
- uint32_t low;
- if (!base::StringToInt(luid.substr(0, comma), &high) ||
- !base::StringToUint(luid.substr(comma + 1), &low))
- return EGL_NO_DISPLAY;
-
- display_attribs.push_back(EGL_PLATFORM_ANGLE_D3D_LUID_HIGH_ANGLE);
- display_attribs.push_back(high);
-
- display_attribs.push_back(EGL_PLATFORM_ANGLE_D3D_LUID_LOW_ANGLE);
- display_attribs.push_back(low);
- }
- }
- }
-
- GLDisplayEglUtil::GetInstance()->GetPlatformExtraDisplayAttribs(
- platform_type, &display_attribs);
-
- std::vector<const char*> enabled_features_attribs =
- GetAttribArrayFromStringVector(enabled_features);
- std::vector<const char*> disabled_features_attribs =
- GetAttribArrayFromStringVector(disabled_features);
- if (gl_display->egl_angle_feature_control_supported) {
- if (!enabled_features_attribs.empty()) {
- display_attribs.push_back(EGL_FEATURE_OVERRIDES_ENABLED_ANGLE);
- display_attribs.push_back(
- reinterpret_cast<EGLAttrib>(enabled_features_attribs.data()));
- }
- if (!disabled_features_attribs.empty()) {
- display_attribs.push_back(EGL_FEATURE_OVERRIDES_DISABLED_ANGLE);
- display_attribs.push_back(
- reinterpret_cast<EGLAttrib>(disabled_features_attribs.data()));
- }
- }
- // TODO(dbehr) Add an attrib to Angle to pass EGL platform.
-
- if (gl_display->IsANGLEDisplayPowerPreferenceSupported()) {
- GpuPreference pref =
- GLSurface::AdjustGpuPreference(GpuPreference::kDefault);
- switch (pref) {
- case GpuPreference::kDefault:
- // Don't request any GPU, let ANGLE and the native driver decide.
- break;
- case GpuPreference::kLowPower:
- display_attribs.push_back(EGL_POWER_PREFERENCE_ANGLE);
- display_attribs.push_back(EGL_LOW_POWER_ANGLE);
- break;
- case GpuPreference::kHighPerformance:
- display_attribs.push_back(EGL_POWER_PREFERENCE_ANGLE);
- display_attribs.push_back(EGL_HIGH_POWER_ANGLE);
- break;
- default:
- NOTREACHED();
- }
- }
-
- display_attribs.push_back(EGL_NONE);
-
- // This is an EGL 1.5 function that we know ANGLE supports. It's used to pass
- // EGLAttribs (pointers) instead of EGLints into the display
- return eglGetPlatformDisplay(
- EGL_PLATFORM_ANGLE_ANGLE,
- reinterpret_cast<void*>(gl_display->GetNativeDisplay()),
- &display_attribs[0]);
-}
-
-EGLDisplay GetDisplayFromType(
- DisplayType display_type,
- GLDisplayEGL* gl_display,
- const std::vector<std::string>& enabled_angle_features,
- const std::vector<std::string>& disabled_angle_features,
- bool disable_all_angle_features,
- uint64_t system_device_id) {
- DCHECK(gl_display);
- std::vector<EGLAttrib> extra_display_attribs;
- if (disable_all_angle_features) {
- extra_display_attribs.push_back(EGL_FEATURE_ALL_DISABLED_ANGLE);
- extra_display_attribs.push_back(EGL_TRUE);
- }
- if (system_device_id != 0 &&
- gl_display->IsANGLEPlatformANGLEDeviceIdSupported()) {
- uint32_t low_part = system_device_id & 0xffffffff;
- extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_ID_LOW_ANGLE);
- extra_display_attribs.push_back(low_part);
-
- uint32_t high_part = (system_device_id >> 32) & 0xffffffff;
- extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_ID_HIGH_ANGLE);
- extra_display_attribs.push_back(high_part);
- }
- switch (display_type) {
- case DEFAULT:
- case SWIFT_SHADER: {
- EGLDisplayPlatform native_display = gl_display->native_display;
- if (native_display.GetPlatform() != 0) {
- return eglGetPlatformDisplay(
- native_display.GetPlatform(),
- reinterpret_cast<void*>(native_display.GetDisplay()), nullptr);
- } else {
- return eglGetDisplay(native_display.GetDisplay());
- }
- }
- case ANGLE_D3D9:
- return GetPlatformANGLEDisplay(
- gl_display, EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE,
- enabled_angle_features, disabled_angle_features,
- extra_display_attribs);
- case ANGLE_D3D11:
- return GetPlatformANGLEDisplay(
- gl_display, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE,
- enabled_angle_features, disabled_angle_features,
- extra_display_attribs);
- case ANGLE_D3D11_NULL:
- extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
- extra_display_attribs.push_back(
- EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE);
- return GetPlatformANGLEDisplay(
- gl_display, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE,
- enabled_angle_features, disabled_angle_features,
- extra_display_attribs);
- case ANGLE_OPENGL:
- return GetPlatformANGLEDisplay(
- gl_display, EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE,
- enabled_angle_features, disabled_angle_features,
- extra_display_attribs);
- case ANGLE_OPENGL_EGL:
- extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
- extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_EGL_ANGLE);
- return GetPlatformANGLEDisplay(
- gl_display, EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE,
- enabled_angle_features, disabled_angle_features,
- extra_display_attribs);
- case ANGLE_OPENGL_NULL:
- extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
- extra_display_attribs.push_back(
- EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE);
- return GetPlatformANGLEDisplay(
- gl_display, EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE,
- enabled_angle_features, disabled_angle_features,
- extra_display_attribs);
- case ANGLE_OPENGLES:
- return GetPlatformANGLEDisplay(
- gl_display, EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE,
- enabled_angle_features, disabled_angle_features,
- extra_display_attribs);
- case ANGLE_OPENGLES_EGL:
- extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
- extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_EGL_ANGLE);
- return GetPlatformANGLEDisplay(
- gl_display, EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE,
- enabled_angle_features, disabled_angle_features,
- extra_display_attribs);
- case ANGLE_OPENGLES_NULL:
- extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
- extra_display_attribs.push_back(
- EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE);
- return GetPlatformANGLEDisplay(
- gl_display, EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE,
- enabled_angle_features, disabled_angle_features,
- extra_display_attribs);
- case ANGLE_NULL:
- return GetPlatformANGLEDisplay(
- gl_display, EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE,
- enabled_angle_features, disabled_angle_features,
- extra_display_attribs);
- case ANGLE_VULKAN:
- return GetPlatformANGLEDisplay(
- gl_display, EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE,
- enabled_angle_features, disabled_angle_features,
- extra_display_attribs);
- case ANGLE_VULKAN_NULL:
- extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
- extra_display_attribs.push_back(
- EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE);
- return GetPlatformANGLEDisplay(
- gl_display, EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE,
- enabled_angle_features, disabled_angle_features,
- extra_display_attribs);
- case ANGLE_D3D11on12:
- extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_D3D11ON12_ANGLE);
- extra_display_attribs.push_back(EGL_TRUE);
- return GetPlatformANGLEDisplay(
- gl_display, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE,
- enabled_angle_features, disabled_angle_features,
- extra_display_attribs);
- case ANGLE_SWIFTSHADER:
- extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
- extra_display_attribs.push_back(
- EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE);
-#if defined(USE_OZONE)
-#if BUILDFLAG(OZONE_PLATFORM_X11)
- extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_NATIVE_PLATFORM_TYPE_ANGLE);
- extra_display_attribs.push_back(EGL_PLATFORM_VULKAN_DISPLAY_MODE_HEADLESS_ANGLE);
-#endif // BUILDFLAG(OZONE_PLATFORM_X11)
-#endif // defined(USE_OZONE)
- return GetPlatformANGLEDisplay(
- gl_display, EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE,
- enabled_angle_features, disabled_angle_features,
- extra_display_attribs);
- case ANGLE_METAL:
- return GetPlatformANGLEDisplay(
- gl_display, EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE,
- enabled_angle_features, disabled_angle_features,
- extra_display_attribs);
- case ANGLE_METAL_NULL:
- extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
- extra_display_attribs.push_back(
- EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE);
- return GetPlatformANGLEDisplay(
- gl_display, EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE,
- enabled_angle_features, disabled_angle_features,
- extra_display_attribs);
- default:
- NOTREACHED();
- return EGL_NO_DISPLAY;
- }
-}
-
-ANGLEImplementation GetANGLEImplementationFromDisplayType(
- DisplayType display_type) {
- switch (display_type) {
- case ANGLE_D3D9:
- return ANGLEImplementation::kD3D9;
- case ANGLE_D3D11:
- case ANGLE_D3D11_NULL:
- case ANGLE_D3D11on12:
- return ANGLEImplementation::kD3D11;
- case ANGLE_OPENGL:
- case ANGLE_OPENGL_NULL:
- return ANGLEImplementation::kOpenGL;
- case ANGLE_OPENGLES:
- case ANGLE_OPENGLES_NULL:
- return ANGLEImplementation::kOpenGLES;
- case ANGLE_NULL:
- return ANGLEImplementation::kNull;
- case ANGLE_VULKAN:
- case ANGLE_VULKAN_NULL:
- return ANGLEImplementation::kVulkan;
- case ANGLE_SWIFTSHADER:
- return ANGLEImplementation::kSwiftShader;
- case ANGLE_METAL:
- case ANGLE_METAL_NULL:
- return ANGLEImplementation::kMetal;
- default:
- return ANGLEImplementation::kNone;
- }
-}
-
-const char* DisplayTypeString(DisplayType display_type) {
- switch (display_type) {
- case DEFAULT:
- return "Default";
- case SWIFT_SHADER:
- return "SwiftShader";
- case ANGLE_D3D9:
- return "D3D9";
- case ANGLE_D3D11:
- return "D3D11";
- case ANGLE_D3D11_NULL:
- return "D3D11Null";
- case ANGLE_OPENGL:
- return "OpenGL";
- case ANGLE_OPENGL_NULL:
- return "OpenGLNull";
- case ANGLE_OPENGLES:
- return "OpenGLES";
- case ANGLE_OPENGLES_NULL:
- return "OpenGLESNull";
- case ANGLE_NULL:
- return "Null";
- case ANGLE_VULKAN:
- return "Vulkan";
- case ANGLE_VULKAN_NULL:
- return "VulkanNull";
- case ANGLE_D3D11on12:
- return "D3D11on12";
- case ANGLE_SWIFTSHADER:
- return "SwANGLE";
- case ANGLE_OPENGL_EGL:
- return "OpenGLEGL";
- case ANGLE_OPENGLES_EGL:
- return "OpenGLESEGL";
- case ANGLE_METAL:
- return "Metal";
- case ANGLE_METAL_NULL:
- return "MetalNull";
- default:
- NOTREACHED();
- return "Err";
- }
-}
-
bool ValidateEglConfig(EGLDisplay display,
const EGLint* config_attribs,
EGLint* num_configs) {
@@ -784,192 +325,8 @@ EGLConfig ChooseConfig(EGLDisplay display,
return nullptr;
}
-void AddInitDisplay(std::vector<DisplayType>* init_displays,
- DisplayType display_type) {
- // Make sure to not add the same display type twice.
- if (!base::Contains(*init_displays, display_type))
- init_displays->push_back(display_type);
-}
-
-const char* GetDebugMessageTypeString(EGLint source) {
- switch (source) {
- case EGL_DEBUG_MSG_CRITICAL_KHR:
- return "Critical";
- case EGL_DEBUG_MSG_ERROR_KHR:
- return "Error";
- case EGL_DEBUG_MSG_WARN_KHR:
- return "Warning";
- case EGL_DEBUG_MSG_INFO_KHR:
- return "Info";
- default:
- return "UNKNOWN";
- }
-}
-
-static void EGLAPIENTRY LogEGLDebugMessage(EGLenum error,
- const char* command,
- EGLint message_type,
- EGLLabelKHR thread_label,
- EGLLabelKHR object_label,
- const char* message) {
- std::string formatted_message = std::string("EGL Driver message (") +
- GetDebugMessageTypeString(message_type) +
- ") " + command + ": " + message;
-
- // Assume that all labels that have been set are strings
- if (thread_label) {
- formatted_message += " thread: ";
- formatted_message += static_cast<const char*>(thread_label);
- }
- if (object_label) {
- formatted_message += " object: ";
- formatted_message += static_cast<const char*>(object_label);
- }
-
- if (message_type == EGL_DEBUG_MSG_CRITICAL_KHR ||
- message_type == EGL_DEBUG_MSG_ERROR_KHR) {
- LOG(ERROR) << formatted_message;
- } else {
- DVLOG(1) << formatted_message;
- }
-}
-
} // namespace
-void GetEGLInitDisplays(bool supports_angle_d3d,
- bool supports_angle_opengl,
- bool supports_angle_null,
- bool supports_angle_vulkan,
- bool supports_angle_swiftshader,
- bool supports_angle_egl,
- bool supports_angle_metal,
- const base::CommandLine* command_line,
- std::vector<DisplayType>* init_displays) {
- // If we're already requesting software GL, make sure we don't fallback to the
- // GPU
- bool forceSoftwareGL = IsSoftwareGLImplementation(GetGLImplementationParts());
-
- std::string requested_renderer =
- forceSoftwareGL ? kANGLEImplementationSwiftShaderName
- : command_line->GetSwitchValueASCII(switches::kUseANGLE);
-
- bool use_angle_default =
- !forceSoftwareGL &&
- (!command_line->HasSwitch(switches::kUseANGLE) ||
- requested_renderer == kANGLEImplementationDefaultName);
-
- if (supports_angle_null &&
- requested_renderer == kANGLEImplementationNullName) {
- AddInitDisplay(init_displays, ANGLE_NULL);
- return;
- }
-
- // If no display has been explicitly requested and the DefaultANGLEOpenGL
- // experiment is enabled, try creating OpenGL displays first.
- // TODO(oetuaho@nvidia.com): Only enable this path on specific GPUs with a
- // blocklist entry. http://crbug.com/693090
- if (supports_angle_opengl && use_angle_default &&
- base::FeatureList::IsEnabled(features::kDefaultANGLEOpenGL)) {
- AddInitDisplay(init_displays, ANGLE_OPENGL);
- AddInitDisplay(init_displays, ANGLE_OPENGLES);
- }
-
- if (supports_angle_metal && use_angle_default &&
- base::FeatureList::IsEnabled(features::kDefaultANGLEMetal)) {
- AddInitDisplay(init_displays, ANGLE_METAL);
- }
-
- if (supports_angle_vulkan && use_angle_default &&
- features::IsDefaultANGLEVulkan()) {
- AddInitDisplay(init_displays, ANGLE_VULKAN);
- }
-
- if (supports_angle_d3d) {
- if (use_angle_default) {
- // Default mode for ANGLE - try D3D11, else try D3D9
- if (!command_line->HasSwitch(switches::kDisableD3D11)) {
- AddInitDisplay(init_displays, ANGLE_D3D11);
- }
- AddInitDisplay(init_displays, ANGLE_D3D9);
- } else {
- if (requested_renderer == kANGLEImplementationD3D11Name) {
- AddInitDisplay(init_displays, ANGLE_D3D11);
- } else if (requested_renderer == kANGLEImplementationD3D9Name) {
- AddInitDisplay(init_displays, ANGLE_D3D9);
- } else if (requested_renderer == kANGLEImplementationD3D11NULLName) {
- AddInitDisplay(init_displays, ANGLE_D3D11_NULL);
- } else if (requested_renderer == kANGLEImplementationD3D11on12Name) {
- AddInitDisplay(init_displays, ANGLE_D3D11on12);
- }
- }
- }
-
- if (supports_angle_opengl) {
- if (use_angle_default && !supports_angle_d3d) {
-#if BUILDFLAG(IS_ANDROID)
- // Don't request desktopGL on android
- AddInitDisplay(init_displays, ANGLE_OPENGLES);
-#else
- AddInitDisplay(init_displays, ANGLE_OPENGL);
- AddInitDisplay(init_displays, ANGLE_OPENGLES);
-#endif
- } else {
- if (requested_renderer == kANGLEImplementationOpenGLName) {
- AddInitDisplay(init_displays, ANGLE_OPENGL);
- } else if (requested_renderer == kANGLEImplementationOpenGLESName) {
- AddInitDisplay(init_displays, ANGLE_OPENGLES);
- } else if (requested_renderer == kANGLEImplementationOpenGLNULLName) {
- AddInitDisplay(init_displays, ANGLE_OPENGL_NULL);
- } else if (requested_renderer == kANGLEImplementationOpenGLESNULLName) {
- AddInitDisplay(init_displays, ANGLE_OPENGLES_NULL);
- } else if (requested_renderer == kANGLEImplementationOpenGLEGLName &&
- supports_angle_egl) {
- AddInitDisplay(init_displays, ANGLE_OPENGL_EGL);
- } else if (requested_renderer == kANGLEImplementationOpenGLESEGLName &&
- supports_angle_egl) {
- AddInitDisplay(init_displays, ANGLE_OPENGLES_EGL);
- }
- }
- }
-
- if (supports_angle_vulkan) {
- if (use_angle_default) {
- if (!supports_angle_d3d && !supports_angle_opengl) {
- AddInitDisplay(init_displays, ANGLE_VULKAN);
- }
- } else if (requested_renderer == kANGLEImplementationVulkanName) {
- AddInitDisplay(init_displays, ANGLE_VULKAN);
- } else if (requested_renderer == kANGLEImplementationVulkanNULLName) {
- AddInitDisplay(init_displays, ANGLE_VULKAN_NULL);
- }
- }
-
- if (supports_angle_swiftshader) {
- if (requested_renderer == kANGLEImplementationSwiftShaderName ||
- requested_renderer == kANGLEImplementationSwiftShaderForWebGLName) {
- AddInitDisplay(init_displays, ANGLE_SWIFTSHADER);
- }
- }
-
- if (supports_angle_metal) {
- if (use_angle_default) {
- if (!supports_angle_opengl) {
- AddInitDisplay(init_displays, ANGLE_METAL);
- }
- } else if (requested_renderer == kANGLEImplementationMetalName) {
- AddInitDisplay(init_displays, ANGLE_METAL);
- } else if (requested_renderer == kANGLEImplementationMetalNULLName) {
- AddInitDisplay(init_displays, ANGLE_METAL_NULL);
- }
- }
-
- // If no displays are available due to missing angle extensions or invalid
- // flags, request the default display.
- if (init_displays->empty()) {
- init_displays->push_back(DEFAULT);
- }
-}
-
GLSurfaceEGL::GLSurfaceEGL(GLDisplayEGL* display) : display_(display) {
DCHECK(display_);
}
@@ -1004,380 +361,8 @@ GLDisplayEGL* GLSurfaceEGL::GetGLDisplayEGL() {
GpuPreference::kDefault);
}
-// static
-GLDisplayEGL* GLSurfaceEGL::InitializeOneOff(EGLDisplayPlatform native_display,
- uint64_t system_device_id) {
- GLDisplayEGL* display =
- GLDisplayManagerEGL::GetInstance()->GetDisplay(system_device_id);
- if (display->GetDisplay() == EGL_NO_DISPLAY) {
- // Must be called before InitializeDisplay().
- g_driver_egl.ext.InitializeClientExtensionSettings();
-
- display = InitializeDisplay(native_display, system_device_id);
- if (display->GetDisplay() == EGL_NO_DISPLAY)
- return nullptr;
-
- // Must be called after InitializeDisplay().
- g_driver_egl.ext.InitializeExtensionSettings(display);
-
- InitializeOneOffCommon(display);
- }
- return display;
-}
-
-// static
-GLDisplayEGL* GLSurfaceEGL::InitializeOneOffForTesting() {
- g_driver_egl.ext.InitializeClientExtensionSettings();
- GLDisplayEGL* display =
- GLDisplayManagerEGL::GetInstance()->GetDisplay(GpuPreference::kDefault);
- display->SetDisplay(eglGetCurrentDisplay());
- g_driver_egl.ext.InitializeExtensionSettings(display);
- InitializeOneOffCommon(display);
- return display;
-}
-
-// static
-void GLSurfaceEGL::InitializeOneOffCommon(GLDisplayEGL* display) {
- display->egl_client_extensions =
- eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
- display->egl_extensions =
- eglQueryString(display->GetDisplay(), EGL_EXTENSIONS);
-
- display->egl_create_context_robustness_supported =
- display->HasEGLExtension("EGL_EXT_create_context_robustness");
- display->egl_robustness_video_memory_purge_supported =
- display->HasEGLExtension("EGL_NV_robustness_video_memory_purge");
- display->egl_create_context_bind_generates_resource_supported =
- display->HasEGLExtension(
- "EGL_CHROMIUM_create_context_bind_generates_resource");
- display->egl_create_context_webgl_compatability_supported =
- display->HasEGLExtension("EGL_ANGLE_create_context_webgl_compatibility");
- display->egl_sync_control_supported =
- display->HasEGLExtension("EGL_CHROMIUM_sync_control");
- display->egl_sync_control_rate_supported =
- display->HasEGLExtension("EGL_ANGLE_sync_control_rate");
- display->egl_window_fixed_size_supported =
- display->HasEGLExtension("EGL_ANGLE_window_fixed_size");
- display->egl_surface_orientation_supported =
- display->HasEGLExtension("EGL_ANGLE_surface_orientation");
- display->egl_khr_colorspace =
- display->HasEGLExtension("EGL_KHR_gl_colorspace");
- display->egl_ext_colorspace_display_p3 =
- display->HasEGLExtension("EGL_EXT_gl_colorspace_display_p3");
- display->egl_ext_colorspace_display_p3_passthrough =
- display->HasEGLExtension("EGL_EXT_gl_colorspace_display_p3_passthrough");
- // According to https://source.android.com/compatibility/android-cdd.html the
- // EGL_IMG_context_priority extension is mandatory for Virtual Reality High
- // Performance support, but due to a bug in Android Nougat the extension
- // isn't being reported even when it's present. As a fallback, check if other
- // related extensions that were added for VR support are present, and assume
- // that this implies context priority is also supported. See also:
- // https://github.com/googlevr/gvr-android-sdk/issues/330
- display->egl_context_priority_supported =
- display->HasEGLExtension("EGL_IMG_context_priority") ||
- (display->HasEGLExtension("EGL_ANDROID_front_buffer_auto_refresh") &&
- display->HasEGLExtension("EGL_ANDROID_create_native_client_buffer"));
-
- // Need EGL_KHR_no_config_context to allow surfaces with and without alpha to
- // be bound to the same context.
- display->egl_no_config_context_supported =
- display->HasEGLExtension("EGL_KHR_no_config_context");
-
- display->egl_display_texture_share_group_supported =
- display->HasEGLExtension("EGL_ANGLE_display_texture_share_group");
- display->egl_display_semaphore_share_group_supported =
- display->HasEGLExtension("EGL_ANGLE_display_semaphore_share_group");
- display->egl_create_context_client_arrays_supported =
- display->HasEGLExtension("EGL_ANGLE_create_context_client_arrays");
- display->egl_robust_resource_init_supported =
- display->HasEGLExtension("EGL_ANGLE_robust_resource_initialization");
-
- // Check if SurfacelessEGL is supported.
- display->egl_surfaceless_context_supported =
- display->HasEGLExtension("EGL_KHR_surfaceless_context");
-
- // TODO(oetuaho@nvidia.com): Surfaceless is disabled on Android as a temporary
- // workaround, since code written for Android WebView takes different paths
- // based on whether GL surface objects have underlying EGL surface handles,
- // conflicting with the use of surfaceless. ANGLE can still expose surfacelss
- // because it is emulated with pbuffers if native support is not present. See
- // https://crbug.com/382349.
-
-#if BUILDFLAG(IS_ANDROID)
- // Use the WebGL compatibility extension for detecting ANGLE. ANGLE always
- // exposes it.
- bool is_angle = display->egl_create_context_webgl_compatability_supported;
- if (!is_angle) {
- display->egl_surfaceless_context_supported = false;
- }
-#endif
-
- if (display->egl_surfaceless_context_supported) {
- // EGL_KHR_surfaceless_context is supported but ensure
- // GL_OES_surfaceless_context is also supported. We need a current context
- // to query for supported GL extensions.
- scoped_refptr<GLSurface> surface =
- new SurfacelessEGL(display, gfx::Size(1, 1));
- scoped_refptr<GLContext> context = InitializeGLContext(
- new GLContextEGL(nullptr), surface.get(), GLContextAttribs());
- if (!context || !context->MakeCurrent(surface.get()))
- display->egl_surfaceless_context_supported = false;
-
- // Ensure context supports GL_OES_surfaceless_context.
- if (display->egl_surfaceless_context_supported) {
- display->egl_surfaceless_context_supported =
- context->HasExtension("GL_OES_surfaceless_context");
- context->ReleaseCurrent(surface.get());
- }
- }
-
- // The native fence sync extension is a bit complicated. It's reported as
- // present for ChromeOS, but Android currently doesn't report this extension
- // even when it's present, and older devices and Android emulator may export
- // a useless wrapper function. See crbug.com/775707 for details. In short, if
- // the symbol is present and we're on Android N or newer and we are not on
- // Android emulator, assume that it's usable even if the extension wasn't
- // reported. TODO(https://crbug.com/1086781): Once this is fixed at the
- // Android level, update the heuristic to trust the reported extension from
- // that version onward.
- display->egl_android_native_fence_sync_supported =
- display->HasEGLExtension("EGL_ANDROID_native_fence_sync");
-#if BUILDFLAG(IS_ANDROID)
- if (!display->egl_android_native_fence_sync_supported &&
- base::android::BuildInfo::GetInstance()->sdk_int() >=
- base::android::SDK_VERSION_NOUGAT &&
- g_driver_egl.fn.eglDupNativeFenceFDANDROIDFn &&
- base::SysInfo::GetAndroidHardwareEGL() != "swiftshader" &&
- base::SysInfo::GetAndroidHardwareEGL() != "emulation") {
- display->egl_android_native_fence_sync_supported = true;
- }
-#endif
-
- display->egl_ext_pixel_format_float_supported =
- display->HasEGLExtension("EGL_EXT_pixel_format_float");
-
- display->egl_angle_power_preference_supported =
- display->HasEGLExtension("EGL_ANGLE_power_preference");
-
- display->egl_angle_external_context_and_surface_supported =
- display->HasEGLExtension("EGL_ANGLE_external_context_and_surface");
-
- display->egl_ext_query_device_supported =
- display->HasEGLClientExtension("EGL_EXT_device_query");
-
- display->egl_angle_context_virtualization_supported =
- display->HasEGLExtension("EGL_ANGLE_context_virtualization");
-
- display->egl_angle_vulkan_image_supported =
- display->HasEGLExtension("EGL_ANGLE_vulkan_image");
-
- if (display->egl_angle_power_preference_supported) {
- g_egl_gpu_switching_observer = new EGLGpuSwitchingObserver(display);
- ui::GpuSwitchingManager::GetInstance()->AddObserver(
- g_egl_gpu_switching_observer);
- }
-}
-
-// static
-bool GLSurfaceEGL::InitializeExtensionSettingsOneOff(GLDisplayEGL* display) {
- DCHECK(display);
- if (display->GetDisplay() == EGL_NO_DISPLAY)
- return false;
- g_driver_egl.ext.UpdateConditionalExtensionSettings(display);
- display->egl_client_extensions =
- eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
- display->egl_extensions =
- eglQueryString(display->GetDisplay(), EGL_EXTENSIONS);
-
- return true;
-}
-
-// static
-void GLSurfaceEGL::ShutdownOneOff(GLDisplayEGL* display) {
- if (!display || display->GetDisplay() == EGL_NO_DISPLAY) {
- return;
- }
-
- if (g_egl_gpu_switching_observer) {
- ui::GpuSwitchingManager::GetInstance()->RemoveObserver(
- g_egl_gpu_switching_observer);
- delete g_egl_gpu_switching_observer;
- g_egl_gpu_switching_observer = nullptr;
- }
- angle::ResetPlatform(display->GetDisplay());
- DCHECK(g_driver_egl.fn.eglTerminateFn);
- eglTerminate(display->GetDisplay());
- display->SetDisplay(EGL_NO_DISPLAY);
-
- display->egl_client_extensions = nullptr;
- display->egl_extensions = nullptr;
- display->egl_create_context_robustness_supported = false;
- display->egl_robustness_video_memory_purge_supported = false;
- display->egl_create_context_bind_generates_resource_supported = false;
- display->egl_create_context_webgl_compatability_supported = false;
- display->egl_sync_control_supported = false;
- display->egl_sync_control_rate_supported = false;
- display->egl_window_fixed_size_supported = false;
- display->egl_surface_orientation_supported = false;
- display->egl_surfaceless_context_supported = false;
- display->egl_robust_resource_init_supported = false;
- display->egl_display_texture_share_group_supported = false;
- display->egl_create_context_client_arrays_supported = false;
- display->egl_angle_feature_control_supported = false;
-}
-
GLSurfaceEGL::~GLSurfaceEGL() = default;
-// InitializeDisplay is necessary because the static binding code
-// needs a full Display init before it can query the Display extensions.
-// static
-GLDisplayEGL* GLSurfaceEGL::InitializeDisplay(EGLDisplayPlatform native_display,
- uint64_t system_device_id) {
- GLDisplayEGL* gl_display =
- GLDisplayManagerEGL::GetInstance()->GetDisplay(system_device_id);
- if (gl_display->GetDisplay() != EGL_NO_DISPLAY) {
- return gl_display;
- }
-
- gl_display->native_display = native_display;
-
- // If EGL_EXT_client_extensions not supported this call to eglQueryString
- // will return nullptr.
- gl_display->egl_client_extensions =
- eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
-
- bool supports_egl_debug = gl_display->HasEGLClientExtension("EGL_KHR_debug");
- if (supports_egl_debug) {
- EGLAttrib controls[] = {
- EGL_DEBUG_MSG_CRITICAL_KHR,
- EGL_TRUE,
- EGL_DEBUG_MSG_ERROR_KHR,
- EGL_TRUE,
- EGL_DEBUG_MSG_WARN_KHR,
- EGL_TRUE,
- EGL_DEBUG_MSG_INFO_KHR,
- EGL_TRUE,
- EGL_NONE,
- EGL_NONE,
- };
-
- eglDebugMessageControlKHR(&LogEGLDebugMessage, controls);
- }
-
- bool supports_angle_d3d = false;
- bool supports_angle_opengl = false;
- bool supports_angle_null = false;
- bool supports_angle_vulkan = false;
- bool supports_angle_swiftshader = false;
- bool supports_angle_egl = false;
- bool supports_angle_metal = false;
- // Check for availability of ANGLE extensions.
- if (gl_display->HasEGLClientExtension("EGL_ANGLE_platform_angle")) {
- supports_angle_d3d =
- gl_display->HasEGLClientExtension("EGL_ANGLE_platform_angle_d3d");
- supports_angle_opengl =
- gl_display->HasEGLClientExtension("EGL_ANGLE_platform_angle_opengl");
- supports_angle_null =
- gl_display->HasEGLClientExtension("EGL_ANGLE_platform_angle_null");
- supports_angle_vulkan =
- gl_display->HasEGLClientExtension("EGL_ANGLE_platform_angle_vulkan");
- supports_angle_swiftshader = gl_display->HasEGLClientExtension(
- "EGL_ANGLE_platform_angle_device_type_swiftshader");
- supports_angle_egl = gl_display->HasEGLClientExtension(
- "EGL_ANGLE_platform_angle_device_type_egl_angle");
- supports_angle_metal =
- gl_display->HasEGLClientExtension("EGL_ANGLE_platform_angle_metal");
- }
-
- bool supports_angle = supports_angle_d3d || supports_angle_opengl ||
- supports_angle_null || supports_angle_vulkan ||
- supports_angle_swiftshader || supports_angle_metal;
-
- gl_display->egl_angle_feature_control_supported =
- gl_display->HasEGLClientExtension("EGL_ANGLE_feature_control");
-
- gl_display->egl_angle_display_power_preference_supported =
- gl_display->HasEGLClientExtension("EGL_ANGLE_display_power_preference");
-
- gl_display->egl_angle_platform_angle_device_id_supported =
- gl_display->HasEGLClientExtension("EGL_ANGLE_platform_angle_device_id");
-
- std::vector<DisplayType> init_displays;
- base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
- GetEGLInitDisplays(supports_angle_d3d, supports_angle_opengl,
- supports_angle_null, supports_angle_vulkan,
- supports_angle_swiftshader, supports_angle_egl,
- supports_angle_metal, command_line, &init_displays);
-
- std::vector<std::string> enabled_angle_features =
- GetStringVectorFromCommandLine(command_line,
- switches::kEnableANGLEFeatures);
- std::vector<std::string> disabled_angle_features =
- GetStringVectorFromCommandLine(command_line,
- switches::kDisableANGLEFeatures);
-
- bool disable_all_angle_features =
- command_line->HasSwitch(switches::kDisableGpuDriverBugWorkarounds);
-
- for (size_t disp_index = 0; disp_index < init_displays.size(); ++disp_index) {
- DisplayType display_type = init_displays[disp_index];
- EGLDisplay egl_display = GetDisplayFromType(
- display_type, gl_display, enabled_angle_features,
- disabled_angle_features, disable_all_angle_features, system_device_id);
- if (egl_display == EGL_NO_DISPLAY) {
- LOG(ERROR) << "EGL display query failed with error "
- << GetLastEGLErrorString();
- }
-
- // Init ANGLE platform now that we have the global display.
- if (supports_angle) {
- if (!angle::InitializePlatform(egl_display)) {
- LOG(ERROR) << "ANGLE Platform initialization failed.";
- }
-
- SetANGLEImplementation(
- GetANGLEImplementationFromDisplayType(display_type));
- }
-
- // The platform may need to unset its platform specific display env in case
- // of vulkan if the platform doesn't support Vulkan surface.
- absl::optional<base::ScopedEnvironmentVariableOverride> unset_display;
- if (display_type == ANGLE_VULKAN) {
- unset_display = GLDisplayEglUtil::GetInstance()
- ->MaybeGetScopedDisplayUnsetForVulkan();
- }
-
- if (!eglInitialize(egl_display, nullptr, nullptr)) {
- bool is_last = disp_index == init_displays.size() - 1;
-
- LOG(ERROR) << "eglInitialize " << DisplayTypeString(display_type)
- << " failed with error " << GetLastEGLErrorString()
- << (is_last ? "" : ", trying next display type");
- continue;
- }
-
- std::ostringstream display_type_string;
- auto gl_implementation = GetGLImplementationParts();
- display_type_string << GetGLImplementationGLName(gl_implementation);
- if (gl_implementation.gl == kGLImplementationEGLANGLE) {
- display_type_string << ":" << DisplayTypeString(display_type);
- }
-
- static auto* egl_display_type_key = base::debug::AllocateCrashKeyString(
- "egl-display-type", base::debug::CrashKeySize::Size32);
- base::debug::SetCrashKeyString(egl_display_type_key,
- display_type_string.str());
-
- UMA_HISTOGRAM_ENUMERATION("GPU.EGLDisplayType", display_type,
- DISPLAY_TYPE_MAX);
- gl_display->SetDisplay(egl_display);
- gl_display->display_type = display_type;
- break;
- }
-
- return gl_display;
-}
-
NativeViewGLSurfaceEGL::NativeViewGLSurfaceEGL(
GLDisplayEGL* display,
EGLNativeWindowType window,
@@ -1402,7 +387,8 @@ bool NativeViewGLSurfaceEGL::Initialize(GLSurfaceFormat format) {
format_ = format;
if (display_->GetDisplay() == EGL_NO_DISPLAY) {
- LOG(ERROR) << "Trying to create surface with invalid display.";
+ LOG(ERROR) << "Trying to create NativeViewGLSurfaceEGL with invalid "
+ << "display.";
return false;
}
@@ -1415,7 +401,8 @@ bool NativeViewGLSurfaceEGL::Initialize(GLSurfaceFormat format) {
std::vector<EGLint> egl_window_attributes;
- if (display_->egl_window_fixed_size_supported && enable_fixed_size_angle_) {
+ if (display_->ext->b_EGL_ANGLE_window_fixed_size &&
+ enable_fixed_size_angle_) {
egl_window_attributes.push_back(EGL_FIXED_SIZE_ANGLE);
egl_window_attributes.push_back(EGL_TRUE);
egl_window_attributes.push_back(EGL_WIDTH);
@@ -1424,12 +411,12 @@ bool NativeViewGLSurfaceEGL::Initialize(GLSurfaceFormat format) {
egl_window_attributes.push_back(size_.height());
}
- if (g_driver_egl.ext.b_EGL_NV_post_sub_buffer) {
+ if (display_->ext->b_EGL_NV_post_sub_buffer) {
egl_window_attributes.push_back(EGL_POST_SUB_BUFFER_SUPPORTED_NV);
egl_window_attributes.push_back(EGL_TRUE);
}
- if (display_->egl_surface_orientation_supported) {
+ if (display_->ext->b_EGL_ANGLE_surface_orientation) {
EGLint attrib;
eglGetConfigAttrib(display_->GetDisplay(), GetConfig(),
EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE, &attrib);
@@ -1450,7 +437,7 @@ bool NativeViewGLSurfaceEGL::Initialize(GLSurfaceFormat format) {
// Note that COLORSPACE_LINEAR refers to the sRGB color space, but
// without opting into sRGB blending. It is equivalent to
// COLORSPACE_SRGB with Disable(FRAMEBUFFER_SRGB).
- if (display_->egl_khr_colorspace) {
+ if (display_->ext->b_EGL_KHR_gl_colorspace) {
egl_window_attributes.push_back(EGL_GL_COLORSPACE_KHR);
egl_window_attributes.push_back(EGL_GL_COLORSPACE_LINEAR_KHR);
}
@@ -1464,15 +451,16 @@ bool NativeViewGLSurfaceEGL::Initialize(GLSurfaceFormat format) {
// with the P3 gamut instead of the the sRGB gamut.
// COLORSPACE_DISPLAY_P3_LINEAR has a linear transfer function, and is
// intended for use with 16-bit formats.
- bool p3_supported = display_->egl_ext_colorspace_display_p3 ||
- display_->egl_ext_colorspace_display_p3_passthrough;
- if (display_->egl_khr_colorspace && p3_supported) {
+ bool p3_supported =
+ display_->ext->b_EGL_EXT_gl_colorspace_display_p3 ||
+ display_->ext->b_EGL_EXT_gl_colorspace_display_p3_passthrough;
+ if (display_->ext->b_EGL_KHR_gl_colorspace && p3_supported) {
egl_window_attributes.push_back(EGL_GL_COLORSPACE_KHR);
// Chrome relied on incorrect Android behavior when dealing with P3 /
// framebuffer_srgb interactions. This behavior was fixed in Q, which
// causes invalid Chrome rendering. To achieve Android-P behavior in Q+,
// use EGL_GL_COLORSPACE_P3_PASSTHROUGH_EXT where possible.
- if (display_->egl_ext_colorspace_display_p3_passthrough) {
+ if (display_->ext->b_EGL_EXT_gl_colorspace_display_p3_passthrough) {
egl_window_attributes.push_back(
EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT);
} else {
@@ -1494,7 +482,7 @@ bool NativeViewGLSurfaceEGL::Initialize(GLSurfaceFormat format) {
return false;
}
- if (g_driver_egl.ext.b_EGL_NV_post_sub_buffer) {
+ if (display_->ext->b_EGL_NV_post_sub_buffer) {
EGLint surfaceVal;
EGLBoolean retVal =
eglQuerySurface(display_->GetDisplay(), surface_,
@@ -1503,7 +491,7 @@ bool NativeViewGLSurfaceEGL::Initialize(GLSurfaceFormat format) {
}
supports_swap_buffer_with_damage_ =
- g_driver_egl.ext.b_EGL_KHR_swap_buffers_with_damage;
+ display_->ext->b_EGL_KHR_swap_buffers_with_damage;
if (!vsync_provider_external_ &&
EGLSyncControlVSyncProvider::IsSupported(display_)) {
@@ -1520,11 +508,11 @@ bool NativeViewGLSurfaceEGL::Initialize(GLSurfaceFormat format) {
}
bool NativeViewGLSurfaceEGL::SupportsSwapTimestamps() const {
- return g_driver_egl.ext.b_EGL_ANDROID_get_frame_timestamps;
+ return display_->ext->b_EGL_ANDROID_get_frame_timestamps;
}
void NativeViewGLSurfaceEGL::SetEnableSwapTimestamps() {
- DCHECK(g_driver_egl.ext.b_EGL_ANDROID_get_frame_timestamps);
+ DCHECK(display_->ext->b_EGL_ANDROID_get_frame_timestamps);
// If frame timestamps are supported, set the proper attribute to enable the
// feature and then cache the timestamps supported by the underlying
@@ -2073,6 +1061,12 @@ PbufferGLSurfaceEGL::PbufferGLSurfaceEGL(GLDisplayEGL* display,
}
bool PbufferGLSurfaceEGL::Initialize(GLSurfaceFormat format) {
+ if (display_->GetDisplay() == EGL_NO_DISPLAY) {
+ LOG(ERROR) << "Trying to create PbufferGLSurfaceEGL with invalid "
+ << "display.";
+ return false;
+ }
+
EGLSurface old_surface = surface_;
#if BUILDFLAG(IS_ANDROID)
@@ -2098,7 +1092,7 @@ bool PbufferGLSurfaceEGL::Initialize(GLSurfaceFormat format) {
// Enable robust resource init when using SwANGLE
if (IsSoftwareGLImplementation(GetGLImplementationParts()) &&
- display_->IsRobustResourceInitSupported()) {
+ display_->ext->b_EGL_ANGLE_robust_resource_initialization) {
pbuffer_attribs.push_back(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE);
pbuffer_attribs.push_back(EGL_TRUE);
}
@@ -2186,10 +1180,10 @@ void* PbufferGLSurfaceEGL::GetShareHandle() {
NOTREACHED();
return nullptr;
#else
- if (!g_driver_egl.ext.b_EGL_ANGLE_query_surface_pointer)
+ if (!display_->ext->b_EGL_ANGLE_query_surface_pointer)
return nullptr;
- if (!g_driver_egl.ext.b_EGL_ANGLE_surface_d3d_texture_2d_share_handle)
+ if (!display_->ext->b_EGL_ANGLE_surface_d3d_texture_2d_share_handle)
return nullptr;
void* handle;
diff --git a/chromium/ui/gl/gl_surface_egl.h b/chromium/ui/gl/gl_surface_egl.h
index 8b244001238..31c94912b79 100644
--- a/chromium/ui/gl/gl_surface_egl.h
+++ b/chromium/ui/gl/gl_surface_egl.h
@@ -33,16 +33,6 @@ namespace gl {
class GLSurfacePresentationHelper;
-GL_EXPORT void GetEGLInitDisplays(bool supports_angle_d3d,
- bool supports_angle_opengl,
- bool supports_angle_null,
- bool supports_angle_vulkan,
- bool supports_angle_swiftshader,
- bool supports_angle_egl,
- bool supports_angle_metal,
- const base::CommandLine* command_line,
- std::vector<DisplayType>* init_displays);
-
// Interface for EGL surface.
class GL_EXPORT GLSurfaceEGL : public GLSurface {
public:
@@ -60,31 +50,12 @@ class GL_EXPORT GLSurfaceEGL : public GLSurface {
static GLDisplayEGL* GetGLDisplayEGL();
- // |system_device_id| specifies which GPU to use on a multi-GPU system.
- // If its value is 0, use the default GPU of the system.
- // Calling this functionm a second time on the same |system_device_id|
- // is a no-op and returns the same GLDisplayEGL.
- // TODO(https://crbug.com/1251724): This will be called once per display
- // when Chrome begins to support multi-gpu rendering.
- static GLDisplayEGL* InitializeOneOff(EGLDisplayPlatform native_display,
- uint64_t system_device_id);
- static GLDisplayEGL* InitializeOneOffForTesting();
- static bool InitializeExtensionSettingsOneOff(GLDisplayEGL* display);
- static void ShutdownOneOff(GLDisplayEGL* display);
- // |system_device_id| specifies which GPU to use on a multi-GPU system.
- // If its value is 0, use the default GPU of the system.
- static GLDisplayEGL* InitializeDisplay(EGLDisplayPlatform native_display,
- uint64_t system_device_id);
-
protected:
~GLSurfaceEGL() override;
EGLConfig config_ = nullptr;
GLSurfaceFormat format_;
raw_ptr<GLDisplayEGL> display_ = nullptr;
-
- private:
- static void InitializeOneOffCommon(GLDisplayEGL* display);
};
// Encapsulates an EGL surface bound to a view.
diff --git a/chromium/ui/gl/gl_surface_egl_surface_control.cc b/chromium/ui/gl/gl_surface_egl_surface_control.cc
index 1df4ac6ebdc..8c21d1cf402 100644
--- a/chromium/ui/gl/gl_surface_egl_surface_control.cc
+++ b/chromium/ui/gl/gl_surface_egl_surface_control.cc
@@ -521,7 +521,11 @@ void GLSurfaceEGLSurfaceControl::OnTransactionAckOnGpuThread(
// with no fence, since its not being released and so shouldn't be in
// |released_resources| either.
if (it == released_resources.end()) {
- DCHECK(!surface_stat.fence.is_valid());
+ // TODO(vasilyt): We used to DCHECK(!surface_stat.fence.is_valid()) here,
+ // but due to flinger behavior it doesn't hold. This seems to be a
+ // potential fligner bug. DCHECK is useful for catching resource
+ // life-time issues, so we should consider bringing it back when Android
+ // side will be fixed.
continue;
}
diff --git a/chromium/ui/gl/gl_surface_egl_unittest.cc b/chromium/ui/gl/gl_surface_egl_unittest.cc
index 9bbf088b498..7f80b9fca07 100644
--- a/chromium/ui/gl/gl_surface_egl_unittest.cc
+++ b/chromium/ui/gl/gl_surface_egl_unittest.cc
@@ -43,6 +43,11 @@ class GLSurfaceEGLTest : public testing::Test {
void TearDown() override { GLSurfaceTestSupport::ShutdownGL(display_); }
+ GLDisplay* GetTestDisplay() {
+ EXPECT_NE(display_, nullptr);
+ return display_;
+ }
+
private:
raw_ptr<GLDisplay> display_ = nullptr;
};
@@ -54,8 +59,8 @@ TEST_F(GLSurfaceEGLTest, MAYBE_SurfaceFormatTest) {
surface_format.SetDepthBits(24);
surface_format.SetStencilBits(8);
surface_format.SetSamples(0);
- scoped_refptr<GLSurface> surface =
- init::CreateOffscreenGLSurfaceWithFormat(gfx::Size(1, 1), surface_format);
+ scoped_refptr<GLSurface> surface = init::CreateOffscreenGLSurfaceWithFormat(
+ GetTestDisplay(), gfx::Size(1, 1), surface_format);
EGLConfig config = surface->GetConfig();
EXPECT_TRUE(config);
diff --git a/chromium/ui/gl/gl_surface_egl_x11_gles2.cc b/chromium/ui/gl/gl_surface_egl_x11_gles2.cc
index 41336623623..eebd999e31b 100644
--- a/chromium/ui/gl/gl_surface_egl_x11_gles2.cc
+++ b/chromium/ui/gl/gl_surface_egl_x11_gles2.cc
@@ -94,7 +94,7 @@ EGLConfig NativeViewGLSurfaceEGLX11GLES2::GetConfig() {
EGL_NONE};
config_attribs[kBufferSizeOffset] = geometry->depth;
- EGLDisplay display = GLSurfaceEGL::GetGLDisplayEGL()->GetHardwareDisplay();
+ EGLDisplay display = GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay();
x11::VisualId visual_id;
ui::XVisualManager::GetInstance()->ChooseVisualForWindow(
true, &visual_id, nullptr, nullptr, nullptr);
diff --git a/chromium/ui/gl/gl_surface_glx.cc b/chromium/ui/gl/gl_surface_glx.cc
index aad5e86c0d6..6dbbf7cdd48 100644
--- a/chromium/ui/gl/gl_surface_glx.cc
+++ b/chromium/ui/gl/gl_surface_glx.cc
@@ -10,6 +10,7 @@
#include "base/command_line.h"
#include "base/lazy_instance.h"
#include "base/logging.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/no_destructor.h"
#include "base/synchronization/atomic_flag.h"
@@ -329,7 +330,7 @@ class SGIVideoSyncProviderThreadShim {
private:
gfx::AcceleratedWidget parent_window_;
- SGIVideoSyncThread* vsync_thread_;
+ raw_ptr<SGIVideoSyncThread> vsync_thread_;
x11::Window window_ = x11::Window::None;
GLXWindow glx_window_;
@@ -409,8 +410,8 @@ class SGIVideoSyncVSyncProvider
// Raw pointers to sync primitives owned by the shim_.
// These will only be referenced before we post a task to destroy
// the shim_, so they are safe to access.
- base::AtomicFlag* cancel_vsync_flag_;
- base::Lock* vsync_lock_;
+ raw_ptr<base::AtomicFlag> cancel_vsync_flag_;
+ raw_ptr<base::Lock> vsync_lock_;
};
SGIVideoSyncThread* SGIVideoSyncThread::g_video_sync_thread = nullptr;
diff --git a/chromium/ui/gl/gl_surface_glx.h b/chromium/ui/gl/gl_surface_glx.h
index 6101d82120b..67dea271149 100644
--- a/chromium/ui/gl/gl_surface_glx.h
+++ b/chromium/ui/gl/gl_surface_glx.h
@@ -10,6 +10,7 @@
#include <memory>
#include <string>
+#include "base/memory/raw_ptr.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/x/event.h"
@@ -66,7 +67,7 @@ class GL_EXPORT GLSurfaceGLX : public GLSurface {
private:
static bool initialized_;
- GLDisplayX11* display_;
+ raw_ptr<GLDisplayX11> display_;
};
// A surface used to render to a view.
diff --git a/chromium/ui/gl/gl_switches.cc b/chromium/ui/gl/gl_switches.cc
index 212594894cd..b6c048dc3cf 100644
--- a/chromium/ui/gl/gl_switches.cc
+++ b/chromium/ui/gl/gl_switches.cc
@@ -5,6 +5,7 @@
#include "ui/gl/gl_switches.h"
#include "build/build_config.h"
+#include "ui/gl/gl_display_manager.h"
#if BUILDFLAG(IS_ANDROID)
#include "base/android/build_info.h"
@@ -231,6 +232,12 @@ const base::FeatureParam<int> kVerifyDrawOffsetX{
const base::FeatureParam<int> kVerifyDrawOffsetY{
&kDirectCompositionVerifyDrawOffset, "verify_draw_offset_y", 0};
+// Allow dual GPU rendering through EGL where supported, i.e., allow a WebGL
+// or WebGPU context to be on the high performance GPU if preferred and Chrome
+// internal rendering to be on the low power GPU.
+const base::Feature kEGLDualGpuRendering{"EGLDualGpuRendering",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+
// Allow overlay swapchain to use Intel video processor for super resolution.
const base::Feature kIntelVpSuperResolution{"IntelVpSuperResolution",
base::FEATURE_DISABLED_BY_DEFAULT};
@@ -268,4 +275,29 @@ bool IsDefaultANGLEVulkan() {
return base::FeatureList::IsEnabled(kDefaultANGLEVulkan);
}
+// Use waitable swap chain on Windows to reduce display latency.
+const base::Feature kDXGIWaitableSwapChain{"DXGIWaitableSwapChain",
+ base::FEATURE_DISABLED_BY_DEFAULT};
+
+// If using waitable swap chain, specify the maximum number of queued frames.
+const base::FeatureParam<int> kDXGIWaitableSwapChainMaxQueuedFrames{
+ &kDXGIWaitableSwapChain, "DXGIWaitableSwapChainMaxQueuedFrames", 2};
+
+bool SupportsEGLDualGpuRendering() {
+#if defined(USE_EGL) && (BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC))
+ gl::GLDisplayEGL* display_default =
+ gl::GLDisplayManagerEGL::GetInstance()->GetDisplay(
+ gl::GpuPreference::kDefault);
+ DCHECK(display_default);
+ gl::GLDisplayEGL* display_high_performance =
+ gl::GLDisplayManagerEGL::GetInstance()->GetDisplay(
+ gl::GpuPreference::kHighPerformance);
+ if (!display_high_performance || display_default == display_high_performance)
+ return false;
+ return base::FeatureList::IsEnabled(kEGLDualGpuRendering);
+#else
+ return false;
+#endif // USE_EGL && (IS_WIN || IS_MAC)
+}
+
} // namespace features
diff --git a/chromium/ui/gl/gl_switches.h b/chromium/ui/gl/gl_switches.h
index 466650f6f69..e476bde7c2d 100644
--- a/chromium/ui/gl/gl_switches.h
+++ b/chromium/ui/gl/gl_switches.h
@@ -101,15 +101,21 @@ GL_EXPORT extern const base::Feature kDirectCompositionVerifyDrawOffset;
GL_EXPORT extern const base::FeatureParam<int> kVerifyDrawOffsetX;
GL_EXPORT extern const base::FeatureParam<int> kVerifyDrawOffsetY;
GL_EXPORT extern const base::Feature kDirectCompositionSoftwareOverlays;
+GL_EXPORT extern const base::Feature kEGLDualGpuRendering;
GL_EXPORT extern const base::Feature kIntelVpSuperResolution;
GL_EXPORT extern const base::Feature kDefaultANGLEOpenGL;
GL_EXPORT extern const base::Feature kDefaultANGLEMetal;
GL_EXPORT extern const base::Feature kDefaultANGLEVulkan;
GL_EXPORT extern const base::Feature kTrackCurrentShaders;
GL_EXPORT extern const base::Feature kVulkanFromANGLE;
+GL_EXPORT extern const base::Feature kDXGIWaitableSwapChain;
+GL_EXPORT extern const base::FeatureParam<int>
+ kDXGIWaitableSwapChainMaxQueuedFrames;
GL_EXPORT bool IsDefaultANGLEVulkan();
+GL_EXPORT bool SupportsEGLDualGpuRendering();
+
} // namespace features
#endif // UI_GL_GL_SWITCHES_H_
diff --git a/chromium/ui/gl/gl_utils.cc b/chromium/ui/gl/gl_utils.cc
index c98a7cd002a..a14b13ed56c 100644
--- a/chromium/ui/gl/gl_utils.cc
+++ b/chromium/ui/gl/gl_utils.cc
@@ -28,7 +28,7 @@
#include <d3d11_1.h>
#include "base/strings/stringprintf.h"
#include "media/base/win/mf_helpers.h"
-#include "ui/gl/direct_composition_surface_win.h"
+#include "ui/gl/direct_composition_support.h"
#endif
namespace gl {
@@ -104,11 +104,11 @@ bool PassthroughCommandDecoderSupported() {
GLDisplayEGL* display = gl::GLSurfaceEGL::GetGLDisplayEGL();
// Using the passthrough command buffer requires that specific ANGLE
// extensions are exposed
- return display->IsCreateContextBindGeneratesResourceSupported() &&
- display->IsCreateContextWebGLCompatabilitySupported() &&
- display->IsRobustResourceInitSupported() &&
- display->IsDisplayTextureShareGroupSupported() &&
- display->IsCreateContextClientArraysSupported();
+ return display->ext->b_EGL_CHROMIUM_create_context_bind_generates_resource &&
+ display->ext->b_EGL_ANGLE_create_context_webgl_compatibility &&
+ display->ext->b_EGL_ANGLE_robust_resource_initialization &&
+ display->ext->b_EGL_ANGLE_display_texture_share_group &&
+ display->ext->b_EGL_ANGLE_create_context_client_arrays;
#else
// The passthrough command buffer is only supported on top of ANGLE/EGL
return false;
@@ -116,11 +116,6 @@ bool PassthroughCommandDecoderSupported() {
}
#if BUILDFLAG(IS_WIN)
-// This function is thread safe.
-bool AreOverlaysSupportedWin() {
- return gl::DirectCompositionSurfaceWin::AreOverlaysSupported();
-}
-
unsigned int FrameRateToPresentDuration(float frame_rate) {
if (frame_rate == 0)
return 0u;
@@ -128,10 +123,6 @@ unsigned int FrameRateToPresentDuration(float frame_rate) {
return static_cast<unsigned int>(1.0E7 / frame_rate);
}
-UINT GetOverlaySupportFlags(DXGI_FORMAT format) {
- return gl::DirectCompositionSurfaceWin::GetOverlaySupportFlags(format);
-}
-
unsigned int DirectCompositionRootSurfaceBufferCount() {
return base::FeatureList::IsEnabled(features::kDCompTripleBufferRootSwapChain)
? 3u
@@ -145,8 +136,8 @@ bool ShouldForceDirectCompositionRootSurfaceFullDamage() {
switches::kDirectCompositionForceFullDamageForTesting)) {
return true;
}
- UINT brga_flags = DirectCompositionSurfaceWin::GetOverlaySupportFlags(
- DXGI_FORMAT_B8G8R8A8_UNORM);
+ UINT brga_flags =
+ GetDirectCompositionOverlaySupportFlags(DXGI_FORMAT_B8G8R8A8_UNORM);
constexpr UINT kSupportBits =
DXGI_OVERLAY_SUPPORT_FLAG_DIRECT | DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
if ((brga_flags & kSupportBits) == 0)
@@ -198,6 +189,23 @@ void LabelSwapChainAndBuffers(IDXGISwapChain* swap_chain,
}
#endif // BUILDFLAG(IS_WIN)
+GLDisplay* GetDisplay(GpuPreference gpu_preference) {
+#if defined(USE_GLX)
+ if (!GLDisplayManagerX11::GetInstance()->IsEmpty()) {
+ return GLDisplayManagerX11::GetInstance()->GetDisplay(gpu_preference);
+ }
+#endif
+#if defined(USE_EGL)
+ return GLDisplayManagerEGL::GetInstance()->GetDisplay(gpu_preference);
+#endif
+ NOTREACHED();
+ return nullptr;
+}
+
+GLDisplay* GetDefaultDisplay() {
+ return GetDisplay(GpuPreference::kDefault);
+}
+
#if defined(USE_EGL)
void SetGpuPreferenceEGL(GpuPreference preference, uint64_t system_device_id) {
GLDisplayManagerEGL::GetInstance()->SetGpuPreference(preference,
@@ -208,6 +216,10 @@ GLDisplayEGL* GetDefaultDisplayEGL() {
return GLDisplayManagerEGL::GetInstance()->GetDisplay(
GpuPreference::kDefault);
}
+
+GLDisplayEGL* GetDisplayEGL(uint64_t system_device_id) {
+ return GLDisplayManagerEGL::GetInstance()->GetDisplay(system_device_id);
+}
#endif // USE_EGL
#if defined(USE_GLX)
diff --git a/chromium/ui/gl/gl_utils.h b/chromium/ui/gl/gl_utils.h
index 05bd69c0cc5..3b2f82dee6b 100644
--- a/chromium/ui/gl/gl_utils.h
+++ b/chromium/ui/gl/gl_utils.h
@@ -8,6 +8,7 @@
#define UI_GL_GL_UTILS_H_
#include "base/command_line.h"
+#include "base/memory/raw_ptr.h"
#include "build/build_config.h"
#include "ui/gl/gl_export.h"
#include "ui/gl/gpu_preference.h"
@@ -28,6 +29,7 @@ class GLDisplayEGL;
#if defined(USE_GLX)
class GLDisplayX11;
#endif // USE_GLX
+class GLDisplay;
GL_EXPORT void Crash();
GL_EXPORT void Hang();
@@ -42,13 +44,9 @@ GL_EXPORT bool UsePassthroughCommandDecoder(
GL_EXPORT bool PassthroughCommandDecoderSupported();
#if BUILDFLAG(IS_WIN)
-GL_EXPORT bool AreOverlaysSupportedWin();
-
// Calculates present during in 100 ns from number of frames per second.
GL_EXPORT unsigned int FrameRateToPresentDuration(float frame_rate);
-GL_EXPORT UINT GetOverlaySupportFlags(DXGI_FORMAT format);
-
// BufferCount for the root surface swap chain.
GL_EXPORT unsigned int DirectCompositionRootSurfaceBufferCount();
@@ -76,8 +74,19 @@ void LabelSwapChainBuffers(IDXGISwapChain* swap_chain, const char* name_prefix);
GL_EXPORT void SetGpuPreferenceEGL(GpuPreference preference,
uint64_t system_device_id);
+// Query the default GLDisplay. May return either a GLDisplayEGL or
+// GLDisplayX11.
+GL_EXPORT GLDisplay* GetDefaultDisplay();
+
+// Query the GLDisplay by |gpu_preference|. May return either a GLDisplayEGL or
+// GLDisplayX11.
+GL_EXPORT GLDisplay* GetDisplay(GpuPreference gpu_preference);
+
// Query the default GLDisplayEGL.
GL_EXPORT GLDisplayEGL* GetDefaultDisplayEGL();
+
+// Query the GLDisplayEGL by |system_device_id|.
+GL_EXPORT GLDisplayEGL* GetDisplayEGL(uint64_t system_device_id);
#endif // USE_EGL
#if defined(USE_GLX)
@@ -106,7 +115,7 @@ class GL_EXPORT ScopedEnableTextureRectangleInShaderCompiler {
~ScopedEnableTextureRectangleInShaderCompiler();
private:
- gl::GLApi* gl_api_;
+ raw_ptr<gl::GLApi> gl_api_;
#endif
};
diff --git a/chromium/ui/gl/glx_util.cc b/chromium/ui/gl/glx_util.cc
index c7c17d68b34..da68dcf2816 100644
--- a/chromium/ui/gl/glx_util.cc
+++ b/chromium/ui/gl/glx_util.cc
@@ -4,8 +4,13 @@
#include "ui/gl/glx_util.h"
+#include <unistd.h>
+
#include "base/compiler_specific.h"
#include "base/logging.h"
+#include "base/posix/eintr_wrapper.h"
+#include "ui/gfx/linux/native_pixmap_dmabuf.h"
+#include "ui/gfx/x/dri3.h"
#include "ui/gfx/x/future.h"
#include "ui/gfx/x/glx.h"
#include "ui/gl/gl_bindings.h"
@@ -63,8 +68,62 @@ x11::Glx::FbConfig GetConfigForWindow(x11::Connection* conn,
return {};
}
+int Depth(gfx::BufferFormat format) {
+ switch (format) {
+ case gfx::BufferFormat::BGR_565:
+ return 16;
+ case gfx::BufferFormat::BGRX_8888:
+ return 24;
+ case gfx::BufferFormat::BGRA_1010102:
+ case gfx::BufferFormat::BGRA_8888:
+ return 32;
+ default:
+ NOTREACHED();
+ return 0;
+ }
+}
+
+int Bpp(gfx::BufferFormat format) {
+ switch (format) {
+ case gfx::BufferFormat::BGR_565:
+ return 16;
+ case gfx::BufferFormat::BGRX_8888:
+ case gfx::BufferFormat::BGRA_1010102:
+ case gfx::BufferFormat::BGRA_8888:
+ return 32;
+ default:
+ NOTREACHED();
+ return 0;
+ }
+}
+
} // namespace
+x11::Pixmap XPixmapFromNativePixmap(
+ const gfx::NativePixmapDmaBuf& native_pixmap,
+ gfx::BufferFormat buffer_format) {
+ int depth = Depth(buffer_format);
+ int bpp = Bpp(buffer_format);
+ auto fd = HANDLE_EINTR(dup(native_pixmap.GetDmaBufFd(0)));
+ if (fd < 0)
+ return x11::Pixmap::None;
+ x11::RefCountedFD ref_counted_fd(fd);
+
+ auto* connection = x11::Connection::Get();
+ x11::Pixmap pixmap_id = connection->GenerateId<x11::Pixmap>();
+ // This should be synced. Otherwise, glXCreatePixmap may fail on ChromeOS
+ // with "failed to create a drawable" error.
+ connection->dri3()
+ .PixmapFromBuffer(pixmap_id, connection->default_root(),
+ native_pixmap.GetDmaBufPlaneSize(0),
+ native_pixmap.GetBufferSize().width(),
+ native_pixmap.GetBufferSize().height(),
+ native_pixmap.GetDmaBufPitch(0), depth, bpp,
+ ref_counted_fd)
+ .Sync();
+ return pixmap_id;
+}
+
GLXFBConfig GetFbConfigForWindow(x11::Connection* connection,
x11::Window window) {
return GetGlxFbConfigForXProtoFbConfig(
diff --git a/chromium/ui/gl/glx_util.h b/chromium/ui/gl/glx_util.h
index 92f39c0bbac..a2561e31bd0 100644
--- a/chromium/ui/gl/glx_util.h
+++ b/chromium/ui/gl/glx_util.h
@@ -11,6 +11,11 @@
using GLXFBConfig = struct __GLXFBConfigRec*;
+namespace gfx {
+class NativePixmapDmaBuf;
+enum class BufferFormat;
+} // namespace gfx
+
namespace gl {
GL_EXPORT GLXFBConfig GetFbConfigForWindow(x11::Connection* connection,
@@ -20,6 +25,10 @@ GL_EXPORT GLXFBConfig
GetGlxFbConfigForXProtoFbConfig(x11::Connection* connection,
x11::Glx::FbConfig xproto_config);
+GL_EXPORT x11::Pixmap XPixmapFromNativePixmap(
+ const gfx::NativePixmapDmaBuf& native_pixmap,
+ gfx::BufferFormat buffer_format);
+
} // namespace gl
#endif // UI_GL_GLX_UTIL_H_
diff --git a/chromium/ui/gl/gpu_switching_manager.cc b/chromium/ui/gl/gpu_switching_manager.cc
index 136e2769c40..c6b2e0da5f5 100644
--- a/chromium/ui/gl/gpu_switching_manager.cc
+++ b/chromium/ui/gl/gpu_switching_manager.cc
@@ -13,9 +13,9 @@ GpuSwitchingManager* GpuSwitchingManager::GetInstance() {
return base::Singleton<GpuSwitchingManager>::get();
}
-GpuSwitchingManager::GpuSwitchingManager() {}
+GpuSwitchingManager::GpuSwitchingManager() = default;
-GpuSwitchingManager::~GpuSwitchingManager() {}
+GpuSwitchingManager::~GpuSwitchingManager() = default;
void GpuSwitchingManager::AddObserver(GpuSwitchingObserver* observer) {
observer_list_.AddObserver(observer);
diff --git a/chromium/ui/gl/gpu_switching_manager.h b/chromium/ui/gl/gpu_switching_manager.h
index caaea0db9b8..a0d9a931846 100644
--- a/chromium/ui/gl/gpu_switching_manager.h
+++ b/chromium/ui/gl/gpu_switching_manager.h
@@ -13,7 +13,8 @@
#include "ui/gl/gpu_switching_observer.h"
namespace ui {
-
+// GpuSwitchingManager is not thread safe. It is running on the browser main
+// thread in the browser and/or on the gpu main thread in the GPU process.
class GL_EXPORT GpuSwitchingManager {
public:
// Getter for the singleton. This will return NULL on failure.
diff --git a/chromium/ui/gl/gpu_switching_observer.h b/chromium/ui/gl/gpu_switching_observer.h
index 6c921883d4d..2920abef2fb 100644
--- a/chromium/ui/gl/gpu_switching_observer.h
+++ b/chromium/ui/gl/gpu_switching_observer.h
@@ -12,6 +12,8 @@ namespace ui {
class GL_EXPORT GpuSwitchingObserver {
public:
+ virtual ~GpuSwitchingObserver() = default;
+
// Called for any observer when the system switches to a different GPU.
virtual void OnGpuSwitched(gl::GpuPreference active_gpu_heuristic) {}
diff --git a/chromium/ui/gl/hdr_metadata_helper_win.cc b/chromium/ui/gl/hdr_metadata_helper_win.cc
index d09e5b6d7b5..80b63e0463a 100644
--- a/chromium/ui/gl/hdr_metadata_helper_win.cc
+++ b/chromium/ui/gl/hdr_metadata_helper_win.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "ui/gl/hdr_metadata_helper_win.h"
+#include "ui/gl/gpu_switching_manager.h"
namespace {
@@ -19,9 +20,12 @@ HDRMetadataHelperWin::HDRMetadataHelperWin(
Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device)
: d3d11_device_(std::move(d3d11_device)) {
UpdateDisplayMetadata();
+ ui::GpuSwitchingManager::GetInstance()->AddObserver(this);
}
-HDRMetadataHelperWin::~HDRMetadataHelperWin() = default;
+HDRMetadataHelperWin::~HDRMetadataHelperWin() {
+ ui::GpuSwitchingManager::GetInstance()->RemoveObserver(this);
+}
absl::optional<DXGI_HDR_METADATA_HDR10>
HDRMetadataHelperWin::GetDisplayMetadata() {
@@ -131,4 +135,11 @@ DXGI_HDR_METADATA_HDR10 HDRMetadataHelperWin::HDRMetadataToDXGI(
return metadata;
}
+void HDRMetadataHelperWin::OnDisplayAdded() {
+ UpdateDisplayMetadata();
+}
+
+void HDRMetadataHelperWin::OnDisplayRemoved() {
+ UpdateDisplayMetadata();
+}
} // namespace gl
diff --git a/chromium/ui/gl/hdr_metadata_helper_win.h b/chromium/ui/gl/hdr_metadata_helper_win.h
index 0551518620a..6d1277c53a0 100644
--- a/chromium/ui/gl/hdr_metadata_helper_win.h
+++ b/chromium/ui/gl/hdr_metadata_helper_win.h
@@ -12,13 +12,14 @@
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/hdr_metadata.h"
#include "ui/gl/gl_export.h"
+#include "ui/gl/gpu_switching_observer.h"
namespace gl {
// This is a very hacky way to get the display characteristics.
// It should be replaced by something that actually knows which
// display is going to be used for, well, display.
-class GL_EXPORT HDRMetadataHelperWin {
+class GL_EXPORT HDRMetadataHelperWin : ui::GpuSwitchingObserver {
public:
explicit HDRMetadataHelperWin(
Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device);
@@ -26,7 +27,7 @@ class GL_EXPORT HDRMetadataHelperWin {
HDRMetadataHelperWin(const HDRMetadataHelperWin&) = delete;
HDRMetadataHelperWin& operator=(const HDRMetadataHelperWin&) = delete;
- ~HDRMetadataHelperWin();
+ ~HDRMetadataHelperWin() override;
// Return the metadata for the display, if available. Must call
// UpdateDisplayMetadata first.
@@ -40,6 +41,10 @@ class GL_EXPORT HDRMetadataHelperWin {
static DXGI_HDR_METADATA_HDR10 HDRMetadataToDXGI(
const gfx::HDRMetadata& hdr_metadata);
+ // Implements GpuSwitchingObserver
+ void OnDisplayAdded() override;
+ void OnDisplayRemoved() override;
+
private:
Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device_;
absl::optional<DXGI_HDR_METADATA_HDR10> hdr_metadata_;
diff --git a/chromium/ui/gl/init/create_gr_gl_interface.cc b/chromium/ui/gl/init/create_gr_gl_interface.cc
index ccc5597b8fe..7c9cc0cac0a 100644
--- a/chromium/ui/gl/init/create_gr_gl_interface.cc
+++ b/chromium/ui/gl/init/create_gr_gl_interface.cc
@@ -11,7 +11,9 @@
#include "base/traits_bag.h"
#include "build/build_config.h"
#include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_display.h"
#include "ui/gl/gl_implementation.h"
+#include "ui/gl/gl_utils.h"
#include "ui/gl/gl_version_info.h"
#include "ui/gl/progress_reporter.h"
@@ -19,8 +21,7 @@
#include "base/mac/mac_util.h"
#endif
-namespace gl {
-namespace init {
+namespace gl::init {
// This code emulates GL fences (GL_APPLE_sync or GL_ARB_sync) via
// EGL_KHR_fence_sync extension. It's used to provide Skia ways of
@@ -81,7 +82,7 @@ void glWaitSyncEmulateEGL(GLsync sync, GLbitfield flags, GLuint64 timeout) {
DCHECK(timeout == GL_TIMEOUT_IGNORED);
DCHECK(flags == 0);
- if (!g_driver_egl.ext.b_EGL_KHR_wait_sync) {
+ if (!GetDefaultDisplayEGL()->ext->b_EGL_KHR_wait_sync) {
eglClientWaitSyncKHR(data->display, data->sync, 0, EGL_FOREVER_KHR);
return;
}
@@ -297,8 +298,8 @@ sk_sp<GrGLInterface> CreateGrGLInterface(
gl->gl##chrome_name##Fn, progress_reporter, version_info.is_angle)
#define BIND(fname, ...) BIND_EXTENSION(fname, fname, __VA_ARGS__)
- GrGLInterface* interface = new GrGLInterface();
- GrGLInterface::Functions* functions = &interface->fFunctions;
+ GrGLInterface* gl_interface = new GrGLInterface();
+ GrGLInterface::Functions* functions = &gl_interface->fFunctions;
BIND(ActiveTexture);
BIND(AttachShader);
BIND(BindAttribLocation);
@@ -323,6 +324,7 @@ sk_sp<GrGLInterface> CreateGrGLInterface(
BIND(CompileShader, Slow);
BIND(CompressedTexImage2D, Slow, NeedFlushOnMac);
BIND(CompressedTexSubImage2D, Slow);
+ BIND(CopyBufferSubData);
BIND(CopyTexSubImage2D, Slow);
#if BUILDFLAG(IS_APPLE)
functions->fCreateProgram = [func = gl->glCreateProgramFn]() {
@@ -717,13 +719,16 @@ sk_sp<GrGLInterface> CreateGrGLInterface(
if (!gl->glFenceSyncFn) {
// NOTE: Skia uses the same function pointers without APPLE suffix
+#if !defined(USE_EGL)
if (extensions.has("GL_APPLE_sync")) {
BIND_EXTENSION(FenceSync, FenceSyncAPPLE);
BIND_EXTENSION(IsSync, IsSyncAPPLE);
BIND_EXTENSION(ClientWaitSync, ClientWaitSyncAPPLE);
BIND_EXTENSION(WaitSync, WaitSyncAPPLE);
BIND_EXTENSION(DeleteSync, DeleteSyncAPPLE);
- } else if (g_driver_egl.ext.b_EGL_KHR_fence_sync) {
+ }
+#else
+ if (GetDefaultDisplayEGL()->ext->b_EGL_KHR_fence_sync) {
// Emulate APPLE_sync via egl
extensions.add("GL_APPLE_sync");
@@ -733,6 +738,7 @@ sk_sp<GrGLInterface> CreateGrGLInterface(
functions->fWaitSync = glWaitSyncEmulateEGL;
functions->fDeleteSync = glDeleteSyncEmulateEGL;
}
+#endif // USE_EGL
} else if (use_version_es2) {
// We have gl sync, but want to Skia use ES2 that doesn't have fences.
// To provide Skia with ways of sync to prevent it calling glFinish we set
@@ -752,11 +758,10 @@ sk_sp<GrGLInterface> CreateGrGLInterface(
#undef BIND
#undef BIND_EXTENSION
- interface->fStandard = standard;
- interface->fExtensions.swap(&extensions);
- sk_sp<GrGLInterface> returned(interface);
+ gl_interface->fStandard = standard;
+ gl_interface->fExtensions.swap(&extensions);
+ sk_sp<GrGLInterface> returned(gl_interface);
return returned;
}
-} // namespace init
-} // namespace gl
+} // namespace gl::init
diff --git a/chromium/ui/gl/init/gl_factory.cc b/chromium/ui/gl/init/gl_factory.cc
index 70fdfb35573..68afa643508 100644
--- a/chromium/ui/gl/init/gl_factory.cc
+++ b/chromium/ui/gl/init/gl_factory.cc
@@ -15,7 +15,6 @@
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
-#include "ui/gl/gl_display_manager.h"
#include "ui/gl/gl_share_group.h"
#include "ui/gl/gl_surface.h"
#include "ui/gl/gl_utils.h"
@@ -154,8 +153,7 @@ GLDisplay* InitializeGLOneOff(uint64_t system_device_id) {
if (!InitializeStaticGLBindingsOneOff())
return nullptr;
if (GetGLImplementation() == kGLImplementationDisabled) {
- return GLDisplayManagerEGL::GetInstance()->GetDisplay(
- GpuPreference::kDefault);
+ return GetDefaultDisplayEGL();
}
return InitializeGLOneOffPlatformHelper(true, system_device_id);
@@ -169,8 +167,7 @@ GLDisplay* InitializeGLNoExtensionsOneOff(bool init_bindings,
if (!InitializeStaticGLBindingsOneOff())
return nullptr;
if (GetGLImplementation() == kGLImplementationDisabled) {
- return GLDisplayManagerEGL::GetInstance()->GetDisplay(
- GpuPreference::kDefault);
+ return GetDefaultDisplayEGL();
}
}
@@ -251,8 +248,9 @@ void ShutdownGL(GLDisplay* display, bool due_to_fallback) {
SetGLImplementation(kGLImplementationNone);
}
-scoped_refptr<GLSurface> CreateOffscreenGLSurface(const gfx::Size& size) {
- return CreateOffscreenGLSurfaceWithFormat(size, GLSurfaceFormat());
+scoped_refptr<GLSurface> CreateOffscreenGLSurface(gl::GLDisplay* display,
+ const gfx::Size& size) {
+ return CreateOffscreenGLSurfaceWithFormat(display, size, GLSurfaceFormat());
}
void DisableANGLE() {
diff --git a/chromium/ui/gl/init/gl_factory.h b/chromium/ui/gl/init/gl_factory.h
index 218f4d9bfaa..581a7adc12e 100644
--- a/chromium/ui/gl/init/gl_factory.h
+++ b/chromium/ui/gl/init/gl_factory.h
@@ -91,6 +91,7 @@ GL_INIT_EXPORT scoped_refptr<GLContext> CreateGLContext(
// Creates a GL surface that renders directly to a view.
GL_INIT_EXPORT scoped_refptr<GLSurface> CreateViewGLSurface(
+ GLDisplay* display,
gfx::AcceleratedWidget window);
#if defined(USE_OZONE)
@@ -99,15 +100,19 @@ GL_INIT_EXPORT scoped_refptr<GLSurface> CreateViewGLSurface(
// be presented as an overlay. If surfaceless mode is not supported or
// enabled it will return a null pointer.
GL_INIT_EXPORT scoped_refptr<GLSurface> CreateSurfacelessViewGLSurface(
+ GLDisplay* display,
gfx::AcceleratedWidget window);
#endif // defined(USE_OZONE)
// Creates a GL surface used for offscreen rendering.
GL_INIT_EXPORT scoped_refptr<GLSurface> CreateOffscreenGLSurface(
+ GLDisplay* display,
const gfx::Size& size);
GL_INIT_EXPORT scoped_refptr<GLSurface> CreateOffscreenGLSurfaceWithFormat(
- const gfx::Size& size, GLSurfaceFormat format);
+ GLDisplay* display,
+ const gfx::Size& size,
+ GLSurfaceFormat format);
// Set platform dependent disabled extensions and re-initialize extension
// bindings.
diff --git a/chromium/ui/gl/init/gl_factory_android.cc b/chromium/ui/gl/init/gl_factory_android.cc
index c508a04ea34..1816ea7a3e3 100644
--- a/chromium/ui/gl/init/gl_factory_android.cc
+++ b/chromium/ui/gl/init/gl_factory_android.cc
@@ -116,7 +116,8 @@ scoped_refptr<GLContext> CreateGLContext(GLShareGroup* share_group,
}
}
-scoped_refptr<GLSurface> CreateViewGLSurface(gfx::AcceleratedWidget window) {
+scoped_refptr<GLSurface> CreateViewGLSurface(GLDisplay* display,
+ gfx::AcceleratedWidget window) {
TRACE_EVENT0("gpu", "gl::init::CreateViewGLSurface");
CHECK_NE(kGLImplementationNone, GetGLImplementation());
switch (GetGLImplementation()) {
@@ -124,7 +125,7 @@ scoped_refptr<GLSurface> CreateViewGLSurface(gfx::AcceleratedWidget window) {
case kGLImplementationEGLANGLE:
if (window != gfx::kNullAcceleratedWidget) {
return InitializeGLSurface(new NativeViewGLSurfaceEGL(
- GLSurfaceEGL::GetGLDisplayEGL(), window, nullptr));
+ display->GetAs<gl::GLDisplayEGL>(), window, nullptr));
} else {
return InitializeGLSurface(new GLSurfaceStub());
}
@@ -135,20 +136,22 @@ scoped_refptr<GLSurface> CreateViewGLSurface(gfx::AcceleratedWidget window) {
}
scoped_refptr<GLSurface> CreateOffscreenGLSurfaceWithFormat(
- const gfx::Size& size, GLSurfaceFormat format) {
+ GLDisplay* display,
+ const gfx::Size& size,
+ GLSurfaceFormat format) {
TRACE_EVENT0("gpu", "gl::init::CreateOffscreenGLSurface");
CHECK_NE(kGLImplementationNone, GetGLImplementation());
switch (GetGLImplementation()) {
case kGLImplementationEGLGLES2:
case kGLImplementationEGLANGLE: {
- if (GLSurfaceEGL::GetGLDisplayEGL()->IsEGLSurfacelessContextSupported() &&
+ GLDisplayEGL* display_egl = display->GetAs<gl::GLDisplayEGL>();
+ if (display_egl->IsEGLSurfacelessContextSupported() &&
(size.width() == 0 && size.height() == 0)) {
return InitializeGLSurfaceWithFormat(
- new SurfacelessEGL(GLSurfaceEGL::GetGLDisplayEGL(), size), format);
+ new SurfacelessEGL(display_egl, size), format);
} else {
return InitializeGLSurfaceWithFormat(
- new PbufferGLSurfaceEGL(GLSurfaceEGL::GetGLDisplayEGL(), size),
- format);
+ new PbufferGLSurfaceEGL(display_egl, size), format);
}
}
case kGLImplementationMockGL:
diff --git a/chromium/ui/gl/init/gl_factory_mac.cc b/chromium/ui/gl/init/gl_factory_mac.cc
index 4de2742adbc..e308645d2d7 100644
--- a/chromium/ui/gl/init/gl_factory_mac.cc
+++ b/chromium/ui/gl/init/gl_factory_mac.cc
@@ -66,7 +66,6 @@ std::vector<GLImplementationParts> GetAllowedGLImplementations() {
impls.emplace_back(
GLImplementationParts(kGLImplementationDesktopGLCoreProfile));
impls.emplace_back(GLImplementationParts(kGLImplementationDesktopGL));
- impls.emplace_back(GLImplementationParts(kGLImplementationAppleGL));
#if defined(USE_EGL)
impls.emplace_back(GLImplementationParts(kGLImplementationEGLGLES2));
impls.emplace_back(GLImplementationParts(kGLImplementationEGLANGLE));
@@ -86,7 +85,6 @@ scoped_refptr<GLContext> CreateGLContext(GLShareGroup* share_group,
switch (GetGLImplementation()) {
case kGLImplementationDesktopGL:
case kGLImplementationDesktopGLCoreProfile:
- case kGLImplementationAppleGL:
return InitializeGLContext(new GLContextCGL(share_group),
compatible_surface, attribs);
#if defined(USE_EGL)
@@ -109,12 +107,12 @@ scoped_refptr<GLContext> CreateGLContext(GLShareGroup* share_group,
}
}
-scoped_refptr<GLSurface> CreateViewGLSurface(gfx::AcceleratedWidget window) {
+scoped_refptr<GLSurface> CreateViewGLSurface(GLDisplay* display,
+ gfx::AcceleratedWidget window) {
TRACE_EVENT0("gpu", "gl::init::CreateViewGLSurface");
switch (GetGLImplementation()) {
case kGLImplementationDesktopGL:
case kGLImplementationDesktopGLCoreProfile:
- case kGLImplementationAppleGL:
case kGLImplementationEGLGLES2:
case kGLImplementationEGLANGLE: {
NOTIMPLEMENTED() << "No onscreen support on Mac.";
@@ -130,26 +128,28 @@ scoped_refptr<GLSurface> CreateViewGLSurface(gfx::AcceleratedWidget window) {
}
scoped_refptr<GLSurface> CreateOffscreenGLSurfaceWithFormat(
- const gfx::Size& size, GLSurfaceFormat format) {
+ GLDisplay* display,
+ const gfx::Size& size,
+ GLSurfaceFormat format) {
TRACE_EVENT0("gpu", "gl::init::CreateOffscreenGLSurface");
switch (GetGLImplementation()) {
case kGLImplementationDesktopGL:
case kGLImplementationDesktopGLCoreProfile:
- case kGLImplementationAppleGL:
return InitializeGLSurfaceWithFormat(
new NoOpGLSurface(size), format);
#if defined(USE_EGL)
case kGLImplementationEGLGLES2:
- case kGLImplementationEGLANGLE:
- if (GLSurfaceEGL::GetGLDisplayEGL()->IsEGLSurfacelessContextSupported() &&
+ case kGLImplementationEGLANGLE: {
+ GLDisplayEGL* display_egl = display->GetAs<gl::GLDisplayEGL>();
+ if (display_egl->IsEGLSurfacelessContextSupported() &&
size.width() == 0 && size.height() == 0) {
return InitializeGLSurfaceWithFormat(
- new SurfacelessEGL(GLSurfaceEGL::GetGLDisplayEGL(), size), format);
+ new SurfacelessEGL(display_egl, size), format);
} else {
return InitializeGLSurfaceWithFormat(
- new PbufferGLSurfaceEGL(GLSurfaceEGL::GetGLDisplayEGL(), size),
- format);
+ new PbufferGLSurfaceEGL(display_egl, size), format);
}
+ }
#endif // defined(USE_EGL)
case kGLImplementationMockGL:
case kGLImplementationStubGL:
diff --git a/chromium/ui/gl/init/gl_factory_ozone.cc b/chromium/ui/gl/init/gl_factory_ozone.cc
index 57b4c973a48..8760e219c1c 100644
--- a/chromium/ui/gl/init/gl_factory_ozone.cc
+++ b/chromium/ui/gl/init/gl_factory_ozone.cc
@@ -58,11 +58,12 @@ scoped_refptr<GLContext> CreateGLContext(GLShareGroup* share_group,
return nullptr;
}
-scoped_refptr<GLSurface> CreateViewGLSurface(gfx::AcceleratedWidget window) {
+scoped_refptr<GLSurface> CreateViewGLSurface(GLDisplay* display,
+ gfx::AcceleratedWidget window) {
TRACE_EVENT0("gpu", "gl::init::CreateViewGLSurface");
if (HasGLOzone())
- return GetGLOzone()->CreateViewGLSurface(window);
+ return GetGLOzone()->CreateViewGLSurface(display, window);
switch (GetGLImplementation()) {
case kGLImplementationMockGL:
@@ -76,13 +77,16 @@ scoped_refptr<GLSurface> CreateViewGLSurface(gfx::AcceleratedWidget window) {
}
scoped_refptr<GLSurface> CreateSurfacelessViewGLSurface(
+ GLDisplay* display,
gfx::AcceleratedWidget window) {
TRACE_EVENT0("gpu", "gl::init::CreateSurfacelessViewGLSurface");
- return HasGLOzone() ? GetGLOzone()->CreateSurfacelessViewGLSurface(window)
- : nullptr;
+ return HasGLOzone()
+ ? GetGLOzone()->CreateSurfacelessViewGLSurface(display, window)
+ : nullptr;
}
scoped_refptr<GLSurface> CreateOffscreenGLSurfaceWithFormat(
+ GLDisplay* display,
const gfx::Size& size,
GLSurfaceFormat format) {
TRACE_EVENT0("gpu", "gl::init::CreateOffscreenGLSurface");
@@ -93,7 +97,7 @@ scoped_refptr<GLSurface> CreateOffscreenGLSurfaceWithFormat(
}
if (HasGLOzone())
- return GetGLOzone()->CreateOffscreenGLSurface(size);
+ return GetGLOzone()->CreateOffscreenGLSurface(display, size);
switch (GetGLImplementation()) {
case kGLImplementationMockGL:
diff --git a/chromium/ui/gl/init/gl_factory_win.cc b/chromium/ui/gl/init/gl_factory_win.cc
index f61749aca05..ea69bdba80b 100644
--- a/chromium/ui/gl/init/gl_factory_win.cc
+++ b/chromium/ui/gl/init/gl_factory_win.cc
@@ -59,13 +59,14 @@ scoped_refptr<GLContext> CreateGLContext(GLShareGroup* share_group,
}
}
-scoped_refptr<GLSurface> CreateViewGLSurface(gfx::AcceleratedWidget window) {
+scoped_refptr<GLSurface> CreateViewGLSurface(GLDisplay* display,
+ gfx::AcceleratedWidget window) {
TRACE_EVENT0("gpu", "gl::init::CreateViewGLSurface");
switch (GetGLImplementation()) {
case kGLImplementationEGLANGLE: {
DCHECK_NE(window, gfx::kNullAcceleratedWidget);
return InitializeGLSurface(base::MakeRefCounted<NativeViewGLSurfaceEGL>(
- GLSurfaceEGL::GetGLDisplayEGL(), window,
+ display->GetAs<gl::GLDisplayEGL>(), window,
std::make_unique<VSyncProviderWin>(window)));
}
case kGLImplementationMockGL:
@@ -78,19 +79,22 @@ scoped_refptr<GLSurface> CreateViewGLSurface(gfx::AcceleratedWidget window) {
}
scoped_refptr<GLSurface> CreateOffscreenGLSurfaceWithFormat(
- const gfx::Size& size, GLSurfaceFormat format) {
+ GLDisplay* display,
+ const gfx::Size& size,
+ GLSurfaceFormat format) {
TRACE_EVENT0("gpu", "gl::init::CreateOffscreenGLSurface");
switch (GetGLImplementation()) {
- case kGLImplementationEGLANGLE:
- if (GLSurfaceEGL::GetGLDisplayEGL()->IsEGLSurfacelessContextSupported() &&
+ case kGLImplementationEGLANGLE: {
+ GLDisplayEGL* display_egl = display->GetAs<gl::GLDisplayEGL>();
+ if (display_egl->IsEGLSurfacelessContextSupported() &&
size.width() == 0 && size.height() == 0) {
return InitializeGLSurfaceWithFormat(
- new SurfacelessEGL(GLSurfaceEGL::GetGLDisplayEGL(), size), format);
+ new SurfacelessEGL(display_egl, size), format);
} else {
return InitializeGLSurfaceWithFormat(
- new PbufferGLSurfaceEGL(GLSurfaceEGL::GetGLDisplayEGL(), size),
- format);
+ new PbufferGLSurfaceEGL(display_egl, size), format);
}
+ }
case kGLImplementationMockGL:
case kGLImplementationStubGL:
return new GLSurfaceStub;
@@ -121,7 +125,7 @@ bool InitializeExtensionSettingsOneOffPlatform(GLDisplay* display) {
switch (implementation) {
case kGLImplementationEGLANGLE:
return InitializeExtensionSettingsOneOffEGL(
- static_cast<GLDisplayEGL*>(display));
+ display->GetAs<GLDisplayEGL>());
case kGLImplementationMockGL:
case kGLImplementationStubGL:
return true;
diff --git a/chromium/ui/gl/init/gl_initializer_android.cc b/chromium/ui/gl/init/gl_initializer_android.cc
index 5abd2d9f799..294b0316260 100644
--- a/chromium/ui/gl/init/gl_initializer_android.cc
+++ b/chromium/ui/gl/init/gl_initializer_android.cc
@@ -10,11 +10,10 @@
#include "base/logging.h"
#include "base/native_library.h"
#include "ui/gl/gl_bindings.h"
-#include "ui/gl/gl_display_manager.h"
+#include "ui/gl/gl_display.h"
#include "ui/gl/gl_egl_api_implementation.h"
#include "ui/gl/gl_gl_api_implementation.h"
-#include "ui/gl/gl_surface_egl.h"
-#include "ui/gl/init/gl_initializer.h"
+#include "ui/gl/gl_utils.h"
namespace gl {
namespace init {
@@ -78,20 +77,19 @@ bool InitializeStaticEGLInternal(GLImplementationParts implementation) {
} // namespace
GLDisplay* InitializeGLOneOffPlatform(uint64_t system_device_id) {
+ GLDisplayEGL* display = GetDisplayEGL(system_device_id);
switch (GetGLImplementation()) {
case kGLImplementationEGLGLES2:
- case kGLImplementationEGLANGLE: {
- GLDisplay* display = GLSurfaceEGL::InitializeOneOff(
- EGLDisplayPlatform(EGL_DEFAULT_DISPLAY), system_device_id);
- if (!display) {
- LOG(ERROR) << "GLSurfaceEGL::InitializeOneOff failed.";
+ case kGLImplementationEGLANGLE:
+ if (!display->Initialize(EGLDisplayPlatform(EGL_DEFAULT_DISPLAY))) {
+ LOG(ERROR) << "GLDisplayEGL::Initialize failed.";
return nullptr;
}
- return display;
- }
+ break;
default:
- return GLDisplayManagerEGL::GetInstance()->GetDisplay(system_device_id);
+ break;
}
+ return display;
}
bool InitializeStaticGLBindings(GLImplementationParts implementation) {
@@ -117,7 +115,8 @@ bool InitializeStaticGLBindings(GLImplementationParts implementation) {
}
void ShutdownGLPlatform(GLDisplay* display) {
- GLSurfaceEGL::ShutdownOneOff(static_cast<GLDisplayEGL*>(display));
+ if (display)
+ display->Shutdown();
ClearBindingsEGL();
ClearBindingsGL();
}
diff --git a/chromium/ui/gl/init/gl_initializer_mac.cc b/chromium/ui/gl/init/gl_initializer_mac.cc
index fa97713916b..bc29406755e 100644
--- a/chromium/ui/gl/init/gl_initializer_mac.cc
+++ b/chromium/ui/gl/init/gl_initializer_mac.cc
@@ -18,16 +18,15 @@
#include "base/threading/thread_restrictions.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_context.h"
-#include "ui/gl/gl_display_manager.h"
+#include "ui/gl/gl_display.h"
#include "ui/gl/gl_gl_api_implementation.h"
#include "ui/gl/gl_implementation.h"
#include "ui/gl/gl_surface.h"
+#include "ui/gl/gl_utils.h"
#include "ui/gl/gpu_switching_manager.h"
-#include "ui/gl/init/gl_initializer.h"
#if defined(USE_EGL)
#include "ui/gl/gl_egl_api_implementation.h"
-#include "ui/gl/gl_surface_egl.h"
#endif // defined(USE_EGL)
namespace gl {
@@ -52,11 +51,6 @@ bool InitializeOneOffForSandbox() {
// format selection.
attribs.push_back(kCGLPFAAllowOfflineRenderers);
}
- if (GetGLImplementation() == kGLImplementationAppleGL) {
- attribs.push_back(kCGLPFARendererID);
- attribs.push_back(
- static_cast<CGLPixelFormatAttribute>(kCGLRendererGenericFloatID));
- }
attribs.push_back(static_cast<CGLPixelFormatAttribute>(0));
CGLPixelFormatObj format;
@@ -172,29 +166,27 @@ bool InitializeStaticEGLInternal(GLImplementationParts implementation) {
} // namespace
GLDisplay* InitializeGLOneOffPlatform(uint64_t system_device_id) {
+ GLDisplayEGL* display = GetDisplayEGL(system_device_id);
switch (GetGLImplementation()) {
case kGLImplementationDesktopGL:
case kGLImplementationDesktopGLCoreProfile:
- case kGLImplementationAppleGL:
if (!InitializeOneOffForSandbox()) {
LOG(ERROR) << "GLSurfaceCGL::InitializeOneOff failed.";
}
- return GLDisplayManagerEGL::GetInstance()->GetDisplay(system_device_id);
+ break;
#if defined(USE_EGL)
case kGLImplementationEGLGLES2:
- case kGLImplementationEGLANGLE: {
- GLDisplay* display = GLSurfaceEGL::InitializeOneOff(EGLDisplayPlatform(0),
- system_device_id);
- if (!display) {
- LOG(ERROR) << "GLSurfaceEGL::InitializeOneOff failed.";
+ case kGLImplementationEGLANGLE:
+ if (!display->Initialize(EGLDisplayPlatform(0))) {
+ LOG(ERROR) << "GLDisplayEGL::Initialize failed.";
return nullptr;
}
- return display;
- }
+ break;
#endif // defined(USE_EGL)
default:
- return GLDisplayManagerEGL::GetInstance()->GetDisplay(system_device_id);
+ break;
}
+ return display;
}
bool InitializeStaticGLBindings(GLImplementationParts implementation) {
@@ -212,7 +204,6 @@ bool InitializeStaticGLBindings(GLImplementationParts implementation) {
switch (implementation.gl) {
case kGLImplementationDesktopGL:
case kGLImplementationDesktopGLCoreProfile:
- case kGLImplementationAppleGL:
return InitializeStaticCGLInternal(implementation.gl);
#if defined(USE_EGL)
case kGLImplementationEGLGLES2:
@@ -234,7 +225,8 @@ bool InitializeStaticGLBindings(GLImplementationParts implementation) {
void ShutdownGLPlatform(GLDisplay* display) {
ClearBindingsGL();
#if defined(USE_EGL)
- GLSurfaceEGL::ShutdownOneOff(static_cast<GLDisplayEGL*>(display));
+ if (display)
+ display->Shutdown();
ClearBindingsEGL();
#endif // defined(USE_EGL)
}
diff --git a/chromium/ui/gl/init/gl_initializer_ozone.cc b/chromium/ui/gl/init/gl_initializer_ozone.cc
index 36c73023d59..ea0deb15406 100644
--- a/chromium/ui/gl/init/gl_initializer_ozone.cc
+++ b/chromium/ui/gl/init/gl_initializer_ozone.cc
@@ -7,9 +7,9 @@
#include "base/check_op.h"
#include "base/notreached.h"
#include "ui/gl/gl_bindings.h"
-#include "ui/gl/gl_display_manager.h"
#include "ui/gl/gl_gl_api_implementation.h"
#include "ui/gl/gl_surface.h"
+#include "ui/gl/gl_utils.h"
#if defined(USE_OZONE)
#include "ui/gl/init/gl_display_egl_util_ozone.h"
@@ -29,7 +29,7 @@ GLDisplay* InitializeGLOneOffPlatform(uint64_t system_device_id) {
switch (GetGLImplementation()) {
case kGLImplementationMockGL:
case kGLImplementationStubGL:
- return GLDisplayManagerEGL::GetInstance()->GetDisplay(system_device_id);
+ return GetDisplayEGL(system_device_id);
default:
NOTREACHED();
}
diff --git a/chromium/ui/gl/init/gl_initializer_win.cc b/chromium/ui/gl/init/gl_initializer_win.cc
index 960065c001b..1589614c008 100644
--- a/chromium/ui/gl/init/gl_initializer_win.cc
+++ b/chromium/ui/gl/init/gl_initializer_win.cc
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/gl/direct_composition_surface_win.h"
#include "ui/gl/init/gl_initializer.h"
#include <dwmapi.h>
@@ -17,11 +16,12 @@
#include "base/threading/thread_restrictions.h"
#include "base/trace_event/trace_event.h"
#include "base/win/windows_version.h"
+#include "ui/gl/direct_composition_support.h"
#include "ui/gl/gl_bindings.h"
-#include "ui/gl/gl_display_manager.h"
+#include "ui/gl/gl_display.h"
#include "ui/gl/gl_egl_api_implementation.h"
#include "ui/gl/gl_gl_api_implementation.h"
-#include "ui/gl/gl_surface_egl.h"
+#include "ui/gl/gl_utils.h"
#include "ui/gl/vsync_provider_win.h"
namespace gl {
@@ -126,24 +126,22 @@ bool InitializeStaticEGLInternal(GLImplementationParts implementation) {
GLDisplay* InitializeGLOneOffPlatform(uint64_t system_device_id) {
VSyncProviderWin::InitializeOneOff();
+ GLDisplayEGL* display = GetDisplayEGL(system_device_id);
switch (GetGLImplementation()) {
- case kGLImplementationEGLANGLE: {
- GLDisplayEGL* display = GLSurfaceEGL::InitializeOneOff(
- EGLDisplayPlatform(GetDC(nullptr)), system_device_id);
- if (!display) {
- LOG(ERROR) << "GLSurfaceEGL::InitializeOneOff failed.";
+ case kGLImplementationEGLANGLE:
+ if (!display->Initialize(EGLDisplayPlatform(GetDC(nullptr)))) {
+ LOG(ERROR) << "GLDisplayEGL::Initialize failed.";
return nullptr;
}
- DirectCompositionSurfaceWin::InitializeOneOff(display);
- return display;
- }
+ InitializeDirectComposition(display);
+ break;
case kGLImplementationMockGL:
case kGLImplementationStubGL:
break;
default:
NOTREACHED();
}
- return GLDisplayManagerEGL::GetInstance()->GetDisplay(system_device_id);
+ return display;
}
bool InitializeStaticGLBindings(GLImplementationParts implementation) {
@@ -174,8 +172,9 @@ bool InitializeStaticGLBindings(GLImplementationParts implementation) {
}
void ShutdownGLPlatform(GLDisplay* display) {
- DirectCompositionSurfaceWin::ShutdownOneOff();
- GLSurfaceEGL::ShutdownOneOff(static_cast<GLDisplayEGL*>(display));
+ ShutdownDirectComposition();
+ if (display)
+ display->Shutdown();
ClearBindingsEGL();
ClearBindingsGL();
}
diff --git a/chromium/ui/gl/swap_chain_presenter.cc b/chromium/ui/gl/swap_chain_presenter.cc
index 134c921b6ec..d518d10984d 100644
--- a/chromium/ui/gl/swap_chain_presenter.cc
+++ b/chromium/ui/gl/swap_chain_presenter.cc
@@ -19,7 +19,7 @@
#include "ui/gfx/color_space_win.h"
#include "ui/gfx/geometry/rect_conversions.h"
#include "ui/gl/dc_layer_tree.h"
-#include "ui/gl/direct_composition_surface_win.h"
+#include "ui/gl/direct_composition_support.h"
#include "ui/gl/gl_image_d3d.h"
#include "ui/gl/gl_image_dcomp_surface.h"
#include "ui/gl/gl_image_dxgi.h"
@@ -89,7 +89,7 @@ const char* ProtectedVideoTypeToString(gfx::ProtectedVideoType type) {
case gfx::ProtectedVideoType::kClear:
return "Clear";
case gfx::ProtectedVideoType::kSoftwareProtected:
- if (DirectCompositionSurfaceWin::AreOverlaysSupported())
+ if (DirectCompositionOverlaysSupported())
return "SoftwareProtected.HasOverlaySupport";
else
return "SoftwareProtected.NoOverlaySupport";
@@ -309,15 +309,15 @@ DXGI_FORMAT SwapChainPresenter::GetSwapChainFormat(
if (content_is_hdr)
return DXGI_FORMAT_R10G10B10A2_UNORM;
- DXGI_FORMAT yuv_overlay_format =
- DirectCompositionSurfaceWin::GetOverlayFormatUsedForSDR();
+ DXGI_FORMAT yuv_overlay_format = GetDirectCompositionSDROverlayFormat();
// Always prefer YUV swap chain for hardware protected video for now.
if (protected_video_type == gfx::ProtectedVideoType::kHardwareProtected)
return yuv_overlay_format;
if (failed_to_create_yuv_swapchain_ ||
- !DirectCompositionSurfaceWin::AreHardwareOverlaysSupported())
+ !DirectCompositionHardwareOverlaysSupported()) {
return DXGI_FORMAT_B8G8R8A8_UNORM;
+ }
// Start out as YUV.
if (!presentation_history_.Valid())
@@ -391,7 +391,7 @@ Microsoft::WRL::ComPtr<ID3D11Texture2D> SwapChainPresenter::UploadVideoImages(
if (FAILED(hr)) {
DLOG(ERROR) << "Creating D3D11 video staging texture failed: " << std::hex
<< hr;
- DirectCompositionSurfaceWin::DisableOverlays();
+ DisableDirectCompositionOverlays();
return nullptr;
}
DCHECK(staging_texture_);
@@ -449,7 +449,7 @@ Microsoft::WRL::ComPtr<ID3D11Texture2D> SwapChainPresenter::UploadVideoImages(
if (FAILED(hr)) {
DLOG(ERROR) << "Creating D3D11 video upload texture failed: " << std::hex
<< hr;
- DirectCompositionSurfaceWin::DisableOverlays();
+ DisableDirectCompositionOverlays();
return nullptr;
}
DCHECK(copy_texture_);
@@ -464,9 +464,9 @@ Microsoft::WRL::ComPtr<ID3D11Texture2D> SwapChainPresenter::UploadVideoImages(
}
gfx::Size SwapChainPresenter::GetMonitorSize() {
- if (DirectCompositionSurfaceWin::GetNumOfMonitors() == 1) {
+ if (GetDirectCompositionNumMonitors() == 1) {
// Only one monitor. Return the size of this monitor.
- return DirectCompositionSurfaceWin::GetPrimaryMonitorSize();
+ return GetDirectCompositionPrimaryMonitorSize();
} else {
gfx::Size monitor_size;
// Get the monitor on which the overlay is displayed.
@@ -712,8 +712,7 @@ bool SwapChainPresenter::TryPresentToDecodeSwapChain(
bool nv12_supported =
(swap_chain_format == DXGI_FORMAT_NV12) &&
- (DXGI_FORMAT_NV12 ==
- DirectCompositionSurfaceWin::GetOverlayFormatUsedForSDR());
+ (DXGI_FORMAT_NV12 == GetDirectCompositionSDROverlayFormat());
// TODO(sunnyps): Try using decode swap chain for uploaded video images.
if (texture && nv12_supported && !failed_to_present_decode_swapchain_) {
D3D11_TEXTURE2D_DESC texture_desc = {};
@@ -753,7 +752,7 @@ bool SwapChainPresenter::TryPresentToDecodeSwapChain(
(swap_chain_scale_x >= 1.0f) &&
(swap_chain_scale_y >= 1.0f);
}
- if (!DirectCompositionSurfaceWin::AreScaledOverlaysSupported()) {
+ if (!DirectCompositionScaledOverlaysSupported()) {
compatible_transform = compatible_transform &&
(swap_chain_scale_x == 1.0f) &&
(swap_chain_scale_y == 1.0f);
@@ -1138,11 +1137,12 @@ bool SwapChainPresenter::PresentToSwapChain(ui::DCRendererLayerParams& params) {
base::debug::DumpWithoutCrashing();
}
}
- const bool use_swap_chain_tearing =
- DirectCompositionSurfaceWin::AllowTearing();
- UINT flags = use_swap_chain_tearing ? DXGI_PRESENT_ALLOW_TEARING : 0;
- flags |= DXGI_PRESENT_USE_DURATION;
- UINT interval = use_swap_chain_tearing ? 0 : 1;
+ UINT flags = DXGI_PRESENT_USE_DURATION;
+ UINT interval = 1;
+ if (DirectCompositionSwapChainTearingEnabled()) {
+ flags |= DXGI_PRESENT_ALLOW_TEARING;
+ interval = 0;
+ }
// Ignore DXGI_STATUS_OCCLUDED since that's not an error but only indicates
// that the window is occluded and we can stop rendering.
hr = swap_chain_->Present(interval, flags);
@@ -1549,7 +1549,7 @@ bool SwapChainPresenter::ReallocateSwapChain(
desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
desc.Flags =
DXGI_SWAP_CHAIN_FLAG_YUV_VIDEO | DXGI_SWAP_CHAIN_FLAG_FULLSCREEN_VIDEO;
- if (DirectCompositionSurfaceWin::AllowTearing())
+ if (DirectCompositionSwapChainTearingEnabled())
desc.Flags |= DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING;
if (IsProtectedVideo(protected_video_type))
desc.Flags |= DXGI_SWAP_CHAIN_FLAG_DISPLAY_ONLY;
@@ -1602,7 +1602,7 @@ bool SwapChainPresenter::ReallocateSwapChain(
desc.Flags |= DXGI_SWAP_CHAIN_FLAG_DISPLAY_ONLY;
if (protected_video_type == gfx::ProtectedVideoType::kHardwareProtected)
desc.Flags |= DXGI_SWAP_CHAIN_FLAG_HW_PROTECTED;
- if (DirectCompositionSurfaceWin::AllowTearing())
+ if (DirectCompositionSwapChainTearingEnabled())
desc.Flags |= DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING;
HRESULT hr = media_factory->CreateSwapChainForCompositionSurfaceHandle(
@@ -1619,7 +1619,7 @@ bool SwapChainPresenter::ReallocateSwapChain(
if (FAILED(hr)) {
// Disable overlay support so dc_layer_overlay will stop sending down
// overlay frames here and uses GL Composition instead.
- DirectCompositionSurfaceWin::DisableOverlays();
+ DisableDirectCompositionOverlays();
DLOG(ERROR) << "Failed to create "
<< DxgiFormatToString(swap_chain_format)
<< " swap chain of size " << swap_chain_size.ToString()
diff --git a/chromium/ui/gl/swap_chain_presenter.h b/chromium/ui/gl/swap_chain_presenter.h
index 18c9af94ec5..e8e2543b2d6 100644
--- a/chromium/ui/gl/swap_chain_presenter.h
+++ b/chromium/ui/gl/swap_chain_presenter.h
@@ -5,9 +5,9 @@
#ifndef UI_GL_SWAP_CHAIN_PRESENTER_H_
#define UI_GL_SWAP_CHAIN_PRESENTER_H_
-#include <windows.h>
#include <d3d11.h>
#include <dcomp.h>
+#include <windows.h>
#include <wrl/client.h>
#include "base/containers/circular_deque.h"
diff --git a/chromium/ui/gl/vsync_thread_win.cc b/chromium/ui/gl/vsync_thread_win.cc
index fd4646c56fe..1c5d83850c1 100644
--- a/chromium/ui/gl/vsync_thread_win.cc
+++ b/chromium/ui/gl/vsync_thread_win.cc
@@ -62,9 +62,8 @@ VSyncThreadWin::VSyncThreadWin()
is_suspended_ =
base::PowerMonitor::AddPowerSuspendObserverAndReturnSuspendedState(this);
- base::Thread::Options options;
- options.priority = base::ThreadPriority::DISPLAY;
- vsync_thread_.StartWithOptions(std::move(options));
+ vsync_thread_.StartWithOptions(
+ base::Thread::Options(base::ThreadType::kDisplayCritical));
}
VSyncThreadWin::~VSyncThreadWin() {
diff --git a/chromium/ui/gtk/BUILD.gn b/chromium/ui/gtk/BUILD.gn
index e28907007d9..0088321597b 100644
--- a/chromium/ui/gtk/BUILD.gn
+++ b/chromium/ui/gtk/BUILD.gn
@@ -69,7 +69,7 @@ generate_stubs("gtk_stubs") {
}
component("gtk") {
- visibility = [ "//ui/views/linux_ui:linux_ui_factory" ]
+ visibility = [ "//ui/linux:linux_ui_factory" ]
public = [ "gtk_ui_factory.h" ]
sources = [
@@ -116,6 +116,7 @@ component("gtk") {
deps = [
":gtk_stubs",
"//base",
+ "//printing/buildflags",
"//skia",
# GTK pulls pangoft2, which requires HarfBuzz symbols. When linking
@@ -125,7 +126,6 @@ component("gtk") {
"//ui/aura",
"//ui/base",
"//ui/base:buildflags",
- "//ui/base/cursor:theme_manager",
"//ui/base/ime",
"//ui/base/ime/linux",
"//ui/color",
@@ -137,6 +137,7 @@ component("gtk") {
"//ui/gfx",
"//ui/gfx:native_widget_types",
"//ui/gfx/geometry",
+ "//ui/linux:linux_ui_impl",
"//ui/native_theme",
"//ui/shell_dialogs",
"//ui/strings",
diff --git a/chromium/ui/gtk/DEPS b/chromium/ui/gtk/DEPS
index 53d53a5e32c..21af089ce96 100644
--- a/chromium/ui/gtk/DEPS
+++ b/chromium/ui/gtk/DEPS
@@ -9,6 +9,7 @@ include_rules = [
"+ui/display",
"+ui/events",
"+ui/gfx",
+ "+ui/linux",
"+ui/native_theme",
"+ui/shell_dialogs",
"+ui/strings",
diff --git a/chromium/ui/gtk/gtk_compat.cc b/chromium/ui/gtk/gtk_compat.cc
index b5c7af5bdb9..2ba5b4c4468 100644
--- a/chromium/ui/gtk/gtk_compat.cc
+++ b/chromium/ui/gtk/gtk_compat.cc
@@ -18,7 +18,7 @@
namespace gtk {
// IMPORTANT: All functions in this file that call dlsym()'ed
-// functions should be annotated with DISABLE_CFI_ICALL.
+// functions should be annotated with DISABLE_CFI_DLSYM.
namespace {
@@ -150,7 +150,7 @@ bool GtkCheckVersion(uint32_t major, uint32_t minor, uint32_t micro) {
return GtkVersion() >= base::Version({major, minor, micro});
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
bool GtkInitCheck(int* argc, char** argv) {
static void* gtk_init_check = DlSym(GetLibGtk(), "gtk_init_check");
if (GtkCheckVersion(4))
@@ -163,7 +163,7 @@ bool GtkInitCheck(int* argc, char** argv) {
}
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
gfx::Insets GtkStyleContextGetPadding(GtkStyleContext* context) {
static void* get_padding =
DlSym(GetLibGtk(), "gtk_style_context_get_padding");
@@ -177,7 +177,7 @@ gfx::Insets GtkStyleContextGetPadding(GtkStyleContext* context) {
return InsetsFromGtkBorder(padding);
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
gfx::Insets GtkStyleContextGetBorder(GtkStyleContext* context) {
static void* get_border = DlSym(GetLibGtk(), "gtk_style_context_get_border");
GtkBorder border;
@@ -190,7 +190,7 @@ gfx::Insets GtkStyleContextGetBorder(GtkStyleContext* context) {
return InsetsFromGtkBorder(border);
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
gfx::Insets GtkStyleContextGetMargin(GtkStyleContext* context) {
static void* get_margin = DlSym(GetLibGtk(), "gtk_style_context_get_margin");
GtkBorder margin;
@@ -203,7 +203,7 @@ gfx::Insets GtkStyleContextGetMargin(GtkStyleContext* context) {
return InsetsFromGtkBorder(margin);
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
SkColor GtkStyleContextGetColor(GtkStyleContext* context) {
static void* get_color = DlSym(GetLibGtk(), "gtk_style_context_get_color");
if (GtkCheckVersion(4)) {
@@ -217,7 +217,7 @@ SkColor GtkStyleContextGetColor(GtkStyleContext* context) {
return GdkRgbaToSkColor(color);
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
SkColor GtkStyleContextGetBackgroundColor(GtkStyleContext* context) {
DCHECK(!GtkCheckVersion(4));
static void* get_bg_color =
@@ -228,7 +228,7 @@ SkColor GtkStyleContextGetBackgroundColor(GtkStyleContext* context) {
return GdkRgbaToSkColor(color);
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
absl::optional<SkColor> GtkStyleContextLookupColor(GtkStyleContext* context,
const gchar* color_name) {
DCHECK(!GtkCheckVersion(4));
@@ -242,7 +242,7 @@ absl::optional<SkColor> GtkStyleContextLookupColor(GtkStyleContext* context,
return absl::nullopt;
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
bool GtkImContextFilterKeypress(GtkIMContext* context, GdkEventKey* event) {
static void* filter = DlSym(GetLibGtk(), "gtk_im_context_filter_keypress");
if (GtkCheckVersion(4)) {
@@ -252,7 +252,7 @@ bool GtkImContextFilterKeypress(GtkIMContext* context, GdkEventKey* event) {
return DlCast<bool(GtkIMContext*, GdkEventKey*)>(filter)(context, event);
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
bool GtkFileChooserSetCurrentFolder(GtkFileChooser* dialog,
const base::FilePath& path) {
static void* set = DlSym(GetLibGtk(), "gtk_file_chooser_set_current_folder");
@@ -265,7 +265,7 @@ bool GtkFileChooserSetCurrentFolder(GtkFileChooser* dialog,
path.value().c_str());
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
void GtkRenderIcon(GtkStyleContext* context,
cairo_t* cr,
GdkPixbuf* pixbuf,
@@ -284,7 +284,7 @@ void GtkRenderIcon(GtkStyleContext* context,
}
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
GtkWidget* GtkToplevelWindowNew() {
static void* window_new = DlSym(GetLibGtk(), "gtk_window_new");
if (GtkCheckVersion(4))
@@ -292,7 +292,7 @@ GtkWidget* GtkToplevelWindowNew() {
return DlCast<GtkWidget*(GtkWindowType)>(window_new)(GTK_WINDOW_TOPLEVEL);
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
void GtkCssProviderLoadFromData(GtkCssProvider* css_provider,
const char* data,
gssize length) {
@@ -327,7 +327,7 @@ void GtkStyleContextGetStyle(GtkStyleContext* context, ...) {
va_end(args);
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
ScopedGObject<GtkIconInfo> Gtk3IconThemeLookupByGiconForScale(
GtkIconTheme* theme,
GIcon* icon,
@@ -342,7 +342,7 @@ ScopedGObject<GtkIconInfo> Gtk3IconThemeLookupByGiconForScale(
lookup)(theme, icon, size, scale, flags));
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
ScopedGObject<GtkIconPaintable> Gtk4IconThemeLookupIcon(
GtkIconTheme* theme,
const char* icon_name,
@@ -358,7 +358,7 @@ ScopedGObject<GtkIconPaintable> Gtk4IconThemeLookupIcon(
lookup)(theme, icon_name, fallbacks, size, scale, direction, flags));
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
ScopedGObject<GtkIconPaintable> Gtk4IconThemeLookupByGicon(
GtkIconTheme* theme,
GIcon* icon,
@@ -374,7 +374,7 @@ ScopedGObject<GtkIconPaintable> Gtk4IconThemeLookupByGicon(
theme, icon, size, scale, direction, flags));
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
GtkWidget* GtkFileChooserDialogNew(const gchar* title,
GtkWindow* parent,
GtkFileChooserAction action,
@@ -389,19 +389,19 @@ GtkWidget* GtkFileChooserDialogNew(const gchar* title,
second_button_text, second_response, nullptr);
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
GtkTreeStore* GtkTreeStoreNew(GType type) {
static void* create = DlSym(GetLibGtk(), "gtk_tree_store_new");
return DlCast<GtkTreeStore*(gint, ...)>(create)(1, type);
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
GdkEventType GdkEventGetEventType(GdkEvent* event) {
static void* get = DlSym(GetLibGtk(), "gdk_event_get_event_type");
return DlCast<GdkEventType(GdkEvent*)>(get)(event);
}
-DISABLE_CFI_ICALL
+DISABLE_CFI_DLSYM
guint32 GdkEventGetTime(GdkEvent* event) {
static void* get = DlSym(GetLibGtk(), "gdk_event_get_time");
return DlCast<guint32(GdkEvent*)>(get)(event);
diff --git a/chromium/ui/gtk/gtk_key_bindings_handler.h b/chromium/ui/gtk/gtk_key_bindings_handler.h
index f3c3831cf18..7abca24dd79 100644
--- a/chromium/ui/gtk/gtk_key_bindings_handler.h
+++ b/chromium/ui/gtk/gtk_key_bindings_handler.h
@@ -8,6 +8,7 @@
#include <string>
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "ui/base/ime/linux/text_edit_command_auralinux.h"
#include "ui/events/platform_event.h"
#include "ui/gtk/gtk_compat.h"
@@ -56,9 +57,9 @@ class GtkKeyBindingsHandler {
// with Gtk4 headers. To facilitate this, we manually copy the class
// hierarchy up to GtkWidget.
GtkWidget widget;
- void* container_private;
- void* text_view_private;
- GtkKeyBindingsHandler* owner;
+ raw_ptr<void> container_private;
+ raw_ptr<void> text_view_private;
+ raw_ptr<GtkKeyBindingsHandler> owner;
};
// Class structure of Handler class.
diff --git a/chromium/ui/gtk/gtk_ui.cc b/chromium/ui/gtk/gtk_ui.cc
index 12193ad9090..dd42b1e87cf 100644
--- a/chromium/ui/gtk/gtk_ui.cc
+++ b/chromium/ui/gtk/gtk_ui.cc
@@ -16,25 +16,20 @@
#include "base/containers/flat_map.h"
#include "base/debug/leak_annotations.h"
#include "base/environment.h"
-#include "base/files/dir_reader_linux.h"
-#include "base/files/file_util.h"
#include "base/logging.h"
#include "base/nix/mime_util_xdg.h"
#include "base/nix/xdg_util.h"
#include "base/observer_list.h"
#include "base/strings/string_split.h"
#include "chrome/browser/themes/theme_properties.h" // nogncheck
-#include "printing/buildflags/buildflags.h" // nogncheck
+#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkColor.h"
#include "third_party/skia/include/core/SkShader.h"
-#include "ui/base/cursor/cursor_theme_manager_observer.h"
#include "ui/base/glib/glib_cast.h"
#include "ui/base/ime/input_method.h"
#include "ui/base/ime/linux/fake_input_method_context.h"
#include "ui/base/ime/linux/linux_input_method_context.h"
-#include "ui/base/ime/linux/linux_input_method_context_factory.h"
-#include "ui/base/linux/linux_ui_delegate.h"
#include "ui/color/color_id.h"
#include "ui/color/color_provider.h"
#include "ui/color/color_provider_manager.h"
@@ -63,14 +58,18 @@
#include "ui/gtk/select_file_dialog_linux_gtk.h"
#include "ui/gtk/settings_provider_gtk.h"
#include "ui/gtk/window_frame_provider_gtk.h"
+#include "ui/linux/cursor_theme_manager_observer.h"
+#include "ui/linux/device_scale_factor_observer.h"
+#include "ui/linux/linux_ui.h"
+#include "ui/linux/linux_ui_delegate.h"
+#include "ui/linux/nav_button_provider.h"
+#include "ui/linux/window_button_order_observer.h"
#include "ui/native_theme/native_theme.h"
#include "ui/ozone/buildflags.h"
#include "ui/ozone/public/ozone_platform.h"
#include "ui/shell_dialogs/select_file_dialog_linux.h"
#include "ui/shell_dialogs/select_file_policy.h"
-#include "ui/views/linux_ui/device_scale_factor_observer.h"
-#include "ui/views/linux_ui/nav_button_provider.h"
-#include "ui/views/linux_ui/window_button_order_observer.h"
+#include "ui/shell_dialogs/shell_dialog_linux.h"
#include "ui/views/window/window_button_order_provider.h"
#if defined(USE_GIO)
@@ -84,10 +83,6 @@
#define USE_X11
#endif
-#if BUILDFLAG(ENABLE_PRINTING)
-#include "printing/printing_context_linux.h"
-#endif
-
#if defined(USE_WAYLAND)
#include "ui/gtk/wayland/gtk_ui_platform_wayland.h"
#endif
@@ -170,9 +165,9 @@ gfx::FontRenderParams GetGtkFontRenderParams() {
return params;
}
-views::LinuxUI::WindowFrameAction GetDefaultMiddleClickAction() {
+ui::LinuxUi::WindowFrameAction GetDefaultMiddleClickAction() {
if (GtkCheckVersion(3, 14))
- return views::LinuxUI::WindowFrameAction::kNone;
+ return ui::LinuxUi::WindowFrameAction::kNone;
std::unique_ptr<base::Environment> env(base::Environment::Create());
switch (base::nix::GetDesktopEnvironment(env.get())) {
case base::nix::DESKTOP_ENVIRONMENT_KDE4:
@@ -181,9 +176,9 @@ views::LinuxUI::WindowFrameAction GetDefaultMiddleClickAction() {
// middle mouse button to create tab groups. We don't support that in
// Chrome, but at least avoid lowering windows in response to middle
// clicks to avoid surprising users who expect the KDE behavior.
- return views::LinuxUI::WindowFrameAction::kNone;
+ return ui::LinuxUi::WindowFrameAction::kNone;
default:
- return views::LinuxUI::WindowFrameAction::kLower;
+ return ui::LinuxUi::WindowFrameAction::kLower;
}
}
@@ -205,23 +200,6 @@ std::unique_ptr<GtkUiPlatform> CreateGtkUiPlatform(ui::LinuxUiBackend backend) {
}
}
-void ListGtkThemes(const base::FilePath path,
- std::vector<std::string>& themes) {
- std::string gtk_version =
- "gtk-" + base::NumberToString(GtkVersion().components()[0]) + ".0";
- base::DirReaderLinux dir_reader(path.value().c_str());
-
- if (!dir_reader.IsValid())
- return;
-
- while (dir_reader.Next()) {
- std::string theme_name = dir_reader.name();
- base::FilePath theme_path = path.Append(theme_name).Append(gtk_version);
- if (base::PathExists(theme_path))
- themes.emplace_back(theme_name);
- }
-}
-
} // namespace
GtkUi::GtkUi() : window_frame_actions_() {
@@ -232,6 +210,8 @@ GtkUi::GtkUi() : window_frame_actions_() {
GtkUi::~GtkUi() {
DCHECK_EQ(g_gtk_ui, this);
g_gtk_ui = nullptr;
+
+ shell_dialog_linux::Finalize();
}
// static
@@ -260,24 +240,14 @@ bool GtkUi::Initialize() {
// This creates an extra thread that may race against GtkInitFromCommandLine,
// so this must be done after to avoid the race condition.
- ShellDialogLinux::Initialize();
+ shell_dialog_linux::Initialize();
- using Action = views::LinuxUI::WindowFrameAction;
- using ActionSource = views::LinuxUI::WindowFrameActionSource;
+ using Action = ui::LinuxUi::WindowFrameAction;
+ using ActionSource = ui::LinuxUi::WindowFrameActionSource;
window_frame_actions_ = {
{ActionSource::kDoubleClick, Action::kToggleMaximize},
{ActionSource::kMiddleClick, GetDefaultMiddleClickAction()},
{ActionSource::kRightClick, Action::kMenu}};
- // Linux ozone platforms may want to set LinuxInputMethodContextFactory
- // instance instead of using GtkUi context factory. This step is made upon
- // CreateInputMethod call. If the factory is not set, use the GtkUi context
- // factory.
- if (GetPlatform()->PreferGtkIme() ||
- !ui::OzonePlatform::GetInstance()->CreateInputMethod(
- nullptr, gfx::kNullAcceleratedWidget)) {
- if (!ui::LinuxInputMethodContextFactory::instance())
- ui::LinuxInputMethodContextFactory::SetInstance(this);
- }
GtkSettings* settings = gtk_settings_get_default();
g_signal_connect_after(settings, "notify::gtk-theme-name",
@@ -308,13 +278,6 @@ bool GtkUi::Initialize() {
LoadGtkValues();
-#if BUILDFLAG(ENABLE_PRINTING)
- printing::PrintingContextLinux::SetCreatePrintDialogFunction(
- &PrintDialogGtk::CreatePrintDialog);
- printing::PrintingContextLinux::SetPdfPaperSizeFunction(
- &GetPdfPaperSizeDeviceUnitsGtk);
-#endif
-
// We must build this after GTK gets initialized.
settings_provider_ = CreateSettingsProvider(this);
@@ -325,24 +288,6 @@ bool GtkUi::Initialize() {
return true;
}
-bool GtkUi::GetTint(int id, color_utils::HSL* tint) const {
- switch (id) {
- // Tints for which the cross-platform default is fine. Before adding new
- // values here, specifically verify they work well on Linux.
- case ThemeProperties::TINT_BACKGROUND_TAB:
- // TODO(estade): Return something useful for TINT_BUTTONS so that chrome://
- // page icons are colored appropriately.
- case ThemeProperties::TINT_BUTTONS:
- break;
- default:
- // Assume any tints not specifically verified on Linux aren't usable.
- // TODO(pkasting): Try to remove values from |colors_| that could just be
- // added to the group above instead.
- NOTREACHED();
- }
- return false;
-}
-
bool GtkUi::GetColor(int id, SkColor* color, bool use_custom_frame) const {
for (const ColorMap& color_map :
{colors_,
@@ -491,10 +436,8 @@ void GtkUi::SetWindowButtonOrdering(
views::WindowButtonOrderProvider::GetInstance()->SetWindowButtonOrder(
leading_buttons, trailing_buttons);
- for (views::WindowButtonOrderObserver& observer :
- window_button_order_observer_list()) {
+ for (auto& observer : window_button_order_observer_list())
observer.OnWindowButtonOrderingChange();
- }
}
void GtkUi::SetWindowFrameAction(WindowFrameActionSource source,
@@ -503,9 +446,8 @@ void GtkUi::SetWindowFrameAction(WindowFrameActionSource source,
}
std::unique_ptr<ui::LinuxInputMethodContext> GtkUi::CreateInputMethodContext(
- ui::LinuxInputMethodContextDelegate* delegate,
- bool is_simple) const {
- return std::make_unique<InputMethodContextImplGtk>(delegate, is_simple);
+ ui::LinuxInputMethodContextDelegate* delegate) const {
+ return GetPlatform()->CreateInputMethodContext(delegate);
}
gfx::FontRenderParams GtkUi::GetDefaultFontRenderParams() const {
@@ -516,22 +458,24 @@ gfx::FontRenderParams GtkUi::GetDefaultFontRenderParams() const {
void GtkUi::GetDefaultFontDescription(std::string* family_out,
int* size_pixels_out,
int* style_out,
- gfx::Font::Weight* weight_out,
+ int* weight_out,
gfx::FontRenderParams* params_out) const {
*family_out = default_font_family_;
*size_pixels_out = default_font_size_pixels_;
*style_out = default_font_style_;
- *weight_out = default_font_weight_;
+ *weight_out = static_cast<int>(default_font_weight_);
*params_out = default_font_render_params_;
}
ui::SelectFileDialog* GtkUi::CreateSelectFileDialog(
- ui::SelectFileDialog::Listener* listener,
+ void* listener,
std::unique_ptr<ui::SelectFilePolicy> policy) const {
- return new SelectFileDialogLinuxGtk(listener, std::move(policy));
+ return new SelectFileDialogLinuxGtk(
+ static_cast<ui::SelectFileDialog::Listener*>(listener),
+ std::move(policy));
}
-views::LinuxUI::WindowFrameAction GtkUi::GetWindowFrameAction(
+ui::LinuxUi::WindowFrameAction GtkUi::GetWindowFrameAction(
WindowFrameActionSource source) {
return window_frame_actions_[source];
}
@@ -550,13 +494,13 @@ bool GtkUi::AnimationsEnabled() const {
return animations_enabled;
}
-std::unique_ptr<views::NavButtonProvider> GtkUi::CreateNavButtonProvider() {
+std::unique_ptr<ui::NavButtonProvider> GtkUi::CreateNavButtonProvider() {
if (GtkCheckVersion(3, 14))
return std::make_unique<gtk::NavButtonProviderGtk>();
return nullptr;
}
-views::WindowFrameProvider* GtkUi::GetWindowFrameProvider(bool solid_frame) {
+ui::WindowFrameProvider* GtkUi::GetWindowFrameProvider(bool solid_frame) {
if (!GtkCheckVersion(3, 14))
return nullptr;
auto& provider =
@@ -646,29 +590,13 @@ int GtkUi::GetCursorThemeSize() {
return size;
}
-std::vector<std::string> GtkUi::GetAvailableSystemThemeNamesForTest() const {
- std::vector<std::string> themes;
- const gchar* const* dirs = g_get_system_data_dirs();
- for (std::size_t i = 0; dirs[i]; i++)
- ListGtkThemes(base::FilePath(dirs[i]).Append("themes"), themes);
-
- return themes;
-}
-
-void GtkUi::SetSystemThemeByNameForTest(const std::string& theme_name) {
- GValue theme = G_VALUE_INIT;
- g_value_init(&theme, G_TYPE_STRING);
- g_value_set_string(&theme, theme_name.c_str());
- g_object_set_property(G_OBJECT(gtk_settings_get_default()), "gtk-theme-name",
- &theme);
-}
-
-ui::NativeTheme* GtkUi::GetNativeTheme() const {
+ui::NativeTheme* GtkUi::GetNativeThemeImpl() const {
return native_theme_;
}
-bool GtkUi::MatchEvent(const ui::Event& event,
- std::vector<ui::TextEditCommandAuraLinux>* commands) {
+bool GtkUi::GetTextEditCommandsForEvent(
+ const ui::Event& event,
+ std::vector<ui::TextEditCommandAuraLinux>* commands) {
// GTK4 dropped custom key bindings.
if (GtkCheckVersion(4))
return false;
@@ -687,6 +615,17 @@ bool GtkUi::MatchEvent(const ui::Event& event,
return key_bindings_handler_->MatchEvent(event, commands);
}
+#if BUILDFLAG(ENABLE_PRINTING)
+printing::PrintDialogLinuxInterface* GtkUi::CreatePrintDialog(
+ printing::PrintingContextLinux* context) {
+ return PrintDialogGtk::CreatePrintDialog(context);
+}
+
+gfx::Size GtkUi::GetPdfPaperSize(printing::PrintingContextLinux* context) {
+ return GetPdfPaperSizeDeviceUnitsGtk(context);
+}
+#endif
+
void GtkUi::OnThemeChanged(GtkSettings* settings, GtkParamSpec* param) {
colors_.clear();
custom_frame_colors_.clear();
@@ -749,7 +688,7 @@ void GtkUi::UpdateColors() {
// Some theme colors, e.g. COLOR_NTP_LINK, are derived from color
// provider colors. We assume that those sources' colors won't change
// with frame type.
- ui::ColorProviderManager::FrameType::kChromium, nullptr});
+ ui::ColorProviderManager::FrameType::kChromium});
SkColor location_bar_border = GetBorderColor("GtkEntry#entry");
if (SkColorGetA(location_bar_border))
@@ -766,11 +705,6 @@ void GtkUi::UpdateColors() {
SkColor tab_border = GetBorderColor("GtkButton#button");
// Separates the toolbar from the bookmark bar or butter bars.
- colors_[ThemeProperties::COLOR_DOWNLOAD_SHELF_CONTENT_AREA_SEPARATOR] =
- tab_border;
- colors_[ThemeProperties::COLOR_INFOBAR_CONTENT_AREA_SEPARATOR] = tab_border;
- colors_[ThemeProperties::COLOR_SIDE_PANEL_CONTENT_AREA_SEPARATOR] =
- tab_border;
colors_[ThemeProperties::COLOR_TOOLBAR_CONTENT_AREA_SEPARATOR] = tab_border;
// Separates entries in the downloads bar.
colors_[ThemeProperties::COLOR_TOOLBAR_VERTICAL_SEPARATOR] = tab_border;
@@ -827,8 +761,6 @@ void GtkUi::UpdateColors() {
color_utils::GetResultingPaintColor(GetBgColor(""), frame_color);
color_map[ThemeProperties::COLOR_TOOLBAR] = tab_color;
- color_map[ThemeProperties::COLOR_DOWNLOAD_SHELF] = tab_color;
- color_map[ThemeProperties::COLOR_INFOBAR] = tab_color;
color_map[ThemeProperties::COLOR_TAB_BACKGROUND_ACTIVE_FRAME_ACTIVE] =
tab_color;
color_map[ThemeProperties::COLOR_TAB_BACKGROUND_ACTIVE_FRAME_INACTIVE] =
@@ -850,11 +782,6 @@ void GtkUi::UpdateColors() {
COLOR_TAB_FOREGROUND_INACTIVE_FRAME_INACTIVE_INCOGNITO] =
background_tab_text_color_inactive;
- color_map[ThemeProperties::COLOR_OMNIBOX_TEXT] =
- color_provider->GetColor(ui::kColorTextfieldForeground);
- color_map[ThemeProperties::COLOR_OMNIBOX_BACKGROUND] =
- color_provider->GetColor(ui::kColorTextfieldBackground);
-
// These colors represent the border drawn around tabs and between
// the tabstrip and toolbar.
SkColor toolbar_top_separator = GetBorderColor(
@@ -972,7 +899,7 @@ void GtkUi::UpdateDeviceScaleFactor() {
float old_device_scale_factor = device_scale_factor_;
device_scale_factor_ = GetRawDeviceScaleFactor();
if (device_scale_factor_ != old_device_scale_factor) {
- for (views::DeviceScaleFactorObserver& observer :
+ for (ui::DeviceScaleFactorObserver& observer :
device_scale_factor_observer_list()) {
observer.OnDeviceScaleFactorChanged();
}
diff --git a/chromium/ui/gtk/gtk_ui.h b/chromium/ui/gtk/gtk_ui.h
index 65f9d6c8180..e73bbdf28fb 100644
--- a/chromium/ui/gtk/gtk_ui.h
+++ b/chromium/ui/gtk/gtk_ui.h
@@ -10,13 +10,20 @@
#include <vector>
#include "base/containers/fixed_flat_map.h"
+#include "base/memory/raw_ptr.h"
+#include "printing/buildflags/buildflags.h"
#include "ui/base/glib/glib_signal.h"
#include "ui/gfx/color_utils.h"
+#include "ui/gfx/font_render_params.h"
#include "ui/gtk/gtk_ui_platform.h"
-#include "ui/views/linux_ui/linux_ui.h"
-#include "ui/views/linux_ui/window_frame_provider.h"
+#include "ui/linux/linux_ui_base.h"
+#include "ui/linux/window_frame_provider.h"
#include "ui/views/window/frame_buttons.h"
+#if BUILDFLAG(ENABLE_PRINTING)
+#include "printing/printing_context_linux.h" // nogncheck
+#endif
+
typedef struct _GParamSpec GParamSpec;
typedef struct _GtkParamSpec GtkParamSpec;
typedef struct _GtkSettings GtkSettings;
@@ -30,7 +37,7 @@ class NativeThemeGtk;
class SettingsProvider;
// Interface to GTK desktop features.
-class GtkUi : public views::LinuxUI {
+class GtkUi : public ui::LinuxUiBase {
public:
GtkUi();
@@ -52,8 +59,7 @@ class GtkUi : public views::LinuxUI {
// ui::LinuxInputMethodContextFactory:
std::unique_ptr<ui::LinuxInputMethodContext> CreateInputMethodContext(
- ui::LinuxInputMethodContextDelegate* delegate,
- bool is_simple) const override;
+ ui::LinuxInputMethodContextDelegate* delegate) const override;
// gfx::LinuxFontDelegate:
gfx::FontRenderParams GetDefaultFontRenderParams() const override;
@@ -61,17 +67,16 @@ class GtkUi : public views::LinuxUI {
std::string* family_out,
int* size_pixels_out,
int* style_out,
- gfx::Font::Weight* weight_out,
+ int* weight_out,
gfx::FontRenderParams* params_out) const override;
// ui::ShellDialogLinux:
ui::SelectFileDialog* CreateSelectFileDialog(
- ui::SelectFileDialog::Listener* listener,
+ void* listener,
std::unique_ptr<ui::SelectFilePolicy> policy) const override;
- // views::LinuxUI:
+ // ui::LinuxUi:
bool Initialize() override;
- bool GetTint(int id, color_utils::HSL* tint) const override;
bool GetColor(int id, SkColor* color, bool use_custom_frame) const override;
bool GetDisplayProperty(int id, int* result) const override;
SkColor GetFocusRingColor() const override;
@@ -88,18 +93,24 @@ class GtkUi : public views::LinuxUI {
float GetDeviceScaleFactor() const override;
bool PreferDarkTheme() const override;
bool AnimationsEnabled() const override;
- std::unique_ptr<views::NavButtonProvider> CreateNavButtonProvider() override;
- views::WindowFrameProvider* GetWindowFrameProvider(bool solid_frame) override;
+ std::unique_ptr<ui::NavButtonProvider> CreateNavButtonProvider() override;
+ ui::WindowFrameProvider* GetWindowFrameProvider(bool solid_frame) override;
base::flat_map<std::string, std::string> GetKeyboardLayoutMap() override;
std::string GetCursorThemeName() override;
int GetCursorThemeSize() override;
- std::vector<std::string> GetAvailableSystemThemeNamesForTest() const override;
- void SetSystemThemeByNameForTest(const std::string& theme_name) override;
- ui::NativeTheme* GetNativeTheme() const override;
+ ui::NativeTheme* GetNativeThemeImpl() const override;
// ui::TextEditKeybindingDelegate:
- bool MatchEvent(const ui::Event& event,
- std::vector<ui::TextEditCommandAuraLinux>* commands) override;
+ bool GetTextEditCommandsForEvent(
+ const ui::Event& event,
+ std::vector<ui::TextEditCommandAuraLinux>* commands) override;
+
+#if BUILDFLAG(ENABLE_PRINTING)
+ // printing::PrintingContextLinuxDelegate:
+ printing::PrintDialogLinuxInterface* CreatePrintDialog(
+ printing::PrintingContextLinux* context) override;
+ gfx::Size GetPdfPaperSize(printing::PrintingContextLinux* context) override;
+#endif
private:
using TintMap = std::map<int, color_utils::HSL>;
@@ -142,7 +153,7 @@ class GtkUi : public views::LinuxUI {
std::unique_ptr<GtkUiPlatform> platform_;
- NativeThemeGtk* native_theme_;
+ raw_ptr<NativeThemeGtk> native_theme_;
// Colors calculated by LoadGtkValues() that are given to the
// caller while |use_gtk_| is true.
@@ -186,8 +197,8 @@ class GtkUi : public views::LinuxUI {
// Paints a native window frame. Typically only one of these will be
// non-null. The exception is when the user starts or stops their compositor
// while Chrome is running.
- std::unique_ptr<views::WindowFrameProvider> solid_frame_provider_;
- std::unique_ptr<views::WindowFrameProvider> transparent_frame_provider_;
+ std::unique_ptr<ui::WindowFrameProvider> solid_frame_provider_;
+ std::unique_ptr<ui::WindowFrameProvider> transparent_frame_provider_;
};
} // namespace gtk
diff --git a/chromium/ui/gtk/gtk_ui_factory.cc b/chromium/ui/gtk/gtk_ui_factory.cc
index 06cd8306a98..051d1c3dd86 100644
--- a/chromium/ui/gtk/gtk_ui_factory.cc
+++ b/chromium/ui/gtk/gtk_ui_factory.cc
@@ -6,6 +6,6 @@
#include "ui/gtk/gtk_ui.h"
-std::unique_ptr<views::LinuxUI> BuildGtkUi() {
+std::unique_ptr<ui::LinuxUi> BuildGtkUi() {
return std::make_unique<gtk::GtkUi>();
}
diff --git a/chromium/ui/gtk/gtk_ui_factory.h b/chromium/ui/gtk/gtk_ui_factory.h
index f0766020c4a..dd808515c02 100644
--- a/chromium/ui/gtk/gtk_ui_factory.h
+++ b/chromium/ui/gtk/gtk_ui_factory.h
@@ -9,13 +9,13 @@
#include "base/component_export.h"
-namespace views {
-class LinuxUI;
+namespace ui {
+class LinuxUi;
}
// Access point to the GTK desktop system. This should be the only symbol
// exported from this component.
COMPONENT_EXPORT(GTK)
-std::unique_ptr<views::LinuxUI> BuildGtkUi();
+std::unique_ptr<ui::LinuxUi> BuildGtkUi();
#endif // UI_GTK_GTK_UI_FACTORY_H_
diff --git a/chromium/ui/gtk/gtk_ui_platform.h b/chromium/ui/gtk/gtk_ui_platform.h
index b2e4226e9a1..633efbcf167 100644
--- a/chromium/ui/gtk/gtk_ui_platform.h
+++ b/chromium/ui/gtk/gtk_ui_platform.h
@@ -10,11 +10,15 @@
#include "ui/gfx/native_widget_types.h"
#include "ui/gtk/gtk_compat.h"
-using GdkKeymap = struct _GdkKeymap;
using GtkWindow = struct _GtkWindow;
using GtkWidget = struct _GtkWidget;
using GdkWindow = struct _GdkWindow;
+namespace ui {
+class LinuxInputMethodContext;
+class LinuxInputMethodContextDelegate;
+} // namespace ui
+
namespace gtk {
// GtkUiPlatform encapsulates platform-specific functionalities required by
@@ -53,8 +57,9 @@ class GtkUiPlatform {
// needed, if any.
virtual void ShowGtkWindow(GtkWindow* window) = 0;
- // Reports whether InputMethodContextImplGtk is the preferred input method.
- virtual bool PreferGtkIme() = 0;
+ // Creates a new IME context or may return nullptr.
+ virtual std::unique_ptr<ui::LinuxInputMethodContext> CreateInputMethodContext(
+ ui::LinuxInputMethodContextDelegate* delegate) const = 0;
};
} // namespace gtk
diff --git a/chromium/ui/gtk/gtk_ui_platform_stub.cc b/chromium/ui/gtk/gtk_ui_platform_stub.cc
index 692da3c0cc5..5f01c8bd8ff 100644
--- a/chromium/ui/gtk/gtk_ui_platform_stub.cc
+++ b/chromium/ui/gtk/gtk_ui_platform_stub.cc
@@ -43,8 +43,10 @@ void GtkUiPlatformStub::ShowGtkWindow(GtkWindow* window) {
gtk_window_present(window);
}
-bool GtkUiPlatformStub::PreferGtkIme() {
- return true;
+std::unique_ptr<ui::LinuxInputMethodContext>
+GtkUiPlatformStub::CreateInputMethodContext(
+ ui::LinuxInputMethodContextDelegate* delegate) const {
+ return nullptr;
}
} // namespace gtk
diff --git a/chromium/ui/gtk/gtk_ui_platform_stub.h b/chromium/ui/gtk/gtk_ui_platform_stub.h
index 026a8fef295..708e05ab049 100644
--- a/chromium/ui/gtk/gtk_ui_platform_stub.h
+++ b/chromium/ui/gtk/gtk_ui_platform_stub.h
@@ -26,7 +26,8 @@ class GtkUiPlatformStub : public GtkUiPlatform {
gfx::AcceleratedWidget parent) override;
void ClearTransientFor(gfx::AcceleratedWidget parent) override;
void ShowGtkWindow(GtkWindow* window) override;
- bool PreferGtkIme() override;
+ std::unique_ptr<ui::LinuxInputMethodContext> CreateInputMethodContext(
+ ui::LinuxInputMethodContextDelegate* delegate) const override;
};
} // namespace gtk
diff --git a/chromium/ui/gtk/gtk_util.cc b/chromium/ui/gtk/gtk_util.cc
index 54b8dd66416..6f10b3f746e 100644
--- a/chromium/ui/gtk/gtk_util.cc
+++ b/chromium/ui/gtk/gtk_util.cc
@@ -27,9 +27,9 @@
#include "ui/gtk/gtk_compat.h"
#include "ui/gtk/gtk_ui.h"
#include "ui/gtk/gtk_ui_platform.h"
+#include "ui/linux/linux_ui.h"
#include "ui/native_theme/common_theme.h"
#include "ui/ozone/public/ozone_platform.h"
-#include "ui/views/linux_ui/linux_ui.h"
namespace gtk {
@@ -683,7 +683,7 @@ gfx::Size GetSeparatorSize(bool horizontal) {
}
float GetDeviceScaleFactor() {
- views::LinuxUI* linux_ui = views::LinuxUI::instance();
+ ui::LinuxUi* linux_ui = ui::LinuxUi::instance();
return linux_ui ? linux_ui->GetDeviceScaleFactor() : 1;
}
diff --git a/chromium/ui/gtk/gtk_util.h b/chromium/ui/gtk/gtk_util.h
index d72d96f2a75..65cae035dcb 100644
--- a/chromium/ui/gtk/gtk_util.h
+++ b/chromium/ui/gtk/gtk_util.h
@@ -9,6 +9,7 @@
#include <vector>
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
#include "ui/base/glib/scoped_gobject.h"
#include "ui/color/color_id.h"
#include "ui/gtk/gtk_compat.h"
@@ -70,8 +71,8 @@ class CairoSurface {
SkColor GetAveragePixelValue(bool frame);
private:
- cairo_surface_t* surface_;
- cairo_t* cairo_;
+ raw_ptr<cairo_surface_t, DanglingUntriaged> surface_;
+ raw_ptr<cairo_t> cairo_;
};
class GtkCssContext {
@@ -107,7 +108,7 @@ class GtkCssContext {
// GTK4 state.
// GTK widgets own their children, so instead of keeping a reference to the
// widget directly, keep a reference to the root widget.
- GtkWidget* widget_ = nullptr;
+ raw_ptr<GtkWidget> widget_ = nullptr;
ScopedGObject<GtkWidget> root_;
};
diff --git a/chromium/ui/gtk/input_method_context_impl_gtk.cc b/chromium/ui/gtk/input_method_context_impl_gtk.cc
index a1d0dcb687e..fdd18e0f961 100644
--- a/chromium/ui/gtk/input_method_context_impl_gtk.cc
+++ b/chromium/ui/gtk/input_method_context_impl_gtk.cc
@@ -20,7 +20,7 @@
#include "ui/gtk/gtk_ui.h"
#include "ui/gtk/gtk_ui_platform.h"
#include "ui/gtk/gtk_util.h"
-#include "ui/views/linux_ui/linux_ui.h"
+#include "ui/linux/linux_ui.h"
namespace gtk {
@@ -65,27 +65,36 @@ GdkEvent* GdkEventFromImeKeyEvent(const ui::KeyEvent& key_event) {
} // namespace
InputMethodContextImplGtk::InputMethodContextImplGtk(
- ui::LinuxInputMethodContextDelegate* delegate,
- bool is_simple)
- : delegate_(delegate), is_simple_(is_simple) {
+ ui::LinuxInputMethodContextDelegate* delegate)
+ : delegate_(delegate) {
CHECK(delegate_);
- gtk_context_ =
- is_simple ? gtk_im_context_simple_new() : gtk_im_multicontext_new();
+ gtk_context_ = gtk_im_multicontext_new();
+ gtk_simple_context_ = gtk_im_context_simple_new();
g_signal_connect(gtk_context_, "commit", G_CALLBACK(OnCommitThunk), this);
+ g_signal_connect(gtk_simple_context_, "commit", G_CALLBACK(OnCommitThunk),
+ this);
g_signal_connect(gtk_context_, "preedit-changed",
G_CALLBACK(OnPreeditChangedThunk), this);
+ g_signal_connect(gtk_simple_context_, "preedit-changed",
+ G_CALLBACK(OnPreeditChangedThunk), this);
g_signal_connect(gtk_context_, "preedit-end", G_CALLBACK(OnPreeditEndThunk),
this);
+ g_signal_connect(gtk_simple_context_, "preedit-end",
+ G_CALLBACK(OnPreeditEndThunk), this);
g_signal_connect(gtk_context_, "preedit-start",
G_CALLBACK(OnPreeditStartThunk), this);
+ g_signal_connect(gtk_simple_context_, "preedit-start",
+ G_CALLBACK(OnPreeditStartThunk), this);
// TODO(shuchen): Handle operations on surrounding text.
// "delete-surrounding" and "retrieve-surrounding" signals should be
// handled.
- if (GtkCheckVersion(4))
+ if (GtkCheckVersion(4)) {
gtk_im_context_set_client_widget(gtk_context_, GetDummyWindow());
+ gtk_im_context_set_client_widget(gtk_simple_context_, GetDummyWindow());
+ }
}
InputMethodContextImplGtk::~InputMethodContextImplGtk() {
@@ -93,12 +102,17 @@ InputMethodContextImplGtk::~InputMethodContextImplGtk() {
g_object_unref(gtk_context_);
gtk_context_ = nullptr;
}
+ if (gtk_simple_context_) {
+ g_object_unref(gtk_simple_context_);
+ gtk_simple_context_ = nullptr;
+ }
}
// Overridden from ui::LinuxInputMethodContext
bool InputMethodContextImplGtk::DispatchKeyEvent(
const ui::KeyEvent& key_event) {
- if (!gtk_context_)
+ auto* gtk_context = GetIMContext();
+ if (!gtk_context)
return false;
GdkEvent* event = nullptr;
@@ -115,13 +129,15 @@ bool InputMethodContextImplGtk::DispatchKeyEvent(
return false;
}
- SetContextClientWindow(target_window);
+ SetContextClientWindow(target_window, gtk_context);
}
// Convert the last known caret bounds relative to the screen coordinates
// to a GdkRectangle relative to the client window.
aura::Window* window = static_cast<aura::Window*>(key_event.target());
- gfx::Rect caret_bounds = last_caret_bounds_;
+ gfx::Rect caret_bounds;
+ if (gtk_context == gtk_context_)
+ caret_bounds = last_caret_bounds_;
caret_bounds -= window->GetBoundsInScreen().OffsetFromOrigin();
// Chrome's DIPs may be different from GTK's DIPs if
@@ -131,11 +147,11 @@ bool InputMethodContextImplGtk::DispatchKeyEvent(
GetDeviceScaleFactor() / gtk_widget_get_scale_factor(GetDummyWindow()));
GdkRectangle gdk_rect = {caret_bounds.x(), caret_bounds.y(),
caret_bounds.width(), caret_bounds.height()};
- gtk_im_context_set_cursor_location(gtk_context_, &gdk_rect);
+ gtk_im_context_set_cursor_location(gtk_context, &gdk_rect);
if (!GtkCheckVersion(4)) {
const bool handled =
- GtkImContextFilterKeypress(gtk_context_, GdkEventToKey(event));
+ GtkImContextFilterKeypress(gtk_context, GdkEventToKey(event));
gdk_event_free(event);
return handled;
}
@@ -153,7 +169,7 @@ bool InputMethodContextImplGtk::DispatchKeyEvent(
auto keycode = GetKeyEventProperty(key_event, ui::kPropertyKeyboardHwKeyCode);
auto state = GtkUi::GetPlatform()->GetGdkKeyEventState(key_event);
auto group = GtkUi::GetPlatform()->GetGdkKeyEventGroup(key_event);
- return gtk_im_context_filter_key(gtk_context_, press, surface, device, time,
+ return gtk_im_context_filter_key(gtk_context, press, surface, device, time,
keycode, state, group);
}
@@ -165,43 +181,34 @@ bool InputMethodContextImplGtk::IsPeekKeyEvent(const ui::KeyEvent& key_event) {
void InputMethodContextImplGtk::Reset() {
gtk_im_context_reset(gtk_context_);
+ gtk_im_context_reset(gtk_simple_context_);
// Some input methods may not honour the reset call.
// Focusing out/in the to make sure it gets reset correctly.
- if (!is_simple_ && has_focus_) {
- Blur();
- Focus();
+ if (type_ != ui::TEXT_INPUT_TYPE_NONE) {
+ gtk_im_context_focus_out(gtk_context_);
+ gtk_im_context_focus_in(gtk_context_);
}
}
void InputMethodContextImplGtk::UpdateFocus(bool has_client,
ui::TextInputType old_type,
ui::TextInputType new_type) {
- if (is_simple_) {
- // simple context can be used in any textfield, including password box, and
- // even if the focused text input client's text input type is
- // ui::TEXT_INPUT_TYPE_NONE.
- if (has_client)
- Focus();
- else
- Blur();
- } else {
- // Otherwise We only focus when the focus is in a textfield.
- if (old_type != ui::TEXT_INPUT_TYPE_NONE)
- Blur();
- if (new_type != ui::TEXT_INPUT_TYPE_NONE)
- Focus();
- }
-}
-
-void InputMethodContextImplGtk::Focus() {
- gtk_im_context_focus_in(gtk_context_);
- has_focus_ = true;
-}
-
-void InputMethodContextImplGtk::Blur() {
- gtk_im_context_focus_out(gtk_context_);
- has_focus_ = false;
+ type_ = new_type;
+
+ // We only focus when the focus is in a textfield.
+ if (old_type != ui::TEXT_INPUT_TYPE_NONE)
+ gtk_im_context_focus_out(gtk_context_);
+ if (new_type != ui::TEXT_INPUT_TYPE_NONE)
+ gtk_im_context_focus_in(gtk_context_);
+
+ // simple context can be used in any textfield, including password box, and
+ // even if the focused text input client's text input type is
+ // ui::TEXT_INPUT_TYPE_NONE.
+ if (has_client)
+ gtk_im_context_focus_in(gtk_simple_context_);
+ else
+ gtk_im_context_focus_out(gtk_simple_context_);
}
void InputMethodContextImplGtk::SetCursorLocation(const gfx::Rect& rect) {
@@ -222,14 +229,14 @@ void InputMethodContextImplGtk::SetSurroundingText(
// GtkIMContext event handlers.
void InputMethodContextImplGtk::OnCommit(GtkIMContext* context, gchar* text) {
- if (context != gtk_context_)
+ if (context != GetIMContext())
return;
delegate_->OnCommit(base::UTF8ToUTF16(text));
}
void InputMethodContextImplGtk::OnPreeditChanged(GtkIMContext* context) {
- if (context != gtk_context_)
+ if (context != GetIMContext())
return;
gchar* str = nullptr;
@@ -246,29 +253,36 @@ void InputMethodContextImplGtk::OnPreeditChanged(GtkIMContext* context) {
}
void InputMethodContextImplGtk::OnPreeditEnd(GtkIMContext* context) {
- if (context != gtk_context_)
+ if (context != GetIMContext())
return;
delegate_->OnPreeditEnd();
}
void InputMethodContextImplGtk::OnPreeditStart(GtkIMContext* context) {
- if (context != gtk_context_)
+ if (context != GetIMContext())
return;
delegate_->OnPreeditStart();
}
-void InputMethodContextImplGtk::SetContextClientWindow(GdkWindow* window) {
+void InputMethodContextImplGtk::SetContextClientWindow(
+ GdkWindow* window,
+ GtkIMContext* gtk_context) {
+ gpointer& gdk_last_set_client_window =
+ gtk_context == gtk_simple_context_
+ ? gdk_last_set_client_window_for_simple_
+ : gdk_last_set_client_window_;
+
DCHECK(!GtkCheckVersion(4));
- if (window == gdk_last_set_client_window_)
+ if (window == gdk_last_set_client_window)
return;
- gtk_im_context_set_client_window(gtk_context_, window);
+ gtk_im_context_set_client_window(gtk_context, window);
// Prevent leaks when overriding last client window
- if (gdk_last_set_client_window_)
- g_object_unref(gdk_last_set_client_window_);
- gdk_last_set_client_window_ = window;
+ if (gdk_last_set_client_window)
+ g_object_unref(gdk_last_set_client_window);
+ gdk_last_set_client_window = window;
}
void InputMethodContextImplGtk::SetContentType(ui::TextInputType type,
@@ -283,4 +297,14 @@ InputMethodContextImplGtk::GetVirtualKeyboardController() {
return nullptr;
}
+GtkIMContext* InputMethodContextImplGtk::GetIMContext() {
+ switch (type_) {
+ case ui::TEXT_INPUT_TYPE_NONE:
+ case ui::TEXT_INPUT_TYPE_PASSWORD:
+ return gtk_simple_context_;
+ default:
+ return gtk_context_;
+ }
+}
+
} // namespace gtk
diff --git a/chromium/ui/gtk/input_method_context_impl_gtk.h b/chromium/ui/gtk/input_method_context_impl_gtk.h
index 53d82e18dc3..e3fde643fcb 100644
--- a/chromium/ui/gtk/input_method_context_impl_gtk.h
+++ b/chromium/ui/gtk/input_method_context_impl_gtk.h
@@ -7,6 +7,7 @@
#include <string>
+#include "base/memory/raw_ptr.h"
#include "ui/base/glib/glib_integers.h"
#include "ui/base/glib/glib_signal.h"
#include "ui/base/ime/linux/linux_input_method_context.h"
@@ -21,8 +22,8 @@ namespace gtk {
// (gtk-immodule) as a bridge from/to underlying IMEs.
class InputMethodContextImplGtk : public ui::LinuxInputMethodContext {
public:
- InputMethodContextImplGtk(ui::LinuxInputMethodContextDelegate* delegate,
- bool is_simple);
+ explicit InputMethodContextImplGtk(
+ ui::LinuxInputMethodContextDelegate* delegate);
InputMethodContextImplGtk(const InputMethodContextImplGtk&) = delete;
InputMethodContextImplGtk& operator=(const InputMethodContextImplGtk&) =
@@ -44,6 +45,10 @@ class InputMethodContextImplGtk : public ui::LinuxInputMethodContext {
ui::TextInputMode mode,
uint32_t flags,
bool should_do_learning) override;
+ void SetGrammarFragmentAtCursor(
+ const ui::GrammarFragment& fragment) override {}
+ void SetAutocorrectInfo(const gfx::Range& autocorrect_range,
+ const gfx::Rect& autocorrect_bounds) override {}
ui::VirtualKeyboardController* GetVirtualKeyboardController() override;
private:
@@ -67,33 +72,29 @@ class InputMethodContextImplGtk : public ui::LinuxInputMethodContext {
OnPreeditStart,
GtkIMContext*);
- // Called on getting focus.
- void Focus();
-
- // Called on loosing focus.
- void Blur();
-
// Only used on GTK3.
- void SetContextClientWindow(GdkWindow* window);
+ void SetContextClientWindow(GdkWindow* window, GtkIMContext* gtk_context);
- // A set of callback functions. Must not be nullptr.
- ui::LinuxInputMethodContextDelegate* const delegate_;
+ // Returns the IMContext depending on the currently connected input field
+ // type.
+ GtkIMContext* GetIMContext();
- // Input method context type flag.
- // - true if it supports table-based input methods
- // - false if it supports multiple, loadable input methods
- const bool is_simple_;
+ // A set of callback functions. Must not be nullptr.
+ const raw_ptr<ui::LinuxInputMethodContextDelegate> delegate_;
- // Keeps track of current focus state.
- bool has_focus_ = false;
+ // Tracks the input field type.
+ ui::TextInputType type_ = ui::TEXT_INPUT_TYPE_NONE;
// IME's input GTK context.
- GtkIMContext* gtk_context_ = nullptr;
+ raw_ptr<GtkIMContext> gtk_context_ = nullptr;
+ raw_ptr<GtkIMContext> gtk_simple_context_ = nullptr;
// Only used on GTK3.
gpointer gdk_last_set_client_window_ = nullptr;
+ gpointer gdk_last_set_client_window_for_simple_ = nullptr;
// Last known caret bounds relative to the screen coordinates, in DIPs.
+ // Effective only on non-simple context.
gfx::Rect last_caret_bounds_;
};
diff --git a/chromium/ui/gtk/native_theme_gtk.cc b/chromium/ui/gtk/native_theme_gtk.cc
index 779fbe2f08c..93281b8b9bf 100644
--- a/chromium/ui/gtk/native_theme_gtk.cc
+++ b/chromium/ui/gtk/native_theme_gtk.cc
@@ -213,86 +213,6 @@ void NativeThemeGtk::OnThemeChanged(GtkSettings* settings,
NotifyOnNativeThemeUpdated();
}
-void NativeThemeGtk::PaintArrowButton(
- cc::PaintCanvas* canvas,
- const gfx::Rect& rect,
- Part direction,
- State state,
- ColorScheme color_scheme,
- const ScrollbarArrowExtraParams& arrow) const {
- // Add the "flat" styleclass to avoid drawing a border.
- auto context = GetStyleContextFromCss(
- GtkCheckVersion(3, 20)
- ? StrCat({GtkCssMenuScrollbar(), " #range GtkButton#button.flat"})
- : "GtkRange.scrollbar.button.flat");
- // Remove any rounded corners since arrow scrollbar buttons are tiny.
- ApplyCssToContext(context, "* { border-radius: 0px; }");
- GtkStateFlags state_flags = StateToStateFlags(state);
- gtk_style_context_set_state(context, state_flags);
-
- switch (direction) {
- case kScrollbarUpArrow:
- gtk_style_context_add_class(context, "top");
- break;
- case kScrollbarRightArrow:
- gtk_style_context_add_class(context, "right");
- break;
- case kScrollbarDownArrow:
- gtk_style_context_add_class(context, "bottom");
- break;
- case kScrollbarLeftArrow:
- gtk_style_context_add_class(context, "left");
- break;
- default:
- NOTREACHED();
- }
-
- PaintWidget(canvas, rect, context, BG_RENDER_NORMAL, false);
- PaintArrow(canvas, rect, direction, GtkStyleContextGetColor(context));
-}
-
-void NativeThemeGtk::PaintScrollbarTrack(
- cc::PaintCanvas* canvas,
- Part part,
- State state,
- const ScrollbarTrackExtraParams& extra_params,
- const gfx::Rect& rect,
- ColorScheme color_scheme) const {
- PaintWidget(
- canvas, rect,
- GetStyleContextFromCss(GtkCheckVersion(3, 20)
- ? StrCat({GtkCssMenuScrollbar(), " #trough"})
- : "GtkScrollbar.scrollbar.trough"),
- BG_RENDER_NORMAL, true);
-}
-
-void NativeThemeGtk::PaintScrollbarThumb(
- cc::PaintCanvas* canvas,
- const ui::ColorProvider* color_provider,
- Part part,
- State state,
- const gfx::Rect& rect,
- NativeTheme::ScrollbarOverlayColorTheme theme,
- ColorScheme color_scheme) const {
- auto context = GetStyleContextFromCss(
- GtkCheckVersion(3, 20)
- ? StrCat({GtkCssMenuScrollbar(), " #trough #slider"})
- : "GtkScrollbar.scrollbar.slider");
- gtk_style_context_set_state(context, StateToStateFlags(state));
- PaintWidget(canvas, rect, context, BG_RENDER_NORMAL, true);
-}
-
-void NativeThemeGtk::PaintScrollbarCorner(cc::PaintCanvas* canvas,
- State state,
- const gfx::Rect& rect,
- ColorScheme color_scheme) const {
- auto context = GetStyleContextFromCss(
- GtkCheckVersion(3, 19, 2)
- ? "GtkScrolledWindow#scrolledwindow #junction"
- : "GtkScrolledWindow.scrolledwindow.scrollbars-junction");
- PaintWidget(canvas, rect, context, BG_RENDER_NORMAL, true);
-}
-
void NativeThemeGtk::PaintMenuPopupBackground(
cc::PaintCanvas* canvas,
const ui::ColorProvider* color_provider,
diff --git a/chromium/ui/gtk/native_theme_gtk.h b/chromium/ui/gtk/native_theme_gtk.h
index f8444e1a40a..5307f6c4b0d 100644
--- a/chromium/ui/gtk/native_theme_gtk.h
+++ b/chromium/ui/gtk/native_theme_gtk.h
@@ -29,29 +29,6 @@ class NativeThemeGtk : public ui::NativeThemeBase {
NativeThemeGtk& operator=(const NativeThemeGtk&) = delete;
// ui::NativeThemeBase:
- void PaintArrowButton(cc::PaintCanvas* canvas,
- const gfx::Rect& rect,
- Part direction,
- State state,
- ColorScheme color_scheme,
- const ScrollbarArrowExtraParams& arrow) const override;
- void PaintScrollbarTrack(cc::PaintCanvas* canvas,
- Part part,
- State state,
- const ScrollbarTrackExtraParams& extra_params,
- const gfx::Rect& rect,
- ColorScheme color_scheme) const override;
- void PaintScrollbarThumb(cc::PaintCanvas* canvas,
- const ui::ColorProvider* color_provider,
- Part part,
- State state,
- const gfx::Rect& rect,
- NativeTheme::ScrollbarOverlayColorTheme theme,
- ColorScheme color_scheme) const override;
- void PaintScrollbarCorner(cc::PaintCanvas* canvas,
- State state,
- const gfx::Rect& rect,
- ColorScheme color_scheme) const override;
void PaintMenuPopupBackground(
cc::PaintCanvas* canvas,
const ui::ColorProvider* color_provider,
diff --git a/chromium/ui/gtk/nav_button_provider_gtk.cc b/chromium/ui/gtk/nav_button_provider_gtk.cc
index e592602828d..46d2a67ce95 100644
--- a/chromium/ui/gtk/nav_button_provider_gtk.cc
+++ b/chromium/ui/gtk/nav_button_provider_gtk.cc
@@ -12,6 +12,7 @@
#include "ui/gfx/image/image_skia_source.h"
#include "ui/gtk/gtk_compat.h"
#include "ui/gtk/gtk_util.h"
+#include "ui/linux/nav_button_provider.h"
#include "ui/views/widget/widget.h"
namespace gtk {
@@ -33,14 +34,14 @@ const int kNavButtonIconSize = 16;
const int kHeaderSpacing = 6;
const char* ButtonStyleClassFromButtonType(
- views::NavButtonProvider::FrameButtonDisplayType type) {
+ ui::NavButtonProvider::FrameButtonDisplayType type) {
switch (type) {
- case views::NavButtonProvider::FrameButtonDisplayType::kMinimize:
+ case ui::NavButtonProvider::FrameButtonDisplayType::kMinimize:
return "minimize";
- case views::NavButtonProvider::FrameButtonDisplayType::kMaximize:
- case views::NavButtonProvider::FrameButtonDisplayType::kRestore:
+ case ui::NavButtonProvider::FrameButtonDisplayType::kMaximize:
+ case ui::NavButtonProvider::FrameButtonDisplayType::kRestore:
return "maximize";
- case views::NavButtonProvider::FrameButtonDisplayType::kClose:
+ case ui::NavButtonProvider::FrameButtonDisplayType::kClose:
return "close";
default:
NOTREACHED();
@@ -48,16 +49,17 @@ const char* ButtonStyleClassFromButtonType(
}
}
-GtkStateFlags GtkStateFlagsFromButtonState(views::Button::ButtonState state) {
+GtkStateFlags GtkStateFlagsFromButtonState(
+ ui::NavButtonProvider::ButtonState state) {
switch (state) {
- case views::Button::STATE_NORMAL:
+ case ui::NavButtonProvider::ButtonState::kNormal:
return GTK_STATE_FLAG_NORMAL;
- case views::Button::STATE_HOVERED:
+ case ui::NavButtonProvider::ButtonState::kHovered:
return GTK_STATE_FLAG_PRELIGHT;
- case views::Button::STATE_PRESSED:
+ case ui::NavButtonProvider::ButtonState::kPressed:
return static_cast<GtkStateFlags>(GTK_STATE_FLAG_PRELIGHT |
GTK_STATE_FLAG_ACTIVE);
- case views::Button::STATE_DISABLED:
+ case ui::NavButtonProvider::ButtonState::kDisabled:
return GTK_STATE_FLAG_INSENSITIVE;
default:
NOTREACHED();
@@ -66,15 +68,15 @@ GtkStateFlags GtkStateFlagsFromButtonState(views::Button::ButtonState state) {
}
const char* IconNameFromButtonType(
- views::NavButtonProvider::FrameButtonDisplayType type) {
+ ui::NavButtonProvider::FrameButtonDisplayType type) {
switch (type) {
- case views::NavButtonProvider::FrameButtonDisplayType::kMinimize:
+ case ui::NavButtonProvider::FrameButtonDisplayType::kMinimize:
return "window-minimize-symbolic";
- case views::NavButtonProvider::FrameButtonDisplayType::kMaximize:
+ case ui::NavButtonProvider::FrameButtonDisplayType::kMaximize:
return "window-maximize-symbolic";
- case views::NavButtonProvider::FrameButtonDisplayType::kRestore:
+ case ui::NavButtonProvider::FrameButtonDisplayType::kRestore:
return "window-restore-symbolic";
- case views::NavButtonProvider::FrameButtonDisplayType::kClose:
+ case ui::NavButtonProvider::FrameButtonDisplayType::kClose:
return "window-close-symbolic";
default:
NOTREACHED();
@@ -82,11 +84,10 @@ const char* IconNameFromButtonType(
}
}
-gfx::Size LoadNavButtonIcon(
- views::NavButtonProvider::FrameButtonDisplayType type,
- GtkStyleContext* button_context,
- int scale,
- NavButtonIcon* icon = nullptr) {
+gfx::Size LoadNavButtonIcon(ui::NavButtonProvider::FrameButtonDisplayType type,
+ GtkStyleContext* button_context,
+ int scale,
+ NavButtonIcon* icon = nullptr) {
const char* icon_name = IconNameFromButtonType(type);
if (!GtkCheckVersion(4)) {
auto icon_info = TakeGObject(gtk_icon_theme_lookup_icon_for_scale(
@@ -186,7 +187,7 @@ GtkCssContext CreateWindowControlsContext(bool maximized) {
}
void CalculateUnscaledButtonSize(
- views::NavButtonProvider::FrameButtonDisplayType type,
+ ui::NavButtonProvider::FrameButtonDisplayType type,
bool maximized,
gfx::Size* button_size,
gfx::Insets* button_margin) {
@@ -213,8 +214,8 @@ void CalculateUnscaledButtonSize(
class NavButtonImageSource : public gfx::ImageSkiaSource {
public:
- NavButtonImageSource(views::NavButtonProvider::FrameButtonDisplayType type,
- views::Button::ButtonState state,
+ NavButtonImageSource(ui::NavButtonProvider::FrameButtonDisplayType type,
+ ui::NavButtonProvider::ButtonState state,
bool maximized,
bool active,
gfx::Size button_size)
@@ -339,8 +340,8 @@ class NavButtonImageSource : public gfx::ImageSkiaSource {
bool HasRepresentationAtAllScales() const override { return true; }
private:
- views::NavButtonProvider::FrameButtonDisplayType type_;
- views::Button::ButtonState state_;
+ ui::NavButtonProvider::FrameButtonDisplayType type_;
+ ui::NavButtonProvider::ButtonState state_;
bool maximized_;
bool active_;
gfx::Size button_size_;
@@ -359,15 +360,15 @@ void NavButtonProviderGtk::RedrawImages(int top_area_height,
auto header_padding = GtkStyleContextGetPadding(header_context);
double scale = 1.0f;
- std::map<views::NavButtonProvider::FrameButtonDisplayType, gfx::Size>
+ std::map<ui::NavButtonProvider::FrameButtonDisplayType, gfx::Size>
button_sizes;
- std::map<views::NavButtonProvider::FrameButtonDisplayType, gfx::Insets>
+ std::map<ui::NavButtonProvider::FrameButtonDisplayType, gfx::Insets>
button_margins;
- std::vector<views::NavButtonProvider::FrameButtonDisplayType> display_types{
- views::NavButtonProvider::FrameButtonDisplayType::kMinimize,
- maximized ? views::NavButtonProvider::FrameButtonDisplayType::kRestore
- : views::NavButtonProvider::FrameButtonDisplayType::kMaximize,
- views::NavButtonProvider::FrameButtonDisplayType::kClose,
+ std::vector<ui::NavButtonProvider::FrameButtonDisplayType> display_types{
+ ui::NavButtonProvider::FrameButtonDisplayType::kMinimize,
+ maximized ? ui::NavButtonProvider::FrameButtonDisplayType::kRestore
+ : ui::NavButtonProvider::FrameButtonDisplayType::kMaximize,
+ ui::NavButtonProvider::FrameButtonDisplayType::kClose,
};
for (auto type : display_types) {
CalculateUnscaledButtonSize(type, maximized, &button_sizes[type],
@@ -413,26 +414,32 @@ void NavButtonProviderGtk::RedrawImages(int top_area_height,
button_margins_[type] = margin;
- for (size_t state = 0; state < views::Button::STATE_COUNT; state++) {
- button_images_[type][state] = gfx::ImageSkia(
- std::make_unique<NavButtonImageSource>(
- type, static_cast<views::Button::ButtonState>(state), maximized,
- active, size),
- size);
+ for (auto state : {
+ ui::NavButtonProvider::ButtonState::kNormal,
+ ui::NavButtonProvider::ButtonState::kHovered,
+ ui::NavButtonProvider::ButtonState::kPressed,
+ ui::NavButtonProvider::ButtonState::kDisabled,
+ }) {
+ button_images_[type][state] =
+ gfx::ImageSkia(std::make_unique<NavButtonImageSource>(
+ type, state, maximized, active, size),
+ size);
}
}
}
gfx::ImageSkia NavButtonProviderGtk::GetImage(
- views::NavButtonProvider::FrameButtonDisplayType type,
- views::Button::ButtonState state) const {
+ ui::NavButtonProvider::FrameButtonDisplayType type,
+ ui::NavButtonProvider::ButtonState state) const {
auto it = button_images_.find(type);
DCHECK(it != button_images_.end());
- return it->second[state];
+ auto it2 = it->second.find(state);
+ DCHECK(it2 != it->second.end());
+ return it2->second;
}
gfx::Insets NavButtonProviderGtk::GetNavButtonMargin(
- views::NavButtonProvider::FrameButtonDisplayType type) const {
+ ui::NavButtonProvider::FrameButtonDisplayType type) const {
auto it = button_margins_.find(type);
DCHECK(it != button_margins_.end());
return it->second;
diff --git a/chromium/ui/gtk/nav_button_provider_gtk.h b/chromium/ui/gtk/nav_button_provider_gtk.h
index ffedf019c8e..8fd2c49cfcd 100644
--- a/chromium/ui/gtk/nav_button_provider_gtk.h
+++ b/chromium/ui/gtk/nav_button_provider_gtk.h
@@ -7,31 +7,32 @@
#include <map>
+#include "base/containers/flat_map.h"
+#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/image/image_skia.h"
-#include "ui/views/controls/button/button.h"
-#include "ui/views/linux_ui/nav_button_provider.h"
+#include "ui/linux/nav_button_provider.h"
namespace gtk {
-class NavButtonProviderGtk : public views::NavButtonProvider {
+class NavButtonProviderGtk : public ui::NavButtonProvider {
public:
NavButtonProviderGtk();
~NavButtonProviderGtk() override;
- // views::NavButtonProvider:
+ // ui::NavButtonProvider:
void RedrawImages(int top_area_height, bool maximized, bool active) override;
- gfx::ImageSkia GetImage(views::NavButtonProvider::FrameButtonDisplayType type,
- views::Button::ButtonState state) const override;
+ gfx::ImageSkia GetImage(ui::NavButtonProvider::FrameButtonDisplayType type,
+ ButtonState state) const override;
gfx::Insets GetNavButtonMargin(
- views::NavButtonProvider::FrameButtonDisplayType type) const override;
+ ui::NavButtonProvider::FrameButtonDisplayType type) const override;
gfx::Insets GetTopAreaSpacing() const override;
int GetInterNavButtonSpacing() const override;
private:
- std::map<views::NavButtonProvider::FrameButtonDisplayType,
- gfx::ImageSkia[views::Button::STATE_COUNT]>
+ std::map<ui::NavButtonProvider::FrameButtonDisplayType,
+ base::flat_map<ui::NavButtonProvider::ButtonState, gfx::ImageSkia>>
button_images_;
- std::map<views::NavButtonProvider::FrameButtonDisplayType, gfx::Insets>
+ std::map<ui::NavButtonProvider::FrameButtonDisplayType, gfx::Insets>
button_margins_;
gfx::Insets top_area_spacing_;
int inter_button_spacing_;
diff --git a/chromium/ui/gtk/printing/print_dialog_gtk.cc b/chromium/ui/gtk/printing/print_dialog_gtk.cc
index 8ff9cf6dec6..db23b214107 100644
--- a/chromium/ui/gtk/printing/print_dialog_gtk.cc
+++ b/chromium/ui/gtk/printing/print_dialog_gtk.cc
@@ -14,6 +14,7 @@
#include "base/bind.h"
#include "base/files/file_util.h"
#include "base/logging.h"
+#include "base/memory/raw_ptr.h"
#include "base/no_destructor.h"
#include "base/sequence_checker.h"
#include "base/strings/utf_string_conversions.h"
@@ -116,7 +117,7 @@ class StickyPrintSettingGtk {
}
private:
- GtkPrintSettings* last_used_settings_;
+ raw_ptr<GtkPrintSettings> last_used_settings_;
};
StickyPrintSettingGtk& GetLastUsedSettings() {
@@ -167,13 +168,13 @@ class GtkPrinterList {
}
std::vector<GtkPrinter*> printers_;
- GtkPrinter* default_printer_ = nullptr;
+ raw_ptr<GtkPrinter> default_printer_ = nullptr;
};
} // namespace
// static
-printing::PrintDialogGtkInterface* PrintDialogGtk::CreatePrintDialog(
+printing::PrintDialogLinuxInterface* PrintDialogGtk::CreatePrintDialog(
PrintingContextLinux* context) {
return new PrintDialogGtk(context);
}
diff --git a/chromium/ui/gtk/printing/print_dialog_gtk.h b/chromium/ui/gtk/printing/print_dialog_gtk.h
index 2e7e45d2b39..53eafbee253 100644
--- a/chromium/ui/gtk/printing/print_dialog_gtk.h
+++ b/chromium/ui/gtk/printing/print_dialog_gtk.h
@@ -8,8 +8,9 @@
#include <memory>
#include "base/files/file_path.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted_delete_on_sequence.h"
-#include "printing/print_dialog_gtk_interface.h"
+#include "printing/print_dialog_linux_interface.h"
#include "printing/printing_context_linux.h"
#include "ui/aura/window_observer.h"
#include "ui/base/glib/glib_signal.h"
@@ -23,18 +24,18 @@ class PrintSettings;
using printing::PrintingContextLinux;
// Needs to be freed on the UI thread to clean up its GTK members variables.
-class PrintDialogGtk : public printing::PrintDialogGtkInterface,
+class PrintDialogGtk : public printing::PrintDialogLinuxInterface,
public base::RefCountedDeleteOnSequence<PrintDialogGtk>,
public aura::WindowObserver {
public:
// Creates and returns a print dialog.
- static printing::PrintDialogGtkInterface* CreatePrintDialog(
+ static printing::PrintDialogLinuxInterface* CreatePrintDialog(
PrintingContextLinux* context);
PrintDialogGtk(const PrintDialogGtk&) = delete;
PrintDialogGtk& operator=(const PrintDialogGtk&) = delete;
- // printing::PrintDialogGtkInterface implementation.
+ // printing::PrintDialogLinuxInterface implementation.
void UseDefaultSettings() override;
void UpdateSettings(
std::unique_ptr<printing::PrintSettings> settings) override;
@@ -71,14 +72,14 @@ class PrintDialogGtk : public printing::PrintDialogGtkInterface,
// Printing dialog callback.
PrintingContextLinux::PrintSettingsCallback callback_;
- PrintingContextLinux* context_;
+ raw_ptr<PrintingContextLinux> context_;
// Print dialog settings. PrintDialogGtk owns |dialog_| and holds references
// to the other objects.
GtkWidget* dialog_ = nullptr;
- GtkPrintSettings* gtk_settings_ = nullptr;
- GtkPageSetup* page_setup_ = nullptr;
- GtkPrinter* printer_ = nullptr;
+ raw_ptr<GtkPrintSettings> gtk_settings_ = nullptr;
+ raw_ptr<GtkPageSetup> page_setup_ = nullptr;
+ raw_ptr<GtkPrinter> printer_ = nullptr;
base::FilePath path_to_pdf_;
};
diff --git a/chromium/ui/gtk/settings_provider_gsettings.cc b/chromium/ui/gtk/settings_provider_gsettings.cc
index 6498b742888..9ac112134bd 100644
--- a/chromium/ui/gtk/settings_provider_gsettings.cc
+++ b/chromium/ui/gtk/settings_provider_gsettings.cc
@@ -116,22 +116,22 @@ void SettingsProviderGSettings::ParseAndStoreMiddleClickValue(
GtkUi::WindowFrameAction action;
if (click_action == "none") {
- action = views::LinuxUI::WindowFrameAction::kNone;
+ action = ui::LinuxUi::WindowFrameAction::kNone;
} else if (click_action == "lower") {
- action = views::LinuxUI::WindowFrameAction::kLower;
+ action = ui::LinuxUi::WindowFrameAction::kLower;
} else if (click_action == "minimize") {
- action = views::LinuxUI::WindowFrameAction::kMinimize;
+ action = ui::LinuxUi::WindowFrameAction::kMinimize;
} else if (click_action == "toggle-maximize") {
- action = views::LinuxUI::WindowFrameAction::kToggleMaximize;
+ action = ui::LinuxUi::WindowFrameAction::kToggleMaximize;
} else {
// While we want to have the default state be lower if there isn't a
// value, we want to default to no action if the user has explicitly
// chose an action that we don't implement.
- action = views::LinuxUI::WindowFrameAction::kNone;
+ action = ui::LinuxUi::WindowFrameAction::kNone;
}
delegate_->SetWindowFrameAction(
- views::LinuxUI::WindowFrameActionSource::kMiddleClick, action);
+ ui::LinuxUi::WindowFrameActionSource::kMiddleClick, action);
}
} // namespace gtk
diff --git a/chromium/ui/gtk/settings_provider_gsettings.h b/chromium/ui/gtk/settings_provider_gsettings.h
index 67e4c2a31b0..6bab35cd72c 100644
--- a/chromium/ui/gtk/settings_provider_gsettings.h
+++ b/chromium/ui/gtk/settings_provider_gsettings.h
@@ -9,6 +9,7 @@
#include <string>
+#include "base/memory/raw_ptr.h"
#include "ui/base/glib/glib_signal.h"
#include "ui/base/glib/scoped_gobject.h"
#include "ui/gtk/settings_provider.h"
@@ -47,7 +48,7 @@ class SettingsProviderGSettings : public SettingsProvider {
void ParseAndStoreMiddleClickValue(const std::string&);
- GtkUi* delegate_;
+ raw_ptr<GtkUi> delegate_;
ScopedGObject<GSettings> button_settings_;
ScopedGObject<GSettings> click_settings_;
diff --git a/chromium/ui/gtk/settings_provider_gtk.cc b/chromium/ui/gtk/settings_provider_gtk.cc
index 0163f4ece56..76f51c7ef17 100644
--- a/chromium/ui/gtk/settings_provider_gtk.cc
+++ b/chromium/ui/gtk/settings_provider_gtk.cc
@@ -32,15 +32,15 @@ std::string GetDecorationLayoutFromGtkWindow() {
void ParseActionString(const std::string& value,
GtkUi::WindowFrameAction* action) {
if (value == "none")
- *action = views::LinuxUI::WindowFrameAction::kNone;
+ *action = ui::LinuxUi::WindowFrameAction::kNone;
else if (value == "lower")
- *action = views::LinuxUI::WindowFrameAction::kLower;
+ *action = ui::LinuxUi::WindowFrameAction::kLower;
else if (value == "minimize")
- *action = views::LinuxUI::WindowFrameAction::kMinimize;
+ *action = ui::LinuxUi::WindowFrameAction::kMinimize;
else if (value == "toggle-maximize")
- *action = views::LinuxUI::WindowFrameAction::kToggleMaximize;
+ *action = ui::LinuxUi::WindowFrameAction::kToggleMaximize;
else if (value == "menu")
- *action = views::LinuxUI::WindowFrameAction::kMenu;
+ *action = ui::LinuxUi::WindowFrameAction::kMenu;
}
} // namespace
@@ -48,8 +48,8 @@ void ParseActionString(const std::string& value,
SettingsProviderGtk::FrameActionSettingWatcher::FrameActionSettingWatcher(
SettingsProviderGtk* settings_provider,
const std::string& setting_name,
- views::LinuxUI::WindowFrameActionSource action_type,
- views::LinuxUI::WindowFrameAction default_action)
+ ui::LinuxUi::WindowFrameActionSource action_type,
+ ui::LinuxUi::WindowFrameAction default_action)
: settings_provider_(settings_provider),
setting_name_(setting_name),
action_type_(action_type),
@@ -91,18 +91,18 @@ SettingsProviderGtk::SettingsProviderGtk(GtkUi* delegate)
frame_action_setting_watchers_.push_back(
std::make_unique<FrameActionSettingWatcher>(
this, "gtk-titlebar-middle-click",
- views::LinuxUI::WindowFrameActionSource::kMiddleClick,
- views::LinuxUI::WindowFrameAction::kNone));
+ ui::LinuxUi::WindowFrameActionSource::kMiddleClick,
+ ui::LinuxUi::WindowFrameAction::kNone));
frame_action_setting_watchers_.push_back(
std::make_unique<FrameActionSettingWatcher>(
this, "gtk-titlebar-double-click",
- views::LinuxUI::WindowFrameActionSource::kDoubleClick,
- views::LinuxUI::WindowFrameAction::kToggleMaximize));
+ ui::LinuxUi::WindowFrameActionSource::kDoubleClick,
+ ui::LinuxUi::WindowFrameAction::kToggleMaximize));
frame_action_setting_watchers_.push_back(
std::make_unique<FrameActionSettingWatcher>(
this, "gtk-titlebar-right-click",
- views::LinuxUI::WindowFrameActionSource::kRightClick,
- views::LinuxUI::WindowFrameAction::kMenu));
+ ui::LinuxUi::WindowFrameActionSource::kRightClick,
+ ui::LinuxUi::WindowFrameAction::kMenu));
} else {
signal_id_decoration_layout_ =
g_signal_connect_after(settings, "notify::gtk-theme-name",
diff --git a/chromium/ui/gtk/settings_provider_gtk.h b/chromium/ui/gtk/settings_provider_gtk.h
index 66446c1fd00..bb6c7e66b45 100644
--- a/chromium/ui/gtk/settings_provider_gtk.h
+++ b/chromium/ui/gtk/settings_provider_gtk.h
@@ -9,9 +9,10 @@
#include <string>
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "ui/base/glib/glib_signal.h"
#include "ui/gtk/settings_provider.h"
-#include "ui/views/linux_ui/linux_ui.h"
+#include "ui/linux/linux_ui.h"
typedef struct _GParamSpec GParamSpec;
typedef struct _GtkSettings GtkSettings;
@@ -32,11 +33,10 @@ class SettingsProviderGtk : public SettingsProvider {
private:
class FrameActionSettingWatcher {
public:
- FrameActionSettingWatcher(
- SettingsProviderGtk* settings_provider,
- const std::string& setting_name,
- views::LinuxUI::WindowFrameActionSource action_type,
- views::LinuxUI::WindowFrameAction default_action);
+ FrameActionSettingWatcher(SettingsProviderGtk* settings_provider,
+ const std::string& setting_name,
+ ui::LinuxUi::WindowFrameActionSource action_type,
+ ui::LinuxUi::WindowFrameAction default_action);
FrameActionSettingWatcher(const FrameActionSettingWatcher&) = delete;
FrameActionSettingWatcher& operator=(const FrameActionSettingWatcher&) =
@@ -51,10 +51,10 @@ class SettingsProviderGtk : public SettingsProvider {
GParamSpec*);
private:
- SettingsProviderGtk* settings_provider_;
+ raw_ptr<SettingsProviderGtk> settings_provider_;
std::string setting_name_;
- views::LinuxUI::WindowFrameActionSource action_type_;
- views::LinuxUI::WindowFrameAction default_action_;
+ ui::LinuxUi::WindowFrameActionSource action_type_;
+ ui::LinuxUi::WindowFrameAction default_action_;
unsigned long signal_id_;
};
@@ -72,7 +72,7 @@ class SettingsProviderGtk : public SettingsProvider {
GtkSettings*,
GParamSpec*);
- GtkUi* delegate_;
+ raw_ptr<GtkUi> delegate_;
unsigned long signal_id_decoration_layout_;
diff --git a/chromium/ui/gtk/wayland/gtk_ui_platform_wayland.cc b/chromium/ui/gtk/wayland/gtk_ui_platform_wayland.cc
index 2bf5a14d9fe..cae3475b14d 100644
--- a/chromium/ui/gtk/wayland/gtk_ui_platform_wayland.cc
+++ b/chromium/ui/gtk/wayland/gtk_ui_platform_wayland.cc
@@ -10,9 +10,11 @@
#include "base/environment.h"
#include "base/logging.h"
#include "ui/base/glib/glib_cast.h"
-#include "ui/base/linux/linux_ui_delegate.h"
#include "ui/events/event_utils.h"
+#include "ui/gtk/gtk_compat.h"
#include "ui/gtk/gtk_util.h"
+#include "ui/gtk/input_method_context_impl_gtk.h"
+#include "ui/linux/linux_ui_delegate.h"
namespace gtk {
@@ -145,8 +147,14 @@ void GtkUiPlatformWayland::OnHandleSetTransient(GtkWidget* widget,
}
}
-bool GtkUiPlatformWayland::PreferGtkIme() {
- return gtk::GtkCheckVersion(4);
+std::unique_ptr<ui::LinuxInputMethodContext>
+GtkUiPlatformWayland::CreateInputMethodContext(
+ ui::LinuxInputMethodContextDelegate* delegate) const {
+ // GDK3 doesn't have a way to create foreign wayland windows, so we can't
+ // translate from ui::KeyEvent to GdkEventKey for InputMethodContextImplGtk.
+ if (!GtkCheckVersion(4))
+ return nullptr;
+ return std::make_unique<InputMethodContextImplGtk>(delegate);
}
} // namespace gtk
diff --git a/chromium/ui/gtk/wayland/gtk_ui_platform_wayland.h b/chromium/ui/gtk/wayland/gtk_ui_platform_wayland.h
index 06b143495b2..315d6ced313 100644
--- a/chromium/ui/gtk/wayland/gtk_ui_platform_wayland.h
+++ b/chromium/ui/gtk/wayland/gtk_ui_platform_wayland.h
@@ -8,6 +8,7 @@
#include <string>
#include "base/callback_forward.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "ui/gtk/gtk_ui_platform.h"
@@ -30,7 +31,8 @@ class GtkUiPlatformWayland : public GtkUiPlatform {
gfx::AcceleratedWidget parent) override;
void ClearTransientFor(gfx::AcceleratedWidget parent) override;
void ShowGtkWindow(GtkWindow* window) override;
- bool PreferGtkIme() override;
+ std::unique_ptr<ui::LinuxInputMethodContext> CreateInputMethodContext(
+ ui::LinuxInputMethodContextDelegate* delegate) const override;
private:
GdkDisplay* GetDefaultGdkDisplay();
@@ -38,7 +40,7 @@ class GtkUiPlatformWayland : public GtkUiPlatform {
// SetGtkWidgetTransientFor.
void OnHandleSetTransient(GtkWidget* widget, const std::string& handle);
- GdkDisplay* default_display_ = nullptr;
+ raw_ptr<GdkDisplay> default_display_ = nullptr;
base::WeakPtrFactory<GtkUiPlatformWayland> weak_factory_{this};
};
diff --git a/chromium/ui/gtk/window_frame_provider_gtk.h b/chromium/ui/gtk/window_frame_provider_gtk.h
index d3039d73161..8370c1cb3f8 100644
--- a/chromium/ui/gtk/window_frame_provider_gtk.h
+++ b/chromium/ui/gtk/window_frame_provider_gtk.h
@@ -7,12 +7,12 @@
#include "base/containers/flat_map.h"
#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/views/linux_ui/linux_ui.h"
-#include "ui/views/linux_ui/window_frame_provider.h"
+#include "ui/gfx/geometry/insets.h"
+#include "ui/linux/window_frame_provider.h"
namespace gtk {
-class WindowFrameProviderGtk : public views::WindowFrameProvider {
+class WindowFrameProviderGtk : public ui::WindowFrameProvider {
public:
explicit WindowFrameProviderGtk(bool solid_frame);
@@ -21,7 +21,7 @@ class WindowFrameProviderGtk : public views::WindowFrameProvider {
~WindowFrameProviderGtk() override;
- // views::WindowFrameProvider:
+ // ui::WindowFrameProvider:
int GetTopCornerRadiusDip() override;
gfx::Insets GetFrameThicknessDip() override;
void PaintWindowFrame(gfx::Canvas* canvas,
diff --git a/chromium/ui/gtk/x/gtk_event_loop_x11.cc b/chromium/ui/gtk/x/gtk_event_loop_x11.cc
index c7a8f916ce6..866be5d8121 100644
--- a/chromium/ui/gtk/x/gtk_event_loop_x11.cc
+++ b/chromium/ui/gtk/x/gtk_event_loop_x11.cc
@@ -24,13 +24,17 @@ x11::Event ConvertGdkEventToKeyEvent(GdkEvent* gdk_event) {
if (!gtk::GtkCheckVersion(4)) {
auto* key = reinterpret_cast<GdkEventKey*>(gdk_event);
DCHECK(key->type == GdkKeyPress() || key->type == GdkKeyRelease());
+ x11::Window window = x11::Window::None;
+ if (key->window)
+ window = static_cast<x11::Window>(gdk_x11_window_get_xid(key->window));
+
x11::KeyEvent key_event{
.opcode = key->type == GdkKeyPress() ? x11::KeyEvent::Press
: x11::KeyEvent::Release,
.detail = static_cast<x11::KeyCode>(key->hardware_keycode),
.time = static_cast<x11::Time>(key->time),
.root = ui::GetX11RootWindow(),
- .event = static_cast<x11::Window>(gdk_x11_window_get_xid(key->window)),
+ .event = window,
.state = BuildXkbStateFromGdkEvent(key->state, key->group),
.same_screen = true,
};
diff --git a/chromium/ui/gtk/x/gtk_event_loop_x11.h b/chromium/ui/gtk/x/gtk_event_loop_x11.h
index a6e9251ea3e..46e6ff8a6a8 100644
--- a/chromium/ui/gtk/x/gtk_event_loop_x11.h
+++ b/chromium/ui/gtk/x/gtk_event_loop_x11.h
@@ -5,6 +5,7 @@
#ifndef UI_GTK_X_GTK_EVENT_LOOP_X11_H_
#define UI_GTK_X_GTK_EVENT_LOOP_X11_H_
+#include "base/memory/raw_ptr.h"
#include "ui/base/glib/glib_integers.h"
#include "ui/base/glib/glib_signal.h"
#include "ui/gtk/gtk_compat.h"
@@ -21,7 +22,7 @@ class GtkEventLoopX11 {
private:
// This state is only used on GTK4.
- GdkSurface* surface_ = nullptr;
+ raw_ptr<GdkSurface> surface_ = nullptr;
gulong signal_id_ = 0;
// Only called on GTK3.
diff --git a/chromium/ui/gtk/x/gtk_ui_platform_x11.cc b/chromium/ui/gtk/x/gtk_ui_platform_x11.cc
index 94b8e5b872e..f7ba25c30c8 100644
--- a/chromium/ui/gtk/x/gtk_ui_platform_x11.cc
+++ b/chromium/ui/gtk/x/gtk_ui_platform_x11.cc
@@ -8,7 +8,6 @@
#include "base/check.h"
#include "base/environment.h"
#include "base/strings/stringprintf.h"
-#include "ui/base/linux/linux_ui_delegate.h"
#include "ui/base/x/x11_util.h"
#include "ui/events/event_constants.h"
#include "ui/events/event_utils.h"
@@ -20,7 +19,9 @@
#include "ui/gfx/x/xproto_util.h"
#include "ui/gtk/gtk_compat.h"
#include "ui/gtk/gtk_util.h"
+#include "ui/gtk/input_method_context_impl_gtk.h"
#include "ui/gtk/x/gtk_event_loop_x11.h"
+#include "ui/linux/linux_ui_delegate.h"
namespace gtk {
@@ -114,8 +115,10 @@ void GtkUiPlatformX11::ShowGtkWindow(GtkWindow* window) {
static_cast<uint32_t>(ui::X11EventSource::GetInstance()->GetTimestamp()));
}
-bool GtkUiPlatformX11::PreferGtkIme() {
- return true;
+std::unique_ptr<ui::LinuxInputMethodContext>
+GtkUiPlatformX11::CreateInputMethodContext(
+ ui::LinuxInputMethodContextDelegate* delegate) const {
+ return std::make_unique<InputMethodContextImplGtk>(delegate);
}
} // namespace gtk
diff --git a/chromium/ui/gtk/x/gtk_ui_platform_x11.h b/chromium/ui/gtk/x/gtk_ui_platform_x11.h
index eb5b5ceb9d8..74011a8a1c7 100644
--- a/chromium/ui/gtk/x/gtk_ui_platform_x11.h
+++ b/chromium/ui/gtk/x/gtk_ui_platform_x11.h
@@ -5,6 +5,7 @@
#ifndef UI_GTK_X_GTK_UI_PLATFORM_X11_H_
#define UI_GTK_X_GTK_UI_PLATFORM_X11_H_
+#include "base/memory/raw_ptr.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/x/connection.h"
#include "ui/gtk/gtk_ui_platform.h"
@@ -33,13 +34,14 @@ class GtkUiPlatformX11 : public GtkUiPlatform {
gfx::AcceleratedWidget parent) override;
void ClearTransientFor(gfx::AcceleratedWidget parent) override;
void ShowGtkWindow(GtkWindow* window) override;
- bool PreferGtkIme() override;
+ std::unique_ptr<ui::LinuxInputMethodContext> CreateInputMethodContext(
+ ui::LinuxInputMethodContextDelegate* delegate) const override;
private:
GdkDisplay* GetGdkDisplay();
- x11::Connection* const connection_;
- GdkDisplay* display_ = nullptr;
+ const raw_ptr<x11::Connection> connection_;
+ raw_ptr<GdkDisplay> display_ = nullptr;
std::unique_ptr<GtkEventLoopX11> event_loop_;
};
diff --git a/chromium/ui/latency/OWNERS b/chromium/ui/latency/OWNERS
index 554e4fe9e9e..2efd09832b0 100644
--- a/chromium/ui/latency/OWNERS
+++ b/chromium/ui/latency/OWNERS
@@ -1,3 +1,2 @@
# latency info
-sadrul@chromium.org
flackr@chromium.org
diff --git a/chromium/ui/latency/latency_tracker.cc b/chromium/ui/latency/latency_tracker.cc
index c28238eb9c3..03955fbff82 100644
--- a/chromium/ui/latency/latency_tracker.cc
+++ b/chromium/ui/latency/latency_tracker.cc
@@ -65,7 +65,7 @@ void EmitScrollUpdateTime(base::TimeDelta dur, bool janky) {
// microsecond to have passed.
return;
}
- auto* histogram = base::BooleanHistogram::FactoryGet(
+ static auto* histogram = base::BooleanHistogram::FactoryGet(
"Event.Jank.ScrollUpdate.TotalJankyAndNonJankyDuration2",
base::HistogramBase::kUmaTargetedHistogramFlag);
histogram->AddCount(janky ? kJanky : kNonJanky, count);
diff --git a/chromium/ui/linux/BUILD.gn b/chromium/ui/linux/BUILD.gn
new file mode 100644
index 00000000000..436f05bd6da
--- /dev/null
+++ b/chromium/ui/linux/BUILD.gn
@@ -0,0 +1,81 @@
+# Copyright 2022 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/linux/gtk/gtk.gni")
+import("//ui/qt/qt.gni")
+
+assert(is_linux)
+
+component("linux_ui") {
+ defines = [ "IS_LINUX_UI_IMPL" ]
+ public = [
+ "cursor_theme_manager_observer.h",
+ "device_scale_factor_observer.h",
+ "linux_ui.h",
+ "linux_ui_delegate.h",
+ "linux_ui_delegate_stub.h",
+ "nav_button_provider.h",
+ "status_icon_linux.h",
+ "window_button_order_observer.h",
+ "window_frame_provider.h",
+ ]
+ sources = [
+ "linux_ui.cc",
+ "linux_ui_delegate.cc",
+ "linux_ui_delegate_stub.cc",
+ "status_icon_linux.cc",
+ ]
+ deps = [ "//base" ]
+ public_deps = [ "//printing/buildflags" ]
+}
+
+source_set("linux_ui_impl") {
+ public = [ "linux_ui_base.h" ]
+ sources = [ "linux_ui_base.cc" ]
+ public_deps = [ ":linux_ui" ]
+ deps = [
+ "//base",
+ "//skia",
+ "//ui/gfx",
+ "//ui/native_theme",
+ "//ui/shell_dialogs",
+ ]
+}
+
+source_set("linux_ui_factory") {
+ sources = [
+ "linux_ui_factory.cc",
+ "linux_ui_factory.h",
+ ]
+
+ public_deps = [ ":linux_ui" ]
+
+ deps = [
+ "//base",
+ "//ui/base:buildflags",
+ ]
+ if (use_gtk) {
+ # This is the only component that can interact with gtk.
+ deps += [ "//ui/gtk" ]
+ }
+ if (use_qt) {
+ deps += [ "//ui/qt" ]
+ }
+}
+
+source_set("test_support") {
+ testonly = true
+
+ public = [ "fake_linux_ui.h" ]
+ sources = [ "fake_linux_ui.cc" ]
+
+ public_deps = [ ":linux_ui_impl" ]
+ deps = [
+ "//base",
+ "//skia",
+ "//ui/gfx",
+ "//ui/native_theme",
+ "//ui/shell_dialogs",
+ ]
+}
diff --git a/chromium/ui/views/linux_ui/DEPS b/chromium/ui/linux/DEPS
index 91fbe99fc6f..592db662e5e 100644
--- a/chromium/ui/views/linux_ui/DEPS
+++ b/chromium/ui/linux/DEPS
@@ -1,4 +1,11 @@
include_rules = [
+ "+printing",
+ "+third_party/skia",
+ "+ui/base",
+ "+ui/base/cursor",
+ "+ui/base/ime",
+ "+ui/gfx",
+ "+ui/native_theme",
"+ui/shell_dialogs",
]
@@ -7,4 +14,4 @@ specific_include_rules = {
"+ui/gtk",
"+ui/qt",
],
-} \ No newline at end of file
+}
diff --git a/chromium/ui/views/linux_ui/OWNERS b/chromium/ui/linux/OWNERS
index 280ba478dca..280ba478dca 100644
--- a/chromium/ui/views/linux_ui/OWNERS
+++ b/chromium/ui/linux/OWNERS
diff --git a/chromium/ui/base/cursor/cursor_theme_manager_observer.h b/chromium/ui/linux/cursor_theme_manager_observer.h
index 028a8bb7dfe..ab7e9f5e869 100644
--- a/chromium/ui/base/cursor/cursor_theme_manager_observer.h
+++ b/chromium/ui/linux/cursor_theme_manager_observer.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_BASE_CURSOR_CURSOR_THEME_MANAGER_OBSERVER_H_
-#define UI_BASE_CURSOR_CURSOR_THEME_MANAGER_OBSERVER_H_
+#ifndef UI_LINUX_CURSOR_THEME_MANAGER_OBSERVER_H_
+#define UI_LINUX_CURSOR_THEME_MANAGER_OBSERVER_H_
#include <string>
@@ -26,4 +26,4 @@ class CursorThemeManagerObserver : public base::CheckedObserver {
} // namespace ui
-#endif // UI_BASE_CURSOR_CURSOR_THEME_MANAGER_OBSERVER_H_
+#endif // UI_LINUX_CURSOR_THEME_MANAGER_OBSERVER_H_
diff --git a/chromium/ui/views/linux_ui/device_scale_factor_observer.h b/chromium/ui/linux/device_scale_factor_observer.h
index c62bfeb293b..d09b39f36a7 100644
--- a/chromium/ui/views/linux_ui/device_scale_factor_observer.h
+++ b/chromium/ui/linux/device_scale_factor_observer.h
@@ -2,18 +2,18 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_VIEWS_LINUX_UI_DEVICE_SCALE_FACTOR_OBSERVER_H_
-#define UI_VIEWS_LINUX_UI_DEVICE_SCALE_FACTOR_OBSERVER_H_
+#ifndef UI_LINUX_DEVICE_SCALE_FACTOR_OBSERVER_H_
+#define UI_LINUX_DEVICE_SCALE_FACTOR_OBSERVER_H_
-namespace views {
+namespace ui {
class DeviceScaleFactorObserver {
public:
- virtual ~DeviceScaleFactorObserver() {}
+ virtual ~DeviceScaleFactorObserver() = default;
virtual void OnDeviceScaleFactorChanged() = 0;
};
-} // namespace views
+} // namespace ui
-#endif // UI_VIEWS_LINUX_UI_DEVICE_SCALE_FACTOR_OBSERVER_H_
+#endif // UI_LINUX_DEVICE_SCALE_FACTOR_OBSERVER_H_
diff --git a/chromium/ui/linux/fake_linux_ui.cc b/chromium/ui/linux/fake_linux_ui.cc
new file mode 100644
index 00000000000..211b9093be2
--- /dev/null
+++ b/chromium/ui/linux/fake_linux_ui.cc
@@ -0,0 +1,146 @@
+// 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/linux/fake_linux_ui.h"
+
+#include "base/time/time.h"
+#include "ui/gfx/color_palette.h"
+#include "ui/gfx/font_render_params.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/image/image.h"
+#include "ui/shell_dialogs/select_file_policy.h"
+
+namespace ui {
+
+FakeLinuxUi::FakeLinuxUi() = default;
+
+FakeLinuxUi::~FakeLinuxUi() = default;
+
+std::unique_ptr<ui::LinuxInputMethodContext>
+FakeLinuxUi::CreateInputMethodContext(
+ ui::LinuxInputMethodContextDelegate* delegate) const {
+ return nullptr;
+}
+
+gfx::FontRenderParams FakeLinuxUi::GetDefaultFontRenderParams() const {
+ return gfx::FontRenderParams();
+}
+
+void FakeLinuxUi::GetDefaultFontDescription(
+ std::string* family_out,
+ int* size_pixels_out,
+ int* style_out,
+ int* weight_out,
+ gfx::FontRenderParams* params_out) const {}
+
+ui::SelectFileDialog* FakeLinuxUi::CreateSelectFileDialog(
+ void* listener,
+ std::unique_ptr<ui::SelectFilePolicy> policy) const {
+ return nullptr;
+}
+
+bool FakeLinuxUi::Initialize() {
+ return false;
+}
+
+bool FakeLinuxUi::GetColor(int id,
+ SkColor* color,
+ bool use_custom_frame) const {
+ return false;
+}
+
+bool FakeLinuxUi::GetDisplayProperty(int id, int* result) const {
+ return false;
+}
+
+SkColor FakeLinuxUi::GetFocusRingColor() const {
+ return gfx::kPlaceholderColor;
+}
+
+SkColor FakeLinuxUi::GetActiveSelectionBgColor() const {
+ return gfx::kPlaceholderColor;
+}
+
+SkColor FakeLinuxUi::GetActiveSelectionFgColor() const {
+ return gfx::kPlaceholderColor;
+}
+
+SkColor FakeLinuxUi::GetInactiveSelectionBgColor() const {
+ return gfx::kPlaceholderColor;
+}
+
+SkColor FakeLinuxUi::GetInactiveSelectionFgColor() const {
+ return gfx::kPlaceholderColor;
+}
+
+base::TimeDelta FakeLinuxUi::GetCursorBlinkInterval() const {
+ return base::TimeDelta();
+}
+
+gfx::Image FakeLinuxUi::GetIconForContentType(const std::string& content_type,
+ int size,
+ float scale) const {
+ return gfx::Image();
+}
+
+LinuxUi::WindowFrameAction FakeLinuxUi::GetWindowFrameAction(
+ WindowFrameActionSource source) {
+ return WindowFrameAction::kNone;
+}
+
+float FakeLinuxUi::GetDeviceScaleFactor() const {
+ return 1.0f;
+}
+
+bool FakeLinuxUi::PreferDarkTheme() const {
+ return false;
+}
+
+bool FakeLinuxUi::AnimationsEnabled() const {
+ return true;
+}
+
+std::unique_ptr<ui::NavButtonProvider> FakeLinuxUi::CreateNavButtonProvider() {
+ return nullptr;
+}
+
+ui::WindowFrameProvider* FakeLinuxUi::GetWindowFrameProvider(bool solid_frame) {
+ return nullptr;
+}
+
+base::flat_map<std::string, std::string> FakeLinuxUi::GetKeyboardLayoutMap() {
+ return base::flat_map<std::string, std::string>();
+}
+
+std::string FakeLinuxUi::GetCursorThemeName() {
+ return std::string();
+}
+
+int FakeLinuxUi::GetCursorThemeSize() {
+ return 0;
+}
+
+ui::NativeTheme* FakeLinuxUi::GetNativeThemeImpl() const {
+ return nullptr;
+}
+
+bool FakeLinuxUi::GetTextEditCommandsForEvent(
+ const ui::Event& event,
+ std::vector<ui::TextEditCommandAuraLinux>* commands) {
+ return false;
+}
+
+#if BUILDFLAG(ENABLE_PRINTING)
+printing::PrintDialogLinuxInterface* FakeLinuxUi::CreatePrintDialog(
+ printing::PrintingContextLinux* context) {
+ return nullptr;
+}
+
+gfx::Size FakeLinuxUi::GetPdfPaperSize(
+ printing::PrintingContextLinux* context) {
+ return gfx::Size();
+}
+#endif
+
+} // namespace ui
diff --git a/chromium/ui/linux/fake_linux_ui.h b/chromium/ui/linux/fake_linux_ui.h
new file mode 100644
index 00000000000..17ab87be58a
--- /dev/null
+++ b/chromium/ui/linux/fake_linux_ui.h
@@ -0,0 +1,67 @@
+// 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_LINUX_FAKE_LINUX_UI_H_
+#define UI_LINUX_FAKE_LINUX_UI_H_
+
+#include "ui/linux/linux_ui_base.h"
+
+namespace ui {
+
+// This class is meant to be overridden by tests. It's provided as a
+// convenience so that tests don't have to stub lots of methods just to override
+// a single one.
+class FakeLinuxUi : public LinuxUiBase {
+ public:
+ FakeLinuxUi();
+ ~FakeLinuxUi() override;
+
+ std::unique_ptr<ui::LinuxInputMethodContext> CreateInputMethodContext(
+ ui::LinuxInputMethodContextDelegate* delegate) const override;
+ gfx::FontRenderParams GetDefaultFontRenderParams() const override;
+ void GetDefaultFontDescription(
+ std::string* family_out,
+ int* size_pixels_out,
+ int* style_out,
+ int* weight_out,
+ gfx::FontRenderParams* params_out) const override;
+ ui::SelectFileDialog* CreateSelectFileDialog(
+ void* listener,
+ std::unique_ptr<ui::SelectFilePolicy> policy) const override;
+ bool Initialize() override;
+ bool GetColor(int id, SkColor* color, bool use_custom_frame) const override;
+ bool GetDisplayProperty(int id, int* result) const override;
+ SkColor GetFocusRingColor() const override;
+ SkColor GetActiveSelectionBgColor() const override;
+ SkColor GetActiveSelectionFgColor() const override;
+ SkColor GetInactiveSelectionBgColor() const override;
+ SkColor GetInactiveSelectionFgColor() const override;
+ base::TimeDelta GetCursorBlinkInterval() const override;
+ gfx::Image GetIconForContentType(const std::string& content_type,
+ int size,
+ float scale) const override;
+ WindowFrameAction GetWindowFrameAction(
+ WindowFrameActionSource source) override;
+ float GetDeviceScaleFactor() const override;
+ bool PreferDarkTheme() const override;
+ bool AnimationsEnabled() const override;
+ std::unique_ptr<ui::NavButtonProvider> CreateNavButtonProvider() override;
+ ui::WindowFrameProvider* GetWindowFrameProvider(bool solid_frame) override;
+ base::flat_map<std::string, std::string> GetKeyboardLayoutMap() override;
+ std::string GetCursorThemeName() override;
+ int GetCursorThemeSize() override;
+ ui::NativeTheme* GetNativeThemeImpl() const override;
+ bool GetTextEditCommandsForEvent(
+ const ui::Event& event,
+ std::vector<ui::TextEditCommandAuraLinux>* commands) override;
+#if BUILDFLAG(ENABLE_PRINTING)
+ printing::PrintDialogLinuxInterface* CreatePrintDialog(
+ printing::PrintingContextLinux* context) override;
+ gfx::Size GetPdfPaperSize(printing::PrintingContextLinux* context) override;
+#endif
+};
+
+} // namespace ui
+
+#endif // UI_LINUX_FAKE_LINUX_UI_H_
diff --git a/chromium/ui/views/linux_ui/linux_ui.cc b/chromium/ui/linux/linux_ui.cc
index b750641a9ad..ec285b1637e 100644
--- a/chromium/ui/views/linux_ui/linux_ui.cc
+++ b/chromium/ui/linux/linux_ui.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 "ui/views/linux_ui/linux_ui.h"
+#include "ui/linux/linux_ui.h"
#include <cstdio>
#include <utility>
@@ -10,85 +10,88 @@
#include "base/command_line.h"
#include "base/environment.h"
#include "base/nix/xdg_util.h"
+#include "base/no_destructor.h"
#include "build/build_config.h"
-#include "ui/base/ime/linux/linux_input_method_context_factory.h"
-#include "ui/gfx/skia_font_delegate.h"
+#include "ui/linux/cursor_theme_manager_observer.h"
namespace {
-views::LinuxUI* g_linux_ui = nullptr;
+std::unique_ptr<ui::LinuxUi>& GetLinuxUiInstance() {
+ static base::NoDestructor<std::unique_ptr<ui::LinuxUi>> linux_ui;
+ return *linux_ui;
+}
} // namespace
-namespace views {
-
-void LinuxUI::SetInstance(std::unique_ptr<LinuxUI> instance) {
- delete g_linux_ui;
- g_linux_ui = instance.release();
-
- SkiaFontDelegate::SetInstance(g_linux_ui);
-#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CASTOS)
- ShellDialogLinux::SetInstance(g_linux_ui);
-#endif
- ui::SetTextEditKeyBindingsDelegate(g_linux_ui);
+namespace ui {
- // Do not set IME instance for ozone as we delegate creating the input method
- // to OzonePlatforms instead. If this is set, OzonePlatform never sets a
- // context factory.
+// static
+std::unique_ptr<LinuxUi> LinuxUi::SetInstance(
+ std::unique_ptr<LinuxUi> instance) {
+ return std::exchange(GetLinuxUiInstance(), std::move(instance));
}
-LinuxUI* LinuxUI::instance() {
- return g_linux_ui;
+// static
+LinuxUi* LinuxUi::instance() {
+ return GetLinuxUiInstance().get();
}
-LinuxUI::LinuxUI() = default;
+LinuxUi::LinuxUi() = default;
-LinuxUI::~LinuxUI() = default;
+LinuxUi::~LinuxUi() = default;
-LinuxUI::CmdLineArgs::CmdLineArgs() = default;
+LinuxUi::CmdLineArgs::CmdLineArgs() = default;
-LinuxUI::CmdLineArgs::CmdLineArgs(const CmdLineArgs&) = default;
+LinuxUi::CmdLineArgs::CmdLineArgs(CmdLineArgs&&) = default;
-LinuxUI::CmdLineArgs& LinuxUI::CmdLineArgs::operator=(const CmdLineArgs&) =
- default;
+LinuxUi::CmdLineArgs& LinuxUi::CmdLineArgs::operator=(CmdLineArgs&&) = default;
-LinuxUI::CmdLineArgs::~CmdLineArgs() = default;
+LinuxUi::CmdLineArgs::~CmdLineArgs() = default;
-void LinuxUI::AddWindowButtonOrderObserver(
- views::WindowButtonOrderObserver* observer) {
+void LinuxUi::AddWindowButtonOrderObserver(
+ WindowButtonOrderObserver* observer) {
window_button_order_observer_list_.AddObserver(observer);
}
-void LinuxUI::RemoveWindowButtonOrderObserver(
- views::WindowButtonOrderObserver* observer) {
+void LinuxUi::RemoveWindowButtonOrderObserver(
+ WindowButtonOrderObserver* observer) {
window_button_order_observer_list_.RemoveObserver(observer);
}
-void LinuxUI::AddDeviceScaleFactorObserver(
- views::DeviceScaleFactorObserver* observer) {
+void LinuxUi::AddDeviceScaleFactorObserver(
+ DeviceScaleFactorObserver* observer) {
device_scale_factor_observer_list_.AddObserver(observer);
}
-void LinuxUI::RemoveDeviceScaleFactorObserver(
- views::DeviceScaleFactorObserver* observer) {
+void LinuxUi::RemoveDeviceScaleFactorObserver(
+ DeviceScaleFactorObserver* observer) {
device_scale_factor_observer_list_.RemoveObserver(observer);
}
-ui::NativeTheme* LinuxUI::GetNativeTheme(aura::Window* window) const {
- return GetNativeTheme(use_system_theme_callback_.is_null() ||
- use_system_theme_callback_.Run(window));
+void LinuxUi::AddCursorThemeObserver(CursorThemeManagerObserver* observer) {
+ cursor_theme_observer_list_.AddObserver(observer);
+ std::string name = GetCursorThemeName();
+ if (!name.empty())
+ observer->OnCursorThemeNameChanged(name);
+ int size = GetCursorThemeSize();
+ if (size)
+ observer->OnCursorThemeSizeChanged(size);
+}
+
+void LinuxUi::RemoveCursorThemeObserver(CursorThemeManagerObserver* observer) {
+ cursor_theme_observer_list_.RemoveObserver(observer);
}
-ui::NativeTheme* LinuxUI::GetNativeTheme(bool use_system_theme) const {
- return use_system_theme ? GetNativeTheme()
- : ui::NativeTheme::GetInstanceForNativeUi();
+ui::NativeTheme* LinuxUi::GetNativeTheme(aura::Window* window) const {
+ return GetNativeTheme(use_system_theme_callback_.is_null() ||
+ use_system_theme_callback_.Run(window));
}
-void LinuxUI::SetUseSystemThemeCallback(UseSystemThemeCallback callback) {
+void LinuxUi::SetUseSystemThemeCallback(UseSystemThemeCallback callback) {
use_system_theme_callback_ = std::move(callback);
}
-bool LinuxUI::GetDefaultUsesSystemTheme() const {
+bool LinuxUi::GetDefaultUsesSystemTheme() const {
std::unique_ptr<base::Environment> env = base::Environment::Create();
// TODO(https://crbug.com/1317782): This logic won't be necessary after
@@ -111,7 +114,7 @@ bool LinuxUI::GetDefaultUsesSystemTheme() const {
}
// static
-LinuxUI::CmdLineArgs LinuxUI::CopyCmdLine(
+LinuxUi::CmdLineArgs LinuxUi::CopyCmdLine(
const base::CommandLine& command_line) {
const auto& argv = command_line.argv();
size_t args_chars = 0;
@@ -131,4 +134,4 @@ LinuxUI::CmdLineArgs LinuxUI::CopyCmdLine(
return cmd_line;
}
-} // namespace views
+} // namespace ui
diff --git a/chromium/ui/views/linux_ui/linux_ui.h b/chromium/ui/linux/linux_ui.h
index 7d59a2c9ff8..dee97740309 100644
--- a/chromium/ui/views/linux_ui/linux_ui.h
+++ b/chromium/ui/linux/linux_ui.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_VIEWS_LINUX_UI_LINUX_UI_H_
-#define UI_VIEWS_LINUX_UI_LINUX_UI_H_
+#ifndef UI_LINUX_LINUX_UI_H_
+#define UI_LINUX_LINUX_UI_H_
#include <memory>
#include <string>
@@ -11,25 +11,18 @@
#include "base/callback.h"
#include "base/command_line.h"
+#include "base/component_export.h"
+#include "base/containers/flat_map.h"
+#include "base/observer_list.h"
#include "build/buildflag.h"
#include "build/chromecast_buildflags.h"
-#include "third_party/skia/include/core/SkColor.h"
-#include "ui/base/cursor/cursor_theme_manager.h"
-#include "ui/base/ime/linux/linux_input_method_context_factory.h"
-#include "ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h"
-#include "ui/gfx/animation/animation_settings_provider_linux.h"
-#include "ui/gfx/skia_font_delegate.h"
-#include "ui/views/buildflags.h"
-#include "ui/views/controls/button/button.h"
-#include "ui/views/views_export.h"
-
-#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CASTOS)
-#include "ui/shell_dialogs/shell_dialog_linux.h"
-#endif
+#include "printing/buildflags/buildflags.h"
// The main entrypoint into Linux toolkit specific code. GTK/QT code should only
// be executed behind this interface.
+using SkColor = uint32_t;
+
namespace aura {
class Window;
}
@@ -38,30 +31,35 @@ namespace base {
class TimeDelta;
}
-namespace color_utils {
-struct HSL;
-}
-
namespace gfx {
+struct FontRenderParams;
class Image;
-}
+class Size;
+} // namespace gfx
+
+namespace printing {
+class PrintingContextLinux;
+class PrintDialogLinuxInterface;
+} // namespace printing
-namespace views {
+namespace ui {
+
+class CursorThemeManagerObserver;
class DeviceScaleFactorObserver;
+class Event;
+class LinuxInputMethodContext;
+class LinuxInputMethodContextDelegate;
+class NativeTheme;
class NavButtonProvider;
+class SelectFileDialog;
+class SelectFilePolicy;
+class TextEditCommandAuraLinux;
class WindowButtonOrderObserver;
class WindowFrameProvider;
// Adapter class with targets to render like different toolkits. Set by any
// project that wants to do linux desktop native rendering.
-class VIEWS_EXPORT LinuxUI : public ui::LinuxInputMethodContextFactory,
- public gfx::SkiaFontDelegate,
-#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CASTOS)
- public ui::ShellDialogLinux,
-#endif
- public ui::TextEditKeyBindingsDelegateAuraLinux,
- public ui::CursorThemeManager,
- public gfx::AnimationSettingsProviderLinux {
+class COMPONENT_EXPORT(LINUX_UI) LinuxUi {
public:
using UseSystemThemeCallback =
base::RepeatingCallback<bool(aura::Window* window)>;
@@ -83,19 +81,21 @@ class VIEWS_EXPORT LinuxUI : public ui::LinuxInputMethodContextFactory,
kRightClick,
};
- LinuxUI(const LinuxUI&) = delete;
- LinuxUI& operator=(const LinuxUI&) = delete;
- ~LinuxUI() override;
+ LinuxUi(const LinuxUi&) = delete;
+ LinuxUi& operator=(const LinuxUi&) = delete;
+ virtual ~LinuxUi();
// Sets the dynamically loaded singleton that draws the desktop native UI.
- static void SetInstance(std::unique_ptr<LinuxUI> instance);
+ // Returns the old instance if any.
+ static std::unique_ptr<LinuxUi> SetInstance(
+ std::unique_ptr<LinuxUi> instance);
// Returns a LinuxUI instance for the toolkit used in the user's desktop
// environment.
//
// Can return NULL, in case no toolkit has been set. (For example, if we're
// running with the "--ash" flag.)
- static LinuxUI* instance();
+ static LinuxUi* instance();
// Notifies the observer about changes about how window buttons should be
// laid out.
@@ -112,11 +112,17 @@ class VIEWS_EXPORT LinuxUI : public ui::LinuxInputMethodContextFactory,
// factor.
void RemoveDeviceScaleFactorObserver(DeviceScaleFactorObserver* observer);
+ // Adds |observer| and makes initial OnCursorThemNameChanged() and/or
+ // OnCursorThemeSizeChanged() calls if the respective settings were set.
+ void AddCursorThemeObserver(CursorThemeManagerObserver* observer);
+
+ void RemoveCursorThemeObserver(CursorThemeManagerObserver* observer);
+
// Returns the NativeTheme that reflects the theme used by `window`.
ui::NativeTheme* GetNativeTheme(aura::Window* window) const;
// Returns the classic or system NativeTheme depending on `use_system_theme`.
- ui::NativeTheme* GetNativeTheme(bool use_system_theme) const;
+ virtual ui::NativeTheme* GetNativeTheme(bool use_system_theme) const = 0;
// Sets a callback that determines whether to use the system theme.
void SetUseSystemThemeCallback(UseSystemThemeCallback callback);
@@ -128,7 +134,6 @@ class VIEWS_EXPORT LinuxUI : public ui::LinuxInputMethodContextFactory,
// Returns true on success. If false is returned, this instance shouldn't
// be used and the behavior of all functions is undefined.
[[nodiscard]] virtual bool Initialize() = 0;
- virtual bool GetTint(int id, color_utils::HSL* tint) const = 0;
virtual bool GetColor(int id,
SkColor* color,
bool use_custom_frame) const = 0;
@@ -175,18 +180,61 @@ class VIEWS_EXPORT LinuxUI : public ui::LinuxInputMethodContextFactory,
// Returns a map of KeyboardEvent code to KeyboardEvent key values.
virtual base::flat_map<std::string, std::string> GetKeyboardLayoutMap() = 0;
- // Returns the names of available system themes. Used only in test.
- virtual std::vector<std::string> GetAvailableSystemThemeNamesForTest()
- const = 0;
+#if BUILDFLAG(ENABLE_PRINTING)
+ virtual printing::PrintDialogLinuxInterface* CreatePrintDialog(
+ printing::PrintingContextLinux* context) = 0;
+
+ virtual gfx::Size GetPdfPaperSize(
+ printing::PrintingContextLinux* context) = 0;
+#endif
- // Set the system theme by name. Used only in test.
- virtual void SetSystemThemeByNameForTest(const std::string& theme_name) = 0;
+ // Returns a native file selection dialog. `listener` is of type
+ // SelectFileDialog::Listener. TODO(thomasanderson): Move
+ // SelectFileDialog::Listener to SelectFileDialogListener so that it can be
+ // forward declared.
+ virtual SelectFileDialog* CreateSelectFileDialog(
+ void* listener,
+ std::unique_ptr<SelectFilePolicy> policy) const = 0;
+
+ // Returns the prefererd theme name for cursor loading.
+ virtual std::string GetCursorThemeName() = 0;
+
+ // Returns the preferred size for cursor bitmaps. A value of 64 indicates
+ // that 64x64 px bitmaps are preferred.
+ virtual int GetCursorThemeSize() = 0;
+
+ // Returns a platform specific input method context.
+ virtual std::unique_ptr<LinuxInputMethodContext> CreateInputMethodContext(
+ LinuxInputMethodContextDelegate* delegate) const = 0;
+
+ // Matches a key event against the users' platform specific key bindings,
+ // false will be returned if the key event doesn't correspond to a predefined
+ // key binding. Edit commands matched with |event| will be stored in
+ // |edit_commands|, if |edit_commands| is non-nullptr.
+ virtual bool GetTextEditCommandsForEvent(
+ const ui::Event& event,
+ std::vector<TextEditCommandAuraLinux>* commands) = 0;
+
+ // Returns the default font rendering settings.
+ virtual gfx::FontRenderParams GetDefaultFontRenderParams() const = 0;
+
+ // Returns details about the default UI font. |style_out| holds a bitfield of
+ // gfx::Font::Style values.
+ virtual void GetDefaultFontDescription(
+ std::string* family_out,
+ int* size_pixels_out,
+ int* style_out,
+ int* weight_out,
+ gfx::FontRenderParams* params_out) const = 0;
+
+ // Indicates if animations are enabled by the toolkit.
+ virtual bool AnimationsEnabled() const = 0;
protected:
struct CmdLineArgs {
CmdLineArgs();
- CmdLineArgs(const CmdLineArgs&);
- CmdLineArgs& operator=(const CmdLineArgs&);
+ CmdLineArgs(CmdLineArgs&&);
+ CmdLineArgs& operator=(CmdLineArgs&&);
~CmdLineArgs();
// `argc` is modified by toolkits, so store it explicitly.
@@ -199,21 +247,26 @@ class VIEWS_EXPORT LinuxUI : public ui::LinuxInputMethodContextFactory,
std::vector<char> args;
};
- LinuxUI();
+ LinuxUi();
static CmdLineArgs CopyCmdLine(const base::CommandLine& command_line);
- const base::ObserverList<views::WindowButtonOrderObserver>::Unchecked&
+ const base::ObserverList<WindowButtonOrderObserver>::Unchecked&
window_button_order_observer_list() const {
return window_button_order_observer_list_;
}
- const base::ObserverList<views::DeviceScaleFactorObserver>::Unchecked&
+ const base::ObserverList<DeviceScaleFactorObserver>::Unchecked&
device_scale_factor_observer_list() const {
return device_scale_factor_observer_list_;
}
- virtual ui::NativeTheme* GetNativeTheme() const = 0;
+ const base::ObserverList<CursorThemeManagerObserver>&
+ cursor_theme_observers() {
+ return cursor_theme_observer_list_;
+ }
+
+ virtual ui::NativeTheme* GetNativeThemeImpl() const = 0;
private:
// Used to determine whether the system theme should be used for a window. If
@@ -222,14 +275,17 @@ class VIEWS_EXPORT LinuxUI : public ui::LinuxInputMethodContextFactory,
UseSystemThemeCallback use_system_theme_callback_;
// Objects to notify when the window frame button order changes.
- base::ObserverList<views::WindowButtonOrderObserver>::Unchecked
+ base::ObserverList<WindowButtonOrderObserver>::Unchecked
window_button_order_observer_list_;
// Objects to notify when the device scale factor changes.
- base::ObserverList<views::DeviceScaleFactorObserver>::Unchecked
+ base::ObserverList<DeviceScaleFactorObserver>::Unchecked
device_scale_factor_observer_list_;
+
+ // Objects to notify when the cursor theme or size changes.
+ base::ObserverList<CursorThemeManagerObserver> cursor_theme_observer_list_;
};
-} // namespace views
+} // namespace ui
-#endif // UI_VIEWS_LINUX_UI_LINUX_UI_H_
+#endif // UI_LINUX_LINUX_UI_H_
diff --git a/chromium/ui/linux/linux_ui_base.cc b/chromium/ui/linux/linux_ui_base.cc
new file mode 100644
index 00000000000..c588e2cba48
--- /dev/null
+++ b/chromium/ui/linux/linux_ui_base.cc
@@ -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.
+
+#include "ui/linux/linux_ui_base.h"
+
+#include "ui/native_theme/native_theme.h"
+
+namespace ui {
+
+LinuxUiBase::LinuxUiBase() = default;
+
+LinuxUiBase::~LinuxUiBase() = default;
+
+ui::NativeTheme* LinuxUiBase::GetNativeTheme(bool use_system_theme) const {
+ return use_system_theme ? GetNativeThemeImpl()
+ : ui::NativeTheme::GetInstanceForNativeUi();
+}
+
+} // namespace ui
diff --git a/chromium/ui/linux/linux_ui_base.h b/chromium/ui/linux/linux_ui_base.h
new file mode 100644
index 00000000000..c3fb93c89ed
--- /dev/null
+++ b/chromium/ui/linux/linux_ui_base.h
@@ -0,0 +1,23 @@
+// 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_LINUX_LINUX_UI_BASE_H_
+#define UI_LINUX_LINUX_UI_BASE_H_
+
+#include "ui/linux/linux_ui.h"
+
+namespace ui {
+
+class LinuxUiBase : public LinuxUi {
+ public:
+ LinuxUiBase();
+ ~LinuxUiBase() override;
+
+ // LinuxUi:
+ ui::NativeTheme* GetNativeTheme(bool use_system_theme) const override;
+};
+
+} // namespace ui
+
+#endif // UI_LINUX_LINUX_UI_BASE_H_
diff --git a/chromium/ui/base/linux/linux_ui_delegate.cc b/chromium/ui/linux/linux_ui_delegate.cc
index 77fc3fd65ad..484e8eb2bba 100644
--- a/chromium/ui/base/linux/linux_ui_delegate.cc
+++ b/chromium/ui/linux/linux_ui_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 "ui/base/linux/linux_ui_delegate.h"
+#include "ui/linux/linux_ui_delegate.h"
#include "base/callback.h"
#include "base/notreached.h"
diff --git a/chromium/ui/base/linux/linux_ui_delegate.h b/chromium/ui/linux/linux_ui_delegate.h
index 9f0339123a5..6df1fdb9a0e 100644
--- a/chromium/ui/base/linux/linux_ui_delegate.h
+++ b/chromium/ui/linux/linux_ui_delegate.h
@@ -2,15 +2,18 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_BASE_LINUX_LINUX_UI_DELEGATE_H_
-#define UI_BASE_LINUX_LINUX_UI_DELEGATE_H_
+#ifndef UI_LINUX_LINUX_UI_DELEGATE_H_
+#define UI_LINUX_LINUX_UI_DELEGATE_H_
#include <cstdint>
#include <string>
#include "base/callback_forward.h"
#include "base/component_export.h"
-#include "ui/gfx/native_widget_types.h"
+
+namespace gfx {
+using AcceleratedWidget = uint32_t;
+}
namespace ui {
@@ -20,7 +23,7 @@ enum class LinuxUiBackend {
kWayland,
};
-class COMPONENT_EXPORT(UI_BASE) LinuxUiDelegate {
+class COMPONENT_EXPORT(LINUX_UI) LinuxUiDelegate {
public:
static LinuxUiDelegate* GetInstance();
@@ -51,4 +54,4 @@ class COMPONENT_EXPORT(UI_BASE) LinuxUiDelegate {
} // namespace ui
-#endif // UI_BASE_LINUX_LINUX_UI_DELEGATE_H_
+#endif // UI_LINUX_LINUX_UI_DELEGATE_H_
diff --git a/chromium/ui/base/linux/linux_ui_delegate_stub.cc b/chromium/ui/linux/linux_ui_delegate_stub.cc
index 9b080768430..e0ae4d82ea6 100644
--- a/chromium/ui/base/linux/linux_ui_delegate_stub.cc
+++ b/chromium/ui/linux/linux_ui_delegate_stub.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 "ui/base/linux/linux_ui_delegate_stub.h"
+#include "ui/linux/linux_ui_delegate_stub.h"
#include "base/callback.h"
diff --git a/chromium/ui/base/linux/linux_ui_delegate_stub.h b/chromium/ui/linux/linux_ui_delegate_stub.h
index bdd9dae8d04..b49c0707288 100644
--- a/chromium/ui/base/linux/linux_ui_delegate_stub.h
+++ b/chromium/ui/linux/linux_ui_delegate_stub.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 UI_BASE_LINUX_LINUX_UI_DELEGATE_STUB_H_
-#define UI_BASE_LINUX_LINUX_UI_DELEGATE_STUB_H_
+#ifndef UI_LINUX_LINUX_UI_DELEGATE_STUB_H_
+#define UI_LINUX_LINUX_UI_DELEGATE_STUB_H_
-#include "ui/base/linux/linux_ui_delegate.h"
+#include "ui/linux/linux_ui_delegate.h"
namespace ui {
-class COMPONENT_EXPORT(UI_BASE) LinuxUiDelegateStub
+class COMPONENT_EXPORT(LINUX_UI) LinuxUiDelegateStub
: public ui::LinuxUiDelegate {
public:
LinuxUiDelegateStub();
@@ -26,4 +26,4 @@ class COMPONENT_EXPORT(UI_BASE) LinuxUiDelegateStub
} // namespace ui
-#endif // UI_BASE_LINUX_LINUX_UI_DELEGATE_STUB_H_
+#endif // UI_LINUX_LINUX_UI_DELEGATE_STUB_H_
diff --git a/chromium/ui/views/linux_ui/linux_ui_factory.cc b/chromium/ui/linux/linux_ui_factory.cc
index 9651a38c3dc..e43758bb607 100644
--- a/chromium/ui/views/linux_ui/linux_ui_factory.cc
+++ b/chromium/ui/linux/linux_ui_factory.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 "ui/views/linux_ui/linux_ui_factory.h"
+#include "ui/linux/linux_ui_factory.h"
+
+#include <utility>
#include "ui/base/buildflags.h"
-#include "ui/views/linux_ui/linux_ui.h"
+#include "ui/linux/linux_ui.h"
#if BUILDFLAG(USE_GTK)
#include "ui/gtk/gtk_ui_factory.h"
@@ -14,14 +16,23 @@
#include "ui/qt/qt_ui.h"
#endif
-std::unique_ptr<views::LinuxUI> CreateLinuxUi() {
+namespace ui {
+
+std::unique_ptr<LinuxUi> CreateLinuxUi() {
// TODO(thomasanderson): LinuxUI backend should be chosen depending on the
// environment.
#if BUILDFLAG(USE_QT)
- auto qt_ui = qt::CreateQtUi();
- if (qt_ui->Initialize())
- return qt_ui;
- qt_ui.reset(); // Reset to prevent 2 active LinuxUI instances.
+ {
+ std::unique_ptr<LinuxUi> fallback_linux_ui;
+#if BUILDFLAG(USE_GTK)
+ fallback_linux_ui = BuildGtkUi();
+ if (!fallback_linux_ui->Initialize())
+ fallback_linux_ui.reset();
+#endif
+ auto qt_ui = qt::CreateQtUi(std::move(fallback_linux_ui));
+ if (qt_ui->Initialize())
+ return qt_ui;
+ }
#endif
#if BUILDFLAG(USE_GTK)
{
@@ -32,3 +43,5 @@ std::unique_ptr<views::LinuxUI> CreateLinuxUi() {
#endif
return nullptr;
}
+
+} // namespace ui \ No newline at end of file
diff --git a/chromium/ui/views/linux_ui/linux_ui_factory.h b/chromium/ui/linux/linux_ui_factory.h
index b2b2cb4edfb..72f665e9f01 100644
--- a/chromium/ui/views/linux_ui/linux_ui_factory.h
+++ b/chromium/ui/linux/linux_ui_factory.h
@@ -2,17 +2,19 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_VIEWS_LINUX_UI_LINUX_UI_FACTORY_H_
-#define UI_VIEWS_LINUX_UI_LINUX_UI_FACTORY_H_
+#ifndef UI_LINUX_LINUX_UI_FACTORY_H_
+#define UI_LINUX_LINUX_UI_FACTORY_H_
#include <memory>
-namespace views {
-class LinuxUI;
-}
+namespace ui {
+
+class LinuxUi;
// Returns a new LinuxUI based on a Linux toolkit. May return nullptr if the
// preferred toolkits are unavailable.
-std::unique_ptr<views::LinuxUI> CreateLinuxUi();
+std::unique_ptr<LinuxUi> CreateLinuxUi();
+
+} // namespace ui
-#endif // UI_VIEWS_LINUX_UI_LINUX_UI_FACTORY_H_
+#endif // UI_LINUX_LINUX_UI_FACTORY_H_
diff --git a/chromium/ui/views/linux_ui/nav_button_provider.h b/chromium/ui/linux/nav_button_provider.h
index 1c07d4f340a..aee27143364 100644
--- a/chromium/ui/views/linux_ui/nav_button_provider.h
+++ b/chromium/ui/linux/nav_button_provider.h
@@ -2,12 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_VIEWS_LINUX_UI_NAV_BUTTON_PROVIDER_H_
-#define UI_VIEWS_LINUX_UI_NAV_BUTTON_PROVIDER_H_
-
-#include "build/buildflag.h"
-#include "ui/views/buildflags.h"
-#include "ui/views/controls/button/button.h"
+#ifndef UI_LINUX_NAV_BUTTON_PROVIDER_H_
+#define UI_LINUX_NAV_BUTTON_PROVIDER_H_
namespace chrome {
enum class FrameButtonDisplayType;
@@ -18,7 +14,7 @@ class ImageSkia;
class Insets;
} // namespace gfx
-namespace views {
+namespace ui {
class NavButtonProvider {
public:
@@ -34,7 +30,15 @@ class NavButtonProvider {
kClose,
};
- virtual ~NavButtonProvider() {}
+ // This enum is based on views::Button::ButtonState.
+ enum class ButtonState {
+ kNormal,
+ kHovered,
+ kPressed,
+ kDisabled,
+ };
+
+ virtual ~NavButtonProvider() = default;
// Redraws all images and updates all size state. |top_area_height|
// is the total available height to render the buttons, and buttons
@@ -45,15 +49,13 @@ class NavButtonProvider {
bool active) = 0;
// Gets the cached button image corresponding to |type| and |state|.
- virtual gfx::ImageSkia GetImage(
- views::NavButtonProvider::FrameButtonDisplayType type,
- views::Button::ButtonState state) const = 0;
+ virtual gfx::ImageSkia GetImage(FrameButtonDisplayType type,
+ ButtonState state) const = 0;
// Gets the external margin around each button. The left inset
// represents the leading margin, and the right inset represents the
// trailing margin.
- virtual gfx::Insets GetNavButtonMargin(
- views::NavButtonProvider::FrameButtonDisplayType type) const = 0;
+ virtual gfx::Insets GetNavButtonMargin(FrameButtonDisplayType type) const = 0;
// Gets the internal spacing (padding + border) of the top area.
// The left inset represents the leading spacing, and the right
@@ -64,6 +66,6 @@ class NavButtonProvider {
virtual int GetInterNavButtonSpacing() const = 0;
};
-} // namespace views
+} // namespace ui
-#endif // UI_VIEWS_LINUX_UI_NAV_BUTTON_PROVIDER_H_
+#endif // UI_LINUX_NAV_BUTTON_PROVIDER_H_
diff --git a/chromium/ui/views/linux_ui/status_icon_linux.cc b/chromium/ui/linux/status_icon_linux.cc
index e861e15761a..3e8f5c931c3 100644
--- a/chromium/ui/views/linux_ui/status_icon_linux.cc
+++ b/chromium/ui/linux/status_icon_linux.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 "ui/views/linux_ui/status_icon_linux.h"
+#include "ui/linux/status_icon_linux.h"
-namespace views {
+namespace ui {
StatusIconLinux::Delegate::~Delegate() = default;
@@ -21,4 +21,4 @@ void StatusIconLinux::SetDelegate(Delegate* delegate) {
OnSetDelegate();
}
-} // namespace views
+} // namespace ui
diff --git a/chromium/ui/views/linux_ui/status_icon_linux.h b/chromium/ui/linux/status_icon_linux.h
index 5d02eae803e..7f2d2bd038d 100644
--- a/chromium/ui/views/linux_ui/status_icon_linux.h
+++ b/chromium/ui/linux/status_icon_linux.h
@@ -2,12 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_VIEWS_LINUX_UI_STATUS_ICON_LINUX_H_
-#define UI_VIEWS_LINUX_UI_STATUS_ICON_LINUX_H_
+#ifndef UI_LINUX_STATUS_ICON_LINUX_H_
+#define UI_LINUX_STATUS_ICON_LINUX_H_
#include <string>
-#include "ui/views/views_export.h"
+#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
namespace gfx {
class ImageSkia;
@@ -17,13 +18,13 @@ namespace ui {
class MenuModel;
} // namespace ui
-namespace views {
+namespace ui {
-// Since liblinux_ui cannot have dependencies on any chrome browser components
+// Since linux_ui cannot have dependencies on any chrome browser components
// we cannot inherit from StatusIcon. So we implement the necessary methods
// and let a wrapper class implement the StatusIcon interface and defer the
// callbacks to a delegate. For the same reason, do not use StatusIconMenuModel.
-class VIEWS_EXPORT StatusIconLinux {
+class COMPONENT_EXPORT(LINUX_UI) StatusIconLinux {
public:
class Delegate {
public:
@@ -64,9 +65,9 @@ class VIEWS_EXPORT StatusIconLinux {
Delegate* delegate() { return delegate_; }
protected:
- Delegate* delegate_ = nullptr;
+ raw_ptr<Delegate> delegate_ = nullptr;
};
-} // namespace views
+} // namespace ui
-#endif // UI_VIEWS_LINUX_UI_STATUS_ICON_LINUX_H_
+#endif // UI_LINUX_STATUS_ICON_LINUX_H_
diff --git a/chromium/ui/views/linux_ui/window_button_order_observer.h b/chromium/ui/linux/window_button_order_observer.h
index 584dca3383b..ce26875346b 100644
--- a/chromium/ui/views/linux_ui/window_button_order_observer.h
+++ b/chromium/ui/linux/window_button_order_observer.h
@@ -2,12 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_VIEWS_LINUX_UI_WINDOW_BUTTON_ORDER_OBSERVER_H_
-#define UI_VIEWS_LINUX_UI_WINDOW_BUTTON_ORDER_OBSERVER_H_
+#ifndef UI_LINUX_WINDOW_BUTTON_ORDER_OBSERVER_H_
+#define UI_LINUX_WINDOW_BUTTON_ORDER_OBSERVER_H_
-#include "ui/views/window/frame_buttons.h"
-
-namespace views {
+namespace ui {
// Observer interface to receive the ordering of the min,max,close buttons.
class WindowButtonOrderObserver {
@@ -19,6 +17,6 @@ class WindowButtonOrderObserver {
virtual ~WindowButtonOrderObserver() = default;
};
-} // namespace views
+} // namespace ui
-#endif // UI_VIEWS_LINUX_UI_WINDOW_BUTTON_ORDER_OBSERVER_H_
+#endif // UI_LINUX_WINDOW_BUTTON_ORDER_OBSERVER_H_
diff --git a/chromium/ui/views/linux_ui/window_frame_provider.h b/chromium/ui/linux/window_frame_provider.h
index c8124c36d3f..4708e30333c 100644
--- a/chromium/ui/views/linux_ui/window_frame_provider.h
+++ b/chromium/ui/linux/window_frame_provider.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_VIEWS_LINUX_UI_WINDOW_FRAME_PROVIDER_H_
-#define UI_VIEWS_LINUX_UI_WINDOW_FRAME_PROVIDER_H_
+#ifndef UI_LINUX_WINDOW_FRAME_PROVIDER_H_
+#define UI_LINUX_WINDOW_FRAME_PROVIDER_H_
namespace gfx {
class Canvas;
@@ -11,7 +11,7 @@ class Insets;
class Rect;
} // namespace gfx
-namespace views {
+namespace ui {
class WindowFrameProvider {
public:
@@ -33,6 +33,6 @@ class WindowFrameProvider {
bool focused) = 0;
};
-} // namespace views
+} // namespace ui
-#endif // UI_VIEWS_LINUX_UI_WINDOW_FRAME_PROVIDER_H_
+#endif // UI_LINUX_WINDOW_FRAME_PROVIDER_H_
diff --git a/chromium/ui/lottie/animation.cc b/chromium/ui/lottie/animation.cc
index eac05dd0322..92a7be78660 100644
--- a/chromium/ui/lottie/animation.cc
+++ b/chromium/ui/lottie/animation.cc
@@ -4,12 +4,16 @@
#include "ui/lottie/animation.h"
+#include <algorithm>
+#include <utility>
+
#include "base/bind.h"
#include "base/check.h"
#include "base/numerics/safe_conversions.h"
#include "base/observer_list.h"
#include "base/trace_event/trace_event.h"
#include "cc/paint/skottie_wrapper.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkImage.h"
@@ -22,45 +26,79 @@
namespace lottie {
-Animation::TimerControl::TimerControl(const base::TimeDelta& offset,
- const base::TimeDelta& cycle_duration,
- const base::TimeDelta& total_duration,
- const base::TimeTicks& start_timestamp,
- bool should_reverse,
- float playback_speed)
- : start_offset_(offset),
- end_offset_((offset + cycle_duration)),
- cycle_duration_(end_offset_ - start_offset_),
+namespace {
+
+bool IsCycleValid(const Animation::CycleBoundaries& boundaries,
+ const Animation& animation) {
+ return boundaries.start_offset >= base::TimeDelta() &&
+ boundaries.end_offset <= animation.GetAnimationDuration() &&
+ boundaries.start_offset < boundaries.end_offset;
+}
+
+bool IsInCycleBoundaries(base::TimeDelta offset,
+ const Animation::CycleBoundaries& boundaries) {
+ return offset >= boundaries.start_offset && offset < boundaries.end_offset;
+}
+
+Animation::CycleBoundaries GetCycleAtIndex(
+ const std::vector<Animation::CycleBoundaries>& scheduled_cycles,
+ int cycle_idx) {
+ DCHECK(!scheduled_cycles.empty());
+ return scheduled_cycles[std::min(
+ cycle_idx, static_cast<int>(scheduled_cycles.size()) - 1)];
+}
+
+} // namespace
+
+Animation::TimerControl::TimerControl(
+ std::vector<CycleBoundaries> scheduled_cycles,
+ base::TimeDelta initial_offset,
+ int initial_completed_cycles,
+ const base::TimeDelta& total_duration,
+ const base::TimeTicks& start_timestamp,
+ bool should_reverse,
+ float playback_speed)
+ : scheduled_cycles_(std::move(scheduled_cycles)),
total_duration_(total_duration),
previous_tick_(start_timestamp),
- progress_(base::Milliseconds(0)),
- current_cycle_progress_(start_offset_),
- should_reverse_(should_reverse) {
+ current_cycle_progress_(initial_offset),
+ should_reverse_(should_reverse),
+ completed_cycles_(initial_completed_cycles),
+ current_cycle_(GetCycleAtIndex(scheduled_cycles_, completed_cycles_)) {
SetPlaybackSpeed(playback_speed);
}
+Animation::TimerControl::~TimerControl() = default;
+
void Animation::TimerControl::SetPlaybackSpeed(float playback_speed) {
DCHECK_GT(playback_speed, 0.f);
playback_speed_ = playback_speed;
}
void Animation::TimerControl::Step(const base::TimeTicks& timestamp) {
- progress_ += (timestamp - previous_tick_) * playback_speed_;
- previous_tick_ = timestamp;
-
- base::TimeDelta completed_cycles_duration =
- completed_cycles_ * cycle_duration_;
- if (progress_ >= completed_cycles_duration + cycle_duration_) {
- completed_cycles_ = base::ClampFloor(progress_ / cycle_duration_);
- completed_cycles_duration = cycle_duration_ * completed_cycles_;
- }
-
- current_cycle_progress_ =
- start_offset_ + progress_ - completed_cycles_duration;
- if (should_reverse_ && completed_cycles_ % 2) {
- current_cycle_progress_ =
- end_offset_ - (current_cycle_progress_ - start_offset_);
+ base::TimeDelta step_size = (timestamp - previous_tick_) * playback_speed_;
+ while (!step_size.is_zero()) {
+ base::TimeDelta time_until_current_cycle_end =
+ IsPlayingInReverse()
+ ? (current_cycle_progress_ - current_cycle_.start_offset)
+ : (current_cycle_.end_offset - current_cycle_progress_);
+ if (step_size >= time_until_current_cycle_end) {
+ ++completed_cycles_;
+ current_cycle_ = GetCycleAtIndex(scheduled_cycles_, completed_cycles_);
+ current_cycle_progress_ = IsPlayingInReverse()
+ ? current_cycle_.end_offset
+ : current_cycle_.start_offset;
+ step_size -= time_until_current_cycle_end;
+ } else {
+ if (IsPlayingInReverse()) {
+ current_cycle_progress_ -= step_size;
+ } else {
+ current_cycle_progress_ += step_size;
+ }
+ step_size = base::TimeDelta();
+ }
}
+ previous_tick_ = timestamp;
}
void Animation::TimerControl::Resume(const base::TimeTicks& timestamp) {
@@ -72,13 +110,64 @@ double Animation::TimerControl::GetNormalizedCurrentCycleProgress() const {
}
double Animation::TimerControl::GetNormalizedStartOffset() const {
- return start_offset_ / total_duration_;
+ return current_cycle_.start_offset / total_duration_;
}
double Animation::TimerControl::GetNormalizedEndOffset() const {
- return end_offset_ / total_duration_;
+ return current_cycle_.end_offset / total_duration_;
+}
+
+bool Animation::TimerControl::IsPlayingInReverse() const {
+ return should_reverse_ && completed_cycles_ % 2;
+}
+
+// static
+Animation::CycleBoundaries Animation::CycleBoundaries::FullCycle(
+ const Animation& animation) {
+ return {
+ /*start_offset=*/base::TimeDelta(),
+ /*duration=*/animation.GetAnimationDuration(),
+ };
+}
+
+// static
+Animation::PlaybackConfig Animation::PlaybackConfig::CreateDefault(
+ const Animation& animation) {
+ return PlaybackConfig(
+ /*scheduled_cycles=*/{CycleBoundaries::FullCycle(animation)},
+ /*initial_offset=*/base::TimeDelta(),
+ /*initial_completed_cycles=*/0, Animation::Style::kLoop);
+}
+
+// static
+Animation::PlaybackConfig Animation::PlaybackConfig::CreateWithStyle(
+ Style style,
+ const Animation& animation) {
+ PlaybackConfig config = CreateDefault(animation);
+ config.style = style;
+ return config;
}
+Animation::PlaybackConfig::PlaybackConfig() = default;
+
+Animation::PlaybackConfig::PlaybackConfig(
+ std::vector<CycleBoundaries> scheduled_cycles,
+ base::TimeDelta initial_offset,
+ int initial_completed_cycles,
+ Style style)
+ : scheduled_cycles(std::move(scheduled_cycles)),
+ initial_offset(initial_offset),
+ initial_completed_cycles(initial_completed_cycles),
+ style(style) {}
+
+Animation::PlaybackConfig::PlaybackConfig(const PlaybackConfig& other) =
+ default;
+
+Animation::PlaybackConfig& Animation::PlaybackConfig::operator=(
+ const PlaybackConfig& other) = default;
+
+Animation::PlaybackConfig::~PlaybackConfig() = default;
+
Animation::Animation(scoped_refptr<cc::SkottieWrapper> skottie,
cc::SkottieColorMap color_map,
cc::SkottieFrameDataProvider* frame_data_provider)
@@ -106,7 +195,11 @@ Animation::Animation(scoped_refptr<cc::SkottieWrapper> skottie,
}
}
-Animation::~Animation() = default;
+Animation::~Animation() {
+ for (AnimationObserver& obs : observers_) {
+ obs.AnimationIsDeleting(this);
+ }
+}
void Animation::AddObserver(AnimationObserver* observer) {
observers_.AddObserver(observer);
@@ -135,19 +228,11 @@ gfx::Size Animation::GetOriginalSize() const {
return gfx::ToRoundedSize(gfx::SkSizeToSizeF(skottie_->size()));
}
-void Animation::Start(Style style) {
- DCHECK_NE(state_, PlayState::kPaused);
- DCHECK_NE(state_, PlayState::kPlaying);
- StartSubsection(base::TimeDelta(), GetAnimationDuration(), style);
-}
-
-void Animation::StartSubsection(base::TimeDelta start_offset,
- base::TimeDelta duration,
- Style style) {
+void Animation::Start(absl::optional<PlaybackConfig> playback_config) {
DCHECK(state_ == PlayState::kStopped || state_ == PlayState::kEnded);
- DCHECK_LE(start_offset + duration, GetAnimationDuration());
-
- style_ = style;
+ if (!playback_config)
+ playback_config = PlaybackConfig::CreateDefault(*this);
+ VerifyPlaybackConfigIsValid(*playback_config);
// Reset the |timer_control_| object for a new animation play.
timer_control_.reset(nullptr);
@@ -155,8 +240,7 @@ void Animation::StartSubsection(base::TimeDelta start_offset,
// Schedule a play for the animation and store the necessary information
// needed to start playing.
state_ = PlayState::kSchedulePlay;
- scheduled_start_offset_ = start_offset;
- scheduled_duration_ = duration;
+ playback_config_ = std::move(*playback_config);
}
void Animation::Pause() {
@@ -174,27 +258,59 @@ void Animation::Stop() {
timer_control_.reset(nullptr);
}
-float Animation::GetCurrentProgress() const {
+absl::optional<float> Animation::GetCurrentProgress() const {
switch (state_) {
case PlayState::kStopped:
- return 0;
+ return absl::nullopt;
case PlayState::kEnded:
DCHECK(timer_control_);
return timer_control_->GetNormalizedEndOffset();
case PlayState::kPaused:
- // It may be that the timer hasn't been initialized, which may happen if
- // the animation was paused while it was in the kSchedulePlay state.
- return timer_control_
- ? timer_control_->GetNormalizedCurrentCycleProgress()
- : (scheduled_start_offset_ / GetAnimationDuration());
case PlayState::kSchedulePlay:
case PlayState::kPlaying:
case PlayState::kScheduleResume:
- // The timer control needs to be initialized before making this call. It
- // may not have been initialized if OnAnimationStep has not been called
- // yet
- DCHECK(timer_control_);
- return timer_control_->GetNormalizedCurrentCycleProgress();
+ // The timer control may not have been initialized if OnAnimationStep has
+ // not been called yet (meaning no frame has actually been painted yet and
+ // there is no "progress" at all).
+ if (timer_control_) {
+ return timer_control_->GetNormalizedCurrentCycleProgress();
+ } else {
+ return absl::nullopt;
+ }
+ }
+}
+
+absl::optional<int> Animation::GetNumCompletedCycles() const {
+ if (state_ == PlayState::kStopped)
+ return absl::nullopt;
+
+ // This can happen if Start() has been called but a single frame has not been
+ // painted yet.
+ if (!timer_control_)
+ return playback_config_.initial_completed_cycles;
+
+ if (state_ == PlayState::kEnded) {
+ DCHECK_EQ(playback_config_.style, Style::kLinear);
+ return 1;
+ }
+
+ return timer_control_->completed_cycles();
+}
+
+absl::optional<Animation::PlaybackConfig> Animation::GetPlaybackConfig() const {
+ if (state_ == PlayState::kStopped) {
+ return absl::nullopt;
+ } else {
+ return playback_config_;
+ }
+}
+
+absl::optional<Animation::CycleBoundaries>
+Animation::GetCurrentCycleBoundaries() const {
+ if (state_ == PlayState::kStopped || !timer_control_) {
+ return absl::nullopt;
+ } else {
+ return timer_control_->current_cycle();
}
}
@@ -218,10 +334,15 @@ void Animation::Paint(gfx::Canvas* canvas,
timer_control_->Step(timestamp);
int new_num_cycles = timer_control_->completed_cycles();
animation_cycle_ended = new_num_cycles != previous_num_cycles;
- if (animation_cycle_ended && style_ == Style::kLinear)
+ if (animation_cycle_ended && playback_config_.style == Style::kLinear)
state_ = PlayState::kEnded;
} break;
case PlayState::kPaused:
+ // The |timer_control_| may be null if the animation was Start()ed and
+ // then Pause()ed before a single frame was painted. Initialize it here
+ // so that GetCurrentProgress() below returns a valid timestamp.
+ if (!timer_control_)
+ InitTimer(timestamp);
break;
case PlayState::kScheduleResume:
state_ = PlayState::kPlaying;
@@ -239,7 +360,9 @@ void Animation::Paint(gfx::Canvas* canvas,
case PlayState::kEnded:
break;
}
- PaintFrame(canvas, GetCurrentProgress(), size);
+ absl::optional<float> current_progress = GetCurrentProgress();
+ DCHECK(current_progress);
+ PaintFrame(canvas, *current_progress, size);
// Notify animation cycle ended after everything is done in case an observer
// tries to change the animation's state within its observer implementation.
@@ -250,6 +373,7 @@ void Animation::Paint(gfx::Canvas* canvas,
void Animation::PaintFrame(gfx::Canvas* canvas,
float t,
const gfx::Size& size) {
+ TRACE_EVENT1("ui", "Animation::PaintFrame", "timestamp", t);
DCHECK_GE(t, 0.f);
DCHECK_LE(t, 1.f);
// Not all of the image assets necessarily appear in the frame at time |t|. To
@@ -263,6 +387,9 @@ void Animation::PaintFrame(gfx::Canvas* canvas,
std::ref(all_frame_data)));
canvas->DrawSkottie(skottie(), gfx::Rect(size), t, std::move(all_frame_data),
color_map_, text_map_);
+ for (AnimationObserver& obs : observers_) {
+ obs.AnimationFramePainted(this, t);
+ }
}
void Animation::SetPlaybackSpeed(float playback_speed) {
@@ -278,6 +405,7 @@ cc::SkottieWrapper::FrameDataFetchResult Animation::LoadImageForAsset(
float t,
sk_sp<SkImage>&,
SkSamplingOptions&) {
+ TRACE_EVENT0("ui", "Animation::LoadImageForAsset");
cc::SkottieFrameDataProvider::ImageAsset& image_asset =
*image_assets_.at(asset_id);
all_frame_data.emplace(asset_id,
@@ -290,14 +418,15 @@ cc::SkottieWrapper::FrameDataFetchResult Animation::LoadImageForAsset(
void Animation::InitTimer(const base::TimeTicks& timestamp) {
DCHECK(!timer_control_);
timer_control_ = std::make_unique<TimerControl>(
- scheduled_start_offset_, scheduled_duration_, GetAnimationDuration(),
- timestamp, style_ == Style::kThrobbing, playback_speed_);
+ playback_config_.scheduled_cycles, playback_config_.initial_offset,
+ playback_config_.initial_completed_cycles, GetAnimationDuration(),
+ timestamp, playback_config_.style == Style::kThrobbing, playback_speed_);
}
void Animation::TryNotifyAnimationCycleEnded() const {
DCHECK(timer_control_);
bool inform_observer = true;
- switch (style_) {
+ switch (playback_config_.style) {
case Style::kLoop:
break;
case Style::kThrobbing:
@@ -319,4 +448,20 @@ void Animation::TryNotifyAnimationCycleEnded() const {
}
}
+void Animation::VerifyPlaybackConfigIsValid(
+ const PlaybackConfig& playback_config) const {
+ DCHECK(!playback_config.scheduled_cycles.empty());
+ for (const CycleBoundaries& cycle : playback_config.scheduled_cycles) {
+ DCHECK(IsCycleValid(cycle, *this));
+ }
+ if (playback_config.style == Style::kLinear) {
+ DCHECK_EQ(playback_config.scheduled_cycles.size(), 1u);
+ }
+ DCHECK_GE(playback_config.initial_completed_cycles, 0);
+ DCHECK(IsInCycleBoundaries(
+ playback_config.initial_offset,
+ GetCycleAtIndex(playback_config.scheduled_cycles,
+ playback_config.initial_completed_cycles)));
+}
+
} // namespace lottie
diff --git a/chromium/ui/lottie/animation.h b/chromium/ui/lottie/animation.h
index 28f43976a01..0f0fba0e552 100644
--- a/chromium/ui/lottie/animation.h
+++ b/chromium/ui/lottie/animation.h
@@ -7,6 +7,7 @@
#include <functional>
#include <memory>
+#include <vector>
#include "base/component_export.h"
#include "base/containers/flat_map.h"
@@ -21,6 +22,7 @@
#include "cc/paint/skottie_resource_metadata.h"
#include "cc/paint/skottie_text_property_value.h"
#include "cc/paint/skottie_wrapper.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/skia/include/core/SkRefCnt.h"
#include "third_party/skia/include/core/SkStream.h"
#include "third_party/skia/modules/skottie/include/Skottie.h"
@@ -53,7 +55,8 @@ class AnimationObserver;
// 2. Playing the animation and rendering each frame:
// void SampleClient::Init() {
// Animation animation_ = Animation(data);
-// animation_.Start(Animation::Style::LINEAR);
+// animation_.Start(Animation::PlaybackConfig::CreateWithStyle(
+// Animation::Style::kLinear, *animation_));
// }
//
// // overrides cc::CompositorAnimationObserver
@@ -71,8 +74,8 @@ class AnimationObserver;
// // This will seek to the 1st second of the animation and from there
// // play it for 5 seconds.
// Animation animation_ = Animation(data);
-// animation_.Start(Seconds(1),
-// Seconds(5));
+// animation_.Start(Animation::PlaybackConfig({
+// Seconds(1), Seconds(5), Animation::Style::kLinear}));
// }
//
// // overrides cc::CompositorAnimationObserver
@@ -94,6 +97,68 @@ class COMPONENT_EXPORT(UI_LOTTIE) Animation final {
kLoop // Same as LINEAR, except the animation repeats after it ends.
};
+ // An animation goes through a single "cycle" when it's played from one
+ // timestamp to another. After reaching the final timestamp, it may either
+ // loop back to the initial timestamp again, or even play in reverse depending
+ // on the style described above.
+ struct COMPONENT_EXPORT(UI_LOTTIE) CycleBoundaries {
+ // Returns the range [0, animation.GetAnimationDuration()).
+ static CycleBoundaries FullCycle(const Animation& animation);
+
+ // The cycle's range is [start_offset, end_offset). |start_offset| must be
+ // < |end_offset|, and both must be in the range
+ // [0, GetAnimationDuration()]. They represent non-normalized timestamps in
+ // the animation.
+ base::TimeDelta start_offset;
+ base::TimeDelta end_offset;
+ };
+
+ struct COMPONENT_EXPORT(UI_LOTTIE) PlaybackConfig {
+ // By default, loop from the beginning of the animation to the end.
+ static PlaybackConfig CreateDefault(const Animation& animation);
+ // Play from the beginning of the animation to the end with the provided
+ // |style|.
+ static PlaybackConfig CreateWithStyle(Style style,
+ const Animation& animation);
+
+ PlaybackConfig();
+ PlaybackConfig(std::vector<CycleBoundaries> scheduled_cycles,
+ base::TimeDelta initial_offset,
+ int initial_completed_cycles,
+ Style style);
+ PlaybackConfig(const PlaybackConfig& other);
+ PlaybackConfig& operator=(const PlaybackConfig& other);
+ ~PlaybackConfig();
+
+ // Set of cycles that the animation will iterate through in the order they
+ // appear. Must not be empty. After reaching the last entry in
+ // |scheduled_cycles|, the animation will continue re-using the last entry's
+ // boundaries in all future cycles.
+ //
+ // Example: {[0, T), [T/2, 3T/4)}. In the first cycle, the animation will
+ // play starting at time 0 until it reaches timestamp T. After that, it will
+ // loop back to timestamp T/2 and play until 3T/4. The [T/2, 3T/4) cycle
+ // repeats indefinitely until the animation is stopped.
+ //
+ // If |style| is kLinear, |scheduled_cycles| must have exactly one entry.
+ std::vector<CycleBoundaries> scheduled_cycles;
+
+ // |initial_offset| and |initial_completed_cycles| combined dictate
+ // where to start playing the animation from within the |scheduled_cycles|
+ // above. The most common thing is to start playing from the very beginning
+ // (|initial_offset| is the |start_offset| of the first scheduled cycle
+ // and |initial_completed_cycles| is 0). But this allows the caller to
+ // specify an arbitrary starting point.
+ base::TimeDelta initial_offset;
+ // The animation will start playing as if it has already completed the
+ // number of cycles specified below. Note this not only dictates which
+ // scheduled cycle the animation starts within, but also the initial
+ // direction of the animation for throbbing animations.
+ int initial_completed_cycles = 0;
+
+ Style style = Style::kLoop;
+ };
+
// |frame_data_provider| may be null if it's known that the incoming skottie
// animation does not contain any image assets.
explicit Animation(
@@ -118,18 +183,10 @@ class COMPONENT_EXPORT(UI_LOTTIE) Animation final {
// Animation controls --------------------------------------------------------
// This is an asynchronous call that would start playing the animation on the
// next animation step. On a successful start the |observer_| would be
- // notified. Use this if you want to play the entire animation.
- void Start(Style style = Style::kLoop);
-
- // This is an asynchronous call that would start playing the animation on the
- // next animation step. On a successful start the |observer_| would be
// notified.
- // The animation will be scheduled to play from the |start_offset| to
- // |start_offset| + |duration|. The values will be clamped so as to not go out
- // of bounds.
- void StartSubsection(base::TimeDelta start_offset,
- base::TimeDelta duration,
- Style style = Style::kLoop);
+ //
+ // If a null |playback_config| is provided, the default one is used.
+ void Start(absl::optional<PlaybackConfig> playback_config = absl::nullopt);
// Pauses the animation.
void Pause();
@@ -144,7 +201,26 @@ class COMPONENT_EXPORT(UI_LOTTIE) Animation final {
// Returns the current normalized [0..1] value at which the animation frame
// is.
// 0 -> first frame and 1 -> last frame.
- float GetCurrentProgress() const;
+ //
+ // Returns nullopt if a timestamp is currently is unavailable. This is the
+ // case if:
+ // * The animation is currently Stop()ed.
+ // * The animation has been Start()ed but a single frame has not been painted
+ // yet.
+ absl::optional<float> GetCurrentProgress() const;
+
+ // Returns the currently playing cycle within the PlaybackConfig's
+ // |scheduled_cycles|. Returns nullopt under the same circumstances as
+ // GetCurrentProgress().
+ absl::optional<CycleBoundaries> GetCurrentCycleBoundaries() const;
+
+ // Returns the number of animation cycles that have been completed since
+ // Play() was called, or nullopt if the animation is currently Stop()ed.
+ absl::optional<int> GetNumCompletedCycles() const;
+
+ // Returns the currently active PlaybackConfig, or nullopt if the animation
+ // is currently Stop()ed.
+ absl::optional<PlaybackConfig> GetPlaybackConfig() const;
// Paint operations ----------------------------------------------------------
// Paints the frame of the animation for the given |timestamp| at the given
@@ -194,13 +270,14 @@ class COMPONENT_EXPORT(UI_LOTTIE) Animation final {
// reverse flag is set, the progress runs in reverse.
class COMPONENT_EXPORT(UI_LOTTIE) TimerControl final {
public:
- TimerControl(const base::TimeDelta& offset,
- const base::TimeDelta& cycle_duration,
+ TimerControl(std::vector<CycleBoundaries> scheduled_cycles,
+ base::TimeDelta initial_offset,
+ int initial_completed_cycles,
const base::TimeDelta& total_duration,
const base::TimeTicks& start_timestamp,
bool should_reverse,
float playback_speed);
- ~TimerControl() = default;
+ ~TimerControl();
TimerControl(const TimerControl&) = delete;
TimerControl& operator=(const TimerControl&) = delete;
@@ -216,19 +293,17 @@ class COMPONENT_EXPORT(UI_LOTTIE) Animation final {
double GetNormalizedStartOffset() const;
double GetNormalizedEndOffset() const;
int completed_cycles() const { return completed_cycles_; }
+ CycleBoundaries current_cycle() const { return current_cycle_; }
private:
friend class AnimationTest;
- // Time duration from 0 which marks the beginning of a cycle.
- const base::TimeDelta start_offset_;
-
- // Time duration from 0 which marks the end of a cycle.
- const base::TimeDelta end_offset_;
+ // Only applies to throbbing animations, for which every even numbered
+ // cycle plays forwards, and every odd numbered cycle plays reversed.
+ bool IsPlayingInReverse() const;
- // Time duration for one cycle. This is essentially a cache of the
- // difference between |end_offset_| - |start_offset_|.
- const base::TimeDelta cycle_duration_;
+ // See comments in |PlaybackConfig::scheduled_cycles|.
+ const std::vector<CycleBoundaries> scheduled_cycles_;
// Total duration of all cycles.
const base::TimeDelta total_duration_;
@@ -236,21 +311,22 @@ class COMPONENT_EXPORT(UI_LOTTIE) Animation final {
// The timetick at which |progress_| was updated last.
base::TimeTicks previous_tick_;
- // The progress of the timer. This is a monotonically increasing value.
- base::TimeDelta progress_;
-
// This is the progress of the timer in the current cycle.
base::TimeDelta current_cycle_progress_;
// If true, the progress will go into reverse after each cycle. This is used
// for throbbing animations.
- bool should_reverse_ = false;
+ const bool should_reverse_ = false;
// The number of times each |cycle_duration_| is covered by the timer.
int completed_cycles_ = 0;
// See comments above SetPlaybackSpeed().
float playback_speed_ = 1.f;
+
+ // The boundaries of the current cycle. This is a copy of one of the entries
+ // in |scheduled_cycles_|.
+ CycleBoundaries current_cycle_;
};
void InitTimer(const base::TimeTicks& timestamp);
@@ -262,20 +338,16 @@ class COMPONENT_EXPORT(UI_LOTTIE) Animation final {
float t,
sk_sp<SkImage>&,
SkSamplingOptions&);
+ void VerifyPlaybackConfigIsValid(const PlaybackConfig& playback_config) const;
// Manages the timeline for the current playing animation.
std::unique_ptr<TimerControl> timer_control_;
- // The style of animation to play.
- Style style_ = Style::kLoop;
-
// The current state of animation.
PlayState state_ = PlayState::kStopped;
- // The below values of scheduled_* are set when we have scheduled a play.
- // These will be used to initialize |timer_control_|.
- base::TimeDelta scheduled_start_offset_;
- base::TimeDelta scheduled_duration_;
+ // The config from the most recent call to Start().
+ PlaybackConfig playback_config_;
base::ObserverList<AnimationObserver> observers_;
diff --git a/chromium/ui/lottie/animation_observer.h b/chromium/ui/lottie/animation_observer.h
index 7a03e706dbb..009555b095c 100644
--- a/chromium/ui/lottie/animation_observer.h
+++ b/chromium/ui/lottie/animation_observer.h
@@ -25,6 +25,17 @@ class COMPONENT_EXPORT(UI_LOTTIE) AnimationObserver
// Called when the animation has successfully resumed.
virtual void AnimationResuming(const Animation* animation) {}
+ // Called after each animation frame is painted. Note this is not synonymous
+ // with the frame ultimately being rendered on screen; it only means the frame
+ // has been submitted to the rest of the graphics pipeline for rendering.
+ //
+ // |t| is the normalized timestamp in range [0, 1] of the frame just painted.
+ virtual void AnimationFramePainted(const Animation* animation, float t) {}
+
+ // Called in the Animation's destructor. Observers may remove themselves
+ // within their implementation.
+ virtual void AnimationIsDeleting(const Animation* animation) {}
+
protected:
~AnimationObserver() override = default;
};
diff --git a/chromium/ui/lottie/animation_unittest.cc b/chromium/ui/lottie/animation_unittest.cc
index 9427a97122b..76703e840f5 100644
--- a/chromium/ui/lottie/animation_unittest.cc
+++ b/chromium/ui/lottie/animation_unittest.cc
@@ -36,7 +36,9 @@
namespace lottie {
namespace {
+using ::testing::ElementsAre;
using ::testing::Eq;
+using ::testing::FieldsAre;
using ::testing::FloatEq;
using ::testing::FloatNear;
using ::testing::IsEmpty;
@@ -103,6 +105,15 @@ class TestAnimationObserver : public AnimationObserver {
animation_resuming_ = true;
}
+ void AnimationFramePainted(const Animation* animation, float t) override {
+ last_frame_painted_ = t;
+ }
+
+ void AnimationIsDeleting(const Animation* animation) override {
+ animation_is_deleted_ = true;
+ observation_.Reset();
+ }
+
void Reset() {
animation_cycle_ended_ = false;
animation_will_start_playing_ = false;
@@ -114,12 +125,18 @@ class TestAnimationObserver : public AnimationObserver {
return animation_will_start_playing_;
}
bool animation_resuming() const { return animation_resuming_; }
+ bool animation_is_deleted() const { return animation_is_deleted_; }
+ const absl::optional<float>& last_frame_painted() const {
+ return last_frame_painted_;
+ }
private:
base::ScopedObservation<Animation, AnimationObserver> observation_{this};
bool animation_cycle_ended_ = false;
bool animation_will_start_playing_ = false;
bool animation_resuming_ = false;
+ bool animation_is_deleted_ = false;
+ absl::optional<float> last_frame_painted_;
};
class TestSkottieFrameDataProvider : public cc::SkottieFrameDataProvider {
@@ -200,7 +217,9 @@ class AnimationTest : public testing::Test {
gfx::Canvas* canvas() { return canvas_.get(); }
- Animation::Style GetStyle() const { return animation_->style_; }
+ Animation::Style GetStyle() const {
+ return animation_->playback_config_.style;
+ }
Animation::PlayState GetState() const { return animation_->state_; }
@@ -339,7 +358,8 @@ TEST_F(AnimationTest, PlayLinearAnimation) {
AdvanceClock(base::Milliseconds(300));
EXPECT_TRUE(IsStopped());
- animation_->Start(Animation::Style::kLinear);
+ animation_->Start(Animation::PlaybackConfig::CreateWithStyle(
+ Animation::Style::kLinear, *animation_));
EXPECT_TRUE(IsScheduledToPlay());
EXPECT_FALSE(observer.animation_will_start_playing());
@@ -348,7 +368,8 @@ TEST_F(AnimationTest, PlayLinearAnimation) {
EXPECT_TRUE(IsPlaying());
EXPECT_TRUE(observer.animation_will_start_playing());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), 0);
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), 0);
EXPECT_FLOAT_EQ(GetTimerStartOffset(), 0);
EXPECT_FLOAT_EQ(GetTimerEndOffset(), 1.f);
IsAllSameColor(SK_ColorGREEN, canvas()->GetBitmap());
@@ -360,7 +381,8 @@ TEST_F(AnimationTest, PlayLinearAnimation) {
EXPECT_EQ(TimeDeltaSince(GetTimerPreviousTick()), kAdvance);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
kAdvance / kAnimationDuration);
EXPECT_EQ(TimeDeltaSince(GetTimerPreviousTick()), base::TimeDelta());
IsAllSameColor(SK_ColorGREEN, canvas()->GetBitmap());
@@ -371,7 +393,8 @@ TEST_F(AnimationTest, PlayLinearAnimation) {
AdvanceClock(kAdvanceToEnd);
EXPECT_EQ(TimeDeltaSince(GetTimerPreviousTick()), kAdvanceToEnd);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), 1.f);
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), 1.f);
EXPECT_TRUE(HasAnimationEnded());
EXPECT_TRUE(observer.animation_cycle_ended());
IsAllSameColor(SK_ColorBLUE, canvas()->GetBitmap());
@@ -382,20 +405,23 @@ TEST_F(AnimationTest, StopLinearAnimation) {
AdvanceClock(base::Milliseconds(300));
- animation_->Start(Animation::Style::kLinear);
+ animation_->Start(Animation::PlaybackConfig::CreateWithStyle(
+ Animation::Style::kLinear, *animation_));
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
EXPECT_TRUE(IsPlaying());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), 0);
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), 0);
constexpr auto kAdvance = base::Milliseconds(50);
AdvanceClock(kAdvance);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
kAdvance / kAnimationDuration);
animation_->Stop();
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), 0.0f);
+ EXPECT_FALSE(animation_->GetCurrentProgress());
EXPECT_TRUE(IsStopped());
}
@@ -408,7 +434,9 @@ TEST_F(AnimationTest, PlaySubsectionOfLinearAnimation) {
AdvanceClock(base::Milliseconds(300));
EXPECT_FALSE(observer.animation_cycle_ended());
- animation_->StartSubsection(kStartTime, kDuration, Animation::Style::kLinear);
+ animation_->Start(Animation::PlaybackConfig(
+ {{kStartTime, kStartTime + kDuration}}, /*initial_offset=*/kStartTime,
+ /*initial_completed_cycles=*/0, Animation::Style::kLinear));
EXPECT_TRUE(IsScheduledToPlay());
EXPECT_FALSE(observer.animation_will_start_playing());
@@ -419,7 +447,8 @@ TEST_F(AnimationTest, PlaySubsectionOfLinearAnimation) {
EXPECT_TRUE(IsPlaying());
EXPECT_TRUE(observer.animation_will_start_playing());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), GetTimerStartOffset());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), GetTimerStartOffset());
EXPECT_FLOAT_EQ(GetTimerEndOffset(),
(kStartTime + kDuration) / kAnimationDuration);
@@ -431,7 +460,8 @@ TEST_F(AnimationTest, PlaySubsectionOfLinearAnimation) {
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
EXPECT_EQ(TimeDeltaSince(GetTimerPreviousTick()), base::TimeDelta());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance) / kAnimationDuration);
EXPECT_FALSE(observer.animation_cycle_ended());
@@ -442,7 +472,8 @@ TEST_F(AnimationTest, PlaySubsectionOfLinearAnimation) {
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
EXPECT_EQ(TimeDeltaSince(GetTimerPreviousTick()).InMilliseconds(), 0);
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance + kAdvance2) / kAnimationDuration);
EXPECT_FALSE(observer.animation_cycle_ended());
@@ -452,7 +483,8 @@ TEST_F(AnimationTest, PlaySubsectionOfLinearAnimation) {
AdvanceClock(kAdvanceToEnd);
EXPECT_EQ(TimeDeltaSince(GetTimerPreviousTick()), kAdvanceToEnd);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), GetTimerEndOffset());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), GetTimerEndOffset());
EXPECT_TRUE(observer.animation_cycle_ended());
EXPECT_TRUE(HasAnimationEnded());
}
@@ -465,14 +497,18 @@ TEST_F(AnimationTest, PausingLinearAnimation) {
AdvanceClock(base::Milliseconds(200));
- animation_->StartSubsection(kStartTime, kDuration, Animation::Style::kLinear);
+ animation_->Start(Animation::PlaybackConfig(
+ {{kStartTime, kStartTime + kDuration}}, /*initial_offset=*/kStartTime,
+ /*initial_completed_cycles=*/0, Animation::Style::kLinear));
+
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
constexpr auto kAdvance = base::Milliseconds(100);
AdvanceClock(kAdvance);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance) / kAnimationDuration);
AdvanceClock(kAdvance);
@@ -483,7 +519,8 @@ TEST_F(AnimationTest, PausingLinearAnimation) {
// is paused.
AdvanceClock(kAnimationDuration);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance) / kAnimationDuration);
// Resume playing the animation.
@@ -493,12 +530,14 @@ TEST_F(AnimationTest, PausingLinearAnimation) {
// There should be no progress, since we haven't advanced the clock yet.
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
EXPECT_TRUE(IsPlaying());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance) / kAnimationDuration);
AdvanceClock(kAdvance);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance * 2) / kAnimationDuration);
AdvanceClock(kDuration - kAdvance * 2 + base::Milliseconds(1));
@@ -511,7 +550,8 @@ TEST_F(AnimationTest, PlayLoopAnimation) {
AdvanceClock(base::Milliseconds(300));
EXPECT_TRUE(IsStopped());
- animation_->Start(Animation::Style::kLoop);
+ animation_->Start(Animation::PlaybackConfig::CreateWithStyle(
+ Animation::Style::kLoop, *animation_));
EXPECT_TRUE(IsScheduledToPlay());
EXPECT_FALSE(observer.animation_will_start_playing());
@@ -521,7 +561,8 @@ TEST_F(AnimationTest, PlayLoopAnimation) {
EXPECT_TRUE(IsPlaying());
EXPECT_TRUE(observer.animation_will_start_playing());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), 0);
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), 0);
EXPECT_FLOAT_EQ(GetTimerStartOffset(), 0);
EXPECT_FLOAT_EQ(GetTimerEndOffset(), 1.0f);
@@ -532,7 +573,8 @@ TEST_F(AnimationTest, PlayLoopAnimation) {
EXPECT_EQ(TimeDeltaSince(GetTimerPreviousTick()), kAdvance);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
kAdvance / kAnimationDuration);
EXPECT_EQ(TimeDeltaSince(GetTimerPreviousTick()), base::TimeDelta());
@@ -542,7 +584,7 @@ TEST_F(AnimationTest, PlayLoopAnimation) {
kAnimationDuration - kAdvance);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
EXPECT_EQ(GetTimerCycles(), 1);
- EXPECT_TRUE(std::abs(animation_->GetCurrentProgress() - 0.f) < 0.0001f);
+ EXPECT_TRUE(std::abs(*animation_->GetCurrentProgress() - 0.f) < 0.0001f);
EXPECT_TRUE(observer.animation_cycle_ended());
EXPECT_TRUE(IsPlaying());
}
@@ -556,7 +598,10 @@ TEST_F(AnimationTest, PlaySubsectionOfLoopAnimation) {
AdvanceClock(base::Milliseconds(300));
EXPECT_TRUE(IsStopped());
- animation_->StartSubsection(kStartTime, kDuration, Animation::Style::kLoop);
+ animation_->Start(Animation::PlaybackConfig(
+ {{kStartTime, kStartTime + kDuration}}, /*initial_offset=*/kStartTime,
+ /*initial_completed_cycles=*/0, Animation::Style::kLoop));
+
EXPECT_TRUE(IsScheduledToPlay());
EXPECT_FALSE(observer.animation_will_start_playing());
@@ -568,7 +613,8 @@ TEST_F(AnimationTest, PlaySubsectionOfLoopAnimation) {
EXPECT_FALSE(observer.animation_cycle_ended());
EXPECT_FLOAT_EQ(GetTimerStartOffset(), kStartTime / kAnimationDuration);
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), GetTimerStartOffset());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), GetTimerStartOffset());
EXPECT_FLOAT_EQ(GetTimerEndOffset(),
(kStartTime + kDuration) / kAnimationDuration);
@@ -581,7 +627,8 @@ TEST_F(AnimationTest, PlaySubsectionOfLoopAnimation) {
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
EXPECT_EQ(TimeDeltaSince(GetTimerPreviousTick()).InMilliseconds(), 0);
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance) / kAnimationDuration);
constexpr auto kAdvance2 = base::Milliseconds(300);
@@ -590,7 +637,8 @@ TEST_F(AnimationTest, PlaySubsectionOfLoopAnimation) {
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
EXPECT_EQ(TimeDeltaSince(GetTimerPreviousTick()).InMilliseconds(), 0);
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance + kAdvance2) / kAnimationDuration);
EXPECT_FALSE(observer.animation_cycle_ended());
@@ -602,7 +650,114 @@ TEST_F(AnimationTest, PlaySubsectionOfLoopAnimation) {
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
EXPECT_TRUE(observer.animation_cycle_ended());
EXPECT_TRUE(IsPlaying());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), GetTimerStartOffset());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), GetTimerStartOffset());
+}
+
+TEST_F(AnimationTest, PlayDifferentSubsectionsOfLoopingAnimation) {
+ constexpr auto kStartTime1 = base::Milliseconds(400);
+ constexpr auto kDuration1 = base::Milliseconds(1000);
+
+ constexpr auto kStartTime2 = base::Milliseconds(100);
+ constexpr auto kDuration2 = base::Milliseconds(500);
+
+ TestAnimationObserver observer(animation_.get());
+
+ AdvanceClock(base::Milliseconds(300));
+
+ animation_->Start(Animation::PlaybackConfig(
+ {{kStartTime1, kStartTime1 + kDuration1},
+ {kStartTime2, kStartTime2 + kDuration2}},
+ /*initial_offset=*/kStartTime1,
+ /*initial_completed_cycles=*/0, Animation::Style::kLoop));
+
+ // T: 400 ms
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ kStartTime1 / kAnimationDuration);
+
+ // T: 600 ms
+ AdvanceClock(base::Milliseconds(200));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ (kStartTime1 + base::Milliseconds(200)) / kAnimationDuration);
+
+ // T: 1399 ms (just before first cycle end)
+ AdvanceClock(base::Milliseconds(799));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(
+ *animation_->GetCurrentProgress(),
+ (kStartTime1 + kDuration1 - base::Milliseconds(1)) / kAnimationDuration);
+
+ // T: 100 ms (start of second cycle)
+ AdvanceClock(base::Milliseconds(1));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ kStartTime2 / kAnimationDuration);
+
+ // T: 300 ms
+ AdvanceClock(base::Milliseconds(200));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ (kStartTime2 + base::Milliseconds(200)) / kAnimationDuration);
+
+ // T: 599 ms (just before second cycle end)
+ AdvanceClock(base::Milliseconds(299));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(
+ *animation_->GetCurrentProgress(),
+ (kStartTime2 + kDuration2 - base::Milliseconds(1)) / kAnimationDuration);
+
+ // T: 100 ms (start of second cycle)
+ AdvanceClock(base::Milliseconds(1));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ kStartTime2 / kAnimationDuration);
+}
+
+TEST_F(AnimationTest, HandlesLargeStepsInLoopingAnimation) {
+ constexpr auto kStartTime1 = base::Milliseconds(400);
+ constexpr auto kDuration1 = base::Milliseconds(1000);
+
+ constexpr auto kStartTime2 = base::Milliseconds(100);
+ constexpr auto kDuration2 = base::Milliseconds(500);
+
+ TestAnimationObserver observer(animation_.get());
+
+ AdvanceClock(base::Milliseconds(300));
+
+ animation_->Start(Animation::PlaybackConfig(
+ {{kStartTime1, kStartTime1 + kDuration1},
+ {kStartTime2, kStartTime2 + kDuration2}},
+ /*initial_offset=*/kStartTime1,
+ /*initial_completed_cycles=*/0, Animation::Style::kLoop));
+
+ // T: 400 ms
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ kStartTime1 / kAnimationDuration);
+
+ // T: 200 ms (end of first cycle + 100 ms into second cycle)
+ AdvanceClock(kDuration1 + base::Milliseconds(100));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ (kStartTime2 + base::Milliseconds(100)) / kAnimationDuration);
+
+ // T: 300 ms (end of second cycle + 200 ms into third cycle)
+ AdvanceClock(base::Milliseconds(600));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ (kStartTime2 + base::Milliseconds(200)) / kAnimationDuration);
}
TEST_F(AnimationTest, PausingLoopAnimation) {
@@ -613,17 +768,21 @@ TEST_F(AnimationTest, PausingLoopAnimation) {
AdvanceClock(base::Milliseconds(200));
- animation_->StartSubsection(kStartTime, kDuration, Animation::Style::kLoop);
+ animation_->Start(Animation::PlaybackConfig(
+ {{kStartTime, kStartTime + kDuration}}, /*initial_offset=*/kStartTime,
+ /*initial_completed_cycles=*/0, Animation::Style::kLoop));
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
kStartTime / kAnimationDuration);
constexpr auto kAdvance = base::Milliseconds(100);
AdvanceClock(kAdvance);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance) / kAnimationDuration);
AdvanceClock(kAdvance);
@@ -634,7 +793,8 @@ TEST_F(AnimationTest, PausingLoopAnimation) {
// is paused.
AdvanceClock(kAnimationDuration);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance) / kAnimationDuration);
// Resume playing the animation.
@@ -644,18 +804,21 @@ TEST_F(AnimationTest, PausingLoopAnimation) {
// There should be no progress, since we haven't advanced the clock yet.
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
EXPECT_TRUE(IsPlaying());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance) / kAnimationDuration);
AdvanceClock(kAdvance);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance * 2) / kAnimationDuration);
EXPECT_FALSE(observer.animation_cycle_ended());
AdvanceClock(kDuration - kAdvance * 2);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), GetTimerStartOffset());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), GetTimerStartOffset());
EXPECT_TRUE(IsPlaying());
EXPECT_TRUE(observer.animation_cycle_ended());
}
@@ -665,7 +828,8 @@ TEST_F(AnimationTest, PlayThrobbingAnimation) {
AdvanceClock(base::Milliseconds(300));
- animation_->Start(Animation::Style::kThrobbing);
+ animation_->Start(Animation::PlaybackConfig::CreateWithStyle(
+ Animation::Style::kThrobbing, *animation_));
EXPECT_TRUE(IsScheduledToPlay());
EXPECT_FALSE(observer.animation_will_start_playing());
@@ -675,7 +839,8 @@ TEST_F(AnimationTest, PlayThrobbingAnimation) {
EXPECT_TRUE(IsPlaying());
EXPECT_TRUE(observer.animation_will_start_playing());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), 0);
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), 0);
EXPECT_FLOAT_EQ(GetTimerStartOffset(), 0);
EXPECT_FLOAT_EQ(GetTimerEndOffset(), 1.0f);
@@ -686,7 +851,8 @@ TEST_F(AnimationTest, PlayThrobbingAnimation) {
EXPECT_EQ(TimeDeltaSince(GetTimerPreviousTick()), kAdvance);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
kAdvance / kAnimationDuration);
EXPECT_EQ(TimeDeltaSince(GetTimerPreviousTick()), base::TimeDelta());
@@ -695,19 +861,22 @@ TEST_F(AnimationTest, PlayThrobbingAnimation) {
EXPECT_EQ(TimeDeltaSince(GetTimerPreviousTick()),
kAnimationDuration - kAdvance);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), 1.0f);
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), 1.0f);
EXPECT_TRUE(IsPlaying());
EXPECT_FALSE(observer.animation_cycle_ended());
AdvanceClock(kAnimationDuration / 2);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), 0.5f);
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), 0.5f);
EXPECT_TRUE(IsPlaying());
EXPECT_FALSE(observer.animation_cycle_ended());
AdvanceClock(kAnimationDuration / 2);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), 0);
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), 0);
EXPECT_TRUE(IsPlaying());
EXPECT_TRUE(observer.animation_cycle_ended());
}
@@ -720,8 +889,9 @@ TEST_F(AnimationTest, PlaySubsectionOfThrobbingAnimation) {
AdvanceClock(base::Milliseconds(300));
- animation_->StartSubsection(kStartTime, kDuration,
- Animation::Style::kThrobbing);
+ animation_->Start(Animation::PlaybackConfig(
+ {{kStartTime, kStartTime + kDuration}}, /*initial_offset=*/kStartTime,
+ /*initial_completed_cycles=*/0, Animation::Style::kThrobbing));
EXPECT_TRUE(IsScheduledToPlay());
EXPECT_FALSE(observer.animation_will_start_playing());
@@ -732,7 +902,8 @@ TEST_F(AnimationTest, PlaySubsectionOfThrobbingAnimation) {
EXPECT_TRUE(observer.animation_will_start_playing());
EXPECT_FLOAT_EQ(GetTimerStartOffset(), kStartTime / kAnimationDuration);
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), GetTimerStartOffset());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), GetTimerStartOffset());
EXPECT_FLOAT_EQ(GetTimerEndOffset(),
(kStartTime + kDuration) / kAnimationDuration);
@@ -745,7 +916,8 @@ TEST_F(AnimationTest, PlaySubsectionOfThrobbingAnimation) {
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
EXPECT_FALSE(observer.animation_cycle_ended());
EXPECT_EQ(TimeDeltaSince(GetTimerPreviousTick()).InMilliseconds(), 0);
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance) / kAnimationDuration);
constexpr auto kAdvance2 = base::Milliseconds(300);
@@ -755,7 +927,8 @@ TEST_F(AnimationTest, PlaySubsectionOfThrobbingAnimation) {
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
EXPECT_FALSE(observer.animation_cycle_ended());
EXPECT_EQ(TimeDeltaSince(GetTimerPreviousTick()), base::TimeDelta());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance + kAdvance2) / kAnimationDuration);
// Reach the end of animation.
@@ -765,20 +938,23 @@ TEST_F(AnimationTest, PlaySubsectionOfThrobbingAnimation) {
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
EXPECT_TRUE(IsPlaying());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), GetTimerEndOffset());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), GetTimerEndOffset());
EXPECT_FALSE(observer.animation_cycle_ended());
constexpr auto kAdvance3 = base::Milliseconds(500);
AdvanceClock(kAdvance3);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kDuration - kAdvance3) / kAnimationDuration);
EXPECT_TRUE(IsPlaying());
EXPECT_FALSE(observer.animation_cycle_ended());
AdvanceClock(kDuration - kAdvance3);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), GetTimerStartOffset());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), GetTimerStartOffset());
EXPECT_TRUE(IsPlaying());
EXPECT_TRUE(observer.animation_cycle_ended());
@@ -786,31 +962,149 @@ TEST_F(AnimationTest, PlaySubsectionOfThrobbingAnimation) {
AdvanceClock(kAdvance);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance) / kAnimationDuration);
EXPECT_TRUE(IsPlaying());
}
+TEST_F(AnimationTest, PlayDifferentSubsectionsOfThrobbingAnimation) {
+ constexpr auto kStartTime1 = base::Milliseconds(400);
+ constexpr auto kDuration1 = base::Milliseconds(1000);
+
+ constexpr auto kStartTime2 = base::Milliseconds(100);
+ constexpr auto kDuration2 = base::Milliseconds(500);
+
+ TestAnimationObserver observer(animation_.get());
+
+ AdvanceClock(base::Milliseconds(300));
+
+ animation_->Start(Animation::PlaybackConfig(
+ {{kStartTime1, kStartTime1 + kDuration1},
+ {kStartTime2, kStartTime2 + kDuration2}},
+ /*initial_offset=*/kStartTime1,
+ /*initial_completed_cycles=*/0, Animation::Style::kThrobbing));
+
+ // T: 400 ms
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ kStartTime1 / kAnimationDuration);
+
+ // T: 600 ms
+ AdvanceClock(base::Milliseconds(200));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ (kStartTime1 + base::Milliseconds(200)) / kAnimationDuration);
+
+ // T: 1399 ms (just before first cycle end)
+ AdvanceClock(base::Milliseconds(799));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(
+ *animation_->GetCurrentProgress(),
+ (kStartTime1 + kDuration1 - base::Milliseconds(1)) / kAnimationDuration);
+
+ // T: 600 ms (end of second cycle, reversed)
+ AdvanceClock(base::Milliseconds(1));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ (kStartTime2 + kDuration2) / kAnimationDuration);
+
+ // T: 400 ms
+ AdvanceClock(base::Milliseconds(200));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ (kStartTime2 + kDuration2 - base::Milliseconds(200)) /
+ kAnimationDuration);
+
+ // T: 101 ms (just after start of second cycle start)
+ AdvanceClock(base::Milliseconds(299));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ (kStartTime2 + base::Milliseconds(1)) / kAnimationDuration);
+
+ // T: 100 ms (start of second cycle)
+ AdvanceClock(base::Milliseconds(1));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ kStartTime2 / kAnimationDuration);
+
+ // T: 300 ms (going forward)
+ AdvanceClock(base::Milliseconds(200));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ (kStartTime2 + base::Milliseconds(200)) / kAnimationDuration);
+}
+
+TEST_F(AnimationTest, HandlesLargeStepsInThrobbingAnimation) {
+ constexpr auto kStartTime1 = base::Milliseconds(400);
+ constexpr auto kDuration1 = base::Milliseconds(1000);
+
+ constexpr auto kStartTime2 = base::Milliseconds(100);
+ constexpr auto kDuration2 = base::Milliseconds(500);
+
+ TestAnimationObserver observer(animation_.get());
+
+ AdvanceClock(base::Milliseconds(300));
+
+ animation_->Start(Animation::PlaybackConfig(
+ {{kStartTime1, kStartTime1 + kDuration1},
+ {kStartTime2, kStartTime2 + kDuration2}},
+ /*initial_offset=*/kStartTime1,
+ /*initial_completed_cycles=*/0, Animation::Style::kThrobbing));
+
+ // T: 400 ms
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ kStartTime1 / kAnimationDuration);
+
+ // T: 500 ms (end of first cycle + 100 ms into second cycle)
+ AdvanceClock(kDuration1 + base::Milliseconds(100));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ (kStartTime2 + kDuration2 - base::Milliseconds(100)) /
+ kAnimationDuration);
+
+ // T: 300 ms (end of second cycle + 200 ms into third cycle)
+ AdvanceClock(base::Milliseconds(600));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ (kStartTime2 + base::Milliseconds(200)) / kAnimationDuration);
+}
+
TEST_F(AnimationTest, PausingThrobbingAnimation) {
constexpr auto kStartTime = base::Milliseconds(400);
constexpr auto kDuration = base::Milliseconds(1000);
AdvanceClock(base::Milliseconds(200));
- animation_->StartSubsection(kStartTime, kDuration,
- Animation::Style::kThrobbing);
+ animation_->Start(Animation::PlaybackConfig(
+ {{kStartTime, kStartTime + kDuration}}, /*initial_offset=*/kStartTime,
+ /*initial_completed_cycles=*/0, Animation::Style::kThrobbing));
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
EXPECT_TRUE(IsPlaying());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
kStartTime / kAnimationDuration);
constexpr auto kAdvance = base::Milliseconds(100);
AdvanceClock(kAdvance);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance) / kAnimationDuration);
AdvanceClock(kAdvance);
@@ -821,7 +1115,8 @@ TEST_F(AnimationTest, PausingThrobbingAnimation) {
// is paused.
AdvanceClock(kAnimationDuration);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance) / kAnimationDuration);
// Resume playing the animation.
@@ -831,22 +1126,26 @@ TEST_F(AnimationTest, PausingThrobbingAnimation) {
// There should be no progress, since we haven't advanced the clock yet.
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
EXPECT_TRUE(IsPlaying());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance) / kAnimationDuration);
AdvanceClock(kAdvance);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance * 2) / kAnimationDuration);
AdvanceClock(kDuration - kAdvance * 2);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), GetTimerEndOffset());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), GetTimerEndOffset());
EXPECT_TRUE(IsPlaying());
AdvanceClock(kAdvance);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kDuration - kAdvance) / kAnimationDuration);
EXPECT_TRUE(IsPlaying());
@@ -855,7 +1154,8 @@ TEST_F(AnimationTest, PausingThrobbingAnimation) {
AdvanceClock(kAnimationDuration * 2);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kDuration - kAdvance) / kAnimationDuration);
// Resume playing the animation.
@@ -869,16 +1169,18 @@ TEST_F(AnimationTest, PausingThrobbingAnimation) {
AdvanceClock(kAdvance2);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
EXPECT_FLOAT_EQ(
- animation_->GetCurrentProgress(),
+ *animation_->GetCurrentProgress(),
(kStartTime + kDuration - kAdvance - kAdvance2) / kAnimationDuration);
AdvanceClock(kDuration - kAdvance - kAdvance2);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), GetTimerStartOffset());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), GetTimerStartOffset());
AdvanceClock(kAdvance);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
(kStartTime + kAdvance) / kAnimationDuration);
EXPECT_TRUE(IsPlaying());
}
@@ -892,12 +1194,15 @@ TEST_F(AnimationTest, PauseBeforePlay) {
animation_->Start();
EXPECT_TRUE(IsScheduledToPlay());
+ EXPECT_FALSE(animation_->GetCurrentProgress());
animation_->Pause();
EXPECT_TRUE(IsPaused());
-
+ EXPECT_FALSE(animation_->GetCurrentProgress());
AdvanceClock(base::Milliseconds(100));
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), GetTimerStartOffset());
animation_->ResumePlaying();
EXPECT_TRUE(IsScheduledToResume());
@@ -905,11 +1210,14 @@ TEST_F(AnimationTest, PauseBeforePlay) {
AdvanceClock(base::Milliseconds(100));
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
EXPECT_TRUE(IsPlaying());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), GetTimerStartOffset());
constexpr auto kAdvance = base::Milliseconds(100);
AdvanceClock(kAdvance);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
kAdvance / kAnimationDuration);
}
@@ -918,7 +1226,8 @@ TEST_F(AnimationTest, PaintTest) {
AdvanceClock(base::Milliseconds(300));
- animation_->Start(Animation::Style::kLinear);
+ animation_->Start(Animation::PlaybackConfig::CreateWithStyle(
+ Animation::Style::kLinear, *animation_));
animation_->Paint(&canvas, NowTicks(), animation_->GetOriginalSize());
AdvanceClock(base::Milliseconds(50));
@@ -942,40 +1251,81 @@ TEST_F(AnimationTest, PaintTest) {
IsAllSameColor(SK_ColorBLUE, canvas.GetBitmap());
}
+TEST_F(AnimationTest, NotifiesObserverFramePainted) {
+ TestAnimationObserver observer(animation_.get());
+
+ AdvanceClock(base::Milliseconds(300));
+
+ animation_->Start(Animation::PlaybackConfig::CreateWithStyle(
+ Animation::Style::kLoop, *animation_));
+
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(observer.last_frame_painted());
+ EXPECT_EQ(*observer.last_frame_painted(), 0.f);
+
+ AdvanceClock(kAnimationDuration / 4);
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(observer.last_frame_painted());
+ EXPECT_FLOAT_EQ(*observer.last_frame_painted(), 0.25f);
+
+ AdvanceClock(kAnimationDuration / 4);
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(observer.last_frame_painted());
+ EXPECT_FLOAT_EQ(*observer.last_frame_painted(), 0.5f);
+
+ AdvanceClock(kAnimationDuration / 2 - base::Milliseconds(1));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(observer.last_frame_painted());
+ EXPECT_NEAR(*observer.last_frame_painted(), 1.f, 1E-3);
+
+ AdvanceClock(base::Milliseconds(2));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(observer.last_frame_painted());
+ EXPECT_FLOAT_EQ(*observer.last_frame_painted(),
+ base::Milliseconds(1) / kAnimationDuration);
+}
+
TEST_F(AnimationTest, SetsPlaybackSpeed) {
TestAnimationObserver observer(animation_.get());
AdvanceClock(base::Milliseconds(300));
animation_->SetPlaybackSpeed(2);
- animation_->Start(Animation::Style::kLinear);
+ animation_->Start(Animation::PlaybackConfig::CreateWithStyle(
+ Animation::Style::kLinear, *animation_));
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), 0);
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), 0);
AdvanceClock(kAnimationDuration / 8);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), 1.f / 4);
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), 1.f / 4);
AdvanceClock(kAnimationDuration / 8);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), 1.f / 2);
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), 1.f / 2);
animation_->SetPlaybackSpeed(0.5f);
AdvanceClock(kAnimationDuration / 4);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), (1.f / 2) + (1.f / 8));
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), (1.f / 2) + (1.f / 8));
AdvanceClock(kAnimationDuration / 4);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), 3.f / 4);
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), 3.f / 4);
}
TEST_F(AnimationWithImageAssetsTest, PaintsAnimationImagesToCanvas) {
AdvanceClock(base::Milliseconds(300));
- animation_->Start(Animation::Style::kLoop);
+ animation_->Start(Animation::PlaybackConfig::CreateWithStyle(
+ Animation::Style::kLoop, *animation_));
TestSkottieFrameDataProvider::ImageAssetImpl* asset_0 =
frame_data_provider_.GetLoadedImageAsset("image_0");
@@ -1020,7 +1370,8 @@ TEST_F(AnimationWithImageAssetsTest, PaintsAnimationImagesToCanvas) {
TEST_F(AnimationWithImageAssetsTest, GracefullyHandlesNullImages) {
AdvanceClock(base::Milliseconds(300));
- animation_->Start(Animation::Style::kLoop);
+ animation_->Start(Animation::PlaybackConfig::CreateWithStyle(
+ Animation::Style::kLoop, *animation_));
display_list_->StartPaint();
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
@@ -1040,7 +1391,8 @@ TEST_F(AnimationWithImageAssetsTest, GracefullyHandlesNullImages) {
TEST_F(AnimationWithImageAssetsTest, LoadsCorrectFrameTimestamp) {
AdvanceClock(base::Milliseconds(300));
- animation_->Start(Animation::Style::kLoop);
+ animation_->Start(Animation::PlaybackConfig::CreateWithStyle(
+ Animation::Style::kLoop, *animation_));
asset_0_->set_current_frame_data(CreateHighQualityTestFrameData());
asset_1_->set_current_frame_data(CreateHighQualityTestFrameData());
@@ -1087,7 +1439,8 @@ TEST_F(AnimationWithImageAssetsTest, LoadsCorrectFrameTimestamp) {
TEST_F(AnimationWithImageAssetsTest, LoadsCorrectImageScale) {
AdvanceClock(base::Milliseconds(300));
- animation_->Start(Animation::Style::kLoop);
+ animation_->Start(Animation::PlaybackConfig::CreateWithStyle(
+ Animation::Style::kLoop, *animation_));
asset_0_->set_current_frame_data(CreateHighQualityTestFrameData());
@@ -1103,19 +1456,22 @@ TEST_F(AnimationWithImageAssetsTest, LoadsCorrectImageScale) {
TEST_F(AnimationTest, HandlesTimeStepGreaterThanAnimationDuration) {
AdvanceClock(base::Milliseconds(300));
- animation_->Start(Animation::Style::kLoop);
+ animation_->Start(Animation::PlaybackConfig::CreateWithStyle(
+ Animation::Style::kLoop, *animation_));
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- ASSERT_FLOAT_EQ(animation_->GetCurrentProgress(), 0);
+ ASSERT_FLOAT_EQ(*animation_->GetCurrentProgress(), 0);
AdvanceClock(kAnimationDuration / 2);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), 0.5f);
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), 0.5f);
AdvanceClock(kAnimationDuration * 5);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), 0.5f);
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), 0.5f);
}
class AnimationRestarter : public AnimationObserver {
@@ -1129,7 +1485,8 @@ class AnimationRestarter : public AnimationObserver {
void AnimationCycleEnded(const Animation* animation) override {
animation_->Stop();
- animation_->Start(Animation::Style::kLinear);
+ animation_->Start(Animation::PlaybackConfig::CreateWithStyle(
+ Animation::Style::kLinear, *animation_));
}
private:
@@ -1142,7 +1499,8 @@ TEST_F(AnimationTest, HandlesChangingAnimationStateWithinObserverCall) {
AdvanceClock(base::Milliseconds(300));
- animation_->Start(Animation::Style::kLinear);
+ animation_->Start(Animation::PlaybackConfig::CreateWithStyle(
+ Animation::Style::kLinear, *animation_));
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
// Advance the clock to the end of the animation.
@@ -1155,12 +1513,215 @@ TEST_F(AnimationTest, HandlesChangingAnimationStateWithinObserverCall) {
constexpr auto kAdvance = base::Milliseconds(50);
AdvanceClock(kAdvance);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(), 0.f);
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(), 0.f);
AdvanceClock(kAdvance);
animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
- EXPECT_FLOAT_EQ(animation_->GetCurrentProgress(),
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
kAdvance / kAnimationDuration);
}
+TEST_F(AnimationTest, NotifiesAnimationIsDeleting) {
+ TestAnimationObserver observer_1(animation_.get());
+ TestAnimationObserver observer_2(animation_.get());
+ ASSERT_FALSE(observer_1.animation_is_deleted());
+ ASSERT_FALSE(observer_2.animation_is_deleted());
+ animation_.reset();
+ EXPECT_TRUE(observer_1.animation_is_deleted());
+ EXPECT_TRUE(observer_2.animation_is_deleted());
+}
+
+TEST_F(AnimationTest, GetPlaybackConfig) {
+ EXPECT_FALSE(animation_->GetPlaybackConfig());
+ Animation::PlaybackConfig test_config(
+ {{/*start_offset=*/kAnimationDuration / 4,
+ /*end_offset=*/kAnimationDuration * 3 / 4}},
+ /*initial_offset=*/kAnimationDuration / 2,
+ /*initial_completed_cycles=*/2, Animation::Style::kThrobbing);
+ animation_->Start(test_config);
+ ASSERT_TRUE(animation_->GetPlaybackConfig());
+ EXPECT_THAT(
+ *animation_->GetPlaybackConfig(),
+ FieldsAre(ElementsAre(
+ FieldsAre(test_config.scheduled_cycles.front().start_offset,
+ test_config.scheduled_cycles.front().end_offset)),
+ test_config.initial_offset,
+ test_config.initial_completed_cycles, test_config.style));
+ animation_->Stop();
+ EXPECT_FALSE(animation_->GetPlaybackConfig());
+ test_config.scheduled_cycles.front().start_offset = kAnimationDuration / 2;
+ test_config.style = Animation::Style::kLoop;
+ animation_->Start(test_config);
+ ASSERT_TRUE(animation_->GetPlaybackConfig());
+ EXPECT_THAT(
+ *animation_->GetPlaybackConfig(),
+ FieldsAre(ElementsAre(
+ FieldsAre(test_config.scheduled_cycles.front().start_offset,
+ test_config.scheduled_cycles.front().end_offset)),
+ test_config.initial_offset,
+ test_config.initial_completed_cycles, test_config.style));
+}
+
+TEST_F(AnimationTest, GetNumCompletedCycles) {
+ EXPECT_FALSE(animation_->GetNumCompletedCycles());
+ animation_->Start(Animation::PlaybackConfig::CreateDefault(*animation_));
+
+ ASSERT_TRUE(animation_->GetNumCompletedCycles());
+ EXPECT_THAT(*animation_->GetNumCompletedCycles(), Eq(0));
+
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetNumCompletedCycles());
+ EXPECT_THAT(*animation_->GetNumCompletedCycles(), Eq(0));
+
+ AdvanceClock(kAnimationDuration / 2);
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetNumCompletedCycles());
+ EXPECT_THAT(*animation_->GetNumCompletedCycles(), Eq(0));
+
+ AdvanceClock(kAnimationDuration / 2);
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetNumCompletedCycles());
+ EXPECT_THAT(*animation_->GetNumCompletedCycles(), Eq(1));
+
+ AdvanceClock(kAnimationDuration);
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetNumCompletedCycles());
+ EXPECT_THAT(*animation_->GetNumCompletedCycles(), Eq(2));
+
+ animation_->Stop();
+ EXPECT_FALSE(animation_->GetNumCompletedCycles());
+}
+
+TEST_F(AnimationTest, GetNumCompletedCyclesLinear) {
+ animation_->Start(Animation::PlaybackConfig::CreateWithStyle(
+ Animation::Style::kLinear, *animation_));
+
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetNumCompletedCycles());
+ EXPECT_THAT(*animation_->GetNumCompletedCycles(), Eq(0));
+
+ AdvanceClock(kAnimationDuration / 2);
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetNumCompletedCycles());
+ EXPECT_THAT(*animation_->GetNumCompletedCycles(), Eq(0));
+
+ AdvanceClock(kAnimationDuration / 2);
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetNumCompletedCycles());
+ EXPECT_THAT(*animation_->GetNumCompletedCycles(), Eq(1));
+
+ AdvanceClock(kAnimationDuration);
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetNumCompletedCycles());
+ EXPECT_THAT(*animation_->GetNumCompletedCycles(), Eq(1));
+}
+
+TEST_F(AnimationTest, StartsAtArbitraryInitialTimestamp) {
+ constexpr auto kStartTime = base::Milliseconds(400);
+ constexpr auto kDuration = base::Milliseconds(1000);
+
+ AdvanceClock(base::Milliseconds(300));
+
+ animation_->Start(Animation::PlaybackConfig(
+ {{kStartTime, kStartTime + kDuration}},
+ /*initial_offset=*/kStartTime + base::Milliseconds(100),
+ /*initial_completed_cycles=*/0, Animation::Style::kThrobbing));
+
+ // T: 500 ms
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ (kStartTime + base::Milliseconds(100)) / kAnimationDuration);
+
+ // T: 600 ms
+ AdvanceClock(base::Milliseconds(100));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ (kStartTime + base::Milliseconds(200)) / kAnimationDuration);
+
+ animation_->Stop();
+
+ // The animation has 1 completed cycle, so for a throbbing animation, it
+ // should immediately start playing in reverse.
+ animation_->Start(Animation::PlaybackConfig(
+ {{kStartTime, kStartTime + kDuration}},
+ /*initial_offset=*/kStartTime + base::Milliseconds(500),
+ /*initial_completed_cycles=*/1, Animation::Style::kThrobbing));
+
+ // T: 900 ms
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ (kStartTime + base::Milliseconds(500)) / kAnimationDuration);
+
+ // T: 800 ms
+ AdvanceClock(base::Milliseconds(100));
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_FLOAT_EQ(*animation_->GetCurrentProgress(),
+ (kStartTime + base::Milliseconds(400)) / kAnimationDuration);
+}
+
+TEST_F(AnimationTest, GetCurrentCycleBoundaries) {
+ constexpr auto kStartTime1 = base::Milliseconds(400);
+ constexpr auto kEndTime1 = base::Milliseconds(800);
+ constexpr auto kDuration1 = kEndTime1 - kStartTime1;
+
+ constexpr auto kStartTime2 = base::Milliseconds(100);
+ constexpr auto kEndTime2 = base::Milliseconds(500);
+ constexpr auto kDuration2 = kEndTime2 - kStartTime2;
+
+ TestAnimationObserver observer(animation_.get());
+
+ AdvanceClock(base::Milliseconds(300));
+
+ EXPECT_FALSE(animation_->GetCurrentCycleBoundaries());
+ animation_->Start(Animation::PlaybackConfig(
+ {{kStartTime1, kEndTime1}, {kStartTime2, kEndTime2}},
+ /*initial_offset=*/kStartTime1,
+ /*initial_completed_cycles=*/0, Animation::Style::kLoop));
+
+ // No frames have been painted yet.
+ EXPECT_FALSE(animation_->GetCurrentCycleBoundaries());
+
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentCycleBoundaries());
+ EXPECT_THAT(*animation_->GetCurrentCycleBoundaries(),
+ FieldsAre(kStartTime1, kEndTime1));
+
+ // T: 1/2 of first cycle
+ AdvanceClock(kDuration1 / 2);
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_THAT(*animation_->GetCurrentCycleBoundaries(),
+ FieldsAre(kStartTime1, kEndTime1));
+
+ // T: Start of first cycle
+ AdvanceClock(kDuration1 / 2);
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_THAT(*animation_->GetCurrentCycleBoundaries(),
+ FieldsAre(kStartTime2, kEndTime2));
+
+ // T: Middle of second cycle
+ AdvanceClock(kDuration2 / 2);
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_THAT(*animation_->GetCurrentCycleBoundaries(),
+ FieldsAre(kStartTime2, kEndTime2));
+
+ // T: Middle of second cycle (again)
+ AdvanceClock(kDuration2);
+ animation_->Paint(canvas(), NowTicks(), animation_->GetOriginalSize());
+ ASSERT_TRUE(animation_->GetCurrentProgress());
+ EXPECT_THAT(*animation_->GetCurrentCycleBoundaries(),
+ FieldsAre(kStartTime2, kEndTime2));
+
+ animation_->Stop();
+ EXPECT_FALSE(animation_->GetCurrentCycleBoundaries());
+}
+
} // namespace lottie
diff --git a/chromium/ui/message_center/BUILD.gn b/chromium/ui/message_center/BUILD.gn
index f0722d1a5e5..7610a36ef7a 100644
--- a/chromium/ui/message_center/BUILD.gn
+++ b/chromium/ui/message_center/BUILD.gn
@@ -235,10 +235,11 @@ if (enable_message_center) {
}
if (is_fuchsia) {
- use_cfv2 = false
+ use_cfv1 = false
additional_manifest_fragments = [
- "//build/config/fuchsia/test/font_capabilities.test-cmx",
- "//build/config/fuchsia/test/present_view_capabilities.test-cmx",
+ "//build/config/fuchsia/test/fonts.shard.test-cml",
+ "//build/config/fuchsia/test/present_view.shard.test-cml",
+ "//third_party/fuchsia-sdk/sdk/pkg/vulkan/client.shard.cml",
]
}
}
diff --git a/chromium/ui/message_center/message_center_impl.cc b/chromium/ui/message_center/message_center_impl.cc
index bb02c853f62..27ee46fbcf2 100644
--- a/chromium/ui/message_center/message_center_impl.cc
+++ b/chromium/ui/message_center/message_center_impl.cc
@@ -160,33 +160,22 @@ Notification* MessageCenterImpl::FindNotificationById(const std::string& id) {
Notification* MessageCenterImpl::FindParentNotification(
Notification* notification) {
// For a notification to have a parent notification, they must have identical
- // origin urls and profile_ids. To make sure that the notifications come from
- // the same website for the same user. If either fields are empty there can
- // not be a parent notification. Also make sure to only group notifications
- // from web pages.
+ // notifier_ids. To make sure that the notifications come from
+ // the same website for the same user. Also make sure to only group
+ // notifications from web pages with valid origin urls.
if (notification->origin_url().is_empty() ||
- notification->notifier_id().profile_id.empty() ||
notification->notifier_id().type != NotifierType::WEB_PAGE) {
return nullptr;
}
NotificationList::Notifications notifications =
- notification_list_->GetNotificationsByOriginUrl(
- notification->origin_url());
-
- std::string account_id = notification->notifier_id().profile_id;
- auto account_match = [&account_id](Notification* notification) {
- return account_id == notification->notifier_id().profile_id;
- };
+ notification_list_->GetNotificationsByNotifierId(
+ notification->notifier_id());
// `notifications` keeps notifications ordered with the most recent one in the
- // front. We do a lookup starting with the oldest notification to find the
- // parent notification.
- auto parent_notification =
- std::find_if(notifications.rbegin(), notifications.rend(), account_match);
-
- return parent_notification == notifications.rend() ? nullptr
- : *parent_notification;
+ // front. If we have notifications for this notifier_id we return the last
+ // notification..
+ return notifications.size() ? *notifications.rbegin() : nullptr;
}
Notification* MessageCenterImpl::FindPopupNotificationById(
diff --git a/chromium/ui/message_center/public/cpp/notification.h b/chromium/ui/message_center/public/cpp/notification.h
index 249a7777dc2..9e9ebd4d999 100644
--- a/chromium/ui/message_center/public/cpp/notification.h
+++ b/chromium/ui/message_center/public/cpp/notification.h
@@ -185,6 +185,12 @@ class MESSAGE_CENTER_PUBLIC_EXPORT RichNotificationData {
// SystemNotificationWarningLevel should be used.
absl::optional<SkColor> accent_color;
+ // Similar to `accent_color`, but store a ColorId instead of SkColor so that
+ // the notification view can use this id to correctly handle theme change. In
+ // CrOS notification, if `accent_color_id` is provided, `accent_color` will
+ // not be used.
+ absl::optional<ui::ColorId> accent_color_id;
+
// Controls whether a settings button should appear on the notification. See
// enum definition. TODO(estade): turn this into a boolean. See
// crbug.com/780342
@@ -441,6 +447,13 @@ class MESSAGE_CENTER_PUBLIC_EXPORT Notification {
optional_fields_.accent_color = accent_color;
}
+ absl::optional<ui::ColorId> accent_color_id() const {
+ return optional_fields_.accent_color_id;
+ }
+ void set_accent_color_id(ui::ColorId accent_color_id) {
+ optional_fields_.accent_color_id = accent_color_id;
+ }
+
bool should_show_settings_button() const {
return optional_fields_.settings_button_handler !=
SettingsButtonHandler::NONE;
diff --git a/chromium/ui/message_center/public/cpp/notification_types.h b/chromium/ui/message_center/public/cpp/notification_types.h
index f5497e41c6d..fc9215111d6 100644
--- a/chromium/ui/message_center/public/cpp/notification_types.h
+++ b/chromium/ui/message_center/public/cpp/notification_types.h
@@ -11,7 +11,8 @@ namespace message_center {
// recoded in a histogram, updates should not change the entries' values.
enum NotificationType {
NOTIFICATION_TYPE_SIMPLE = 0,
- NOTIFICATION_TYPE_BASE_FORMAT = 1,
+ DEPRECATED_NOTIFICATION_TYPE_BASE_FORMAT =
+ 1, // Use NOTIFICATION_TYPE_SIMPLE instead.
NOTIFICATION_TYPE_IMAGE = 2,
NOTIFICATION_TYPE_MULTIPLE = 3,
NOTIFICATION_TYPE_PROGRESS = 4, // Notification with progress bar.
diff --git a/chromium/ui/message_center/public/cpp/notifier_id.cc b/chromium/ui/message_center/public/cpp/notifier_id.cc
index 81823ab1bf5..f70905796c4 100644
--- a/chromium/ui/message_center/public/cpp/notifier_id.cc
+++ b/chromium/ui/message_center/public/cpp/notifier_id.cc
@@ -9,7 +9,13 @@
namespace message_center {
+#if BUILDFLAG(IS_CHROMEOS)
+NotifierId::NotifierId()
+ : type(NotifierType::SYSTEM_COMPONENT),
+ catalog_name(ash::NotificationCatalogName::kNone) {}
+#else
NotifierId::NotifierId() : type(NotifierType::SYSTEM_COMPONENT) {}
+#endif // IS_CHROMEOS
#if BUILDFLAG(IS_CHROMEOS_ASH)
NotifierId::NotifierId(NotifierType type,
@@ -51,6 +57,13 @@ bool NotifierId::operator==(const NotifierId& other) const {
if (type == NotifierType::WEB_PAGE)
return url == other.url;
+#if BUILDFLAG(IS_CHROMEOS)
+ if (type == NotifierType::SYSTEM_COMPONENT &&
+ catalog_name != other.catalog_name) {
+ return false;
+ }
+#endif
+
return id == other.id;
}
diff --git a/chromium/ui/message_center/public/cpp/notifier_id.h b/chromium/ui/message_center/public/cpp/notifier_id.h
index 9ef65ce782e..2a646e800e6 100644
--- a/chromium/ui/message_center/public/cpp/notifier_id.h
+++ b/chromium/ui/message_center/public/cpp/notifier_id.h
@@ -15,7 +15,7 @@
#include "ui/message_center/public/cpp/message_center_public_export.h"
#include "url/gurl.h"
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
#include "ash/constants/notifier_catalogs.h"
#endif
@@ -70,7 +70,7 @@ struct MESSAGE_CENTER_PUBLIC_EXPORT NotifierId {
// The identifier of the app notifier. Empty if it's WEB_PAGE.
std::string id;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
// Identifier for CrOS system notifications.
ash::NotificationCatalogName catalog_name;
#endif
diff --git a/chromium/ui/message_center/views/message_popup_collection_unittest.cc b/chromium/ui/message_center/views/message_popup_collection_unittest.cc
index 5791c395908..0f0346c45c1 100644
--- a/chromium/ui/message_center/views/message_popup_collection_unittest.cc
+++ b/chromium/ui/message_center/views/message_popup_collection_unittest.cc
@@ -249,10 +249,9 @@ class MessagePopupCollectionTest : public views::ViewsTestBase,
std::unique_ptr<Notification> CreateNotification(const std::string& id,
const std::string& title) {
return std::make_unique<Notification>(
- NOTIFICATION_TYPE_BASE_FORMAT, id, base::UTF8ToUTF16(title),
- u"test message", ui::ImageModel(),
- std::u16string() /* display_source */, GURL(), NotifierId(),
- RichNotificationData(), new NotificationDelegate());
+ NOTIFICATION_TYPE_SIMPLE, id, base::UTF8ToUTF16(title), u"test message",
+ ui::ImageModel(), std::u16string() /* display_source */, GURL(),
+ NotifierId(), RichNotificationData(), new NotificationDelegate());
}
std::string AddNotification() {
diff --git a/chromium/ui/message_center/views/message_view.cc b/chromium/ui/message_center/views/message_view.cc
index e898b03bb90..713f241c2fa 100644
--- a/chromium/ui/message_center/views/message_view.cc
+++ b/chromium/ui/message_center/views/message_view.cc
@@ -95,6 +95,7 @@ SkPath MessageView::HighlightPathGenerator::GetHighlightPath(
MessageView::MessageView(const Notification& notification)
: notification_id_(notification.id()),
notifier_id_(notification.notifier_id()),
+ timestamp_(notification.timestamp()),
slide_out_controller_(this, this) {
SetFocusBehavior(FocusBehavior::ALWAYS);
views::FocusRing::Install(this);
diff --git a/chromium/ui/message_center/views/message_view.h b/chromium/ui/message_center/views/message_view.h
index f45246f7d63..5f802e8728a 100644
--- a/chromium/ui/message_center/views/message_view.h
+++ b/chromium/ui/message_center/views/message_view.h
@@ -200,6 +200,10 @@ class MESSAGE_CENTER_EXPORT MessageView
NotifierId notifier_id() const { return notifier_id_; }
+ base::Time timestamp() const { return timestamp_; }
+
+ bool pinned() const { return pinned_; }
+
bool is_active() const { return is_active_; }
void set_parent_message_view(MessageView* parent_message_view) {
@@ -260,6 +264,7 @@ class MESSAGE_CENTER_EXPORT MessageView
std::string notification_id_;
std::u16string accessible_name_;
const NotifierId notifier_id_;
+ base::Time timestamp_;
// Tracks whether background should be drawn as active based on gesture
// events.
diff --git a/chromium/ui/message_center/views/notification_header_view.cc b/chromium/ui/message_center/views/notification_header_view.cc
index 40de6f84887..0f7fd0c19e2 100644
--- a/chromium/ui/message_center/views/notification_header_view.cc
+++ b/chromium/ui/message_center/views/notification_header_view.cc
@@ -276,20 +276,20 @@ void NotificationHeaderView::SetProgress(int progress) {
summary_text_view_->SetText(l10n_util::GetStringFUTF16Int(
IDS_MESSAGE_CENTER_NOTIFICATION_PROGRESS_PERCENTAGE, progress));
has_progress_ = true;
- UpdateSummaryTextVisibility();
+ UpdateSummaryTextAndTimestampVisibility();
}
void NotificationHeaderView::SetSummaryText(const std::u16string& text) {
summary_text_view_->SetText(text);
has_progress_ = false;
- UpdateSummaryTextVisibility();
+ UpdateSummaryTextAndTimestampVisibility();
}
void NotificationHeaderView::SetOverflowIndicator(int count) {
summary_text_view_->SetText(l10n_util::GetStringFUTF16Int(
IDS_MESSAGE_CENTER_LIST_NOTIFICATION_HEADER_OVERFLOW_INDICATOR, count));
has_progress_ = false;
- UpdateSummaryTextVisibility();
+ UpdateSummaryTextAndTimestampVisibility();
}
void NotificationHeaderView::GetAccessibleNodeData(ui::AXNodeData* node_data) {
@@ -317,7 +317,7 @@ void NotificationHeaderView::SetTimestamp(base::Time timestamp) {
timestamp_view_->SetText(relative_time);
timestamp_ = timestamp;
- UpdateSummaryTextVisibility();
+ UpdateSummaryTextAndTimestampVisibility();
// Unretained is safe as the timer cancels the task on destruction.
timestamp_update_timer_.Start(
@@ -334,7 +334,7 @@ void NotificationHeaderView::SetDetailViewsVisible(bool visible) {
else
timestamp_update_timer_.Stop();
- UpdateSummaryTextVisibility();
+ UpdateSummaryTextAndTimestampVisibility();
}
void NotificationHeaderView::SetExpandButtonEnabled(bool enabled) {
@@ -381,7 +381,7 @@ void NotificationHeaderView::SetAppIconVisible(bool visible) {
}
void NotificationHeaderView::SetTimestampVisible(bool visible) {
- timestamp_divider_->SetVisible(visible);
+ timestamp_divider_->SetVisible(!is_in_group_child_notification_ && visible);
timestamp_view_->SetVisible(visible);
}
@@ -398,6 +398,20 @@ void NotificationHeaderView::SetIsInAshNotificationView(
SetPreferredSize(gfx::Size(kNotificationWidth, kHeaderHeightInAsh));
}
+void NotificationHeaderView::SetIsInGroupChildNotification(
+ bool is_in_group_child_notification) {
+ if (is_in_group_child_notification_ == is_in_group_child_notification)
+ return;
+ is_in_group_child_notification_ = is_in_group_child_notification;
+
+ app_name_view_->SetVisible(!is_in_group_child_notification_);
+ app_icon_view_->SetVisible(!is_in_ash_notification_ &&
+ !is_in_group_child_notification_);
+ expand_button_->SetVisible(!is_in_ash_notification_ &&
+ !is_in_group_child_notification_);
+ UpdateSummaryTextAndTimestampVisibility();
+}
+
const std::u16string& NotificationHeaderView::app_name_for_testing() const {
return app_name_view_->GetText();
}
@@ -406,14 +420,14 @@ gfx::ImageSkia NotificationHeaderView::app_icon_for_testing() const {
return app_icon_view_->GetImage();
}
-void NotificationHeaderView::UpdateSummaryTextVisibility() {
- const bool summary_visible = !summary_text_view_->GetText().empty();
+void NotificationHeaderView::UpdateSummaryTextAndTimestampVisibility() {
+ const bool summary_visible = !is_in_group_child_notification_ &&
+ !summary_text_view_->GetText().empty();
summary_text_divider_->SetVisible(summary_visible);
summary_text_view_->SetVisible(summary_visible);
const bool timestamp_visible = !has_progress_ && timestamp_;
- timestamp_divider_->SetVisible(timestamp_visible);
- timestamp_view_->SetVisible(timestamp_visible);
+ SetTimestampVisible(timestamp_visible);
// TODO(crbug.com/991492): this should not be necessary.
detail_views_->InvalidateLayout();
diff --git a/chromium/ui/message_center/views/notification_header_view.h b/chromium/ui/message_center/views/notification_header_view.h
index cb413a965f3..0d967a0ca75 100644
--- a/chromium/ui/message_center/views/notification_header_view.h
+++ b/chromium/ui/message_center/views/notification_header_view.h
@@ -79,6 +79,9 @@ class MESSAGE_CENTER_EXPORT NotificationHeaderView : public views::Button {
void SetIsInAshNotificationView(bool is_in_ash_notification);
+ // The header only shows timestamp if it is in a group child notification.
+ void SetIsInGroupChildNotification(bool is_in_group_child_notification);
+
// views::View:
void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
void OnThemeChanged() override;
@@ -105,9 +108,11 @@ class MESSAGE_CENTER_EXPORT NotificationHeaderView : public views::Button {
private:
FRIEND_TEST_ALL_PREFIXES(NotificationHeaderViewTest, SettingsMode);
+ FRIEND_TEST_ALL_PREFIXES(NotificationHeaderViewTest,
+ GroupChildNotificationVisibility);
// Update visibility for both |summary_text_view_| and |timestamp_view_|.
- void UpdateSummaryTextVisibility();
+ void UpdateSummaryTextAndTimestampVisibility();
void UpdateColors();
@@ -134,6 +139,9 @@ class MESSAGE_CENTER_EXPORT NotificationHeaderView : public views::Button {
// Whether this view is used for an ash notification view.
bool is_in_ash_notification_ = false;
+
+ // Whether this view is used for a group child notification.
+ bool is_in_group_child_notification_ = false;
};
BEGIN_VIEW_BUILDER(MESSAGE_CENTER_EXPORT, NotificationHeaderView, views::Button)
diff --git a/chromium/ui/message_center/views/notification_header_view_unittest.cc b/chromium/ui/message_center/views/notification_header_view_unittest.cc
index 935dbb44a23..c1c610174a6 100644
--- a/chromium/ui/message_center/views/notification_header_view_unittest.cc
+++ b/chromium/ui/message_center/views/notification_header_view_unittest.cc
@@ -230,6 +230,48 @@ TEST_F(NotificationHeaderViewTest, AppIconAndExpandButtonNotVisible) {
EXPECT_FALSE(notification_header_view->expand_button()->GetVisible());
}
+TEST_F(NotificationHeaderViewTest, GroupChildNotificationVisibility) {
+ notification_header_view_->SetSummaryText(u"summary");
+ notification_header_view_->SetTimestamp(base::Time::Now());
+
+ EXPECT_TRUE(
+ notification_header_view_->app_icon_view_for_testing()->GetVisible());
+ EXPECT_TRUE(notification_header_view_->expand_button()->GetVisible());
+ EXPECT_TRUE(
+ notification_header_view_->summary_text_for_testing()->GetVisible());
+ EXPECT_TRUE(notification_header_view_->summary_text_divider_->GetVisible());
+ EXPECT_TRUE(
+ notification_header_view_->timestamp_view_for_testing()->GetVisible());
+ EXPECT_TRUE(notification_header_view_->timestamp_divider_->GetVisible());
+
+ // For group child notification, all the views except `timestamp_view_` should
+ // not be visible.
+ notification_header_view_->SetIsInGroupChildNotification(
+ /*is_in_group_child_notification=*/true);
+ EXPECT_FALSE(
+ notification_header_view_->app_icon_view_for_testing()->GetVisible());
+ EXPECT_FALSE(notification_header_view_->expand_button()->GetVisible());
+ EXPECT_FALSE(
+ notification_header_view_->summary_text_for_testing()->GetVisible());
+ EXPECT_FALSE(notification_header_view_->summary_text_divider_->GetVisible());
+ EXPECT_FALSE(notification_header_view_->timestamp_divider_->GetVisible());
+ EXPECT_TRUE(
+ notification_header_view_->timestamp_view_for_testing()->GetVisible());
+
+ // Switching back.
+ notification_header_view_->SetIsInGroupChildNotification(
+ /*is_in_group_child_notification=*/false);
+ EXPECT_TRUE(
+ notification_header_view_->app_icon_view_for_testing()->GetVisible());
+ EXPECT_TRUE(notification_header_view_->expand_button()->GetVisible());
+ EXPECT_TRUE(
+ notification_header_view_->summary_text_for_testing()->GetVisible());
+ EXPECT_TRUE(notification_header_view_->summary_text_divider_->GetVisible());
+ EXPECT_TRUE(
+ notification_header_view_->timestamp_view_for_testing()->GetVisible());
+ EXPECT_TRUE(notification_header_view_->timestamp_divider_->GetVisible());
+}
+
TEST_F(NotificationHeaderViewTest, MetadataTest) {
views::test::TestViewMetadata(notification_header_view_);
}
diff --git a/chromium/ui/message_center/views/notification_view_base.cc b/chromium/ui/message_center/views/notification_view_base.cc
index 2e9b5ce7697..28a962b7c73 100644
--- a/chromium/ui/message_center/views/notification_view_base.cc
+++ b/chromium/ui/message_center/views/notification_view_base.cc
@@ -318,6 +318,12 @@ NotificationViewBase::NotificationViewBase(const Notification& notification)
NotificationViewBase::~NotificationViewBase() {
RemovePreTargetHandler(click_activator_.get());
+
+ // `inline_reply_` might still be accessed by
+ // `AshNotificationView::ActionButtonPressed()` after dtor, so we explicitly
+ // reset that pointer here to avoid using invalid pointer.
+ actions_row()->RemoveChildViewT(inline_reply_);
+ inline_reply_ = nullptr;
}
void NotificationViewBase::Layout() {
@@ -343,7 +349,9 @@ void NotificationViewBase::Layout() {
path.addRoundRect(gfx::RectToSkRect(bounds), kCornerRadius, kCornerRadius);
action_buttons_row_->SetClipPath(path);
- inline_reply_->SetClipPath(path);
+
+ if (inline_reply_)
+ inline_reply_->SetClipPath(path);
}
}
@@ -756,7 +764,8 @@ void NotificationViewBase::CreateOrUpdateActionButtonViews(
}
// Hide inline reply field if it doesn't exist anymore.
- if (inline_reply_->GetVisible() && !HasInlineReply(notification)) {
+ if (inline_reply_ && inline_reply_->GetVisible() &&
+ !HasInlineReply(notification)) {
action_buttons_row_->SetVisible(true);
inline_reply_->SetVisible(false);
}
@@ -814,7 +823,7 @@ void NotificationViewBase::ActionButtonPressed(size_t index,
const ui::Event& event) {
const absl::optional<std::u16string>& placeholder =
action_button_to_placeholder_map_[action_buttons_[index]];
- if (placeholder) {
+ if (placeholder && inline_reply_) {
inline_reply_->SetTextfieldIndex(static_cast<int>(index));
inline_reply_->SetPlaceholderText(placeholder);
inline_reply_->AnimateBackground(event);
@@ -834,6 +843,8 @@ void NotificationViewBase::ActionButtonPressed(size_t index,
bool NotificationViewBase::HasInlineReply(
const Notification& notification) const {
+ if (!inline_reply_)
+ return false;
auto buttons = notification.buttons();
const size_t index = inline_reply_->GetTextfieldIndex();
return index < buttons.size() && buttons[index].placeholder.has_value();
@@ -855,7 +866,8 @@ void NotificationViewBase::UpdateViewForExpandedState(bool expanded) {
!action_buttons_row_->children().empty());
if (!expanded) {
action_buttons_row_->SetVisible(true);
- inline_reply_->SetVisible(false);
+ if (inline_reply_)
+ inline_reply_->SetVisible(false);
}
for (size_t i = kMaxLinesForMessageLabel; i < item_views_.size(); ++i) {
diff --git a/chromium/ui/message_center/views/notification_view_base.h b/chromium/ui/message_center/views/notification_view_base.h
index e2373320089..3603267d25e 100644
--- a/chromium/ui/message_center/views/notification_view_base.h
+++ b/chromium/ui/message_center/views/notification_view_base.h
@@ -390,7 +390,7 @@ class MESSAGE_CENTER_EXPORT NotificationViewBase
// Counter for view layouting, which is used during the CreateOrUpdate*
// phases to keep track of the view ordering. See crbug.com/901045
- int left_content_count_;
+ size_t left_content_count_;
std::unique_ptr<ui::EventHandler> click_activator_;
diff --git a/chromium/ui/message_center/views/notification_view_base_unittest.cc b/chromium/ui/message_center/views/notification_view_base_unittest.cc
index d1e0dabb2fc..bf643178040 100644
--- a/chromium/ui/message_center/views/notification_view_base_unittest.cc
+++ b/chromium/ui/message_center/views/notification_view_base_unittest.cc
@@ -2,11 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "base/memory/raw_ptr.h"
#include "ui/message_center/views/notification_view.h"
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
@@ -20,6 +20,7 @@
#include "ui/events/event_processor.h"
#include "ui/events/event_utils.h"
#include "ui/events/test/event_generator.h"
+#include "ui/events/test/test_event.h"
#include "ui/gfx/color_palette.h"
#include "ui/gfx/color_utils.h"
#include "ui/message_center/message_center.h"
@@ -154,12 +155,6 @@ class NotificationTestDelegate : public NotificationDelegate {
bool expecting_reply_submission_ = false;
};
-class DummyEvent : public ui::Event {
- public:
- DummyEvent() : Event(ui::ET_UNKNOWN, base::TimeTicks(), 0) {}
- ~DummyEvent() override = default;
-};
-
} // namespace
class NotificationViewBaseTest : public views::ViewsTestBase,
@@ -225,8 +220,8 @@ std::unique_ptr<Notification>
NotificationViewBaseTest::CreateSimpleNotificationWithRichData(
const RichNotificationData& data) const {
std::unique_ptr<Notification> notification = std::make_unique<Notification>(
- NOTIFICATION_TYPE_BASE_FORMAT, std::string(kDefaultNotificationId),
- u"title", u"message", ui::ImageModel::FromImage(CreateTestImage(80, 80)),
+ NOTIFICATION_TYPE_SIMPLE, std::string(kDefaultNotificationId), u"title",
+ u"message", ui::ImageModel::FromImage(CreateTestImage(80, 80)),
u"display source", GURL(),
NotifierId(NotifierType::APPLICATION, "extension_id"), data, delegate_);
notification->set_small_image(CreateTestImage(16, 16));
@@ -1041,7 +1036,7 @@ TEST_F(NotificationViewBaseTest, TestDeleteOnToggleExpanded) {
// The view can be deleted by PreferredSizeChanged(). https://crbug.com/918933
set_delete_on_preferred_size_changed(true);
views::test::ButtonTestApi(notification_view()->header_row_)
- .NotifyClick(DummyEvent());
+ .NotifyClick(ui::test::TestEvent());
}
TEST_F(NotificationViewBaseTest, TestLongTitleAndMessage) {
@@ -1084,8 +1079,8 @@ TEST_F(NotificationViewBaseTest, AppNameSystemNotification) {
RichNotificationData data;
data.settings_button_handler = SettingsButtonHandler::INLINE;
auto notification = std::make_unique<Notification>(
- NOTIFICATION_TYPE_BASE_FORMAT, std::string(kDefaultNotificationId),
- u"title", u"message", ui::ImageModel(), std::u16string(), GURL(),
+ NOTIFICATION_TYPE_SIMPLE, std::string(kDefaultNotificationId), u"title",
+ u"message", ui::ImageModel(), std::u16string(), GURL(),
#if BUILDFLAG(IS_CHROMEOS_ASH)
NotifierId(NotifierType::SYSTEM_COMPONENT, "system",
ash::NotificationCatalogName::kTestCatalogName),
@@ -1122,8 +1117,8 @@ TEST_F(NotificationViewBaseTest, AppNameWebAppNotification) {
data.settings_button_handler = SettingsButtonHandler::INLINE;
std::unique_ptr<Notification> notification = std::make_unique<Notification>(
- NOTIFICATION_TYPE_BASE_FORMAT, std::string(kDefaultNotificationId),
- u"title", u"message", ui::ImageModel::FromImage(CreateTestImage(80, 80)),
+ NOTIFICATION_TYPE_SIMPLE, std::string(kDefaultNotificationId), u"title",
+ u"message", ui::ImageModel::FromImage(CreateTestImage(80, 80)),
u"display source", GURL(), notifier_id, data, delegate_);
notification->set_small_image(gfx::Image::CreateFrom1xBitmap(small_bitmap));
notification->set_image(CreateTestImage(320, 240));
diff --git a/chromium/ui/message_center/views/notification_view_unittest.cc b/chromium/ui/message_center/views/notification_view_unittest.cc
index 0a626795386..80b525f3dff 100644
--- a/chromium/ui/message_center/views/notification_view_unittest.cc
+++ b/chromium/ui/message_center/views/notification_view_unittest.cc
@@ -14,6 +14,7 @@
#include "ui/compositor/layer.h"
#include "ui/compositor/scoped_animation_duration_scale_mode.h"
#include "ui/events/test/event_generator.h"
+#include "ui/events/test/test_event.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/color_utils.h"
#include "ui/gfx/image/image_unittest_util.h"
@@ -104,12 +105,6 @@ class NotificationTestDelegate : public NotificationDelegate {
bool disable_notification_called_ = false;
};
-class DummyEvent : public ui::Event {
- public:
- DummyEvent() : Event(ui::ET_UNKNOWN, base::TimeTicks(), 0) {}
- ~DummyEvent() override = default;
-};
-
} // namespace
class NotificationViewTest : public views::ViewObserver,
@@ -166,11 +161,11 @@ class NotificationViewTest : public views::ViewObserver,
std::unique_ptr<Notification> CreateSimpleNotificationWithRichData(
const RichNotificationData& optional_fields) const {
std::unique_ptr<Notification> notification = std::make_unique<Notification>(
- NOTIFICATION_TYPE_BASE_FORMAT, std::string(kDefaultNotificationId),
- u"title", u"message",
- ui::ImageModel::FromImage(CreateTestImage(80, 80)), u"display source",
- GURL(), NotifierId(NotifierType::APPLICATION, "extension_id"),
- optional_fields, delegate_);
+ NOTIFICATION_TYPE_SIMPLE, std::string(kDefaultNotificationId), u"title",
+ u"message", ui::ImageModel::FromImage(CreateTestImage(80, 80)),
+ u"display source", GURL(),
+ NotifierId(NotifierType::APPLICATION, "extension_id"), optional_fields,
+ delegate_);
notification->set_small_image(CreateTestImage(16, 16));
notification->set_image(CreateTestImage(320, 240));
@@ -249,7 +244,7 @@ class NotificationViewTest : public views::ViewObserver,
// Toggle inline settings with a dummy event.
void ToggleInlineSettings() {
- notification_view_->ToggleInlineSettings(DummyEvent());
+ notification_view_->ToggleInlineSettings(ui::test::TestEvent());
}
protected:
@@ -321,8 +316,8 @@ class NotificationViewTest : public views::ViewObserver,
TEST_F(NotificationViewTest, UpdateViewsOrderingTest) {
EXPECT_NE(nullptr, title_view());
EXPECT_NE(nullptr, message_label());
- EXPECT_EQ(0, left_content()->GetIndexOf(title_view()));
- EXPECT_EQ(1, left_content()->GetIndexOf(message_label()));
+ EXPECT_EQ(0u, left_content()->GetIndexOf(title_view()));
+ EXPECT_EQ(1u, left_content()->GetIndexOf(message_label()));
std::unique_ptr<Notification> notification = CreateSimpleNotification();
notification->set_title(std::u16string());
@@ -331,7 +326,7 @@ TEST_F(NotificationViewTest, UpdateViewsOrderingTest) {
EXPECT_EQ(nullptr, title_view());
EXPECT_NE(nullptr, message_label());
- EXPECT_EQ(0, left_content()->GetIndexOf(message_label()));
+ EXPECT_EQ(0u, left_content()->GetIndexOf(message_label()));
notification->set_title(u"title");
@@ -339,8 +334,8 @@ TEST_F(NotificationViewTest, UpdateViewsOrderingTest) {
EXPECT_NE(nullptr, title_view());
EXPECT_NE(nullptr, message_label());
- EXPECT_EQ(0, left_content()->GetIndexOf(title_view()));
- EXPECT_EQ(1, left_content()->GetIndexOf(message_label()));
+ EXPECT_EQ(0u, left_content()->GetIndexOf(title_view()));
+ EXPECT_EQ(1u, left_content()->GetIndexOf(message_label()));
}
TEST_F(NotificationViewTest, CreateOrUpdateTitle) {
@@ -626,8 +621,8 @@ TEST_F(NotificationViewTest, AppIconWebAppNotification) {
data.settings_button_handler = SettingsButtonHandler::INLINE;
std::unique_ptr<Notification> notification = std::make_unique<Notification>(
- NOTIFICATION_TYPE_BASE_FORMAT, std::string(kDefaultNotificationId),
- u"title", u"message", ui::ImageModel::FromImage(CreateTestImage(80, 80)),
+ NOTIFICATION_TYPE_SIMPLE, std::string(kDefaultNotificationId), u"title",
+ u"message", ui::ImageModel::FromImage(CreateTestImage(80, 80)),
u"display source", GURL(), notifier_id, data, delegate_);
notification->set_small_image(gfx::Image::CreateFrom1xBitmap(small_bitmap));
notification->set_image(CreateTestImage(320, 240));
@@ -748,13 +743,14 @@ TEST_F(NotificationViewTest, TestDeleteOnDisableNotification) {
notification->set_type(NOTIFICATION_TYPE_SIMPLE);
UpdateNotificationViews(*notification);
- notification_view()->OnSettingsButtonPressed(DummyEvent());
- block_all_button()->NotifyClick(DummyEvent());
+ notification_view()->OnSettingsButtonPressed(ui::test::TestEvent());
+ block_all_button()->NotifyClick(ui::test::TestEvent());
// After DisableNotification() is called, |notification_view| can be deleted.
// https://crbug.com/924922
set_delete_on_notification_removed(true);
- views::test::ButtonTestApi(settings_done_button()).NotifyClick(DummyEvent());
+ views::test::ButtonTestApi(settings_done_button())
+ .NotifyClick(ui::test::TestEvent());
}
// Tests that action buttons (e.g. the inline reply button) ignores the
diff --git a/chromium/ui/message_center/views/notification_view_util.cc b/chromium/ui/message_center/views/notification_view_util.cc
index e5cc69cf227..74f5e3e7a24 100644
--- a/chromium/ui/message_center/views/notification_view_util.cc
+++ b/chromium/ui/message_center/views/notification_view_util.cc
@@ -16,7 +16,7 @@ std::unique_ptr<ui::Event> ConvertToBoundedLocatedEvent(const ui::Event& event,
// Convert the point of |event| from the coordinate system of its target to
// that of the passed in |target| and create a new LocatedEvent.
- std::unique_ptr<ui::Event> cloned_event = ui::Event::Clone(event);
+ std::unique_ptr<ui::Event> cloned_event = event.Clone();
ui::LocatedEvent* located_event = cloned_event->AsLocatedEvent();
event.target()->ConvertEventToTarget(target, located_event);
diff --git a/chromium/ui/native_theme/caption_style.h b/chromium/ui/native_theme/caption_style.h
index d95f6f84734..82732a5c85d 100644
--- a/chromium/ui/native_theme/caption_style.h
+++ b/chromium/ui/native_theme/caption_style.h
@@ -42,7 +42,6 @@ struct NATIVE_THEME_EXPORT CaptionStyle {
std::string font_family;
std::string font_variant;
std::string window_color;
- std::string window_padding;
std::string window_radius;
};
diff --git a/chromium/ui/native_theme/caption_style_mac.mm b/chromium/ui/native_theme/caption_style_mac.mm
index 390eac6e5c9..27cbbda1b1f 100644
--- a/chromium/ui/native_theme/caption_style_mac.mm
+++ b/chromium/ui/native_theme/caption_style_mac.mm
@@ -159,16 +159,6 @@ std::string GetMAWindowColorAsCSSColor() {
important);
}
-// If the window is visible (its opacity is greater than 0), give it padding so
-// it surrounds the text track cue. If it is not visible, its padding should be
-// 0. Webkit uses 0.4em padding so we match that here.
-std::string GetMAWindowPaddingAsCSSNumberInEm() {
- MACaptionAppearanceBehavior behavior;
- float opacity = MACaptionAppearanceGetWindowOpacity(kUserDomain, &behavior);
- bool important = behavior == kMACaptionAppearanceBehaviorUseValue;
- return MaybeAddCSSImportant(opacity > 0 ? "0.4em" : "0em", important);
-}
-
std::string GetMAWindowRadiusAsCSSNumberInPixels() {
MACaptionAppearanceBehavior behavior;
float radius =
@@ -191,7 +181,6 @@ absl::optional<CaptionStyle> CaptionStyle::FromSystemSettings() {
style.text_size = GetMATextScaleAsCSSPercent();
style.text_shadow = GetMATextEdgeStyleAsCSSShadow();
style.window_color = GetMAWindowColorAsCSSColor();
- style.window_padding = GetMAWindowPaddingAsCSSNumberInEm();
style.window_radius = GetMAWindowRadiusAsCSSNumberInPixels();
GetMAFontAsCSSFontSpecifiers(&style.font_family, &style.font_variant);
diff --git a/chromium/ui/native_theme/native_theme.cc b/chromium/ui/native_theme/native_theme.cc
index 3f596e0d24c..d7be414239f 100644
--- a/chromium/ui/native_theme/native_theme.cc
+++ b/chromium/ui/native_theme/native_theme.cc
@@ -51,7 +51,7 @@ ColorProviderManager::Key NativeTheme::GetColorProviderKey(
: ColorProviderManager::SystemTheme::kDefault,
use_custom_frame ? ui::ColorProviderManager::FrameType::kChromium
: ui::ColorProviderManager::FrameType::kNative,
- std::move(custom_theme));
+ user_color_, std::move(custom_theme));
}
SkColor NativeTheme::GetSystemButtonPressedColor(SkColor base_color) const {
@@ -145,6 +145,10 @@ NativeTheme::GetPlatformHighContrastColorScheme() const {
: PlatformHighContrastColorScheme::kLight;
}
+NativeTheme::PageColors NativeTheme::GetPageColors() const {
+ return page_colors_;
+}
+
NativeTheme::PreferredColorScheme NativeTheme::GetPreferredColorScheme() const {
return preferred_color_scheme_;
}
diff --git a/chromium/ui/native_theme/native_theme.h b/chromium/ui/native_theme/native_theme.h
index 3b9c8841ac6..bd6a77d5f0f 100644
--- a/chromium/ui/native_theme/native_theme.h
+++ b/chromium/ui/native_theme/native_theme.h
@@ -113,6 +113,19 @@ class NATIVE_THEME_EXPORT NativeTheme {
kNumStates = kPressed + 1,
};
+ // Enum used for kPageColors pref. Page Colors is a browser setting that can
+ // be used to simulate forced colors mode. This enum should match its React
+ // counterpart.
+ enum PageColors {
+ kOff = 0,
+ kDusk = 1,
+ kDesert = 2,
+ kBlack = 3,
+ kWhite = 4,
+ kHighContrast = 5,
+ kMaxValue = kHighContrast,
+ };
+
// OS-level preferred color scheme. (Ex. high contrast or dark mode color
// preference.)
enum class PreferredColorScheme {
@@ -346,14 +359,15 @@ class NATIVE_THEME_EXPORT NativeTheme {
float height) const;
// Paint the part to the canvas.
- virtual void Paint(cc::PaintCanvas* canvas,
- const ui::ColorProvider* color_provider,
- Part part,
- State state,
- const gfx::Rect& rect,
- const ExtraParams& extra,
- ColorScheme color_scheme = ColorScheme::kDefault,
- const absl::optional<SkColor>& accent_color = 0) const = 0;
+ virtual void Paint(
+ cc::PaintCanvas* canvas,
+ const ui::ColorProvider* color_provider,
+ Part part,
+ State state,
+ const gfx::Rect& rect,
+ const ExtraParams& extra,
+ ColorScheme color_scheme = ColorScheme::kDefault,
+ const absl::optional<SkColor>& accent_color = absl::nullopt) const = 0;
// Returns whether the theme uses a nine-patch resource for the given part.
// If true, calling code should always paint into a canvas the size of which
@@ -437,6 +451,9 @@ class NATIVE_THEME_EXPORT NativeTheme {
// colors, you probably shouldn't. Instead, use GetSystemColor().
virtual bool ShouldUseDarkColors() const;
+ // Returns the user's current page colors.
+ virtual PageColors GetPageColors() const;
+
// Returns the OS-level user preferred color scheme. See the comment for
// CalculatePreferredColorScheme() for details on how preferred color scheme
// is calculated.
@@ -462,6 +479,7 @@ class NATIVE_THEME_EXPORT NativeTheme {
should_use_dark_colors_ = should_use_dark_colors;
}
void set_forced_colors(bool forced_colors) { forced_colors_ = forced_colors; }
+ void set_page_colors(PageColors page_colors) { page_colors_ = page_colors; }
void set_preferred_color_scheme(PreferredColorScheme preferred_color_scheme) {
preferred_color_scheme_ = preferred_color_scheme;
}
@@ -471,6 +489,11 @@ class NATIVE_THEME_EXPORT NativeTheme {
void set_system_colors(const std::map<SystemThemeColor, SkColor>& colors);
bool is_custom_system_theme() const { return is_custom_system_theme_; }
+ // Set the user_color for ColorProviderManager::Key.
+ void set_user_color(absl::optional<SkColor> user_color) {
+ user_color_ = user_color;
+ }
+
// Updates the state of dark mode, forced colors mode, and the map of system
// colors. Returns true if NativeTheme was updated as a result, or false if
// the state of NativeTheme was untouched.
@@ -552,9 +575,13 @@ class NATIVE_THEME_EXPORT NativeTheme {
// Observers to notify when the native theme changes.
base::ObserverList<NativeThemeObserver>::Unchecked native_theme_observers_;
+ // User's primary color. Included in the ColorProvider Key.
+ absl::optional<SkColor> user_color_;
+
bool should_use_dark_colors_ = false;
const bool is_custom_system_theme_;
bool forced_colors_ = false;
+ PageColors page_colors_ = PageColors::kOff;
PreferredColorScheme preferred_color_scheme_ = PreferredColorScheme::kLight;
PreferredContrast preferred_contrast_ = PreferredContrast::kNoPreference;
diff --git a/chromium/ui/native_theme/native_theme_aura.cc b/chromium/ui/native_theme/native_theme_aura.cc
index b47304f2aa4..eaed2772b1e 100644
--- a/chromium/ui/native_theme/native_theme_aura.cc
+++ b/chromium/ui/native_theme/native_theme_aura.cc
@@ -121,7 +121,9 @@ void NativeThemeAura::PaintMenuPopupBackground(
const MenuBackgroundExtraParams& menu_background,
ColorScheme color_scheme) const {
DCHECK(color_provider);
- SkColor color = color_provider->GetColor(kColorMenuBackground);
+ // TODO(crbug/1308932): Remove FromColor and make all SkColor4f.
+ SkColor4f color =
+ SkColor4f::FromColor(color_provider->GetColor(kColorMenuBackground));
if (menu_background.corner_radius > 0) {
cc::PaintFlags flags;
flags.setStyle(cc::PaintFlags::kFill_Style);
diff --git a/chromium/ui/native_theme/native_theme_base.cc b/chromium/ui/native_theme/native_theme_base.cc
index 639769ae8ab..c281485fbb2 100644
--- a/chromium/ui/native_theme/native_theme_base.cc
+++ b/chromium/ui/native_theme/native_theme_base.cc
@@ -940,8 +940,11 @@ void NativeThemeBase::PaintMenuPopupBackground(
// scheme. If that changes, we need to add an appropriate dark scheme color to
// kMenuPopupBackgroundColor.
DCHECK(color_scheme == ColorScheme::kDefault);
- canvas->drawColor(GetColor(kMenuPopupBackgroundColor, color_scheme),
- SkBlendMode::kSrc);
+
+ // TODO(crbug/1308932): Remove FromColor and make all SkColor4f.
+ canvas->drawColor(
+ SkColor4f::FromColor(GetColor(kMenuPopupBackgroundColor, color_scheme)),
+ SkBlendMode::kSrc);
}
void NativeThemeBase::PaintMenuItemBackground(
diff --git a/chromium/ui/native_theme/native_theme_mac.mm b/chromium/ui/native_theme/native_theme_mac.mm
index adf8dc37732..d3c6edec7bc 100644
--- a/chromium/ui/native_theme/native_theme_mac.mm
+++ b/chromium/ui/native_theme/native_theme_mac.mm
@@ -230,29 +230,29 @@ void NativeThemeMac::PaintScrollBarTrackGradient(
ColorScheme color_scheme) const {
gfx::Canvas paint_canvas(canvas, 1.0f);
// Select colors.
- std::vector<SkColor> gradient_colors;
+ std::vector<SkColor4f> gradient_colors;
bool dark_mode = color_scheme == ColorScheme::kDark;
if (extra_params.is_overlay) {
if (dark_mode) {
- gradient_colors = {SkColorSetARGB(0x28, 0xD8, 0xD8, 0xD8),
- SkColorSetARGB(0x26, 0xCC, 0xCC, 0xCC),
- SkColorSetARGB(0x26, 0xCC, 0xCC, 0xCC),
- SkColorSetARGB(0x26, 0xCC, 0xCC, 0xCC)};
+ gradient_colors = {SkColor4f{0.847f, 0.847f, 0.847f, 0.157f},
+ SkColor4f{0.8f, 0.8f, 0.8f, 0.149f},
+ SkColor4f{0.8f, 0.8f, 0.8f, 0.149f},
+ SkColor4f{0.8f, 0.8f, 0.8f, 0.149f}};
} else {
- gradient_colors = {SkColorSetARGB(0xC6, 0xF8, 0xF8, 0xF8),
- SkColorSetARGB(0xC2, 0xF8, 0xF8, 0xF8),
- SkColorSetARGB(0xC2, 0xF8, 0xF8, 0xF8),
- SkColorSetARGB(0xC2, 0xF8, 0xF8, 0xF8)};
+ gradient_colors = {SkColor4f{0.973f, 0.973f, 0.973f, 0.776f},
+ SkColor4f{0.973f, 0.973f, 0.973f, 0.761f},
+ SkColor4f{0.973f, 0.973f, 0.973f, 0.761f},
+ SkColor4f{0.973f, 0.973f, 0.973f, 0.761f}};
}
} else {
// Non-overlay scroller track colors are not transparent. On Safari, they
// are, but on all other macOS applications they are not.
if (dark_mode) {
- gradient_colors = {SkColorSetRGB(0x2D, 0x2D, 0x2D),
- SkColorSetRGB(0x2B, 0x2B, 0x2B)};
+ gradient_colors = {SkColor4f{0.176f, 0.176f, 0.176f, 1.0f},
+ SkColor4f{0.169f, 0.169f, 0.169f, 1.0f}};
} else {
- gradient_colors = {SkColorSetRGB(0xFA, 0xFA, 0xFA),
- SkColorSetRGB(0xFA, 0xFA, 0xFA)};
+ gradient_colors = {SkColor4f{0.98f, 0.98f, 0.98f, 1.0f},
+ SkColor4f{0.98f, 0.98f, 0.98f, 1.0f}};
}
}
diff --git a/chromium/ui/native_theme/native_theme_win.cc b/chromium/ui/native_theme/native_theme_win.cc
index 6b9fb74004e..b4840142322 100644
--- a/chromium/ui/native_theme/native_theme_win.cc
+++ b/chromium/ui/native_theme/native_theme_win.cc
@@ -18,6 +18,7 @@
#include "base/no_destructor.h"
#include "base/notreached.h"
#include "base/threading/sequenced_task_runner_handle.h"
+#include "base/win/dark_mode_support.h"
#include "base/win/scoped_gdi_object.h"
#include "base/win/scoped_hdc.h"
#include "base/win/scoped_select_object.h"
@@ -278,7 +279,9 @@ void NativeThemeWin::Paint(cc::PaintCanvas* canvas,
NativeThemeWin::NativeThemeWin(bool configure_web_instance,
bool should_only_use_dark_colors)
- : NativeTheme(should_only_use_dark_colors), color_change_listener_(this) {
+ : NativeTheme(should_only_use_dark_colors),
+ supports_windows_dark_mode_(base::win::IsDarkModeAvailable()),
+ color_change_listener_(this) {
// If there's no sequenced task runner handle, we can't be called back for
// dark mode changes. This generally happens in tests. As a result, ignore
// dark mode in this case.
@@ -1529,7 +1532,9 @@ HANDLE NativeThemeWin::GetThemeHandle(ThemeName theme_name) const {
handle = OpenThemeData(nullptr, L"Combobox");
break;
case SCROLLBAR:
- handle = OpenThemeData(nullptr, L"Scrollbar");
+ handle = OpenThemeData(nullptr, supports_windows_dark_mode_
+ ? L"Explorer::Scrollbar"
+ : L"Scrollbar");
break;
case STATUS:
handle = OpenThemeData(nullptr, L"Status");
@@ -1582,6 +1587,7 @@ void NativeThemeWin::UpdateDarkModeStatus() {
}
set_use_dark_colors(dark_mode_enabled);
set_preferred_color_scheme(CalculatePreferredColorScheme());
+ CloseHandlesInternal();
NotifyOnNativeThemeUpdated();
}
diff --git a/chromium/ui/native_theme/native_theme_win.h b/chromium/ui/native_theme/native_theme_win.h
index dc95e970a5e..95d409f5d01 100644
--- a/chromium/ui/native_theme/native_theme_win.h
+++ b/chromium/ui/native_theme/native_theme_win.h
@@ -197,6 +197,11 @@ class NATIVE_THEME_EXPORT NativeThemeWin : public NativeTheme,
void RegisterThemeRegkeyObserver();
void UpdateDarkModeStatus();
+ // True if Windows supports dark mode. This does NOT indicate whether the
+ // system is in dark mode, only that it is supported by this version of
+ // Windows.
+ const bool supports_windows_dark_mode_;
+
// Dark Mode registry key.
base::win::RegKey hkcu_themes_regkey_;
diff --git a/chromium/ui/native_theme/scrollbar_animator_mac.h b/chromium/ui/native_theme/scrollbar_animator_mac.h
index b7fba01357b..d9881224fbe 100644
--- a/chromium/ui/native_theme/scrollbar_animator_mac.h
+++ b/chromium/ui/native_theme/scrollbar_animator_mac.h
@@ -6,6 +6,7 @@
#define UI_NATIVE_THEME_SCROLLBAR_ANIMATOR_MAC_H_
#include "base/callback.h"
+#include "base/memory/raw_ptr.h"
#include "base/task/single_thread_task_runner.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
@@ -94,7 +95,7 @@ class NATIVE_THEME_EXPORT OverlayScrollbarAnimatorMac {
void FadeOutAnimationTicked(double progress);
void FadeOutAnimationCancel();
- Client* const client_; // Weak, owns `this`.
+ const raw_ptr<Client> client_; // Weak, owns `this`.
const int thumb_width_expanded_;
const int thumb_width_unexpanded_;
diff --git a/chromium/ui/ozone/BUILD.gn b/chromium/ui/ozone/BUILD.gn
index b123f6093eb..fa2c17f4e20 100644
--- a/chromium/ui/ozone/BUILD.gn
+++ b/chromium/ui/ozone/BUILD.gn
@@ -91,6 +91,8 @@ component("ozone_base") {
"public/hardware_capabilities.h",
"public/input_controller.cc",
"public/input_controller.h",
+ "public/native_pixmap_gl_binding.cc",
+ "public/native_pixmap_gl_binding.h",
"public/overlay_candidates_ozone.cc",
"public/overlay_candidates_ozone.h",
"public/overlay_manager_ozone.h",
diff --git a/chromium/ui/ozone/common/BUILD.gn b/chromium/ui/ozone/common/BUILD.gn
index 65c3b8c0db5..8538f126014 100644
--- a/chromium/ui/ozone/common/BUILD.gn
+++ b/chromium/ui/ozone/common/BUILD.gn
@@ -21,6 +21,8 @@ source_set("common") {
"gl_ozone_egl.h",
"gl_surface_egl_readback.cc",
"gl_surface_egl_readback.h",
+ "native_pixmap_egl_binding.cc",
+ "native_pixmap_egl_binding.h",
"stub_overlay_manager.cc",
"stub_overlay_manager.h",
]
diff --git a/chromium/ui/ozone/common/bitmap_cursor.h b/chromium/ui/ozone/common/bitmap_cursor.h
index a610c9518c8..391dfba70b3 100644
--- a/chromium/ui/ozone/common/bitmap_cursor.h
+++ b/chromium/ui/ozone/common/bitmap_cursor.h
@@ -7,6 +7,7 @@
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/time/time.h"
#include "third_party/skia/include/core/SkBitmap.h"
@@ -71,7 +72,7 @@ class BitmapCursor : public PlatformCursor {
// Platform cursor data. Having this non-nullptr means that this cursor
// is supplied by the platform.
- void* const platform_data_ = nullptr;
+ const raw_ptr<void> platform_data_ = nullptr;
float cursor_image_scale_factor_ = 1.f;
};
diff --git a/chromium/ui/ozone/common/gl_ozone_egl.cc b/chromium/ui/ozone/common/gl_ozone_egl.cc
index c7e3707d3b5..7e7bb78ed79 100644
--- a/chromium/ui/ozone/common/gl_ozone_egl.cc
+++ b/chromium/ui/ozone/common/gl_ozone_egl.cc
@@ -7,20 +7,20 @@
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_context.h"
#include "ui/gl/gl_context_egl.h"
+#include "ui/gl/gl_display.h"
#include "ui/gl/gl_egl_api_implementation.h"
#include "ui/gl/gl_gl_api_implementation.h"
#include "ui/gl/gl_share_group.h"
#include "ui/gl/gl_surface.h"
-#include "ui/gl/gl_surface_egl.h"
+#include "ui/gl/gl_utils.h"
namespace ui {
gl::GLDisplay* GLOzoneEGL::InitializeGLOneOffPlatform(
uint64_t system_device_id) {
- gl::GLDisplay* display =
- gl::GLSurfaceEGL::InitializeOneOff(GetNativeDisplay(), system_device_id);
- if (!display) {
- LOG(ERROR) << "GLSurfaceEGL::InitializeOneOff failed.";
+ gl::GLDisplayEGL* display = gl::GetDisplayEGL(system_device_id);
+ if (!display->Initialize(GetNativeDisplay())) {
+ LOG(ERROR) << "GLDisplayEGL::Initialize failed.";
return nullptr;
}
return display;
@@ -50,11 +50,27 @@ bool GLOzoneEGL::InitializeExtensionSettingsOneOffPlatform(
}
void GLOzoneEGL::ShutdownGL(gl::GLDisplay* display) {
- gl::GLSurfaceEGL::ShutdownOneOff(static_cast<gl::GLDisplayEGL*>(display));
+ if (display)
+ display->Shutdown();
gl::ClearBindingsGL();
gl::ClearBindingsEGL();
}
+bool GLOzoneEGL::CanImportNativePixmap() {
+ return false;
+}
+
+std::unique_ptr<NativePixmapGLBinding> GLOzoneEGL::ImportNativePixmap(
+ scoped_refptr<gfx::NativePixmap> pixmap,
+ gfx::BufferFormat plane_format,
+ gfx::BufferPlane plane,
+ gfx::Size plane_size,
+ const gfx::ColorSpace& color_space,
+ GLenum target,
+ GLuint texture_id) {
+ return nullptr;
+}
+
bool GLOzoneEGL::GetGLWindowSystemBindingInfo(
const gl::GLVersionInfo& gl_info,
gl::GLWindowSystemBindingInfo* info) {
@@ -70,6 +86,7 @@ scoped_refptr<gl::GLContext> GLOzoneEGL::CreateGLContext(
}
scoped_refptr<gl::GLSurface> GLOzoneEGL::CreateSurfacelessViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget window) {
// This will usually not be implemented by the platform specific version.
return nullptr;
diff --git a/chromium/ui/ozone/common/gl_ozone_egl.h b/chromium/ui/ozone/common/gl_ozone_egl.h
index 29d0aa55bae..6aca58af5c7 100644
--- a/chromium/ui/ozone/common/gl_ozone_egl.h
+++ b/chromium/ui/ozone/common/gl_ozone_egl.h
@@ -32,6 +32,15 @@ class GLOzoneEGL : public GLOzone {
bool InitializeExtensionSettingsOneOffPlatform(
gl::GLDisplay* display) override;
void ShutdownGL(gl::GLDisplay* display) override;
+ bool CanImportNativePixmap() override;
+ std::unique_ptr<NativePixmapGLBinding> ImportNativePixmap(
+ scoped_refptr<gfx::NativePixmap> pixmap,
+ gfx::BufferFormat plane_format,
+ gfx::BufferPlane plane,
+ gfx::Size plane_size,
+ const gfx::ColorSpace& color_space,
+ GLenum target,
+ GLuint texture_id) override;
bool GetGLWindowSystemBindingInfo(
const gl::GLVersionInfo& gl_info,
gl::GLWindowSystemBindingInfo* info) override;
@@ -40,10 +49,13 @@ class GLOzoneEGL : public GLOzone {
gl::GLSurface* compatible_surface,
const gl::GLContextAttribs& attribs) override;
scoped_refptr<gl::GLSurface> CreateViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget window) override = 0;
scoped_refptr<gl::GLSurface> CreateSurfacelessViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget window) override;
scoped_refptr<gl::GLSurface> CreateOffscreenGLSurface(
+ gl::GLDisplay* display,
const gfx::Size& size) override = 0;
protected:
diff --git a/chromium/ui/ozone/common/gl_surface_egl_readback.cc b/chromium/ui/ozone/common/gl_surface_egl_readback.cc
index 8d14021137a..bf711f2f747 100644
--- a/chromium/ui/ozone/common/gl_surface_egl_readback.cc
+++ b/chromium/ui/ozone/common/gl_surface_egl_readback.cc
@@ -19,8 +19,8 @@ constexpr size_t kBytesPerPixelBGRA = 4;
} // namespace
-GLSurfaceEglReadback::GLSurfaceEglReadback()
- : PbufferGLSurfaceEGL(GLSurfaceEGL::GetGLDisplayEGL(), gfx::Size(1, 1)),
+GLSurfaceEglReadback::GLSurfaceEglReadback(gl::GLDisplayEGL* display)
+ : PbufferGLSurfaceEGL(display, gfx::Size(1, 1)),
task_runner_(base::ThreadTaskRunnerHandle::Get()) {}
bool GLSurfaceEglReadback::Resize(const gfx::Size& size,
diff --git a/chromium/ui/ozone/common/gl_surface_egl_readback.h b/chromium/ui/ozone/common/gl_surface_egl_readback.h
index d0ad9790ed2..44620ad1313 100644
--- a/chromium/ui/ozone/common/gl_surface_egl_readback.h
+++ b/chromium/ui/ozone/common/gl_surface_egl_readback.h
@@ -22,7 +22,7 @@ namespace ui {
// there is no FBO implementation for Ozone.
class GLSurfaceEglReadback : public gl::PbufferGLSurfaceEGL {
public:
- GLSurfaceEglReadback();
+ explicit GLSurfaceEglReadback(gl::GLDisplayEGL* display);
GLSurfaceEglReadback(const GLSurfaceEglReadback&) = delete;
GLSurfaceEglReadback& operator=(const GLSurfaceEglReadback&) = delete;
diff --git a/chromium/ui/ozone/common/native_pixmap_egl_binding.cc b/chromium/ui/ozone/common/native_pixmap_egl_binding.cc
new file mode 100644
index 00000000000..4ce29fe5eda
--- /dev/null
+++ b/chromium/ui/ozone/common/native_pixmap_egl_binding.cc
@@ -0,0 +1,42 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/common/native_pixmap_egl_binding.h"
+
+#include "base/logging.h"
+#include "base/memory/scoped_refptr.h"
+#include "ui/gl/gl_image_native_pixmap.h"
+
+namespace ui {
+
+NativePixmapEGLBinding::NativePixmapEGLBinding() = default;
+NativePixmapEGLBinding::~NativePixmapEGLBinding() = default;
+
+// static
+std::unique_ptr<NativePixmapGLBinding> NativePixmapEGLBinding::Create(
+ scoped_refptr<gfx::NativePixmap> pixmap,
+ gfx::BufferFormat plane_format,
+ gfx::BufferPlane plane,
+ gfx::Size plane_size,
+ const gfx::ColorSpace& color_space,
+ GLenum target,
+ GLuint texture_id) {
+ auto gl_image = base::MakeRefCounted<gl::GLImageNativePixmap>(
+ plane_size, plane_format, plane);
+ if (color_space.IsValid())
+ gl_image->SetColorSpace(color_space);
+ if (!gl_image->Initialize(std::move(pixmap))) {
+ LOG(ERROR) << "Unable to initialize GL image from pixmap";
+ return nullptr;
+ }
+
+ auto binding = std::make_unique<NativePixmapEGLBinding>();
+ if (!binding->BindTexture(std::move(gl_image), target, texture_id)) {
+ return nullptr;
+ }
+
+ return binding;
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/common/native_pixmap_egl_binding.h b/chromium/ui/ozone/common/native_pixmap_egl_binding.h
new file mode 100644
index 00000000000..5a1bf1cce2a
--- /dev/null
+++ b/chromium/ui/ozone/common/native_pixmap_egl_binding.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_COMMON_NATIVE_PIXMAP_EGL_BINDING_H_
+#define UI_OZONE_COMMON_NATIVE_PIXMAP_EGL_BINDING_H_
+
+#include "ui/ozone/public/native_pixmap_gl_binding.h"
+
+namespace ui {
+
+// A binding maintained between GLImageNativePixmap and GL Textures in Ozone.
+class NativePixmapEGLBinding : public NativePixmapGLBinding {
+ public:
+ NativePixmapEGLBinding();
+ ~NativePixmapEGLBinding() override;
+
+ static std::unique_ptr<NativePixmapGLBinding> Create(
+ scoped_refptr<gfx::NativePixmap> pixmap,
+ gfx::BufferFormat plane_format,
+ gfx::BufferPlane plane,
+ gfx::Size plane_size,
+ const gfx::ColorSpace& color_space,
+ GLenum target,
+ GLuint texture_id);
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_COMMON_NATIVE_PIXMAP_EGL_BINDING_H_
diff --git a/chromium/ui/ozone/demo/demo_window.h b/chromium/ui/ozone/demo/demo_window.h
index 9371492b160..dd9fd75b49e 100644
--- a/chromium/ui/ozone/demo/demo_window.h
+++ b/chromium/ui/ozone/demo/demo_window.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
@@ -58,8 +59,8 @@ class DemoWindow : public PlatformWindowDelegate {
// initialize the GPU resources via a posted task.
void StartRendererIfNecessary();
- WindowManager* window_manager_; // Not owned.
- RendererFactory* renderer_factory_; // Not owned.
+ raw_ptr<WindowManager> window_manager_; // Not owned.
+ raw_ptr<RendererFactory> renderer_factory_; // Not owned.
std::unique_ptr<Renderer> renderer_;
diff --git a/chromium/ui/ozone/demo/gl_renderer.cc b/chromium/ui/ozone/demo/gl_renderer.cc
index 72672c58832..d814a6ca6e5 100644
--- a/chromium/ui/ozone/demo/gl_renderer.cc
+++ b/chromium/ui/ozone/demo/gl_renderer.cc
@@ -11,6 +11,7 @@
#include "base/location.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h"
+#include "ui/gfx/color_space.h"
#include "ui/gfx/gpu_fence.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_context.h"
diff --git a/chromium/ui/ozone/demo/simple_renderer_factory.cc b/chromium/ui/ozone/demo/simple_renderer_factory.cc
index da580102fa3..6dcad2d5ec8 100644
--- a/chromium/ui/ozone/demo/simple_renderer_factory.cc
+++ b/chromium/ui/ozone/demo/simple_renderer_factory.cc
@@ -9,6 +9,7 @@
#include "base/command_line.h"
#include "base/logging.h"
+#include "ui/gl/gl_display.h"
#include "ui/gl/gl_surface.h"
#include "ui/gl/init/gl_factory.h"
#include "ui/ozone/demo/gl_renderer.h"
@@ -35,12 +36,13 @@ const char kDisableGpu[] = "disable-gpu";
const char kEnableVulkan[] = "enable-vulkan";
#endif
-scoped_refptr<gl::GLSurface> CreateGLSurface(gfx::AcceleratedWidget widget) {
+scoped_refptr<gl::GLSurface> CreateGLSurface(gl::GLDisplay* display,
+ gfx::AcceleratedWidget widget) {
scoped_refptr<gl::GLSurface> surface;
if (!base::CommandLine::ForCurrentProcess()->HasSwitch(kDisableSurfaceless))
- surface = gl::init::CreateSurfacelessViewGLSurface(widget);
+ surface = gl::init::CreateSurfacelessViewGLSurface(display, widget);
if (!surface)
- surface = gl::init::CreateViewGLSurface(widget);
+ surface = gl::init::CreateViewGLSurface(display, widget);
return surface;
}
@@ -48,7 +50,12 @@ scoped_refptr<gl::GLSurface> CreateGLSurface(gfx::AcceleratedWidget widget) {
SimpleRendererFactory::SimpleRendererFactory() {}
-SimpleRendererFactory::~SimpleRendererFactory() {}
+SimpleRendererFactory::~SimpleRendererFactory() {
+ if (display_) {
+ gl::init::ShutdownGL(display_, false);
+ display_ = nullptr;
+ }
+}
bool SimpleRendererFactory::Initialize() {
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
@@ -65,9 +72,13 @@ bool SimpleRendererFactory::Initialize() {
}
}
#endif
- if (!command_line->HasSwitch(kDisableGpu) &&
- gl::init::InitializeGLOneOff(/*system_device_id=*/0)) {
- type_ = GL;
+ if (!command_line->HasSwitch(kDisableGpu)) {
+ display_ = gl::init::InitializeGLOneOff(/*system_device_id=*/0);
+ if (display_) {
+ type_ = GL;
+ } else {
+ type_ = SOFTWARE;
+ }
} else {
type_ = SOFTWARE;
}
@@ -84,7 +95,7 @@ std::unique_ptr<Renderer> SimpleRendererFactory::CreateRenderer(
surface_factory_ozone->CreatePlatformWindowSurface(widget);
switch (type_) {
case GL: {
- scoped_refptr<gl::GLSurface> surface = CreateGLSurface(widget);
+ scoped_refptr<gl::GLSurface> surface = CreateGLSurface(display_, widget);
if (!surface)
LOG(FATAL) << "Failed to create GL surface";
if (surface->IsSurfaceless()) {
diff --git a/chromium/ui/ozone/demo/simple_renderer_factory.h b/chromium/ui/ozone/demo/simple_renderer_factory.h
index eb1ef76e435..94a1b23bc17 100644
--- a/chromium/ui/ozone/demo/simple_renderer_factory.h
+++ b/chromium/ui/ozone/demo/simple_renderer_factory.h
@@ -14,6 +14,10 @@
#include "gpu/vulkan/vulkan_implementation.h"
#endif
+namespace gl {
+class GLDisplay;
+};
+
namespace ui {
class SimpleRendererFactory : public RendererFactory {
@@ -43,6 +47,7 @@ class SimpleRendererFactory : public RendererFactory {
#endif
RendererType type_ = SOFTWARE;
+ gl::GLDisplay* display_ = nullptr;
};
} // namespace ui
diff --git a/chromium/ui/ozone/demo/skia/skia_gl_renderer.cc b/chromium/ui/ozone/demo/skia/skia_gl_renderer.cc
index 3c464fe0db2..56812316ba4 100644
--- a/chromium/ui/ozone/demo/skia/skia_gl_renderer.cc
+++ b/chromium/ui/ozone/demo/skia/skia_gl_renderer.cc
@@ -19,6 +19,7 @@
#include "third_party/skia/include/gpu/GrBackendSurface.h"
#include "third_party/skia/include/gpu/gl/GrGLAssembleInterface.h"
#include "third_party/skia/include/gpu/gl/GrGLInterface.h"
+#include "ui/gfx/color_space.h"
#include "ui/gfx/gpu_fence.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_context.h"
diff --git a/chromium/ui/ozone/demo/skia/skia_renderer_factory.cc b/chromium/ui/ozone/demo/skia/skia_renderer_factory.cc
index bbad1dff348..812e50db53e 100644
--- a/chromium/ui/ozone/demo/skia/skia_renderer_factory.cc
+++ b/chromium/ui/ozone/demo/skia/skia_renderer_factory.cc
@@ -9,6 +9,7 @@
#include "base/command_line.h"
#include "base/logging.h"
+#include "ui/gl/gl_display.h"
#include "ui/gl/gl_surface.h"
#include "ui/gl/init/gl_factory.h"
#include "ui/ozone/demo/skia/skia_gl_renderer.h"
@@ -22,12 +23,13 @@ namespace {
const char kDisableSurfaceless[] = "disable-surfaceless";
-scoped_refptr<gl::GLSurface> CreateGLSurface(gfx::AcceleratedWidget widget) {
+scoped_refptr<gl::GLSurface> CreateGLSurface(gl::GLDisplay* display,
+ gfx::AcceleratedWidget widget) {
scoped_refptr<gl::GLSurface> surface;
if (!base::CommandLine::ForCurrentProcess()->HasSwitch(kDisableSurfaceless))
- surface = gl::init::CreateSurfacelessViewGLSurface(widget);
+ surface = gl::init::CreateSurfacelessViewGLSurface(display, widget);
if (!surface)
- surface = gl::init::CreateViewGLSurface(widget);
+ surface = gl::init::CreateViewGLSurface(display, widget);
return surface;
}
@@ -35,10 +37,16 @@ scoped_refptr<gl::GLSurface> CreateGLSurface(gfx::AcceleratedWidget widget) {
SkiaRendererFactory::SkiaRendererFactory() {}
-SkiaRendererFactory::~SkiaRendererFactory() {}
+SkiaRendererFactory::~SkiaRendererFactory() {
+ if (display_) {
+ gl::init::ShutdownGL(display_, false);
+ display_ = nullptr;
+ }
+}
bool SkiaRendererFactory::Initialize() {
- if (!gl::init::InitializeGLOneOff(/*system_device_id=*/0)) {
+ display_ = gl::init::InitializeGLOneOff(/*system_device_id=*/0);
+ if (!display_) {
LOG(FATAL) << "Failed to initialize GL";
}
@@ -52,7 +60,7 @@ std::unique_ptr<Renderer> SkiaRendererFactory::CreateRenderer(
OzonePlatform::GetInstance()->GetSurfaceFactoryOzone();
auto window_surface =
surface_factory_ozone->CreatePlatformWindowSurface(widget);
- scoped_refptr<gl::GLSurface> gl_surface = CreateGLSurface(widget);
+ scoped_refptr<gl::GLSurface> gl_surface = CreateGLSurface(display_, widget);
if (!gl_surface)
LOG(FATAL) << "Failed to create GL surface";
if (gl_surface->IsSurfaceless()) {
diff --git a/chromium/ui/ozone/demo/skia/skia_renderer_factory.h b/chromium/ui/ozone/demo/skia/skia_renderer_factory.h
index 96688375d99..372382d2014 100644
--- a/chromium/ui/ozone/demo/skia/skia_renderer_factory.h
+++ b/chromium/ui/ozone/demo/skia/skia_renderer_factory.h
@@ -11,6 +11,10 @@
#include "ui/gfx/native_widget_types.h"
#include "ui/ozone/demo/renderer_factory.h"
+namespace gl {
+class GLDisplay;
+};
+
namespace ui {
class Renderer;
@@ -32,6 +36,9 @@ class SkiaRendererFactory : public RendererFactory {
bool Initialize() override;
std::unique_ptr<Renderer> CreateRenderer(gfx::AcceleratedWidget widget,
const gfx::Size& size) override;
+
+ private:
+ gl::GLDisplay* display_ = nullptr;
};
} // namespace ui
diff --git a/chromium/ui/ozone/demo/surfaceless_gl_renderer.cc b/chromium/ui/ozone/demo/surfaceless_gl_renderer.cc
index 0c8db95634b..d44e70b688b 100644
--- a/chromium/ui/ozone/demo/surfaceless_gl_renderer.cc
+++ b/chromium/ui/ozone/demo/surfaceless_gl_renderer.cc
@@ -21,7 +21,6 @@
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_context.h"
#include "ui/gl/gl_fence.h"
-#include "ui/gl/gl_image.h"
#include "ui/gl/gl_image_native_pixmap.h"
#include "ui/gl/gl_surface.h"
#include "ui/gl/init/gl_factory.h"
diff --git a/chromium/ui/ozone/demo/vulkan_overlay_renderer.h b/chromium/ui/ozone/demo/vulkan_overlay_renderer.h
index 86e5e1b1b22..3fec3aecd33 100644
--- a/chromium/ui/ozone/demo/vulkan_overlay_renderer.h
+++ b/chromium/ui/ozone/demo/vulkan_overlay_renderer.h
@@ -8,6 +8,7 @@
#include <vulkan/vulkan_core.h>
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "ui/gfx/buffer_types.h"
@@ -114,8 +115,8 @@ class VulkanOverlayRenderer : public RendererBase {
std::unique_ptr<PlatformWindowSurface> window_surface_;
- SurfaceFactoryOzone* const surface_factory_ozone_;
- gpu::VulkanImplementation* const vulkan_implementation_;
+ const raw_ptr<SurfaceFactoryOzone> surface_factory_ozone_;
+ const raw_ptr<gpu::VulkanImplementation> vulkan_implementation_;
std::unique_ptr<gpu::VulkanDeviceQueue> device_queue_;
std::unique_ptr<gpu::VulkanCommandPool> command_pool_;
std::unique_ptr<OverlaySurface> overlay_surface_;
diff --git a/chromium/ui/ozone/demo/vulkan_renderer.h b/chromium/ui/ozone/demo/vulkan_renderer.h
index dfc362b280c..4133f3a3496 100644
--- a/chromium/ui/ozone/demo/vulkan_renderer.h
+++ b/chromium/ui/ozone/demo/vulkan_renderer.h
@@ -10,6 +10,7 @@
#include <memory>
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "ui/gfx/buffer_types.h"
@@ -81,7 +82,7 @@ class VulkanRenderer : public RendererBase {
std::vector<std::unique_ptr<Framebuffer>> framebuffers_;
- gpu::VulkanImplementation* const vulkan_implementation_;
+ const raw_ptr<gpu::VulkanImplementation> vulkan_implementation_;
std::unique_ptr<gpu::VulkanDeviceQueue> device_queue_;
std::unique_ptr<gpu::VulkanCommandPool> command_pool_;
std::unique_ptr<gpu::VulkanSurface> vulkan_surface_;
diff --git a/chromium/ui/ozone/demo/window_manager.cc b/chromium/ui/ozone/demo/window_manager.cc
index d99ec80bd5e..a3dd47847c1 100644
--- a/chromium/ui/ozone/demo/window_manager.cc
+++ b/chromium/ui/ozone/demo/window_manager.cc
@@ -96,7 +96,8 @@ void WindowManager::OnDisplaysAcquired(
config_request,
base::BindOnce(&WindowManager::OnDisplayConfigured,
base::Unretained(this), display->display_id(),
- gfx::Rect(origin, display->native_mode()->size())));
+ gfx::Rect(origin, display->native_mode()->size())),
+ display::kTestModeset | display::kCommitModeset);
origin.Offset(display->native_mode()->size().width(), 0);
}
is_configuring_ = false;
diff --git a/chromium/ui/ozone/gl/gl_image_ozone_native_pixmap_unittest.cc b/chromium/ui/ozone/gl/gl_image_ozone_native_pixmap_unittest.cc
index 0bd8223bbcc..0cd79d34583 100644
--- a/chromium/ui/ozone/gl/gl_image_ozone_native_pixmap_unittest.cc
+++ b/chromium/ui/ozone/gl/gl_image_ozone_native_pixmap_unittest.cc
@@ -89,15 +89,7 @@ using GLImageScanoutType = testing::Types<
GLImageNativePixmapTestDelegate<gfx::BufferUsage::SCANOUT,
gfx::BufferFormat::BGRA_8888>>;
-#if BUILDFLAG(IS_CHROMEOS)
-// Disabled due to failures on ChromeOS MSan builder.
-// TODO(crbug.com/1314304) Reenable the test.
-#define MAYBE_GLImageNativePixmapScanoutBGRA \
- DISABLED_GLImageNativePixmapScanoutBGRA
-#else
-#define MAYBE_GLImageNativePixmapScanoutBGRA GLImageNativePixmapScanoutBGRA
-#endif
-INSTANTIATE_TYPED_TEST_SUITE_P(MAYBE_GLImageNativePixmapScanoutBGRA,
+INSTANTIATE_TYPED_TEST_SUITE_P(GLImageNativePixmapScanoutBGRA,
GLImageTest,
GLImageScanoutType);
diff --git a/chromium/ui/ozone/platform/README b/chromium/ui/ozone/platform/README
index cc91d3b7ead..70ca9c1bb3c 100644
--- a/chromium/ui/ozone/platform/README
+++ b/chromium/ui/ozone/platform/README
@@ -1,2 +1,4 @@
This directory contains implementations of platforms. Each platform implements
the interfaces from ui/ozone/public for the rest of chromium.
+
+See docs/ozone_overview.md for details.
diff --git a/chromium/ui/ozone/platform/cast/gl_ozone_egl_cast.cc b/chromium/ui/ozone/platform/cast/gl_ozone_egl_cast.cc
index 779f213652e..42a05a82c68 100644
--- a/chromium/ui/ozone/platform/cast/gl_ozone_egl_cast.cc
+++ b/chromium/ui/ozone/platform/cast/gl_ozone_egl_cast.cc
@@ -87,18 +87,21 @@ void GLOzoneEglCast::TerminateDisplay() {
}
scoped_refptr<gl::GLSurface> GLOzoneEglCast::CreateViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget widget) {
// Verify requested widget dimensions match our current display size.
DCHECK_EQ(static_cast<int>(widget >> 16), display_size_.width());
DCHECK_EQ(static_cast<int>(widget & 0xffff), display_size_.height());
- return gl::InitializeGLSurface(new GLSurfaceCast(widget, this));
+ return gl::InitializeGLSurface(
+ new GLSurfaceCast(display->GetAs<gl::GLDisplayEGL>(), widget, this));
}
scoped_refptr<gl::GLSurface> GLOzoneEglCast::CreateOffscreenGLSurface(
+ gl::GLDisplay* display,
const gfx::Size& size) {
return gl::InitializeGLSurface(
- new gl::PbufferGLSurfaceEGL(gl::GLSurfaceEGL::GetGLDisplayEGL(), size));
+ new gl::PbufferGLSurfaceEGL(display->GetAs<gl::GLDisplayEGL>(), size));
}
gl::EGLDisplayPlatform GLOzoneEglCast::GetNativeDisplay() {
diff --git a/chromium/ui/ozone/platform/cast/gl_ozone_egl_cast.h b/chromium/ui/ozone/platform/cast/gl_ozone_egl_cast.h
index 0fe5369237d..b5e77f7f4b4 100644
--- a/chromium/ui/ozone/platform/cast/gl_ozone_egl_cast.h
+++ b/chromium/ui/ozone/platform/cast/gl_ozone_egl_cast.h
@@ -32,8 +32,10 @@ class GLOzoneEglCast : public GLOzoneEGL {
// GLOzoneEGL implementation:
scoped_refptr<gl::GLSurface> CreateViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget widget) override;
scoped_refptr<gl::GLSurface> CreateOffscreenGLSurface(
+ gl::GLDisplay* display,
const gfx::Size& size) override;
gl::EGLDisplayPlatform GetNativeDisplay() override;
bool LoadGLES2Bindings(
diff --git a/chromium/ui/ozone/platform/cast/gl_surface_cast.cc b/chromium/ui/ozone/platform/cast/gl_surface_cast.cc
index 80eccd27178..0db51672684 100644
--- a/chromium/ui/ozone/platform/cast/gl_surface_cast.cc
+++ b/chromium/ui/ozone/platform/cast/gl_surface_cast.cc
@@ -43,10 +43,11 @@ base::TimeDelta GetVSyncInterval() {
namespace ui {
-GLSurfaceCast::GLSurfaceCast(gfx::AcceleratedWidget widget,
+GLSurfaceCast::GLSurfaceCast(gl::GLDisplayEGL* display,
+ gfx::AcceleratedWidget widget,
GLOzoneEglCast* parent)
: NativeViewGLSurfaceEGL(
- GLSurfaceEGL::GetGLDisplayEGL(),
+ display,
parent->GetNativeWindow(),
std::make_unique<gfx::FixedVSyncProvider>(base::TimeTicks(),
GetVSyncInterval())),
diff --git a/chromium/ui/ozone/platform/cast/gl_surface_cast.h b/chromium/ui/ozone/platform/cast/gl_surface_cast.h
index c5339ba4f6a..663d32117a2 100644
--- a/chromium/ui/ozone/platform/cast/gl_surface_cast.h
+++ b/chromium/ui/ozone/platform/cast/gl_surface_cast.h
@@ -12,7 +12,6 @@
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/overlay_transform.h"
#include "ui/gfx/swap_result.h"
-#include "ui/gl/gl_image.h"
#include "ui/gl/gl_surface_egl.h"
namespace ui {
@@ -21,7 +20,9 @@ class GLOzoneEglCast;
class GLSurfaceCast : public gl::NativeViewGLSurfaceEGL {
public:
- GLSurfaceCast(gfx::AcceleratedWidget widget, GLOzoneEglCast* parent);
+ GLSurfaceCast(gl::GLDisplayEGL* display,
+ gfx::AcceleratedWidget widget,
+ GLOzoneEglCast* parent);
GLSurfaceCast(const GLSurfaceCast&) = delete;
GLSurfaceCast& operator=(const GLSurfaceCast&) = delete;
diff --git a/chromium/ui/ozone/platform/cast/ozone_platform_cast.cc b/chromium/ui/ozone/platform/cast/ozone_platform_cast.cc
index 741bf0ed4bf..fd72c4d54ed 100644
--- a/chromium/ui/ozone/platform/cast/ozone_platform_cast.cc
+++ b/chromium/ui/ozone/platform/cast/ozone_platform_cast.cc
@@ -113,9 +113,9 @@ class OzonePlatformCast : public OzonePlatform {
return nullptr;
}
std::unique_ptr<InputMethod> CreateInputMethod(
- internal::InputMethodDelegate* delegate,
+ ImeKeyEventDispatcher* ime_key_event_dispatcher,
gfx::AcceleratedWidget) override {
- return std::make_unique<InputMethodMinimal>(delegate);
+ return std::make_unique<InputMethodMinimal>(ime_key_event_dispatcher);
}
bool IsNativePixmapConfigSupported(gfx::BufferFormat format,
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_device.cc b/chromium/ui/ozone/platform/drm/gpu/drm_device.cc
index 198c26fd0b1..874f59b9ec3 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_device.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_device.cc
@@ -678,4 +678,8 @@ bool DrmDevice::SetGammaRamp(
&g[0], &b[0]) == 0);
}
+absl::optional<std::string> DrmDevice::GetDriverName() const {
+ return GetDrmDriverNameFromFd(file_.GetPlatformFile());
+}
+
} // namespace ui
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_device.h b/chromium/ui/ozone/platform/drm/gpu/drm_device.h
index b6ee3ac71ea..62ba89a6420 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_device.h
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_device.h
@@ -230,6 +230,8 @@ class DrmDevice : public base::RefCountedThreadSafe<DrmDevice> {
virtual bool SetGammaRamp(uint32_t crtc_id,
const std::vector<display::GammaRampRGBEntry>& lut);
+ virtual absl::optional<std::string> GetDriverName() const;
+
// Drm master related
virtual bool SetMaster();
virtual bool DropMaster();
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.cc b/chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.cc
index 795834090c2..54c70e6e905 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.cc
@@ -266,7 +266,8 @@ bool DrmGpuDisplayManager::ShouldDisplayEventTriggerConfiguration(
}
bool DrmGpuDisplayManager::ConfigureDisplays(
- const std::vector<display::DisplayConfigurationParams>& config_requests) {
+ const std::vector<display::DisplayConfigurationParams>& config_requests,
+ uint32_t modeset_flag) {
ScreenManager::ControllerConfigsList controllers_to_configure;
for (const auto& config : config_requests) {
int64_t display_id = config.id;
@@ -293,17 +294,16 @@ bool DrmGpuDisplayManager::ConfigureDisplays(
controllers_to_configure.push_back(std::move(params));
}
- bool config_success =
- screen_manager_->ConfigureDisplayControllers(controllers_to_configure);
+ bool config_success = screen_manager_->ConfigureDisplayControllers(
+ controllers_to_configure, modeset_flag);
- if (displays_configured_callback_) {
+ if (displays_configured_callback_)
displays_configured_callback_.Run();
- }
- for (const auto& controller : controllers_to_configure) {
- if (config_success) {
+ const bool test_only = modeset_flag == display::kTestModeset;
+ if (!test_only && config_success) {
+ for (const auto& controller : controllers_to_configure)
FindDisplay(controller.display_id)->SetOrigin(controller.origin);
- }
}
return config_success;
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h b/chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h
index 8bc7f5cc66d..75d65c20c13 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h
@@ -60,7 +60,8 @@ class DrmGpuDisplayManager {
const EventPropertyMap& event_props);
bool ConfigureDisplays(
- const std::vector<display::DisplayConfigurationParams>& config_requests);
+ const std::vector<display::DisplayConfigurationParams>& config_requests,
+ uint32_t modeset_flag);
bool GetHDCPState(int64_t display_id,
display::HDCPState* state,
display::ContentProtectionMethod* protection_method);
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_overlay_manager.cc b/chromium/ui/ozone/platform/drm/gpu/drm_overlay_manager.cc
index f803e30d8c0..5292429434a 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_overlay_manager.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_overlay_manager.cc
@@ -91,9 +91,54 @@ void DrmOverlayManager::CheckOverlaySupport(
return;
}
+ struct OverlayReindexZOrder {
+ size_t index;
+ int plane_z_order;
+ };
+
+ std::vector<OverlayReindexZOrder> overlay_reindex;
+ for (size_t i = 0; i < candidates->size(); i++) {
+ overlay_reindex.emplace_back(
+ (OverlayReindexZOrder{i, (*candidates)[i].plane_z_order}));
+ }
+ // Create a mapping for sorted z order to candidate index.
+ std::sort(overlay_reindex.begin(), overlay_reindex.end(),
+ [](const auto& a, const auto& b) {
+ return a.plane_z_order > b.plane_z_order;
+ });
+
+ // Active |display_rect| occluders that have a clip. This list is in z plane
+ // order.
+ std::vector<gfx::RectF> display_rect_with_clip;
+ // List of underlays that have failed by being occluded by an underlay with a
+ // clip rect. This list is in |candidate| ordering.
+ std::vector<bool> underlay_fail_clip;
+ underlay_fail_clip.resize(candidates->size());
+ for (auto& reindex : overlay_reindex) {
+ const auto& candidate = (*candidates)[reindex.index];
+
+ if (candidate.plane_z_order < 0) {
+ for (auto& rect : display_rect_with_clip) {
+ if (rect.Intersects(candidate.display_rect)) {
+ underlay_fail_clip[reindex.index] = true;
+ break;
+ }
+ }
+ }
+
+ if (candidate.plane_z_order < 0 && candidate.clip_rect &&
+ !gfx::RectF(*candidate.clip_rect).Contains(candidate.display_rect)) {
+ // This underlay has a clip that is incompatible with all future
+ // intersecting underlays.
+ display_rect_with_clip.emplace_back(candidate.display_rect);
+ }
+ }
+
std::vector<OverlaySurfaceCandidate> result_candidates;
- for (auto& candidate : *candidates) {
- bool can_handle = CanHandleCandidate(candidate, widget);
+ for (size_t i = 0; i < candidates->size(); i++) {
+ auto& candidate = (*candidates)[i];
+ bool can_handle =
+ !underlay_fail_clip[i] && CanHandleCandidate(candidate, widget);
// CanHandleCandidate() should never return false if the candidate is
// the primary plane.
@@ -202,8 +247,9 @@ bool DrmOverlayManager::CanHandleCandidate(
return false;
}
- if (candidate.clip_rect && !candidate.clip_rect->Contains(
- gfx::ToNearestRect(candidate.display_rect))) {
+ if (candidate.plane_z_order >= 0 && candidate.clip_rect &&
+ !candidate.clip_rect->Contains(
+ gfx::ToNearestRect(candidate.display_rect))) {
VLOG(3) << "Overlay Rejected: clip_rect=" << candidate.clip_rect->ToString()
<< ", display_rect=" << candidate.display_rect.ToString();
return false;
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_overlay_manager_unittest.cc b/chromium/ui/ozone/platform/drm/gpu/drm_overlay_manager_unittest.cc
index 47784e5fe9b..f158d8f0769 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_overlay_manager_unittest.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_overlay_manager_unittest.cc
@@ -364,4 +364,67 @@ TEST(DrmOverlayManagerTest, ObservingHardwareCapabilities) {
EXPECT_EQ(secondary_calls, 4);
}
+TEST(DrmOverlayManagerTest, SingleClipRectUnderlaySupport) {
+ TestDrmOverlayManager manager;
+
+ // Candidates for output surface and underlay quad.
+ std::vector<OverlaySurfaceCandidate> candidates = {
+ CreateCandidate(gfx::Rect(0, 0, 100, 100), 0),
+ CreateCandidate(gfx::Rect(10, 10, 20, 20), -1)};
+
+ // Set a clip rect that imposes a restriction on |display_rect|.
+ candidates[1].clip_rect = gfx::Rect(10, 10, 15, 15);
+
+ for (int i = 0; i < 4; i++)
+ manager.CheckOverlaySupport(&candidates, kPrimaryWidget);
+
+ EXPECT_EQ(manager.requests().size(), 1u);
+ EXPECT_TRUE(manager.requests()[0][1].overlay_handled);
+
+ manager.requests().clear();
+ // Now make the overlay candidate a single-on-top overlay. Single-on-top
+ // overlays with restrictive clip rects are not supported.
+ candidates[1].plane_z_order = 1;
+ for (int i = 0; i < 4; i++)
+ manager.CheckOverlaySupport(&candidates, kPrimaryWidget);
+
+ EXPECT_EQ(manager.requests().size(), 1u);
+ EXPECT_FALSE(manager.requests()[0][1].overlay_handled);
+}
+
+TEST(DrmOverlayManagerTest, MultiClipRectUnderlaySupport) {
+ TestDrmOverlayManager manager;
+
+ // Two underlay quads who's |display_rect| overlap. The order here is
+ // important; even though the -2 underlay comes first in the list it will be
+ // occluded by the -1 underlay and when -1 clipped the -2 underlay should
+ // fail.
+ std::vector<OverlaySurfaceCandidate> candidates = {
+ CreateCandidate(gfx::Rect(0, 0, 100, 100), 0),
+ CreateCandidate(gfx::Rect(10, 10, 20, 20), -2),
+ CreateCandidate(gfx::Rect(20, 20, 20, 20), -1)};
+
+ // Set a clip rect that imposes a restriction on |display_rect|.
+ candidates[1].clip_rect = gfx::Rect(10, 10, 15, 15);
+ candidates[2].clip_rect = gfx::Rect(20, 20, 15, 15);
+
+ for (int i = 0; i < 4; i++)
+ manager.CheckOverlaySupport(&candidates, kPrimaryWidget);
+
+ EXPECT_EQ(manager.requests().size(), 1u);
+ EXPECT_FALSE(manager.requests()[0][1].overlay_handled);
+ EXPECT_TRUE(manager.requests()[0][2].overlay_handled);
+
+ manager.requests().clear();
+ // Now remove the clipping constraint on the -1 underlay which should allow
+ // the -2 underlay to be handled.
+ candidates[2].clip_rect = gfx::Rect(20, 20, 50, 50);
+ for (int i = 0; i < 4; i++)
+ manager.CheckOverlaySupport(&candidates, kPrimaryWidget);
+
+ EXPECT_EQ(manager.requests().size(), 1u);
+ EXPECT_TRUE(manager.requests()[0][1].overlay_handled);
+ EXPECT_TRUE(manager.requests()[0][2].overlay_handled);
+}
+
} // namespace ui
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc b/chromium/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc
index 5a84f9565fe..96ed4bc1bc2 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc
@@ -236,7 +236,8 @@ void DrmOverlayValidatorTest::SetupControllers() {
controllers_to_enable.emplace_back(
1 /*display_id*/, drm_, kCrtcIdBase, kConnectorIdBase, gfx::Point(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
drm_device_manager_ = std::make_unique<ui::DrmDeviceManager>(nullptr);
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_thread.cc b/chromium/ui/ozone/platform/drm/gpu/drm_thread.cc
index c1144893c17..46488b1db3c 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_thread.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_thread.cc
@@ -91,7 +91,7 @@ void DrmThread::Start(base::OnceClosure receiver_completer,
base::Thread::Options thread_options;
thread_options.message_pump_type = base::MessagePumpType::IO;
- thread_options.priority = base::ThreadPriority::DISPLAY;
+ thread_options.thread_type = base::ThreadType::kDisplayCritical;
if (!StartWithOptions(std::move(thread_options)))
LOG(FATAL) << "Failed to create DRM thread";
@@ -390,10 +390,12 @@ void DrmThread::RefreshNativeDisplays(
void DrmThread::ConfigureNativeDisplays(
const std::vector<display::DisplayConfigurationParams>& config_requests,
+ uint32_t modeset_flag,
base::OnceCallback<void(bool)> callback) {
TRACE_EVENT0("drm", "DrmThread::ConfigureNativeDisplays");
- bool config_success = display_manager_->ConfigureDisplays(config_requests);
+ bool config_success =
+ display_manager_->ConfigureDisplays(config_requests, modeset_flag);
std::move(callback).Run(config_success);
}
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_thread.h b/chromium/ui/ozone/platform/drm/gpu/drm_thread.h
index 44a2262cc38..08e054525f9 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_thread.h
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_thread.h
@@ -161,6 +161,7 @@ class DrmThread : public base::Thread,
void RemoveGraphicsDevice(const base::FilePath& path) override;
void ConfigureNativeDisplays(
const std::vector<display::DisplayConfigurationParams>& config_requests,
+ uint32_t modeset_flag,
ConfigureNativeDisplaysCallback callback) override;
void GetHDCPState(int64_t display_id,
base::OnceCallback<void(int64_t,
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_window_unittest.cc b/chromium/ui/ozone/platform/drm/gpu/drm_window_unittest.cc
index 6419ab2610b..76d2e37d3ca 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_window_unittest.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_window_unittest.cc
@@ -136,7 +136,8 @@ void DrmWindowTest::SetUp() {
controllers_to_enable.emplace_back(
1 /*display_id*/, drm_, kDefaultCrtc, kDefaultConnector, gfx::Point(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
drm_device_manager_ = std::make_unique<ui::DrmDeviceManager>(nullptr);
@@ -296,7 +297,8 @@ TEST_F(DrmWindowTest, CheckCursorSurfaceAfterChangingDevice) {
2 /*display_id*/, drm, kDefaultCrtc, kDefaultConnector,
gfx::Point(0, kDefaultMode.vdisplay),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
// Move window to the display on the new device.
screen_manager_->GetWindow(kDefaultWidgetHandle)
diff --git a/chromium/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc b/chromium/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc
index 53d3b18c55c..648759c93ce 100644
--- a/chromium/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc
@@ -26,6 +26,7 @@
#include "ui/gl/gl_surface_egl.h"
#include "ui/ozone/common/egl_util.h"
#include "ui/ozone/common/gl_ozone_egl.h"
+#include "ui/ozone/common/native_pixmap_egl_binding.h"
#include "ui/ozone/platform/drm/common/drm_util.h"
#include "ui/ozone/platform/drm/common/scoped_drm_types.h"
#include "ui/ozone/platform/drm/gpu/drm_gpu_util.h"
@@ -113,24 +114,45 @@ class GLOzoneEGLGbm : public GLOzoneEGL {
~GLOzoneEGLGbm() override {}
+ bool CanImportNativePixmap() override {
+ return gl::GLSurfaceEGL::GetGLDisplayEGL()
+ ->ext->b_EGL_EXT_image_dma_buf_import;
+ }
+
+ std::unique_ptr<NativePixmapGLBinding> ImportNativePixmap(
+ scoped_refptr<gfx::NativePixmap> pixmap,
+ gfx::BufferFormat plane_format,
+ gfx::BufferPlane plane,
+ gfx::Size plane_size,
+ const gfx::ColorSpace& color_space,
+ GLenum target,
+ GLuint texture_id) override {
+ return NativePixmapEGLBinding::Create(pixmap, plane_format, plane,
+ plane_size, color_space, target,
+ texture_id);
+ }
+
scoped_refptr<gl::GLSurface> CreateViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget window) override {
return nullptr;
}
scoped_refptr<gl::GLSurface> CreateSurfacelessViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget window) override {
return gl::InitializeGLSurface(new GbmSurfaceless(
- surface_factory_, drm_thread_proxy_->CreateDrmWindowProxy(window),
- window));
+ surface_factory_, display->GetAs<gl::GLDisplayEGL>(),
+ drm_thread_proxy_->CreateDrmWindowProxy(window), window));
}
scoped_refptr<gl::GLSurface> CreateOffscreenGLSurface(
+ gl::GLDisplay* display,
const gfx::Size& size) override {
DCHECK_EQ(size.width(), 0);
DCHECK_EQ(size.height(), 0);
return gl::InitializeGLSurface(
- new gl::SurfacelessEGL(gl::GLSurfaceEGL::GetGLDisplayEGL(), size));
+ new gl::SurfacelessEGL(display->GetAs<gl::GLDisplayEGL>(), size));
}
protected:
@@ -141,15 +163,14 @@ class GLOzoneEGLGbm : public GLOzoneEGL {
// Default to null platform
native_display_ = gl::EGLDisplayPlatform(EGL_DEFAULT_DISPLAY);
- gl::g_driver_egl.ext.InitializeClientExtensionSettings();
- if (gl::g_driver_egl.ext.b_EGL_MESA_platform_surfaceless) {
+ if (gl::g_driver_egl.client_ext.b_EGL_MESA_platform_surfaceless) {
native_display_ = gl::EGLDisplayPlatform(EGL_DEFAULT_DISPLAY,
EGL_PLATFORM_SURFACELESS_MESA);
}
- if (!(gl::g_driver_egl.ext.b_EGL_EXT_device_query &&
- gl::g_driver_egl.ext.b_EGL_EXT_platform_device &&
- gl::g_driver_egl.ext.b_EGL_EXT_device_enumeration)) {
+ if (!(gl::g_driver_egl.client_ext.b_EGL_EXT_device_query &&
+ gl::g_driver_egl.client_ext.b_EGL_EXT_platform_device &&
+ gl::g_driver_egl.client_ext.b_EGL_EXT_device_enumeration)) {
LOG(WARNING) << "Platform device extensions not found.";
return native_display_;
}
diff --git a/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc b/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc
index 43cb0c2d3be..e12811fc64e 100644
--- a/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc
@@ -38,16 +38,16 @@ void WaitForFence(EGLDisplay display, EGLSyncKHR fence) {
} // namespace
GbmSurfaceless::GbmSurfaceless(GbmSurfaceFactory* surface_factory,
+ gl::GLDisplayEGL* display,
std::unique_ptr<DrmWindowProxy> window,
gfx::AcceleratedWidget widget)
- : SurfacelessEGL(gl::GLSurfaceEGL::GetGLDisplayEGL(), gfx::Size()),
+ : SurfacelessEGL(display, gfx::Size()),
surface_factory_(surface_factory),
window_(std::move(window)),
widget_(widget),
has_implicit_external_sync_(
- GetGLDisplayEGL()->HasEGLExtension("EGL_ARM_implicit_external_sync")),
- has_image_flush_external_(
- GetGLDisplayEGL()->HasEGLExtension("EGL_EXT_image_flush_external")) {
+ display->ext->b_EGL_ARM_implicit_external_sync),
+ has_image_flush_external_(display->ext->b_EGL_EXT_image_flush_external) {
surface_factory_->RegisterSurface(window_->widget(), this);
supports_plane_gpu_fences_ = window_->SupportsGpuFences();
unsubmitted_frames_.push_back(std::make_unique<PendingFrame>());
diff --git a/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.h b/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.h
index 0025fa45396..558ab79c7e8 100644
--- a/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.h
+++ b/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.h
@@ -33,6 +33,7 @@ class GbmSurfaceFactory;
class GbmSurfaceless : public gl::SurfacelessEGL {
public:
GbmSurfaceless(GbmSurfaceFactory* surface_factory,
+ gl::GLDisplayEGL* display,
std::unique_ptr<DrmWindowProxy> window,
gfx::AcceleratedWidget widget);
diff --git a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.cc b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.cc
index ec1dfb5ffc0..48fa8c809a5 100644
--- a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.cc
@@ -522,6 +522,10 @@ void HardwareDisplayPlaneManager::ResetModesetStateForCrtc(uint32_t crtc_id) {
ui::HardwareCapabilities HardwareDisplayPlaneManager::GetHardwareCapabilities(
uint32_t crtc_id) {
+ absl::optional<std::string> driver = drm_->GetDriverName();
+ if (!driver.has_value())
+ return {.is_valid = false};
+
ui::HardwareCapabilities hc;
hc.is_valid = true;
hc.num_overlay_capable_planes = std::count_if(
@@ -530,6 +534,12 @@ ui::HardwareCapabilities HardwareDisplayPlaneManager::GetHardwareCapabilities(
return plane->type() != DRM_PLANE_TYPE_CURSOR &&
plane->CanUseForCrtcId(crtc_id);
});
+ // While AMD advertises a cursor plane, it's actually a "fake" plane that the
+ // display hardware blits to the topmost plane at presentation time. If that
+ // topmost plane is scaled/translated (e.g. video), the cursor will then be
+ // transformed along with it, leading to an incorrect cursor location in the
+ // final presentation. For more info, see b/194335274.
+ hc.has_independent_cursor_plane = *driver != "amdgpu" && *driver != "radeon";
return hc;
}
diff --git a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc
index 281ebfa9b9f..061a4a7978f 100644
--- a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc
@@ -1224,6 +1224,22 @@ TEST_P(HardwareDisplayPlaneManagerTest, GetHardwareCapabilities) {
}
EXPECT_EQ(hc.num_overlay_capable_planes, expected_planes);
}
+
+ {
+ fake_drm_->SetDriverName(absl::nullopt);
+ auto hc = fake_drm_->plane_manager()->GetHardwareCapabilities(kCrtcIdBase);
+ EXPECT_FALSE(hc.is_valid);
+
+ fake_drm_->SetDriverName("amdgpu");
+ hc = fake_drm_->plane_manager()->GetHardwareCapabilities(kCrtcIdBase);
+ EXPECT_TRUE(hc.is_valid);
+ EXPECT_FALSE(hc.has_independent_cursor_plane);
+
+ fake_drm_->SetDriverName("generic");
+ hc = fake_drm_->plane_manager()->GetHardwareCapabilities(kCrtcIdBase);
+ EXPECT_TRUE(hc.is_valid);
+ EXPECT_TRUE(hc.has_independent_cursor_plane);
+ }
}
INSTANTIATE_TEST_SUITE_P(All,
diff --git a/chromium/ui/ozone/platform/drm/gpu/mock_drm_device.cc b/chromium/ui/ozone/platform/drm/gpu/mock_drm_device.cc
index 6501e9a0906..dc1a784ec5c 100644
--- a/chromium/ui/ozone/platform/drm/gpu/mock_drm_device.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/mock_drm_device.cc
@@ -37,7 +37,6 @@ struct _drmModeAtomicReq {
};
namespace ui {
-
namespace {
constexpr uint32_t kTestModesetFlags =
@@ -45,6 +44,11 @@ constexpr uint32_t kTestModesetFlags =
constexpr uint32_t kCommitModesetFlags = DRM_MODE_ATOMIC_ALLOW_MODESET;
+// Seamless modeset is defined by the lack of DRM_MODE_ATOMIC_ALLOW_MODESET.
+// This also happens to be the same set of flags as would be used for a
+// pageflip, or other atomic property changes that do not require modesetting.
+constexpr uint32_t kSeamlessModesetFlags = 0;
+
template <class Object>
Object* DrmAllocator() {
return static_cast<Object*>(drmMalloc(sizeof(Object)));
@@ -478,12 +482,20 @@ bool MockDrmDevice::CommitPropertiesInternal(
uint32_t crtc_count,
scoped_refptr<PageFlipRequest> page_flip_request) {
commit_count_++;
- if (flags == kTestModesetFlags)
- ++test_modeset_count_;
- else if (flags == kCommitModesetFlags)
- ++commit_modeset_count_;
+ const bool test_only = flags & DRM_MODE_ATOMIC_TEST_ONLY;
+ switch (flags) {
+ case kTestModesetFlags:
+ ++test_modeset_count_;
+ break;
+ case kCommitModesetFlags:
+ ++commit_modeset_count_;
+ break;
+ case kSeamlessModesetFlags:
+ ++seamless_modeset_count_;
+ break;
+ }
- if ((flags & kCommitModesetFlags && !set_crtc_expectation_) ||
+ if ((!test_only && !set_crtc_expectation_) ||
(flags & DRM_MODE_ATOMIC_NONBLOCK && !commit_expectation_)) {
return false;
}
@@ -517,7 +529,7 @@ bool MockDrmDevice::CommitPropertiesInternal(
if (page_flip_request)
callbacks_.push(page_flip_request->AddPageFlip());
- if (flags & DRM_MODE_ATOMIC_TEST_ONLY)
+ if (test_only)
return true;
// Only update values if not testing.
@@ -545,6 +557,14 @@ bool MockDrmDevice::SetGammaRamp(
return legacy_gamma_ramp_expectation_;
}
+absl::optional<std::string> MockDrmDevice::GetDriverName() const {
+ return driver_name_;
+}
+
+void MockDrmDevice::SetDriverName(absl::optional<std::string> name) {
+ driver_name_ = name;
+}
+
bool MockDrmDevice::SetCapability(uint64_t capability, uint64_t value) {
return true;
}
diff --git a/chromium/ui/ozone/platform/drm/gpu/mock_drm_device.h b/chromium/ui/ozone/platform/drm/gpu/mock_drm_device.h
index 3420559888d..2c5456c154b 100644
--- a/chromium/ui/ozone/platform/drm/gpu/mock_drm_device.h
+++ b/chromium/ui/ozone/platform/drm/gpu/mock_drm_device.h
@@ -77,6 +77,7 @@ class MockDrmDevice : public DrmDevice {
int get_overlay_clear_call_count() const { return overlay_clear_call_count_; }
int get_test_modeset_count() const { return test_modeset_count_; }
int get_commit_modeset_count() const { return commit_modeset_count_; }
+ int get_seamless_modeset_count() const { return seamless_modeset_count_; }
int get_commit_count() const { return commit_count_; }
int get_set_object_property_count() const {
return set_object_property_count_;
@@ -195,6 +196,8 @@ class MockDrmDevice : public DrmDevice {
uint32_t crtc_id,
const std::vector<display::GammaRampRGBEntry>& lut) override;
bool SetCapability(uint64_t capability, uint64_t value) override;
+ absl::optional<std::string> GetDriverName() const override;
+ void SetDriverName(absl::optional<std::string> name);
uint32_t GetFramebufferForCrtc(uint32_t crtc_id) const;
private:
@@ -230,6 +233,7 @@ class MockDrmDevice : public DrmDevice {
int allocate_buffer_count_;
int test_modeset_count_ = 0;
int commit_modeset_count_ = 0;
+ int seamless_modeset_count_ = 0;
int commit_count_ = 0;
int set_object_property_count_ = 0;
int set_gamma_ramp_count_ = 0;
@@ -246,6 +250,8 @@ class MockDrmDevice : public DrmDevice {
uint32_t current_framebuffer_;
uint32_t plane_crtc_id_prop_id_ = 0;
+ absl::optional<std::string> driver_name_ = "mock";
+
std::vector<sk_sp<SkSurface>> buffers_;
std::map<uint32_t, uint32_t> crtc_cursor_map_;
diff --git a/chromium/ui/ozone/platform/drm/gpu/screen_manager.cc b/chromium/ui/ozone/platform/drm/gpu/screen_manager.cc
index 2bf960fe42a..f6c4d2cdffc 100644
--- a/chromium/ui/ozone/platform/drm/gpu/screen_manager.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/screen_manager.cc
@@ -107,9 +107,11 @@ CrtcController* GetCrtcController(HardwareDisplayController* controller,
}
std::unique_ptr<base::trace_event::TracedValue> ParamsToTracedValue(
- const ScreenManager::ControllerConfigsList& controllers_params) {
+ const ScreenManager::ControllerConfigsList& controllers_params,
+ uint32_t modeset_flag) {
auto value = std::make_unique<base::trace_event::TracedValue>();
auto scoped_array = value->BeginArrayScoped("param");
+ value->SetInteger("modeset_flag", modeset_flag);
for (const auto& param : controllers_params) {
auto scoped_dict = value->AppendDictionaryScoped();
value->SetInteger("display_id", param.display_id);
@@ -314,11 +316,16 @@ void ScreenManager::RemoveDisplayControllers(
}
bool ScreenManager::ConfigureDisplayControllers(
- const ControllerConfigsList& controllers_params) {
+ const ControllerConfigsList& controllers_params,
+ uint32_t modeset_flag) {
TRACE_EVENT_BEGIN2("drm", "ScreenManager::ConfigureDisplayControllers",
- "params", ParamsToTracedValue(controllers_params),
+ "params",
+ ParamsToTracedValue(controllers_params, modeset_flag),
"before", base::trace_event::ToTracedValue(this));
+ // At least one of these flags must be set.
+ DCHECK(modeset_flag & (display::kCommitModeset | display::kTestModeset));
+
// Split them to different lists unique to each DRM Device.
base::flat_map<scoped_refptr<DrmDevice>, ControllerConfigsList>
displays_for_drm_devices;
@@ -332,34 +339,42 @@ bool ScreenManager::ConfigureDisplayControllers(
displays_for_drm_devices[params.drm].emplace_back(params);
}
+ const bool commit_modeset = modeset_flag & display::kCommitModeset;
+ const bool is_seamless_modeset = modeset_flag & display::kSeamlessModeset;
bool config_success = true;
// Perform display configurations together for the same DRM only.
for (const auto& configs_on_drm : displays_for_drm_devices) {
const ControllerConfigsList& drm_controllers_params = configs_on_drm.second;
- VLOG(1) << "DRM configuring: "
+ VLOG(1) << "DRM " << (commit_modeset ? "configuring: " : "testing: ")
<< GenerateConfigurationLogForController(drm_controllers_params);
- bool test_modeset = TestAndSetPreferredModifiers(drm_controllers_params) ||
- TestAndSetLinearModifier(drm_controllers_params);
- config_success &= test_modeset;
- if (!test_modeset) {
- VLOG(1) << "Test modeset failed.";
- continue;
+ if (modeset_flag & display::kTestModeset) {
+ bool test_modeset =
+ TestAndSetPreferredModifiers(drm_controllers_params,
+ is_seamless_modeset) ||
+ TestAndSetLinearModifier(drm_controllers_params, is_seamless_modeset);
+ config_success &= test_modeset;
+ VLOG(1) << "Test-modeset " << (test_modeset ? "succeeded." : "failed.");
+ if (!test_modeset)
+ continue;
}
- bool can_modeset_with_overlays =
- TestModesetWithOverlays(drm_controllers_params);
- bool real_modeset =
- Modeset(drm_controllers_params, can_modeset_with_overlays);
- config_success &= real_modeset;
- if (real_modeset) {
- VLOG(1) << "Modeset succeeded.";
- } else {
- LOG(ERROR) << "Modeset failed after a successful test-modeset for.";
+ if (commit_modeset) {
+ bool can_modeset_with_overlays =
+ TestModesetWithOverlays(drm_controllers_params, is_seamless_modeset);
+ bool modeset_commit_result =
+ Modeset(drm_controllers_params, can_modeset_with_overlays,
+ is_seamless_modeset);
+ config_success &= modeset_commit_result;
+ if (modeset_commit_result) {
+ VLOG(1) << "Modeset succeeded.";
+ } else {
+ LOG(ERROR) << "Modeset commit failed after a successful test-modeset.";
+ }
}
}
- if (config_success)
+ if (commit_modeset && config_success)
UpdateControllerToWindowMapping();
TRACE_EVENT_END2("drm", "ScreenManager::ConfigureDisplayControllers", "after",
@@ -369,7 +384,8 @@ bool ScreenManager::ConfigureDisplayControllers(
}
bool ScreenManager::TestAndSetPreferredModifiers(
- const ControllerConfigsList& controllers_params) {
+ const ControllerConfigsList& controllers_params,
+ bool is_seamless_modeset) {
TRACE_EVENT1("drm", "ScreenManager::TestAndSetPreferredModifiers",
"display_count", controllers_params.size());
@@ -407,9 +423,10 @@ bool ScreenManager::TestAndSetPreferredModifiers(
}
}
- if (!drm->plane_manager()->Commit(
- std::move(commit_request),
- DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET)) {
+ uint32_t flags = DRM_MODE_ATOMIC_TEST_ONLY;
+ if (!is_seamless_modeset)
+ flags |= DRM_MODE_ATOMIC_ALLOW_MODESET;
+ if (!drm->plane_manager()->Commit(std::move(commit_request), flags)) {
return false;
}
@@ -418,7 +435,8 @@ bool ScreenManager::TestAndSetPreferredModifiers(
}
bool ScreenManager::TestAndSetLinearModifier(
- const ControllerConfigsList& controllers_params) {
+ const ControllerConfigsList& controllers_params,
+ bool is_seamless_modeset) {
TRACE_EVENT1("drm", "ScreenManager::TestAndSetLinearModifier",
"display_count", controllers_params.size());
@@ -459,9 +477,10 @@ bool ScreenManager::TestAndSetLinearModifier(
}
}
- if (!drm->plane_manager()->Commit(
- std::move(commit_request),
- DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET)) {
+ uint32_t flags = DRM_MODE_ATOMIC_TEST_ONLY;
+ if (!is_seamless_modeset)
+ flags |= DRM_MODE_ATOMIC_ALLOW_MODESET;
+ if (!drm->plane_manager()->Commit(std::move(commit_request), flags)) {
return false;
}
@@ -492,7 +511,8 @@ void ScreenManager::SetPreferredModifiers(
}
bool ScreenManager::TestModesetWithOverlays(
- const ControllerConfigsList& controllers_params) {
+ const ControllerConfigsList& controllers_params,
+ bool is_seamless_modeset) {
TRACE_EVENT1("drm", "ScreenManager::TestModesetWithOverlays", "display_count",
controllers_params.size());
@@ -528,13 +548,15 @@ bool ScreenManager::TestModesetWithOverlays(
if (!does_an_overlay_exist)
return false;
- return drm->plane_manager()->Commit(
- std::move(commit_request),
- DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET);
+ uint32_t flags = DRM_MODE_ATOMIC_TEST_ONLY;
+ if (!is_seamless_modeset)
+ flags |= DRM_MODE_ATOMIC_ALLOW_MODESET;
+ return drm->plane_manager()->Commit(std::move(commit_request), flags);
}
bool ScreenManager::Modeset(const ControllerConfigsList& controllers_params,
- bool can_modeset_with_overlays) {
+ bool can_modeset_with_overlays,
+ bool is_seamless_modeset) {
TRACE_EVENT2("drm", "ScreenManager::Modeset", "display_count",
controllers_params.size(), "modeset_with_overlays",
can_modeset_with_overlays);
@@ -570,8 +592,8 @@ bool ScreenManager::Modeset(const ControllerConfigsList& controllers_params,
}
}
- bool commit_status = drm->plane_manager()->Commit(
- commit_request, DRM_MODE_ATOMIC_ALLOW_MODESET);
+ uint32_t flags = is_seamless_modeset ? 0 : DRM_MODE_ATOMIC_ALLOW_MODESET;
+ bool commit_status = drm->plane_manager()->Commit(commit_request, flags);
UpdateControllerStateAfterModeset(drm, commit_request, commit_status);
diff --git a/chromium/ui/ozone/platform/drm/gpu/screen_manager.h b/chromium/ui/ozone/platform/drm/gpu/screen_manager.h
index 6c3881f1dba..97ae8798e8e 100644
--- a/chromium/ui/ozone/platform/drm/gpu/screen_manager.h
+++ b/chromium/ui/ozone/platform/drm/gpu/screen_manager.h
@@ -72,9 +72,12 @@ class ScreenManager {
// controllers are removed since they were disconnected.
void RemoveDisplayControllers(const CrtcsWithDrmList& controllers_to_remove);
- // Enables/Disables the display controller based on if a mode exists.
+ // Enables/Disables the display controller based on if a mode exists. Adjusts
+ // the behavior of the commit according to |modeset_flag| (see
+ // display::ModesetFlag).
bool ConfigureDisplayControllers(
- const ControllerConfigsList& controllers_params);
+ const ControllerConfigsList& controllers_params,
+ uint32_t modeset_flag);
// Returns a reference to the display controller configured to display within
// |bounds|. If the caller caches the controller it must also register as an
@@ -116,9 +119,10 @@ class ScreenManager {
uint32_t crtc);
bool TestAndSetPreferredModifiers(
- const ControllerConfigsList& controllers_params);
- bool TestAndSetLinearModifier(
- const ControllerConfigsList& controllers_params);
+ const ControllerConfigsList& controllers_params,
+ bool is_seamless_modeset);
+ bool TestAndSetLinearModifier(const ControllerConfigsList& controllers_params,
+ bool is_seamless_modeset);
// Setting the Preferred modifiers that passed from one of the Modeset Test
// functions. The preferred modifiers are used in Modeset.
void SetPreferredModifiers(
@@ -127,9 +131,11 @@ class ScreenManager {
// The planes used for modesetting can have overlays beside the primary, test
// if we can modeset with them. If not, return false to indicate that we must
// only use the primary plane.
- bool TestModesetWithOverlays(const ControllerConfigsList& controllers_params);
+ bool TestModesetWithOverlays(const ControllerConfigsList& controllers_params,
+ bool is_seamless_modeset);
bool Modeset(const ControllerConfigsList& controllers_params,
- bool can_modeset_with_overlays);
+ bool can_modeset_with_overlays,
+ bool is_seamless_modeset);
// Configures a display controller to be enabled. The display controller is
// identified by (|crtc|, |connector|) and the controller is to be modeset
diff --git a/chromium/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc b/chromium/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc
index dc0c7ff05a4..e91a7225bbd 100644
--- a/chromium/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc
@@ -253,7 +253,8 @@ TEST_F(ScreenManagerTest, CheckWithValidController) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
EXPECT_EQ(drm_->get_test_modeset_count(), 1);
EXPECT_EQ(drm_->get_commit_modeset_count(), 1);
@@ -264,6 +265,24 @@ TEST_F(ScreenManagerTest, CheckWithValidController) {
EXPECT_TRUE(controller->HasCrtc(drm_, kPrimaryCrtc));
}
+TEST_F(ScreenManagerTest, CheckWithSeamlessModeset) {
+ InitializeDrmStateWithDefault(drm_.get(), /*is_atomic=*/true);
+
+ screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
+
+ ScreenManager::ControllerConfigsList controllers_to_enable;
+ controllers_to_enable.emplace_back(
+ kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
+ GetPrimaryBounds().origin(),
+ std::make_unique<drmModeModeInfo>(kDefaultMode));
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable,
+ display::kCommitModeset | display::kSeamlessModeset);
+
+ EXPECT_EQ(drm_->get_commit_modeset_count(), 0);
+ EXPECT_EQ(drm_->get_seamless_modeset_count(), 1);
+}
+
TEST_F(ScreenManagerTest, CheckWithInvalidBounds) {
InitializeDrmStateWithDefault(drm_.get(), /*is_atomic=*/true);
@@ -274,7 +293,8 @@ TEST_F(ScreenManagerTest, CheckWithInvalidBounds) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
EXPECT_TRUE(screen_manager_->GetDisplayController(GetPrimaryBounds()));
EXPECT_FALSE(screen_manager_->GetDisplayController(GetSecondaryBounds()));
@@ -297,7 +317,8 @@ TEST_F(ScreenManagerTest, CheckForSecondValidController) {
kSecondaryDisplayId, drm_, kSecondaryCrtc, kSecondaryConnector,
GetSecondaryBounds().origin(),
std::make_unique<drmModeModeInfo>(secondary_mode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
EXPECT_EQ(drm_->get_test_modeset_count(), 1);
EXPECT_EQ(drm_->get_commit_modeset_count(), 1);
@@ -329,8 +350,8 @@ TEST_F(ScreenManagerTest, CheckMultipleDisplaysWithinModifiersLimit) {
kSecondaryDisplayId, drm_, kSecondaryCrtc, kSecondaryConnector,
GetSecondaryBounds().origin(),
std::make_unique<drmModeModeInfo>(secondary_mode));
- EXPECT_TRUE(
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable));
+ EXPECT_TRUE(screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset));
EXPECT_EQ(drm_->get_test_modeset_count(), 1);
EXPECT_EQ(drm_->get_commit_modeset_count(), 1);
@@ -358,8 +379,8 @@ TEST_F(ScreenManagerTest, CheckMultipleDisplaysOutsideModifiersLimit) {
kSecondaryDisplayId, drm_, kSecondaryCrtc, kSecondaryConnector,
GetSecondaryBounds().origin(),
std::make_unique<drmModeModeInfo>(secondary_mode));
- EXPECT_TRUE(
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable));
+ EXPECT_TRUE(screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset));
// Testing for a failed test-modeset with modifiers + a fallback to Linear
// Modifier and a modeset commit.
@@ -387,8 +408,8 @@ TEST_F(ScreenManagerTest, CheckDisplaysWith0Limit) {
kSecondaryDisplayId, drm_, kSecondaryCrtc, kSecondaryConnector,
GetSecondaryBounds().origin(),
std::make_unique<drmModeModeInfo>(secondary_mode));
- EXPECT_FALSE(
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable));
+ EXPECT_FALSE(screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset));
// Testing for a failed test-modeset with modifiers + failed test-modeset with
// Linear Modifier and no modeset due to failed tests.
@@ -406,7 +427,8 @@ TEST_F(ScreenManagerTest, CheckControllerAfterItIsRemoved) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
EXPECT_TRUE(screen_manager_->GetDisplayController(GetPrimaryBounds()));
@@ -427,7 +449,8 @@ TEST_F(ScreenManagerTest, CheckControllerAfterDisabled) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
}
int test_modeset_count_before_disable = drm_->get_test_modeset_count();
@@ -436,7 +459,8 @@ TEST_F(ScreenManagerTest, CheckControllerAfterDisabled) {
ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(kPrimaryDisplayId, drm_, kPrimaryCrtc,
kPrimaryConnector, gfx::Point(), nullptr);
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
EXPECT_EQ(drm_->get_test_modeset_count(),
test_modeset_count_before_disable + 1);
@@ -462,7 +486,8 @@ TEST_F(ScreenManagerTest, CheckMultipleControllersAfterBeingRemoved) {
kSecondaryDisplayId, drm_, kSecondaryCrtc, kSecondaryConnector,
GetSecondaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
int modeset_count_after_enable = drm_->get_commit_modeset_count();
ScreenManager::CrtcsWithDrmList controllers_to_remove;
@@ -493,7 +518,8 @@ TEST_F(ScreenManagerTest, CheckMultipleControllersAfterBeingDisabled) {
kSecondaryDisplayId, drm_, kSecondaryCrtc, kSecondaryConnector,
GetSecondaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
}
int test_modeset_count_before_disable = drm_->get_test_modeset_count();
@@ -505,7 +531,8 @@ TEST_F(ScreenManagerTest, CheckMultipleControllersAfterBeingDisabled) {
controllers_to_enable.emplace_back(kSecondaryDisplayId, drm_, kSecondaryCrtc,
kSecondaryConnector, gfx::Point(),
nullptr);
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
EXPECT_EQ(drm_->get_test_modeset_count(),
test_modeset_count_before_disable + 1);
@@ -526,7 +553,8 @@ TEST_F(ScreenManagerTest, CheckDuplicateConfiguration) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
uint32_t framebuffer = drm_->current_framebuffer();
@@ -535,7 +563,8 @@ TEST_F(ScreenManagerTest, CheckDuplicateConfiguration) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
// Should not hold onto buffers.
EXPECT_NE(framebuffer, drm_->current_framebuffer());
@@ -556,7 +585,8 @@ TEST_F(ScreenManagerTest, CheckChangingMode) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
}
auto new_mode = kDefaultMode;
new_mode.vdisplay = new_mode.vdisplay++;
@@ -567,7 +597,8 @@ TEST_F(ScreenManagerTest, CheckChangingMode) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(new_mode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
}
gfx::Rect new_bounds(0, 0, new_mode.hdisplay, new_mode.vdisplay);
@@ -597,7 +628,8 @@ TEST_F(ScreenManagerTest, CheckForControllersInMirroredMode) {
kSecondaryDisplayId, drm_, kSecondaryCrtc, kSecondaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(secondary_mode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
EXPECT_TRUE(screen_manager_->GetDisplayController(GetPrimaryBounds()));
EXPECT_FALSE(screen_manager_->GetDisplayController(GetSecondaryBounds()));
@@ -625,7 +657,8 @@ TEST_F(ScreenManagerTest, CheckMirrorModeTransitions) {
kSecondaryDisplayId, drm_, kSecondaryCrtc, kSecondaryConnector,
GetSecondaryBounds().origin(),
std::make_unique<drmModeModeInfo>(secondary_mode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
EXPECT_TRUE(screen_manager_->GetDisplayController(GetPrimaryBounds()));
EXPECT_TRUE(screen_manager_->GetDisplayController(GetSecondaryBounds()));
@@ -641,7 +674,8 @@ TEST_F(ScreenManagerTest, CheckMirrorModeTransitions) {
kSecondaryDisplayId, drm_, kSecondaryCrtc, kSecondaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(transition1_secondary_mode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
EXPECT_TRUE(screen_manager_->GetDisplayController(GetPrimaryBounds()));
EXPECT_FALSE(screen_manager_->GetDisplayController(GetSecondaryBounds()));
@@ -657,7 +691,8 @@ TEST_F(ScreenManagerTest, CheckMirrorModeTransitions) {
kSecondaryDisplayId, drm_, kSecondaryCrtc, kSecondaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(transition2_secondary_mode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
EXPECT_TRUE(screen_manager_->GetDisplayController(GetPrimaryBounds()));
EXPECT_TRUE(screen_manager_->GetDisplayController(GetSecondaryBounds()));
@@ -686,7 +721,8 @@ TEST_F(ScreenManagerTest, CheckMirrorModeModesettingWithDisplaysMode) {
kSecondaryDisplayId, drm_, kSecondaryCrtc, kSecondaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(secondary_mode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
ui::HardwareDisplayController* controller =
screen_manager_->GetDisplayController(GetPrimaryBounds());
@@ -717,7 +753,8 @@ TEST_F(ScreenManagerTest, MonitorGoneInMirrorMode) {
kSecondaryDisplayId, drm_, kSecondaryCrtc, kSecondaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(secondary_mode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
ScreenManager::CrtcsWithDrmList controllers_to_remove;
controllers_to_remove.emplace_back(kSecondaryCrtc, drm_);
@@ -751,14 +788,16 @@ TEST_F(ScreenManagerTest, MonitorDisabledInMirrorMode) {
kSecondaryDisplayId, drm_, kSecondaryCrtc, kSecondaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(secondary_mode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
}
// Disable display Controller.
ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(0, drm_, kSecondaryCrtc, 0, gfx::Point(),
nullptr);
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
ui::HardwareDisplayController* controller =
screen_manager_->GetDisplayController(GetPrimaryBounds());
@@ -788,7 +827,8 @@ TEST_F(ScreenManagerTest, DoNotEnterMirrorModeUnlessSameBounds) {
kSecondaryDisplayId, drm_, kSecondaryCrtc, kSecondaryConnector,
GetSecondaryBounds().origin(),
std::make_unique<drmModeModeInfo>(secondary_mode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
}
{
@@ -799,7 +839,8 @@ TEST_F(ScreenManagerTest, DoNotEnterMirrorModeUnlessSameBounds) {
controllers_to_enable.emplace_back(
kSecondaryDisplayId, drm_, kSecondaryCrtc, kSecondaryConnector,
GetPrimaryBounds().origin(), std::move(new_mode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
}
EXPECT_FALSE(
@@ -815,7 +856,8 @@ TEST_F(ScreenManagerTest, ReuseFramebufferIfDisabledThenReEnabled) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
uint32_t framebuffer = drm_->current_framebuffer();
@@ -823,7 +865,8 @@ TEST_F(ScreenManagerTest, ReuseFramebufferIfDisabledThenReEnabled) {
// Disable display controller.
controllers_to_enable.emplace_back(0, drm_, kPrimaryCrtc, 0, gfx::Point(),
nullptr);
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
EXPECT_EQ(0u, drm_->current_framebuffer());
controllers_to_enable.clear();
@@ -832,7 +875,8 @@ TEST_F(ScreenManagerTest, ReuseFramebufferIfDisabledThenReEnabled) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(reenable_mode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
// Buffers are released when disabled.
EXPECT_NE(framebuffer, drm_->current_framebuffer());
@@ -855,13 +899,15 @@ TEST_F(ScreenManagerTest, CheckMirrorModeAfterBeginReEnabled) {
kSecondaryDisplayId, drm_, kSecondaryCrtc, kSecondaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(secondary_mode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
}
{
ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(0, drm_, kPrimaryCrtc, 0, gfx::Point(),
nullptr);
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
}
ui::HardwareDisplayController* controller =
@@ -876,7 +922,8 @@ TEST_F(ScreenManagerTest, CheckMirrorModeAfterBeginReEnabled) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(reenable_mode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
}
EXPECT_TRUE(controller);
@@ -916,7 +963,8 @@ TEST_F(ScreenManagerTest, ConfigureOnDifferentDrmDevices) {
kSecondaryDisplayId + 1, drm2, kSecondaryCrtc + 1,
kSecondaryConnector + 1, GetSecondaryBounds().origin(),
std::make_unique<drmModeModeInfo>(secondary_mode2));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
EXPECT_EQ(drm_->get_set_crtc_call_count(), 1);
EXPECT_EQ(drm2->get_set_crtc_call_count(), 2);
@@ -944,7 +992,8 @@ TEST_F(ScreenManagerTest,
kSecondaryDisplayId, drm2, kPrimaryCrtc, kPrimaryConnector,
GetSecondaryBounds().origin(),
std::make_unique<drmModeModeInfo>(secondary_mode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
ui::HardwareDisplayController* controller1 =
screen_manager_->GetDisplayController(GetPrimaryBounds());
@@ -971,7 +1020,8 @@ TEST_F(ScreenManagerTest, CheckControllerToWindowMappingWithSameBounds) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
EXPECT_TRUE(screen_manager_->GetWindow(1)->GetController());
@@ -996,7 +1046,8 @@ TEST_F(ScreenManagerTest, CheckControllerToWindowMappingWithDifferentBounds) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
EXPECT_FALSE(screen_manager_->GetWindow(1)->GetController());
@@ -1023,7 +1074,8 @@ TEST_F(ScreenManagerTest,
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
bool window1_has_controller = screen_manager_->GetWindow(1)->GetController();
bool window2_has_controller = screen_manager_->GetWindow(2)->GetController();
@@ -1052,7 +1104,8 @@ TEST_F(ScreenManagerTest, ShouldDissociateWindowOnControllerRemoval) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
EXPECT_TRUE(screen_manager_->GetWindow(window_id)->GetController());
@@ -1081,7 +1134,8 @@ TEST_F(ScreenManagerTest, EnableControllerWhenWindowHasNoBuffer) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
EXPECT_TRUE(screen_manager_->GetWindow(1)->GetController());
// There is a buffer after initial config.
@@ -1093,7 +1147,8 @@ TEST_F(ScreenManagerTest, EnableControllerWhenWindowHasNoBuffer) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
// There is a new buffer after we configured with the same mode but no
// pending frames on the window.
@@ -1124,7 +1179,8 @@ TEST_F(ScreenManagerTest, EnableControllerWhenWindowHasBuffer) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
EXPECT_EQ(buffer->opaque_framebuffer_id(), drm_->current_framebuffer());
@@ -1152,7 +1208,8 @@ TEST_F(ScreenManagerTest, DISABLED_RejectBufferWithIncompatibleModifiers) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
// ScreenManager::GetModesetBuffer (called to get a buffer to
// modeset the new controller) should reject the buffer with
@@ -1180,7 +1237,8 @@ TEST_F(ScreenManagerTest, ConfigureDisplayControllerShouldModesetOnce) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
// When a window that had no controller becomes associated with a new
// controller, expect the crtc to be modeset once.
@@ -1240,7 +1298,8 @@ TEST_F(ScreenManagerTest, ShouldNotHardwareMirrorDifferentDrmDevices) {
controllers_to_enable.emplace_back(kSecondaryDisplayId, drm_device2, kCrtc2,
kConnector2, gfx::Point(0, 1140),
std::move(secondary_mode));
- screen_manager.ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager.ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
auto window2 =
std::make_unique<DrmWindow>(2, &drm_device_manager, &screen_manager);
@@ -1272,7 +1331,8 @@ TEST_F(ScreenManagerTest, ShouldNotHardwareMirrorDifferentDrmDevices) {
controllers_to_enable.emplace_back(kSecondaryDisplayId, drm_device2, kCrtc2,
kConnector2, gfx::Point(0, 0),
std::move(secondary_mode));
- screen_manager.ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager.ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
screen_manager.GetWindow(1)->SetBounds(gfx::Rect(0, 0, 1920, 1080));
screen_manager.GetWindow(1)->SetBounds(gfx::Rect(0, 0, 1920, 1080));
@@ -1288,7 +1348,8 @@ TEST_F(ScreenManagerTest, ShouldNotHardwareMirrorDifferentDrmDevices) {
controllers_to_enable.emplace_back(kPrimaryDisplayId, drm_device1, kCrtc1,
kConnector1, gfx::Point(0, 0),
std::move(primary_mode));
- screen_manager.ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager.ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
// At this point, both displays are in the same location.
{
HardwareDisplayController* controller =
@@ -1305,7 +1366,8 @@ TEST_F(ScreenManagerTest, ShouldNotHardwareMirrorDifferentDrmDevices) {
controllers_to_enable.emplace_back(kSecondaryDisplayId, drm_device2, kCrtc2,
kConnector2, gfx::Point(0, 1140),
std::move(secondary_mode));
- screen_manager.ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager.ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
auto window3 =
std::make_unique<DrmWindow>(3, &drm_device_manager, &screen_manager);
window3->Initialize();
@@ -1385,7 +1447,8 @@ TEST_F(ScreenManagerTest, ShouldNotUnbindFramebufferOnJoiningMirror) {
controllers_to_enable.emplace_back(kSecondaryDisplayId, drm_device, kCrtc2,
kConnector2, gfx::Point(0, 0),
std::move(secondary_mode));
- screen_manager.ConfigureDisplayControllers(controllers_to_enable);
+ screen_manager.ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset);
}
EXPECT_NE(0u, drm_device->GetFramebufferForCrtc(kCrtc1));
@@ -1410,8 +1473,9 @@ TEST_F(ScreenManagerTest, DrmFramebufferSequenceIdIncrementingAtModeset) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- ASSERT_TRUE(
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable));
+ ASSERT_TRUE(screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable,
+ display::kTestModeset | display::kCommitModeset));
}
scoped_refptr<DrmFramebuffer> first_post_modeset_buffer =
@@ -1427,8 +1491,9 @@ TEST_F(ScreenManagerTest, DrmFramebufferSequenceIdIncrementingAtModeset) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetSecondaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- ASSERT_FALSE(
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable));
+ ASSERT_FALSE(screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable,
+ display::kTestModeset | display::kCommitModeset));
}
scoped_refptr<DrmFramebuffer> second_post_modeset_buffer =
@@ -1459,8 +1524,8 @@ TEST_F(ScreenManagerTest, CloningPlanesOnModeset) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- ASSERT_TRUE(
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable));
+ ASSERT_TRUE(screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset));
EXPECT_TRUE(base::Contains(drm_->plane_manager()
->GetCrtcStateForCrtcId(kPrimaryCrtc)
@@ -1502,8 +1567,8 @@ TEST_F(ScreenManagerTest, CloningMultiplePlanesOnModeset) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- ASSERT_TRUE(
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable));
+ ASSERT_TRUE(screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset));
EXPECT_TRUE(base::Contains(drm_->plane_manager()
->GetCrtcStateForCrtcId(kPrimaryCrtc)
@@ -1539,8 +1604,8 @@ TEST_F(ScreenManagerTest, ModesetWithClonedPlanesNoOverlays) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- ASSERT_TRUE(
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable));
+ ASSERT_TRUE(screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset));
ASSERT_TRUE(base::Contains(drm_->plane_manager()
->GetCrtcStateForCrtcId(kPrimaryCrtc)
.modeset_framebuffers,
@@ -1584,8 +1649,8 @@ TEST_F(ScreenManagerTest, ModesetWithClonedPlanesWithOverlaySucceeding) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- ASSERT_TRUE(
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable));
+ ASSERT_TRUE(screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset));
EXPECT_TRUE(base::Contains(drm_->plane_manager()
->GetCrtcStateForCrtcId(kPrimaryCrtc)
@@ -1635,8 +1700,8 @@ TEST_F(ScreenManagerTest, ModesetWithClonedPlanesWithOverlayFailing) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- EXPECT_TRUE(
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable));
+ EXPECT_TRUE(screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset));
EXPECT_TRUE(base::Contains(drm_->plane_manager()
->GetCrtcStateForCrtcId(kPrimaryCrtc)
@@ -1686,8 +1751,8 @@ TEST_F(ScreenManagerTest, ModesetWithNewBuffersOnModifiersChange) {
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
- ASSERT_TRUE(
- screen_manager_->ConfigureDisplayControllers(controllers_to_enable));
+ ASSERT_TRUE(screen_manager_->ConfigureDisplayControllers(
+ controllers_to_enable, display::kTestModeset | display::kCommitModeset));
EXPECT_FALSE(base::Contains(drm_->plane_manager()
->GetCrtcStateForCrtcId(kPrimaryCrtc)
diff --git a/chromium/ui/ozone/platform/drm/host/drm_display_host_manager.cc b/chromium/ui/ozone/platform/drm/host/drm_display_host_manager.cc
index bb5d36ddc52..428662f60ee 100644
--- a/chromium/ui/ozone/platform/drm/host/drm_display_host_manager.cc
+++ b/chromium/ui/ozone/platform/drm/host/drm_display_host_manager.cc
@@ -33,6 +33,8 @@ namespace ui {
namespace {
+constexpr int kDriverReadySleepMs = 100;
+
typedef base::OnceCallback<void(const base::FilePath&,
const base::FilePath&,
std::unique_ptr<DrmDeviceHandle>)>
@@ -103,14 +105,16 @@ struct DisplayCard {
absl::optional<std::string> driver;
};
-base::FilePath GetPrimaryDisplayCardPath() {
- struct drm_mode_card_res res;
+std::vector<DisplayCard> GetValidDisplayCards() {
std::vector<DisplayCard> cards;
- for (int i = 0; /* end on first card# that does not exist */; i++) {
- std::string card_path = base::StringPrintf(kDefaultGraphicsCardPattern, i);
+
+ for (int card_number = 0; /* end on first card# that does not exist */;
+ card_number++) {
+ std::string card_path =
+ base::StringPrintf(kDefaultGraphicsCardPattern, card_number);
if (access(card_path.c_str(), F_OK) != 0) {
- if (i == 0) /* card paths may start with 0 or 1 */
+ if (card_number == 0) /* card paths may start with 0 or 1 */
continue;
else
break;
@@ -122,27 +126,44 @@ base::FilePath GetPrimaryDisplayCardPath() {
continue;
}
+ struct drm_mode_card_res res;
memset(&res, 0, sizeof(struct drm_mode_card_res));
int ret = drmIoctl(fd.get(), DRM_IOCTL_MODE_GETRESOURCES, &res);
VPLOG_IF(1, ret) << "Failed to get DRM resources for '" << card_path << "'";
- if (ret == 0 && res.count_crtcs > 0)
+ if (ret == 0 && res.count_crtcs > 0) {
cards.push_back(
{base::FilePath(card_path), GetDrmDriverNameFromFd(fd.get())});
+ }
}
- // Find the card with the most preferred driver.
- const auto preferred_drivers = GetPreferredDrmDrivers();
- for (const auto* preferred_driver : preferred_drivers) {
- for (const auto& card : cards) {
- if (card.driver == preferred_driver)
- return card.path;
+ return cards;
+}
+
+base::FilePath GetPrimaryDisplayCardPath() {
+ // The kernel might not have the DRM driver ready yet. This can happen when
+ // the DRM driver binding has been deferred, waiting on dependencies to be
+ // ready. Instead of failing if the driver isn't ready, retry until it's
+ // there before crashing.
+ for (int i = 0; i < 10; ++i) {
+ std::vector<DisplayCard> cards = GetValidDisplayCards();
+
+ // Find the card with the most preferred driver.
+ const auto preferred_drivers = GetPreferredDrmDrivers();
+ for (const auto* preferred_driver : preferred_drivers) {
+ for (const auto& card : cards) {
+ if (card.driver == preferred_driver)
+ return card.path;
+ }
}
- }
- // Fall back to the first usable card.
- if (!cards.empty())
- return cards[0].path;
+ // Fall back to the first usable card.
+ if (!cards.empty())
+ return cards[0].path;
+
+ // If no card is ready, sleep and try again.
+ usleep(kDriverReadySleepMs * 1000);
+ }
LOG(FATAL) << "Failed to open primary graphics device.";
return base::FilePath(); // Not reached.
@@ -311,7 +332,8 @@ void DrmDisplayHostManager::UpdateDisplays(
void DrmDisplayHostManager::ConfigureDisplays(
const std::vector<display::DisplayConfigurationParams>& config_requests,
- display::ConfigureCallback callback) {
+ display::ConfigureCallback callback,
+ uint32_t modeset_flag) {
for (auto& config : config_requests) {
if (GetDisplay(config.id)->is_dummy()) {
std::move(callback).Run(true);
@@ -319,7 +341,8 @@ void DrmDisplayHostManager::ConfigureDisplays(
}
}
- proxy_->GpuConfigureNativeDisplays(config_requests, std::move(callback));
+ proxy_->GpuConfigureNativeDisplays(config_requests, std::move(callback),
+ modeset_flag);
}
void DrmDisplayHostManager::OnDeviceEvent(const DeviceEvent& event) {
diff --git a/chromium/ui/ozone/platform/drm/host/drm_display_host_manager.h b/chromium/ui/ozone/platform/drm/host/drm_display_host_manager.h
index 1c728049f61..58d92b2939a 100644
--- a/chromium/ui/ozone/platform/drm/host/drm_display_host_manager.h
+++ b/chromium/ui/ozone/platform/drm/host/drm_display_host_manager.h
@@ -55,7 +55,8 @@ class DrmDisplayHostManager : public DeviceEventObserver, GpuThreadObserver {
void UpdateDisplays(display::GetDisplaysCallback callback);
void ConfigureDisplays(
const std::vector<display::DisplayConfigurationParams>& config_requests,
- display::ConfigureCallback callback);
+ display::ConfigureCallback callback,
+ uint32_t modeset_flag);
// DeviceEventObserver overrides:
void OnDeviceEvent(const DeviceEvent& event) override;
diff --git a/chromium/ui/ozone/platform/drm/host/drm_native_display_delegate.cc b/chromium/ui/ozone/platform/drm/host/drm_native_display_delegate.cc
index 55c97ff9d03..06542189d7c 100644
--- a/chromium/ui/ozone/platform/drm/host/drm_native_display_delegate.cc
+++ b/chromium/ui/ozone/platform/drm/host/drm_native_display_delegate.cc
@@ -52,8 +52,10 @@ void DrmNativeDisplayDelegate::GetDisplays(
void DrmNativeDisplayDelegate::Configure(
const std::vector<display::DisplayConfigurationParams>& config_requests,
- display::ConfigureCallback callback) {
- display_manager_->ConfigureDisplays(config_requests, std::move(callback));
+ display::ConfigureCallback callback,
+ uint32_t modeset_flag) {
+ display_manager_->ConfigureDisplays(config_requests, std::move(callback),
+ modeset_flag);
}
void DrmNativeDisplayDelegate::GetHDCPState(
diff --git a/chromium/ui/ozone/platform/drm/host/drm_native_display_delegate.h b/chromium/ui/ozone/platform/drm/host/drm_native_display_delegate.h
index fb87ece29d5..76381794b85 100644
--- a/chromium/ui/ozone/platform/drm/host/drm_native_display_delegate.h
+++ b/chromium/ui/ozone/platform/drm/host/drm_native_display_delegate.h
@@ -34,7 +34,8 @@ class DrmNativeDisplayDelegate : public display::NativeDisplayDelegate {
void GetDisplays(display::GetDisplaysCallback callback) override;
void Configure(
const std::vector<display::DisplayConfigurationParams>& config_requests,
- display::ConfigureCallback callback) override;
+ display::ConfigureCallback callback,
+ uint32_t modeset_flag) override;
void GetHDCPState(const display::DisplaySnapshot& output,
display::GetHDCPStateCallback callback) override;
void SetHDCPState(const display::DisplaySnapshot& output,
diff --git a/chromium/ui/ozone/platform/drm/host/drm_window_host.cc b/chromium/ui/ozone/platform/drm/host/drm_window_host.cc
index c5879bfa37a..fe8f456234c 100644
--- a/chromium/ui/ozone/platform/drm/host/drm_window_host.cc
+++ b/chromium/ui/ozone/platform/drm/host/drm_window_host.cc
@@ -79,8 +79,9 @@ bool DrmWindowHost::IsVisible() const {
void DrmWindowHost::PrepareForShutdown() {}
void DrmWindowHost::SetBoundsInPixels(const gfx::Rect& bounds) {
+ bool origin_changed = bounds_.origin() != bounds.origin();
bounds_ = bounds;
- delegate_->OnBoundsChanged(bounds);
+ delegate_->OnBoundsChanged({origin_changed});
SendBoundsChange();
}
diff --git a/chromium/ui/ozone/platform/drm/host/gpu_thread_adapter.h b/chromium/ui/ozone/platform/drm/host/gpu_thread_adapter.h
index eea97b11558..763fb507cd1 100644
--- a/chromium/ui/ozone/platform/drm/host/gpu_thread_adapter.h
+++ b/chromium/ui/ozone/platform/drm/host/gpu_thread_adapter.h
@@ -51,7 +51,8 @@ class GpuThreadAdapter {
// Services needed by DrmDisplayHost
virtual void GpuConfigureNativeDisplays(
const std::vector<display::DisplayConfigurationParams>& config_requests,
- display::ConfigureCallback callback) = 0;
+ display::ConfigureCallback callback,
+ uint32_t modeset_flag) = 0;
virtual bool GpuGetHDCPState(int64_t display_id) = 0;
virtual bool GpuSetHDCPState(
int64_t display_id,
diff --git a/chromium/ui/ozone/platform/drm/host/host_drm_device.cc b/chromium/ui/ozone/platform/drm/host/host_drm_device.cc
index ce0b64203f3..a29f707f7e8 100644
--- a/chromium/ui/ozone/platform/drm/host/host_drm_device.cc
+++ b/chromium/ui/ozone/platform/drm/host/host_drm_device.cc
@@ -129,10 +129,12 @@ bool HostDrmDevice::GpuRefreshNativeDisplays() {
void HostDrmDevice::GpuConfigureNativeDisplays(
const std::vector<display::DisplayConfigurationParams>& config_requests,
- display::ConfigureCallback callback) {
+ display::ConfigureCallback callback,
+ uint32_t modeset_flag) {
DCHECK_CALLED_ON_VALID_THREAD(on_ui_thread_);
if (IsConnected()) {
- drm_device_->ConfigureNativeDisplays(config_requests, std::move(callback));
+ drm_device_->ConfigureNativeDisplays(config_requests, modeset_flag,
+ std::move(callback));
} else {
// Post this task to protect the callstack from accumulating too many
// recursive calls to ConfigureDisplaysTask::Run() in cases in which the GPU
diff --git a/chromium/ui/ozone/platform/drm/host/host_drm_device.h b/chromium/ui/ozone/platform/drm/host/host_drm_device.h
index d34dfb616ce..b0f81f4d0db 100644
--- a/chromium/ui/ozone/platform/drm/host/host_drm_device.h
+++ b/chromium/ui/ozone/platform/drm/host/host_drm_device.h
@@ -68,7 +68,8 @@ class HostDrmDevice : public base::RefCountedThreadSafe<HostDrmDevice>,
// Services needed by DrmDisplayHost
void GpuConfigureNativeDisplays(
const std::vector<display::DisplayConfigurationParams>& config_requests,
- display::ConfigureCallback callback) override;
+ display::ConfigureCallback callback,
+ uint32_t modeset_flag) override;
bool GpuGetHDCPState(int64_t display_id) override;
bool GpuSetHDCPState(
int64_t display_id,
diff --git a/chromium/ui/ozone/platform/drm/mojom/drm_device.mojom b/chromium/ui/ozone/platform/drm/mojom/drm_device.mojom
index cd641061ef7..6d4c210844d 100644
--- a/chromium/ui/ozone/platform/drm/mojom/drm_device.mojom
+++ b/chromium/ui/ozone/platform/drm/mojom/drm_device.mojom
@@ -59,9 +59,11 @@ interface DrmDevice {
(bool should_trigger);
// Configures (Enables/Disables) DRM displays, returns whether or not the
- // configuration was successful.
+ // configuration was successful. Adjusts the behavior of the commit according
+ // to |modeset_flag| (see display::ModesetFlag).
ConfigureNativeDisplays(
- array<display.mojom.DisplayConfigurationParams> config_requests) =>
+ array<display.mojom.DisplayConfigurationParams> config_requests,
+ uint32 modeset_flag) =>
(bool config_success);
// Gets high-definition content protection (HDCP) (DRM as in
diff --git a/chromium/ui/ozone/platform/drm/ozone_platform_drm.cc b/chromium/ui/ozone/platform/drm/ozone_platform_drm.cc
index be60dedbd6b..efa20f5fdb2 100644
--- a/chromium/ui/ozone/platform/drm/ozone_platform_drm.cc
+++ b/chromium/ui/ozone/platform/drm/ozone_platform_drm.cc
@@ -173,12 +173,12 @@ class OzonePlatformDrm : public OzonePlatform {
return std::make_unique<DrmNativeDisplayDelegate>(display_manager_.get());
}
std::unique_ptr<InputMethod> CreateInputMethod(
- internal::InputMethodDelegate* delegate,
+ ImeKeyEventDispatcher* ime_key_event_dispatcher,
gfx::AcceleratedWidget) override {
#if BUILDFLAG(IS_CHROMEOS_ASH)
- return std::make_unique<InputMethodAsh>(delegate);
+ return std::make_unique<InputMethodAsh>(ime_key_event_dispatcher);
#else
- return std::make_unique<InputMethodMinimal>(delegate);
+ return std::make_unique<InputMethodMinimal>(ime_key_event_dispatcher);
#endif
}
diff --git a/chromium/ui/ozone/platform/drm/test/vkms_tests.cc b/chromium/ui/ozone/platform/drm/test/vkms_tests.cc
index 49940e1ee8d..d0faea472e1 100644
--- a/chromium/ui/ozone/platform/drm/test/vkms_tests.cc
+++ b/chromium/ui/ozone/platform/drm/test/vkms_tests.cc
@@ -72,7 +72,8 @@ class VKMSTest : public testing::Test {
EXPECT_TRUE(success) << "Unable to set up displays.";
run_loop.Quit();
});
- drm_device_->ConfigureNativeDisplays(params, callback);
+ drm_device_->ConfigureNativeDisplays(
+ params, display::kTestModeset | display::kCommitModeset, callback);
run_loop.Run();
return RefreshDisplays();
diff --git a/chromium/ui/ozone/platform/flatland/BUILD.gn b/chromium/ui/ozone/platform/flatland/BUILD.gn
index 4c557793692..368fddbff8f 100644
--- a/chromium/ui/ozone/platform/flatland/BUILD.gn
+++ b/chromium/ui/ozone/platform/flatland/BUILD.gn
@@ -36,6 +36,8 @@ source_set("flatland") {
"flatland_window.h",
"flatland_window_manager.cc",
"flatland_window_manager.h",
+ "overlay_manager_flatland.cc",
+ "overlay_manager_flatland.h",
"ozone_platform_flatland.cc",
"ozone_platform_flatland.h",
"vulkan_implementation_flatland.cc",
diff --git a/chromium/ui/ozone/platform/flatland/flatland_surface.cc b/chromium/ui/ozone/platform/flatland/flatland_surface.cc
index 0601ecc78fc..7442e14b9cb 100644
--- a/chromium/ui/ozone/platform/flatland/flatland_surface.cc
+++ b/chromium/ui/ozone/platform/flatland/flatland_surface.cc
@@ -141,10 +141,7 @@ void FlatlandSurface::Present(
flatland_.flatland()->SetTranslation(transform_id, translation);
flatland_.flatland()->SetImageDestinationSize(
image_id, GfxSizeToFuchsiaSize(rounded_bounds.size()));
- const gfx::Size image_size =
- static_cast<FlatlandSysmemNativePixmap*>(overlay.pixmap.get())
- ->sysmem_buffer_collection()
- ->size();
+ const gfx::Size image_size = overlay.pixmap->GetBufferSize();
gfx::RectF crop_rect = overlay.overlay_plane_data.crop_rect;
crop_rect.Scale(image_size.width(), image_size.height());
const auto rounded_crop_rect = gfx::ToRoundedRect(crop_rect);
@@ -281,7 +278,7 @@ FlatlandSurface::FlatlandIds FlatlandSurface::CreateOrGetFlatlandIds(
->sysmem_buffer_collection();
DCHECK_EQ(collection->id(), ids.buffer_collection_id);
fuchsia::ui::composition::ImageProperties image_properties;
- image_properties.set_size(GfxSizeToFuchsiaSize(collection->size()));
+ image_properties.set_size(GfxSizeToFuchsiaSize(pixmap->GetBufferSize()));
const fuchsia::ui::composition::ContentId image_id =
flatland_.NextContentId();
flatland_.flatland()->CreateImage(
diff --git a/chromium/ui/ozone/platform/flatland/flatland_surface_factory.cc b/chromium/ui/ozone/platform/flatland/flatland_surface_factory.cc
index 13c151fd766..2bdc27a1e18 100644
--- a/chromium/ui/ozone/platform/flatland/flatland_surface_factory.cc
+++ b/chromium/ui/ozone/platform/flatland/flatland_surface_factory.cc
@@ -44,18 +44,20 @@ class GLOzoneEGLFlatland : public GLOzoneEGL {
// GLOzone:
scoped_refptr<gl::GLSurface> CreateViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget window) override {
// GL rendering to Flatland views is not supported. This function is
// used only for unittests. Return an off-screen surface, so the tests pass.
// TODO(crbug.com/1271760): Use Vulkan in unittests and remove this hack.
return gl::InitializeGLSurface(base::MakeRefCounted<gl::SurfacelessEGL>(
- gl::GLSurfaceEGL::GetGLDisplayEGL(), gfx::Size(100, 100)));
+ display->GetAs<gl::GLDisplayEGL>(), gfx::Size(100, 100)));
}
scoped_refptr<gl::GLSurface> CreateOffscreenGLSurface(
+ gl::GLDisplay* display,
const gfx::Size& size) override {
return gl::InitializeGLSurface(base::MakeRefCounted<gl::SurfacelessEGL>(
- gl::GLSurfaceEGL::GetGLDisplayEGL(), size));
+ display->GetAs<gl::GLDisplayEGL>(), size));
}
gl::EGLDisplayPlatform GetNativeDisplay() override {
@@ -171,7 +173,7 @@ scoped_refptr<gfx::NativePixmap> FlatlandSurfaceFactory::CreateNativePixmap(
if (!collection)
return nullptr;
- return collection->CreateNativePixmap(0);
+ return collection->CreateNativePixmap(0, size);
}
void FlatlandSurfaceFactory::CreateNativePixmapAsync(
@@ -196,7 +198,7 @@ FlatlandSurfaceFactory::CreateNativePixmapFromHandle(
if (!collection)
return nullptr;
- return collection->CreateNativePixmap(handle.buffer_index);
+ return collection->CreateNativePixmap(handle.buffer_index, size);
}
#if BUILDFLAG(ENABLE_VULKAN)
@@ -205,7 +207,8 @@ FlatlandSurfaceFactory::CreateVulkanImplementation(
bool use_swiftshader,
bool allow_protected_memory) {
return std::make_unique<ui::VulkanImplementationFlatland>(
- this, &flatland_sysmem_buffer_manager_, allow_protected_memory);
+ this, &flatland_sysmem_buffer_manager_, use_swiftshader,
+ allow_protected_memory);
}
#endif
diff --git a/chromium/ui/ozone/platform/flatland/flatland_surface_unittest.cc b/chromium/ui/ozone/platform/flatland/flatland_surface_unittest.cc
index 524db63924b..53505fcbbc6 100644
--- a/chromium/ui/ozone/platform/flatland/flatland_surface_unittest.cc
+++ b/chromium/ui/ozone/platform/flatland/flatland_surface_unittest.cc
@@ -7,6 +7,7 @@
#include <fuchsia/ui/composition/cpp/fidl.h>
#include <vector>
+#include "base/callback_helpers.h"
#include "base/fuchsia/scoped_service_publisher.h"
#include "base/fuchsia/test_component_context_for_process.h"
#include "base/logging.h"
@@ -90,6 +91,8 @@ TEST_F(FlatlandSurfaceTest, Initialization) {
}
TEST_F(FlatlandSurfaceTest, PresentPrimaryPlane) {
+ fake_flatland_.SetPresentHandler(base::DoNothing());
+
FlatlandSurface* surface = CreateFlatlandSurface();
auto buffer_collection_id = gfx::SysmemBufferCollectionId::Create();
@@ -98,8 +101,9 @@ TEST_F(FlatlandSurfaceTest, PresentPrimaryPlane) {
handle.buffer_index = 0;
auto collection = base::MakeRefCounted<FlatlandSysmemBufferCollection>(
buffer_collection_id);
+ collection->InitializeForTesting(gfx::BufferUsage::SCANOUT);
auto primary_plane_pixmap = base::MakeRefCounted<FlatlandSysmemNativePixmap>(
- collection, std::move(handle));
+ collection, std::move(handle), gfx::Size(1, 1));
surface->Present(
primary_plane_pixmap, std::vector<ui::OverlayPlane>(),
std::vector<gfx::GpuFenceHandle>(), std::vector<gfx::GpuFenceHandle>(),
diff --git a/chromium/ui/ozone/platform/flatland/flatland_sysmem_buffer_collection.cc b/chromium/ui/ozone/platform/flatland/flatland_sysmem_buffer_collection.cc
index 8c87bc1b11e..9e4337e9174 100644
--- a/chromium/ui/ozone/platform/flatland/flatland_sysmem_buffer_collection.cc
+++ b/chromium/ui/ozone/platform/flatland/flatland_sysmem_buffer_collection.cc
@@ -296,8 +296,19 @@ bool FlatlandSysmemBufferCollection::Initialize(
min_buffer_count);
}
+void FlatlandSysmemBufferCollection::InitializeForTesting(
+ gfx::BufferUsage usage) {
+ if (usage == gfx::BufferUsage::SCANOUT) {
+ // Scanout buffers need to be registered with flatland.
+ fuchsia::ui::composition::BufferCollectionExportToken export_token;
+ zx::eventpair::create(0, &export_token.value,
+ &flatland_import_token_.value);
+ }
+}
+
scoped_refptr<gfx::NativePixmap>
-FlatlandSysmemBufferCollection::CreateNativePixmap(size_t buffer_index) {
+FlatlandSysmemBufferCollection::CreateNativePixmap(size_t buffer_index,
+ gfx::Size size) {
CHECK_LT(buffer_index, num_buffers());
gfx::NativePixmapHandle handle;
@@ -324,10 +335,10 @@ FlatlandSysmemBufferCollection::CreateNativePixmap(size_t buffer_index) {
// The logic should match LogicalBufferCollection::Allocate().
size_t stride =
RoundUp(std::max(static_cast<size_t>(format.min_bytes_per_row),
- image_size_.width() * GetBytesPerPixel(format_)),
+ size.width() * GetBytesPerPixel(format_)),
format.bytes_per_row_divisor);
size_t plane_offset = buffers_info_.buffers[buffer_index].vmo_usable_start;
- size_t plane_size = stride * image_size_.height();
+ size_t plane_size = stride * size.height();
handle.planes.emplace_back(stride, plane_offset, plane_size,
std::move(main_plane_vmo));
@@ -340,7 +351,7 @@ FlatlandSysmemBufferCollection::CreateNativePixmap(size_t buffer_index) {
DCHECK_LE(uv_plane_offset + uv_plane_size, buffer_size_);
}
- return new FlatlandSysmemNativePixmap(this, std::move(handle));
+ return new FlatlandSysmemNativePixmap(this, std::move(handle), size);
}
bool FlatlandSysmemBufferCollection::CreateVkImage(
@@ -458,6 +469,8 @@ bool FlatlandSysmemBufferCollection::CreateVkImage(
fuchsia::ui::composition::BufferCollectionImportToken
FlatlandSysmemBufferCollection::GetFlatlandImportToken() const {
+ DCHECK(HasFlatlandImportToken());
+
fuchsia::ui::composition::BufferCollectionImportToken import_dup;
zx_status_t status = flatland_import_token_.value.duplicate(
ZX_RIGHT_SAME_RIGHTS, &import_dup.value);
@@ -467,6 +480,10 @@ FlatlandSysmemBufferCollection::GetFlatlandImportToken() const {
return import_dup;
}
+bool FlatlandSysmemBufferCollection::HasFlatlandImportToken() const {
+ return flatland_import_token_.value.is_valid();
+}
+
void FlatlandSysmemBufferCollection::AddOnDeletedCallback(
base::OnceClosure on_deleted) {
on_deleted_.push_back(std::move(on_deleted));
@@ -610,16 +627,6 @@ bool FlatlandSysmemBufferCollection::InitializeInternal(
DCHECK_GE(buffers_info_.buffer_count, min_buffer_count);
DCHECK(buffers_info_.settings.has_image_format_constraints);
- // The logic should match LogicalBufferCollection::Allocate().
- const fuchsia::sysmem::ImageFormatConstraints& format =
- buffers_info_.settings.image_format_constraints;
- size_t width =
- RoundUp(std::max(format.min_coded_width, format.required_max_coded_width),
- format.coded_width_divisor);
- size_t height = RoundUp(
- std::max(format.min_coded_height, format.required_max_coded_height),
- format.coded_height_divisor);
- image_size_ = gfx::Size(width, height);
buffer_size_ = buffers_info_.settings.buffer_settings.size_bytes;
is_protected_ = buffers_info_.settings.buffer_settings.is_secure;
diff --git a/chromium/ui/ozone/platform/flatland/flatland_sysmem_buffer_collection.h b/chromium/ui/ozone/platform/flatland/flatland_sysmem_buffer_collection.h
index 156eb52d0c0..66aa5c8bdd9 100644
--- a/chromium/ui/ozone/platform/flatland/flatland_sysmem_buffer_collection.h
+++ b/chromium/ui/ozone/platform/flatland/flatland_sysmem_buffer_collection.h
@@ -64,10 +64,14 @@ class FlatlandSysmemBufferCollection
VkDevice vk_device,
size_t min_buffer_count);
+ // Does minimum initialization needed for tests based on |usage|.
+ void InitializeForTesting(gfx::BufferUsage usage);
+
// Creates a NativePixmap with the specified index. The returned
// NativePixmap holds a reference to the collection, so that the collection
// is not deleted until all NativePixmaps are destroyed.
- scoped_refptr<gfx::NativePixmap> CreateNativePixmap(size_t buffer_index);
+ scoped_refptr<gfx::NativePixmap> CreateNativePixmap(size_t buffer_index,
+ gfx::Size size);
// Creates a new Vulkan image for the buffer with the specified index.
bool CreateVkImage(size_t buffer_index,
@@ -81,7 +85,6 @@ class FlatlandSysmemBufferCollection
gfx::SysmemBufferCollectionId id() const { return id_; }
size_t num_buffers() const { return buffers_info_.buffer_count; }
- gfx::Size size() const { return image_size_; }
gfx::BufferFormat format() const { return format_; }
size_t buffer_size() const {
return buffers_info_.settings.buffer_settings.size_bytes;
@@ -90,6 +93,8 @@ class FlatlandSysmemBufferCollection
// Returns a duplicate of |flatland_import_token_| so Images can be created.
fuchsia::ui::composition::BufferCollectionImportToken GetFlatlandImportToken()
const;
+ bool HasFlatlandImportToken() const;
+
void AddOnDeletedCallback(base::OnceClosure on_deleted);
private:
@@ -138,7 +143,6 @@ class FlatlandSysmemBufferCollection
// threads.
THREAD_CHECKER(vulkan_thread_checker_);
- gfx::Size image_size_;
size_t buffer_size_ = 0;
bool is_protected_ = false;
diff --git a/chromium/ui/ozone/platform/flatland/flatland_sysmem_native_pixmap.cc b/chromium/ui/ozone/platform/flatland/flatland_sysmem_native_pixmap.cc
index 0423510e873..4488be85d4b 100644
--- a/chromium/ui/ozone/platform/flatland/flatland_sysmem_native_pixmap.cc
+++ b/chromium/ui/ozone/platform/flatland/flatland_sysmem_native_pixmap.cc
@@ -12,8 +12,9 @@ namespace ui {
FlatlandSysmemNativePixmap::FlatlandSysmemNativePixmap(
scoped_refptr<FlatlandSysmemBufferCollection> collection,
- gfx::NativePixmapHandle handle)
- : collection_(collection), handle_(std::move(handle)) {}
+ gfx::NativePixmapHandle handle,
+ gfx::Size size)
+ : collection_(collection), handle_(std::move(handle)), size_(size) {}
FlatlandSysmemNativePixmap::~FlatlandSysmemNativePixmap() = default;
@@ -63,7 +64,7 @@ gfx::BufferFormat FlatlandSysmemNativePixmap::GetBufferFormat() const {
}
gfx::Size FlatlandSysmemNativePixmap::GetBufferSize() const {
- return collection_->size();
+ return size_;
}
uint32_t FlatlandSysmemNativePixmap::GetUniqueId() const {
@@ -75,6 +76,7 @@ bool FlatlandSysmemNativePixmap::ScheduleOverlayPlane(
const gfx::OverlayPlaneData& overlay_plane_data,
std::vector<gfx::GpuFence> acquire_fences,
std::vector<gfx::GpuFence> release_fences) {
+ NOTREACHED();
return false;
}
@@ -86,9 +88,8 @@ const gfx::NativePixmapHandle& FlatlandSysmemNativePixmap::PeekHandle() const {
return handle_;
}
-bool FlatlandSysmemNativePixmap::SupportsOverlayPlane(
- gfx::AcceleratedWidget widget) const {
- return false;
+bool FlatlandSysmemNativePixmap::SupportsOverlayPlane() const {
+ return collection_->HasFlatlandImportToken();
}
} // namespace ui
diff --git a/chromium/ui/ozone/platform/flatland/flatland_sysmem_native_pixmap.h b/chromium/ui/ozone/platform/flatland/flatland_sysmem_native_pixmap.h
index a5d6d0d1c5e..3fe156a2a1d 100644
--- a/chromium/ui/ozone/platform/flatland/flatland_sysmem_native_pixmap.h
+++ b/chromium/ui/ozone/platform/flatland/flatland_sysmem_native_pixmap.h
@@ -14,7 +14,8 @@ class FlatlandSysmemNativePixmap : public gfx::NativePixmap {
public:
FlatlandSysmemNativePixmap(
scoped_refptr<FlatlandSysmemBufferCollection> collection,
- gfx::NativePixmapHandle handle);
+ gfx::NativePixmapHandle handle,
+ gfx::Size size);
FlatlandSysmemNativePixmap(const FlatlandSysmemNativePixmap&) = delete;
FlatlandSysmemNativePixmap& operator=(const FlatlandSysmemNativePixmap&) =
@@ -43,9 +44,8 @@ class FlatlandSysmemNativePixmap : public gfx::NativePixmap {
}
const gfx::NativePixmapHandle& PeekHandle() const;
- // Returns true if overlay planes are supported and ScheduleOverlayPlane() can
- // be called.
- bool SupportsOverlayPlane(gfx::AcceleratedWidget widget) const;
+ // Returns true if overlay planes are supported.
+ bool SupportsOverlayPlane() const;
private:
~FlatlandSysmemNativePixmap() override;
@@ -53,6 +53,8 @@ class FlatlandSysmemNativePixmap : public gfx::NativePixmap {
// Keep reference to the collection to make sure it outlives the pixmap.
scoped_refptr<FlatlandSysmemBufferCollection> collection_;
gfx::NativePixmapHandle handle_;
+
+ gfx::Size size_;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/flatland/flatland_window.cc b/chromium/ui/ozone/platform/flatland/flatland_window.cc
index 5300a2688d2..af0aa93fd18 100644
--- a/chromium/ui/ozone/platform/flatland/flatland_window.cc
+++ b/chromium/ui/ozone/platform/flatland/flatland_window.cc
@@ -37,7 +37,7 @@ FlatlandWindow::FlatlandWindow(FlatlandWindowManager* window_manager,
view_ref_(std::move(properties.view_ref_pair.view_ref)),
view_controller_(std::move(properties.view_controller)),
flatland_("Chromium FlatlandWindow"),
- bounds_(properties.bounds) {
+ bounds_(delegate->ConvertRectToPixels(properties.bounds)) {
if (view_controller_) {
view_controller_.set_error_handler(
fit::bind_member(this, &FlatlandWindow::OnViewControllerDisconnected));
@@ -328,11 +328,11 @@ void FlatlandWindow::UpdateSize() {
const uint32_t width = view_properties_->width;
const uint32_t height = view_properties_->height;
+ const gfx::Point old_origin = bounds_.origin();
bounds_ = gfx::Rect(ceilf(width * device_pixel_ratio_),
ceilf(height * device_pixel_ratio_));
- PlatformWindowDelegate::BoundsChange bounds;
- bounds.bounds = bounds_;
+ PlatformWindowDelegate::BoundsChange bounds(old_origin != bounds_.origin());
// TODO(fxbug.dev/93998): Calculate insets and update.
window_delegate_->OnBoundsChanged(bounds);
}
diff --git a/chromium/ui/ozone/platform/flatland/overlay_manager_flatland.cc b/chromium/ui/ozone/platform/flatland/overlay_manager_flatland.cc
new file mode 100644
index 00000000000..c0d81d55fcd
--- /dev/null
+++ b/chromium/ui/ozone/platform/flatland/overlay_manager_flatland.cc
@@ -0,0 +1,56 @@
+// 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/flatland/overlay_manager_flatland.h"
+
+#include "ui/gfx/overlay_transform.h"
+#include "ui/ozone/platform/flatland/flatland_sysmem_native_pixmap.h"
+#include "ui/ozone/public/overlay_candidates_ozone.h"
+#include "ui/ozone/public/overlay_surface_candidate.h"
+
+namespace ui {
+namespace {
+
+bool IsSupportedOverlayTransform(gfx::OverlayTransform transform) {
+ // Flatland doesn't support flip transforms yet.
+ return (transform == gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL ||
+ transform == gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL);
+}
+
+class OverlayCandidatesFlatland : public OverlayCandidatesOzone {
+ public:
+ OverlayCandidatesFlatland() = default;
+ ~OverlayCandidatesFlatland() override = default;
+
+ // OverlayCandidatesOzone implementation.
+ void CheckOverlaySupport(
+ std::vector<OverlaySurfaceCandidate>* candidates) override {
+ for (auto& candidate : *candidates) {
+ if (IsSupportedOverlayTransform(candidate.transform))
+ continue;
+ if (!candidate.native_pixmap)
+ continue;
+ FlatlandSysmemNativePixmap* sysmem_native_pixmap =
+ static_cast<FlatlandSysmemNativePixmap*>(
+ candidate.native_pixmap.get());
+ candidate.overlay_handled = sysmem_native_pixmap->SupportsOverlayPlane();
+ }
+ }
+};
+
+} // namespace
+
+OverlayManagerFlatland::OverlayManagerFlatland() {
+ // Fuchsia overlays rely on ShouldUseRealBuffersForPageFlipTest.
+ allow_sync_and_real_buffer_page_flip_testing_ = true;
+}
+
+OverlayManagerFlatland::~OverlayManagerFlatland() = default;
+
+std::unique_ptr<OverlayCandidatesOzone>
+OverlayManagerFlatland::CreateOverlayCandidates(gfx::AcceleratedWidget widget) {
+ return std::make_unique<OverlayCandidatesFlatland>();
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/flatland/overlay_manager_flatland.h b/chromium/ui/ozone/platform/flatland/overlay_manager_flatland.h
new file mode 100644
index 00000000000..483a4e1dfc2
--- /dev/null
+++ b/chromium/ui/ozone/platform/flatland/overlay_manager_flatland.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 UI_OZONE_PLATFORM_FLATLAND_OVERLAY_MANAGER_FLATLAND_H_
+#define UI_OZONE_PLATFORM_FLATLAND_OVERLAY_MANAGER_FLATLAND_H_
+
+#include <memory>
+
+#include "ui/ozone/public/overlay_manager_ozone.h"
+
+namespace ui {
+
+class OverlayManagerFlatland : public OverlayManagerOzone {
+ public:
+ OverlayManagerFlatland();
+ ~OverlayManagerFlatland() override;
+
+ OverlayManagerFlatland(const OverlayManagerFlatland&) = delete;
+ OverlayManagerFlatland& operator=(const OverlayManagerFlatland&) = delete;
+
+ // OverlayManagerOzone implementation
+ std::unique_ptr<OverlayCandidatesOzone> CreateOverlayCandidates(
+ gfx::AcceleratedWidget widget) override;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_FLATLAND_OVERLAY_MANAGER_FLATLAND_H_
diff --git a/chromium/ui/ozone/platform/flatland/ozone_platform_flatland.cc b/chromium/ui/ozone/platform/flatland/ozone_platform_flatland.cc
index 75c28b73f11..c57ef3496b1 100644
--- a/chromium/ui/ozone/platform/flatland/ozone_platform_flatland.cc
+++ b/chromium/ui/ozone/platform/flatland/ozone_platform_flatland.cc
@@ -31,6 +31,7 @@
#include "ui/ozone/platform/flatland/flatland_sysmem_buffer_collection.h"
#include "ui/ozone/platform/flatland/flatland_window.h"
#include "ui/ozone/platform/flatland/flatland_window_manager.h"
+#include "ui/ozone/platform/flatland/overlay_manager_flatland.h"
#include "ui/ozone/platform/scenic/mojom/scenic_gpu_service.mojom.h"
#include "ui/ozone/platform_selection.h"
#include "ui/ozone/public/gpu_platform_support_host.h"
@@ -143,11 +144,12 @@ class OzonePlatformFlatland : public OzonePlatform,
void InitScreen(PlatformScreen* screen) override {}
std::unique_ptr<InputMethod> CreateInputMethod(
- internal::InputMethodDelegate* delegate,
+ ImeKeyEventDispatcher* ime_key_event_dispatcher,
gfx::AcceleratedWidget widget) override {
return std::make_unique<InputMethodFuchsia>(
window_manager_->GetWindow(widget)->virtual_keyboard_enabled(),
- delegate, window_manager_->GetWindow(widget)->CloneViewRef());
+ ime_key_event_dispatcher,
+ window_manager_->GetWindow(widget)->CloneViewRef());
}
bool InitializeUI(const InitParams& params) override {
@@ -192,7 +194,7 @@ class OzonePlatformFlatland : public OzonePlatform,
surface_factory_->Initialize(std::move(flatland_gpu_host_remote));
}
- // TODO(crbug.com/1146006): Add overlay manager.
+ overlay_manager_ = std::make_unique<OverlayManagerFlatland>();
}
const PlatformRuntimeProperties& GetPlatformRuntimeProperties() override {
diff --git a/chromium/ui/ozone/platform/flatland/vulkan_implementation_flatland.cc b/chromium/ui/ozone/platform/flatland/vulkan_implementation_flatland.cc
index 53cfe1fc69a..229dcf24fbf 100644
--- a/chromium/ui/ozone/platform/flatland/vulkan_implementation_flatland.cc
+++ b/chromium/ui/ozone/platform/flatland/vulkan_implementation_flatland.cc
@@ -34,22 +34,23 @@ namespace ui {
VulkanImplementationFlatland::VulkanImplementationFlatland(
FlatlandSurfaceFactory* flatland_surface_factory,
FlatlandSysmemBufferManager* flatland_sysmem_buffer_manager,
+ bool use_swiftshader,
bool allow_protected_memory)
- : VulkanImplementation(false /* use_swiftshader */, allow_protected_memory),
+ : VulkanImplementation(use_swiftshader, allow_protected_memory),
flatland_sysmem_buffer_manager_(flatland_sysmem_buffer_manager) {}
VulkanImplementationFlatland::~VulkanImplementationFlatland() = default;
bool VulkanImplementationFlatland::InitializeVulkanInstance(
bool using_surface) {
- DCHECK(using_surface);
+ DCHECK(!using_surface);
- std::vector<const char*> required_extensions = {
- VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
- };
+ base::FilePath path(use_swiftshader() ? "libvk_swiftshader.so"
+ : "libvulkan.so");
+ std::vector<const char*> required_extensions;
std::vector<const char*> required_layers;
- return vulkan_instance_.Initialize(base::FilePath("libvulkan.so"),
- required_extensions, required_layers);
+ return vulkan_instance_.Initialize(path, required_extensions,
+ required_layers);
}
gpu::VulkanInstance* VulkanImplementationFlatland::GetVulkanInstance() {
@@ -114,60 +115,15 @@ VkSemaphore VulkanImplementationFlatland::CreateExternalSemaphore(
VkSemaphore VulkanImplementationFlatland::ImportSemaphoreHandle(
VkDevice vk_device,
gpu::SemaphoreHandle handle) {
- if (!handle.is_valid())
- return VK_NULL_HANDLE;
-
- if (handle.vk_handle_type() !=
- VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA) {
- return VK_NULL_HANDLE;
- }
-
- VkSemaphore semaphore = VK_NULL_HANDLE;
- VkSemaphoreCreateInfo info = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO};
- VkResult result = vkCreateSemaphore(vk_device, &info, nullptr, &semaphore);
- if (result != VK_SUCCESS)
- return VK_NULL_HANDLE;
-
- zx::event event = handle.TakeHandle();
- VkImportSemaphoreZirconHandleInfoFUCHSIA import = {
- VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_ZIRCON_HANDLE_INFO_FUCHSIA};
- import.semaphore = semaphore;
- import.handleType =
- VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA;
- import.zirconHandle = event.get();
-
- result = vkImportSemaphoreZirconHandleFUCHSIA(vk_device, &import);
- if (result != VK_SUCCESS) {
- vkDestroySemaphore(vk_device, semaphore, nullptr);
- return VK_NULL_HANDLE;
- }
-
- // Vulkan took ownership of the handle.
- std::ignore = event.release();
-
- return semaphore;
+ return gpu::ImportVkSemaphoreHandle(vk_device, std::move(handle));
}
gpu::SemaphoreHandle VulkanImplementationFlatland::GetSemaphoreHandle(
VkDevice vk_device,
VkSemaphore vk_semaphore) {
- // Create VkSemaphoreGetFdInfoKHR structure.
- VkSemaphoreGetZirconHandleInfoFUCHSIA info = {
- VK_STRUCTURE_TYPE_SEMAPHORE_GET_ZIRCON_HANDLE_INFO_FUCHSIA};
- info.semaphore = vk_semaphore;
- info.handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA;
-
- zx_handle_t handle;
- VkResult result =
- vkGetSemaphoreZirconHandleFUCHSIA(vk_device, &info, &handle);
- if (result != VK_SUCCESS) {
- LOG(ERROR) << "vkGetSemaphoreFuchsiaHandleKHR failed : " << result;
- return gpu::SemaphoreHandle();
- }
-
- return gpu::SemaphoreHandle(
- VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA,
- zx::event(handle));
+ return gpu::GetVkSemaphoreHandle(
+ vk_device, vk_semaphore,
+ VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA);
}
VkExternalMemoryHandleTypeFlagBits
@@ -228,7 +184,7 @@ VulkanImplementationFlatland::CreateImageFromGpuMemoryHandle(
image->set_queue_family_index(VK_QUEUE_FAMILY_EXTERNAL);
image->set_native_pixmap(collection->CreateNativePixmap(
- gmb_handle.native_pixmap_handle.buffer_index));
+ gmb_handle.native_pixmap_handle.buffer_index, size));
return image;
}
diff --git a/chromium/ui/ozone/platform/flatland/vulkan_implementation_flatland.h b/chromium/ui/ozone/platform/flatland/vulkan_implementation_flatland.h
index fccc304f50e..f3f4e343d49 100644
--- a/chromium/ui/ozone/platform/flatland/vulkan_implementation_flatland.h
+++ b/chromium/ui/ozone/platform/flatland/vulkan_implementation_flatland.h
@@ -21,6 +21,7 @@ class VulkanImplementationFlatland : public gpu::VulkanImplementation {
VulkanImplementationFlatland(
FlatlandSurfaceFactory* flatland_surface_factory,
FlatlandSysmemBufferManager* flatland_sysmem_buffer_manager,
+ bool use_swiftshader,
bool allow_protected_memory);
~VulkanImplementationFlatland() override;
VulkanImplementationFlatland(const VulkanImplementationFlatland&) = delete;
diff --git a/chromium/ui/ozone/platform/headless/BUILD.gn b/chromium/ui/ozone/platform/headless/BUILD.gn
index 20a2ef3fb0f..758e8abace0 100644
--- a/chromium/ui/ozone/platform/headless/BUILD.gn
+++ b/chromium/ui/ozone/platform/headless/BUILD.gn
@@ -47,7 +47,7 @@ source_set("headless") {
deps += [ "//ui/base/ime/fuchsia" ]
}
- if (enable_vulkan && is_linux) {
+ if (enable_vulkan && (is_linux || is_fuchsia)) {
sources += [
"vulkan_implementation_headless.cc",
"vulkan_implementation_headless.h",
diff --git a/chromium/ui/ozone/platform/headless/headless_surface_factory.cc b/chromium/ui/ozone/platform/headless/headless_surface_factory.cc
index 95584511548..9b0fce0212c 100644
--- a/chromium/ui/ozone/platform/headless/headless_surface_factory.cc
+++ b/chromium/ui/ozone/platform/headless/headless_surface_factory.cc
@@ -34,7 +34,7 @@
#include "ui/ozone/platform/headless/headless_window_manager.h"
#include "ui/ozone/public/surface_ozone_canvas.h"
-#if BUILDFLAG(ENABLE_VULKAN) && BUILDFLAG(IS_LINUX)
+#if BUILDFLAG(ENABLE_VULKAN) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_FUCHSIA))
#include "ui/ozone/platform/headless/vulkan_implementation_headless.h"
#endif
@@ -107,8 +107,8 @@ class FileSurface : public SurfaceOzoneCanvas {
class FileGLSurface : public GLSurfaceEglReadback {
public:
- explicit FileGLSurface(const base::FilePath& location)
- : location_(location) {}
+ FileGLSurface(gl::GLDisplayEGL* display, const base::FilePath& location)
+ : GLSurfaceEglReadback(display), location_(location) {}
FileGLSurface(const FileGLSurface&) = delete;
FileGLSurface& operator=(const FileGLSurface&) = delete;
@@ -188,16 +188,19 @@ class GLOzoneEGLHeadless : public GLOzoneEGL {
// GLOzone:
scoped_refptr<gl::GLSurface> CreateViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget window) override {
return gl::InitializeGLSurface(base::MakeRefCounted<FileGLSurface>(
+ display->GetAs<gl::GLDisplayEGL>(),
GetPathForWidget(base_path_, window)));
}
scoped_refptr<gl::GLSurface> CreateOffscreenGLSurface(
+ gl::GLDisplay* display,
const gfx::Size& size) override {
return gl::InitializeGLSurface(
base::MakeRefCounted<gl::PbufferGLSurfaceEGL>(
- gl::GLSurfaceEGL::GetGLDisplayEGL(), size));
+ display->GetAs<gl::GLDisplayEGL>(), size));
}
protected:
@@ -229,8 +232,8 @@ HeadlessSurfaceFactory::~HeadlessSurfaceFactory() = default;
std::vector<gl::GLImplementationParts>
HeadlessSurfaceFactory::GetAllowedGLImplementations() {
return std::vector<gl::GLImplementationParts>{
- gl::GLImplementationParts(gl::kGLImplementationEGLGLES2),
gl::GLImplementationParts(gl::ANGLEImplementation::kSwiftShader),
+ gl::GLImplementationParts(gl::kGLImplementationEGLGLES2),
gl::GLImplementationParts(gl::ANGLEImplementation::kDefault),
};
}
@@ -274,13 +277,17 @@ void HeadlessSurfaceFactory::CheckBasePath() const {
PLOG(FATAL) << "Unable to write to output location";
}
-#if BUILDFLAG(ENABLE_VULKAN) && BUILDFLAG(IS_LINUX)
+#if BUILDFLAG(ENABLE_VULKAN)
std::unique_ptr<gpu::VulkanImplementation>
HeadlessSurfaceFactory::CreateVulkanImplementation(
bool use_swiftshader,
bool allow_protected_memory) {
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_FUCHSIA)
return std::make_unique<VulkanImplementationHeadless>(use_swiftshader);
-}
+#else
+ return nullptr;
#endif
+}
+#endif // BUILDFLAG(ENABLE_VULKAN)
} // namespace ui
diff --git a/chromium/ui/ozone/platform/headless/headless_surface_factory.h b/chromium/ui/ozone/platform/headless/headless_surface_factory.h
index bf58e12f346..add9f85befd 100644
--- a/chromium/ui/ozone/platform/headless/headless_surface_factory.h
+++ b/chromium/ui/ozone/platform/headless/headless_surface_factory.h
@@ -26,11 +26,11 @@ class HeadlessSurfaceFactory : public SurfaceFactoryOzone {
// SurfaceFactoryOzone:
std::vector<gl::GLImplementationParts> GetAllowedGLImplementations() override;
GLOzone* GetGLOzone(const gl::GLImplementationParts& implementation) override;
-#if BUILDFLAG(ENABLE_VULKAN) && BUILDFLAG(IS_LINUX)
+#if BUILDFLAG(ENABLE_VULKAN)
std::unique_ptr<gpu::VulkanImplementation> CreateVulkanImplementation(
bool use_swiftshader,
bool allow_protected_memory) override;
-#endif
+#endif // BUILDFLAG(ENABLE_VULKAN)
std::unique_ptr<SurfaceOzoneCanvas> CreateCanvasForWidget(
gfx::AcceleratedWidget widget) override;
scoped_refptr<gfx::NativePixmap> CreateNativePixmap(
diff --git a/chromium/ui/ozone/platform/headless/headless_window.h b/chromium/ui/ozone/platform/headless/headless_window.h
index b723e8e069c..ef3d778ab82 100644
--- a/chromium/ui/ozone/platform/headless/headless_window.h
+++ b/chromium/ui/ozone/platform/headless/headless_window.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_HEADLESS_HEADLESS_WINDOW_H_
#define UI_OZONE_PLATFORM_HEADLESS_HEADLESS_WINDOW_H_
+#include "base/memory/raw_ptr.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/platform_window/platform_window_delegate.h"
@@ -26,7 +27,7 @@ class HeadlessWindow : public StubWindow {
~HeadlessWindow() override;
private:
- HeadlessWindowManager* manager_;
+ raw_ptr<HeadlessWindowManager> manager_;
gfx::AcceleratedWidget widget_;
};
diff --git a/chromium/ui/ozone/platform/headless/ozone_platform_headless.cc b/chromium/ui/ozone/platform/headless/ozone_platform_headless.cc
index ccede681b55..f38f4482731 100644
--- a/chromium/ui/ozone/platform/headless/ozone_platform_headless.cc
+++ b/chromium/ui/ozone/platform/headless/ozone_platform_headless.cc
@@ -96,9 +96,9 @@ class OzonePlatformHeadless : public OzonePlatform {
}
void InitScreen(PlatformScreen* screen) override {}
std::unique_ptr<InputMethod> CreateInputMethod(
- internal::InputMethodDelegate* delegate,
+ ImeKeyEventDispatcher* ime_key_event_dispatcher,
gfx::AcceleratedWidget widget) override {
- return std::make_unique<InputMethodMinimal>(delegate);
+ return std::make_unique<InputMethodMinimal>(ime_key_event_dispatcher);
}
// Desktop Linux, not CastOS.
diff --git a/chromium/ui/ozone/platform/headless/vulkan_implementation_headless.cc b/chromium/ui/ozone/platform/headless/vulkan_implementation_headless.cc
index 0453660caf2..819c45f1f2f 100644
--- a/chromium/ui/ozone/platform/headless/vulkan_implementation_headless.cc
+++ b/chromium/ui/ozone/platform/headless/vulkan_implementation_headless.cc
@@ -20,6 +20,10 @@
#include "ui/gfx/gpu_memory_buffer.h"
#include "ui/ozone/platform/headless/vulkan_surface_headless.h"
+#if BUILDFLAG(IS_FUCHSIA)
+#include <lib/zx/channel.h>
+#endif
+
namespace ui {
VulkanImplementationHeadless::VulkanImplementationHeadless(bool use_swiftshader)
@@ -38,6 +42,10 @@ bool VulkanImplementationHeadless::InitializeVulkanInstance(
}
base::FilePath path;
+#if BUILDFLAG(IS_FUCHSIA)
+ path = base::FilePath(use_swiftshader() ? "libvk_swiftshader.so"
+ : "libvulkan.so");
+#else
if (use_swiftshader()) {
if (!base::PathService::Get(base::DIR_MODULE, &path))
return false;
@@ -45,6 +53,7 @@ bool VulkanImplementationHeadless::InitializeVulkanInstance(
} else {
path = base::FilePath("libvulkan.so.1");
}
+#endif
return vulkan_instance_.Initialize(path, required_extensions, {});
}
@@ -144,13 +153,32 @@ VulkanImplementationHeadless::CreateImageFromGpuMemoryHandle(
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;
+ auto tiling = VK_IMAGE_TILING_OPTIMAL;
+#if BUILDFLAG(IS_LINUX)
+ if (gmb_handle.native_pixmap_handle.modifier !=
+ gfx::NativePixmapHandle::kNoModifier) {
+ tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT;
+ }
+#endif // BUILDFLAG(IS_LINUX)
return gpu::VulkanImage::CreateFromGpuMemoryBufferHandle(
device_queue, std::move(gmb_handle), size, vk_format, kUsage, /*flags=*/0,
tiling, VK_QUEUE_FAMILY_EXTERNAL);
}
+#if BUILDFLAG(IS_FUCHSIA)
+std::unique_ptr<gpu::SysmemBufferCollection>
+VulkanImplementationHeadless::RegisterSysmemBufferCollection(
+ VkDevice device,
+ gfx::SysmemBufferCollectionId id,
+ zx::channel token,
+ gfx::BufferFormat format,
+ gfx::BufferUsage usage,
+ gfx::Size size,
+ size_t min_buffer_count,
+ bool register_with_image_pipe) {
+ NOTIMPLEMENTED();
+ return nullptr;
+}
+#endif // BUILDFLAG(IS_FUCHSIA)
+
} // namespace ui
diff --git a/chromium/ui/ozone/platform/headless/vulkan_implementation_headless.h b/chromium/ui/ozone/platform/headless/vulkan_implementation_headless.h
index e52015edeb3..c3d8739dc46 100644
--- a/chromium/ui/ozone/platform/headless/vulkan_implementation_headless.h
+++ b/chromium/ui/ozone/platform/headless/vulkan_implementation_headless.h
@@ -51,6 +51,18 @@ class VulkanImplementationHeadless : public gpu::VulkanImplementation {
gfx::Size size,
VkFormat vk_format) override;
+#if BUILDFLAG(IS_FUCHSIA)
+ std::unique_ptr<gpu::SysmemBufferCollection> RegisterSysmemBufferCollection(
+ VkDevice device,
+ gfx::SysmemBufferCollectionId id,
+ zx::channel token,
+ gfx::BufferFormat format,
+ gfx::BufferUsage usage,
+ gfx::Size size,
+ size_t min_buffer_count,
+ bool register_with_image_pipe) override;
+#endif // BUILDFLAG(IS_FUCHSIA)
+
private:
bool using_surface_ = true;
gpu::VulkanInstance vulkan_instance_;
diff --git a/chromium/ui/ozone/platform/scenic/BUILD.gn b/chromium/ui/ozone/platform/scenic/BUILD.gn
index b30f97dfa88..198641b6109 100644
--- a/chromium/ui/ozone/platform/scenic/BUILD.gn
+++ b/chromium/ui/ozone/platform/scenic/BUILD.gn
@@ -4,6 +4,7 @@
assert(is_fuchsia)
+import("//build/config/dcheck_always_on.gni")
import("//gpu/vulkan/features.gni")
visibility = [ "//ui/ozone/*" ]
@@ -71,7 +72,6 @@ source_set("scenic") {
"//ui/ozone/common",
"//ui/ozone/platform/scenic/mojom",
]
-
public_deps = [
"//third_party/fuchsia-sdk/sdk/fidl/fuchsia.ui.gfx",
"//third_party/fuchsia-sdk/sdk/fidl/fuchsia.ui.input",
@@ -88,9 +88,14 @@ source_set("scenic") {
]
defines += [ "VK_USE_PLATFORM_MAGMA_KHR" ]
deps += [ "//gpu/ipc/common:vulkan_ycbcr_info" ]
- data_deps += [
- "//third_party/angle:libEGL",
- "//third_party/angle:libGLESv2",
- ]
+ data_deps += [ "//third_party/fuchsia-sdk/sdk/pkg/vulkan" ]
+
+ # VulkanInstance enables validation layer in Debug builds and when DCHECKs
+ # are enabled in Release builds. In these cases the validation layer
+ # libraries and configs need to be included in the generated Fuchsia
+ # package.
+ if (is_debug || dcheck_always_on) {
+ data_deps += [ "//third_party/fuchsia-sdk/sdk/pkg/vulkan_layers:VkLayer_khronos_validation" ]
+ }
}
}
diff --git a/chromium/ui/ozone/platform/scenic/ozone_platform_scenic.cc b/chromium/ui/ozone/platform/scenic/ozone_platform_scenic.cc
index 9ec94340e9d..17d8c7162dc 100644
--- a/chromium/ui/ozone/platform/scenic/ozone_platform_scenic.cc
+++ b/chromium/ui/ozone/platform/scenic/ozone_platform_scenic.cc
@@ -150,11 +150,12 @@ class OzonePlatformScenic : public OzonePlatform,
void InitScreen(PlatformScreen* screen) override {}
std::unique_ptr<InputMethod> CreateInputMethod(
- internal::InputMethodDelegate* delegate,
+ ImeKeyEventDispatcher* ime_key_event_dispatcher,
gfx::AcceleratedWidget widget) override {
return std::make_unique<InputMethodFuchsia>(
window_manager_->GetWindow(widget)->is_virtual_keyboard_enabled(),
- delegate, window_manager_->GetWindow(widget)->CloneViewRef());
+ ime_key_event_dispatcher,
+ window_manager_->GetWindow(widget)->CloneViewRef());
}
bool InitializeUI(const InitParams& params) override {
diff --git a/chromium/ui/ozone/platform/scenic/scenic_overlay_view.cc b/chromium/ui/ozone/platform/scenic/scenic_overlay_view.cc
index bcbfa096111..0431b82e606 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_overlay_view.cc
+++ b/chromium/ui/ozone/platform/scenic/scenic_overlay_view.cc
@@ -7,7 +7,7 @@
#include <lib/ui/scenic/cpp/commands.h>
#include "base/fuchsia/fuchsia_logging.h"
-#include "ui/ozone/platform/scenic/scenic_surface_factory.h"
+#include "base/location.h"
namespace ui {
@@ -58,26 +58,27 @@ void ScenicOverlayView::Initialize(
std::move(collection_token));
}
-bool ScenicOverlayView::AddImages(uint32_t buffer_count,
- const gfx::Size& size) {
- DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
+uint32_t ScenicOverlayView::AddImage(uint32_t buffer_index,
+ const gfx::Size& size) {
+ uint32_t id = next_image_id_++;
fuchsia::sysmem::ImageFormat_2 image_format = {};
image_format.coded_width = size.width();
image_format.coded_height = size.height();
- for (uint32_t i = 0; i < buffer_count; ++i) {
- // Image id cannot be 0, so add 1 to all buffer indices.
- image_pipe_->AddImage(i + 1, kImagePipeBufferCollectionId, i, image_format);
- }
- return true;
+ image_pipe_->AddImage(id, kImagePipeBufferCollectionId, buffer_index,
+ image_format);
+ return id;
+}
+
+void ScenicOverlayView::RemoveImage(uint32_t image_id) {
+ image_pipe_->RemoveImage(image_id);
}
-bool ScenicOverlayView::PresentImage(uint32_t buffer_index,
+bool ScenicOverlayView::PresentImage(uint32_t image_id,
std::vector<zx::event> acquire_fences,
std::vector<zx::event> release_fences) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
- image_pipe_->PresentImage(buffer_index + 1, zx_clock_get_monotonic(),
+ image_pipe_->PresentImage(image_id, zx_clock_get_monotonic(),
std::move(acquire_fences),
std::move(release_fences), [](auto) {});
return true;
diff --git a/chromium/ui/ozone/platform/scenic/scenic_overlay_view.h b/chromium/ui/ozone/platform/scenic/scenic_overlay_view.h
index 7512a9b48cb..304c6b67a90 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_overlay_view.h
+++ b/chromium/ui/ozone/platform/scenic/scenic_overlay_view.h
@@ -35,13 +35,17 @@ class ScenicOverlayView {
void Initialize(fidl::InterfaceHandle<fuchsia::sysmem::BufferCollectionToken>
collection_token);
- // Calls ImagePipe2::AddImage() on |image_pipe_| for all of |buffer_count|
- // images from the initialized BufferCollection with the specified |size|.
- bool AddImages(uint32_t buffer_count, const gfx::Size& size);
+ // Adds an image to the ImagePipe using the specified `buffer_index` and
+ // `size`. Returns a non-zero `image_id` that may be used in `PresentImage()`
+ // and `RemoveImage()`.
+ uint32_t AddImage(uint32_t buffer_index, const gfx::Size& size);
- // Calls ImagePipe2::PresentImage() on |image_pipe_| for the image
+ // Removes image with the `image_id_` from the ImagePipe.
+ void RemoveImage(uint32_t image_id);
+
+ // Calls `ImagePipe2::PresentImage()` on `image_pipe_` for the `image_id`
// corresponding to |buffer_index| from the initialized BufferCollection.
- bool PresentImage(uint32_t buffer_index,
+ bool PresentImage(uint32_t image_id,
std::vector<zx::event> acquire_fences,
std::vector<zx::event> release_fences);
@@ -59,6 +63,8 @@ class ScenicOverlayView {
fuchsia::images::ImagePipe2Ptr image_pipe_;
scenic::Material image_material_;
+ uint32_t next_image_id_ = 1;
+
bool enable_blend_ = false;
THREAD_CHECKER(thread_checker_);
diff --git a/chromium/ui/ozone/platform/scenic/scenic_surface.cc b/chromium/ui/ozone/platform/scenic/scenic_surface.cc
index ebb10e0bfa0..5ccacf554bb 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_surface.cc
+++ b/chromium/ui/ozone/platform/scenic/scenic_surface.cc
@@ -354,7 +354,7 @@ scoped_refptr<gfx::NativePixmap> ScenicSurface::AllocatePrimaryPlanePixmap(
image_format.coded_height = size.height();
image_pipe_->AddImage(image_id, image_id, 0, image_format);
- return buffer_collection->CreateNativePixmap(0);
+ return buffer_collection->CreateNativePixmap(0, size);
}
void ScenicSurface::SetTextureToNewImagePipe(
diff --git a/chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc b/chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc
index 7be47d7d34c..56adb317115 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc
+++ b/chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc
@@ -56,18 +56,20 @@ class GLOzoneEGLScenic : public GLOzoneEGL {
// GLOzone:
scoped_refptr<gl::GLSurface> CreateViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget window) override {
// GL rendering to Flatland views is not supported. This function is
// used only for unittests. Return an off-screen surface, so the tests pass.
// TODO(crbug.com/1271760): Use Vulkan in unittests and remove this hack.
return gl::InitializeGLSurface(base::MakeRefCounted<gl::SurfacelessEGL>(
- gl::GLSurfaceEGL::GetGLDisplayEGL(), gfx::Size(100, 100)));
+ display->GetAs<gl::GLDisplayEGL>(), gfx::Size(100, 100)));
}
scoped_refptr<gl::GLSurface> CreateOffscreenGLSurface(
+ gl::GLDisplay* display,
const gfx::Size& size) override {
return gl::InitializeGLSurface(base::MakeRefCounted<gl::SurfacelessEGL>(
- gl::GLSurfaceEGL::GetGLDisplayEGL(), size));
+ display->GetAs<gl::GLDisplayEGL>(), size));
}
gl::EGLDisplayPlatform GetNativeDisplay() override {
@@ -188,7 +190,7 @@ scoped_refptr<gfx::NativePixmap> ScenicSurfaceFactory::CreateNativePixmap(
if (!collection)
return nullptr;
- return collection->CreateNativePixmap(0);
+ return collection->CreateNativePixmap(0, size);
}
void ScenicSurfaceFactory::CreateNativePixmapAsync(
@@ -213,7 +215,7 @@ ScenicSurfaceFactory::CreateNativePixmapFromHandle(
if (!collection)
return nullptr;
- return collection->CreateNativePixmap(handle.buffer_index);
+ return collection->CreateNativePixmap(handle.buffer_index, size);
}
#if BUILDFLAG(ENABLE_VULKAN)
@@ -221,7 +223,7 @@ std::unique_ptr<gpu::VulkanImplementation>
ScenicSurfaceFactory::CreateVulkanImplementation(bool use_swiftshader,
bool allow_protected_memory) {
return std::make_unique<ui::VulkanImplementationScenic>(
- this, &sysmem_buffer_manager_, allow_protected_memory);
+ this, &sysmem_buffer_manager_, use_swiftshader, allow_protected_memory);
}
#endif
diff --git a/chromium/ui/ozone/platform/scenic/scenic_window.cc b/chromium/ui/ozone/platform/scenic/scenic_window.cc
index 2a62359a855..04979bbb69e 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_window.cc
+++ b/chromium/ui/ozone/platform/scenic/scenic_window.cc
@@ -64,7 +64,7 @@ ScenicWindow::ScenicWindow(ScenicWindowManager* window_manager,
node_(&scenic_session_),
input_node_(&scenic_session_),
render_node_(&scenic_session_),
- bounds_(properties.bounds) {
+ bounds_(delegate_->ConvertRectToPixels(properties.bounds)) {
if (view_controller_) {
view_controller_.set_error_handler(
fit::bind_member(this, &ScenicWindow::OnViewControllerDisconnected));
@@ -77,13 +77,11 @@ ScenicWindow::ScenicWindow(ScenicWindowManager* window_manager,
scenic_session_.SetDebugName("Chromium ScenicWindow");
// Subscribe to metrics events from the node. These events are used to
- // get the device pixel ratio for the screen.
+ // get the device pixel ratio for the screen. In order to receive metrics
+ // events on this node, we must also attach it to the scene graph.
node_.SetEventMask(fuchsia::ui::gfx::kMetricsEventMask);
-
- // Add input shape.
- node_.AddChild(input_node_);
-
- node_.AddChild(render_node_);
+ view_.AddChild(node_);
+ safe_presenter_.QueuePresent();
delegate_->OnAcceleratedWidgetAvailable(window_id_);
@@ -397,6 +395,7 @@ void ScenicWindow::UpdateSize() {
const float height = view_properties_->bounding_box.max.y -
view_properties_->bounding_box.min.y;
+ const gfx::Point old_origin = bounds_.origin();
bounds_ = gfx::Rect(ceilf(width * device_pixel_ratio_),
ceilf(height * device_pixel_ratio_));
@@ -420,8 +419,7 @@ void ScenicWindow::UpdateSize() {
// separately and we need to make sure our sizes change is committed.
safe_presenter_.QueuePresent();
- PlatformWindowDelegate::BoundsChange bounds;
- bounds.bounds = bounds_;
+ PlatformWindowDelegate::BoundsChange bounds(old_origin != bounds_.origin());
bounds.system_ui_overlap =
ConvertInsets(device_pixel_ratio_, *view_properties_);
delegate_->OnBoundsChanged(bounds);
@@ -431,10 +429,13 @@ bool ScenicWindow::UpdateRootNodeVisibility() {
bool should_show_root_node = is_visible_ && !is_zero_sized();
if (should_show_root_node != is_root_node_shown_) {
is_root_node_shown_ = should_show_root_node;
- if (should_show_root_node)
- view_.AddChild(node_);
- else
- node_.Detach();
+ if (should_show_root_node) {
+ // Attach nodes to render content and receive input.
+ node_.AddChild(input_node_);
+ node_.AddChild(render_node_);
+ } else {
+ node_.DetachChildren();
+ }
}
return is_root_node_shown_;
}
diff --git a/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc b/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc
index 86999aade43..9c8b705ee33 100644
--- a/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc
+++ b/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc
@@ -303,7 +303,8 @@ bool SysmemBufferCollection::Initialize(
}
scoped_refptr<gfx::NativePixmap> SysmemBufferCollection::CreateNativePixmap(
- size_t buffer_index) {
+ size_t buffer_index,
+ gfx::Size size) {
CHECK_LT(buffer_index, num_buffers());
gfx::NativePixmapHandle handle;
@@ -330,10 +331,10 @@ scoped_refptr<gfx::NativePixmap> SysmemBufferCollection::CreateNativePixmap(
// The logic should match LogicalBufferCollection::Allocate().
size_t stride =
RoundUp(std::max(static_cast<size_t>(format.min_bytes_per_row),
- image_size_.width() * GetBytesPerPixel(format_)),
+ size.width() * GetBytesPerPixel(format_)),
format.bytes_per_row_divisor);
size_t plane_offset = buffers_info_.buffers[buffer_index].vmo_usable_start;
- size_t plane_size = stride * image_size_.height();
+ size_t plane_size = stride * size.height();
handle.planes.emplace_back(stride, plane_offset, plane_size,
std::move(main_plane_vmo));
@@ -346,7 +347,7 @@ scoped_refptr<gfx::NativePixmap> SysmemBufferCollection::CreateNativePixmap(
DCHECK_LE(uv_plane_offset + uv_plane_size, buffer_size_);
}
- return new SysmemNativePixmap(this, std::move(handle));
+ return new SysmemNativePixmap(this, std::move(handle), size);
}
bool SysmemBufferCollection::CreateVkImage(
@@ -591,24 +592,9 @@ bool SysmemBufferCollection::InitializeInternal(
DCHECK_GE(buffers_info_.buffer_count, min_buffer_count);
DCHECK(buffers_info_.settings.has_image_format_constraints);
- // The logic should match LogicalBufferCollection::Allocate().
- const fuchsia::sysmem::ImageFormatConstraints& format =
- buffers_info_.settings.image_format_constraints;
- size_t width =
- RoundUp(std::max(format.min_coded_width, format.required_max_coded_width),
- format.coded_width_divisor);
- size_t height = RoundUp(
- std::max(format.min_coded_height, format.required_max_coded_height),
- format.coded_height_divisor);
- image_size_ = gfx::Size(width, height);
buffer_size_ = buffers_info_.settings.buffer_settings.size_bytes;
is_protected_ = buffers_info_.settings.buffer_settings.is_secure;
- // Add all images to Image pipe for presentation later.
- if (scenic_overlay_view_) {
- scenic_overlay_view_->AddImages(buffers_info_.buffer_count, image_size_);
- }
-
// CreateVkImage() should always be called on the same thread, but it may be
// different from the thread that called Initialize().
DETACH_FROM_THREAD(vulkan_thread_checker_);
diff --git a/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h b/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h
index a1caaf3db2f..29784cf0739 100644
--- a/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h
+++ b/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h
@@ -68,7 +68,8 @@ class SysmemBufferCollection
// Creates a NativePixmap the buffer with the specified index. Returned
// NativePixmap holds a reference to the collection, so the collection is not
// deleted until all NativePixmap are destroyed.
- scoped_refptr<gfx::NativePixmap> CreateNativePixmap(size_t buffer_index);
+ scoped_refptr<gfx::NativePixmap> CreateNativePixmap(size_t buffer_index,
+ gfx::Size size);
// Creates a new Vulkan image for the buffer with the specified index.
bool CreateVkImage(size_t buffer_index,
@@ -82,7 +83,6 @@ class SysmemBufferCollection
gfx::SysmemBufferCollectionId id() const { return id_; }
size_t num_buffers() const { return buffers_info_.buffer_count; }
- gfx::Size size() const { return image_size_; }
gfx::BufferFormat format() const { return format_; }
size_t buffer_size() const {
return buffers_info_.settings.buffer_settings.size_bytes;
@@ -142,7 +142,6 @@ class SysmemBufferCollection
// threads.
THREAD_CHECKER(vulkan_thread_checker_);
- gfx::Size image_size_;
size_t buffer_size_ = 0;
bool is_protected_ = false;
diff --git a/chromium/ui/ozone/platform/scenic/sysmem_native_pixmap.cc b/chromium/ui/ozone/platform/scenic/sysmem_native_pixmap.cc
index 868120934d5..90dde206f15 100644
--- a/chromium/ui/ozone/platform/scenic/sysmem_native_pixmap.cc
+++ b/chromium/ui/ozone/platform/scenic/sysmem_native_pixmap.cc
@@ -4,13 +4,8 @@
#include "ui/ozone/platform/scenic/sysmem_native_pixmap.h"
-#include "base/fuchsia/fuchsia_logging.h"
-#include "base/logging.h"
-#include "ui/gfx/geometry/rect_f.h"
#include "ui/gfx/gpu_fence.h"
#include "ui/gfx/overlay_plane_data.h"
-#include "ui/ozone/platform/scenic/scenic_surface.h"
-#include "ui/ozone/platform/scenic/scenic_surface_factory.h"
namespace ui {
@@ -25,10 +20,14 @@ zx::event GpuFenceToZxEvent(gfx::GpuFence fence) {
SysmemNativePixmap::SysmemNativePixmap(
scoped_refptr<SysmemBufferCollection> collection,
- gfx::NativePixmapHandle handle)
- : collection_(collection), handle_(std::move(handle)) {}
+ gfx::NativePixmapHandle handle,
+ gfx::Size size)
+ : collection_(collection), handle_(std::move(handle)), size_(size) {}
-SysmemNativePixmap::~SysmemNativePixmap() = default;
+SysmemNativePixmap::~SysmemNativePixmap() {
+ if (overlay_image_id_)
+ collection_->scenic_overlay_view()->RemoveImage(overlay_image_id_);
+}
bool SysmemNativePixmap::AreDmaBufFdsValid() const {
return false;
@@ -74,7 +73,7 @@ gfx::BufferFormat SysmemNativePixmap::GetBufferFormat() const {
}
gfx::Size SysmemNativePixmap::GetBufferSize() const {
- return collection_->size();
+ return size_;
}
uint32_t SysmemNativePixmap::GetUniqueId() const {
@@ -98,7 +97,11 @@ bool SysmemNativePixmap::ScheduleOverlayPlane(
release_events.push_back(GpuFenceToZxEvent(std::move(fence)));
overlay_view->SetBlendMode(overlay_plane_data.enable_blend);
- overlay_view->PresentImage(handle_.buffer_index, std::move(acquire_events),
+
+ if (!overlay_image_id_)
+ overlay_image_id_ = overlay_view->AddImage(handle_.buffer_index, size_);
+
+ overlay_view->PresentImage(overlay_image_id_, std::move(acquire_events),
std::move(release_events));
return true;
diff --git a/chromium/ui/ozone/platform/scenic/sysmem_native_pixmap.h b/chromium/ui/ozone/platform/scenic/sysmem_native_pixmap.h
index 80b97dda569..a75abd83b10 100644
--- a/chromium/ui/ozone/platform/scenic/sysmem_native_pixmap.h
+++ b/chromium/ui/ozone/platform/scenic/sysmem_native_pixmap.h
@@ -15,7 +15,8 @@ class ScenicOverlayView;
class SysmemNativePixmap : public gfx::NativePixmap {
public:
SysmemNativePixmap(scoped_refptr<SysmemBufferCollection> collection,
- gfx::NativePixmapHandle handle);
+ gfx::NativePixmapHandle handle,
+ gfx::Size size);
SysmemNativePixmap(const SysmemNativePixmap&) = delete;
SysmemNativePixmap& operator=(const SysmemNativePixmap&) = delete;
@@ -53,6 +54,11 @@ class SysmemNativePixmap : public gfx::NativePixmap {
// Keep reference to the collection to make sure it outlives the pixmap.
scoped_refptr<SysmemBufferCollection> collection_;
gfx::NativePixmapHandle handle_;
+ gfx::Size size_;
+
+ // ID of the image registered with the `ImagePipe` owned by the
+ // `ScenicOverlayView` that corresponds to the `collection_`.
+ uint32_t overlay_image_id_ = 0;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc b/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc
index b62e93e3319..69d1bbc1ef1 100644
--- a/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc
+++ b/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc
@@ -38,45 +38,38 @@ namespace {
constexpr char kFuchsiaSwapchainLayerName[] =
"VK_LAYER_FUCHSIA_imagepipe_swapchain";
-bool CheckSwapchainAvailable() {
- uint32_t num_instance_exts;
- VkResult result = vkEnumerateInstanceExtensionProperties(
- kFuchsiaSwapchainLayerName, &num_instance_exts, nullptr);
- return result == VK_SUCCESS;
-}
-
-bool IsSwapchainEnabled() {
- static bool is_swapchain_enabled = CheckSwapchainAvailable();
- return is_swapchain_enabled;
-}
-
} // namespace
VulkanImplementationScenic::VulkanImplementationScenic(
ScenicSurfaceFactory* scenic_surface_factory,
SysmemBufferManager* sysmem_buffer_manager,
+ bool use_swiftshader,
bool allow_protected_memory)
- : VulkanImplementation(false /* use_swiftshader */, allow_protected_memory),
+ : VulkanImplementation(use_swiftshader, allow_protected_memory),
scenic_surface_factory_(scenic_surface_factory),
sysmem_buffer_manager_(sysmem_buffer_manager) {}
VulkanImplementationScenic::~VulkanImplementationScenic() = default;
bool VulkanImplementationScenic::InitializeVulkanInstance(bool using_surface) {
- DCHECK(using_surface);
+ using_surface_ = using_surface;
- vulkan_instance_.BindUnassignedFunctionPointers(
- base::FilePath("libvulkan.so"));
+ base::FilePath path(use_swiftshader() ? "libvk_swiftshader.so"
+ : "libvulkan.so");
+ vulkan_instance_.BindUnassignedFunctionPointers(path);
- std::vector<const char*> required_extensions = {
- VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
- };
+ std::vector<const char*> required_extensions;
std::vector<const char*> required_layers;
- if (IsSwapchainEnabled()) {
- required_layers.push_back(kFuchsiaSwapchainLayerName);
+ if (using_surface) {
required_extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
- required_extensions.push_back(VK_FUCHSIA_IMAGEPIPE_SURFACE_EXTENSION_NAME);
+
+ // Enable ImagePipe swapchain (not supported in swiftshader).
+ if (!use_swiftshader()) {
+ required_layers.push_back(kFuchsiaSwapchainLayerName);
+ required_extensions.push_back(
+ VK_FUCHSIA_IMAGEPIPE_SURFACE_EXTENSION_NAME);
+ }
};
return vulkan_instance_.InitializeInstace(required_extensions,
@@ -89,10 +82,7 @@ gpu::VulkanInstance* VulkanImplementationScenic::GetVulkanInstance() {
std::unique_ptr<gpu::VulkanSurface>
VulkanImplementationScenic::CreateViewSurface(gfx::AcceleratedWidget window) {
- if (!IsSwapchainEnabled()) {
- LOG(FATAL) << "CreateViewSurface() called while swapchain extension isn't "
- "enabled.";
- }
+ DCHECK(using_surface_);
ScenicSurface* scenic_surface = scenic_surface_factory_->GetSurface(window);
fuchsia::images::ImagePipe2Ptr image_pipe;
@@ -128,7 +118,6 @@ bool VulkanImplementationScenic::GetPhysicalDevicePresentationSupport(
std::vector<const char*>
VulkanImplementationScenic::GetRequiredDeviceExtensions() {
std::vector<const char*> result = {
- VK_FUCHSIA_BUFFER_COLLECTION_EXTENSION_NAME,
VK_FUCHSIA_EXTERNAL_MEMORY_EXTENSION_NAME,
VK_FUCHSIA_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
VK_KHR_BIND_MEMORY_2_EXTENSION_NAME,
@@ -137,11 +126,15 @@ VulkanImplementationScenic::GetRequiredDeviceExtensions() {
VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
VK_KHR_MAINTENANCE1_EXTENSION_NAME,
- VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME,
};
- if (IsSwapchainEnabled())
- result.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
+ // Following extensions are not supported by Swiftshader.
+ if (!use_swiftshader()) {
+ result.push_back(VK_FUCHSIA_BUFFER_COLLECTION_EXTENSION_NAME);
+ result.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ if (using_surface_)
+ result.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
+ }
return result;
}
@@ -173,60 +166,15 @@ VkSemaphore VulkanImplementationScenic::CreateExternalSemaphore(
VkSemaphore VulkanImplementationScenic::ImportSemaphoreHandle(
VkDevice vk_device,
gpu::SemaphoreHandle handle) {
- if (!handle.is_valid())
- return VK_NULL_HANDLE;
-
- if (handle.vk_handle_type() !=
- VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA) {
- return VK_NULL_HANDLE;
- }
-
- VkSemaphore semaphore = VK_NULL_HANDLE;
- VkSemaphoreCreateInfo info = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO};
- VkResult result = vkCreateSemaphore(vk_device, &info, nullptr, &semaphore);
- if (result != VK_SUCCESS)
- return VK_NULL_HANDLE;
-
- zx::event event = handle.TakeHandle();
- VkImportSemaphoreZirconHandleInfoFUCHSIA import = {
- VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_ZIRCON_HANDLE_INFO_FUCHSIA};
- import.semaphore = semaphore;
- import.handleType =
- VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA;
- import.zirconHandle = event.get();
-
- result = vkImportSemaphoreZirconHandleFUCHSIA(vk_device, &import);
- if (result != VK_SUCCESS) {
- vkDestroySemaphore(vk_device, semaphore, nullptr);
- return VK_NULL_HANDLE;
- }
-
- // Vulkan took ownership of the handle.
- std::ignore = event.release();
-
- return semaphore;
+ return gpu::ImportVkSemaphoreHandle(vk_device, std::move(handle));
}
gpu::SemaphoreHandle VulkanImplementationScenic::GetSemaphoreHandle(
VkDevice vk_device,
VkSemaphore vk_semaphore) {
- // Create VkSemaphoreGetFdInfoKHR structure.
- VkSemaphoreGetZirconHandleInfoFUCHSIA info = {
- VK_STRUCTURE_TYPE_SEMAPHORE_GET_ZIRCON_HANDLE_INFO_FUCHSIA};
- info.semaphore = vk_semaphore;
- info.handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA;
-
- zx_handle_t handle;
- VkResult result =
- vkGetSemaphoreZirconHandleFUCHSIA(vk_device, &info, &handle);
- if (result != VK_SUCCESS) {
- LOG(ERROR) << "vkGetSemaphoreFuchsiaHandleKHR failed : " << result;
- return gpu::SemaphoreHandle();
- }
-
- return gpu::SemaphoreHandle(
- VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA,
- zx::event(handle));
+ return gpu::GetVkSemaphoreHandle(
+ vk_device, vk_semaphore,
+ VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA);
}
VkExternalMemoryHandleTypeFlagBits
@@ -287,7 +235,7 @@ VulkanImplementationScenic::CreateImageFromGpuMemoryHandle(
image->set_queue_family_index(VK_QUEUE_FAMILY_EXTERNAL);
image->set_native_pixmap(collection->CreateNativePixmap(
- gmb_handle.native_pixmap_handle.buffer_index));
+ gmb_handle.native_pixmap_handle.buffer_index, size));
return image;
}
diff --git a/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.h b/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.h
index 12856e8a101..03140edb877 100644
--- a/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.h
+++ b/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.h
@@ -21,6 +21,7 @@ class VulkanImplementationScenic : public gpu::VulkanImplementation {
public:
VulkanImplementationScenic(ScenicSurfaceFactory* scenic_surface_factory,
SysmemBufferManager* sysmem_buffer_manager,
+ bool use_swiftshader,
bool allow_protected_memory);
VulkanImplementationScenic(const VulkanImplementationScenic&) = delete;
@@ -73,6 +74,8 @@ class VulkanImplementationScenic : public gpu::VulkanImplementation {
SysmemBufferManager* const sysmem_buffer_manager_;
gpu::VulkanInstance vulkan_instance_;
+
+ bool using_surface_ = false;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/BUILD.gn b/chromium/ui/ozone/platform/wayland/BUILD.gn
index 60e1d262d2c..4ac34cea88c 100644
--- a/chromium/ui/ozone/platform/wayland/BUILD.gn
+++ b/chromium/ui/ozone/platform/wayland/BUILD.gn
@@ -82,6 +82,8 @@ source_set("wayland") {
"host/wayland_buffer_backing_shm.h",
"host/wayland_buffer_backing_solid_color.cc",
"host/wayland_buffer_backing_solid_color.h",
+ "host/wayland_buffer_factory.cc",
+ "host/wayland_buffer_factory.h",
"host/wayland_buffer_handle.cc",
"host/wayland_buffer_handle.h",
"host/wayland_buffer_manager_connector.cc",
@@ -124,8 +126,6 @@ source_set("wayland") {
"host/wayland_input_controller.h",
"host/wayland_input_method_context.cc",
"host/wayland_input_method_context.h",
- "host/wayland_input_method_context_factory.cc",
- "host/wayland_input_method_context_factory.h",
"host/wayland_keyboard.cc",
"host/wayland_keyboard.h",
"host/wayland_menu_utils.cc",
@@ -169,6 +169,16 @@ source_set("wayland") {
"host/wayland_zaura_output.h",
"host/wayland_zaura_shell.cc",
"host/wayland_zaura_shell.h",
+ "host/wayland_zcr_color_management_output.cc",
+ "host/wayland_zcr_color_management_output.h",
+ "host/wayland_zcr_color_management_surface.cc",
+ "host/wayland_zcr_color_management_surface.h",
+ "host/wayland_zcr_color_manager.cc",
+ "host/wayland_zcr_color_manager.h",
+ "host/wayland_zcr_color_space.cc",
+ "host/wayland_zcr_color_space.h",
+ "host/wayland_zcr_color_space_creator.cc",
+ "host/wayland_zcr_color_space_creator.h",
"host/wayland_zcr_cursor_shapes.cc",
"host/wayland_zcr_cursor_shapes.h",
"host/wayland_zcr_touchpad_haptics.cc",
@@ -181,6 +191,8 @@ source_set("wayland") {
"host/wayland_zwp_pointer_gestures.h",
"host/wayland_zwp_relative_pointer_manager.cc",
"host/wayland_zwp_relative_pointer_manager.h",
+ "host/xdg_activation.cc",
+ "host/xdg_activation.h",
"host/xdg_foreign_wrapper.cc",
"host/xdg_foreign_wrapper.h",
"host/xdg_output.cc",
@@ -228,6 +240,7 @@ source_set("wayland") {
"//build/config/linux/libdrm",
"//components/crash/core/common:crash_key",
"//components/exo/wayland/protocol:aura_shell_protocol",
+ "//components/exo/wayland/protocol:chrome_color_management_protocol",
"//components/exo/wayland/protocol:overlay_prioritizer_protocol",
"//components/exo/wayland/protocol:surface_augmenter_protocol",
"//mojo/public/cpp/bindings",
@@ -258,6 +271,7 @@ source_set("wayland") {
"//third_party/wayland-protocols:touchpad_haptics_protocol",
"//third_party/wayland-protocols:viewporter_protocol",
"//third_party/wayland-protocols:wayland_drm_protocol",
+ "//third_party/wayland-protocols:xdg_activation",
"//third_party/wayland-protocols:xdg_decoration_protocol",
"//third_party/wayland-protocols:xdg_foreign",
"//third_party/wayland-protocols:xdg_output_protocol",
@@ -267,13 +281,15 @@ source_set("wayland") {
"//ui/base:data_exchange",
"//ui/base:features",
"//ui/base/cursor",
- "//ui/base/cursor:theme_manager",
"//ui/base/cursor/mojom:cursor_type",
"//ui/base/dragdrop:types",
"//ui/base/dragdrop/mojom",
"//ui/base/ime/linux",
+ "//ui/base/wayland:color_manager_util",
"//ui/base/wayland:wayland_client_input_types",
+ "//ui/display",
"//ui/display/util:gpu_info_util",
+ "//ui/display/util:util",
"//ui/events",
"//ui/events:dom_keycode_converter",
"//ui/events/devices",
@@ -293,6 +309,10 @@ source_set("wayland") {
"//ui/platform_window/wm",
]
+ if (is_linux) {
+ deps += [ "//ui/linux:linux_ui" ]
+ }
+
if (use_dbus) {
sources += [
"host/org_gnome_mutter_idle_monitor.cc",
@@ -480,6 +500,12 @@ source_set("test_support") {
"test/test_xdg_popup.h",
"test/test_zaura_output.cc",
"test/test_zaura_output.h",
+ "test/test_zaura_popup.cc",
+ "test/test_zaura_popup.h",
+ "test/test_zaura_surface.cc",
+ "test/test_zaura_surface.h",
+ "test/test_zaura_toplevel.cc",
+ "test/test_zaura_toplevel.h",
"test/test_zcr_stylus.cc",
"test/test_zcr_stylus.h",
"test/test_zcr_text_input_extension.cc",
@@ -643,6 +669,7 @@ source_set("ui_test_support") {
"//ui/events:test_support",
"//ui/events/types:headers",
"//ui/gfx",
+ "//ui/ozone/platform/wayland",
"//ui/platform_window/common",
]
}
diff --git a/chromium/ui/ozone/platform/wayland/DEPS b/chromium/ui/ozone/platform/wayland/DEPS
index ea0ca3d0877..39c1c917668 100644
--- a/chromium/ui/ozone/platform/wayland/DEPS
+++ b/chromium/ui/ozone/platform/wayland/DEPS
@@ -2,4 +2,5 @@ include_rules = [
"+mojo/public",
"+third_party/wayland",
"+ui/base",
+ "+ui/linux",
]
diff --git a/chromium/ui/ozone/platform/wayland/common/wayland_object.cc b/chromium/ui/ozone/platform/wayland/common/wayland_object.cc
index d5d45a7d7a3..a1e1d810e39 100644
--- a/chromium/ui/ozone/platform/wayland/common/wayland_object.cc
+++ b/chromium/ui/ozone/platform/wayland/common/wayland_object.cc
@@ -6,6 +6,7 @@
#include <alpha-compositing-unstable-v1-client-protocol.h>
#include <aura-shell-client-protocol.h>
+#include <chrome-color-management-client-protocol.h>
#include <cursor-shapes-unstable-v1-client-protocol.h>
#include <extended-drag-unstable-v1-client-protocol.h>
#include <gtk-primary-selection-client-protocol.h>
@@ -31,6 +32,7 @@
#include <wayland-client-core.h>
#include <wayland-cursor.h>
#include <wayland-drm-client-protocol.h>
+#include <xdg-activation-v1-client-protocol.h>
#include <xdg-decoration-unstable-v1-client-protocol.h>
#include <xdg-foreign-unstable-v1-client-protocol.h>
#include <xdg-foreign-unstable-v2-client-protocol.h>
@@ -88,6 +90,42 @@ void delete_touch(wl_touch* touch) {
wl_touch_destroy(touch);
}
+void delete_zaura_shell(zaura_shell* shell) {
+ if (wl::get_version_of_object(shell) >= ZAURA_SHELL_RELEASE_SINCE_VERSION)
+ zaura_shell_release(shell);
+ else
+ zaura_shell_destroy(shell);
+}
+
+void delete_zaura_surface(zaura_surface* surface) {
+ if (wl::get_version_of_object(surface) >= ZAURA_SURFACE_RELEASE_SINCE_VERSION)
+ zaura_surface_release(surface);
+ else
+ zaura_surface_destroy(surface);
+}
+
+void delete_zaura_output(zaura_output* output) {
+ if (wl::get_version_of_object(output) >= ZAURA_OUTPUT_RELEASE_SINCE_VERSION)
+ zaura_output_release(output);
+ else
+ zaura_output_destroy(output);
+}
+
+void delete_zaura_toplevel(zaura_toplevel* toplevel) {
+ if (wl::get_version_of_object(toplevel) >=
+ ZAURA_TOPLEVEL_RELEASE_SINCE_VERSION)
+ zaura_toplevel_release(toplevel);
+ else
+ zaura_toplevel_destroy(toplevel);
+}
+
+void delete_zaura_popup(zaura_popup* popup) {
+ if (wl::get_version_of_object(popup) >= ZAURA_POPUP_RELEASE_SINCE_VERSION)
+ zaura_popup_release(popup);
+ else
+ zaura_popup_destroy(popup);
+}
+
} // namespace
bool CanBind(const std::string& interface,
@@ -172,17 +210,26 @@ IMPLEMENT_WAYLAND_OBJECT_TRAITS(wp_presentation)
IMPLEMENT_WAYLAND_OBJECT_TRAITS(wp_presentation_feedback)
IMPLEMENT_WAYLAND_OBJECT_TRAITS(wp_viewport)
IMPLEMENT_WAYLAND_OBJECT_TRAITS(wp_viewporter)
+IMPLEMENT_WAYLAND_OBJECT_TRAITS(xdg_activation_v1)
+IMPLEMENT_WAYLAND_OBJECT_TRAITS(xdg_activation_token_v1)
IMPLEMENT_WAYLAND_OBJECT_TRAITS(xdg_popup)
IMPLEMENT_WAYLAND_OBJECT_TRAITS(xdg_positioner)
IMPLEMENT_WAYLAND_OBJECT_TRAITS(xdg_surface)
IMPLEMENT_WAYLAND_OBJECT_TRAITS(xdg_toplevel)
IMPLEMENT_WAYLAND_OBJECT_TRAITS(xdg_wm_base)
-IMPLEMENT_WAYLAND_OBJECT_TRAITS(zaura_output)
-IMPLEMENT_WAYLAND_OBJECT_TRAITS(zaura_shell)
-IMPLEMENT_WAYLAND_OBJECT_TRAITS(zaura_surface)
-IMPLEMENT_WAYLAND_OBJECT_TRAITS(zaura_toplevel)
-IMPLEMENT_WAYLAND_OBJECT_TRAITS(zaura_popup)
+IMPLEMENT_WAYLAND_OBJECT_TRAITS_WITH_DELETER(zaura_shell, delete_zaura_shell)
+IMPLEMENT_WAYLAND_OBJECT_TRAITS_WITH_DELETER(zaura_surface,
+ delete_zaura_surface)
+IMPLEMENT_WAYLAND_OBJECT_TRAITS_WITH_DELETER(zaura_output, delete_zaura_output)
+IMPLEMENT_WAYLAND_OBJECT_TRAITS_WITH_DELETER(zaura_toplevel,
+ delete_zaura_toplevel)
+IMPLEMENT_WAYLAND_OBJECT_TRAITS_WITH_DELETER(zaura_popup, delete_zaura_popup)
IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_cursor_shapes_v1)
+IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_color_manager_v1)
+IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_color_management_output_v1)
+IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_color_management_surface_v1)
+IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_color_space_creator_v1)
+IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_color_space_v1)
IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_keyboard_extension_v1)
IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_extended_keyboard_v1)
IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_extended_drag_v1)
diff --git a/chromium/ui/ozone/platform/wayland/common/wayland_object.h b/chromium/ui/ozone/platform/wayland/common/wayland_object.h
index 8d278bbe95c..b32ae8bc91b 100644
--- a/chromium/ui/ozone/platform/wayland/common/wayland_object.h
+++ b/chromium/ui/ozone/platform/wayland/common/wayland_object.h
@@ -143,6 +143,8 @@ DECLARE_WAYLAND_OBJECT_TRAITS(wp_presentation)
DECLARE_WAYLAND_OBJECT_TRAITS(wp_presentation_feedback)
DECLARE_WAYLAND_OBJECT_TRAITS(wp_viewport)
DECLARE_WAYLAND_OBJECT_TRAITS(wp_viewporter)
+DECLARE_WAYLAND_OBJECT_TRAITS(xdg_activation_v1)
+DECLARE_WAYLAND_OBJECT_TRAITS(xdg_activation_token_v1)
DECLARE_WAYLAND_OBJECT_TRAITS(xdg_popup)
DECLARE_WAYLAND_OBJECT_TRAITS(xdg_positioner)
DECLARE_WAYLAND_OBJECT_TRAITS(xdg_surface)
@@ -154,6 +156,11 @@ DECLARE_WAYLAND_OBJECT_TRAITS(zaura_surface)
DECLARE_WAYLAND_OBJECT_TRAITS(zaura_toplevel)
DECLARE_WAYLAND_OBJECT_TRAITS(zaura_popup)
DECLARE_WAYLAND_OBJECT_TRAITS(zcr_cursor_shapes_v1)
+DECLARE_WAYLAND_OBJECT_TRAITS(zcr_color_manager_v1)
+DECLARE_WAYLAND_OBJECT_TRAITS(zcr_color_management_output_v1)
+DECLARE_WAYLAND_OBJECT_TRAITS(zcr_color_management_surface_v1)
+DECLARE_WAYLAND_OBJECT_TRAITS(zcr_color_space_creator_v1)
+DECLARE_WAYLAND_OBJECT_TRAITS(zcr_color_space_v1)
DECLARE_WAYLAND_OBJECT_TRAITS(zcr_blending_v1)
DECLARE_WAYLAND_OBJECT_TRAITS(zcr_alpha_compositing_v1)
DECLARE_WAYLAND_OBJECT_TRAITS(zcr_keyboard_extension_v1)
diff --git a/chromium/ui/ozone/platform/wayland/common/wayland_overlay_config.cc b/chromium/ui/ozone/platform/wayland/common/wayland_overlay_config.cc
index b9a35cac7ff..c6c649a0a25 100644
--- a/chromium/ui/ozone/platform/wayland/common/wayland_overlay_config.cc
+++ b/chromium/ui/ozone/platform/wayland/common/wayland_overlay_config.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "ui/ozone/platform/wayland/common/wayland_overlay_config.h"
+#include "ui/gfx/color_space.h"
namespace wl {
@@ -16,6 +17,7 @@ WaylandOverlayConfig::WaylandOverlayConfig(const gfx::OverlayPlaneData& data,
BufferId buffer_id,
float scale_factor)
: z_order(data.z_order),
+ color_space(data.color_space),
transform(data.plane_transform),
buffer_id(buffer_id),
surface_scale_factor(scale_factor),
diff --git a/chromium/ui/ozone/platform/wayland/common/wayland_overlay_config.h b/chromium/ui/ozone/platform/wayland/common/wayland_overlay_config.h
index 41dbe49702a..c6704f59ec2 100644
--- a/chromium/ui/ozone/platform/wayland/common/wayland_overlay_config.h
+++ b/chromium/ui/ozone/platform/wayland/common/wayland_overlay_config.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "ui/gfx/color_space.h"
#include "ui/gfx/gpu_fence.h"
#include "ui/gfx/gpu_fence_handle.h"
#include "ui/gfx/overlay_plane_data.h"
@@ -32,6 +33,9 @@ struct WaylandOverlayConfig {
// plane.
int z_order = 0;
+ // Specifies the color space data of the wayland config.
+ gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();
+
// Specifies how the buffer is to be transformed during composition.
gfx::OverlayTransform transform =
gfx::OverlayTransform::OVERLAY_TRANSFORM_NONE;
@@ -79,7 +83,7 @@ struct WaylandOverlayConfig {
gfx::RRectF rounded_clip_bounds;
// Optional: background color of this overlay plane.
- absl::optional<SkColor> background_color;
+ absl::optional<SkColor4f> background_color;
};
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/common/wayland_util.cc b/chromium/ui/ozone/platform/wayland/common/wayland_util.cc
index 56e0da69fc8..fca201f81fc 100644
--- a/chromium/ui/ozone/platform/wayland/common/wayland_util.cc
+++ b/chromium/ui/ozone/platform/wayland/common/wayland_util.cc
@@ -353,7 +353,11 @@ SkPath ConvertPathToDIP(const SkPath& path_in_pixels, float scale) {
void SkColorToWlArray(const SkColor& color, wl_array& array) {
SkColor4f precise_color = SkColor4f::FromColor(color);
- for (float component : precise_color.array()) {
+ SkColorToWlArray(precise_color, array);
+}
+
+void SkColorToWlArray(const SkColor4f& color, wl_array& array) {
+ for (float component : color.array()) {
float* ptr = static_cast<float*>(wl_array_add(&array, sizeof(float)));
DCHECK(ptr);
*ptr = component;
diff --git a/chromium/ui/ozone/platform/wayland/common/wayland_util.h b/chromium/ui/ozone/platform/wayland/common/wayland_util.h
index 6a2d12bd34e..836258d6e32 100644
--- a/chromium/ui/ozone/platform/wayland/common/wayland_util.h
+++ b/chromium/ui/ozone/platform/wayland/common/wayland_util.h
@@ -104,6 +104,9 @@ SkPath ConvertPathToDIP(const SkPath& path_in_pixels, float scale);
// Converts SkColor into wl_array.
void SkColorToWlArray(const SkColor& color, wl_array& array);
+// Converts SkColor4f into wl_array.
+void SkColorToWlArray(const SkColor4f& color, wl_array& array);
+
} // namespace wl
#endif // UI_OZONE_PLATFORM_WAYLAND_COMMON_WAYLAND_UTIL_H_
diff --git a/chromium/ui/ozone/platform/wayland/emulate/wayland_input_emulate.cc b/chromium/ui/ozone/platform/wayland/emulate/wayland_input_emulate.cc
index cecdf9b0dac..036b01fd8b0 100644
--- a/chromium/ui/ozone/platform/wayland/emulate/wayland_input_emulate.cc
+++ b/chromium/ui/ozone/platform/wayland/emulate/wayland_input_emulate.cc
@@ -7,34 +7,56 @@
#include <linux/input.h>
#include <wayland-client-protocol.h>
#include <weston-test-client-protocol.h>
+#include <weston-test-server-protocol.h>
#include <memory>
#include "base/logging.h"
#include "base/time/time.h"
+#include "ui/base/test/ui_controls.h"
#include "ui/events/keycodes/dom/keycode_converter.h"
+#include "ui/ozone/platform/wayland/host/wayland_window.h"
#include "ui/platform_window/common/platform_window_defaults.h"
namespace wl {
WaylandInputEmulate::PendingEvent::PendingEvent(
ui::EventType event_type,
- gfx::AcceleratedWidget target_widget)
+ gfx::AcceleratedWidget target_widget,
+ WaylandInputEmulate* emulate)
: type(event_type), widget(target_widget) {
DCHECK(type == ui::EventType::ET_MOUSE_MOVED ||
type == ui::EventType::ET_MOUSE_PRESSED ||
type == ui::EventType::ET_MOUSE_RELEASED ||
type == ui::EventType::ET_KEY_PRESSED ||
- type == ui::EventType::ET_KEY_RELEASED);
+ type == ui::EventType::ET_KEY_RELEASED ||
+ type == ui::EventType::ET_TOUCH_PRESSED ||
+ type == ui::EventType::ET_TOUCH_MOVED ||
+ type == ui::EventType::ET_TOUCH_RELEASED);
+ auto it = emulate->windows_.find(widget);
+ if (it != emulate->windows_.end()) {
+ test_window = it->second->weak_factory.GetWeakPtr();
+ }
}
-WaylandInputEmulate::PendingEvent::~PendingEvent() = default;
+namespace {
-WaylandInputEmulate::TestWindow::TestWindow(
- gfx::AcceleratedWidget target_widget,
- WaylandInputEmulate* input_emulate)
- : widget(target_widget), emulate(input_emulate) {}
+int EventTypeToWaylandTouchType(ui::EventType event_type) {
+ switch (event_type) {
+ case ui::EventType::ET_TOUCH_PRESSED:
+ return WL_TOUCH_DOWN;
+ case ui::EventType::ET_TOUCH_MOVED:
+ return WL_TOUCH_MOTION;
+ default:
+ return WL_TOUCH_UP;
+ }
+}
+
+} // namespace
+
+WaylandInputEmulate::PendingEvent::~PendingEvent() = default;
+WaylandInputEmulate::TestWindow::TestWindow() = default;
WaylandInputEmulate::TestWindow::~TestWindow() = default;
WaylandInputEmulate::WaylandInputEmulate() {
@@ -61,6 +83,8 @@ WaylandInputEmulate::WaylandInputEmulate() {
&WaylandInputEmulate::HandlePointerPosition,
&WaylandInputEmulate::HandlePointerButton,
&WaylandInputEmulate::HandleKeyboardKey,
+ nullptr, // capture_screenshot_done
+ &WaylandInputEmulate::HandleTouchReceived,
};
weston_test_add_listener(weston_test_, &test_listener, this);
}
@@ -83,40 +107,50 @@ void WaylandInputEmulate::RemoveObserver(Observer* obs) {
observers_.RemoveObserver(obs);
}
-void WaylandInputEmulate::EmulatePointerMotion(gfx::AcceleratedWidget widget,
- gfx::Point mouse_surface_loc) {
- auto it = windows_.find(widget);
- DCHECK(it != windows_.end());
-
- auto* test_window = it->second.get();
- if (!test_window->buffer_attached_and_configured) {
- auto pending_event =
- std::make_unique<PendingEvent>(ui::EventType::ET_MOUSE_MOVED, widget);
- pending_event->pointer_surface_location_in_px = mouse_surface_loc;
- test_window->pending_events.emplace_back(std::move(pending_event));
+void WaylandInputEmulate::EmulatePointerMotion(
+ gfx::AcceleratedWidget widget,
+ const gfx::Point& mouse_surface_loc,
+ const gfx::Point& mouse_screen_loc_in_px) {
+ if (AnyWindowWaitingForBufferCommit()) {
+ auto pending_event = std::make_unique<PendingEvent>(
+ ui::EventType::ET_MOUSE_MOVED, widget, this);
+ pending_event->pointer_surface_location = mouse_surface_loc;
+ pending_event->pointer_screen_location_in_px = mouse_screen_loc_in_px;
+ pending_events_.emplace_back(std::move(pending_event));
return;
}
+ // If the widget does not have a buffer, pretend it doesn't exist. It is
+ // treated similarly on the server.
+ auto it = windows_.find(widget);
+ if (it != windows_.end()) {
+ if (!it->second->buffer_attached_and_configured)
+ widget = 0;
+ }
+
auto* wayland_proxy = wl::WaylandProxy::GetInstance();
DCHECK(wayland_proxy);
- auto* wlsurface = wayland_proxy->GetWlSurfaceForAcceleratedWidget(widget);
-
- // If it's a toplevel window, activate it. This results in raising the the
- // parent window and its children windows.
- auto window_type = wayland_proxy->GetWindowType(widget);
- if (window_type != ui::PlatformWindowType::kTooltip &&
- window_type != ui::PlatformWindowType::kMenu &&
- !wayland_proxy->WindowHasPointerFocus(widget)) {
- weston_test_activate_surface(weston_test_, wlsurface);
+ wl_surface* target_surface = nullptr;
+ gfx::Point target_location = mouse_screen_loc_in_px;
+ if (widget) {
+ auto* wlsurface = wayland_proxy->GetWlSurfaceForAcceleratedWidget(widget);
+ bool screen_coordinates =
+ wayland_proxy->GetWaylandWindowForAcceleratedWidget(widget)
+ ->IsScreenCoordinatesEnabled();
+
+ target_surface = screen_coordinates ? nullptr : wlsurface;
+ target_location =
+ screen_coordinates ? mouse_screen_loc_in_px : mouse_surface_loc;
}
+ // TODO(crbug.com/1306688): The coordinate should be in DIP.
timespec ts = (base::TimeTicks::Now() - base::TimeTicks()).ToTimeSpec();
- weston_test_move_pointer(weston_test_, wlsurface,
+ weston_test_move_pointer(weston_test_, target_surface,
static_cast<uint64_t>(ts.tv_sec) >> 32,
ts.tv_sec & 0xffffffff, ts.tv_nsec,
- mouse_surface_loc.x(), mouse_surface_loc.y());
- wayland_proxy->ScheduleDisplayFlush();
+ target_location.x(), target_location.y());
+ wayland_proxy->FlushForTesting();
}
void WaylandInputEmulate::EmulatePointerButton(gfx::AcceleratedWidget widget,
@@ -124,16 +158,12 @@ void WaylandInputEmulate::EmulatePointerButton(gfx::AcceleratedWidget widget,
uint32_t changed_button) {
DCHECK(event_type == ui::EventType::ET_MOUSE_PRESSED ||
event_type == ui::EventType::ET_MOUSE_RELEASED);
- // A button press/release event uses previous location that Ozone/Wayland got
- // when OnPointerMotionEvent was called.
- auto it = windows_.find(widget);
- DCHECK(it != windows_.end());
- auto* test_window = it->second.get();
- if (!test_window->buffer_attached_and_configured) {
- auto pending_event = std::make_unique<PendingEvent>(event_type, widget);
+ if (AnyWindowWaitingForBufferCommit()) {
+ auto pending_event =
+ std::make_unique<PendingEvent>(event_type, widget, this);
pending_event->mouse_button = changed_button;
- test_window->pending_events.emplace_back(std::move(pending_event));
+ pending_events_.emplace_back(std::move(pending_event));
return;
}
@@ -144,6 +174,8 @@ void WaylandInputEmulate::EmulatePointerButton(gfx::AcceleratedWidget widget,
(event_type == ui::EventType::ET_MOUSE_PRESSED
? WL_POINTER_BUTTON_STATE_PRESSED
: WL_POINTER_BUTTON_STATE_RELEASED));
+ auto* wayland_proxy = wl::WaylandProxy::GetInstance();
+ wayland_proxy->FlushForTesting();
}
void WaylandInputEmulate::EmulateKeyboardKey(gfx::AcceleratedWidget widget,
@@ -152,26 +184,14 @@ void WaylandInputEmulate::EmulateKeyboardKey(gfx::AcceleratedWidget widget,
DCHECK(event_type == ui::EventType::ET_KEY_PRESSED ||
event_type == ui::EventType::ET_KEY_RELEASED);
- auto it = windows_.find(widget);
- DCHECK(it != windows_.end());
-
- auto* test_window = it->second.get();
- if (!test_window->buffer_attached_and_configured) {
- auto pending_event = std::make_unique<PendingEvent>(event_type, widget);
+ if (AnyWindowWaitingForBufferCommit()) {
+ auto pending_event =
+ std::make_unique<PendingEvent>(event_type, widget, this);
pending_event->key_dom_code = dom_code;
- test_window->pending_events.emplace_back(std::move(pending_event));
+ pending_events_.emplace_back(std::move(pending_event));
return;
}
- auto* wayland_proxy = wl::WaylandProxy::GetInstance();
- DCHECK(wayland_proxy);
-
- auto* wlsurface = wayland_proxy->GetWlSurfaceForAcceleratedWidget(widget);
-
- // Raise the window and set keyboard focus.
- if (!wayland_proxy->WindowHasKeyboardFocus(widget))
- weston_test_activate_surface(weston_test_, wlsurface);
-
timespec ts = (base::TimeTicks::Now() - base::TimeTicks()).ToTimeSpec();
weston_test_send_key(weston_test_, static_cast<uint64_t>(ts.tv_sec) >> 32,
ts.tv_sec & 0xffffffff, ts.tv_nsec,
@@ -179,7 +199,31 @@ void WaylandInputEmulate::EmulateKeyboardKey(gfx::AcceleratedWidget widget,
(event_type == ui::EventType::ET_KEY_PRESSED
? WL_KEYBOARD_KEY_STATE_PRESSED
: WL_KEYBOARD_KEY_STATE_RELEASED));
- wayland_proxy->ScheduleDisplayFlush();
+ auto* wayland_proxy = wl::WaylandProxy::GetInstance();
+ wayland_proxy->FlushForTesting();
+}
+
+void WaylandInputEmulate::EmulateTouch(gfx::AcceleratedWidget widget,
+ ui::EventType event_type,
+ int id,
+ const gfx::Point& touch_screen_loc) {
+ if (AnyWindowWaitingForBufferCommit()) {
+ auto pending_event =
+ std::make_unique<PendingEvent>(event_type, widget, this);
+ pending_event->touch_screen_location = touch_screen_loc;
+ pending_event->touch_id = id;
+ pending_events_.emplace_back(std::move(pending_event));
+ return;
+ }
+
+ timespec ts = (base::TimeTicks::Now() - base::TimeTicks()).ToTimeSpec();
+ weston_test_send_touch(weston_test_, static_cast<uint64_t>(ts.tv_sec) >> 32,
+ ts.tv_sec & 0xffffffff, ts.tv_nsec, id,
+ wl_fixed_from_int(touch_screen_loc.x()),
+ wl_fixed_from_int(touch_screen_loc.y()),
+ EventTypeToWaylandTouchType(event_type));
+ auto* wayland_proxy = wl::WaylandProxy::GetInstance();
+ wayland_proxy->FlushForTesting();
}
void WaylandInputEmulate::OnWindowConfigured(gfx::AcceleratedWidget widget,
@@ -192,6 +236,7 @@ void WaylandInputEmulate::OnWindowConfigured(gfx::AcceleratedWidget widget,
// the configuration event comes.
if (!is_configured) {
test_surface->buffer_attached_and_configured = false;
+ test_surface->waiting_for_buffer_commit = false;
// Also destroy the frame callback...
if (test_surface->frame_callback) {
wl_callback_destroy(test_surface->frame_callback);
@@ -202,15 +247,17 @@ void WaylandInputEmulate::OnWindowConfigured(gfx::AcceleratedWidget widget,
auto* wayland_proxy = wl::WaylandProxy::GetInstance();
DCHECK(wayland_proxy);
wayland_proxy->DestroyShmForWlBuffer(test_surface->buffer);
- wayland_proxy->ScheduleDisplayFlush();
+ wayland_proxy->FlushForTesting();
test_surface->buffer = nullptr;
}
+ DispatchPendingEvents();
return;
}
if (test_surface->buffer_attached_and_configured)
return;
+ test_surface->waiting_for_buffer_commit = true;
auto* wayland_proxy = wl::WaylandProxy::GetInstance();
DCHECK(wayland_proxy);
@@ -220,7 +267,9 @@ void WaylandInputEmulate::OnWindowConfigured(gfx::AcceleratedWidget widget,
//
// This is needed as running some tests doesn't result in sending frames that
// require buffers to be created.
- auto buffer_size = wayland_proxy->GetWindowBounds(widget).size();
+ auto* wayland_window =
+ wayland_proxy->GetWaylandWindowForAcceleratedWidget(widget);
+ auto buffer_size = wayland_window->GetBoundsInPixels().size();
// Adjust the buffer size in case if the window was created with empty size.
if (buffer_size.IsEmpty())
buffer_size.SetSize(1, 1);
@@ -242,7 +291,17 @@ void WaylandInputEmulate::OnWindowConfigured(gfx::AcceleratedWidget widget,
wl_surface_commit(wlsurface);
- wayland_proxy->ScheduleDisplayFlush();
+ wayland_proxy->FlushForTesting();
+}
+
+void WaylandInputEmulate::OnWindowRoleAssigned(gfx::AcceleratedWidget widget) {
+ auto it = windows_.find(widget);
+ DCHECK(it != windows_.end());
+
+ // If a window has been assigned a popup role, then we must wait for a buffer
+ // to be committed before any events can be processed.
+ auto* test_surface = it->second.get();
+ test_surface->waiting_for_buffer_commit = true;
}
void WaylandInputEmulate::OnWindowRemoved(gfx::AcceleratedWidget widget) {
@@ -260,7 +319,7 @@ void WaylandInputEmulate::OnWindowRemoved(gfx::AcceleratedWidget widget) {
auto* wayland_proxy = wl::WaylandProxy::GetInstance();
DCHECK(wayland_proxy);
wayland_proxy->DestroyShmForWlBuffer(it->second->buffer);
- wayland_proxy->ScheduleDisplayFlush();
+ wayland_proxy->FlushForTesting();
}
windows_.erase(it);
}
@@ -271,13 +330,28 @@ void WaylandInputEmulate::OnWindowAdded(gfx::AcceleratedWidget widget) {
// a button pressed state left if the previous test crashed.
if (windows_.empty()) {
weston_test_reset_pointer(weston_test_);
+
+ // Release all meta-keys to deal with carry-over state from previous tests.
+ std::vector<ui::DomCode> meta_keys = {
+ ui::DomCode::CONTROL_LEFT, ui::DomCode::SHIFT_LEFT,
+ ui::DomCode::ALT_LEFT, ui::DomCode::META_LEFT,
+ ui::DomCode::CONTROL_RIGHT, ui::DomCode::SHIFT_RIGHT,
+ ui::DomCode::ALT_RIGHT, ui::DomCode::META_RIGHT,
+ };
+ for (auto key : meta_keys) {
+ timespec ts = (base::TimeTicks::Now() - base::TimeTicks()).ToTimeSpec();
+ weston_test_send_key(weston_test_, static_cast<uint64_t>(ts.tv_sec) >> 32,
+ ts.tv_sec & 0xffffffff, ts.tv_nsec,
+ ui::KeycodeConverter::DomCodeToEvdevCode(key),
+ WL_KEYBOARD_KEY_STATE_RELEASED);
+ }
+
auto* wayland_proxy = wl::WaylandProxy::GetInstance();
DCHECK(wayland_proxy);
- wayland_proxy->ScheduleDisplayFlush();
+ wayland_proxy->FlushForTesting();
}
- windows_.emplace(
- widget, std::make_unique<WaylandInputEmulate::TestWindow>(widget, this));
+ windows_.emplace(widget, std::make_unique<WaylandInputEmulate::TestWindow>());
}
// static
@@ -286,8 +360,8 @@ void WaylandInputEmulate::HandlePointerPosition(void* data,
wl_fixed_t x,
wl_fixed_t y) {
WaylandInputEmulate* emulate = static_cast<WaylandInputEmulate*>(data);
- auto mouse_position_on_screen_px =
- gfx::Point(wl_fixed_to_int(x), wl_fixed_to_int(y));
+ gfx::Point mouse_position_on_screen_px(wl_fixed_to_int(x),
+ wl_fixed_to_int(y));
for (WaylandInputEmulate::Observer& observer : emulate->observers_)
observer.OnPointerMotionGlobal(mouse_position_on_screen_px);
}
@@ -315,6 +389,18 @@ void WaylandInputEmulate::HandleKeyboardKey(void* data,
}
// static
+void WaylandInputEmulate::HandleTouchReceived(void* data,
+ struct weston_test* weston_test,
+ wl_fixed_t x,
+ wl_fixed_t y) {
+ WaylandInputEmulate* emulate = static_cast<WaylandInputEmulate*>(data);
+ auto touch_position_on_screen_px =
+ gfx::Point(wl_fixed_to_int(x), wl_fixed_to_int(y));
+ for (WaylandInputEmulate::Observer& observer : emulate->observers_)
+ observer.OnTouchReceived(touch_position_on_screen_px);
+}
+
+// static
void WaylandInputEmulate::Global(void* data,
wl_registry* registry,
uint32_t name,
@@ -345,36 +431,57 @@ void WaylandInputEmulate::FrameCallbackHandler(void* data,
}
}
- if (!window)
- return;
+ if (window) {
+ wl_callback_destroy(window->frame_callback);
+ window->frame_callback = nullptr;
- wl_callback_destroy(window->frame_callback);
- window->frame_callback = nullptr;
+ DCHECK(!window->buffer_attached_and_configured);
+ window->buffer_attached_and_configured = true;
+ window->waiting_for_buffer_commit = false;
+ }
- DCHECK(!window->buffer_attached_and_configured);
- window->buffer_attached_and_configured = true;
+ emulate->DispatchPendingEvents();
+}
- while (!window->pending_events.empty()) {
- auto event = std::move(window->pending_events.front());
- window->pending_events.pop_front();
+bool WaylandInputEmulate::AnyWindowWaitingForBufferCommit() {
+ for (auto& it : windows_) {
+ if (it.second->waiting_for_buffer_commit)
+ return true;
+ }
+ return false;
+}
- auto* input_emulate = window->emulate;
- DCHECK(input_emulate);
+void WaylandInputEmulate::DispatchPendingEvents() {
+ while (!pending_events_.empty()) {
+ // Cannot dispatch pending events if there's a window waiting for a buffer
+ // commit.
+ if (AnyWindowWaitingForBufferCommit())
+ return;
+ auto event = std::move(pending_events_.front());
+ pending_events_.pop_front();
switch (event->type) {
case ui::EventType::ET_MOUSE_MOVED:
- input_emulate->EmulatePointerMotion(
- window->widget, event->pointer_surface_location_in_px);
+ // If the test window has been destroyed then do not use a widget.
+ if (!event->test_window)
+ event->widget = 0;
+ EmulatePointerMotion(
+ /*widget=*/event->widget, event->pointer_surface_location,
+ event->pointer_screen_location_in_px);
break;
case ui::EventType::ET_MOUSE_PRESSED:
case ui::EventType::ET_MOUSE_RELEASED:
- input_emulate->EmulatePointerButton(window->widget, event->type,
- event->mouse_button);
+ EmulatePointerButton(/*widget=*/0, event->type, event->mouse_button);
break;
case ui::EventType::ET_KEY_PRESSED:
case ui::EventType::ET_KEY_RELEASED:
- input_emulate->EmulateKeyboardKey(window->widget, event->type,
- event->key_dom_code);
+ EmulateKeyboardKey(/*widget=*/0, event->type, event->key_dom_code);
+ break;
+ case ui::EventType::ET_TOUCH_PRESSED:
+ case ui::EventType::ET_TOUCH_MOVED:
+ case ui::EventType::ET_TOUCH_RELEASED:
+ EmulateTouch(/*widget=*/0, event->type, event->touch_id,
+ event->touch_screen_location);
break;
default:
NOTREACHED();
diff --git a/chromium/ui/ozone/platform/wayland/emulate/wayland_input_emulate.h b/chromium/ui/ozone/platform/wayland/emulate/wayland_input_emulate.h
index 77a5ec61a55..34646f09775 100644
--- a/chromium/ui/ozone/platform/wayland/emulate/wayland_input_emulate.h
+++ b/chromium/ui/ozone/platform/wayland/emulate/wayland_input_emulate.h
@@ -12,6 +12,8 @@
#include "base/component_export.h"
#include "base/containers/circular_deque.h"
#include "base/containers/flat_map.h"
+#include "base/memory/raw_ptr.h"
+#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "ui/events/keycodes/dom/dom_code.h"
#include "ui/events/types/event_type.h"
@@ -26,7 +28,7 @@ struct wl_callback;
namespace wl {
-// Emulates Keyboard, Pointer, Touch events that ui_interactive_tests test
+// Emulates Keyboard, Pointer, and Touch events that ui_interactive_tests test
// suite sends. Mustn't be used in production code.
class WaylandInputEmulate : public wl::WaylandProxy::Delegate {
public:
@@ -43,6 +45,10 @@ class WaylandInputEmulate : public wl::WaylandProxy::Delegate {
// event codes in Linux's input-event-codes.h.
virtual void OnKeyboardKey(int32_t key, bool pressed) = 0;
+ // Notifies that the Wayland compositor has sent a touch event to
+ // |screen_position|.
+ virtual void OnTouchReceived(const gfx::Point& screen_position) = 0;
+
protected:
~Observer() override = default;
};
@@ -53,49 +59,62 @@ class WaylandInputEmulate : public wl::WaylandProxy::Delegate {
void AddObserver(Observer* obs);
void RemoveObserver(Observer* obs);
void EmulatePointerMotion(gfx::AcceleratedWidget widget,
- gfx::Point mouse_surface_loc);
+ const gfx::Point& mouse_surface_loc,
+ const gfx::Point& mouse_screen_loc_in_px);
+
+ // |widget| is only needed to queue up the event if the widget is not yet
+ // configured. If the event is being dequeued then |widget| will be 0.
void EmulatePointerButton(gfx::AcceleratedWidget widget,
ui::EventType event_type,
uint32_t changed_button);
void EmulateKeyboardKey(gfx::AcceleratedWidget widget,
ui::EventType event_type,
ui::DomCode dom_code);
+ void EmulateTouch(gfx::AcceleratedWidget widget,
+ ui::EventType event_type,
+ int id,
+ const gfx::Point& touch_screen_loc);
private:
+ struct TestWindow;
+
// Pending emulated events. Can be ET_MOUSE_MOVED,
- // ET_MOUSE_PRESSED/ET_MOUSE_RELEASED, or ET_KEY_PRESSED/ET_KEY_RELEASED.
+ // ET_MOUSE_PRESSED/ET_MOUSE_RELEASED, ET_KEY_PRESSED/ET_KEY_RELEASED, or
+ // ET_TOUCH_PRESSED/ET_TOUCH_MOVED/ET_TOUCH_RELEASED.
struct PendingEvent {
PendingEvent(ui::EventType event_type,
- gfx::AcceleratedWidget target_widget);
+ gfx::AcceleratedWidget target_widget,
+ WaylandInputEmulate*);
~PendingEvent();
ui::EventType type;
gfx::AcceleratedWidget widget;
+ base::WeakPtr<TestWindow> test_window;
+
+ // Set for type == ET_MOUSE_MOVED. Locations are
+ // in surface local, and pixel screen coordinates respectively.
+ gfx::Point pointer_surface_location;
+ gfx::Point pointer_screen_location_in_px;
- // Set for type == ET_MOUSE_MOVED.
- gfx::Point pointer_surface_location_in_px;
+ // Set for type == ET_TOUCH_*. Location is in dip screen coordinates.
+ gfx::Point touch_screen_location;
// Set for type == ET_MOUSE_PRESSED || type == ET_MOUSE_RELEASED.
uint32_t mouse_button = 0;
// Set for type == ET_KEY_PRESSED || type == ET_KEY_RELEASED.
ui::DomCode key_dom_code = ui::DomCode::NONE;
+
+ // Set for type == ET_TOUCH_*.
+ int touch_id = 0;
};
// A container that tracks created WaylandWindows and keeps some fundamental
// bits to make emulation work flawlessly.
struct TestWindow {
- TestWindow(gfx::AcceleratedWidget target_widget,
- WaylandInputEmulate* emulate);
+ TestWindow();
~TestWindow();
- // Widget that this TestWindow represents. This corresponds to a
- // WaylandWindow created on the Ozone/Wayland side.
- gfx::AcceleratedWidget widget;
-
- // Non-owned pointer to input emulation.
- WaylandInputEmulate* emulate = nullptr;
-
// Control flag that says if the buffer has been attached and a consequent
// frame callback has been received. This is required to be able to know
// that the surface has consumed the attached buffer and Wayland properly
@@ -104,15 +123,17 @@ class WaylandInputEmulate : public wl::WaylandProxy::Delegate {
// call.
bool buffer_attached_and_configured = false;
- // Pending events to be sent for this TestWindow. These are sent after
- // buffer_attached_and_configured is set to true.
- base::circular_deque<std::unique_ptr<PendingEvent>> pending_events;
-
// Frame callback that invokes WaylandInputEmulate::FrameCallbackHandler.
- struct wl_callback* frame_callback = nullptr;
+ raw_ptr<struct wl_callback> frame_callback = nullptr;
// The attached buffer.
- wl_buffer* buffer = nullptr;
+ raw_ptr<wl_buffer> buffer = nullptr;
+
+ // True if the window was created or assigned a role and is now waiting for
+ // a buffer to be committed.
+ bool waiting_for_buffer_commit = false;
+
+ base::WeakPtrFactory<TestWindow> weak_factory{this};
};
// WaylandProxy::Delegate.
@@ -120,6 +141,7 @@ class WaylandInputEmulate : public wl::WaylandProxy::Delegate {
void OnWindowRemoved(gfx::AcceleratedWidget widget) override;
void OnWindowConfigured(gfx::AcceleratedWidget widget,
bool is_configured) override;
+ void OnWindowRoleAssigned(gfx::AcceleratedWidget widget) override;
// weston_test_listener.
static void HandlePointerPosition(void* data,
@@ -134,6 +156,10 @@ class WaylandInputEmulate : public wl::WaylandProxy::Delegate {
struct weston_test* weston_test,
uint32_t key,
uint32_t state);
+ static void HandleTouchReceived(void* data,
+ struct weston_test* weston_test,
+ wl_fixed_t x,
+ wl_fixed_t y);
// wl_registry_listener.
static void Global(void* data,
@@ -147,18 +173,33 @@ class WaylandInputEmulate : public wl::WaylandProxy::Delegate {
struct wl_callback* callback,
uint32_t time);
- // Stores existing windows.
+ // Returns true if there is at least one window that has been created but that
+ // does not yet have a buffer committed.
+ bool AnyWindowWaitingForBufferCommit();
+
+ // Dispatches all pending events.
+ void DispatchPendingEvents();
+
+ // Window creation is asynchronous in wayland. First we create the window,
+ // then we must attach and commit a buffer before the server will treat it
+ // properly w.r.t. input events. This member stores all windows that have been
+ // created.
base::flat_map<gfx::AcceleratedWidget,
std::unique_ptr<WaylandInputEmulate::TestWindow>>
windows_;
+ // Stores pending events in a global queue. We will not dispatch any pending
+ // events while there are windows that are still in the process of being
+ // created.
+ base::circular_deque<std::unique_ptr<PendingEvent>> pending_events_;
+
base::ObserverList<WaylandInputEmulate::Observer> observers_;
// Owned raw pointers. wl::Object is not used because the component this
// class belongs to cannot depend on the "wayland" target in the
// //ui/ozone/platform/wayland/BUILD.gn
- struct wl_registry* registry_ = nullptr;
- struct weston_test* weston_test_ = nullptr;
+ raw_ptr<struct wl_registry> registry_ = nullptr;
+ raw_ptr<struct weston_test> weston_test_ = nullptr;
};
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h b/chromium/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h
index 06d02905d05..9e8b2faae0a 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h
+++ b/chromium/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h
@@ -9,6 +9,7 @@
#include <vector>
#include "base/files/scoped_file.h"
+#include "base/memory/raw_ptr.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/linux/gbm_buffer.h"
@@ -78,7 +79,7 @@ class GbmPixmapWayland : public gfx::NativePixmap {
std::unique_ptr<GbmBuffer> gbm_bo_;
// Represents a connection to Wayland.
- WaylandBufferManagerGpu* const buffer_manager_;
+ const raw_ptr<WaylandBufferManagerGpu> buffer_manager_;
// Represents widget this pixmap backs.
gfx::AcceleratedWidget widget_ = gfx::kNullAcceleratedWidget;
diff --git a/chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc b/chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc
index 1bfdcd2d510..44630f401e6 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc
+++ b/chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc
@@ -45,7 +45,7 @@ GbmSurfacelessWayland::SolidColorBufferHolder::~SolidColorBufferHolder() =
BufferId
GbmSurfacelessWayland::SolidColorBufferHolder::GetOrCreateSolidColorBuffer(
- SkColor color,
+ SkColor4f color,
WaylandBufferManagerGpu* buffer_manager) {
BufferId next_buffer_id = 0;
@@ -111,9 +111,10 @@ void GbmSurfacelessWayland::SolidColorBufferHolder::EraseBuffers(
}
GbmSurfacelessWayland::GbmSurfacelessWayland(
+ gl::GLDisplayEGL* display,
WaylandBufferManagerGpu* buffer_manager,
gfx::AcceleratedWidget widget)
- : SurfacelessEGL(gl::GLSurfaceEGL::GetGLDisplayEGL(), gfx::Size()),
+ : SurfacelessEGL(display, gfx::Size()),
buffer_manager_(buffer_manager),
widget_(widget),
solid_color_buffers_holder_(std::make_unique<SolidColorBufferHolder>()),
diff --git a/chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.h b/chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.h
index ba10a39b5b5..ec69bd0949a 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.h
+++ b/chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.h
@@ -9,6 +9,7 @@
#include <vector>
#include "base/gtest_prod_util.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gl/gl_surface_egl.h"
@@ -29,7 +30,8 @@ using BufferId = uint32_t;
class GbmSurfacelessWayland : public gl::SurfacelessEGL,
public WaylandSurfaceGpu {
public:
- GbmSurfacelessWayland(WaylandBufferManagerGpu* buffer_manager,
+ GbmSurfacelessWayland(gl::GLDisplayEGL* display,
+ WaylandBufferManagerGpu* buffer_manager,
gfx::AcceleratedWidget widget);
GbmSurfacelessWayland(const GbmSurfacelessWayland&) = delete;
@@ -72,7 +74,7 @@ class GbmSurfacelessWayland : public gl::SurfacelessEGL,
bool has_alpha) override;
void SetForceGlFlushOnSwapBuffers() override;
- BufferId GetOrCreateSolidColorBuffer(SkColor color, const gfx::Size& size);
+ BufferId GetOrCreateSolidColorBuffer(SkColor4f color, const gfx::Size& size);
private:
FRIEND_TEST_ALL_PREFIXES(WaylandSurfaceFactoryTest,
@@ -91,7 +93,7 @@ class GbmSurfacelessWayland : public gl::SurfacelessEGL,
~SolidColorBufferHolder();
BufferId GetOrCreateSolidColorBuffer(
- SkColor color,
+ SkColor4f color,
WaylandBufferManagerGpu* buffer_manager);
void OnSubmission(BufferId buffer_id,
@@ -103,14 +105,14 @@ class GbmSurfacelessWayland : public gl::SurfacelessEGL,
// anything and stored on the gpu side for convenience so that WBHM doesn't
// become more complex.
struct SolidColorBuffer {
- SolidColorBuffer(SkColor color, BufferId buffer_id)
+ SolidColorBuffer(const SkColor4f& color, BufferId buffer_id)
: color(color), buffer_id(buffer_id) {}
SolidColorBuffer(SolidColorBuffer&& buffer) = default;
SolidColorBuffer& operator=(SolidColorBuffer&& buffer) = default;
~SolidColorBuffer() = default;
// Color of the buffer.
- SkColor color = SK_ColorWHITE;
+ SkColor4f color = SkColors::kWhite;
// The buffer id that is mapped with the buffer id created on the browser
// side.
BufferId buffer_id = 0;
@@ -163,7 +165,7 @@ class GbmSurfacelessWayland : public gl::SurfacelessEGL,
// Sets a flag that skips glFlush step in unittests.
void SetNoGLFlushForTests();
- WaylandBufferManagerGpu* const buffer_manager_;
+ const raw_ptr<WaylandBufferManagerGpu> buffer_manager_;
// The native surface. Deleting this is allowed to free the EGLNativeWindow.
gfx::AcceleratedWidget widget_;
diff --git a/chromium/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.cc b/chromium/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.cc
index 9e955388c5f..8452279ad51 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.cc
+++ b/chromium/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.cc
@@ -27,9 +27,12 @@ GLSurfaceEglReadbackWayland::PixelBuffer::PixelBuffer(
GLSurfaceEglReadbackWayland::PixelBuffer::~PixelBuffer() = default;
GLSurfaceEglReadbackWayland::GLSurfaceEglReadbackWayland(
+ gl::GLDisplayEGL* display,
gfx::AcceleratedWidget widget,
WaylandBufferManagerGpu* buffer_manager)
- : widget_(widget), buffer_manager_(buffer_manager) {
+ : GLSurfaceEglReadback(display),
+ widget_(widget),
+ buffer_manager_(buffer_manager) {
buffer_manager_->RegisterSurface(widget_, this);
}
@@ -119,7 +122,8 @@ void GLSurfaceEglReadbackWayland::SwapBuffersAsync(
const auto bounds = gfx::Rect(GetSize());
buffer_manager_->CommitBuffer(widget_, next_buffer->buffer_id_,
/*frame_id*/ next_buffer->buffer_id_, bounds,
- surface_scale_factor_, bounds);
+ gfx::RoundedCornersF(), surface_scale_factor_,
+ bounds);
}
gfx::SurfaceOrigin GLSurfaceEglReadbackWayland::GetOrigin() const {
diff --git a/chromium/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.h b/chromium/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.h
index 8d8f915307d..df7d6a92a61 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.h
+++ b/chromium/ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.h
@@ -6,6 +6,7 @@
#define UI_OZONE_PLATFORM_WAYLAND_GPU_GL_SURFACE_EGL_READBACK_WAYLAND_H_
#include "base/containers/circular_deque.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/shared_memory_mapping.h"
#include "ui/ozone/common/gl_surface_egl_readback.h"
#include "ui/ozone/platform/wayland/gpu/wayland_surface_gpu.h"
@@ -32,7 +33,8 @@ class WaylandBufferManagerGpu;
class GLSurfaceEglReadbackWayland : public GLSurfaceEglReadback,
public WaylandSurfaceGpu {
public:
- GLSurfaceEglReadbackWayland(gfx::AcceleratedWidget widget,
+ GLSurfaceEglReadbackWayland(gl::GLDisplayEGL* display,
+ gfx::AcceleratedWidget widget,
WaylandBufferManagerGpu* buffer_manager);
GLSurfaceEglReadbackWayland(const GLSurfaceEglReadbackWayland&) = delete;
GLSurfaceEglReadbackWayland& operator=(const GLSurfaceEglReadbackWayland&) =
@@ -82,7 +84,7 @@ class GLSurfaceEglReadbackWayland : public GLSurfaceEglReadback,
// Widget of the window that this readback writes pixels to.
const gfx::AcceleratedWidget widget_;
- WaylandBufferManagerGpu* const buffer_manager_;
+ const raw_ptr<WaylandBufferManagerGpu> buffer_manager_;
// Size of the buffer.
gfx::Size size_;
diff --git a/chromium/ui/ozone/platform/wayland/gpu/gl_surface_wayland.cc b/chromium/ui/ozone/platform/wayland/gpu/gl_surface_wayland.cc
index 0bf1c8fd0a6..b428f74401c 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/gl_surface_wayland.cc
+++ b/chromium/ui/ozone/platform/wayland/gpu/gl_surface_wayland.cc
@@ -24,7 +24,7 @@ void EGLWindowDeleter::operator()(wl_egl_window* egl_window) {
std::unique_ptr<wl_egl_window, EGLWindowDeleter> CreateWaylandEglWindow(
WaylandWindow* window) {
- gfx::Size size = window->GetBoundsInPixels().size();
+ gfx::Size size = window->size_px();
return std::unique_ptr<wl_egl_window, EGLWindowDeleter>(wl_egl_window_create(
window->root_surface()->surface(), size.width(), size.height()));
}
@@ -117,7 +117,7 @@ GLSurfaceWayland::~GLSurfaceWayland() {
void GLSurfaceWayland::UpdateVisualSize() {
window_->ui_task_runner()->PostTask(
FROM_HERE, base::BindOnce(&WaylandWindow::UpdateVisualSize,
- window_->AsWeakPtr(), size_, scale_factor_));
+ window_->AsWeakPtr(), size_));
}
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/gpu/gl_surface_wayland.h b/chromium/ui/ozone/platform/wayland/gpu/gl_surface_wayland.h
index 21c65411c28..b7c3a1dc00e 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/gl_surface_wayland.h
+++ b/chromium/ui/ozone/platform/wayland/gpu/gl_surface_wayland.h
@@ -8,6 +8,7 @@
#include <memory>
#include "base/callback_forward.h"
+#include "base/memory/raw_ptr.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gl/gl_surface_egl.h"
@@ -55,7 +56,7 @@ class GLSurfaceWayland : public gl::NativeViewGLSurfaceEGL {
void UpdateVisualSize();
WaylandEglWindowPtr egl_window_;
- WaylandWindow* const window_;
+ const raw_ptr<WaylandWindow> window_;
float scale_factor_ = 1.f;
};
diff --git a/chromium/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc b/chromium/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc
index 03860d6826a..0be711fc0c8 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc
+++ b/chromium/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc
@@ -16,6 +16,7 @@
#include "ui/gfx/geometry/rrect_f.h"
#include "ui/gfx/linux/drm_util_linux.h"
#include "ui/gfx/overlay_priority_hint.h"
+#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_surface_egl.h"
#include "ui/ozone/platform/wayland/common/wayland_overlay_config.h"
#include "ui/ozone/platform/wayland/gpu/wayland_surface_gpu.h"
@@ -104,7 +105,6 @@ void WaylandBufferManagerGpu::OnSubmission(gfx::AcceleratedWidget widget,
gfx::GpuFenceHandle release_fence) {
DCHECK_CALLED_ON_VALID_SEQUENCE(gpu_sequence_checker_);
- base::AutoLock scoped_lock(lock_);
DCHECK_LE(commit_thread_runners_.count(widget), 1u);
// Return back to the same thread where the commit request came from.
auto it = commit_thread_runners_.find(widget);
@@ -123,7 +123,6 @@ void WaylandBufferManagerGpu::OnPresentation(
const gfx::PresentationFeedback& feedback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(gpu_sequence_checker_);
- base::AutoLock scoped_lock(lock_);
DCHECK_LE(commit_thread_runners_.count(widget), 1u);
// Return back to the same thread where the commit request came from.
auto it = commit_thread_runners_.find(widget);
@@ -220,7 +219,7 @@ void WaylandBufferManagerGpu::CreateShmBasedBuffer(base::ScopedFD shm_fd,
RunOrQueueTask(std::move(task));
}
-void WaylandBufferManagerGpu::CreateSolidColorBuffer(SkColor color,
+void WaylandBufferManagerGpu::CreateSolidColorBuffer(SkColor4f color,
const gfx::Size& size,
uint32_t buf_id) {
DCHECK(gpu_thread_runner_);
@@ -243,6 +242,7 @@ void WaylandBufferManagerGpu::CommitBuffer(gfx::AcceleratedWidget widget,
uint32_t frame_id,
uint32_t buffer_id,
const gfx::Rect& bounds_rect,
+ const gfx::RoundedCornersF& corners,
float surface_scale_factor,
const gfx::Rect& damage_region) {
// This surface only commits one buffer per frame, use INT32_MIN to attach
@@ -253,7 +253,8 @@ void WaylandBufferManagerGpu::CommitBuffer(gfx::AcceleratedWidget widget,
INT32_MIN, gfx::OverlayTransform::OVERLAY_TRANSFORM_NONE,
gfx::RectF(bounds_rect), gfx::RectF(1.f, 1.f) /* no crop */, false,
damage_region, 1.0f /*opacity*/, gfx::OverlayPriorityHint::kNone,
- gfx::RRectF(), gfx::ColorSpace(), absl::nullopt),
+ gfx::RRectF(gfx::RectF(bounds_rect), corners), gfx::ColorSpace(),
+ absl::nullopt),
nullptr, buffer_id, surface_scale_factor);
CommitOverlays(widget, frame_id, std::move(overlay_configs));
}
@@ -297,10 +298,9 @@ void WaylandBufferManagerGpu::DestroyBuffer(uint32_t buffer_id) {
#if defined(WAYLAND_GBM)
GbmDevice* WaylandBufferManagerGpu::GetGbmDevice() {
// Wayland won't support wl_drm or zwp_linux_dmabuf without this extension.
- if (!supports_dmabuf_ ||
- (!gl::GLSurfaceEGL::GetGLDisplayEGL()->HasEGLExtension(
- "EGL_EXT_image_dma_buf_import") &&
- !use_fake_gbm_device_for_test_)) {
+ if (!supports_dmabuf_ || (!gl::GLSurfaceEGL::GetGLDisplayEGL()
+ ->ext->b_EGL_EXT_image_dma_buf_import &&
+ !use_fake_gbm_device_for_test_)) {
supports_dmabuf_ = false;
return nullptr;
}
@@ -480,7 +480,7 @@ void WaylandBufferManagerGpu::CreateShmBasedBufferTask(base::ScopedFD shm_fd,
length, size, buffer_id);
}
-void WaylandBufferManagerGpu::CreateSolidColorBufferTask(SkColor color,
+void WaylandBufferManagerGpu::CreateSolidColorBufferTask(SkColor4f color,
const gfx::Size& size,
uint32_t buf_id) {
DCHECK_CALLED_ON_VALID_SEQUENCE(gpu_sequence_checker_);
diff --git a/chromium/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.h b/chromium/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.h
index 1843b146861..61e40ff8fbe 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.h
+++ b/chromium/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.h
@@ -102,7 +102,7 @@ class WaylandBufferManagerGpu : public ozone::mojom::WaylandBufferManagerGpu {
// Asks Wayland to create a solid color wl_buffer that is not backed by
// anything on the gpu side. Requires surface-augmenter protocol.
- void CreateSolidColorBuffer(SkColor color,
+ void CreateSolidColorBuffer(SkColor4f color,
const gfx::Size& size,
uint32_t buf_id);
@@ -123,6 +123,7 @@ class WaylandBufferManagerGpu : public ozone::mojom::WaylandBufferManagerGpu {
uint32_t frame_id,
uint32_t buffer_id,
const gfx::Rect& bounds_rect,
+ const gfx::RoundedCornersF& corners,
float surface_scale_factor,
const gfx::Rect& damage_region);
// Send overlay configurations for a frame to a WaylandWindow identified by
@@ -216,7 +217,7 @@ class WaylandBufferManagerGpu : public ozone::mojom::WaylandBufferManagerGpu {
size_t length,
gfx::Size size,
uint32_t buffer_id);
- void CreateSolidColorBufferTask(SkColor color,
+ void CreateSolidColorBufferTask(SkColor4f color,
const gfx::Size& size,
uint32_t buf_id);
void CommitOverlaysTask(gfx::AcceleratedWidget widget,
diff --git a/chromium/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc b/chromium/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc
index a58e342a74f..bdf254653bc 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc
+++ b/chromium/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc
@@ -8,6 +8,7 @@
#include <utility>
#include "base/files/scoped_file.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/shared_memory_mapping.h"
#include "base/memory/unsafe_shared_memory_region.h"
#include "base/numerics/checked_math.h"
@@ -96,7 +97,8 @@ class WaylandCanvasSurface::SharedMemoryBuffer {
void CommitBuffer(const gfx::Rect& damage, float buffer_scale) {
buffer_manager_->CommitBuffer(widget_, buffer_id_, /*frame_id*/ buffer_id_,
- gfx::Rect(size_), buffer_scale, damage);
+ gfx::Rect(size_), gfx::RoundedCornersF(),
+ buffer_scale, damage);
}
void OnUse() {
@@ -151,7 +153,7 @@ class WaylandCanvasSurface::SharedMemoryBuffer {
const gfx::AcceleratedWidget widget_;
// Non-owned pointer to the buffer manager on the gpu process/thread side.
- WaylandBufferManagerGpu* const buffer_manager_;
+ const raw_ptr<WaylandBufferManagerGpu> buffer_manager_;
// Shared memory for the buffer.
base::WritableSharedMemoryMapping shm_mapping_;
diff --git a/chromium/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.h b/chromium/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.h
index cbf4414ee6d..d8ab7aad8c6 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.h
+++ b/chromium/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.h
@@ -8,6 +8,7 @@
#include <memory>
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "third_party/skia/include/core/SkRefCnt.h"
@@ -83,7 +84,7 @@ class WaylandCanvasSurface : public SurfaceOzoneCanvas,
sk_sp<SkSurface> GetNextSurface();
std::unique_ptr<SharedMemoryBuffer> CreateSharedMemoryBuffer();
- WaylandBufferManagerGpu* const buffer_manager_;
+ const raw_ptr<WaylandBufferManagerGpu> buffer_manager_;
const gfx::AcceleratedWidget widget_;
gfx::Size size_;
@@ -95,14 +96,14 @@ class WaylandCanvasSurface : public SurfaceOzoneCanvas,
// Pending buffer that is to be placed into the |unsubmitted_buffers_| to be
// processed.
- SharedMemoryBuffer* pending_buffer_ = nullptr;
+ raw_ptr<SharedMemoryBuffer> pending_buffer_ = nullptr;
// Currently used buffer. Set on PresentCanvas() and released on
// OnSubmission() call.
- SharedMemoryBuffer* current_buffer_ = nullptr;
+ raw_ptr<SharedMemoryBuffer> current_buffer_ = nullptr;
// Previously used buffer. Set on OnSubmission().
- SharedMemoryBuffer* previous_buffer_ = nullptr;
+ raw_ptr<SharedMemoryBuffer> previous_buffer_ = nullptr;
// Used by the internal VSyncProvider implementation. Set on OnPresentation().
base::TimeTicks last_timestamp_;
diff --git a/chromium/ui/ozone/platform/wayland/gpu/wayland_overlay_candidates.h b/chromium/ui/ozone/platform/wayland/gpu/wayland_overlay_candidates.h
index 67efe200d14..9223273facc 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/wayland_overlay_candidates.h
+++ b/chromium/ui/ozone/platform/wayland/gpu/wayland_overlay_candidates.h
@@ -7,6 +7,7 @@
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/ozone/public/overlay_candidates_ozone.h"
@@ -29,7 +30,7 @@ class WaylandOverlayCandidates : public OverlayCandidatesOzone {
std::vector<OverlaySurfaceCandidate>* candidates) override;
private:
- WaylandOverlayManager* const overlay_manager_; // Not owned.
+ const raw_ptr<WaylandOverlayManager> overlay_manager_; // Not owned.
const gfx::AcceleratedWidget widget_;
};
diff --git a/chromium/ui/ozone/platform/wayland/gpu/wayland_overlay_manager.h b/chromium/ui/ozone/platform/wayland/gpu/wayland_overlay_manager.h
index ad9f1e31002..22249029940 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/wayland_overlay_manager.h
+++ b/chromium/ui/ozone/platform/wayland/gpu/wayland_overlay_manager.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_GPU_WAYLAND_OVERLAY_MANAGER_H_
#define UI_OZONE_PLATFORM_WAYLAND_GPU_WAYLAND_OVERLAY_MANAGER_H_
+#include "base/memory/raw_ptr.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/ozone/public/overlay_candidates_ozone.h"
#include "ui/ozone/public/overlay_manager_ozone.h"
@@ -39,7 +40,7 @@ class WaylandOverlayManager : public OverlayManagerOzone {
bool CanHandleCandidate(const OverlaySurfaceCandidate& candidate,
gfx::AcceleratedWidget widget) const;
- WaylandBufferManagerGpu* const manager_gpu_;
+ const raw_ptr<WaylandBufferManagerGpu> manager_gpu_;
// Same as features::IsDelegatedCompositingEnabled.
bool is_delegated_context_ = false;
diff --git a/chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc b/chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc
index 907de8ba061..0cbfdb8b019 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc
+++ b/chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc
@@ -7,9 +7,13 @@
#include <memory>
#include "base/memory/ptr_util.h"
+#include "base/memory/raw_ptr.h"
#include "ui/gfx/linux/client_native_pixmap_dmabuf.h"
+#include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_surface_egl.h"
#include "ui/ozone/common/egl_util.h"
#include "ui/ozone/common/gl_ozone_egl.h"
+#include "ui/ozone/common/native_pixmap_egl_binding.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include "ui/ozone/platform/wayland/gpu/gl_surface_egl_readback_wayland.h"
#include "ui/ozone/platform/wayland/gpu/gl_surface_wayland.h"
@@ -44,13 +48,27 @@ class GLOzoneEGLWayland : public GLOzoneEGL {
~GLOzoneEGLWayland() override {}
+ bool CanImportNativePixmap() override;
+
+ std::unique_ptr<NativePixmapGLBinding> ImportNativePixmap(
+ scoped_refptr<gfx::NativePixmap> pixmap,
+ gfx::BufferFormat plane_format,
+ gfx::BufferPlane plane,
+ gfx::Size plane_size,
+ const gfx::ColorSpace& color_space,
+ GLenum target,
+ GLuint texture_id) override;
+
scoped_refptr<gl::GLSurface> CreateViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget widget) override;
scoped_refptr<gl::GLSurface> CreateSurfacelessViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget window) override;
scoped_refptr<gl::GLSurface> CreateOffscreenGLSurface(
+ gl::GLDisplay* display,
const gfx::Size& size) override;
protected:
@@ -58,11 +76,29 @@ class GLOzoneEGLWayland : public GLOzoneEGL {
bool LoadGLES2Bindings(const gl::GLImplementationParts& impl) override;
private:
- WaylandConnection* const connection_;
- WaylandBufferManagerGpu* const buffer_manager_;
+ const raw_ptr<WaylandConnection> connection_;
+ const raw_ptr<WaylandBufferManagerGpu> buffer_manager_;
};
+bool GLOzoneEGLWayland::CanImportNativePixmap() {
+ return gl::GLSurfaceEGL::GetGLDisplayEGL()
+ ->ext->b_EGL_EXT_image_dma_buf_import;
+}
+
+std::unique_ptr<NativePixmapGLBinding> GLOzoneEGLWayland::ImportNativePixmap(
+ scoped_refptr<gfx::NativePixmap> pixmap,
+ gfx::BufferFormat plane_format,
+ gfx::BufferPlane plane,
+ gfx::Size plane_size,
+ const gfx::ColorSpace& color_space,
+ GLenum target,
+ GLuint texture_id) {
+ return NativePixmapEGLBinding::Create(pixmap, plane_format, plane, plane_size,
+ color_space, target, texture_id);
+}
+
scoped_refptr<gl::GLSurface> GLOzoneEGLWayland::CreateViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget widget) {
// Only EGLGLES2 is supported with surfaceless view gl.
if ((gl::GetGLImplementation() != gl::kGLImplementationEGLGLES2) ||
@@ -80,22 +116,23 @@ scoped_refptr<gl::GLSurface> GLOzoneEGLWayland::CreateViewGLSurface(
if (!egl_window)
return nullptr;
return gl::InitializeGLSurface(new GLSurfaceWayland(
- gl::GLSurfaceEGL::GetGLDisplayEGL(), std::move(egl_window), window));
+ display->GetAs<gl::GLDisplayEGL>(), std::move(egl_window), window));
}
scoped_refptr<gl::GLSurface> GLOzoneEGLWayland::CreateSurfacelessViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget window) {
if (gl::IsSoftwareGLImplementation(gl::GetGLImplementationParts())) {
return gl::InitializeGLSurface(
- base::MakeRefCounted<GLSurfaceEglReadbackWayland>(window,
- buffer_manager_));
+ base::MakeRefCounted<GLSurfaceEglReadbackWayland>(
+ display->GetAs<gl::GLDisplayEGL>(), window, buffer_manager_));
} else {
#if defined(WAYLAND_GBM)
// If there is a gbm device available, use surfaceless gl surface.
if (!buffer_manager_->GetGbmDevice())
return nullptr;
- return gl::InitializeGLSurface(
- new GbmSurfacelessWayland(buffer_manager_, window));
+ return gl::InitializeGLSurface(new GbmSurfacelessWayland(
+ display->GetAs<gl::GLDisplayEGL>(), buffer_manager_, window));
#else
return nullptr;
#endif
@@ -103,14 +140,15 @@ scoped_refptr<gl::GLSurface> GLOzoneEGLWayland::CreateSurfacelessViewGLSurface(
}
scoped_refptr<gl::GLSurface> GLOzoneEGLWayland::CreateOffscreenGLSurface(
+ gl::GLDisplay* display,
const gfx::Size& size) {
- if (gl::GLSurfaceEGL::GetGLDisplayEGL()->IsEGLSurfacelessContextSupported() &&
+ if (display->GetAs<gl::GLDisplayEGL>()->IsEGLSurfacelessContextSupported() &&
size.width() == 0 && size.height() == 0) {
return gl::InitializeGLSurface(
- new gl::SurfacelessEGL(gl::GLSurfaceEGL::GetGLDisplayEGL(), size));
+ new gl::SurfacelessEGL(display->GetAs<gl::GLDisplayEGL>(), size));
} else {
return gl::InitializeGLSurface(
- new gl::PbufferGLSurfaceEGL(gl::GLSurfaceEGL::GetGLDisplayEGL(), size));
+ new gl::PbufferGLSurfaceEGL(display->GetAs<gl::GLDisplayEGL>(), size));
}
}
diff --git a/chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory.h b/chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory.h
index 61666835c59..c1daea1c6a1 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory.h
+++ b/chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/task/single_thread_task_runner.h"
#include "base/threading/sequenced_task_runner_handle.h"
@@ -61,8 +62,8 @@ class WaylandSurfaceFactory : public SurfaceFactoryOzone {
bool SupportsNativePixmaps() const;
private:
- WaylandConnection* const connection_;
- WaylandBufferManagerGpu* const buffer_manager_;
+ const raw_ptr<WaylandConnection> connection_;
+ const raw_ptr<WaylandBufferManagerGpu> buffer_manager_;
std::unique_ptr<GLOzone> egl_implementation_;
};
diff --git a/chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory_unittest.cc b/chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory_unittest.cc
index b4fcc3a1da9..6b5aa5cefeb 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory_unittest.cc
@@ -23,6 +23,7 @@
#include "ui/gfx/overlay_plane_data.h"
#include "ui/gfx/overlay_priority_hint.h"
#include "ui/gl/gl_image_egl.h"
+#include "ui/gl/gl_utils.h"
#include "ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.h"
#include "ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.h"
#include "ui/ozone/platform/wayland/gpu/wayland_surface_factory.h"
@@ -180,8 +181,8 @@ class WaylandSurfaceFactoryTest : public WaylandTest {
WaylandTest::SetUp();
- window_->set_update_visual_size_immediately(false);
- window_->set_apply_pending_state_on_update_visual_size(false);
+ window_->set_update_visual_size_immediately_for_testing(false);
+ window_->set_apply_pending_state_on_update_visual_size_for_testing(false);
auto manager_ptr = connection_->buffer_manager_host()->BindInterface();
buffer_manager_gpu_->Initialize(
@@ -214,12 +215,12 @@ class WaylandSurfaceFactoryTest : public WaylandTest {
int z_order) {
gl_surface->ScheduleOverlayPlane(
image, nullptr,
- gfx::OverlayPlaneData(
- z_order, gfx::OverlayTransform::OVERLAY_TRANSFORM_NONE,
- gfx::RectF(window_->GetBoundsInPixels()), {}, false,
- gfx::Rect(window_->GetBoundsInPixels().size()), 1.0f,
- gfx::OverlayPriorityHint::kNone, gfx::RRectF(),
- gfx::ColorSpace::CreateSRGB(), absl::nullopt));
+ gfx::OverlayPlaneData(z_order,
+ gfx::OverlayTransform::OVERLAY_TRANSFORM_NONE,
+ gfx::RectF(window_->GetBoundsInPixels()), {},
+ false, gfx::Rect(window_->size_px()), 1.0f,
+ gfx::OverlayPriorityHint::kNone, gfx::RRectF(),
+ gfx::ColorSpace::CreateSRGB(), absl::nullopt));
}
};
@@ -237,7 +238,8 @@ TEST_P(WaylandSurfaceFactoryTest,
auto* gl_ozone = surface_factory_->GetGLOzone(
gl::GLImplementationParts(gl::kGLImplementationEGLGLES2));
- auto gl_surface = gl_ozone->CreateSurfacelessViewGLSurface(widget_);
+ auto gl_surface = gl_ozone->CreateSurfacelessViewGLSurface(
+ gl::GetDefaultDisplay(), widget_);
EXPECT_TRUE(gl_surface);
gl_surface->SetRelyOnImplicitSync();
static_cast<ui::GbmSurfacelessWayland*>(gl_surface.get())
@@ -250,10 +252,10 @@ TEST_P(WaylandSurfaceFactoryTest,
std::vector<scoped_refptr<FakeGLImageNativePixmap>> fake_gl_image;
for (int i = 0; i < 4; ++i) {
auto native_pixmap = surface_factory_->CreateNativePixmap(
- widget_, nullptr, window_->GetBoundsInPixels().size(),
- gfx::BufferFormat::BGRA_8888, gfx::BufferUsage::SCANOUT);
+ widget_, nullptr, window_->size_px(), gfx::BufferFormat::BGRA_8888,
+ gfx::BufferUsage::SCANOUT);
fake_gl_image.push_back(base::MakeRefCounted<FakeGLImageNativePixmap>(
- native_pixmap, window_->GetBoundsInPixels().size()));
+ native_pixmap, window_->size_px()));
}
auto* root_surface = server_.GetObject<wl::MockSurface>(
@@ -529,7 +531,8 @@ TEST_P(WaylandSurfaceFactoryTest,
auto* gl_ozone = surface_factory_->GetGLOzone(
gl::GLImplementationParts(gl::kGLImplementationEGLGLES2));
- auto gl_surface = gl_ozone->CreateSurfacelessViewGLSurface(widget_);
+ auto gl_surface = gl_ozone->CreateSurfacelessViewGLSurface(
+ gl::GetDefaultDisplay(), widget_);
EXPECT_TRUE(gl_surface);
gl_surface->SetRelyOnImplicitSync();
static_cast<ui::GbmSurfacelessWayland*>(gl_surface.get())
@@ -539,10 +542,10 @@ TEST_P(WaylandSurfaceFactoryTest,
std::vector<scoped_refptr<FakeGLImageNativePixmap>> fake_gl_image;
for (int i = 0; i < 5; ++i) {
auto native_pixmap = surface_factory_->CreateNativePixmap(
- widget_, nullptr, window_->GetBoundsInPixels().size(),
- gfx::BufferFormat::BGRA_8888, gfx::BufferUsage::SCANOUT);
+ widget_, nullptr, window_->size_px(), gfx::BufferFormat::BGRA_8888,
+ gfx::BufferUsage::SCANOUT);
fake_gl_image.push_back(base::MakeRefCounted<FakeGLImageNativePixmap>(
- native_pixmap, window_->GetBoundsInPixels().size()));
+ native_pixmap, window_->size_px()));
}
auto* root_surface = server_.GetObject<wl::MockSurface>(
@@ -785,7 +788,7 @@ TEST_P(WaylandSurfaceFactoryTest, Canvas) {
auto canvas = CreateCanvas(widget_);
ASSERT_TRUE(canvas);
- auto bounds_px = window_->GetBoundsInPixels();
+ auto bounds_px = window_->GetBoundsInDIP();
bounds_px = gfx::ScaleToRoundedRect(bounds_px, scale_factor);
canvas->ResizeCanvas(bounds_px.size(), scale_factor);
@@ -827,7 +830,7 @@ TEST_P(WaylandSurfaceFactoryTest, CanvasResize) {
auto canvas = CreateCanvas(widget_);
ASSERT_TRUE(canvas);
- canvas->ResizeCanvas(window_->GetBoundsInPixels().size(), 1);
+ canvas->ResizeCanvas(window_->GetBoundsInDIP().size(), 1);
auto* sk_canvas = canvas->GetCanvas();
DCHECK(sk_canvas);
canvas->ResizeCanvas(gfx::Size(100, 50), 1);
@@ -864,7 +867,8 @@ TEST_P(WaylandSurfaceFactoryTest, CreateSurfaceCheckGbm) {
auto* gl_ozone = surface_factory_->GetGLOzone(
gl::GLImplementationParts(gl::kGLImplementationEGLGLES2));
EXPECT_TRUE(gl_ozone);
- auto gl_surface = gl_ozone->CreateSurfacelessViewGLSurface(widget_);
+ auto gl_surface = gl_ozone->CreateSurfacelessViewGLSurface(
+ gl::GetDefaultDisplay(), widget_);
EXPECT_FALSE(gl_surface);
// Now, set gbm.
@@ -872,20 +876,23 @@ TEST_P(WaylandSurfaceFactoryTest, CreateSurfaceCheckGbm) {
// It's still impossible to create the device if supports_dmabuf is false.
EXPECT_FALSE(buffer_manager_gpu_->GetGbmDevice());
- gl_surface = gl_ozone->CreateSurfacelessViewGLSurface(widget_);
+ gl_surface = gl_ozone->CreateSurfacelessViewGLSurface(gl::GetDefaultDisplay(),
+ widget_);
EXPECT_FALSE(gl_surface);
// Now set supports_dmabuf.
buffer_manager_gpu_->supports_dmabuf_ = true;
EXPECT_TRUE(buffer_manager_gpu_->GetGbmDevice());
- gl_surface = gl_ozone->CreateSurfacelessViewGLSurface(widget_);
+ gl_surface = gl_ozone->CreateSurfacelessViewGLSurface(gl::GetDefaultDisplay(),
+ widget_);
EXPECT_TRUE(gl_surface);
// Reset gbm now. WaylandConnectionProxy can reset it when zwp is not
// available. And factory must behave the same way as previously.
buffer_manager_gpu_->gbm_device_ = nullptr;
EXPECT_FALSE(buffer_manager_gpu_->GetGbmDevice());
- gl_surface = gl_ozone->CreateSurfacelessViewGLSurface(widget_);
+ gl_surface = gl_ozone->CreateSurfacelessViewGLSurface(gl::GetDefaultDisplay(),
+ widget_);
EXPECT_FALSE(gl_surface);
}
@@ -904,7 +911,8 @@ TEST_P(WaylandSurfaceFactoryCompositorV3, SurfaceDamageTest) {
auto* gl_ozone = surface_factory_->GetGLOzone(
gl::GLImplementationParts(gl::kGLImplementationEGLGLES2));
- auto gl_surface = gl_ozone->CreateSurfacelessViewGLSurface(widget_);
+ auto gl_surface = gl_ozone->CreateSurfacelessViewGLSurface(
+ gl::GetDefaultDisplay(), widget_);
EXPECT_TRUE(gl_surface);
gl_surface->SetRelyOnImplicitSync();
static_cast<ui::GbmSurfacelessWayland*>(gl_surface.get())
@@ -920,8 +928,8 @@ TEST_P(WaylandSurfaceFactoryCompositorV3, SurfaceDamageTest) {
gfx::RectF crop_uv = {0.1f, 0.2f, 0.5, 0.5f};
gfx::RectF expected_combined_uv = {0.2, 0.2, 0.8, 0.64};
gfx::Rect expected_surface_dmg = gfx::ToEnclosingRect(
- gfx::ScaleRect(expected_combined_uv, window_->GetBoundsInPixels().width(),
- window_->GetBoundsInPixels().height()));
+ gfx::ScaleRect(expected_combined_uv, window_->size_px().width(),
+ window_->size_px().height()));
// Create buffers and FakeGlImageNativePixmap.
std::vector<scoped_refptr<FakeGLImageNativePixmap>> fake_gl_image;
diff --git a/chromium/ui/ozone/platform/wayland/host/DEPS b/chromium/ui/ozone/platform/wayland/host/DEPS
index 7fcfe4fe54f..d4d7c78b672 100644
--- a/chromium/ui/ozone/platform/wayland/host/DEPS
+++ b/chromium/ui/ozone/platform/wayland/host/DEPS
@@ -3,6 +3,7 @@ include_rules = [
"+chromeos/crosapi/mojom",
"+chromeos/crosapi/cpp/crosapi_constants.h",
"+chromeos/startup/browser_init_params.h",
+ "+chromeos/startup/browser_params_proxy.h",
"+chromeos/ui/base",
# Common includes.
diff --git a/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.h b/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.h
index e3584086a76..bbbc1982a06 100644
--- a/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.h
+++ b/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
@@ -46,7 +47,7 @@ class GtkPrimarySelectionDeviceManager
private:
wl::Object<gtk_primary_selection_device_manager> device_manager_;
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
std::unique_ptr<GtkPrimarySelectionDevice> device_;
};
diff --git a/chromium/ui/ozone/platform/wayland/host/linux_ui_delegate_wayland.cc b/chromium/ui/ozone/platform/wayland/host/linux_ui_delegate_wayland.cc
index deb42335650..1c69d738480 100644
--- a/chromium/ui/ozone/platform/wayland/host/linux_ui_delegate_wayland.cc
+++ b/chromium/ui/ozone/platform/wayland/host/linux_ui_delegate_wayland.cc
@@ -7,7 +7,7 @@
#include <utility>
#include "base/logging.h"
-#include "ui/base/linux/linux_ui_delegate.h"
+#include "ui/linux/linux_ui_delegate.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
#include "ui/ozone/platform/wayland/host/wayland_surface.h"
diff --git a/chromium/ui/ozone/platform/wayland/host/linux_ui_delegate_wayland.h b/chromium/ui/ozone/platform/wayland/host/linux_ui_delegate_wayland.h
index d0f3a68d989..beb0aecb69c 100644
--- a/chromium/ui/ozone/platform/wayland/host/linux_ui_delegate_wayland.h
+++ b/chromium/ui/ozone/platform/wayland/host/linux_ui_delegate_wayland.h
@@ -5,9 +5,10 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_LINUX_UI_DELEGATE_WAYLAND_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_LINUX_UI_DELEGATE_WAYLAND_H_
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
-#include "ui/base/linux/linux_ui_delegate.h"
#include "ui/gfx/native_widget_types.h"
+#include "ui/linux/linux_ui_delegate.h"
namespace ui {
@@ -31,7 +32,7 @@ class LinuxUiDelegateWayland : public LinuxUiDelegate {
void OnHandleForward(base::OnceCallback<void(std::string)> callback,
const std::string& handle);
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
base::WeakPtrFactory<LinuxUiDelegateWayland> weak_factory_{this};
};
diff --git a/chromium/ui/ozone/platform/wayland/host/org_gnome_mutter_idle_monitor.h b/chromium/ui/ozone/platform/wayland/host/org_gnome_mutter_idle_monitor.h
index 087efe4f2d6..f8a68af4286 100644
--- a/chromium/ui/ozone/platform/wayland/host/org_gnome_mutter_idle_monitor.h
+++ b/chromium/ui/ozone/platform/wayland/host/org_gnome_mutter_idle_monitor.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_ORG_GNOME_MUTTER_IDLE_MONITOR_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_ORG_GNOME_MUTTER_IDLE_MONITOR_H_
+#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/threading/thread_checker.h"
@@ -74,7 +75,7 @@ class OrgGnomeMutterIdleMonitor {
scoped_refptr<dbus::Bus> bus_;
scoped_refptr<base::SequencedTaskRunner> task_runner_;
- dbus::ObjectProxy* proxy_ = nullptr;
+ raw_ptr<dbus::ObjectProxy> proxy_ = nullptr;
THREAD_CHECKER(main_thread_checker_);
diff --git a/chromium/ui/ozone/platform/wayland/host/org_kde_kwin_idle.h b/chromium/ui/ozone/platform/wayland/host/org_kde_kwin_idle.h
index 7be8c268902..1b3e67c6e27 100644
--- a/chromium/ui/ozone/platform/wayland/host/org_kde_kwin_idle.h
+++ b/chromium/ui/ozone/platform/wayland/host/org_kde_kwin_idle.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
@@ -43,7 +44,7 @@ class OrgKdeKwinIdle : public wl::GlobalObjectRegistrar<OrgKdeKwinIdle> {
// The actual idle timeout connection point.
mutable std::unique_ptr<Timeout> idle_timeout_;
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/proxy/wayland_proxy.h b/chromium/ui/ozone/platform/wayland/host/proxy/wayland_proxy.h
index 5f3246079f6..260b562e298 100644
--- a/chromium/ui/ozone/platform/wayland/host/proxy/wayland_proxy.h
+++ b/chromium/ui/ozone/platform/wayland/host/proxy/wayland_proxy.h
@@ -14,10 +14,13 @@ struct wl_display;
struct wl_surface;
namespace gfx {
-class Rect;
class Size;
} // namespace gfx
+namespace ui {
+class WaylandWindow;
+}
+
namespace wl {
// A proxy interface to Ozone/Wayland that is used by input emulation. The
@@ -42,6 +45,9 @@ class COMPONENT_EXPORT(WAYLAND_PROXY) WaylandProxy {
virtual void OnWindowConfigured(gfx::AcceleratedWidget widget,
bool is_configured) = 0;
+ // Invoked when an existing surface is assigned a role.
+ virtual void OnWindowRoleAssigned(gfx::AcceleratedWidget widget) = 0;
+
protected:
virtual ~Delegate() = default;
};
@@ -64,6 +70,9 @@ class COMPONENT_EXPORT(WAYLAND_PROXY) WaylandProxy {
// Returns wl_surface that backs the |widget|.
virtual wl_surface* GetWlSurfaceForAcceleratedWidget(
gfx::AcceleratedWidget widget) = 0;
+ // Returns WaylandWindow backed by |widget|.
+ virtual ui::WaylandWindow* GetWaylandWindowForAcceleratedWidget(
+ gfx::AcceleratedWidget widget) = 0;
// Creates and returns a shm based wl_buffer with |buffer_size|. The shared
// memory is hold until DestroyShmForWlBuffer is called.
@@ -72,16 +81,16 @@ class COMPONENT_EXPORT(WAYLAND_PROXY) WaylandProxy {
// When this is called, |buffer| becomes invalid and mustn't be used any more.
virtual void DestroyShmForWlBuffer(wl_buffer* buffer) = 0;
- // Schedules display flush that dispatches pending events.
+ // Schedules display flush that dispatches pending requests.
virtual void ScheduleDisplayFlush() = 0;
+ // Immediately flushes pending requests for testing.
+ virtual void FlushForTesting() = 0;
+
// Returns platform window type of a window backed by the |widget|.
virtual ui::PlatformWindowType GetWindowType(
gfx::AcceleratedWidget widget) = 0;
- // Returns bounds in px of the window backed by |widget|.
- virtual gfx::Rect GetWindowBounds(gfx::AcceleratedWidget widget) = 0;
-
virtual bool WindowHasPointerFocus(gfx::AcceleratedWidget widget) = 0;
virtual bool WindowHasKeyboardFocus(gfx::AcceleratedWidget widget) = 0;
diff --git a/chromium/ui/ozone/platform/wayland/host/proxy/wayland_proxy_impl.cc b/chromium/ui/ozone/platform/wayland/host/proxy/wayland_proxy_impl.cc
index 23c34fc2d2d..01c594842ca 100644
--- a/chromium/ui/ozone/platform/wayland/host/proxy/wayland_proxy_impl.cc
+++ b/chromium/ui/ozone/platform/wayland/host/proxy/wayland_proxy_impl.cc
@@ -49,9 +49,17 @@ wl_surface* WaylandProxyImpl::GetWlSurfaceForAcceleratedWidget(
return window->root_surface()->surface();
}
+ui::WaylandWindow* WaylandProxyImpl::GetWaylandWindowForAcceleratedWidget(
+ gfx::AcceleratedWidget widget) {
+ auto* window = connection_->wayland_window_manager()->GetWindow(widget);
+ DCHECK(window);
+ return window;
+}
+
wl_buffer* WaylandProxyImpl::CreateShmBasedWlBuffer(
const gfx::Size& buffer_size) {
- ui::WaylandShmBuffer shm_buffer(connection_->shm(), buffer_size);
+ ui::WaylandShmBuffer shm_buffer(connection_->wayland_buffer_factory(),
+ buffer_size);
auto* wlbuffer = shm_buffer.get();
DCHECK(wlbuffer);
shm_buffers_.emplace_back(std::move(shm_buffer));
@@ -70,6 +78,10 @@ void WaylandProxyImpl::ScheduleDisplayFlush() {
connection_->ScheduleFlush();
}
+void WaylandProxyImpl::FlushForTesting() {
+ connection_->Flush();
+}
+
ui::PlatformWindowType WaylandProxyImpl::GetWindowType(
gfx::AcceleratedWidget widget) {
auto* window = connection_->wayland_window_manager()->GetWindow(widget);
@@ -77,22 +89,16 @@ ui::PlatformWindowType WaylandProxyImpl::GetWindowType(
return window->type();
}
-gfx::Rect WaylandProxyImpl::GetWindowBounds(gfx::AcceleratedWidget widget) {
- auto* window = connection_->wayland_window_manager()->GetWindow(widget);
- DCHECK(window);
- return window->GetBoundsInPixels();
-}
-
bool WaylandProxyImpl::WindowHasPointerFocus(gfx::AcceleratedWidget widget) {
auto* window = connection_->wayland_window_manager()->GetWindow(widget);
DCHECK(window);
- return window->has_pointer_focus();
+ return window->HasPointerFocus();
}
bool WaylandProxyImpl::WindowHasKeyboardFocus(gfx::AcceleratedWidget widget) {
auto* window = connection_->wayland_window_manager()->GetWindow(widget);
DCHECK(window);
- return window->has_keyboard_focus();
+ return window->HasKeyboardFocus();
}
void WaylandProxyImpl::OnWindowAdded(ui::WaylandWindow* window) {
@@ -111,4 +117,9 @@ void WaylandProxyImpl::OnWindowConfigured(ui::WaylandWindow* window) {
window->IsSurfaceConfigured());
}
+void WaylandProxyImpl::OnWindowRoleAssigned(ui::WaylandWindow* window) {
+ DCHECK(delegate_);
+ delegate_->OnWindowRoleAssigned(window->GetWidget());
+}
+
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/host/proxy/wayland_proxy_impl.h b/chromium/ui/ozone/platform/wayland/host/proxy/wayland_proxy_impl.h
index cf5ee8b568d..c1fb56dbd53 100644
--- a/chromium/ui/ozone/platform/wayland/host/proxy/wayland_proxy_impl.h
+++ b/chromium/ui/ozone/platform/wayland/host/proxy/wayland_proxy_impl.h
@@ -7,12 +7,14 @@
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/host/proxy/wayland_proxy.h"
#include "ui/ozone/platform/wayland/host/wayland_window_observer.h"
namespace ui {
class WaylandConnection;
class WaylandShmBuffer;
+class WaylandWindow;
} // namespace ui
namespace wl {
@@ -29,11 +31,13 @@ class WaylandProxyImpl : public WaylandProxy, public ui::WaylandWindowObserver {
void RoundTripQueue() override;
wl_surface* GetWlSurfaceForAcceleratedWidget(
gfx::AcceleratedWidget widget) override;
+ ui::WaylandWindow* GetWaylandWindowForAcceleratedWidget(
+ gfx::AcceleratedWidget widget) override;
wl_buffer* CreateShmBasedWlBuffer(const gfx::Size& buffer_size) override;
void DestroyShmForWlBuffer(wl_buffer* buffer) override;
void ScheduleDisplayFlush() override;
+ void FlushForTesting() override;
ui::PlatformWindowType GetWindowType(gfx::AcceleratedWidget widget) override;
- gfx::Rect GetWindowBounds(gfx::AcceleratedWidget widget) override;
bool WindowHasPointerFocus(gfx::AcceleratedWidget widget) override;
bool WindowHasKeyboardFocus(gfx::AcceleratedWidget widget) override;
@@ -42,10 +46,11 @@ class WaylandProxyImpl : public WaylandProxy, public ui::WaylandWindowObserver {
void OnWindowAdded(ui::WaylandWindow* window) override;
void OnWindowRemoved(ui::WaylandWindow* window) override;
void OnWindowConfigured(ui::WaylandWindow* window) override;
+ void OnWindowRoleAssigned(ui::WaylandWindow* window) override;
- ui::WaylandConnection* const connection_;
+ const raw_ptr<ui::WaylandConnection> connection_;
- WaylandProxy::Delegate* delegate_ = nullptr;
+ raw_ptr<WaylandProxy::Delegate> delegate_ = nullptr;
std::vector<ui::WaylandShmBuffer> shm_buffers_;
};
diff --git a/chromium/ui/ozone/platform/wayland/host/shell_popup_wrapper.h b/chromium/ui/ozone/platform/wayland/host/shell_popup_wrapper.h
index 9cce96699b5..4637acdfff4 100644
--- a/chromium/ui/ozone/platform/wayland/host/shell_popup_wrapper.h
+++ b/chromium/ui/ozone/platform/wayland/host/shell_popup_wrapper.h
@@ -61,6 +61,13 @@ class ShellPopupWrapper {
OwnedWindowAnchorGravity* anchor_gravity,
OwnedWindowConstraintAdjustment* constraints) const;
+ // Whether the protocol supports surface decoration.
+ virtual bool SupportsDecoration() = 0;
+
+ // Must only be called if SupportsDecoration() returns true.
+ // Decorates the surface with a drop shadow.
+ virtual void Decorate() = 0;
+
protected:
// Asks the compositor to take explicit-grab for this popup.
virtual void Grab(uint32_t serial) = 0;
diff --git a/chromium/ui/ozone/platform/wayland/host/shell_toplevel_wrapper.h b/chromium/ui/ozone/platform/wayland/host/shell_toplevel_wrapper.h
index 76a9dfe3e3f..6fecb34f55f 100644
--- a/chromium/ui/ozone/platform/wayland/host/shell_toplevel_wrapper.h
+++ b/chromium/ui/ozone/platform/wayland/host/shell_toplevel_wrapper.h
@@ -17,6 +17,7 @@ class Rect;
namespace ui {
class WaylandConnection;
+enum class ZOrderLevel;
// A wrapper around different versions of xdg toplevels. Allows
// WaylandToplevelWindow to set window-like properties such as maximize,
@@ -127,6 +128,14 @@ class ShellToplevelWrapper {
// Enables screen coordinates support. This is no-op if the server does not
// support the screen coordinates.
virtual void EnableScreenCoordinates() = 0;
+
+ // Sets/usets a native window to float state. This places it on top of other
+ // windows.
+ virtual void SetFloat() = 0;
+ virtual void UnSetFloat() = 0;
+
+ // Sets the z order of the window.
+ virtual void SetZOrder(ZOrderLevel z_order) = 0;
};
// Look for |value| in |wl_array| in C++ style.
diff --git a/chromium/ui/ozone/platform/wayland/host/surface_augmenter.cc b/chromium/ui/ozone/platform/wayland/host/surface_augmenter.cc
index 8dffa9802d5..e04604dfd37 100644
--- a/chromium/ui/ozone/platform/wayland/host/surface_augmenter.cc
+++ b/chromium/ui/ozone/platform/wayland/host/surface_augmenter.cc
@@ -75,7 +75,7 @@ wl::Object<augmented_sub_surface> SurfaceAugmenter::CreateAugmentedSubSurface(
}
wl::Object<wl_buffer> SurfaceAugmenter::CreateSolidColorBuffer(
- SkColor color,
+ const SkColor4f& color,
const gfx::Size& size) {
wl_array color_data;
wl_array_init(&color_data);
diff --git a/chromium/ui/ozone/platform/wayland/host/surface_augmenter.h b/chromium/ui/ozone/platform/wayland/host/surface_augmenter.h
index bdb3ccf91f8..2c1502ad9db 100644
--- a/chromium/ui/ozone/platform/wayland/host/surface_augmenter.h
+++ b/chromium/ui/ozone/platform/wayland/host/surface_augmenter.h
@@ -42,7 +42,7 @@ class SurfaceAugmenter : public wl::GlobalObjectRegistrar<SurfaceAugmenter> {
wl::Object<augmented_sub_surface> CreateAugmentedSubSurface(
wl_subsurface* subsurface);
- wl::Object<wl_buffer> CreateSolidColorBuffer(SkColor color,
+ wl::Object<wl_buffer> CreateSolidColorBuffer(const SkColor4f& color,
const gfx::Size& size);
private:
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing.cc b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing.cc
index b4a964b285b..f94f87b8fd0 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing.cc
@@ -12,8 +12,12 @@ namespace ui {
WaylandBufferBacking::WaylandBufferBacking(const WaylandConnection* connection,
uint32_t buffer_id,
- const gfx::Size& size)
- : connection_(connection), buffer_id_(buffer_id), size_(size) {
+ const gfx::Size& size,
+ uint32_t format)
+ : connection_(connection),
+ format_(format),
+ buffer_id_(buffer_id),
+ size_(size) {
DCHECK(connection_);
DCHECK_NE(buffer_id_, kInvalidBufferId);
}
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing.h b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing.h
index 59cfd268f0b..96231ac912e 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing.h
@@ -7,6 +7,8 @@
#include "base/callback_forward.h"
#include "base/containers/flat_map.h"
+#include "base/memory/raw_ptr.h"
+#include "drm_fourcc.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
@@ -30,9 +32,12 @@ class WaylandBufferBacking {
WaylandBufferBacking& operator=(const WaylandBufferBacking&) = delete;
WaylandBufferBacking(const WaylandConnection* connection,
uint32_t buffer_id,
- const gfx::Size& size);
+ const gfx::Size& size,
+ uint32_t format = DRM_FORMAT_INVALID);
virtual ~WaylandBufferBacking();
+ const WaylandConnection* connection() const { return connection_; }
+ uint32_t format() const { return format_; }
uint32_t id() const { return buffer_id_; }
gfx::Size size() const { return size_; }
@@ -48,11 +53,13 @@ class WaylandBufferBacking {
// Same as above but does not do the requesting.
WaylandBufferHandle* GetBufferHandle(WaylandSurface* requestor);
- protected:
+ private:
// Non-owned pointer to the main connection.
- const WaylandConnection* connection_;
+ raw_ptr<const WaylandConnection> connection_;
+
+ // DRM buffer format if specified, otherwise DRM_FORMAT_INVALID (0)
+ const uint32_t format_;
- private:
// Requests a new wl_buffer. |callback| will be run with the created wl_buffer
// object when creation is complete.
virtual void RequestBufferHandle(
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.cc b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.cc
index d22fbb09f45..8d7d99bbbec 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.cc
@@ -4,9 +4,8 @@
#include "ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.h"
+#include "ui/ozone/platform/wayland/host/wayland_buffer_factory.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
-#include "ui/ozone/platform/wayland/host/wayland_drm.h"
-#include "ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.h"
namespace ui {
@@ -20,12 +19,11 @@ WaylandBufferBackingDmabuf::WaylandBufferBackingDmabuf(
uint32_t format,
uint32_t planes_count,
uint32_t buffer_id)
- : WaylandBufferBacking(connection, buffer_id, size),
+ : WaylandBufferBacking(connection, buffer_id, size, format),
fd_(std::move(fd)),
strides_(std::move(strides)),
offsets_(std::move(offsets)),
modifiers_(std::move(modifiers)),
- format_(format),
planes_count_(planes_count) {}
WaylandBufferBackingDmabuf::~WaylandBufferBackingDmabuf() = default;
@@ -34,19 +32,9 @@ void WaylandBufferBackingDmabuf::RequestBufferHandle(
base::OnceCallback<void(wl::Object<wl_buffer>)> callback) {
DCHECK(!callback.is_null());
DCHECK(fd_.is_valid());
- if (connection_->zwp_dmabuf()) {
- connection_->zwp_dmabuf()->CreateBuffer(fd_, size(), strides_, offsets_,
- modifiers_, format_, planes_count_,
- std::move(callback));
- } else if (connection_->drm()) {
- connection_->drm()->CreateBuffer(fd_, size(), strides_, offsets_,
- modifiers_, format_, planes_count_,
- std::move(callback));
- } else {
- // This method must never be called if neither zwp_linux_dmabuf or wl_drm
- // are supported.
- NOTREACHED();
- }
+ connection()->wayland_buffer_factory()->CreateDmabufBuffer(
+ fd_, size(), strides_, offsets_, modifiers_, format(), planes_count_,
+ std::move(callback));
if (UseExplicitSyncRelease())
auto close = std::move(fd_);
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.h b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.h
index 2d524acac00..e86f029c190 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.h
@@ -37,7 +37,6 @@ class WaylandBufferBackingDmabuf : public WaylandBufferBacking {
const std::vector<uint32_t> strides_;
const std::vector<uint32_t> offsets_;
const std::vector<uint64_t> modifiers_;
- const uint32_t format_;
const uint32_t planes_count_;
};
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.cc b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.cc
index 43f7d2592ca..e6dc7d65c7e 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.cc
@@ -5,8 +5,8 @@
#include "ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.h"
#include "build/chromeos_buildflags.h"
+#include "ui/ozone/platform/wayland/host/wayland_buffer_factory.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
-#include "ui/ozone/platform/wayland/host/wayland_shm.h"
namespace ui {
@@ -39,8 +39,9 @@ void WaylandBufferBackingShm::RequestBufferHandle(
#else
const bool with_alpha_channel = true;
#endif
- std::move(callback).Run(connection_->shm()->CreateBuffer(fd_, length_, size(),
- with_alpha_channel));
+ std::move(callback).Run(
+ connection()->wayland_buffer_factory()->CreateShmBuffer(
+ fd_, length_, size(), with_alpha_channel));
if (UseExplicitSyncRelease())
auto close = std::move(fd_);
}
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_solid_color.cc b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_solid_color.cc
index 4c83a4ed9ad..bcc77a254e1 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_solid_color.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_solid_color.cc
@@ -11,7 +11,7 @@ namespace ui {
WaylandBufferBackingSolidColor::WaylandBufferBackingSolidColor(
const WaylandConnection* connection,
- SkColor color,
+ SkColor4f color,
const gfx::Size& size,
uint32_t buffer_id)
: WaylandBufferBacking(connection, buffer_id, size), color_(color) {}
@@ -22,7 +22,8 @@ void WaylandBufferBackingSolidColor::RequestBufferHandle(
base::OnceCallback<void(wl::Object<wl_buffer>)> callback) {
DCHECK(!callback.is_null());
std::move(callback).Run(
- connection_->surface_augmenter()->CreateSolidColorBuffer(color_, size()));
+ connection()->surface_augmenter()->CreateSolidColorBuffer(color_,
+ size()));
}
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_solid_color.h b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_solid_color.h
index c0807885588..7ffe8948cad 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_solid_color.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_backing_solid_color.h
@@ -20,7 +20,7 @@ class WaylandBufferBackingSolidColor : public WaylandBufferBacking {
WaylandBufferBackingSolidColor& operator=(
const WaylandBufferBackingSolidColor&) = delete;
WaylandBufferBackingSolidColor(const WaylandConnection* connection,
- SkColor color,
+ SkColor4f color,
const gfx::Size& size,
uint32_t buffer_id);
~WaylandBufferBackingSolidColor() override;
@@ -30,7 +30,7 @@ class WaylandBufferBackingSolidColor : public WaylandBufferBacking {
void RequestBufferHandle(
base::OnceCallback<void(wl::Object<wl_buffer>)> callback) override;
- SkColor color_;
+ SkColor4f color_;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_factory.cc b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_factory.cc
new file mode 100644
index 00000000000..bad5a26711c
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_factory.cc
@@ -0,0 +1,82 @@
+// 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/wayland/host/wayland_buffer_factory.h"
+
+#include <memory>
+
+#include "ui/ozone/platform/wayland/host/wayland_drm.h"
+#include "ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.h"
+
+namespace ui {
+
+WaylandBufferFactory::WaylandBufferFactory() = default;
+
+WaylandBufferFactory::~WaylandBufferFactory() = default;
+
+void WaylandBufferFactory::CreateDmabufBuffer(
+ const base::ScopedFD& fd,
+ const gfx::Size& size,
+ const std::vector<uint32_t>& strides,
+ const std::vector<uint32_t>& offsets,
+ const std::vector<uint64_t>& modifiers,
+ uint32_t format,
+ uint32_t planes_count,
+ wl::OnRequestBufferCallback callback) const {
+ DCHECK(SupportsDmabuf());
+ if (wayland_zwp_dmabuf_) {
+ wayland_zwp_dmabuf_->CreateBuffer(fd, size, strides, offsets, modifiers,
+ format, planes_count,
+ std::move(callback));
+ } else if (wayland_drm_) {
+ wayland_drm_->CreateBuffer(fd, size, strides, offsets, modifiers, format,
+ planes_count, std::move(callback));
+ } else {
+ // This method must never be called if neither zwp_linux_dmabuf or wl_drm
+ // are supported.
+ NOTREACHED();
+ }
+}
+
+wl::Object<struct wl_buffer> WaylandBufferFactory::CreateShmBuffer(
+ const base::ScopedFD& fd,
+ size_t length,
+ const gfx::Size& size,
+ bool with_alpha_channel) const {
+ if (UNLIKELY(!wayland_shm_))
+ return {};
+ return wayland_shm_->CreateBuffer(fd, length, size, with_alpha_channel);
+}
+
+wl::BufferFormatsWithModifiersMap
+WaylandBufferFactory::GetSupportedBufferFormats() const {
+#if defined(WAYLAND_GBM)
+ if (wayland_zwp_dmabuf_)
+ return wayland_zwp_dmabuf_->supported_buffer_formats();
+ else if (wayland_drm_)
+ return wayland_drm_->supported_buffer_formats();
+#endif
+ return {};
+}
+
+bool WaylandBufferFactory::SupportsDmabuf() const {
+#if defined(WAYLAND_GBM)
+ return !!wayland_zwp_dmabuf_ ||
+ (wayland_drm_ && wayland_drm_->SupportsDrmPrime());
+#else
+ return false;
+#endif
+}
+
+bool WaylandBufferFactory::CanCreateDmabufImmed() const {
+#if defined(WAYLAND_GBM)
+ if (wayland_zwp_dmabuf_)
+ return wayland_zwp_dmabuf_->CanCreateBufferImmed();
+ else if (wayland_drm_)
+ return wayland_drm_->CanCreateBufferImmed();
+#endif
+ return false;
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_factory.h b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_factory.h
new file mode 100644
index 00000000000..25b93f16e06
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_factory.h
@@ -0,0 +1,91 @@
+// 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_WAYLAND_HOST_WAYLAND_BUFFER_FACTORY_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_BUFFER_FACTORY_H_
+
+#include <vector>
+
+#include "base/files/scoped_file.h"
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
+#include "ui/ozone/platform/wayland/host/wayland_shm.h"
+
+namespace gfx {
+class Size;
+} // namespace gfx
+
+namespace ui {
+
+class WaylandDrm;
+class WaylandZwpLinuxDmabuf;
+
+// A factory that wraps different wayland objects that are able to create
+// wl_buffers.
+class WaylandBufferFactory {
+ public:
+ WaylandBufferFactory();
+ WaylandBufferFactory(const WaylandBufferFactory&) = delete;
+ WaylandBufferFactory& operator=(const WaylandBufferFactory&) = delete;
+ ~WaylandBufferFactory();
+
+ // Requests to create a wl_buffer backed by the dmabuf prime |fd| descriptor.
+ // The result is sent back via the |callback|. If buffer creation failed,
+ // nullptr is sent back via the callback. Otherwise, a pointer to the
+ // |wl_buffer| is sent. Depending on the result of |CanCreateDmabufImmed|,
+ // a buffer can be created immediately which means the callback will be fired
+ // immediately and the client will not have to wait until the buffer is
+ // created.
+ void CreateDmabufBuffer(const base::ScopedFD& fd,
+ const gfx::Size& size,
+ const std::vector<uint32_t>& strides,
+ const std::vector<uint32_t>& offsets,
+ const std::vector<uint64_t>& modifiers,
+ uint32_t format,
+ uint32_t planes_count,
+ wl::OnRequestBufferCallback callback) const;
+
+ // Creates a wl_buffer based on shared memory handle with the specified
+ // |length| and |size|. Whereas |with_alpha_channel| indicates whether the
+ // buffer's color format should use or not the alpha channel.
+ //
+ // TODO(crbug.com/1269044): Remove |with_alpha_channel| parameter once
+ // Exo-side Skia Renderer issue is fixed.
+ wl::Object<struct wl_buffer> CreateShmBuffer(
+ const base::ScopedFD& fd,
+ size_t length,
+ const gfx::Size& size,
+ bool with_alpha_channel = true) const;
+
+ // Returns supported buffer formats received from the Wayland compositor.
+ wl::BufferFormatsWithModifiersMap GetSupportedBufferFormats() const;
+
+ // Returns true if dmabuf is supported.
+ bool SupportsDmabuf() const;
+
+ // Returns true if a dmabuf buffer can be created immediately. If not, a
+ // dmabuf backed buffer is created asynchronously.
+ bool CanCreateDmabufImmed() const;
+
+ // Returns wl_shm. This has to be unfortunately exposed as
+ // WaylandCursorFactory uses wl_cursor_theme_load to load a cursor theme,
+ // which requires to pass the wl_shm object as a parameter when called.
+ wl_shm* shm() const { return wayland_shm_ ? wayland_shm_->get() : nullptr; }
+
+ private:
+ // Exposed so that globals are able to create these objects when exist.
+ friend class WaylandDrm;
+ friend class WaylandShm;
+ friend class WaylandZwpLinuxDmabuf;
+
+ // A wrapper around wl_drm.
+ std::unique_ptr<WaylandDrm> wayland_drm_;
+ // A wrapper around wl_shm.
+ std::unique_ptr<WaylandShm> wayland_shm_;
+ // A wrapper around zwp_linux_dmabuf.
+ std::unique_ptr<WaylandZwpLinuxDmabuf> wayland_zwp_dmabuf_;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_BUFFER_FACTORY_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_handle.h b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_handle.h
index f85c2ea304c..bfdc42dc82e 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_handle.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_handle.h
@@ -7,6 +7,7 @@
#include "base/callback.h"
#include "base/containers/flat_map.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "ui/gfx/gpu_fence_handle.h"
#include "ui/gfx/native_widget_types.h"
@@ -65,7 +66,7 @@ class WaylandBufferHandle {
// wl_buffer_listener:
static void BufferRelease(void* data, struct wl_buffer* wl_buffer);
- const WaylandBufferBacking* backing_;
+ raw_ptr<const WaylandBufferBacking> backing_;
// A wl_buffer backed by the dmabuf/shm |backing_| created on the GPU side.
wl::Object<struct wl_buffer> wl_buffer_;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_connector.h b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_connector.h
index a08e874fac9..469d1e9c83d 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_connector.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_connector.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_BUFFER_MANAGER_CONNECTOR_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_BUFFER_MANAGER_CONNECTOR_H_
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/public/gpu_platform_support_host.h"
#include "base/threading/thread_checker.h"
@@ -41,7 +42,7 @@ class WaylandBufferManagerConnector : public GpuPlatformSupportHost {
// Non-owned pointer, which is used to bind a mojo pointer to the
// WaylandBufferManagerHost.
- WaylandBufferManagerHost* const buffer_manager_host_;
+ const raw_ptr<WaylandBufferManagerHost> buffer_manager_host_;
GpuHostBindInterfaceCallback binder_;
GpuHostTerminateCallback terminate_callback_;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc
index 582c434557d..6409019f959 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc
@@ -22,12 +22,10 @@
#include "ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.h"
#include "ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.h"
#include "ui/ozone/platform/wayland/host/wayland_buffer_backing_solid_color.h"
+#include "ui/ozone/platform/wayland/host/wayland_buffer_factory.h"
#include "ui/ozone/platform/wayland/host/wayland_buffer_handle.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
-#include "ui/ozone/platform/wayland/host/wayland_drm.h"
-#include "ui/ozone/platform/wayland/host/wayland_shm.h"
#include "ui/ozone/platform/wayland/host/wayland_window.h"
-#include "ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.h"
namespace ui {
@@ -75,18 +73,11 @@ void WaylandBufferManagerHost::OnChannelDestroyed() {
wl::BufferFormatsWithModifiersMap
WaylandBufferManagerHost::GetSupportedBufferFormats() const {
-#if defined(WAYLAND_GBM)
- if (connection_->zwp_dmabuf())
- return connection_->zwp_dmabuf()->supported_buffer_formats();
- else if (connection_->drm())
- return connection_->drm()->supported_buffer_formats();
-#endif
- return {};
+ return connection_->wayland_buffer_factory()->GetSupportedBufferFormats();
}
bool WaylandBufferManagerHost::SupportsDmabuf() const {
- return !!connection_->zwp_dmabuf() ||
- (connection_->drm() && connection_->drm()->SupportsDrmPrime());
+ return connection_->wayland_buffer_factory()->SupportsDmabuf();
}
bool WaylandBufferManagerHost::SupportsAcquireFence() const {
@@ -189,7 +180,7 @@ void WaylandBufferManagerHost::CreateShmBasedBuffer(mojo::PlatformHandle shm_fd,
}
void WaylandBufferManagerHost::CreateSolidColorBuffer(const gfx::Size& size,
- SkColor color,
+ const SkColor4f& color,
uint32_t buffer_id) {
DCHECK(base::CurrentUIThread::IsSet());
DCHECK(error_message_.empty());
@@ -254,6 +245,18 @@ WaylandBufferHandle* WaylandBufferManagerHost::GetBufferHandle(
return it->second->GetBufferHandle(requestor);
}
+uint32_t WaylandBufferManagerHost::GetBufferFormat(WaylandSurface* requestor,
+ uint32_t buffer_id) {
+ DCHECK(base::CurrentUIThread::IsSet());
+ DCHECK(requestor);
+
+ auto it = buffer_backings_.find(buffer_id);
+ if (it == buffer_backings_.end())
+ return DRM_FORMAT_INVALID;
+
+ return it->second.get()->format();
+}
+
void WaylandBufferManagerHost::CommitOverlays(
gfx::AcceleratedWidget widget,
uint32_t frame_id,
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h
index 3243f26aabe..0109078bc41 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h
@@ -13,6 +13,7 @@
#include "base/containers/flat_map.h"
#include "base/files/scoped_file.h"
#include "base/gtest_prod_util.h"
+#include "base/memory/raw_ptr.h"
#include "mojo/public/cpp/bindings/associated_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
@@ -99,7 +100,7 @@ class WaylandBufferManagerHost : public ozone::mojom::WaylandBufferManagerHost {
// ui/ozone/platform/wayland/mojom/wayland_buffer_manager.mojom. The
// availability of this depends on existence of surface-augmenter protocol.
void CreateSolidColorBuffer(const gfx::Size& size,
- SkColor color,
+ const SkColor4f& color,
uint32_t buffer_id) override;
// Called by the GPU to destroy the imported wl_buffer with a |buffer_id|.
@@ -121,6 +122,10 @@ class WaylandBufferManagerHost : public ozone::mojom::WaylandBufferManagerHost {
WaylandBufferHandle* GetBufferHandle(WaylandSurface* requestor,
uint32_t buffer_id);
+ // Gets the buffer format of |buffer_id| used for |requestor| if it is a
+ // DMA based buffer.
+ uint32_t GetBufferFormat(WaylandSurface* requestor, uint32_t buffer_id);
+
// Tells the |buffer_manager_gpu_ptr_| the result of a swap call and provides
// it with the presentation feedback.
void OnSubmission(gfx::AcceleratedWidget widget,
@@ -158,7 +163,7 @@ class WaylandBufferManagerHost : public ozone::mojom::WaylandBufferManagerHost {
std::string error_message_;
// Non-owned pointer to the main connection.
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
mojo::AssociatedRemote<ozone::mojom::WaylandBufferManagerGpu>
buffer_manager_gpu_associated_;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.cc b/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.cc
index b7fa2877766..855d8526d72 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.cc
@@ -11,6 +11,7 @@
#include "base/bind.h"
#include "base/check.h"
#include "base/logging.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/notreached.h"
@@ -189,7 +190,7 @@ class ClipboardImpl final : public Clipboard, public DataSource::Delegate {
}
// The device manager used to access data device and create data sources.
- Manager* const manager_;
+ const raw_ptr<Manager> manager_;
// The clipboard buffer managed by this |this|.
const ui::ClipboardBuffer buffer_;
@@ -203,7 +204,7 @@ class ClipboardImpl final : public Clipboard, public DataSource::Delegate {
// Notifies when clipboard data changes. Can be empty if not set.
ClipboardDataChangedCallback clipboard_changed_callback_;
- ui::WaylandConnection* const connection_;
+ const raw_ptr<ui::WaylandConnection> connection_;
base::WeakPtrFactory<ClipboardImpl> weak_factory_{this};
};
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.h b/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.h
index 3471f9a3468..fe68fc03850 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.h
@@ -10,6 +10,7 @@
#include "base/callback.h"
#include "base/gtest_prod_util.h"
+#include "base/memory/raw_ptr.h"
#include "ui/base/clipboard/clipboard_buffer.h"
#include "ui/ozone/platform/wayland/host/wayland_data_device.h"
#include "ui/ozone/public/platform_clipboard.h"
@@ -65,7 +66,7 @@ class WaylandClipboard : public PlatformClipboard {
// WaylandConnection providing optional data device managers, e.g: gtk
// primary selection.
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
const std::unique_ptr<wl::Clipboard> copypaste_clipboard_;
std::unique_ptr<wl::Clipboard> primary_selection_clipboard_;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_clipboard_unittest.cc b/chromium/ui/ozone/platform/wayland/host/wayland_clipboard_unittest.cc
index 21fcd9b4b08..2c27d665ace 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_clipboard_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_clipboard_unittest.cc
@@ -14,6 +14,7 @@
#include "base/callback_forward.h"
#include "base/containers/flat_set.h"
#include "base/location.h"
+#include "base/memory/raw_ptr.h"
#include "base/run_loop.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/thread_pool/thread_pool_instance.h"
@@ -146,11 +147,11 @@ class WaylandClipboardTestBase : public WaylandTest {
}
/* Server objects */
- wl::MockPointer* pointer_;
- wl::TestTouch* touch_;
- wl::TestKeyboard* keyboard_;
+ raw_ptr<wl::MockPointer> pointer_;
+ raw_ptr<wl::TestTouch> touch_;
+ raw_ptr<wl::TestKeyboard> keyboard_;
- WaylandClipboard* clipboard_ = nullptr;
+ raw_ptr<WaylandClipboard> clipboard_ = nullptr;
uint32_t serial_ = 0;
uint32_t timestamp_ = 0;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_connection.cc b/chromium/ui/ozone/platform/wayland/host/wayland_connection.cc
index 8e9b1d43b69..003c907f8e4 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_connection.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_connection.cc
@@ -20,25 +20,22 @@
#include "base/strings/string_util.h"
#include "base/task/current_thread.h"
#include "base/threading/thread_task_runner_handle.h"
-#include "base/time/time.h"
#include "ui/events/devices/device_data_manager.h"
#include "ui/events/devices/input_device.h"
#include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
#include "ui/gfx/geometry/point.h"
#include "ui/ozone/common/features.h"
-#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include "ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.h"
#include "ui/ozone/platform/wayland/host/gtk_shell1.h"
#include "ui/ozone/platform/wayland/host/org_kde_kwin_idle.h"
#include "ui/ozone/platform/wayland/host/overlay_prioritizer.h"
#include "ui/ozone/platform/wayland/host/proxy/wayland_proxy_impl.h"
#include "ui/ozone/platform/wayland/host/surface_augmenter.h"
+#include "ui/ozone/platform/wayland/host/wayland_buffer_factory.h"
#include "ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h"
-#include "ui/ozone/platform/wayland/host/wayland_clipboard.h"
#include "ui/ozone/platform/wayland/host/wayland_cursor.h"
#include "ui/ozone/platform/wayland/host/wayland_cursor_position.h"
#include "ui/ozone/platform/wayland/host/wayland_data_device_manager.h"
-#include "ui/ozone/platform/wayland/host/wayland_data_drag_controller.h"
#include "ui/ozone/platform/wayland/host/wayland_drm.h"
#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
#include "ui/ozone/platform/wayland/host/wayland_input_method_context.h"
@@ -50,12 +47,15 @@
#include "ui/ozone/platform/wayland/host/wayland_window.h"
#include "ui/ozone/platform/wayland/host/wayland_window_drag_controller.h"
#include "ui/ozone/platform/wayland/host/wayland_zaura_shell.h"
+#include "ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.h"
+#include "ui/ozone/platform/wayland/host/wayland_zcr_color_manager.h"
#include "ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.h"
#include "ui/ozone/platform/wayland/host/wayland_zcr_touchpad_haptics.h"
#include "ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.h"
#include "ui/ozone/platform/wayland/host/wayland_zwp_pointer_constraints.h"
#include "ui/ozone/platform/wayland/host/wayland_zwp_pointer_gestures.h"
#include "ui/ozone/platform/wayland/host/wayland_zwp_relative_pointer_manager.h"
+#include "ui/ozone/platform/wayland/host/xdg_activation.h"
#include "ui/ozone/platform/wayland/host/xdg_foreign_wrapper.h"
#include "ui/ozone/platform/wayland/host/zwp_idle_inhibit_manager.h"
#include "ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.h"
@@ -76,12 +76,12 @@ namespace {
// advertised by the server.
constexpr uint32_t kMaxCompositorVersion = 4;
constexpr uint32_t kMaxKeyboardExtensionVersion = 2;
-constexpr uint32_t kMaxXdgShellVersion = 3;
+constexpr uint32_t kMaxXdgShellVersion = 5;
constexpr uint32_t kMaxZXdgShellVersion = 1;
constexpr uint32_t kMaxWpPresentationVersion = 1;
constexpr uint32_t kMaxWpViewporterVersion = 1;
constexpr uint32_t kMaxTextInputManagerVersion = 1;
-constexpr uint32_t kMaxTextInputExtensionVersion = 2;
+constexpr uint32_t kMaxTextInputExtensionVersion = 5;
constexpr uint32_t kMaxExplicitSyncVersion = 2;
constexpr uint32_t kMaxAlphaCompositingVersion = 1;
constexpr uint32_t kMaxXdgDecorationVersion = 1;
@@ -183,6 +183,8 @@ bool WaylandConnection::Initialize() {
&WaylandShm::Instantiate);
RegisterGlobalObjectFactory(WaylandZAuraShell::kInterfaceName,
&WaylandZAuraShell::Instantiate);
+ RegisterGlobalObjectFactory(WaylandZcrColorManager::kInterfaceName,
+ &WaylandZcrColorManager::Instantiate);
RegisterGlobalObjectFactory(WaylandZcrCursorShapes::kInterfaceName,
&WaylandZcrCursorShapes::Instantiate);
RegisterGlobalObjectFactory(WaylandZcrTouchpadHaptics::kInterfaceName,
@@ -195,6 +197,8 @@ bool WaylandConnection::Initialize() {
&WaylandZwpPointerGestures::Instantiate);
RegisterGlobalObjectFactory(WaylandZwpRelativePointerManager::kInterfaceName,
&WaylandZwpRelativePointerManager::Instantiate);
+ RegisterGlobalObjectFactory(XdgActivation::kInterfaceName,
+ &XdgActivation::Instantiate);
RegisterGlobalObjectFactory(XdgForeignWrapper::kInterfaceNameV1,
&XdgForeignWrapper::Instantiate);
RegisterGlobalObjectFactory(XdgForeignWrapper::kInterfaceNameV2,
@@ -211,7 +215,7 @@ bool WaylandConnection::Initialize() {
display_.reset(wl_display_connect(nullptr));
if (!display_) {
- LOG(ERROR) << "Failed to connect to Wayland display";
+ PLOG(ERROR) << "Failed to connect to Wayland display";
return false;
}
@@ -234,6 +238,10 @@ bool WaylandConnection::Initialize() {
event_source_ = std::make_unique<WaylandEventSource>(
display(), event_queue_.get(), wayland_window_manager(), this);
+ // Create the buffer factory before registry listener is set so that shm, drm,
+ // zwp_linux_dmabuf objects are able to be stored.
+ wayland_buffer_factory_ = std::make_unique<WaylandBufferFactory>();
+
wl_registry_add_listener(registry_.get(), &registry_listener, this);
while (!wayland_output_manager_ ||
!wayland_output_manager_->IsOutputReady()) {
@@ -246,7 +254,7 @@ bool WaylandConnection::Initialize() {
LOG(ERROR) << "No wl_compositor object";
return false;
}
- if (!shm_) {
+ if (!wayland_buffer_factory()->shm()) {
LOG(ERROR) << "No wl_shm object";
return false;
}
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_connection.h b/chromium/ui/ozone/platform/wayland/host/wayland_connection.h
index b89866d63e0..b45280eb9f3 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_connection.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_connection.h
@@ -12,6 +12,7 @@
#include "base/callback_forward.h"
#include "base/containers/flat_map.h"
+#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/display/tablet_state.h"
@@ -39,21 +40,20 @@ namespace ui {
class DeviceHotplugEventObserver;
class OrgKdeKwinIdle;
class SurfaceAugmenter;
+class WaylandBufferFactory;
class WaylandBufferManagerHost;
class WaylandCursor;
class WaylandCursorBufferListener;
-class WaylandDrm;
class WaylandEventSource;
class WaylandOutputManager;
class WaylandSeat;
-class WaylandShm;
class WaylandZAuraShell;
+class WaylandZcrColorManager;
class WaylandZcrCursorShapes;
class WaylandZcrTouchpadHaptics;
class WaylandZwpPointerConstraints;
class WaylandZwpPointerGestures;
class WaylandZwpRelativePointerManager;
-class WaylandZwpLinuxDmabuf;
class WaylandDataDeviceManager;
class WaylandCursorPosition;
class WaylandWindowDragController;
@@ -61,6 +61,7 @@ class GtkPrimarySelectionDeviceManager;
class GtkShell1;
class ZwpIdleInhibitManager;
class ZwpPrimarySelectionDeviceManager;
+class XdgActivation;
class XdgForeignWrapper;
class OverlayPrioritizer;
@@ -95,6 +96,9 @@ class WaylandConnection {
// Schedules a flush of the Wayland connection.
void ScheduleFlush();
+ // Immediately flushes. Public for testing.
+ void Flush();
+
// Calls wl_display_roundtrip_queue. Might be required during initialization
// of some objects that should block until they are initialized.
void RoundTripQueue();
@@ -181,6 +185,10 @@ class WaylandConnection {
WaylandZAuraShell* zaura_shell() const { return zaura_shell_.get(); }
+ WaylandZcrColorManager* zcr_color_manager() const {
+ return zcr_color_manager_.get();
+ }
+
WaylandZcrCursorShapes* zcr_cursor_shapes() const {
return zcr_cursor_shapes_.get();
}
@@ -189,16 +197,14 @@ class WaylandConnection {
return zcr_touchpad_haptics_.get();
}
- WaylandZwpLinuxDmabuf* zwp_dmabuf() const { return zwp_dmabuf_.get(); }
-
- WaylandDrm* drm() const { return drm_.get(); }
-
- WaylandShm* shm() const { return shm_.get(); }
-
WaylandWindowManager* wayland_window_manager() {
return &wayland_window_manager_;
}
+ WaylandBufferFactory* wayland_buffer_factory() const {
+ return wayland_buffer_factory_.get();
+ }
+
WaylandDataDeviceManager* data_device_manager() const {
return data_device_manager_.get();
}
@@ -238,6 +244,8 @@ class WaylandConnection {
return wayland_zwp_relative_pointer_manager_.get();
}
+ const XdgActivation* xdg_activation() const { return xdg_activation_.get(); }
+
XdgForeignWrapper* xdg_foreign() const { return xdg_foreign_.get(); }
ZwpIdleInhibitManager* zwp_idle_inhibit_manager() const {
@@ -314,17 +322,16 @@ class WaylandConnection {
friend class OverlayPrioritizer;
friend class SurfaceAugmenter;
friend class WaylandDataDeviceManager;
- friend class WaylandDrm;
friend class WaylandOutput;
friend class WaylandSeat;
- friend class WaylandShm;
friend class WaylandZAuraShell;
friend class WaylandZcrTouchpadHaptics;
- friend class WaylandZwpLinuxDmabuf;
friend class WaylandZwpPointerConstraints;
friend class WaylandZwpPointerGestures;
friend class WaylandZwpRelativePointerManager;
+ friend class WaylandZcrColorManager;
friend class WaylandZcrCursorShapes;
+ friend class XdgActivation;
friend class XdgForeignWrapper;
friend class ZwpIdleInhibitManager;
friend class ZwpPrimarySelectionDeviceManager;
@@ -332,7 +339,6 @@ class WaylandConnection {
void RegisterGlobalObjectFactory(const char* interface_name,
wl::GlobalObjectFactory factory);
- void Flush();
void UpdateInputDevices();
// Initialize data-related objects if required protocol objects are already
@@ -391,11 +397,16 @@ class WaylandConnection {
// outlives them so thus being able to properly handle their destruction.
std::unique_ptr<WaylandEventSource> event_source_;
+ // Factory that wraps all the supported wayland objects that are provide
+ // capabilities to create wl_buffers.
+ std::unique_ptr<WaylandBufferFactory> wayland_buffer_factory_;
+
std::unique_ptr<WaylandCursor> cursor_;
std::unique_ptr<WaylandDataDeviceManager> data_device_manager_;
std::unique_ptr<WaylandOutputManager> wayland_output_manager_;
std::unique_ptr<WaylandCursorPosition> wayland_cursor_position_;
std::unique_ptr<WaylandZAuraShell> zaura_shell_;
+ std::unique_ptr<WaylandZcrColorManager> zcr_color_manager_;
std::unique_ptr<WaylandZcrCursorShapes> zcr_cursor_shapes_;
std::unique_ptr<WaylandZcrTouchpadHaptics> zcr_touchpad_haptics_;
std::unique_ptr<WaylandZwpPointerConstraints>
@@ -403,11 +414,9 @@ class WaylandConnection {
std::unique_ptr<WaylandZwpRelativePointerManager>
wayland_zwp_relative_pointer_manager_;
std::unique_ptr<WaylandZwpPointerGestures> wayland_zwp_pointer_gestures_;
- std::unique_ptr<WaylandZwpLinuxDmabuf> zwp_dmabuf_;
- std::unique_ptr<WaylandDrm> drm_;
std::unique_ptr<WaylandSeat> seat_;
- std::unique_ptr<WaylandShm> shm_;
std::unique_ptr<WaylandBufferManagerHost> buffer_manager_host_;
+ std::unique_ptr<XdgActivation> xdg_activation_;
std::unique_ptr<XdgForeignWrapper> xdg_foreign_;
std::unique_ptr<ZwpIdleInhibitManager> zwp_idle_inhibit_manager_;
std::unique_ptr<OverlayPrioritizer> overlay_prioritizer_;
@@ -438,7 +447,7 @@ class WaylandConnection {
// created when platform window test config is set.
std::unique_ptr<wl::WaylandProxy> wayland_proxy_;
- WaylandCursorBufferListener* listener_ = nullptr;
+ raw_ptr<WaylandCursorBufferListener> listener_ = nullptr;
// The current window table mode layout state.
display::TabletState tablet_layout_state_ =
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_connection_test_api.h b/chromium/ui/ozone/platform/wayland/host/wayland_connection_test_api.h
index 1013067cef6..8c53b70c63a 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_connection_test_api.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_connection_test_api.h
@@ -8,6 +8,7 @@
#include <memory>
#include <utility>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
#include "ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.h"
@@ -32,7 +33,7 @@ class WaylandConnectionTestApi {
}
private:
- WaylandConnection* const impl_;
+ const raw_ptr<WaylandConnection> impl_;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_cursor.cc b/chromium/ui/ozone/platform/wayland/host/wayland_cursor.cc
index f78e436d439..babf9c2d150 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_cursor.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_cursor.cc
@@ -16,7 +16,6 @@
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
#include "ui/ozone/platform/wayland/host/wayland_pointer.h"
#include "ui/ozone/platform/wayland/host/wayland_serial_tracker.h"
-#include "ui/ozone/platform/wayland/host/wayland_shm.h"
namespace ui {
@@ -38,7 +37,6 @@ void WaylandCursor::OnBufferRelease(void* data, wl_buffer* buffer) {
void WaylandCursor::UpdateBitmap(const std::vector<SkBitmap>& cursor_image,
const gfx::Point& hotspot_in_dips,
int buffer_scale) {
- DCHECK(connection_->shm());
if (!pointer_)
return;
@@ -50,7 +48,7 @@ void WaylandCursor::UpdateBitmap(const std::vector<SkBitmap>& cursor_image,
return HideCursor();
gfx::Size image_size = gfx::SkISizeToSize(image.dimensions());
- WaylandShmBuffer buffer(connection_->shm(), image_size);
+ WaylandShmBuffer buffer(connection_->wayland_buffer_factory(), image_size);
if (!buffer.IsValid()) {
LOG(ERROR) << "Failed to create SHM buffer for Cursor Bitmap.";
@@ -58,7 +56,8 @@ void WaylandCursor::UpdateBitmap(const std::vector<SkBitmap>& cursor_image,
}
buffer_scale_ = buffer_scale;
- wl_surface_set_buffer_scale(pointer_surface_.get(), buffer_scale_);
+ if (!connection_->surface_submission_in_pixel_coordinates())
+ wl_surface_set_buffer_scale(pointer_surface_.get(), buffer_scale_);
static constexpr wl_buffer_listener wl_buffer_listener{
&WaylandCursor::OnBufferRelease};
@@ -86,7 +85,8 @@ void WaylandCursor::SetPlatformShape(wl_cursor* cursor_data, int buffer_scale) {
buffer_scale_ = buffer_scale;
current_image_index_ = 0;
- wl_surface_set_buffer_scale(pointer_surface_.get(), buffer_scale_);
+ if (!connection_->surface_submission_in_pixel_coordinates())
+ wl_surface_set_buffer_scale(pointer_surface_.get(), buffer_scale_);
SetPlatformShapeInternal();
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_cursor.h b/chromium/ui/ozone/platform/wayland/host/wayland_cursor.h
index b07751fbddd..862b0a29a5b 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_cursor.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_cursor.h
@@ -8,6 +8,7 @@
#include <vector>
#include "base/containers/flat_map.h"
+#include "base/memory/raw_ptr.h"
#include "base/timer/timer.h"
#include "third_party/skia/include/core/SkSurface.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
@@ -88,16 +89,16 @@ class WaylandCursor {
uint32_t hotspot_x_dip,
uint32_t hotspot_y_dip);
- WaylandPointer* const pointer_;
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandPointer> pointer_;
+ const raw_ptr<WaylandConnection> connection_;
const wl::Object<wl_surface> pointer_surface_;
// Holds the buffers and their memory until the compositor releases them.
base::flat_map<wl_buffer*, WaylandShmBuffer> buffers_;
- WaylandCursorBufferListener* listener_ = nullptr;
+ raw_ptr<WaylandCursorBufferListener> listener_ = nullptr;
// Current platform cursor.
- wl_cursor* cursor_data_ = nullptr;
+ raw_ptr<wl_cursor> cursor_data_ = nullptr;
size_t current_image_index_ = 0;
int buffer_scale_ = 1;
base::RepeatingTimer animation_timer_;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_cursor_factory.cc b/chromium/ui/ozone/platform/wayland/host/wayland_cursor_factory.cc
index d72ff37b737..02e8a628a6f 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_cursor_factory.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_cursor_factory.cc
@@ -13,8 +13,8 @@
#include "ui/base/cursor/platform_cursor.h"
#include "ui/ozone/common/bitmap_cursor.h"
#include "ui/ozone/common/bitmap_cursor_factory.h"
+#include "ui/ozone/platform/wayland/host/wayland_buffer_factory.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
-#include "ui/ozone/platform/wayland/host/wayland_shm.h"
namespace ui {
@@ -45,9 +45,9 @@ WaylandCursorFactory::WaylandCursorFactory(WaylandConnection* connection)
WaylandCursorFactory::~WaylandCursorFactory() = default;
void WaylandCursorFactory::ObserveThemeChanges() {
- auto* cursor_theme_manager = CursorThemeManager::GetInstance();
- DCHECK(cursor_theme_manager);
- cursor_theme_observer_.Observe(cursor_theme_manager);
+ auto* linux_ui = LinuxUi::instance();
+ DCHECK(linux_ui);
+ cursor_theme_observer_.Observe(linux_ui);
}
scoped_refptr<PlatformCursor> WaylandCursorFactory::GetDefaultCursor(
@@ -146,7 +146,7 @@ void WaylandCursorFactory::ReloadThemeCursors() {
FROM_HERE,
{base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
base::BindOnce(LoadCursorTheme, name_, size_, scale_,
- connection_->shm()->get()),
+ connection_->wayland_buffer_factory()->shm()),
base::BindOnce(&WaylandCursorFactory::OnThemeLoaded,
weak_factory_.GetWeakPtr(), name_, size_));
}
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_cursor_factory.h b/chromium/ui/ozone/platform/wayland/host/wayland_cursor_factory.h
index 8e4a97a6e29..9542bf4d656 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_cursor_factory.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_cursor_factory.h
@@ -9,10 +9,11 @@
#include "base/containers/flat_map.h"
#include "base/gtest_prod_util.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/scoped_observation.h"
-#include "ui/base/cursor/cursor_theme_manager.h"
-#include "ui/base/cursor/cursor_theme_manager_observer.h"
+#include "ui/linux/cursor_theme_manager_observer.h"
+#include "ui/linux/linux_ui.h"
#include "ui/ozone/common/bitmap_cursor_factory.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include "ui/ozone/platform/wayland/host/wayland_cursor.h"
@@ -70,9 +71,12 @@ class WaylandCursorFactory : public BitmapCursorFactory,
int loaded_theme_size,
wl_cursor_theme* loaded_theme);
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
- base::ScopedObservation<CursorThemeManager, CursorThemeManagerObserver>
+ base::ScopedObservation<LinuxUi,
+ CursorThemeManagerObserver,
+ &LinuxUi::AddCursorThemeObserver,
+ &LinuxUi::RemoveCursorThemeObserver>
cursor_theme_observer_{this};
// Name of the current theme.
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_device.h b/chromium/ui/ozone/platform/wayland/host/wayland_data_device.h
index 5f32a769eba..8186611a64b 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_device.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_device.h
@@ -12,6 +12,7 @@
#include "base/callback.h"
#include "base/files/scoped_file.h"
#include "base/gtest_prod_util.h"
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include "ui/ozone/platform/wayland/host/wayland_data_device_base.h"
#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
@@ -124,7 +125,7 @@ class WaylandDataDevice : public WaylandDataDeviceBase {
// The wl_data_device wrapped by this WaylandDataDevice.
wl::Object<wl_data_device> data_device_;
- DragDelegate* drag_delegate_ = nullptr;
+ raw_ptr<DragDelegate> drag_delegate_ = nullptr;
// There are two separate data offers at a time, the drag offer and the
// selection offer, each with independent lifetimes. When we receive a new
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_device_base.h b/chromium/ui/ozone/platform/wayland/host/wayland_data_device_base.h
index eac004dc7c8..f59b679443e 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_device_base.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_device_base.h
@@ -9,6 +9,7 @@
#include "base/callback.h"
#include "base/files/scoped_file.h"
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include "ui/ozone/platform/wayland/host/wayland_data_offer_base.h"
#include "ui/ozone/public/platform_clipboard.h"
@@ -78,7 +79,7 @@ class WaylandDataDeviceBase {
// Used to call out to WaylandConnection once clipboard data has been
// successfully read.
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
// Offer that holds the most-recent clipboard selection, or null if no
// clipboard data is available.
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_device_manager.h b/chromium/ui/ozone/platform/wayland/host/wayland_data_device_manager.h
index fa6899c6a70..fdabde5cade 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_device_manager.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_device_manager.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
@@ -42,7 +43,7 @@ class WaylandDataDeviceManager
private:
wl::Object<wl_data_device_manager> device_manager_;
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
std::unique_ptr<WaylandDataDevice> device_;
};
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller.cc b/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller.cc
index 3472a5ed3b0..8733b4cf91a 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller.cc
@@ -220,7 +220,8 @@ void WaylandDataDragController::DrawIconInternal() {
DCHECK(!icon_bitmap_->empty());
gfx::Size size(icon_bitmap_->width(), icon_bitmap_->height());
- icon_buffer_ = std::make_unique<WaylandShmBuffer>(connection_->shm(), size);
+ icon_buffer_ = std::make_unique<WaylandShmBuffer>(
+ connection_->wayland_buffer_factory(), size);
if (!icon_buffer_->IsValid()) {
LOG(ERROR) << "Failed to create drag icon buffer.";
return;
@@ -256,10 +257,12 @@ void WaylandDataDragController::OnDragEnter(WaylandWindow* window,
if (pointer_grabber_for_window_drag_) {
DCHECK(drag_source_.has_value());
- if (*drag_source_ == DragSource::kMouse)
- pointer_delegate_->OnPointerFocusChanged(window, location);
- else
+ if (*drag_source_ == DragSource::kMouse) {
+ pointer_delegate_->OnPointerFocusChanged(
+ window, location, wl::EventDispatchPolicy::kImmediate);
+ } else {
touch_delegate_->OnTouchFocusChanged(window);
+ }
pointer_grabber_for_window_drag_ =
window_manager_->GetCurrentPointerOrTouchFocusedWindow();
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller.h b/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller.h
index c0f824984f6..a341650e633 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller.h
@@ -10,6 +10,7 @@
#include <string>
#include "base/gtest_prod_util.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/base/dragdrop/mojom/drag_drop_types.mojom-forward.h"
@@ -177,12 +178,12 @@ class WaylandDataDragController : public WaylandDataDevice::DragDelegate,
struct wl_callback* callback,
uint32_t time);
- WaylandConnection* const connection_;
- WaylandDataDeviceManager* const data_device_manager_;
- WaylandDataDevice* const data_device_;
- WaylandWindowManager* const window_manager_;
- WaylandPointer::Delegate* const pointer_delegate_;
- WaylandTouch::Delegate* const touch_delegate_;
+ const raw_ptr<WaylandConnection> connection_;
+ const raw_ptr<WaylandDataDeviceManager> data_device_manager_;
+ const raw_ptr<WaylandDataDevice> data_device_;
+ const raw_ptr<WaylandWindowManager> window_manager_;
+ const raw_ptr<WaylandPointer::Delegate> pointer_delegate_;
+ const raw_ptr<WaylandTouch::Delegate> touch_delegate_;
State state_ = State::kIdle;
absl::optional<DragSource> drag_source_;
@@ -207,10 +208,10 @@ class WaylandDataDragController : public WaylandDataDevice::DragDelegate,
// The window that initiated the drag session. Can be null when the session
// has been started by an external Wayland client.
- WaylandWindow* origin_window_ = nullptr;
+ raw_ptr<WaylandWindow> origin_window_ = nullptr;
// Current window under pointer.
- WaylandWindow* window_ = nullptr;
+ raw_ptr<WaylandWindow> window_ = nullptr;
// The most recent location received while dragging the data.
gfx::PointF last_drag_location_;
@@ -224,13 +225,13 @@ class WaylandDataDragController : public WaylandDataDevice::DragDelegate,
// Drag icon related variables.
std::unique_ptr<WaylandSurface> icon_surface_;
std::unique_ptr<WaylandShmBuffer> icon_buffer_;
- const SkBitmap* icon_bitmap_ = nullptr;
+ raw_ptr<const SkBitmap> icon_bitmap_ = nullptr;
gfx::Point icon_offset_;
wl::Object<wl_callback> icon_frame_callback_;
// Keeps track of the window that holds the pointer grab, i.e. the window that
// will receive the mouse release event from DispatchPointerRelease().
- WaylandWindow* pointer_grabber_for_window_drag_ = nullptr;
+ raw_ptr<WaylandWindow> pointer_grabber_for_window_drag_ = nullptr;
std::unique_ptr<ScopedEventDispatcher> nested_dispatcher_;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller_unittest.cc b/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller_unittest.cc
index b586e750eed..3dd10b81704 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_drag_controller_unittest.cc
@@ -261,7 +261,6 @@ class WaylandDataDragControllerTest : public WaylandDragDropTest {
};
TEST_P(WaylandDataDragControllerTest, StartDrag) {
- const bool restored_focus = window_->has_pointer_focus();
FocusAndPressLeftPointerButton(window_.get(), &delegate_);
auto test = [](WaylandDataDragControllerTest* self) {
@@ -290,12 +289,9 @@ TEST_P(WaylandDataDragControllerTest, StartDrag) {
// Ensure drag delegate it properly reset when the drag loop quits.
EXPECT_FALSE(data_device()->drag_delegate_);
-
- window_->SetPointerFocus(restored_focus);
}
TEST_P(WaylandDataDragControllerTest, StartDragWithWrongMimeType) {
- bool restored_focus = window_->has_pointer_focus();
FocusAndPressLeftPointerButton(window_.get(), &delegate_);
// The client starts dragging offering data with |kMimeTypeHTML|
@@ -319,7 +315,6 @@ TEST_P(WaylandDataDragControllerTest, StartDragWithWrongMimeType) {
data_device_manager_->data_source()->ReadData(kMimeTypeText,
std::move(callback));
run_loop.Run();
- window_->SetPointerFocus(restored_focus);
}
// Ensures data drag controller properly offers dragged data with custom
@@ -328,7 +323,6 @@ TEST_P(WaylandDataDragControllerTest, StartDragWithWrongMimeType) {
// - https://crbug.com/1207607
// - https://crbug.com/1247063
TEST_P(WaylandDataDragControllerTest, StartDragWithCustomFormats) {
- bool restored_focus = window_->has_pointer_focus();
FocusAndPressLeftPointerButton(window_.get(), &delegate_);
OSExchangeData data(OSExchangeDataProviderFactory::CreateProvider());
ClipboardFormatType kCustomFormats[] = {
@@ -351,12 +345,9 @@ TEST_P(WaylandDataDragControllerTest, StartDragWithCustomFormats) {
EXPECT_TRUE(base::Contains(mime_types, format.GetName()))
<< "Format '" << format.GetName() << "' should be offered.";
}
-
- window_->SetPointerFocus(restored_focus);
}
TEST_P(WaylandDataDragControllerTest, StartDragWithText) {
- bool restored_focus = window_->has_pointer_focus();
FocusAndPressLeftPointerButton(window_.get(), &delegate_);
// The client starts dragging offering text mime type.
@@ -381,11 +372,9 @@ TEST_P(WaylandDataDragControllerTest, StartDragWithText) {
data_device_manager_->data_source()->ReadData(kMimeTypeMozillaURL,
std::move(callback));
run_loop.Run();
- window_->SetPointerFocus(restored_focus);
}
TEST_P(WaylandDataDragControllerTest, StartDragWithFileContents) {
- bool restored_focus = window_->has_pointer_focus();
FocusAndPressLeftPointerButton(window_.get(), &delegate_);
// The client starts dragging offering text mime type.
@@ -413,7 +402,6 @@ TEST_P(WaylandDataDragControllerTest, StartDragWithFileContents) {
EXPECT_EQ(1u, data_device_manager_->data_source()->mime_types().size());
EXPECT_EQ("application/octet-stream;name=\"t\\\\est\\\".jpg\"",
data_device_manager_->data_source()->mime_types().front());
- window_->SetPointerFocus(restored_focus);
}
MATCHER_P(PointFNear, n, "") {
@@ -686,7 +674,6 @@ TEST_P(WaylandDataDragControllerTest, ValidateDroppedXMozUrl) {
// Verifies the correct delegate functions are called when a drag session is
// started and cancelled within the same surface.
TEST_P(WaylandDataDragControllerTest, StartAndCancel) {
- const bool restored_focus = window_->has_pointer_focus();
FocusAndPressLeftPointerButton(window_.get(), &delegate_);
// Schedule a wl_data_source::cancelled event to be sent asynchronously
@@ -694,8 +681,6 @@ TEST_P(WaylandDataDragControllerTest, StartAndCancel) {
ScheduleDragCancel();
RunMouseDragWithSampleData(window_.get(), DragDropTypes::DRAG_COPY);
-
- window_->SetPointerFocus(restored_focus);
}
TEST_P(WaylandDataDragControllerTest, ForeignDragHandleAskAction) {
@@ -736,7 +721,6 @@ TEST_P(WaylandDataDragControllerTest, ForeignDragHandleAskAction) {
// Regression test for https://crbug.com/1143707.
TEST_P(WaylandDataDragControllerTest, DestroyEnteredSurface) {
auto* window_1 = window_.get();
- const bool restored_focus = window_1->has_pointer_focus();
FocusAndPressLeftPointerButton(window_1, &delegate_);
ASSERT_EQ(PlatformWindowType::kWindow, window_1->type());
@@ -771,16 +755,14 @@ TEST_P(WaylandDataDragControllerTest, DestroyEnteredSurface) {
ScheduleTestTask(base::BindOnce(test, base::Unretained(this)));
RunMouseDragWithSampleData(window_.get(), DragDropTypes::DRAG_COPY);
-
- window_1->SetPointerFocus(restored_focus);
}
// Verifies that early origin surface destruction is properly handled.
// Regression test for https://crbug.com/1143707.
TEST_P(WaylandDataDragControllerTest, DestroyOriginSurface) {
auto* window_1 = window_.get();
- const bool restored_focus = window_1->has_pointer_focus();
- window_1->SetPointerFocus(false);
+ SetPointerFocusedWindow(nullptr);
+
ASSERT_EQ(PlatformWindowType::kWindow, window_1->type());
auto test = [](WaylandDataDragControllerTest* self,
@@ -821,14 +803,11 @@ TEST_P(WaylandDataDragControllerTest, DestroyOriginSurface) {
SendDndLeave();
SendDndCancelled();
Sync();
-
- window_1->SetPointerFocus(restored_focus);
}
// Ensures drag/drop events are properly propagated to non-toplevel windows.
TEST_P(WaylandDataDragControllerTest, DragToNonToplevelWindows) {
auto* origin_window = window_.get();
- const bool restored_focus = origin_window->has_pointer_focus();
FocusAndPressLeftPointerButton(origin_window, &delegate_);
auto test = [](WaylandDataDragControllerTest* self,
@@ -879,15 +858,12 @@ TEST_P(WaylandDataDragControllerTest, DragToNonToplevelWindows) {
// Request to start the drag session, which spins a nested run loop.
RunMouseDragWithSampleData(origin_window, DragDropTypes::DRAG_COPY);
-
- origin_window->SetPointerFocus(restored_focus);
}
// Ensures that requests to create a |PlatformWindowType::kPopup| during drag
// sessions return xdg_popup-backed windows.
TEST_P(WaylandDataDragControllerTest, PopupRequestCreatesPopupWindow) {
auto* origin_window = window_.get();
- const bool restored_focus = origin_window->has_pointer_focus();
FocusAndPressLeftPointerButton(origin_window, &delegate_);
std::unique_ptr<WaylandWindow> popup_window;
@@ -913,15 +889,12 @@ TEST_P(WaylandDataDragControllerTest, PopupRequestCreatesPopupWindow) {
auto* surface = GetMockSurface(popup_window->root_surface()->GetSurfaceId());
ASSERT_TRUE(surface);
EXPECT_NE(nullptr, surface->xdg_surface()->xdg_popup());
-
- origin_window->SetPointerFocus(restored_focus);
}
// Ensures that requests to create a |PlatformWindowType::kMenu| during drag
// sessions return xdg_popup-backed windows.
TEST_P(WaylandDataDragControllerTest, MenuRequestCreatesPopupWindow) {
auto* origin_window = window_.get();
- const bool restored_focus = origin_window->has_pointer_focus();
FocusAndPressLeftPointerButton(origin_window, &delegate_);
auto test = [](WaylandDataDragControllerTest* self,
@@ -947,8 +920,6 @@ TEST_P(WaylandDataDragControllerTest, MenuRequestCreatesPopupWindow) {
// Request to start the drag session, which spins a nested run loop.
RunMouseDragWithSampleData(origin_window, DragDropTypes::DRAG_COPY);
-
- origin_window->SetPointerFocus(restored_focus);
}
// Regression test for https://crbug.com/1209269.
@@ -962,7 +933,6 @@ TEST_P(WaylandDataDragControllerTest, MenuRequestCreatesPopupWindow) {
// gracefully reset state and quit drag loop as if the drag session was
// cancelled as usual.
TEST_P(WaylandDataDragControllerTest, AsyncNoopStartDrag) {
- const bool restored_focus = window_->has_pointer_focus();
OSExchangeData os_exchange_data;
os_exchange_data.SetString(sample_text_for_dnd());
@@ -1011,14 +981,10 @@ TEST_P(WaylandDataDragControllerTest, AsyncNoopStartDrag) {
Mock::VerifyAndClearExpectations(this);
EXPECT_FALSE(drag_controller()->origin_window_);
EXPECT_FALSE(drag_controller()->nested_dispatcher_);
-
- window_->SetPointerFocus(restored_focus);
}
// Regression test for https://crbug.com/1175083.
TEST_P(WaylandDataDragControllerTest, StartDragWithCorrectSerial) {
- const bool restored_focus = window_->has_pointer_focus();
-
FocusAndPressLeftPointerButton(window_.get(), &delegate_);
uint32_t mouse_press_serial = current_serial_;
@@ -1047,15 +1013,11 @@ TEST_P(WaylandDataDragControllerTest, StartDragWithCorrectSerial) {
RunMouseDragWithSampleData(window_.get(), DragDropTypes::DRAG_COPY);
Mock::VerifyAndClearExpectations(drop_handler_.get());
Mock::VerifyAndClearExpectations(this);
-
- window_->SetPointerFocus(restored_focus);
}
// Check drag session is correctly started when there are both mouse button and
// a touch point pressed.
TEST_P(WaylandDataDragControllerTest, StartDragWithCorrectSerialForDragSource) {
- const bool pointer_focus = window_->has_pointer_focus();
- const bool touch_focus = window_->has_touch_focus();
OSExchangeData os_exchange_data;
os_exchange_data.SetString(sample_text_for_dnd());
@@ -1098,10 +1060,6 @@ TEST_P(WaylandDataDragControllerTest, StartDragWithCorrectSerialForDragSource) {
EXPECT_TRUE(success);
Mock::VerifyAndClearExpectations(drop_handler_.get());
Mock::VerifyAndClearExpectations(this);
-
- // Restore window's focus state.
- window_->SetPointerFocus(pointer_focus);
- window_->set_touch_focus(touch_focus);
}
INSTANTIATE_TEST_SUITE_P(XdgVersionStableTest,
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_source.h b/chromium/ui/ozone/platform/wayland/host/wayland_data_source.h
index 0311b369cd2..ef6e5e9b8a5 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_source.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_source.h
@@ -9,6 +9,7 @@
#include <string>
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "base/notreached.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
@@ -89,9 +90,9 @@ class DataSource {
wl::Object<T> data_source_;
- ui::WaylandConnection* const connection_;
+ const raw_ptr<ui::WaylandConnection> connection_;
- Delegate* const delegate_;
+ const raw_ptr<Delegate> delegate_;
// Action selected by the compositor
uint32_t dnd_action_ = 0;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_drm.cc b/chromium/ui/ozone/platform/wayland/host/wayland_drm.cc
index 19401e812ae..12cd5656448 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_drm.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_drm.cc
@@ -11,6 +11,7 @@
#include "base/logging.h"
#include "ui/gfx/buffer_format_util.h"
#include "ui/gfx/linux/drm_util_linux.h"
+#include "ui/ozone/platform/wayland/host/wayland_buffer_factory.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
#include "ui/ozone/platform/wayland/host/wayland_drm.h"
@@ -31,7 +32,8 @@ void WaylandDrm::Instantiate(WaylandConnection* connection,
uint32_t version) {
DCHECK_EQ(interface, kInterfaceName);
- if (connection->drm_ ||
+ auto* buffer_factory = connection->wayland_buffer_factory();
+ if (buffer_factory->wayland_drm_ ||
!wl::CanBind(interface, version, kMinVersion, kMinVersion)) {
return;
}
@@ -41,7 +43,8 @@ void WaylandDrm::Instantiate(WaylandConnection* connection,
LOG(ERROR) << "Failed to bind wl_drm";
return;
}
- connection->drm_ = std::make_unique<WaylandDrm>(wl_drm.release(), connection);
+ buffer_factory->wayland_drm_ =
+ std::make_unique<WaylandDrm>(wl_drm.release(), connection);
}
WaylandDrm::WaylandDrm(wl_drm* drm, WaylandConnection* connection)
@@ -92,6 +95,12 @@ void WaylandDrm::CreateBuffer(const base::ScopedFD& fd,
std::move(callback).Run(std::move(buffer));
}
+bool WaylandDrm::CanCreateBufferImmed() const {
+ // Unlike the WaylandZwpLinuxDmabuf, the WaylandDrm always creates wl_buffers
+ // immediately.
+ return true;
+}
+
void WaylandDrm::HandleDrmFailure(const std::string& error) {
LOG(WARNING) << error;
wl_drm_.reset();
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_drm.h b/chromium/ui/ozone/platform/wayland/host/wayland_drm.h
index d292e1283d9..fcc98252555 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_drm.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_drm.h
@@ -10,6 +10,7 @@
#include <vector>
#include "base/files/scoped_file.h"
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include "ui/ozone/platform/wayland/common/wayland_util.h"
@@ -64,6 +65,9 @@ class WaylandDrm : public wl::GlobalObjectRegistrar<WaylandDrm> {
return supported_buffer_formats_;
}
+ // Says if a new buffer can be created immediately.
+ bool CanCreateBufferImmed() const;
+
private:
// Resets the |wl_drm| and prints the error.
void HandleDrmFailure(const std::string& error);
@@ -92,7 +96,7 @@ class WaylandDrm : public wl::GlobalObjectRegistrar<WaylandDrm> {
wl::Object<wl_drm> wl_drm_;
// Non-owned.
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
// Holds supported DRM formats translated to gfx::BufferFormat. Note that
// |wl_drm| neither announces modifiers nor allows to create buffers with
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_event_source.cc b/chromium/ui/ozone/platform/wayland/host/wayland_event_source.cc
index a619b69b4cb..11acbefd60d 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_event_source.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_event_source.cc
@@ -11,6 +11,7 @@
#include "base/check.h"
#include "base/containers/cxx20_erase.h"
#include "base/logging.h"
+#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "build/chromeos_buildflags.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
@@ -28,6 +29,7 @@
#include "ui/gfx/geometry/point_f.h"
#include "ui/gfx/geometry/vector2d_f.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+#include "ui/ozone/platform/wayland/host/wayland_cursor_position.h"
#include "ui/ozone/platform/wayland/host/wayland_event_watcher.h"
#include "ui/ozone/platform/wayland/host/wayland_keyboard.h"
#include "ui/ozone/platform/wayland/host/wayland_window.h"
@@ -48,11 +50,48 @@ std::vector<uint8_t> ToLittleEndianByteVector(uint32_t value) {
static_cast<uint8_t>(value >> 16), static_cast<uint8_t>(value >> 24)};
}
+EventTarget* GetRootTarget(EventTarget* target) {
+ EventTarget* parent = target->GetParentTarget();
+ return parent ? GetRootTarget(parent) : target;
+}
+
+gfx::Point GetOriginInScreen(WaylandWindow* target) {
+ // The origin for located events and positions of popup windows is the window
+ // geometry.
+ // See https://crbug.com/1292486
+ gfx::Point origin = target->GetBoundsInDIP().origin() -
+ target->GetWindowGeometryOffsetInDIP();
+ auto* parent = static_cast<WaylandWindow*>(target->GetParentTarget());
+ while (parent) {
+ origin += parent->GetBoundsInDIP().origin().OffsetFromOrigin();
+ parent = static_cast<WaylandWindow*>(parent->GetParentTarget());
+ }
+ return origin;
+}
+
+gfx::Point GetLocationInScreen(LocatedEvent* event) {
+ auto* root_window =
+ static_cast<WaylandWindow*>(GetRootTarget(event->target()));
+ return event->root_location() +
+ root_window->GetBoundsInDIP().origin().OffsetFromOrigin();
+}
+
+void SetRootLocation(LocatedEvent* event) {
+ gfx::PointF location = event->location_f();
+ auto* target = static_cast<WaylandWindow*>(event->target());
+
+ while (target->GetParentTarget()) {
+ location += target->GetBoundsInDIP().origin().OffsetFromOrigin();
+ target = static_cast<WaylandWindow*>(target->GetParentTarget());
+ }
+ event->set_root_location_f(location);
+}
+
// Number of fingers for scroll gestures.
constexpr int kGestureScrollFingerCount = 2;
-// Maximum size of the stored recent pointer frame information.
-constexpr int kRecentPointerFrameMaxSize = 20;
+// Maximum size of the latest pointer scroll data set to be stored.
+constexpr int kPointerScrollDataSetMaxSize = 20;
} // namespace
@@ -60,7 +99,7 @@ struct WaylandEventSource::TouchPoint {
TouchPoint(gfx::PointF location, WaylandWindow* current_window);
~TouchPoint() = default;
- WaylandWindow* window;
+ raw_ptr<WaylandWindow> window;
gfx::PointF last_known_location;
};
@@ -70,24 +109,39 @@ WaylandEventSource::TouchPoint::TouchPoint(gfx::PointF location,
DCHECK(window);
}
-WaylandEventSource::PointerFrame::PointerFrame() = default;
-WaylandEventSource::PointerFrame::PointerFrame(const PointerFrame&) = default;
-WaylandEventSource::PointerFrame::PointerFrame(PointerFrame&&) = default;
-WaylandEventSource::PointerFrame::~PointerFrame() = default;
+// WaylandEventSource::PointerScrollData implementation
+WaylandEventSource::PointerScrollData::PointerScrollData() = default;
+WaylandEventSource::PointerScrollData::PointerScrollData(
+ const PointerScrollData&) = default;
+WaylandEventSource::PointerScrollData::PointerScrollData(PointerScrollData&&) =
+ default;
+WaylandEventSource::PointerScrollData::~PointerScrollData() = default;
-WaylandEventSource::PointerFrame& WaylandEventSource::PointerFrame::operator=(
- const PointerFrame&) = default;
-WaylandEventSource::PointerFrame& WaylandEventSource::PointerFrame::operator=(
- PointerFrame&&) = default;
+WaylandEventSource::PointerScrollData&
+WaylandEventSource::PointerScrollData::operator=(const PointerScrollData&) =
+ default;
+WaylandEventSource::PointerScrollData&
+WaylandEventSource::PointerScrollData::operator=(PointerScrollData&&) = default;
-WaylandEventSource::TouchFrame::TouchFrame(const TouchEvent& e,
- base::OnceCallback<void()> cb)
- : event(e), completion_cb(std::move(cb)) {}
+// WaylandEventSource::FrameData implementation
+WaylandEventSource::FrameData::FrameData(const Event& e,
+ base::OnceCallback<void()> cb)
+ : event(e.Clone()), completion_cb(std::move(cb)) {}
-WaylandEventSource::TouchFrame::~TouchFrame() = default;
+WaylandEventSource::FrameData::~FrameData() = default;
// WaylandEventSource implementation
+// static
+void WaylandEventSource::ConvertEventToTarget(const EventTarget* new_target,
+ LocatedEvent* event) {
+ auto* current_target = static_cast<WaylandWindow*>(event->target());
+ gfx::Vector2d diff = GetOriginInScreen(current_target) -
+ GetOriginInScreen(static_cast<WaylandWindow*>(
+ const_cast<EventTarget*>(new_target)));
+ event->set_location_f(event->location_f() + diff);
+}
+
WaylandEventSource::WaylandEventSource(wl_display* display,
wl_event_queue* event_queue,
WaylandWindowManager* window_manager,
@@ -153,16 +207,17 @@ uint32_t WaylandEventSource::OnKeyboardKeyEvent(
int state_before_event = keyboard_modifiers_;
#endif
- if (!repeat) {
- int flag = ModifierDomKeyToEventFlag(dom_key);
- UpdateKeyboardModifiers(flag, type == ET_KEY_PRESSED);
- }
-
KeyEvent event(type, key_code, dom_code,
keyboard_modifiers_ | (repeat ? EF_IS_REPEAT : 0), dom_key,
timestamp);
event.set_source_device_id(device_id);
+ auto* focus = window_manager_->GetCurrentKeyboardFocusedWindow();
+ if (!focus)
+ return POST_DISPATCH_STOP_PROPAGATION;
+
+ Event::DispatcherApi(&event).set_target(focus);
+
Event::Properties properties;
#if BUILDFLAG(USE_GTK)
// GTK uses XKB keycodes.
@@ -192,8 +247,10 @@ uint32_t WaylandEventSource::OnKeyboardKeyEvent(
return DispatchEvent(&event);
}
-void WaylandEventSource::OnPointerFocusChanged(WaylandWindow* window,
- const gfx::PointF& location) {
+void WaylandEventSource::OnPointerFocusChanged(
+ WaylandWindow* window,
+ const gfx::PointF& location,
+ wl::EventDispatchPolicy dispatch_policy) {
bool focused = !!window;
if (focused) {
// Save new pointer location.
@@ -201,13 +258,29 @@ void WaylandEventSource::OnPointerFocusChanged(WaylandWindow* window,
window_manager_->SetPointerFocusedWindow(window);
}
- EventType type = focused ? ET_MOUSE_ENTERED : ET_MOUSE_EXITED;
- MouseEvent event(type, pointer_location_, pointer_location_,
- EventTimeForNow(), pointer_flags_, 0);
- DispatchEvent(&event);
+ auto closure = focused ? base::NullCallback()
+ : base::BindOnce(
+ [](WaylandWindowManager* wwm) {
+ wwm->SetPointerFocusedWindow(nullptr);
+ },
+ window_manager_);
+
+ auto* target = window_manager_->GetCurrentPointerFocusedWindow();
+ if (target) {
+ EventType type = focused ? ET_MOUSE_ENTERED : ET_MOUSE_EXITED;
+ MouseEvent event(type, pointer_location_, pointer_location_,
+ EventTimeForNow(), pointer_flags_, 0);
+ if (dispatch_policy == wl::EventDispatchPolicy::kImmediate) {
+ SetTargetAndDispatchEvent(&event, target);
+ } else {
+ pointer_frames_.push_back(
+ std::make_unique<FrameData>(event, std::move(closure)));
+ return;
+ }
+ }
- if (!focused)
- window_manager_->SetPointerFocusedWindow(nullptr);
+ if (!closure.is_null())
+ std::move(closure).Run();
}
void WaylandEventSource::OnPointerButtonEvent(EventType type,
@@ -230,7 +303,11 @@ void WaylandEventSource::OnPointerButtonEvent(EventType type,
MouseEvent event(type, pointer_location_, pointer_location_,
EventTimeForNow(), flags, changed_button,
PointerDetailsForDispatching());
- DispatchEvent(&event);
+
+ auto* target = window_manager_->GetCurrentPointerFocusedWindow();
+ // A window may be deleted when the event arrived from the server.
+ if (target)
+ SetTargetAndDispatchEvent(&event, target);
if (window)
window_manager_->SetPointerFocusedWindow(prev_focused_window);
@@ -242,12 +319,17 @@ void WaylandEventSource::OnPointerMotionEvent(const gfx::PointF& location) {
int flags = pointer_flags_ | keyboard_modifiers_;
MouseEvent event(ET_MOUSE_MOVED, pointer_location_, pointer_location_,
EventTimeForNow(), flags, 0, PointerDetailsForDispatching());
- DispatchEvent(&event);
+ auto* target = window_manager_->GetCurrentPointerFocusedWindow();
+
+ // A window may be deleted when the event arrived from the server.
+ if (!target)
+ return;
+ SetTargetAndDispatchEvent(&event, target);
}
void WaylandEventSource::OnPointerAxisEvent(const gfx::Vector2dF& offset) {
- current_pointer_frame_.dx += offset.x();
- current_pointer_frame_.dy += offset.y();
+ EnsurePointerScrollData().dx += offset.x();
+ EnsurePointerScrollData().dy += offset.y();
}
void WaylandEventSource::OnResetPointerFlags() {
@@ -264,74 +346,39 @@ const gfx::PointF& WaylandEventSource::GetPointerLocation() const {
void WaylandEventSource::OnPointerFrameEvent() {
base::TimeTicks now = EventTimeForNow();
- current_pointer_frame_.dt = now - last_pointer_frame_time_;
- last_pointer_frame_time_ = now;
+ if (pointer_scroll_data_) {
+ pointer_scroll_data_->dt = now - last_pointer_frame_time_;
+ ProcessPointerScrollData();
+ }
- int flags = pointer_flags_ | keyboard_modifiers_;
+ last_pointer_frame_time_ = now;
- static constexpr bool supports_trackpad_kinetic_scrolling =
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
- true;
-#else
- false;
-#endif
+ auto* target = window_manager_->GetCurrentPointerFocusedWindow();
+ if (!target)
+ return;
- // Dispatch Fling event if pointer.axis_stop is notified and the recent
- // pointer.axis events meets the criteria to start fling scroll.
- if (current_pointer_frame_.dx == 0 && current_pointer_frame_.dy == 0 &&
- current_pointer_frame_.is_axis_stop &&
- supports_trackpad_kinetic_scrolling) {
- gfx::Vector2dF initial_velocity = ComputeFlingVelocity();
- float vx = initial_velocity.x();
- float vy = initial_velocity.y();
- ScrollEvent event(
- vx == 0 && vy == 0 ? ET_SCROLL_FLING_CANCEL : ET_SCROLL_FLING_START,
- pointer_location_, pointer_location_, now, flags, vx, vy, vx, vy,
- kGestureScrollFingerCount);
- DispatchEvent(&event);
- recent_pointer_frames_.clear();
- } else if (current_pointer_frame_.axis_source) {
- if (*current_pointer_frame_.axis_source == WL_POINTER_AXIS_SOURCE_WHEEL ||
- *current_pointer_frame_.axis_source ==
- WL_POINTER_AXIS_SOURCE_WHEEL_TILT) {
- MouseWheelEvent event(
- gfx::Vector2d(current_pointer_frame_.dx, current_pointer_frame_.dy),
- pointer_location_, pointer_location_, EventTimeForNow(), flags, 0);
- DispatchEvent(&event);
- } else if (*current_pointer_frame_.axis_source ==
- WL_POINTER_AXIS_SOURCE_FINGER ||
- *current_pointer_frame_.axis_source ==
- WL_POINTER_AXIS_SOURCE_CONTINUOUS) {
- ScrollEvent event(ET_SCROLL, pointer_location_, pointer_location_,
- EventTimeForNow(), flags, current_pointer_frame_.dx,
- current_pointer_frame_.dy, current_pointer_frame_.dx,
- current_pointer_frame_.dy, kGestureScrollFingerCount);
- DispatchEvent(&event);
- }
+ while (!pointer_frames_.empty()) {
+ // It is safe to pop the first queued event for processing.
+ auto pointer_frame = std::move(pointer_frames_.front());
+ pointer_frames_.pop_front();
- if (recent_pointer_frames_.size() + 1 > kRecentPointerFrameMaxSize)
- recent_pointer_frames_.pop_back();
- recent_pointer_frames_.push_front(current_pointer_frame_);
+ SetTargetAndDispatchEvent(pointer_frame->event.get(), target);
+ if (!pointer_frame->completion_cb.is_null())
+ std::move(pointer_frame->completion_cb).Run();
}
-
- // Reset |current_pointer_frame_|.
- current_pointer_frame_.dx = 0;
- current_pointer_frame_.dy = 0;
- current_pointer_frame_.is_axis_stop = false;
- current_pointer_frame_.axis_source.reset();
}
void WaylandEventSource::OnPointerAxisSourceEvent(uint32_t axis_source) {
- current_pointer_frame_.axis_source = axis_source;
+ EnsurePointerScrollData().axis_source = axis_source;
}
void WaylandEventSource::OnPointerAxisStopEvent(uint32_t axis) {
if (axis == WL_POINTER_AXIS_VERTICAL_SCROLL) {
- current_pointer_frame_.dy = 0;
+ EnsurePointerScrollData().dy = 0;
} else if (axis == WL_POINTER_AXIS_HORIZONTAL_SCROLL) {
- current_pointer_frame_.dx = 0;
+ EnsurePointerScrollData().dx = 0;
}
- current_pointer_frame_.is_axis_stop = true;
+ EnsurePointerScrollData().is_axis_stop = true;
}
void WaylandEventSource::OnTouchPressEvent(
@@ -339,7 +386,7 @@ void WaylandEventSource::OnTouchPressEvent(
const gfx::PointF& location,
base::TimeTicks timestamp,
PointerId id,
- EventDispatchPolicy dispatch_policy) {
+ wl::EventDispatchPolicy dispatch_policy) {
DCHECK(window);
HandleTouchFocusChange(window, true);
@@ -351,18 +398,18 @@ void WaylandEventSource::OnTouchPressEvent(
return;
}
- PointerDetails details(PointerDetailsForDispatching(id));
+ PointerDetails details(EventPointerType::kTouch, id);
TouchEvent event(ET_TOUCH_PRESSED, location, location, timestamp, details,
keyboard_modifiers_);
- DCHECK_EQ(dispatch_policy, DispatchPolicy::kOnFrame);
- touch_frames_.push_front(
- std::make_unique<TouchFrame>(event, base::NullCallback()));
+ DCHECK_EQ(dispatch_policy, wl::EventDispatchPolicy::kOnFrame);
+ touch_frames_.push_back(
+ std::make_unique<FrameData>(event, base::NullCallback()));
}
void WaylandEventSource::OnTouchReleaseEvent(
base::TimeTicks timestamp,
PointerId id,
- EventDispatchPolicy dispatch_policy) {
+ wl::EventDispatchPolicy dispatch_policy) {
// Make sure this touch point was present before.
const auto it = touch_points_.find(id);
if (it == touch_points_.end()) {
@@ -376,11 +423,11 @@ void WaylandEventSource::OnTouchReleaseEvent(
TouchEvent event(ET_TOUCH_RELEASED, location, location, timestamp, details,
keyboard_modifiers_);
- if (dispatch_policy == EventDispatchPolicy::kImmediate) {
- DispatchEvent(&event);
+ if (dispatch_policy == wl::EventDispatchPolicy::kImmediate) {
+ SetTouchTargetAndDispatchTouchEvent(&event);
OnTouchReleaseInternal(id);
} else {
- touch_frames_.push_front(std::make_unique<TouchFrame>(
+ touch_frames_.push_back(std::make_unique<FrameData>(
event, base::BindOnce(&WaylandEventSource::OnTouchReleaseInternal,
base::Unretained(this), id)));
}
@@ -406,16 +453,40 @@ void WaylandEventSource::OnTouchReleaseInternal(PointerId id) {
touch_points_.erase(it);
// Clean up stylus touch tracking, if any.
- const auto stylus_it = last_touch_stylus_tool_.find(id);
- if (stylus_it != last_touch_stylus_tool_.end())
- last_touch_stylus_tool_.erase(stylus_it);
+ const auto stylus_data_it = last_touch_stylus_data_.find(id);
+ if (stylus_data_it != last_touch_stylus_data_.end())
+ last_touch_stylus_data_.erase(stylus_data_it);
+}
+
+void WaylandEventSource::SetTargetAndDispatchEvent(Event* event,
+ EventTarget* target) {
+ Event::DispatcherApi(event).set_target(target);
+ if (event->IsLocatedEvent()) {
+ SetRootLocation(event->AsLocatedEvent());
+ auto* cursor_position = connection_->wayland_cursor_position();
+ if (cursor_position) {
+ cursor_position->OnCursorPositionChanged(
+ GetLocationInScreen(event->AsLocatedEvent()));
+ }
+ }
+ DispatchEvent(event);
+}
+
+void WaylandEventSource::SetTouchTargetAndDispatchTouchEvent(
+ TouchEvent* event) {
+ auto iter = touch_points_.find(event->pointer_details().id);
+ auto target = iter != touch_points_.end() ? iter->second->window : nullptr;
+ // Skip if the touch target has alrady been removed.
+ if (!target.get())
+ return;
+ SetTargetAndDispatchEvent(event, target.get());
}
void WaylandEventSource::OnTouchMotionEvent(
const gfx::PointF& location,
base::TimeTicks timestamp,
PointerId id,
- EventDispatchPolicy dispatch_policy) {
+ wl::EventDispatchPolicy dispatch_policy) {
const auto it = touch_points_.find(id);
// Make sure this touch point was present before.
if (it == touch_points_.end()) {
@@ -423,14 +494,14 @@ void WaylandEventSource::OnTouchMotionEvent(
return;
}
it->second->last_known_location = location;
- PointerDetails details(PointerDetailsForDispatching(id));
+ PointerDetails details(EventPointerType::kTouch, id);
TouchEvent event(ET_TOUCH_MOVED, location, location, timestamp, details,
keyboard_modifiers_);
- if (dispatch_policy == DispatchPolicy::kImmediate) {
- DispatchEvent(&event);
+ if (dispatch_policy == wl::EventDispatchPolicy::kImmediate) {
+ SetTouchTargetAndDispatchTouchEvent(&event);
} else {
- touch_frames_.push_front(
- std::make_unique<TouchFrame>(event, base::NullCallback()));
+ touch_frames_.push_back(
+ std::make_unique<FrameData>(event, base::NullCallback()));
}
}
@@ -448,20 +519,31 @@ void WaylandEventSource::OnTouchCancelEvent() {
PointerId id = touch_point.first;
TouchEvent event(ET_TOUCH_CANCELLED, location, location, timestamp,
PointerDetails(EventPointerType::kTouch, id));
- DispatchEvent(&event);
+ SetTouchTargetAndDispatchTouchEvent(&event);
HandleTouchFocusChange(touch_point.second->window, false);
}
touch_points_.clear();
- last_touch_stylus_tool_.clear();
+ last_touch_stylus_data_.clear();
}
void WaylandEventSource::OnTouchFrame() {
while (!touch_frames_.empty()) {
- // It is OK/safe to pop the first queued event for processing.
+ // It is safe to pop the first queued event for processing.
auto touch_frame = std::move(touch_frames_.front());
touch_frames_.pop_front();
- DispatchEvent(&(touch_frame->event));
+ // In case there are touch stylus information, override the current 'event'
+ // instance, given that PointerDetails is 'const'.
+ auto pointer_details_with_stylus_data = AmendStylusData(
+ touch_frame->event->AsTouchEvent()->pointer_details().id);
+ if (pointer_details_with_stylus_data) {
+ auto old_event = std::move(touch_frame->event);
+ touch_frame->event = std::make_unique<TouchEvent>(
+ old_event->type(), old_event->AsTouchEvent()->location_f(),
+ old_event->AsTouchEvent()->root_location_f(), old_event->time_stamp(),
+ pointer_details_with_stylus_data.value(), old_event->flags());
+ }
+ SetTouchTargetAndDispatchTouchEvent(touch_frame->event->AsTouchEvent());
if (!touch_frame->completion_cb.is_null())
std::move(touch_frame->completion_cb).Run();
}
@@ -481,12 +563,29 @@ std::vector<PointerId> WaylandEventSource::GetActiveTouchPointIds() {
void WaylandEventSource::OnTouchStylusToolChanged(
PointerId pointer_id,
EventPointerType pointer_type) {
- last_touch_stylus_tool_[pointer_id] = pointer_type;
+ StylusData stylus_data = {.type = pointer_type,
+ .tilt = gfx::Vector2dF(),
+ .force = std::numeric_limits<float>::quiet_NaN()};
+ bool inserted =
+ last_touch_stylus_data_.try_emplace(pointer_id, stylus_data).second;
+ DCHECK(inserted);
+}
+
+void WaylandEventSource::OnTouchStylusForceChanged(PointerId pointer_id,
+ float force) {
+ DCHECK(last_touch_stylus_data_[pointer_id].has_value());
+ last_touch_stylus_data_[pointer_id]->force = force;
+}
+
+void WaylandEventSource::OnTouchStylusTiltChanged(PointerId pointer_id,
+ const gfx::Vector2dF& tilt) {
+ DCHECK(last_touch_stylus_data_[pointer_id].has_value());
+ last_touch_stylus_data_[pointer_id]->tilt = tilt;
}
const WaylandWindow* WaylandEventSource::GetTouchTarget(PointerId id) const {
const auto it = touch_points_.find(id);
- return it == touch_points_.end() ? nullptr : it->second->window;
+ return it == touch_points_.end() ? nullptr : it->second->window.get();
}
void WaylandEventSource::OnPinchEvent(EventType event_type,
@@ -503,7 +602,13 @@ void WaylandEventSource::OnPinchEvent(EventType event_type,
GestureEvent event(location.x(), location.y(), 0 /* flags */, timestamp,
details);
event.set_source_device_id(device_id);
- DispatchEvent(&event);
+
+ auto* target = window_manager_->GetCurrentPointerFocusedWindow();
+ // A window may be deleted when the event arrived from the server.
+ if (!target)
+ return;
+
+ SetTargetAndDispatchEvent(&event, target);
}
void WaylandEventSource::SetRelativePointerMotionEnabled(bool enabled) {
@@ -557,25 +662,6 @@ void WaylandEventSource::OnWindowRemoved(WaylandWindow* window) {
});
}
-// Currently EF_MOD3_DOWN means that the CapsLock key is currently down, and
-// EF_CAPS_LOCK_ON means the caps lock state is enabled (and the key may or
-// may not be down, but usually isn't). There does need to be two different
-// flags, since the physical CapsLock key is subject to remapping, but the
-// caps lock state (which can be triggered in a variety of ways) is not.
-//
-// TODO(crbug.com/1076661): This is likely caused by some CrOS-specific code.
-// Get rid of this function once it is properly guarded under OS_CHROMEOS.
-void WaylandEventSource::UpdateKeyboardModifiers(int modifier, bool down) {
- if (modifier == EF_NONE)
- return;
-
- if (modifier == EF_CAPS_LOCK_ON) {
- modifier = (modifier & ~EF_CAPS_LOCK_ON) | EF_MOD3_DOWN;
- }
- keyboard_modifiers_ = down ? (keyboard_modifiers_ | modifier)
- : (keyboard_modifiers_ & ~modifier);
-}
-
void WaylandEventSource::HandleTouchFocusChange(WaylandWindow* window,
bool focused,
absl::optional<PointerId> id) {
@@ -600,7 +686,7 @@ gfx::Vector2dF WaylandEventSource::ComputeFlingVelocity() {
base::TimeDelta dt;
float dx = 0.0f;
float dy = 0.0f;
- for (auto& frame : recent_pointer_frames_) {
+ for (auto& frame : pointer_scroll_data_set_) {
if (frame.axis_source &&
*frame.axis_source != WL_POINTER_AXIS_SOURCE_FINGER) {
break;
@@ -614,6 +700,8 @@ gfx::Vector2dF WaylandEventSource::ComputeFlingVelocity() {
dy += frame.dy;
dt += frame.dt;
}
+ pointer_scroll_data_set_.clear();
+
float dt_inv = 1.0f / dt.InSecondsF();
return dt.is_zero() ? gfx::Vector2dF()
: gfx::Vector2dF(dx * dt_inv, dy * dt_inv);
@@ -631,15 +719,83 @@ PointerDetails WaylandEventSource::PointerDetailsForDispatching() const {
return PointerDetails(*last_pointer_stylus_tool_);
}
-PointerDetails WaylandEventSource::PointerDetailsForDispatching(
+absl::optional<PointerDetails> WaylandEventSource::AmendStylusData(
PointerId pointer_id) const {
- const auto it = last_touch_stylus_tool_.find(pointer_id);
- if (it == last_touch_stylus_tool_.end() || !it->second ||
- it->second == EventPointerType::kTouch) {
- return PointerDetails(EventPointerType::kTouch, pointer_id);
+ const auto it = last_touch_stylus_data_.find(pointer_id);
+ if (it == last_touch_stylus_data_.end() || !it->second ||
+ it->second->type == EventPointerType::kTouch) {
+ return absl::nullopt;
+ }
+
+ // The values below come from the default values in pointer_details.cc|h.
+ return PointerDetails(it->second->type, pointer_id,
+ /*radius_x=*/1.0f,
+ /*radius_y=*/1.0f, it->second->force,
+ /*twist=*/0.0f, it->second->tilt.x(),
+ it->second->tilt.y());
+}
+
+WaylandEventSource::PointerScrollData&
+WaylandEventSource::EnsurePointerScrollData() {
+ if (!pointer_scroll_data_)
+ pointer_scroll_data_ = PointerScrollData();
+
+ return *pointer_scroll_data_;
+}
+
+void WaylandEventSource::ProcessPointerScrollData() {
+ DCHECK(pointer_scroll_data_);
+
+ int flags = pointer_flags_ | keyboard_modifiers_;
+
+ static constexpr bool supports_trackpad_kinetic_scrolling =
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+ true;
+#else
+ false;
+#endif
+
+ // Dispatch Fling event if pointer.axis_stop is notified and the recent
+ // pointer.axis events meets the criteria to start fling scroll.
+ if (pointer_scroll_data_->dx == 0 && pointer_scroll_data_->dy == 0 &&
+ pointer_scroll_data_->is_axis_stop &&
+ supports_trackpad_kinetic_scrolling) {
+ gfx::Vector2dF initial_velocity = ComputeFlingVelocity();
+ float vx = initial_velocity.x();
+ float vy = initial_velocity.y();
+ ScrollEvent event(
+ vx == 0 && vy == 0 ? ET_SCROLL_FLING_CANCEL : ET_SCROLL_FLING_START,
+ pointer_location_, pointer_location_, EventTimeForNow(), flags, vx, vy,
+ vx, vy, kGestureScrollFingerCount);
+ pointer_frames_.push_back(
+ std::make_unique<FrameData>(event, base::NullCallback()));
+ } else if (pointer_scroll_data_->axis_source) {
+ if (*pointer_scroll_data_->axis_source == WL_POINTER_AXIS_SOURCE_WHEEL ||
+ *pointer_scroll_data_->axis_source ==
+ WL_POINTER_AXIS_SOURCE_WHEEL_TILT) {
+ MouseWheelEvent event(
+ gfx::Vector2d(pointer_scroll_data_->dx, pointer_scroll_data_->dy),
+ pointer_location_, pointer_location_, EventTimeForNow(), flags, 0);
+ pointer_frames_.push_back(
+ std::make_unique<FrameData>(event, base::NullCallback()));
+ } else if (*pointer_scroll_data_->axis_source ==
+ WL_POINTER_AXIS_SOURCE_FINGER ||
+ *pointer_scroll_data_->axis_source ==
+ WL_POINTER_AXIS_SOURCE_CONTINUOUS) {
+ ScrollEvent event(ET_SCROLL, pointer_location_, pointer_location_,
+ EventTimeForNow(), flags, pointer_scroll_data_->dx,
+ pointer_scroll_data_->dy, pointer_scroll_data_->dx,
+ pointer_scroll_data_->dy, kGestureScrollFingerCount);
+ pointer_frames_.push_back(
+ std::make_unique<FrameData>(event, base::NullCallback()));
+ }
+
+ if (pointer_scroll_data_set_.size() + 1 > kPointerScrollDataSetMaxSize)
+ pointer_scroll_data_set_.pop_back();
+ pointer_scroll_data_set_.push_front(*pointer_scroll_data_);
}
- return PointerDetails(it->second.value(), pointer_id);
+ pointer_scroll_data_.reset();
}
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_event_source.h b/chromium/ui/ozone/platform/wayland/host/wayland_event_source.h
index 9f6f40d373b..441c150c118 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_event_source.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_event_source.h
@@ -9,6 +9,7 @@
#include <memory>
#include "base/containers/flat_map.h"
+#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/events/event.h"
@@ -32,6 +33,15 @@ namespace gfx {
class Vector2dF;
}
+namespace wl {
+
+enum class EventDispatchPolicy {
+ kImmediate,
+ kOnFrame,
+};
+
+} // namespace wl
+
namespace ui {
class WaylandConnection;
@@ -54,6 +64,9 @@ class WaylandEventSource : public PlatformEventSource,
public WaylandZwpPointerGestures::Delegate,
public WaylandZwpRelativePointerManager::Delegate {
public:
+ static void ConvertEventToTarget(const EventTarget* new_target,
+ LocatedEvent* event);
+
WaylandEventSource(wl_display* display,
wl_event_queue* event_queue,
WaylandWindowManager* window_manager,
@@ -100,7 +113,8 @@ class WaylandEventSource : public PlatformEventSource,
// WaylandPointer::Delegate
void OnPointerFocusChanged(WaylandWindow* window,
- const gfx::PointF& location) override;
+ const gfx::PointF& location,
+ wl::EventDispatchPolicy dispatch_policy) override;
void OnPointerButtonEvent(EventType evtype,
int changed_button,
WaylandWindow* window = nullptr) override;
@@ -116,19 +130,18 @@ class WaylandEventSource : public PlatformEventSource,
const WaylandWindow* GetPointerTarget() const override;
// WaylandTouch::Delegate
- using DispatchPolicy = WaylandTouch::Delegate::EventDispatchPolicy;
void OnTouchPressEvent(WaylandWindow* window,
const gfx::PointF& location,
base::TimeTicks timestamp,
PointerId id,
- EventDispatchPolicy dispatch_policy) override;
+ wl::EventDispatchPolicy dispatch_policy) override;
void OnTouchReleaseEvent(base::TimeTicks timestamp,
PointerId id,
- EventDispatchPolicy dispatch_policy) override;
+ wl::EventDispatchPolicy dispatch_policy) override;
void OnTouchMotionEvent(const gfx::PointF& location,
base::TimeTicks timestamp,
PointerId id,
- EventDispatchPolicy dispatch_policy) override;
+ wl::EventDispatchPolicy dispatch_policy) override;
void OnTouchCancelEvent() override;
void OnTouchFrame() override;
void OnTouchFocusChanged(WaylandWindow* window) override;
@@ -136,6 +149,9 @@ class WaylandEventSource : public PlatformEventSource,
const WaylandWindow* GetTouchTarget(PointerId id) const override;
void OnTouchStylusToolChanged(PointerId pointer_id,
EventPointerType pointer_type) override;
+ void OnTouchStylusForceChanged(PointerId pointer_id, float force) override;
+ void OnTouchStylusTiltChanged(PointerId pointer_id,
+ const gfx::Vector2dF& tilt) override;
// WaylandZwpPointerGesture::Delegate:
void OnPinchEvent(EventType event_type,
@@ -149,14 +165,14 @@ class WaylandEventSource : public PlatformEventSource,
void OnRelativePointerMotion(const gfx::Vector2dF& delta) override;
private:
- struct PointerFrame {
- PointerFrame();
- PointerFrame(const PointerFrame& other);
- PointerFrame(PointerFrame&&);
- ~PointerFrame();
+ struct PointerScrollData {
+ PointerScrollData();
+ PointerScrollData(const PointerScrollData& other);
+ PointerScrollData(PointerScrollData&&);
+ ~PointerScrollData();
- PointerFrame& operator=(const PointerFrame&);
- PointerFrame& operator=(PointerFrame&&);
+ PointerScrollData& operator=(const PointerScrollData&);
+ PointerScrollData& operator=(PointerScrollData&&);
absl::optional<uint32_t> axis_source;
float dx = 0.0f;
@@ -165,14 +181,13 @@ class WaylandEventSource : public PlatformEventSource,
bool is_axis_stop = false;
};
- struct TouchFrame {
- TouchFrame(const TouchEvent& event,
- base::OnceCallback<void()> completion_cb);
- TouchFrame(const TouchFrame& other) = delete;
- TouchFrame(TouchFrame&&) = delete;
- ~TouchFrame();
+ struct FrameData {
+ FrameData(const Event& event, base::OnceCallback<void()> completion_cb);
+ FrameData(const FrameData& other) = delete;
+ FrameData(FrameData&&) = delete;
+ ~FrameData();
- TouchEvent event;
+ std::unique_ptr<Event> event;
base::OnceCallback<void()> completion_cb;
};
@@ -182,7 +197,6 @@ class WaylandEventSource : public PlatformEventSource,
// WaylandWindowObserver:
void OnWindowRemoved(WaylandWindow* window) override;
- void UpdateKeyboardModifiers(int modifier, bool down);
void HandleTouchFocusChange(WaylandWindow* window,
bool focused,
absl::optional<PointerId> id = absl::nullopt);
@@ -197,14 +211,25 @@ class WaylandEventSource : public PlatformEventSource,
PointerDetails PointerDetailsForDispatching() const;
// For touch events.
- PointerDetails PointerDetailsForDispatching(PointerId pointer_id) const;
+ absl::optional<PointerDetails> AmendStylusData(PointerId pointer_id) const;
// Wrap up method to support async touch release processing.
void OnTouchReleaseInternal(PointerId id);
- WaylandWindowManager* const window_manager_;
+ // Ensure a valid instance of the PointerScrollData class member.
+ PointerScrollData& EnsurePointerScrollData();
+
+ void ProcessPointerScrollData();
+
+ // Set the target to the event, then dispatch the event.
+ void SetTargetAndDispatchEvent(Event* event, EventTarget* target);
+
+ // Find and set the target for the touch event, then dispatch the event.
+ void SetTouchTargetAndDispatchTouchEvent(TouchEvent* event);
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandWindowManager> window_manager_;
+
+ const raw_ptr<WaylandConnection> connection_;
// Bitmask of EventFlags used to keep track of the the pointer state.
int pointer_flags_ = 0;
@@ -213,6 +238,7 @@ class WaylandEventSource : public PlatformEventSource,
int last_pointer_button_pressed_ = 0;
// Bitmask of EventFlags used to keep track of the the keyboard state.
+ // See ui/events/event_constants.h for examples and details.
int keyboard_modifiers_ = 0;
// Last known pointer location.
@@ -221,8 +247,12 @@ class WaylandEventSource : public PlatformEventSource,
// Last known relative pointer location (used for pointer lock).
absl::optional<gfx::PointF> relative_pointer_location_;
- // Current frame
- PointerFrame current_pointer_frame_;
+ // Accumulates the scroll data within a pointer frame internal.
+ absl::optional<PointerScrollData> pointer_scroll_data_;
+
+ // Latest set of pointer scroll data to compute fling scroll.
+ // Front is newer, and back is older.
+ std::deque<PointerScrollData> pointer_scroll_data_set_;
// Time of the last pointer frame event.
base::TimeTicks last_pointer_frame_time_;
@@ -231,17 +261,20 @@ class WaylandEventSource : public PlatformEventSource,
absl::optional<EventPointerType> last_pointer_stylus_tool_;
// Last known touch stylus type (eg touch, pen or eraser).
- // absl::optional<PointerId, EventPointerType> last_touch_stylus_tool_;
- base::flat_map<PointerId, absl::optional<EventPointerType>>
- last_touch_stylus_tool_;
-
- // Recent pointer frames to compute fling scroll.
- // Front is newer, and back is older.
- std::deque<PointerFrame> recent_pointer_frames_;
+ struct StylusData {
+ EventPointerType type = EventPointerType::kUnknown;
+ gfx::Vector2dF tilt;
+ float force = std::numeric_limits<float>::quiet_NaN();
+ };
+ base::flat_map<PointerId, absl::optional<StylusData>> last_touch_stylus_data_;
// Order set of touch events to be dispatching on the next
// wl_touch::frame event.
- std::deque<std::unique_ptr<TouchFrame>> touch_frames_;
+ std::deque<std::unique_ptr<FrameData>> touch_frames_;
+
+ // Order set of pointer events to be dispatching on the next
+ // wl_pointer::frame event.
+ std::deque<std::unique_ptr<FrameData>> pointer_frames_;
// Map that keeps track of the current touch points, associating touch IDs to
// to the surface/location where they happened.
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_event_source_unittest.cc b/chromium/ui/ozone/platform/wayland/host/wayland_event_source_unittest.cc
index 77994d52f06..eeb38c114da 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_event_source_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_event_source_unittest.cc
@@ -4,11 +4,13 @@
#include <linux/input.h>
+#include "base/memory/raw_ptr.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
#include "ui/ozone/platform/wayland/test/mock_pointer.h"
#include "ui/ozone/platform/wayland/test/mock_surface.h"
#include "ui/ozone/platform/wayland/test/test_keyboard.h"
+#include "ui/ozone/platform/wayland/test/test_touch.h"
#include "ui/ozone/platform/wayland/test/wayland_test.h"
#include "ui/ozone/test/mock_platform_window_delegate.h"
@@ -52,7 +54,7 @@ class WaylandEventSourceTest : public WaylandTest {
return window;
}
- WaylandPointer::Delegate* pointer_delegate_ = nullptr;
+ raw_ptr<WaylandPointer::Delegate> pointer_delegate_ = nullptr;
};
// Verify WaylandEventSource properly manages its internal state as pointer
@@ -87,6 +89,7 @@ TEST_P(WaylandEventSourceTest, CheckPointerButtonHandling) {
wl_resource* pointer_res = server_.seat()->pointer()->resource();
wl_pointer_send_enter(pointer_res, serial++, surface_res, 0, 0);
+ wl_pointer_send_frame(pointer_res);
wl_pointer_send_button(pointer_res, serial++, tstamp++, BTN_LEFT,
WL_POINTER_BUTTON_STATE_PRESSED);
EXPECT_CALL(delegate, DispatchEvent(_)).Times(2);
@@ -113,6 +116,43 @@ TEST_P(WaylandEventSourceTest, CheckPointerButtonHandling) {
pointer_delegate_->IsPointerButtonPressed(EF_RIGHT_MOUSE_BUTTON));
}
+// Verify WaylandEventSource properly manages its internal state as pointer
+// button events are sent. More specifically - pointer flags.
+TEST_P(WaylandEventSourceTest, DeleteBeforeTouchFrame) {
+ MockPlatformWindowDelegate delegate;
+ wl_seat_send_capabilities(server_.seat()->resource(),
+ WL_SEAT_CAPABILITY_TOUCH);
+
+ auto window1 = CreateWaylandWindowWithParams(PlatformWindowType::kWindow,
+ kDefaultBounds, &delegate);
+ Sync();
+
+ ASSERT_TRUE(server_.seat()->touch());
+
+ uint32_t serial = 0;
+ uint32_t tstamp = 0;
+ wl_resource* surface_res =
+ server_
+ .GetObject<wl::MockSurface>(window1->root_surface()->GetSurfaceId())
+ ->resource();
+ wl_resource* touch_res = server_.seat()->touch()->resource();
+
+ wl_touch_send_down(touch_res, serial++, tstamp++, surface_res, /*id=*/0, 0,
+ 0);
+ wl_touch_send_down(touch_res, serial++, tstamp++, surface_res, /*id=*/1, 0,
+ 0);
+
+ Sync();
+
+ // Removint the target during touch event sequece should not cause crash.
+ window1.reset();
+
+ wl_touch_send_frame(touch_res);
+ EXPECT_CALL(delegate, DispatchEvent(_)).Times(0);
+
+ Sync();
+}
+
INSTANTIATE_TEST_SUITE_P(XdgVersionStableTest,
WaylandEventSourceTest,
Values(wl::ServerConfig{
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_event_watcher.h b/chromium/ui/ozone/platform/wayland/host/wayland_event_watcher.h
index 9b06d48c52c..d8e10d15c2e 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_event_watcher.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_event_watcher.h
@@ -6,6 +6,7 @@
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_EVENT_WATCHER_H_
#include "base/callback.h"
+#include "base/memory/raw_ptr.h"
#include "base/message_loop/message_pump_for_ui.h"
struct wl_display;
@@ -81,8 +82,8 @@ class WaylandEventWatcher {
// and false is returned.
void WlDisplayCheckForErrors();
- wl_display* const display_; // Owned by WaylandConnection.
- wl_event_queue* const event_queue_; // Owned by WaylandConnection.
+ const raw_ptr<wl_display> display_; // Owned by WaylandConnection.
+ const raw_ptr<wl_event_queue> event_queue_; // Owned by WaylandConnection.
bool watching_ = false;
bool prepared_ = false;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_event_watcher_glib.cc b/chromium/ui/ozone/platform/wayland/host/wayland_event_watcher_glib.cc
index 25cca1df5c4..be78e0b3f2e 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_event_watcher_glib.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_event_watcher_glib.cc
@@ -6,6 +6,8 @@
#include <glib.h>
+#include "base/memory/raw_ptr.h"
+
namespace ui {
namespace {
@@ -13,8 +15,8 @@ namespace {
struct GLibWaylandSource : public GSource {
// Note: The GLibWaylandSource is created and destroyed by GLib. So its
// constructor/destructor may or may not get called.
- WaylandEventWatcherGlib* event_watcher;
- GPollFD* poll_fd;
+ raw_ptr<WaylandEventWatcherGlib> event_watcher;
+ raw_ptr<GPollFD> poll_fd;
};
gboolean WatchSourcePrepare(GSource* source, gint* timeout_ms) {
@@ -22,7 +24,7 @@ gboolean WatchSourcePrepare(GSource* source, gint* timeout_ms) {
*timeout_ms = -1;
auto* event_watcher_glib =
- static_cast<GLibWaylandSource*>(source)->event_watcher;
+ static_cast<GLibWaylandSource*>(source)->event_watcher.get();
if (event_watcher_glib->HandlePrepare())
return FALSE;
@@ -41,7 +43,7 @@ gboolean WatchSourceDispatch(GSource* source,
GSourceFunc unused_func,
gpointer data) {
auto* event_watcher_glib =
- static_cast<GLibWaylandSource*>(source)->event_watcher;
+ static_cast<GLibWaylandSource*>(source)->event_watcher.get();
event_watcher_glib->HandleDispatch();
return TRUE;
}
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_event_watcher_glib.h b/chromium/ui/ozone/platform/wayland/host/wayland_event_watcher_glib.h
index 2efcc923de9..716bff97c7e 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_event_watcher_glib.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_event_watcher_glib.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_EVENT_WATCHER_GLIB_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_EVENT_WATCHER_GLIB_H_
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/host/wayland_event_watcher.h"
using GPollFD = struct _GPollFD;
@@ -37,7 +38,7 @@ class WaylandEventWatcherGlib : public WaylandEventWatcher {
bool started_ = false;
// The GLib event source for Wayland events.
- GSource* wayland_source_ = nullptr;
+ raw_ptr<GSource> wayland_source_ = nullptr;
// The poll attached to |wayland_source_|.
std::unique_ptr<GPollFD> wayland_poll_;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_exchange_data_provider_unittest.cc b/chromium/ui/ozone/platform/wayland/host/wayland_exchange_data_provider_unittest.cc
index a852290685e..7ab699d99c2 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_exchange_data_provider_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_exchange_data_provider_unittest.cc
@@ -66,7 +66,7 @@ TEST(WaylandExchangeDataProviderTest, ExtractPickledData) {
#if BUILDFLAG(IS_CHROMEOS_LACROS)
TEST(WaylandExchangeDataProviderTest, AddAndExtractDataTransferEndpoint) {
std::string kExpectedEncodedDte =
- R"({"endpoint_type":"url","url":"https://www.google.com/","url_origin":"https://www.google.com"})";
+ R"({"endpoint_type":"url","url":"https://www.google.com/"})";
const DataTransferEndpoint expected_dte =
ui::DataTransferEndpoint(GURL("https://www.google.com"));
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_frame_manager.cc b/chromium/ui/ozone/platform/wayland/host/wayland_frame_manager.cc
index a120c6ff1ad..edf3880df58 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_frame_manager.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_frame_manager.cc
@@ -10,6 +10,7 @@
#include "base/containers/adapters.h"
#include "ui/gfx/geometry/rect_conversions.h"
#include "ui/gfx/geometry/size_conversions.h"
+#include "ui/ozone/platform/wayland/host/wayland_buffer_factory.h"
#include "ui/ozone/platform/wayland/host/wayland_buffer_handle.h"
#include "ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
@@ -79,25 +80,24 @@ WaylandFrameManager::~WaylandFrameManager() {
void WaylandFrameManager::RecordFrame(std::unique_ptr<WaylandFrame> frame) {
DCHECK_LE(pending_frames_.size(), 6u);
- // Request for buffer handle creation at record time.
- for (auto& subsurface_to_overlay : frame->subsurfaces_to_overlays) {
- if (subsurface_to_overlay.second.buffer_id) {
- auto* handle = connection_->buffer_manager_host()->EnsureBufferHandle(
- subsurface_to_overlay.first->wayland_surface(),
- subsurface_to_overlay.second.buffer_id);
- if (!handle)
- return;
- }
- }
- if (frame->root_config.buffer_id) {
- auto* handle = connection_->buffer_manager_host()->EnsureBufferHandle(
- frame->root_surface, frame->root_config.buffer_id);
- if (!handle)
- return;
+ bool buffer_pending_creation = false;
+ // The |frame| may have buffers to be sent for submission, which might not
+ // have been created yet. This must be done now if they cannot be created
+ // immediately. Thus, dispatch this request so that buffers are created by the
+ // time this frame is played back if |pending_frames_| is not empty.
+ // Otherwise, there is no point to ensure wl_buffers exist as
+ // MaybeProcessPendingFrame will do that as well.
+ if (!connection_->wayland_buffer_factory()->CanCreateDmabufImmed() &&
+ !pending_frames_.empty()) {
+ buffer_pending_creation =
+ EnsureWlBuffersExist(*frame) && !frame->buffer_lost;
}
pending_frames_.push_back(std::move(frame));
- MaybeProcessPendingFrame();
+ // There are wl_buffers missing, need to wait. MaybeProcessPendingFrame will
+ // be called as soon as buffers are created.
+ if (!buffer_pending_creation)
+ MaybeProcessPendingFrame();
}
void WaylandFrameManager::MaybeProcessPendingFrame() {
@@ -109,53 +109,54 @@ void WaylandFrameManager::MaybeProcessPendingFrame() {
if (!frame)
return;
- // Ensure wl_buffer existence.
- WaylandBufferHandle* handle_pending_creation = nullptr;
- for (auto& subsurface_to_overlay : frame->subsurfaces_to_overlays) {
- if (subsurface_to_overlay.second.buffer_id) {
- auto* handle = connection_->buffer_manager_host()->EnsureBufferHandle(
- subsurface_to_overlay.first->wayland_surface(),
- subsurface_to_overlay.second.buffer_id);
- // Buffer is gone while this frame is pending, remove this config.
- if (!handle) {
- frame->buffer_lost = true;
- subsurface_to_overlay.second = wl::WaylandOverlayConfig();
- } else if (!handle->wl_buffer() && !handle_pending_creation) {
- // Found the first not-ready buffer, let handle invoke
- // MaybeProcessPendingFrame() when wl_buffer is created.
- handle_pending_creation = handle;
- }
- }
- }
- if (frame->root_config.buffer_id) {
- auto* handle = connection_->buffer_manager_host()->EnsureBufferHandle(
- frame->root_surface, frame->root_config.buffer_id);
- if (!handle) {
- frame->buffer_lost = true;
- frame->root_config = wl::WaylandOverlayConfig();
- } else if (!handle->wl_buffer() && !handle_pending_creation) {
- handle_pending_creation = handle;
- }
- }
-
- // There are wl_buffers missing, need to wait.
- if (handle_pending_creation) {
- handle_pending_creation->set_buffer_created_callback(
- base::BindOnce(&WaylandFrameManager::MaybeProcessPendingFrame,
- weak_factory_.GetWeakPtr()));
- return;
- }
// Frame callback hasn't been acked, need to wait.
if (!submitted_frames_.empty() &&
submitted_frames_.back()->wl_frame_callback) {
return;
}
- // Window is not configured, need to wait.
- if (!window_->can_submit_frames())
+
+ // Window is still neither configured nor has pending configure bounds, need
+ // to wait. Probably happens only in early stages of window initialization.
+ if (!window_->received_configure_event())
return;
- std::unique_ptr<WaylandFrame> playback = std::move(pending_frames_.front());
- PlayBackFrame(std::move(playback));
+ // Ensure wl_buffer existence. This is called for the first time in the
+ // following cases:
+ // 1) if it is possible to create buffers immediately to ensure
+ // WaylandBufferHandles are not lost and to create wl_buffers if they have not
+ // existed yet (a new buffer is submitted).
+ // 2) or |pending_frames| was empty when RecordFrame for this |frame| was
+ // called regardless whether it is possible to create wl_buffers immediately
+ // or not.
+ const bool has_buffer_pending_creation = EnsureWlBuffersExist(*frame);
+ // There are wl_buffers missing, need to wait.
+ if (has_buffer_pending_creation && !frame->buffer_lost) {
+ DLOG_IF(FATAL,
+ has_buffer_pending_creation &&
+ connection_->wayland_buffer_factory()->CanCreateDmabufImmed())
+ << "Buffers should have been created immediately.";
+ return;
+ }
+
+ // If processing a valid frame, update window's visual size, which may result
+ // in surface configuration being done, i.e: xdg_surface set_window_geometry +
+ // ack_configure requests being issued.
+ const wl::WaylandOverlayConfig& config = frame->root_config;
+ if (!frame->buffer_lost && !!config.buffer_id) {
+ window_->UpdateVisualSize(gfx::ToRoundedSize(config.bounds_rect.size()));
+ }
+
+ // Skip this frame if:
+ // 1. It can't be submitted due to lost buffers.
+ // 2. Even after updating visual size above, |window_| is still not fully
+ // configured, which might mean that the current frame sent by the gpu
+ // is still out-of-sync with the pending configure sequences received from
+ // the Wayland compositor. This avoids protocol errors as observed in
+ // https://crbug.com/1313023.
+ if (frame->buffer_lost || !window_->IsSurfaceConfigured())
+ DiscardFrame(std::move(pending_frames_.front()));
+ else
+ PlayBackFrame(std::move(pending_frames_.front()));
pending_frames_.pop_front();
@@ -169,25 +170,13 @@ void WaylandFrameManager::MaybeProcessPendingFrame() {
}
void WaylandFrameManager::PlayBackFrame(std::unique_ptr<WaylandFrame> frame) {
- // Skip this frame if we can't playback this frame due to lost buffers.
- if (frame->buffer_lost) {
- frame->feedback = gfx::PresentationFeedback::Failure();
- submitted_frames_.push_back(std::move(frame));
- VerifyNumberOfSubmittedFrames();
- MaybeProcessSubmittedFrames();
- return;
- }
+ DCHECK(!frame->buffer_lost);
+ DCHECK(window_->IsSurfaceConfigured());
- auto* root_surface = frame->root_surface;
+ auto* root_surface = frame->root_surface.get();
auto& root_config = frame->root_config;
bool empty_frame = !root_config.buffer_id;
- if (!empty_frame) {
- window_->UpdateVisualSize(
- gfx::ToRoundedSize(root_config.bounds_rect.size()),
- root_config.surface_scale_factor);
- }
-
// Configure subsurfaces. Traverse the deque backwards s.t. we can set
// frame_callback and presentation_feedback on the top-most possible surface.
WaylandSubsurface* reference_above = nullptr;
@@ -246,6 +235,13 @@ void WaylandFrameManager::PlayBackFrame(std::unique_ptr<WaylandFrame> frame) {
MaybeProcessSubmittedFrames();
}
+void WaylandFrameManager::DiscardFrame(std::unique_ptr<WaylandFrame> frame) {
+ frame->feedback = gfx::PresentationFeedback::Failure();
+ submitted_frames_.push_back(std::move(frame));
+ VerifyNumberOfSubmittedFrames();
+ MaybeProcessSubmittedFrames();
+}
+
void WaylandFrameManager::ApplySurfaceConfigure(
WaylandFrame* frame,
WaylandSurface* surface,
@@ -441,6 +437,49 @@ void WaylandFrameManager::VerifyNumberOfSubmittedFrames() {
}
}
+bool WaylandFrameManager::EnsureWlBuffersExist(WaylandFrame& frame) {
+ WaylandBufferHandle* handle_pending_creation = nullptr;
+ for (auto& subsurface_to_overlay : frame.subsurfaces_to_overlays) {
+ if (subsurface_to_overlay.second.buffer_id) {
+ auto* handle = connection_->buffer_manager_host()->EnsureBufferHandle(
+ subsurface_to_overlay.first->wayland_surface(),
+ subsurface_to_overlay.second.buffer_id);
+ // Buffer is gone while this frame is pending, remove this config.
+ if (!handle) {
+ frame.buffer_lost = true;
+ subsurface_to_overlay.second = wl::WaylandOverlayConfig();
+ } else if (!handle->wl_buffer() && !handle_pending_creation) {
+ // Found the first not-ready buffer, let handle invoke
+ // MaybeProcessPendingFrame() when wl_buffer is created.
+ handle_pending_creation = handle;
+ }
+ }
+ }
+ if (frame.root_config.buffer_id) {
+ auto* handle = connection_->buffer_manager_host()->EnsureBufferHandle(
+ frame.root_surface, frame.root_config.buffer_id);
+ if (!handle) {
+ frame.buffer_lost = true;
+ frame.root_config = wl::WaylandOverlayConfig();
+ } else if (!handle->wl_buffer() && !handle_pending_creation) {
+ handle_pending_creation = handle;
+ }
+ }
+
+ // Some buffers might have been lost. No need to wait.
+ if (frame.buffer_lost)
+ handle_pending_creation = nullptr;
+
+ // There are wl_buffers missing, schedule MaybeProcessPendingFrame so that
+ // it's called when buffers are created.
+ if (handle_pending_creation) {
+ handle_pending_creation->set_buffer_created_callback(
+ base::BindOnce(&WaylandFrameManager::MaybeProcessPendingFrame,
+ weak_factory_.GetWeakPtr()));
+ }
+ return !!handle_pending_creation;
+}
+
void WaylandFrameManager::OnExplicitBufferRelease(WaylandSurface* surface,
struct wl_buffer* wl_buffer,
base::ScopedFD fence) {
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_frame_manager.h b/chromium/ui/ozone/platform/wayland/host/wayland_frame_manager.h
index 1780de0fea0..2fcace1757a 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_frame_manager.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_frame_manager.h
@@ -12,6 +12,7 @@
#include "base/containers/circular_deque.h"
#include "base/containers/flat_map.h"
#include "base/files/scoped_file.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "ui/gfx/gpu_fence_handle.h"
#include "ui/gfx/presentation_feedback.h"
@@ -56,7 +57,7 @@ struct WaylandFrame {
friend class WaylandFrameManager;
uint32_t frame_id;
- WaylandSurface* root_surface;
+ raw_ptr<WaylandSurface> root_surface;
wl::WaylandOverlayConfig root_config;
base::circular_deque<std::pair<WaylandSubsurface*, wl::WaylandOverlayConfig>>
subsurfaces_to_overlays;
@@ -121,6 +122,8 @@ class WaylandFrameManager {
private:
void PlayBackFrame(std::unique_ptr<WaylandFrame> frame);
+ void DiscardFrame(std::unique_ptr<WaylandFrame> frame);
+
// Configures |surface| but does not commit wl_surface states yet.
void ApplySurfaceConfigure(WaylandFrame* frame,
WaylandSurface* surface,
@@ -168,7 +171,14 @@ class WaylandFrameManager {
// feedbacks if the number is too big.
void VerifyNumberOfSubmittedFrames();
- WaylandWindow* const window_;
+ // Verifies wl_buffers for the given |frame| exist. If they do not yet exist,
+ // a callback to |MaybeProcessPendingFrame| is set and false is returned.
+ // If the frame contains a buffer id for an invalid WaylandBufferHandle, the
+ // |frame::buffer_lost| is set and false is returned. That means that the
+ // frame must not be used for the further submission.
+ bool EnsureWlBuffersExist(WaylandFrame& frame);
+
+ const raw_ptr<WaylandWindow> window_;
// When RecordFrame() is called, a Frame is pushed to |pending_frames_|. See
// RecordFrame().
@@ -179,7 +189,7 @@ class WaylandFrameManager {
base::circular_deque<std::unique_ptr<WaylandFrame>> submitted_frames_;
// Non-owned pointer to the main connection.
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
base::WeakPtrFactory<WaylandFrameManager> weak_factory_;
};
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_input_controller.cc b/chromium/ui/ozone/platform/wayland/host/wayland_input_controller.cc
index 87c79997a44..d320c7d4a4e 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_input_controller.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_input_controller.cc
@@ -4,6 +4,7 @@
#include "ui/ozone/platform/wayland/host/wayland_input_controller.h"
+#include "base/memory/raw_ptr.h"
#include "ui/events/devices/haptic_touchpad_effects.h"
#include "ui/events/devices/stylus_state.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
@@ -112,7 +113,7 @@ class WaylandInputController : public InputController {
}
private:
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
};
} // namespace
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.cc b/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.cc
index 54c4c61800e..778dfc036bb 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.cc
@@ -39,7 +39,7 @@
#if BUILDFLAG(IS_CHROMEOS_LACROS)
#include "base/check.h"
#include "chromeos/crosapi/mojom/crosapi.mojom.h"
-#include "chromeos/startup/browser_init_params.h"
+#include "chromeos/startup/browser_params_proxy.h"
#endif
namespace ui {
@@ -75,10 +75,10 @@ bool IsImeEnabled() {
// Lacros-chrome side, which helps us on releasing.
// TODO(crbug.com/1159237): In the future, we may want to unify the behavior
// of ozone/wayland across platforms.
- const crosapi::mojom::BrowserInitParams* init_params =
- chromeos::BrowserInitParams::Get();
- if (init_params && init_params->exo_ime_support !=
- crosapi::mojom::ExoImeSupport::kUnsupported) {
+ const chromeos::BrowserParamsProxy* init_params =
+ chromeos::BrowserParamsProxy::Get();
+ if (init_params->ExoImeSupport() !=
+ crosapi::mojom::ExoImeSupport::kUnsupported) {
return true;
}
#endif
@@ -122,12 +122,10 @@ ConvertStyle(uint32_t style) {
WaylandInputMethodContext::WaylandInputMethodContext(
WaylandConnection* connection,
WaylandKeyboard::Delegate* key_delegate,
- LinuxInputMethodContextDelegate* ime_delegate,
- bool is_simple)
+ LinuxInputMethodContextDelegate* ime_delegate)
: connection_(connection),
key_delegate_(key_delegate),
ime_delegate_(ime_delegate),
- is_simple_(is_simple),
text_input_(nullptr) {
connection_->wayland_window_manager()->AddObserver(this);
Init();
@@ -135,8 +133,8 @@ WaylandInputMethodContext::WaylandInputMethodContext(
WaylandInputMethodContext::~WaylandInputMethodContext() {
if (text_input_) {
+ DismissVirtualKeyboard();
text_input_->Deactivate();
- text_input_->HideInputPanel();
}
connection_->wayland_window_manager()->RemoveObserver(this);
}
@@ -147,7 +145,7 @@ void WaylandInputMethodContext::Init(bool initialize_for_testing) {
// If text input instance is not created then all ime context operations
// are noop. This option is because in some environments someone might not
// want to enable ime/virtual keyboard even if it's available.
- if (use_ozone_wayland_vkb && !is_simple_ && !text_input_ &&
+ if (use_ozone_wayland_vkb && !text_input_ &&
connection_->text_input_manager_v1()) {
text_input_ = std::make_unique<ZWPTextInputWrapperV1>(
connection_, this, connection_->text_input_manager_v1(),
@@ -209,32 +207,24 @@ void WaylandInputMethodContext::Reset() {
void WaylandInputMethodContext::UpdateFocus(bool has_client,
TextInputType old_type,
TextInputType new_type) {
- // TODO(b/226781965): Known issue that this does not work.
- if (is_simple_) {
- // simple context can be used in any textfield, including password box, and
- // even if the focused text input client's text input type is
- // ui::TEXT_INPUT_TYPE_NONE.
- if (has_client)
- Focus();
- else
- Blur();
- } else {
- // Otherwise We only focus when the focus is in a textfield.
- if (old_type != TEXT_INPUT_TYPE_NONE)
- Blur();
- if (new_type != TEXT_INPUT_TYPE_NONE)
- Focus();
- }
+ // This prevents unnecessarily hiding/showing the virtual keyboard.
+ bool skip_vk_update =
+ old_type != TEXT_INPUT_TYPE_NONE && new_type != TEXT_INPUT_TYPE_NONE;
+
+ if (old_type != TEXT_INPUT_TYPE_NONE)
+ Blur(skip_vk_update);
+ if (new_type != TEXT_INPUT_TYPE_NONE)
+ Focus(skip_vk_update);
}
-void WaylandInputMethodContext::Focus() {
+void WaylandInputMethodContext::Focus(bool skip_virtual_keyboard_update) {
focused_ = true;
- MaybeUpdateActivated();
+ MaybeUpdateActivated(skip_virtual_keyboard_update);
}
-void WaylandInputMethodContext::Blur() {
+void WaylandInputMethodContext::Blur(bool skip_virtual_keyboard_update) {
focused_ = false;
- MaybeUpdateActivated();
+ MaybeUpdateActivated(skip_virtual_keyboard_update);
}
void WaylandInputMethodContext::SetCursorLocation(const gfx::Rect& rect) {
@@ -347,6 +337,21 @@ void WaylandInputMethodContext::SetContentType(TextInputType type,
text_input_->SetContentType(type, mode, flags, should_do_learning);
}
+void WaylandInputMethodContext::SetGrammarFragmentAtCursor(
+ const GrammarFragment& fragment) {
+ if (!text_input_)
+ return;
+ text_input_->SetGrammarFragmentAtCursor(fragment);
+}
+
+void WaylandInputMethodContext::SetAutocorrectInfo(
+ const gfx::Range& autocorrect_range,
+ const gfx::Rect& autocorrect_bounds) {
+ if (!text_input_)
+ return;
+ text_input_->SetAutocorrectInfo(autocorrect_range, autocorrect_bounds);
+}
+
VirtualKeyboardController*
WaylandInputMethodContext::GetVirtualKeyboardController() {
if (!text_input_)
@@ -421,9 +426,39 @@ void WaylandInputMethodContext::OnPreeditString(
}
void WaylandInputMethodContext::OnCommitString(base::StringPiece text) {
+ if (pending_keep_selection_) {
+ ime_delegate_->OnConfirmCompositionText(true);
+ pending_keep_selection_ = false;
+ return;
+ }
ime_delegate_->OnCommit(base::UTF8ToUTF16(text));
}
+void WaylandInputMethodContext::OnCursorPosition(int32_t index,
+ int32_t anchor) {
+ if (surrounding_text_.empty()) {
+ LOG(ERROR) << "SetSurroundingText should run before OnCursorPosition.";
+ return;
+ }
+
+ if (index < 0 || static_cast<uint32_t>(index) > surrounding_text_.size()) {
+ LOG(ERROR) << "Invalid index is specified.";
+ return;
+ }
+ if (anchor < 0 || static_cast<uint32_t>(anchor) > surrounding_text_.size()) {
+ LOG(ERROR) << "Invalid anchor is specified.";
+ return;
+ }
+
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+ if (selection_range_utf8_ == gfx::Range(index, anchor)) {
+ pending_keep_selection_ = true;
+ } else {
+ NOTIMPLEMENTED_LOG_ONCE();
+ }
+#endif
+}
+
void WaylandInputMethodContext::OnDeleteSurroundingText(int32_t index,
uint32_t length) {
// |index| and |length| are expected to be in UTF8 form, so we convert these
@@ -576,6 +611,33 @@ void WaylandInputMethodContext::OnSetPreeditRegion(
ime_text_spans);
}
+void WaylandInputMethodContext::OnClearGrammarFragments(
+ const gfx::Range& range) {
+ std::vector<size_t> offsets = {range.start(), range.end()};
+ base::UTF8ToUTF16AndAdjustOffsets(surrounding_text_, &offsets);
+ ime_delegate_->OnClearGrammarFragments(gfx::Range(
+ static_cast<uint32_t>(offsets[0]), static_cast<uint32_t>(offsets[1])));
+}
+
+void WaylandInputMethodContext::OnAddGrammarFragment(
+ const GrammarFragment& fragment) {
+ std::vector<size_t> offsets = {fragment.range.start(), fragment.range.end()};
+ base::UTF8ToUTF16AndAdjustOffsets(surrounding_text_, &offsets);
+ ime_delegate_->OnAddGrammarFragment(
+ {GrammarFragment(gfx::Range(static_cast<uint32_t>(offsets[0]),
+ static_cast<uint32_t>(offsets[1])),
+ fragment.suggestion)});
+}
+
+void WaylandInputMethodContext::OnSetAutocorrectRange(const gfx::Range& range) {
+ ime_delegate_->OnSetAutocorrectRange(range);
+}
+
+void WaylandInputMethodContext::OnSetVirtualKeyboardOccludedBounds(
+ const gfx::Rect& screen_bounds) {
+ ime_delegate_->OnSetVirtualKeyboardOccludedBounds(screen_bounds);
+}
+
void WaylandInputMethodContext::OnInputPanelState(uint32_t state) {
virtual_keyboard_visible_ = (state & 1) != 0;
// Note: Currently there's no support of VirtualKeyboardControllerObserver.
@@ -590,10 +652,11 @@ void WaylandInputMethodContext::OnModifiersMap(
}
void WaylandInputMethodContext::OnKeyboardFocusedWindowChanged() {
- MaybeUpdateActivated();
+ MaybeUpdateActivated(false);
}
-void WaylandInputMethodContext::MaybeUpdateActivated() {
+void WaylandInputMethodContext::MaybeUpdateActivated(
+ bool skip_virtual_keyboard_update) {
if (!text_input_)
return;
@@ -613,10 +676,12 @@ void WaylandInputMethodContext::MaybeUpdateActivated() {
activated_ = activated;
if (activated) {
text_input_->Activate(window);
- text_input_->ShowInputPanel();
+ if (!skip_virtual_keyboard_update)
+ DisplayVirtualKeyboard();
} else {
+ if (!skip_virtual_keyboard_update)
+ DismissVirtualKeyboard();
text_input_->Deactivate();
- text_input_->HideInputPanel();
}
}
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.h b/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.h
index e1954530f0d..24d0a57027e 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.h
@@ -8,6 +8,7 @@
#include <memory>
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "base/strings/string_piece.h"
#include "ui/base/ime/character_composer.h"
#include "ui/base/ime/linux/linux_input_method_context.h"
@@ -31,8 +32,7 @@ class WaylandInputMethodContext : public LinuxInputMethodContext,
WaylandInputMethodContext(WaylandConnection* connection,
WaylandKeyboard::Delegate* key_delegate,
- LinuxInputMethodContextDelegate* ime_delegate,
- bool is_simple);
+ LinuxInputMethodContextDelegate* ime_delegate);
WaylandInputMethodContext(const WaylandInputMethodContext&) = delete;
WaylandInputMethodContext& operator=(const WaylandInputMethodContext&) =
delete;
@@ -55,6 +55,9 @@ class WaylandInputMethodContext : public LinuxInputMethodContext,
void UpdateFocus(bool has_client,
TextInputType old_type,
TextInputType new_type) override;
+ void SetGrammarFragmentAtCursor(const GrammarFragment& fragment) override;
+ void SetAutocorrectInfo(const gfx::Range& autocorrect_range,
+ const gfx::Rect& autocorrect_bounds) override;
void Reset() override;
VirtualKeyboardController* GetVirtualKeyboardController() override;
@@ -73,28 +76,38 @@ class WaylandInputMethodContext : public LinuxInputMethodContext,
const std::vector<SpanStyle>& spans,
int32_t preedit_cursor) override;
void OnCommitString(base::StringPiece text) override;
+ void OnCursorPosition(int32_t index, int32_t anchor) override;
void OnDeleteSurroundingText(int32_t index, uint32_t length) override;
void OnKeysym(uint32_t keysym, uint32_t state, uint32_t modifiers) override;
void OnSetPreeditRegion(int32_t index,
uint32_t length,
const std::vector<SpanStyle>& spans) override;
+ void OnClearGrammarFragments(const gfx::Range& range) override;
+ void OnAddGrammarFragment(const GrammarFragment& fragment) override;
+ void OnSetAutocorrectRange(const gfx::Range& range) override;
+ void OnSetVirtualKeyboardOccludedBounds(
+ const gfx::Rect& screen_bounds) override;
void OnInputPanelState(uint32_t state) override;
void OnModifiersMap(std::vector<std::string> modifiers_map) override;
private:
- void Focus();
- void Blur();
+ void Focus(bool skip_virtual_keyboard_update);
+ void Blur(bool skip_virtual_keyboard_update);
void UpdatePreeditText(const std::u16string& preedit_text);
- void MaybeUpdateActivated();
+ // If |skip_virtual_keyboard_update| is true, no virtual keyboard show/hide
+ // requests will be sent. This is used to prevent flickering the virtual
+ // keyboard when it would be immediately reshown anyway, e.g. when changing
+ // focus from one text input to another.
+ void MaybeUpdateActivated(bool skip_virtual_keyboard_update);
- WaylandConnection* const connection_; // TODO(jani) Handle this better
+ const raw_ptr<WaylandConnection>
+ connection_; // TODO(jani) Handle this better
// Delegate key events to be injected into PlatformEvent system.
- WaylandKeyboard::Delegate* const key_delegate_;
+ const raw_ptr<WaylandKeyboard::Delegate> key_delegate_;
// Delegate IME-specific events to be handled by //ui code.
- LinuxInputMethodContextDelegate* const ime_delegate_;
- bool is_simple_;
+ const raw_ptr<LinuxInputMethodContextDelegate> ime_delegate_;
std::unique_ptr<ZWPTextInputWrapper> text_input_;
@@ -117,6 +130,12 @@ class WaylandInputMethodContext : public LinuxInputMethodContext,
// The selection range in UTF-8 offsets in the |surrounding_text_|.
gfx::Range selection_range_utf8_ = gfx::Range::InvalidRange();
+ // Whether the next CommitString should be treated as part of a
+ // ConfirmCompositionText operation which keeps the current selection. This
+ // allows ConfirmCompositionText to be implemented as an atomic operation
+ // using CursorPosition and CommitString.
+ bool pending_keep_selection_ = false;
+
// Caches VirtualKeyboard visibility.
bool virtual_keyboard_visible_ = false;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context_factory.cc b/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context_factory.cc
deleted file mode 100644
index d95b8430974..00000000000
--- a/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context_factory.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/ozone/platform/wayland/host/wayland_input_method_context_factory.h"
-
-#include <memory>
-
-#include "base/bind.h"
-#include "ui/ozone/platform/wayland/host/wayland_connection.h"
-#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
-#include "ui/ozone/platform/wayland/host/wayland_input_method_context.h"
-
-namespace ui {
-
-WaylandInputMethodContextFactory::WaylandInputMethodContextFactory(
- WaylandConnection* connection)
- : connection_(connection) {
- DCHECK(connection_);
-}
-
-WaylandInputMethodContextFactory::~WaylandInputMethodContextFactory() = default;
-
-std::unique_ptr<LinuxInputMethodContext>
-WaylandInputMethodContextFactory::CreateInputMethodContext(
- LinuxInputMethodContextDelegate* delegate,
- bool is_simple) const {
- return CreateWaylandInputMethodContext(delegate, is_simple);
-}
-
-std::unique_ptr<WaylandInputMethodContext>
-WaylandInputMethodContextFactory::CreateWaylandInputMethodContext(
- LinuxInputMethodContextDelegate* delegate,
- bool is_simple) const {
- return std::make_unique<WaylandInputMethodContext>(
- connection_, connection_->event_source(), delegate, is_simple);
-}
-
-} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context_factory.h b/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context_factory.h
deleted file mode 100644
index f34ac04f96a..00000000000
--- a/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context_factory.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_INPUT_METHOD_CONTEXT_FACTORY_H_
-#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_INPUT_METHOD_CONTEXT_FACTORY_H_
-
-#include <memory>
-
-#include "ui/base/ime/linux/linux_input_method_context_factory.h"
-
-namespace ui {
-
-class WaylandConnection;
-class WaylandInputMethodContext;
-
-class WaylandInputMethodContextFactory : public LinuxInputMethodContextFactory {
- public:
- explicit WaylandInputMethodContextFactory(WaylandConnection* connection);
-
- WaylandInputMethodContextFactory(const WaylandInputMethodContextFactory&) =
- delete;
- WaylandInputMethodContextFactory& operator=(
- const WaylandInputMethodContextFactory&) = delete;
-
- ~WaylandInputMethodContextFactory() override;
-
- std::unique_ptr<LinuxInputMethodContext> CreateInputMethodContext(
- LinuxInputMethodContextDelegate* delegate,
- bool is_simple) const override;
-
- // Exposed for unit tests but also called by CreateInputMethodContext
- std::unique_ptr<WaylandInputMethodContext> CreateWaylandInputMethodContext(
- ui::LinuxInputMethodContextDelegate* delegate,
- bool is_simple) const;
-
- private:
- WaylandConnection* const connection_;
-};
-
-} // namespace ui
-
-#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_INPUT_METHOD_CONTEXT_FACTORY_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context_unittest.cc b/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context_unittest.cc
index 13bc3a347c0..3907d1d89e5 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context_unittest.cc
@@ -7,6 +7,7 @@
#include <memory>
#include "base/i18n/break_iterator.h"
+#include "base/memory/raw_ptr.h"
#include "base/strings/utf_string_conversions.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -16,8 +17,8 @@
#include "ui/base/ime/text_input_type.h"
#include "ui/events/event.h"
#include "ui/gfx/range/range.h"
+#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
#include "ui/ozone/platform/wayland/host/wayland_input_method_context.h"
-#include "ui/ozone/platform/wayland/host/wayland_input_method_context_factory.h"
#include "ui/ozone/platform/wayland/host/wayland_window.h"
#include "ui/ozone/platform/wayland/test/mock_surface.h"
#include "ui/ozone/platform/wayland/test/mock_zcr_extended_text_input.h"
@@ -27,6 +28,7 @@
using ::testing::_;
using ::testing::DoAll;
+using ::testing::InSequence;
using ::testing::Mock;
using ::testing::SaveArg;
using ::testing::Values;
@@ -58,9 +60,21 @@ class TestInputMethodContextDelegate : public LinuxInputMethodContextDelegate {
void OnCommit(const std::u16string& text) override {
was_on_commit_called_ = true;
}
+ void OnConfirmCompositionText(bool keep_selection) override {
+ was_on_confirm_composition_text_called_ = true;
+ }
void OnPreeditChanged(const ui::CompositionText& composition_text) override {
was_on_preedit_changed_called_ = true;
}
+ void OnClearGrammarFragments(const gfx::Range& range) override {
+ was_on_clear_grammar_fragments_called_ = true;
+ }
+ void OnAddGrammarFragment(const ui::GrammarFragment& fragment) override {
+ was_on_add_grammar_fragment_called_ = true;
+ }
+ void OnSetAutocorrectRange(const gfx::Range& range) override {
+ was_on_set_autocorrect_range_called_ = true;
+ }
void OnPreeditEnd() override {}
void OnPreeditStart() override {}
void OnDeleteSurroundingText(size_t before, size_t after) override {
@@ -72,8 +86,17 @@ class TestInputMethodContextDelegate : public LinuxInputMethodContextDelegate {
was_on_set_preedit_region_called_ = true;
}
+ void OnSetVirtualKeyboardOccludedBounds(
+ const gfx::Rect& screen_bounds) override {
+ virtual_keyboard_bounds_ = screen_bounds;
+ }
+
bool was_on_commit_called() const { return was_on_commit_called_; }
+ bool was_on_confirm_composition_text_called() const {
+ return was_on_confirm_composition_text_called_;
+ }
+
bool was_on_preedit_changed_called() const {
return was_on_preedit_changed_called_;
}
@@ -82,17 +105,38 @@ class TestInputMethodContextDelegate : public LinuxInputMethodContextDelegate {
return was_on_set_preedit_region_called_;
}
+ bool was_on_clear_grammar_fragments_called() const {
+ return was_on_clear_grammar_fragments_called_;
+ }
+
+ bool was_on_add_grammar_fragment_called() const {
+ return was_on_add_grammar_fragment_called_;
+ }
+
+ bool was_on_set_autocorrect_range_called() const {
+ return was_on_set_autocorrect_range_called_;
+ }
+
const absl::optional<std::pair<size_t, size_t>>&
last_on_delete_surrounding_text_args() const {
return last_on_delete_surrounding_text_args_;
}
+ const absl::optional<gfx::Rect>& virtual_keyboard_bounds() const {
+ return virtual_keyboard_bounds_;
+ }
+
private:
bool was_on_commit_called_ = false;
+ bool was_on_confirm_composition_text_called_ = false;
bool was_on_preedit_changed_called_ = false;
bool was_on_set_preedit_region_called_ = false;
+ bool was_on_clear_grammar_fragments_called_ = false;
+ bool was_on_add_grammar_fragment_called_ = false;
+ bool was_on_set_autocorrect_range_called_ = false;
absl::optional<std::pair<size_t, size_t>>
last_on_delete_surrounding_text_args_;
+ absl::optional<gfx::Rect> virtual_keyboard_bounds_;
};
class WaylandInputMethodContextTest : public WaylandTest {
@@ -121,11 +165,11 @@ class WaylandInputMethodContextTest : public WaylandTest {
input_method_context_delegate_ =
std::make_unique<TestInputMethodContextDelegate>();
- WaylandInputMethodContextFactory factory(connection_.get());
- LinuxInputMethodContextFactory::SetInstance(&factory);
-
- input_method_context_ = factory.CreateWaylandInputMethodContext(
- input_method_context_delegate_.get(), false);
+ auto input_method_context = std::make_unique<WaylandInputMethodContext>(
+ connection_.get(), connection_->event_source(),
+ input_method_context_delegate_.get());
+ input_method_context_.reset(static_cast<WaylandInputMethodContext*>(
+ input_method_context.release()));
input_method_context_->Init(true);
connection_->ScheduleFlush();
@@ -146,8 +190,8 @@ class WaylandInputMethodContextTest : public WaylandTest {
std::unique_ptr<TestInputMethodContextDelegate>
input_method_context_delegate_;
std::unique_ptr<WaylandInputMethodContext> input_method_context_;
- wl::MockZwpTextInput* zwp_text_input_ = nullptr;
- wl::MockZcrExtendedTextInput* zcr_extended_text_input_ = nullptr;
+ raw_ptr<wl::MockZwpTextInput> zwp_text_input_ = nullptr;
+ raw_ptr<wl::MockZcrExtendedTextInput> zcr_extended_text_input_ = nullptr;
};
TEST_P(WaylandInputMethodContextTest, ActivateDeactivate) {
@@ -157,6 +201,7 @@ TEST_P(WaylandInputMethodContextTest, ActivateDeactivate) {
// Scenario 1: InputMethod focus is set, then Keyboard focus is set.
// Unset them in the reversed order.
+ InSequence s;
EXPECT_CALL(*zwp_text_input_, Activate(surface_->resource())).Times(0);
EXPECT_CALL(*zwp_text_input_, ShowInputPanel()).Times(0);
input_method_context_->UpdateFocus(true, ui::TEXT_INPUT_TYPE_NONE,
@@ -173,15 +218,15 @@ TEST_P(WaylandInputMethodContextTest, ActivateDeactivate) {
Sync();
Mock::VerifyAndClearExpectations(zwp_text_input_);
- EXPECT_CALL(*zwp_text_input_, Deactivate());
EXPECT_CALL(*zwp_text_input_, HideInputPanel());
+ EXPECT_CALL(*zwp_text_input_, Deactivate());
connection_->wayland_window_manager()->SetKeyboardFocusedWindow(nullptr);
connection_->ScheduleFlush();
Sync();
Mock::VerifyAndClearExpectations(zwp_text_input_);
- EXPECT_CALL(*zwp_text_input_, Deactivate()).Times(0);
EXPECT_CALL(*zwp_text_input_, HideInputPanel()).Times(0);
+ EXPECT_CALL(*zwp_text_input_, Deactivate()).Times(0);
input_method_context_->UpdateFocus(true, ui::TEXT_INPUT_TYPE_TEXT,
ui::TEXT_INPUT_TYPE_NONE);
connection_->ScheduleFlush();
@@ -206,16 +251,16 @@ TEST_P(WaylandInputMethodContextTest, ActivateDeactivate) {
Sync();
Mock::VerifyAndClearExpectations(zwp_text_input_);
- EXPECT_CALL(*zwp_text_input_, Deactivate());
EXPECT_CALL(*zwp_text_input_, HideInputPanel());
+ EXPECT_CALL(*zwp_text_input_, Deactivate());
input_method_context_->UpdateFocus(true, ui::TEXT_INPUT_TYPE_TEXT,
ui::TEXT_INPUT_TYPE_NONE);
connection_->ScheduleFlush();
Sync();
Mock::VerifyAndClearExpectations(zwp_text_input_);
- EXPECT_CALL(*zwp_text_input_, Deactivate()).Times(0);
EXPECT_CALL(*zwp_text_input_, HideInputPanel()).Times(0);
+ EXPECT_CALL(*zwp_text_input_, Deactivate()).Times(0);
connection_->wayland_window_manager()->SetKeyboardFocusedWindow(nullptr);
connection_->ScheduleFlush();
Sync();
@@ -427,6 +472,35 @@ TEST_P(WaylandInputMethodContextTest, OnCommit) {
EXPECT_TRUE(input_method_context_delegate_->was_on_commit_called());
}
+// TODO(1353668): WaylandInputMethodContext::OnCursorPosition sets
+// |pending_keep_selection| only on lacros. That's the reason why this test
+// doesn't pass on Linux. We need to clarify that.
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+#define MAYBE(x) x
+#else
+#define MAYBE(x) DISABLED_##x
+#endif
+
+TEST_P(WaylandInputMethodContextTest, MAYBE(OnConfirmCompositionText)) {
+ constexpr char16_t text[] = u"ab😀cあdef";
+ const gfx::Range range(5, 6); // あ is selected.
+
+ // SetSurroundingText should be called in UTF-8.
+ EXPECT_CALL(*zwp_text_input_,
+ SetSurroundingText("ab😀cあdef", gfx::Range(7, 10)));
+ input_method_context_->SetSurroundingText(text, range);
+ connection_->ScheduleFlush();
+ Sync();
+ Mock::VerifyAndClearExpectations(zwp_text_input_);
+
+ zwp_text_input_v1_send_cursor_position(zwp_text_input_->resource(), 7, 10);
+ zwp_text_input_v1_send_commit_string(zwp_text_input_->resource(), 0,
+ "ab😀cあdef");
+ Sync();
+ EXPECT_TRUE(
+ input_method_context_delegate_->was_on_confirm_composition_text_called());
+}
+
TEST_P(WaylandInputMethodContextTest, OnSetPreeditRegion_Success) {
constexpr char16_t text[] = u"abcあdef";
const gfx::Range range(3, 4); // あ is selected.
@@ -514,6 +588,35 @@ TEST_P(WaylandInputMethodContextTest,
input_method_context_delegate_->was_on_set_preedit_region_called());
}
+TEST_P(WaylandInputMethodContextTest, OnClearGrammarFragments) {
+ input_method_context_->OnClearGrammarFragments(gfx::Range(1, 5));
+ Sync();
+ EXPECT_TRUE(
+ input_method_context_delegate_->was_on_clear_grammar_fragments_called());
+}
+
+TEST_P(WaylandInputMethodContextTest, OnAddGrammarFragments) {
+ input_method_context_->OnAddGrammarFragment(
+ ui::GrammarFragment(gfx::Range(1, 5), "test"));
+ Sync();
+ EXPECT_TRUE(
+ input_method_context_delegate_->was_on_add_grammar_fragment_called());
+}
+
+TEST_P(WaylandInputMethodContextTest, OnSetAutocorrectRange) {
+ input_method_context_->OnSetAutocorrectRange(gfx::Range(1, 5));
+ Sync();
+ EXPECT_TRUE(
+ input_method_context_delegate_->was_on_set_autocorrect_range_called());
+}
+
+TEST_P(WaylandInputMethodContextTest, OnSetVirtualKeyboardOccludedBounds) {
+ const gfx::Rect bounds(10, 20, 300, 400);
+ input_method_context_->OnSetVirtualKeyboardOccludedBounds(bounds);
+ Sync();
+ EXPECT_EQ(input_method_context_delegate_->virtual_keyboard_bounds(), bounds);
+}
+
TEST_P(WaylandInputMethodContextTest, DisplayVirtualKeyboard) {
EXPECT_CALL(*zwp_text_input_, ShowInputPanel());
EXPECT_TRUE(input_method_context_->DisplayVirtualKeyboard());
@@ -560,6 +663,7 @@ TEST_P(WaylandInputMethodContextNoKeyboardTest, ActivateDeactivate) {
// Because there is no keyboard, Activate is called as soon as InputMethod's
// TextInputClient focus is met.
+ InSequence s;
EXPECT_CALL(*zwp_text_input_, Activate(surface_->resource()));
EXPECT_CALL(*zwp_text_input_, ShowInputPanel());
input_method_context_->UpdateFocus(true, ui::TEXT_INPUT_TYPE_NONE,
@@ -568,8 +672,8 @@ TEST_P(WaylandInputMethodContextNoKeyboardTest, ActivateDeactivate) {
Sync();
Mock::VerifyAndClearExpectations(zwp_text_input_);
- EXPECT_CALL(*zwp_text_input_, Deactivate());
EXPECT_CALL(*zwp_text_input_, HideInputPanel());
+ EXPECT_CALL(*zwp_text_input_, Deactivate());
input_method_context_->UpdateFocus(false, ui::TEXT_INPUT_TYPE_TEXT,
ui::TEXT_INPUT_TYPE_NONE);
connection_->ScheduleFlush();
@@ -577,6 +681,31 @@ TEST_P(WaylandInputMethodContextNoKeyboardTest, ActivateDeactivate) {
Mock::VerifyAndClearExpectations(zwp_text_input_);
}
+TEST_P(WaylandInputMethodContextNoKeyboardTest, UpdateFocusBetweenTextFields) {
+ // Because there is no keyboard, Activate is called as soon as InputMethod's
+ // TextInputClient focus is met.
+
+ InSequence s;
+ EXPECT_CALL(*zwp_text_input_, Activate(surface_->resource()));
+ EXPECT_CALL(*zwp_text_input_, ShowInputPanel());
+ input_method_context_->UpdateFocus(true, ui::TEXT_INPUT_TYPE_NONE,
+ ui::TEXT_INPUT_TYPE_TEXT);
+ connection_->ScheduleFlush();
+ Sync();
+ Mock::VerifyAndClearExpectations(zwp_text_input_);
+
+ // Make sure virtual keyboard is not unnecessarily hidden.
+ EXPECT_CALL(*zwp_text_input_, HideInputPanel()).Times(0);
+ EXPECT_CALL(*zwp_text_input_, Deactivate());
+ EXPECT_CALL(*zwp_text_input_, Activate(surface_->resource()));
+ EXPECT_CALL(*zwp_text_input_, ShowInputPanel()).Times(0);
+ input_method_context_->UpdateFocus(false, ui::TEXT_INPUT_TYPE_TEXT,
+ ui::TEXT_INPUT_TYPE_TEXT);
+ connection_->ScheduleFlush();
+ Sync();
+ Mock::VerifyAndClearExpectations(zwp_text_input_);
+}
+
INSTANTIATE_TEST_SUITE_P(XdgVersionStableTest,
WaylandInputMethodContextTest,
Values(wl::ServerConfig{
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.cc b/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.cc
index 243944bf6b4..5afac64fe2b 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.cc
@@ -12,6 +12,7 @@
#include <utility>
#include "base/logging.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted_memory.h"
#include "base/unguessable_token.h"
#include "ui/base/buildflags.h"
@@ -74,7 +75,7 @@ class WaylandKeyboard::ZCRExtendedKeyboard {
serial, time, key, state, WaylandKeyboard::KeyEventKind::kPeekKey);
}
- WaylandKeyboard* const keyboard_;
+ const raw_ptr<WaylandKeyboard> keyboard_;
wl::Object<zcr_extended_keyboard_v1> obj_;
};
@@ -288,8 +289,8 @@ void WaylandKeyboard::OnKey(uint32_t serial,
}
DispatchKey(key, 0 /*scan_code*/, down, false /*repeat*/,
- down ? absl::make_optional(serial) : absl::nullopt,
- EventTimeForNow(), device_id(), EF_NONE, kind);
+ absl::make_optional(serial), EventTimeForNow(), device_id(),
+ EF_NONE, kind);
}
void WaylandKeyboard::DispatchKey(unsigned int key,
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.h b/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.h
index c49934d7057..9bd0ed1cb31 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.h
@@ -7,6 +7,7 @@
#include <cstdint>
+#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/base/buildflags.h"
@@ -126,8 +127,8 @@ class WaylandKeyboard : public EventAutoRepeatHandler::Delegate {
wl::Object<wl_keyboard> obj_;
std::unique_ptr<ZCRExtendedKeyboard> extended_keyboard_;
- WaylandConnection* const connection_;
- Delegate* const delegate_;
+ const raw_ptr<WaylandConnection> connection_;
+ const raw_ptr<Delegate> delegate_;
// Key repeat handler.
static const wl_callback_listener callback_listener_;
@@ -135,7 +136,7 @@ class WaylandKeyboard : public EventAutoRepeatHandler::Delegate {
base::OnceClosure auto_repeat_closure_;
wl::Object<wl_callback> sync_callback_;
- LayoutEngine* layout_engine_;
+ raw_ptr<LayoutEngine> layout_engine_;
};
class WaylandKeyboard::Delegate {
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_keyboard_unittest.cc b/chromium/ui/ozone/platform/wayland/host/wayland_keyboard_unittest.cc
index 3b08e97e8e7..817cb5349be 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_keyboard_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_keyboard_unittest.cc
@@ -6,6 +6,7 @@
#include <wayland-server.h>
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "base/test/test_mock_time_task_runner.h"
#include "base/timer/timer.h"
#include "testing/gmock/include/gmock/gmock.h"
@@ -82,7 +83,7 @@ class WaylandKeyboardTest : public WaylandTest {
}
protected:
- wl::TestKeyboard* keyboard_;
+ raw_ptr<wl::TestKeyboard> keyboard_;
// There may be a pending wl_display_sync event, which is triggered by auto
// key repeat and needs to be processed. Wait for its completion.
@@ -114,7 +115,7 @@ class WaylandKeyboardTest : public WaylandTest {
};
ACTION_P(CloneEvent, ptr) {
- *ptr = Event::Clone(*arg0);
+ *ptr = arg0->Clone();
}
TEST_P(WaylandKeyboardTest, Keypress) {
@@ -147,81 +148,6 @@ TEST_P(WaylandKeyboardTest, Keypress) {
EXPECT_CALL(delegate_, DispatchEvent(_)).Times(0);
}
-TEST_P(WaylandKeyboardTest, AltModifierKeypress) {
- struct wl_array empty;
- wl_array_init(&empty);
- wl_keyboard_send_enter(keyboard_->resource(), 1, surface_->resource(),
- &empty);
- wl_array_release(&empty);
-
- // Alt
- wl_keyboard_send_key(keyboard_->resource(), 2, 0, 56 /* left Alt */,
- WL_KEYBOARD_KEY_STATE_PRESSED);
-
- std::unique_ptr<Event> event;
- EXPECT_CALL(delegate_, DispatchEvent(_)).WillOnce(CloneEvent(&event));
-
- Sync();
- ASSERT_TRUE(event);
- ASSERT_TRUE(event->IsKeyEvent());
-
- auto* key_event = event->AsKeyEvent();
-
- EXPECT_EQ(ui::EF_ALT_DOWN, key_event->flags());
- EXPECT_EQ(ui::VKEY_MENU, key_event->key_code());
- EXPECT_EQ(ET_KEY_PRESSED, key_event->type());
-}
-
-TEST_P(WaylandKeyboardTest, ControlModifierKeypress) {
- struct wl_array empty;
- wl_array_init(&empty);
- wl_keyboard_send_enter(keyboard_->resource(), 1, surface_->resource(),
- &empty);
- wl_array_release(&empty);
-
- // Control
- wl_keyboard_send_key(keyboard_->resource(), 2, 0, 29 /* left Control */,
- WL_KEYBOARD_KEY_STATE_PRESSED);
-
- std::unique_ptr<Event> event;
- EXPECT_CALL(delegate_, DispatchEvent(_)).WillOnce(CloneEvent(&event));
-
- Sync();
- ASSERT_TRUE(event);
- ASSERT_TRUE(event->IsKeyEvent());
-
- auto* key_event = event->AsKeyEvent();
-
- EXPECT_EQ(ui::EF_CONTROL_DOWN, key_event->flags());
- EXPECT_EQ(ui::VKEY_CONTROL, key_event->key_code());
- EXPECT_EQ(ET_KEY_PRESSED, key_event->type());
-}
-
-TEST_P(WaylandKeyboardTest, ShiftModifierKeypress) {
- struct wl_array empty;
- wl_array_init(&empty);
- wl_keyboard_send_enter(keyboard_->resource(), 1, surface_->resource(),
- &empty);
- wl_array_release(&empty);
-
- // Shift
- wl_keyboard_send_key(keyboard_->resource(), 2, 0, 42 /* left Shift */,
- WL_KEYBOARD_KEY_STATE_PRESSED);
-
- std::unique_ptr<Event> event;
- EXPECT_CALL(delegate_, DispatchEvent(_)).WillOnce(CloneEvent(&event));
-
- Sync();
- ASSERT_TRUE(event);
- ASSERT_TRUE(event->IsKeyEvent());
-
- auto* key_event = event->AsKeyEvent();
-
- EXPECT_EQ(ui::EF_SHIFT_DOWN, key_event->flags());
- EXPECT_EQ(ui::VKEY_SHIFT, key_event->key_code());
- EXPECT_EQ(ET_KEY_PRESSED, key_event->type());
-}
-
TEST_P(WaylandKeyboardTest, ControlShiftModifiers) {
struct wl_array empty;
wl_array_init(&empty);
@@ -274,50 +200,6 @@ TEST_P(WaylandKeyboardTest, ControlShiftModifiers) {
EXPECT_EQ(ET_KEY_PRESSED, key_event3->type());
}
-TEST_P(WaylandKeyboardTest, CapsLockKeypress) {
- struct wl_array empty;
- wl_array_init(&empty);
- wl_array_init(&empty);
- wl_keyboard_send_enter(keyboard_->resource(), 1, surface_->resource(),
- &empty);
- wl_array_release(&empty);
-
- // Capslock
- wl_keyboard_send_key(keyboard_->resource(), 2, 0, 58 /* Capslock */,
- WL_KEYBOARD_KEY_STATE_PRESSED);
-
- std::unique_ptr<Event> event;
- EXPECT_CALL(delegate_, DispatchEvent(_)).WillOnce(CloneEvent(&event));
-
- Sync();
- ASSERT_TRUE(event);
- ASSERT_TRUE(event->IsKeyEvent());
-
- auto* key_event = event->AsKeyEvent();
-
- EXPECT_EQ(ui::EF_MOD3_DOWN, key_event->flags());
- EXPECT_EQ(ui::VKEY_CAPITAL, key_event->key_code());
- EXPECT_EQ(ET_KEY_PRESSED, key_event->type());
-
- Sync();
-
- wl_keyboard_send_key(keyboard_->resource(), 2, 0, 58 /* Capslock */,
- WL_KEYBOARD_KEY_STATE_RELEASED);
-
- std::unique_ptr<Event> event2;
- EXPECT_CALL(delegate_, DispatchEvent(_)).WillOnce(CloneEvent(&event2));
-
- Sync();
- ASSERT_TRUE(event2);
- ASSERT_TRUE(event2->IsKeyEvent());
-
- auto* key_event2 = event2->AsKeyEvent();
-
- EXPECT_EQ(0, key_event2->flags());
- EXPECT_EQ(ui::VKEY_CAPITAL, key_event2->key_code());
- EXPECT_EQ(ET_KEY_RELEASED, key_event2->type());
-}
-
#if BUILDFLAG(USE_XKBCOMMON)
TEST_P(WaylandKeyboardTest, CapsLockModifier) {
struct wl_array empty;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_menu_utils.h b/chromium/ui/ozone/platform/wayland/host/wayland_menu_utils.h
index 43d1e859536..bff2f84105d 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_menu_utils.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_menu_utils.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_MENU_UTILS_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_MENU_UTILS_H_
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/public/platform_menu_utils.h"
namespace ui {
@@ -22,7 +23,7 @@ class WaylandMenuUtils : public PlatformMenuUtils {
std::string ToDBusKeySym(KeyboardCode code) const override;
private:
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_output.cc b/chromium/ui/ozone/platform/wayland/host/wayland_output.cc
index d6d58296331..49011678f75 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_output.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_output.cc
@@ -5,14 +5,19 @@
#include "ui/ozone/platform/wayland/host/wayland_output.h"
#include <aura-shell-client-protocol.h>
+#include <chrome-color-management-client-protocol.h>
#include <xdg-output-unstable-v1-client-protocol.h>
#include "base/logging.h"
+#include "base/strings/string_util.h"
#include "ui/display/display.h"
#include "ui/gfx/color_space.h"
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
#include "ui/ozone/platform/wayland/host/wayland_output_manager.h"
#include "ui/ozone/platform/wayland/host/wayland_zaura_output.h"
+#include "ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.h"
+#include "ui/ozone/platform/wayland/host/wayland_zcr_color_manager.h"
#include "ui/ozone/platform/wayland/host/xdg_output.h"
namespace ui {
@@ -74,6 +79,13 @@ void WaylandOutput::InitializeZAuraOutput(zaura_shell* aura_shell) {
zaura_shell_get_aura_output(aura_shell, output_.get()));
}
+void WaylandOutput::InitializeColorManagementOutput(
+ WaylandZcrColorManager* zcr_color_manager) {
+ DCHECK(!color_management_output_);
+ color_management_output_ = std::make_unique<WaylandZcrColorManagementOutput>(
+ zcr_color_manager->CreateColorManagementOutput(output_.get()).release());
+}
+
void WaylandOutput::Initialize(Delegate* delegate) {
DCHECK(!delegate_);
delegate_ = delegate;
@@ -114,10 +126,22 @@ gfx::Insets WaylandOutput::insets() const {
return aura_output_ ? aura_output_->insets() : gfx::Insets();
}
+const std::string& WaylandOutput::label() const {
+ return xdg_output_ ? xdg_output_->description() : base::EmptyString();
+}
+
+const std::string& WaylandOutput::name() const {
+ return xdg_output_ ? xdg_output_->name() : base::EmptyString();
+}
+
zaura_output* WaylandOutput::get_zaura_output() {
return aura_output_ ? aura_output_->wl_object() : nullptr;
}
+void WaylandOutput::SetScaleFactorForTesting(float scale_factor) {
+ scale_factor_ = scale_factor;
+}
+
void WaylandOutput::TriggerDelegateNotifications() {
if (xdg_output_ && connection_->surface_submission_in_pixel_coordinates()) {
DCHECK(!physical_size_.IsEmpty());
@@ -132,9 +156,9 @@ void WaylandOutput::TriggerDelegateNotifications() {
scale_factor_ = max_physical_side / max_logical_side;
}
}
- delegate_->OnOutputHandleMetrics(output_id_, origin(), logical_size(),
- physical_size_, insets(), scale_factor_,
- panel_transform_, logical_transform());
+ delegate_->OnOutputHandleMetrics(
+ output_id_, origin(), logical_size(), physical_size_, insets(),
+ scale_factor_, panel_transform_, logical_transform(), label());
}
// static
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_output.h b/chromium/ui/ozone/platform/wayland/host/wayland_output.h
index c9571ccc43c..f6e95130aa8 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_output.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_output.h
@@ -7,6 +7,7 @@
#include <stdint.h>
+#include "base/memory/raw_ptr.h"
#include "ui/display/types/display_snapshot.h"
#include "ui/display/types/native_display_delegate.h"
#include "ui/gfx/geometry/rect.h"
@@ -15,6 +16,8 @@
namespace ui {
class XDGOutput;
+class WaylandZcrColorManager;
+class WaylandZcrColorManagementOutput;
class WaylandConnection;
class WaylandZAuraOutput;
@@ -39,7 +42,8 @@ class WaylandOutput : public wl::GlobalObjectRegistrar<WaylandOutput> {
const gfx::Insets& insets,
float scale_factor,
int32_t panel_transform,
- int32_t logical_transform) = 0;
+ int32_t logical_transform,
+ const std::string& label) = 0;
protected:
virtual ~Delegate() = default;
@@ -57,6 +61,7 @@ class WaylandOutput : public wl::GlobalObjectRegistrar<WaylandOutput> {
void Initialize(Delegate* delegate);
void InitializeXdgOutput(struct zxdg_output_manager_v1* manager);
void InitializeZAuraOutput(zaura_shell* aura_shell);
+ void InitializeColorManagementOutput(WaylandZcrColorManager* manager);
float GetUIScaleFactor() const;
uint32_t output_id() const { return output_id_; }
@@ -68,6 +73,11 @@ class WaylandOutput : public wl::GlobalObjectRegistrar<WaylandOutput> {
gfx::Size logical_size() const;
gfx::Size physical_size() const { return physical_size_; }
gfx::Insets insets() const;
+ const std::string& label() const;
+ const std::string& name() const;
+ WaylandZcrColorManagementOutput* color_management_output() const {
+ return color_management_output_.get();
+ }
// Tells if the output has already received physical screen dimensions in the
// global compositor space.
@@ -76,6 +86,8 @@ class WaylandOutput : public wl::GlobalObjectRegistrar<WaylandOutput> {
wl_output* get_output() { return output_.get(); }
zaura_output* get_zaura_output();
+ void SetScaleFactorForTesting(float scale_factor);
+
private:
static constexpr int32_t kDefaultScaleFactor = 1;
@@ -109,6 +121,7 @@ class WaylandOutput : public wl::GlobalObjectRegistrar<WaylandOutput> {
wl::Object<wl_output> output_;
std::unique_ptr<XDGOutput> xdg_output_;
std::unique_ptr<WaylandZAuraOutput> aura_output_;
+ std::unique_ptr<WaylandZcrColorManagementOutput> color_management_output_;
float scale_factor_ = kDefaultScaleFactor;
int32_t panel_transform_ = WL_OUTPUT_TRANSFORM_NORMAL;
// Origin of the output in DIP screen coordinate.
@@ -116,8 +129,8 @@ class WaylandOutput : public wl::GlobalObjectRegistrar<WaylandOutput> {
// Size of the output in physical pixels.
gfx::Size physical_size_;
- Delegate* delegate_ = nullptr;
- WaylandConnection* connection_ = nullptr;
+ raw_ptr<Delegate> delegate_ = nullptr;
+ raw_ptr<WaylandConnection> connection_ = nullptr;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_output_manager.cc b/chromium/ui/ozone/platform/wayland/host/wayland_output_manager.cc
index 87542ed0640..52d4e4eec4a 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_output_manager.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_output_manager.cc
@@ -50,6 +50,10 @@ void WaylandOutputManager::AddWaylandOutput(uint32_t output_id,
wayland_output->InitializeZAuraOutput(
connection_->zaura_shell()->wl_object());
}
+ if (connection_->zcr_color_manager()) {
+ wayland_output->InitializeColorManagementOutput(
+ connection_->zcr_color_manager());
+ }
DCHECK(!wayland_output->is_ready());
output_list_[output_id] = std::move(wayland_output);
@@ -87,6 +91,13 @@ void WaylandOutputManager::InitializeAllZAuraOutputs() {
}
}
+void WaylandOutputManager::InitializeAllColorManagementOutputs() {
+ DCHECK(connection_->zcr_color_manager());
+ for (const auto& output : output_list_)
+ output.second->InitializeColorManagementOutput(
+ connection_->zcr_color_manager());
+}
+
std::unique_ptr<WaylandScreen> WaylandOutputManager::CreateWaylandScreen() {
auto wayland_screen = std::make_unique<WaylandScreen>(connection_);
wayland_screen_ = wayland_screen->GetWeakPtr();
@@ -109,7 +120,8 @@ void WaylandOutputManager::InitWaylandScreen(WaylandScreen* screen) {
output.second->output_id(), output.second->origin(),
output.second->logical_size(), output.second->physical_size(),
output.second->insets(), output.second->scale_factor(),
- output.second->panel_transform(), output.second->logical_transform());
+ output.second->panel_transform(), output.second->logical_transform(),
+ output.second->label());
}
}
}
@@ -128,6 +140,11 @@ WaylandOutput* WaylandOutputManager::GetPrimaryOutput() const {
return nullptr;
}
+const WaylandOutputManager::OutputList& WaylandOutputManager::GetAllOutputs()
+ const {
+ return output_list_;
+}
+
void WaylandOutputManager::OnOutputHandleMetrics(uint32_t output_id,
const gfx::Point& origin,
const gfx::Size& logical_size,
@@ -135,15 +152,25 @@ void WaylandOutputManager::OnOutputHandleMetrics(uint32_t output_id,
const gfx::Insets& insets,
float scale_factor,
int32_t panel_transform,
- int32_t logical_transform) {
+ int32_t logical_transform,
+ const std::string& label) {
if (wayland_screen_) {
- wayland_screen_->OnOutputAddedOrUpdated(output_id, origin, logical_size,
- physical_size, insets, scale_factor,
- panel_transform, logical_transform);
+ wayland_screen_->OnOutputAddedOrUpdated(
+ output_id, origin, logical_size, physical_size, insets, scale_factor,
+ panel_transform, logical_transform, label);
+ }
+
+ // Update scale of the windows currently associated with |output_id|. i.e:
+ // the ones whose GetPreferredEnteredOutputId() returns |output_id|; or those
+ // which have not yet entered any output (i.e: no wl_surface.enter event
+ // received for their root surface) and |output_id| is the primary output.
+ const bool is_primary =
+ wayland_screen_ && output_id == wayland_screen_->GetPrimaryDisplay().id();
+ for (auto* window : connection_->wayland_window_manager()->GetAllWindows()) {
+ uint32_t entered_output = window->GetPreferredEnteredOutputId();
+ if (entered_output == output_id || (!entered_output && is_primary))
+ window->UpdateWindowScale(true);
}
- auto* wayland_window_manager = connection_->wayland_window_manager();
- for (auto* window : wayland_window_manager->GetWindowsOnOutput(output_id))
- window->UpdateWindowScale(true);
}
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_output_manager.h b/chromium/ui/ozone/platform/wayland/host/wayland_output_manager.h
index 23a34a88066..e3b7d55457c 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_output_manager.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_output_manager.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_OUTPUT_MANAGER_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_OUTPUT_MANAGER_H_
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include <memory>
@@ -23,6 +24,8 @@ class WaylandOutput;
class WaylandOutputManager : public WaylandOutput::Delegate {
public:
+ using OutputList = base::flat_map<uint32_t, std::unique_ptr<WaylandOutput>>;
+
explicit WaylandOutputManager(WaylandConnection* connection);
WaylandOutputManager(const WaylandOutputManager&) = delete;
@@ -39,6 +42,7 @@ class WaylandOutputManager : public WaylandOutput::Delegate {
void InitializeAllXdgOutputs();
void InitializeAllZAuraOutputs();
+ void InitializeAllColorManagementOutputs();
// Creates a platform screen.
std::unique_ptr<WaylandScreen> CreateWaylandScreen();
@@ -48,6 +52,7 @@ class WaylandOutputManager : public WaylandOutput::Delegate {
WaylandOutput* GetOutput(uint32_t id) const;
WaylandOutput* GetPrimaryOutput() const;
+ const OutputList& GetAllOutputs() const;
WaylandScreen* wayland_screen() const { return wayland_screen_.get(); }
@@ -60,13 +65,12 @@ class WaylandOutputManager : public WaylandOutput::Delegate {
const gfx::Insets& insets,
float scale_factor,
int32_t panel_transform,
- int32_t logical_transform) override;
-
- using OutputList = base::flat_map<uint32_t, std::unique_ptr<WaylandOutput>>;
+ int32_t logical_transform,
+ const std::string& label) override;
OutputList output_list_;
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
// Non-owned wayland screen instance.
base::WeakPtr<WaylandScreen> wayland_screen_;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_pointer.cc b/chromium/ui/ozone/platform/wayland/host/wayland_pointer.cc
index d9504ae4926..f0fa9e7799a 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_pointer.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_pointer.cc
@@ -11,6 +11,7 @@
#include "ui/events/types/event_type.h"
#include "ui/ozone/platform/wayland/common/wayland_util.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
#include "ui/ozone/platform/wayland/host/wayland_serial_tracker.h"
#include "ui/ozone/platform/wayland/host/wayland_window.h"
@@ -35,7 +36,8 @@ WaylandPointer::~WaylandPointer() {
// Even though, WaylandPointer::Leave is always called when Wayland destroys
// wl_pointer, it's better to be explicit as some Wayland compositors may have
// bugs.
- delegate_->OnPointerFocusChanged(nullptr, {});
+ delegate_->OnPointerFocusChanged(nullptr, {},
+ wl::EventDispatchPolicy::kImmediate);
delegate_->OnResetPointerFlags();
}
@@ -46,8 +48,7 @@ void WaylandPointer::Enter(void* data,
wl_surface* surface,
wl_fixed_t surface_x,
wl_fixed_t surface_y) {
- DCHECK(data);
- WaylandPointer* pointer = static_cast<WaylandPointer*>(data);
+ auto* pointer = static_cast<WaylandPointer*>(data);
pointer->connection_->serial_tracker().UpdateSerial(
wl::SerialType::kMouseEnter, serial);
@@ -56,7 +57,8 @@ void WaylandPointer::Enter(void* data,
static_cast<float>(wl_fixed_to_double(surface_y))};
pointer->delegate_->OnPointerFocusChanged(
- window, pointer->connection_->MaybeConvertLocation(location, window));
+ window, pointer->connection_->MaybeConvertLocation(location, window),
+ wl::EventDispatchPolicy::kOnFrame);
}
// static
@@ -64,13 +66,16 @@ void WaylandPointer::Leave(void* data,
wl_pointer* obj,
uint32_t serial,
wl_surface* surface) {
- DCHECK(data);
- WaylandPointer* pointer = static_cast<WaylandPointer*>(data);
+ auto* pointer = static_cast<WaylandPointer*>(data);
pointer->connection_->serial_tracker().ResetSerial(
wl::SerialType::kMouseEnter);
+ // TODO(https://crrev.com/c/1352584): Switch from kImmediate to kOnFrame when
+ // Exo comply with other compositors in how it isolates each
+ // wl_pointer.enter|leave event with their respective wl_pointer.frame.
pointer->delegate_->OnPointerFocusChanged(
- nullptr, pointer->delegate_->GetPointerLocation());
+ nullptr, pointer->delegate_->GetPointerLocation(),
+ wl::EventDispatchPolicy::kImmediate);
}
// static
@@ -79,7 +84,7 @@ void WaylandPointer::Motion(void* data,
uint32_t time,
wl_fixed_t surface_x,
wl_fixed_t surface_y) {
- WaylandPointer* pointer = static_cast<WaylandPointer*>(data);
+ auto* pointer = static_cast<WaylandPointer*>(data);
gfx::PointF location(wl_fixed_to_double(surface_x),
wl_fixed_to_double(surface_y));
const WaylandWindow* target = pointer->delegate_->GetPointerTarget();
@@ -95,7 +100,7 @@ void WaylandPointer::Button(void* data,
uint32_t time,
uint32_t button,
uint32_t state) {
- WaylandPointer* pointer = static_cast<WaylandPointer*>(data);
+ auto* pointer = static_cast<WaylandPointer*>(data);
int changed_button;
switch (button) {
case BTN_LEFT:
@@ -135,7 +140,7 @@ void WaylandPointer::Axis(void* data,
uint32_t axis,
wl_fixed_t value) {
static const double kAxisValueScale = 10.0;
- WaylandPointer* pointer = static_cast<WaylandPointer*>(data);
+ auto* pointer = static_cast<WaylandPointer*>(data);
gfx::Vector2dF offset;
// Wayland compositors send axis events with values in the surface coordinate
// space. They send a value of 10 per mouse wheel click by convention, so
@@ -163,7 +168,7 @@ void WaylandPointer::Axis(void* data,
// static
void WaylandPointer::Frame(void* data, wl_pointer* obj) {
- WaylandPointer* pointer = static_cast<WaylandPointer*>(data);
+ auto* pointer = static_cast<WaylandPointer*>(data);
// The frame event ends the sequence of pointer events. Clear the flag. The
// next frame will set it when necessary.
pointer->axis_source_received_ = false;
@@ -174,7 +179,7 @@ void WaylandPointer::Frame(void* data, wl_pointer* obj) {
void WaylandPointer::AxisSource(void* data,
wl_pointer* obj,
uint32_t axis_source) {
- WaylandPointer* pointer = static_cast<WaylandPointer*>(data);
+ auto* pointer = static_cast<WaylandPointer*>(data);
pointer->axis_source_received_ = true;
pointer->delegate_->OnPointerAxisSourceEvent(axis_source);
}
@@ -184,7 +189,7 @@ void WaylandPointer::AxisStop(void* data,
wl_pointer* obj,
uint32_t time,
uint32_t axis) {
- WaylandPointer* pointer = static_cast<WaylandPointer*>(data);
+ auto* pointer = static_cast<WaylandPointer*>(data);
pointer->delegate_->OnPointerAxisStopEvent(axis);
}
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_pointer.h b/chromium/ui/ozone/platform/wayland/host/wayland_pointer.h
index cdc03785927..d1789a17c8b 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_pointer.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_pointer.h
@@ -7,6 +7,7 @@
#include <cstdint>
+#include "base/memory/raw_ptr.h"
#include "ui/events/event_constants.h"
#include "ui/events/types/event_type.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
@@ -16,6 +17,10 @@ class PointF;
class Vector2dF;
} // namespace gfx
+namespace wl {
+enum class EventDispatchPolicy;
+} // namespace wl
+
namespace ui {
class WaylandConnection;
@@ -94,8 +99,8 @@ class WaylandPointer {
wl::Object<wl_pointer> obj_;
wl::Object<zcr_pointer_stylus_v2> zcr_pointer_stylus_v2_;
- WaylandConnection* const connection_;
- Delegate* const delegate_;
+ const raw_ptr<WaylandConnection> connection_;
+ const raw_ptr<Delegate> delegate_;
// Whether the axis source event has been received for the current frame.
//
@@ -108,8 +113,10 @@ class WaylandPointer {
class WaylandPointer::Delegate {
public:
- virtual void OnPointerFocusChanged(WaylandWindow* window,
- const gfx::PointF& location) = 0;
+ virtual void OnPointerFocusChanged(
+ WaylandWindow* window,
+ const gfx::PointF& location,
+ wl::EventDispatchPolicy dispatch_policy) = 0;
virtual void OnPointerButtonEvent(EventType evtype,
int changed_button,
WaylandWindow* window = nullptr) = 0;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_pointer_unittest.cc b/chromium/ui/ozone/platform/wayland/host/wayland_pointer_unittest.cc
index e92b65da074..3b563cd7f71 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_pointer_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_pointer_unittest.cc
@@ -8,6 +8,7 @@
#include <cmath>
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "build/chromeos_buildflags.h"
#include "testing/gmock/include/gmock/gmock.h"
@@ -60,7 +61,7 @@ class WaylandPointerTest : public WaylandTest {
}
protected:
- wl::MockPointer* pointer_;
+ raw_ptr<wl::MockPointer> pointer_;
};
void SendAxisEvents(struct wl_resource* resource,
@@ -93,11 +94,12 @@ void SendAxisStopEvents(struct wl_resource* resource, uint32_t time) {
}
ACTION_P(CloneEvent, ptr) {
- *ptr = Event::Clone(*arg0);
+ *ptr = arg0->Clone();
}
TEST_P(WaylandPointerTest, Enter) {
wl_pointer_send_enter(pointer_->resource(), 1, surface_->resource(), 0, 0);
+ wl_pointer_send_frame(pointer_->resource());
std::unique_ptr<Event> event;
EXPECT_CALL(delegate_, DispatchEvent(_)).WillOnce(CloneEvent(&event));
@@ -133,12 +135,19 @@ TEST_P(WaylandPointerTest, Leave) {
ASSERT_TRUE(other_surface);
wl_pointer_send_enter(pointer_->resource(), 1, surface_->resource(), 0, 0);
+ wl_pointer_send_frame(pointer_->resource());
+
wl_pointer_send_leave(pointer_->resource(), 2, surface_->resource());
+ wl_pointer_send_frame(pointer_->resource());
+
wl_pointer_send_enter(pointer_->resource(), 3, other_surface->resource(), 0,
0);
+ wl_pointer_send_frame(pointer_->resource());
+
wl_pointer_send_button(pointer_->resource(), 4, 1004, BTN_LEFT,
WL_POINTER_BUTTON_STATE_PRESSED);
EXPECT_CALL(delegate_, DispatchEvent(_)).Times(2);
+ EXPECT_CALL(other_delegate, DispatchEvent(_)).Times(2);
// Do an extra Sync() here so that we process the second enter event before we
// destroy |other_window|.
@@ -147,7 +156,7 @@ TEST_P(WaylandPointerTest, Leave) {
ACTION_P3(CloneEventAndCheckCapture, window, result, ptr) {
ASSERT_TRUE(window->HasCapture() == result);
- *ptr = Event::Clone(*arg0);
+ *ptr = arg0->Clone();
}
TEST_P(WaylandPointerTest, Motion) {
@@ -203,6 +212,7 @@ TEST_P(WaylandPointerTest, MotionDragged) {
TEST_P(WaylandPointerTest, AxisSourceTypes) {
uint32_t time = 1001;
wl_pointer_send_enter(pointer_->resource(), 1, surface_->resource(), 0, 0);
+ wl_pointer_send_frame(pointer_->resource());
Sync(); // We're interested only in checking axis source types events in this
// test case, so skip Enter event here.
@@ -249,7 +259,7 @@ TEST_P(WaylandPointerTest, AxisSourceTypes) {
TEST_P(WaylandPointerTest, Axis) {
wl_pointer_send_enter(pointer_->resource(), 1, surface_->resource(),
wl_fixed_from_int(0), wl_fixed_from_int(0));
-
+ wl_pointer_send_frame(pointer_->resource());
Sync();
for (uint32_t axis :
@@ -288,6 +298,7 @@ TEST_P(WaylandPointerTest, Axis) {
TEST_P(WaylandPointerTest, SetBitmap) {
wl_pointer_send_enter(pointer_->resource(), 1, surface_->resource(),
wl_fixed_from_int(10), wl_fixed_from_int(10));
+ wl_pointer_send_frame(pointer_->resource());
Sync();
SkBitmap dummy_cursor;
@@ -329,6 +340,7 @@ TEST_P(WaylandPointerTest, SetBitmapAndScaleOnPointerFocus) {
wl_pointer_send_enter(pointer_->resource(), ++serial, surface_->resource(),
wl_fixed_from_int(10), wl_fixed_from_int(10));
+ wl_pointer_send_frame(pointer_->resource());
Sync();
// Set a cursor.
@@ -339,6 +351,7 @@ TEST_P(WaylandPointerTest, SetBitmapAndScaleOnPointerFocus) {
connection_->ScheduleFlush();
wl_pointer_send_leave(pointer_->resource(), ++serial, surface_->resource());
+ wl_pointer_send_frame(pointer_->resource());
Sync();
Mock::VerifyAndClearExpectations(pointer_);
@@ -351,6 +364,7 @@ TEST_P(WaylandPointerTest, SetBitmapAndScaleOnPointerFocus) {
EXPECT_CALL(*pointer_, SetCursor(Ne(nullptr), 5, 8));
wl_pointer_send_enter(pointer_->resource(), ++serial, surface_->resource(),
wl_fixed_from_int(50), wl_fixed_from_int(75));
+ wl_pointer_send_frame(pointer_->resource());
Sync();
connection_->ScheduleFlush();
@@ -360,6 +374,7 @@ TEST_P(WaylandPointerTest, SetBitmapAndScaleOnPointerFocus) {
// Reset the focus for the next iteration.
wl_pointer_send_leave(pointer_->resource(), ++serial, surface_->resource());
+ wl_pointer_send_frame(pointer_->resource());
Sync();
connection_->ScheduleFlush();
Sync();
@@ -373,9 +388,10 @@ TEST_P(WaylandPointerTest, FlingVertical) {
uint32_t time = 1001;
wl_pointer_send_enter(pointer_->resource(), ++serial, surface_->resource(),
wl_fixed_from_int(50), wl_fixed_from_int(75));
+ wl_pointer_send_frame(pointer_->resource());
+
wl_pointer_send_button(pointer_->resource(), ++serial, ++time, BTN_RIGHT,
WL_POINTER_BUTTON_STATE_PRESSED);
-
Sync();
std::unique_ptr<Event> event1, event2, event3;
@@ -427,9 +443,10 @@ TEST_P(WaylandPointerTest, FlingHorizontal) {
uint32_t time = 1001;
wl_pointer_send_enter(pointer_->resource(), ++serial, surface_->resource(),
wl_fixed_from_int(50), wl_fixed_from_int(75));
+ wl_pointer_send_frame(pointer_->resource());
+
wl_pointer_send_button(pointer_->resource(), ++serial, ++time, BTN_RIGHT,
WL_POINTER_BUTTON_STATE_PRESSED);
-
Sync();
std::unique_ptr<Event> event1, event2, event3;
@@ -481,9 +498,10 @@ TEST_P(WaylandPointerTest, FlingCancel) {
uint32_t time = 1001;
wl_pointer_send_enter(pointer_->resource(), ++serial, surface_->resource(),
wl_fixed_from_int(50), wl_fixed_from_int(75));
+ wl_pointer_send_frame(pointer_->resource());
+
wl_pointer_send_button(pointer_->resource(), ++serial, ++time, BTN_RIGHT,
WL_POINTER_BUTTON_STATE_PRESSED);
-
Sync();
std::unique_ptr<Event> event1, event2, event3, event4;
@@ -547,9 +565,10 @@ TEST_P(WaylandPointerTest, FlingDiagonal) {
uint32_t time = 1001;
wl_pointer_send_enter(pointer_->resource(), ++serial, surface_->resource(),
wl_fixed_from_int(50), wl_fixed_from_int(75));
+ wl_pointer_send_frame(pointer_->resource());
+
wl_pointer_send_button(pointer_->resource(), ++serial, ++time, BTN_RIGHT,
WL_POINTER_BUTTON_STATE_PRESSED);
-
Sync();
std::unique_ptr<Event> event1, event2, event3;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_popup.cc b/chromium/ui/ozone/platform/wayland/host/wayland_popup.cc
index 0582949b270..e5e32efdbce 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_popup.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_popup.cc
@@ -50,12 +50,15 @@ bool WaylandPopup::CreateShellPopup() {
params.bounds = bounds_dip;
params.menu_type =
delegate()->GetMenuType().value_or(MenuType::kRootContextMenu);
- params.anchor = delegate()->GetOwnedWindowAnchorAndRectInPx();
+ params.anchor = delegate()->GetOwnedWindowAnchorAndRectInDIP();
if (params.anchor.has_value()) {
- // TODO(crbug.com/1306688): Change anchor_rect to DIP.
+ // The anchor should originate from the window geometry, not from the
+ // surface. See https://crbug.com/1292486.
params.anchor->anchor_rect =
- delegate()->ConvertRectToDIP(wl::TranslateBoundsToParentCoordinates(
- params.anchor->anchor_rect, parent_window()->GetBoundsInPixels()));
+ wl::TranslateBoundsToParentCoordinates(
+ params.anchor->anchor_rect, parent_window()->GetBoundsInDIP()) -
+ parent_window()->GetWindowGeometryOffsetInDIP();
+
// If size is empty, set 1x1.
if (params.anchor->anchor_rect.size().IsEmpty())
params.anchor->anchor_rect.set_size({1, 1});
@@ -73,29 +76,33 @@ bool WaylandPopup::CreateShellPopup() {
return false;
}
- const auto parent_insets_px = parent_window()->frame_insets_px();
- if (parent_insets_px && !parent_insets_px->IsEmpty()) {
- set_frame_insets_px(*parent_insets_px);
- // Popups should have the same offset for their geometry as their parents
- // have, otherwise Wayland draws them incorrectly.
- const gfx::Point p = gfx::ScaleToRoundedPoint(
- {parent_insets_px->left(), parent_insets_px->top()},
- 1.f / window_scale());
- shell_popup_->SetWindowGeometry(
- {p.x(), p.y(), params.bounds.width(), params.bounds.height()});
- }
-
parent_window()->set_child_window(this);
- InitializeAuraShellSurface();
+ UpdateDecoration();
return true;
}
-void WaylandPopup::InitializeAuraShellSurface() {
+void WaylandPopup::UpdateDecoration() {
DCHECK(shell_popup_);
- if (!connection()->zaura_shell() || aura_surface_)
+
+ // If the surface is already decorated early return.
+ if (!connection()->zaura_shell() || decorated_via_aura_popup_)
+ return;
+
+ // Decorate the surface using the newer protocol. Relies on Ash >= M105.
+ if (shell_popup_->SupportsDecoration()) {
+ decorated_via_aura_popup_ = true;
+ shell_popup_->Decorate();
return;
- aura_surface_.reset(zaura_shell_get_aura_surface(
- connection()->zaura_shell()->wl_object(), root_surface()->surface()));
+ }
+
+ // Decorate the frame using the older protocol. Can be removed once Lacros >=
+ // M107. Reshown popups will not be decorated if |aura_surface_| isn't reset
+ // when server implements the older protocol.
+ if (!aura_surface_) {
+ aura_surface_.reset(zaura_shell_get_aura_surface(
+ connection()->zaura_shell()->wl_object(), root_surface()->surface()));
+ }
+
if (shadow_type_ == PlatformWindowShadowType::kDrop) {
zaura_surface_set_frame(aura_surface_.get(),
ZAURA_SURFACE_FRAME_TYPE_SHADOW);
@@ -129,10 +136,17 @@ void WaylandPopup::Hide() {
child_window()->Hide();
WaylandWindow::Hide();
+ if (aura_surface_ && wl::get_version_of_object(aura_surface_.get()) >=
+ ZAURA_SURFACE_RELEASE_SINCE_VERSION) {
+ aura_surface_.reset();
+ }
+
if (shell_popup_) {
parent_window()->set_child_window(nullptr);
shell_popup_.reset();
+ decorated_via_aura_popup_ = false;
}
+
connection()->ScheduleFlush();
}
@@ -140,9 +154,9 @@ bool WaylandPopup::IsVisible() const {
return !!shell_popup_;
}
-void WaylandPopup::SetBoundsInPixels(const gfx::Rect& bounds_dip) {
+void WaylandPopup::SetBoundsInDIP(const gfx::Rect& bounds_dip) {
auto old_bounds_dip = GetBoundsInDIP();
- WaylandWindow::SetBoundsInPixels(bounds_dip);
+ WaylandWindow::SetBoundsInDIP(bounds_dip);
// The shell popup can be null if bounds are being fixed during
// the initialization. See WaylandPopup::CreateShellPopup.
@@ -173,31 +187,35 @@ void WaylandPopup::SetBoundsInPixels(const gfx::Rect& bounds_dip) {
}
void WaylandPopup::HandlePopupConfigure(const gfx::Rect& bounds_dip) {
+ gfx::Rect pending_bounds_dip(bounds_dip);
+ if (pending_bounds_dip.IsEmpty())
+ pending_bounds_dip.set_size(GetBoundsInDIP().size());
set_pending_bounds_dip(wl::TranslateBoundsToTopLevelCoordinates(
- bounds_dip, parent_window()->GetBoundsInDIP()));
+ pending_bounds_dip, parent_window()->GetBoundsInDIP()));
+ set_pending_size_px(
+ delegate()->ConvertRectToPixels(pending_bounds_dip).size());
}
void WaylandPopup::HandleSurfaceConfigure(uint32_t serial) {
if (schedule_redraw_) {
- delegate()->OnDamageRect(gfx::Rect{{0, 0}, GetBoundsInPixels().size()});
+ delegate()->OnDamageRect(gfx::Rect{{0, 0}, size_px()});
schedule_redraw_ = false;
}
ProcessPendingBoundsDip(serial);
}
-void WaylandPopup::UpdateVisualSize(const gfx::Size& size_px,
- float scale_factor) {
- WaylandWindow::UpdateVisualSize(size_px, scale_factor);
+void WaylandPopup::UpdateVisualSize(const gfx::Size& size_px) {
+ WaylandWindow::UpdateVisualSize(size_px);
if (!shell_popup())
return;
- ProcessVisualSizeUpdate(size_px, scale_factor);
+ ProcessVisualSizeUpdate(size_px);
ApplyPendingBounds();
}
void WaylandPopup::ApplyPendingBounds() {
- if (HasPendingConfigures()) {
+ if (has_pending_configures()) {
base::AutoReset<bool> auto_reset(&wayland_sets_bounds_, true);
WaylandWindow::ApplyPendingBounds();
}
@@ -235,6 +253,7 @@ bool WaylandPopup::IsSurfaceConfigured() {
void WaylandPopup::SetWindowGeometry(gfx::Rect bounds_dip) {
DCHECK(shell_popup_);
gfx::Point p;
+ // TODO(crbug.com/1306688): Use DIP for frame_sets.
if (frame_insets_px() && !frame_insets_px()->IsEmpty()) {
p = gfx::ScaleToRoundedPoint(
{frame_insets_px()->left(), frame_insets_px()->top()},
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_popup.h b/chromium/ui/ozone/platform/wayland/host/wayland_popup.h
index cf28a1a2258..44d8315b26e 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_popup.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_popup.h
@@ -29,7 +29,7 @@ class WaylandPopup : public WaylandWindow {
void Show(bool inactive) override;
void Hide() override;
bool IsVisible() const override;
- void SetBoundsInPixels(const gfx::Rect& bounds) override;
+ void SetBoundsInDIP(const gfx::Rect& bounds) override;
private:
// WaylandWindow overrides:
@@ -41,16 +41,15 @@ class WaylandPopup : public WaylandWindow {
bool IsSurfaceConfigured() override;
void SetWindowGeometry(gfx::Rect bounds) override;
void AckConfigure(uint32_t serial) override;
- void UpdateVisualSize(const gfx::Size& size_px, float scale_factor) override;
+ void UpdateVisualSize(const gfx::Size& size_px) override;
void ApplyPendingBounds() override;
void UpdateWindowMask() override;
// Creates a popup window, which is visible as a menu window.
bool CreateShellPopup();
- // Initializes the aura-shell surface, in the case aura-shell EXO extension
- // is available.
- void InitializeAuraShellSurface();
+ // Decorates the surface, which requires custom extensions based on exo.
+ void UpdateDecoration();
// Returns bounds with origin relative to parent window's origin.
gfx::Rect AdjustPopupWindowPosition();
@@ -59,6 +58,12 @@ class WaylandPopup : public WaylandWindow {
// know anything about the version.
std::unique_ptr<ShellPopupWrapper> shell_popup_;
+ // Set to true if the surface is decorated via aura_popup -- the custom exo
+ // extension to xdg_popup.
+ bool decorated_via_aura_popup_ = false;
+
+ // Exists only if the frame is decorated via aura_surface. This is the
+ // deprecated path and can be removed once Ash is >= M105.
wl::Object<zaura_surface> aura_surface_;
PlatformWindowShadowType shadow_type_ = PlatformWindowShadowType::kNone;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_screen.cc b/chromium/ui/ozone/platform/wayland/host/wayland_screen.cc
index 0c7dc5c02b4..c0120f9b2ff 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_screen.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_screen.cc
@@ -16,6 +16,7 @@
#include "ui/display/display.h"
#include "ui/display/display_finder.h"
#include "ui/display/display_list.h"
+#include "ui/display/util/display_util.h"
#include "ui/display/util/gpu_info_util.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gfx/display_color_spaces.h"
@@ -26,7 +27,9 @@
#include "ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
#include "ui/ozone/platform/wayland/host/wayland_cursor_position.h"
+#include "ui/ozone/platform/wayland/host/wayland_output_manager.h"
#include "ui/ozone/platform/wayland/host/wayland_window.h"
+#include "ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.h"
#include "ui/ozone/platform/wayland/host/zwp_idle_inhibit_manager.h"
#if defined(USE_DBUS)
@@ -88,6 +91,9 @@ WaylandScreen::WaylandScreen(WaylandConnection* connection)
// Enable that back when the issue is resolved.
#endif // !BUILDFLAG(IS_CHROMEOS_LACROS)
+ if (format == gfx::BufferFormat::RGBA_1010102)
+ image_format_hdr_ = format;
+
if (!image_format_alpha_ && format == gfx::BufferFormat::BGRA_8888)
image_format_alpha_ = gfx::BufferFormat::BGRA_8888;
@@ -103,6 +109,8 @@ WaylandScreen::WaylandScreen(WaylandConnection* connection)
image_format_alpha_ = gfx::BufferFormat::RGBA_8888;
if (!image_format_no_alpha_)
image_format_no_alpha_ = image_format_alpha_;
+ if (!image_format_hdr_)
+ image_format_hdr_ = image_format_alpha_;
}
WaylandScreen::~WaylandScreen() = default;
@@ -114,9 +122,10 @@ void WaylandScreen::OnOutputAddedOrUpdated(uint32_t output_id,
const gfx::Insets& insets,
float scale,
int32_t panel_transform,
- int32_t logical_transform) {
+ int32_t logical_transform,
+ const std::string& label) {
AddOrUpdateDisplay(output_id, origin, logical_size, physical_size, insets,
- scale, panel_transform, logical_transform);
+ scale, panel_transform, logical_transform, label);
}
void WaylandScreen::OnOutputRemoved(uint32_t output_id) {
@@ -152,7 +161,8 @@ void WaylandScreen::AddOrUpdateDisplay(uint32_t output_id,
const gfx::Insets& insets,
float scale_factor,
int32_t panel_transform,
- int32_t logical_transform) {
+ int32_t logical_transform,
+ const std::string& label) {
display::Display changed_display(output_id);
DCHECK_GE(panel_transform, WL_OUTPUT_TRANSFORM_NORMAL);
@@ -188,8 +198,25 @@ void WaylandScreen::AddOrUpdateDisplay(uint32_t output_id,
changed_display.UpdateWorkAreaFromInsets(insets);
gfx::DisplayColorSpaces color_spaces;
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+ auto* wayland_output =
+ connection_->wayland_output_manager()->GetOutput(output_id);
+ auto* color_management_output =
+ wayland_output ? wayland_output->color_management_output() : nullptr;
+
+ if (color_management_output && color_management_output->gfx_color_space()) {
+ auto* gfx_color = color_management_output->gfx_color_space();
+ color_spaces = display::CreateDisplayColorSpaces(
+ *gfx_color, image_format_hdr_ == gfx::BufferFormat::RGBA_1010102, {});
+ } else {
+ color_spaces.SetOutputBufferFormats(image_format_no_alpha_.value(),
+ image_format_alpha_.value());
+ }
+#else
color_spaces.SetOutputBufferFormats(image_format_no_alpha_.value(),
image_format_alpha_.value());
+#endif
+
changed_display.set_color_spaces(color_spaces);
// There are 2 cases where |changed_display| must be set as primary:
@@ -210,6 +237,8 @@ void WaylandScreen::AddOrUpdateDisplay(uint32_t output_id,
type = display::DisplayList::Type::PRIMARY;
}
+ changed_display.set_label(label);
+
display_list_.AddOrUpdateDisplay(changed_display, type);
}
@@ -327,6 +356,37 @@ display::Display WaylandScreen::GetDisplayMatching(
return display_matching ? *display_matching : GetPrimaryDisplay();
}
+std::unique_ptr<WaylandScreen::WaylandScreenSaverSuspender>
+WaylandScreen::WaylandScreenSaverSuspender::Create(WaylandScreen& screen) {
+ auto suspender = base::WrapUnique(new WaylandScreenSaverSuspender(screen));
+ if (suspender->is_suspending_) {
+ screen.screen_saver_suspension_count_++;
+ return suspender;
+ }
+
+ return nullptr;
+}
+
+WaylandScreen::WaylandScreenSaverSuspender::WaylandScreenSaverSuspender(
+ WaylandScreen& screen)
+ : screen_(screen.GetWeakPtr()) {
+ is_suspending_ = screen.SetScreenSaverSuspended(true);
+}
+
+WaylandScreen::WaylandScreenSaverSuspender::~WaylandScreenSaverSuspender() {
+ if (screen_ && is_suspending_) {
+ screen_->screen_saver_suspension_count_--;
+ if (screen_->screen_saver_suspension_count_ == 0) {
+ screen_->SetScreenSaverSuspended(false);
+ }
+ }
+}
+
+std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender>
+WaylandScreen::SuspendScreenSaver() {
+ return WaylandScreenSaverSuspender::Create(*this);
+}
+
bool WaylandScreen::SetScreenSaverSuspended(bool suspend) {
if (!connection_->zwp_idle_inhibit_manager())
return false;
@@ -391,7 +451,7 @@ void WaylandScreen::RemoveObserver(display::DisplayObserver* observer) {
display_list_.RemoveObserver(observer);
}
-std::vector<base::Value> WaylandScreen::GetGpuExtraInfo(
+base::Value::List WaylandScreen::GetGpuExtraInfo(
const gfx::GpuExtraInfo& gpu_extra_info) {
auto values = GetDesktopEnvironmentInfo();
std::vector<std::string> protocols;
@@ -400,7 +460,7 @@ std::vector<base::Value> WaylandScreen::GetGpuExtraInfo(
protocol_and_version.first.c_str(),
protocol_and_version.second));
}
- values.push_back(
+ values.Append(
display::BuildGpuInfoEntry("Interfaces exposed by the Wayland compositor",
base::JoinString(protocols, " ")));
StorePlatformNameIntoListOfValues(values, "wayland");
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_screen.h b/chromium/ui/ozone/platform/wayland/host/wayland_screen.h
index 87358f4f069..a9292900124 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_screen.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_screen.h
@@ -8,8 +8,10 @@
#include <set>
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
+#include "base/values.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/display/display_list.h"
#include "ui/display/display_observer.h"
@@ -46,7 +48,8 @@ class WaylandScreen : public PlatformScreen {
const gfx::Insets& insets,
float scale,
int32_t panel_transform,
- int32_t logical_transform);
+ int32_t logical_transform,
+ const std::string& label);
void OnOutputRemoved(uint32_t output_id);
void OnTabletStateChanged(display::TabletState tablet_state);
@@ -68,15 +71,42 @@ class WaylandScreen : public PlatformScreen {
const gfx::Point& point) const override;
display::Display GetDisplayMatching(
const gfx::Rect& match_rect) const override;
- bool SetScreenSaverSuspended(bool suspend) override;
+ std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender>
+ SuspendScreenSaver() override;
bool IsScreenSaverActive() const override;
base::TimeDelta CalculateIdleTime() const override;
void AddObserver(display::DisplayObserver* observer) override;
void RemoveObserver(display::DisplayObserver* observer) override;
- std::vector<base::Value> GetGpuExtraInfo(
+ base::Value::List GetGpuExtraInfo(
const gfx::GpuExtraInfo& gpu_extra_info) override;
+ protected:
+ // Suspends or un-suspends the platform-specific screensaver, and returns
+ // whether the operation was successful. Can be called more than once with the
+ // same value for |suspend|, but those states should not stack: the first
+ // alternating value should toggle the state of the suspend.
+ bool SetScreenSaverSuspended(bool suspend);
+
private:
+ class WaylandScreenSaverSuspender
+ : public PlatformScreen::PlatformScreenSaverSuspender {
+ public:
+ WaylandScreenSaverSuspender(const WaylandScreenSaverSuspender&) = delete;
+ WaylandScreenSaverSuspender& operator=(const WaylandScreenSaverSuspender&) =
+ delete;
+
+ ~WaylandScreenSaverSuspender() override;
+
+ static std::unique_ptr<WaylandScreenSaverSuspender> Create(
+ WaylandScreen& screen);
+
+ private:
+ explicit WaylandScreenSaverSuspender(WaylandScreen& screen);
+
+ base::WeakPtr<WaylandScreen> screen_;
+ bool is_suspending_ = false;
+ };
+
// All parameters are in DIP screen coordinates/units except |physical_size|,
// which is in physical pixels.
void AddOrUpdateDisplay(uint32_t output_id,
@@ -86,9 +116,10 @@ class WaylandScreen : public PlatformScreen {
const gfx::Insets& insets,
float scale,
int32_t panel_transform,
- int32_t logical_transform);
+ int32_t logical_transform,
+ const std::string& label);
- WaylandConnection* connection_ = nullptr;
+ raw_ptr<WaylandConnection> connection_ = nullptr;
display::DisplayList display_list_;
@@ -96,6 +127,7 @@ class WaylandScreen : public PlatformScreen {
absl::optional<gfx::BufferFormat> image_format_alpha_;
absl::optional<gfx::BufferFormat> image_format_no_alpha_;
+ absl::optional<gfx::BufferFormat> image_format_hdr_;
#if defined(USE_DBUS)
mutable std::unique_ptr<OrgGnomeMutterIdleMonitor>
@@ -103,6 +135,7 @@ class WaylandScreen : public PlatformScreen {
#endif
wl::Object<zwp_idle_inhibitor_v1> idle_inhibitor_;
+ uint32_t screen_saver_suspension_count_ = 0;
base::WeakPtrFactory<WaylandScreen> weak_factory_;
};
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc b/chromium/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc
index a9a5bcadbe7..7ac51993c30 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc
@@ -6,6 +6,7 @@
#include <wayland-server.h>
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "base/strings/stringprintf.h"
#include "base/test/scoped_command_line.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -92,11 +93,6 @@ class WaylandScreenTest : public WaylandTest {
WaylandTest::SetUp();
- // Initializing the MockZAuraShell gives ownership to the wl_display.
- // TODO(fangzhoug): Investigate resulting memory leak.
- mock_zaura_shell_ = new wl::MockZAuraShell();
- mock_zaura_shell_->Initialize(server_.display());
-
output_->SetRect({kOutputWidth, kOutputHeight});
output_->SetScale(1);
output_->Flush();
@@ -131,9 +127,8 @@ class WaylandScreenTest : public WaylandTest {
EXPECT_EQ(display_for_widget.id(), expected_display_id);
}
- wl::MockZAuraShell* mock_zaura_shell_ = nullptr;
- wl::TestOutput* output_ = nullptr;
- WaylandOutputManager* output_manager_ = nullptr;
+ raw_ptr<wl::TestOutput> output_ = nullptr;
+ raw_ptr<WaylandOutputManager> output_manager_ = nullptr;
std::unique_ptr<WaylandScreen> platform_screen_;
};
@@ -299,178 +294,6 @@ TEST_P(WaylandScreenTest, MultipleOutputsAddedAndRemoved) {
platform_screen_->RemoveObserver(&observer);
}
-TEST_P(WaylandScreenTest, OutputPropertyChanges) {
- TestDisplayObserver observer;
- platform_screen_->AddObserver(&observer);
-
- const gfx::Rect physical_bounds{800, 600};
- output_->SetRect(physical_bounds);
- output_->Flush();
-
- Sync();
-
- uint32_t changed_values = display::DisplayObserver::DISPLAY_METRIC_BOUNDS |
- display::DisplayObserver::DISPLAY_METRIC_WORK_AREA;
- EXPECT_EQ(observer.GetAndClearChangedMetrics(), changed_values);
- const gfx::Rect expected_bounds{800, 600};
- EXPECT_EQ(observer.GetDisplay().bounds(), expected_bounds);
- const gfx::Size expected_size_in_pixels{800, 600};
- EXPECT_EQ(observer.GetDisplay().GetSizeInPixel(), expected_size_in_pixels);
- EXPECT_EQ(observer.GetDisplay().work_area(), expected_bounds);
-
- // Test work area.
- const gfx::Rect new_work_area{10, 20, 700, 500};
- const gfx::Insets expected_inset = expected_bounds.InsetsFrom(new_work_area);
- ASSERT_TRUE(output_->GetAuraOutput());
- output_->GetAuraOutput()->SetInsets(expected_inset);
- output_->Flush();
-
- Sync();
-
- changed_values = display::DisplayObserver::DISPLAY_METRIC_WORK_AREA;
- EXPECT_EQ(observer.GetAndClearChangedMetrics(), changed_values);
- // Bounds should be unchanged.
- EXPECT_EQ(observer.GetDisplay().bounds(), expected_bounds);
- EXPECT_EQ(observer.GetDisplay().GetSizeInPixel(), expected_size_in_pixels);
- // Work area should have new value.
- EXPECT_EQ(observer.GetDisplay().work_area(), new_work_area);
-
- // Test scaling.
- const int32_t new_scale_value = 2;
- output_->SetScale(new_scale_value);
- output_->Flush();
-
- Sync();
-
- changed_values =
- display::DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR |
- display::DisplayObserver::DISPLAY_METRIC_WORK_AREA |
- display::DisplayObserver::DISPLAY_METRIC_BOUNDS;
- EXPECT_EQ(observer.GetAndClearChangedMetrics(), changed_values);
- EXPECT_EQ(observer.GetDisplay().device_scale_factor(), new_scale_value);
- // Logical bounds should shrink due to scaling.
- const gfx::Rect scaled_bounds{400, 300};
- EXPECT_EQ(observer.GetDisplay().bounds(), scaled_bounds);
- // Size in pixel should stay unscaled.
- EXPECT_EQ(observer.GetDisplay().GetSizeInPixel(), expected_size_in_pixels);
- gfx::Rect scaled_work_area(scaled_bounds);
- scaled_work_area.Inset(expected_inset);
- EXPECT_EQ(observer.GetDisplay().work_area(), scaled_work_area);
-
- // Test rotation.
- output_->SetTransform(WL_OUTPUT_TRANSFORM_90);
- output_->Flush();
-
- Sync();
-
- changed_values = display::DisplayObserver::DISPLAY_METRIC_WORK_AREA |
- display::DisplayObserver::DISPLAY_METRIC_BOUNDS |
- display::DisplayObserver::DISPLAY_METRIC_ROTATION;
- EXPECT_EQ(observer.GetAndClearChangedMetrics(), changed_values);
- // Logical bounds should now be rotated to portrait.
- const gfx::Rect rotated_bounds{300, 400};
- EXPECT_EQ(observer.GetDisplay().bounds(), rotated_bounds);
- // Size in pixel gets rotated too, but stays unscaled.
- const gfx::Size rotated_size_in_pixels{600, 800};
- EXPECT_EQ(observer.GetDisplay().GetSizeInPixel(), rotated_size_in_pixels);
- gfx::Rect rotated_work_area(rotated_bounds);
- rotated_work_area.Inset(expected_inset);
- EXPECT_EQ(observer.GetDisplay().work_area(), rotated_work_area);
- EXPECT_EQ(observer.GetDisplay().panel_rotation(),
- display::Display::Rotation::ROTATE_270);
- EXPECT_EQ(observer.GetDisplay().rotation(),
- display::Display::Rotation::ROTATE_270);
-
- platform_screen_->RemoveObserver(&observer);
-}
-
-// Regression test for crbug.com/1310981.
-// Some devices use display panels built in portrait orientation, but are used
-// in landscape orientation. Thus their physical bounds are in portrait
-// orientation along with an offset transform, which differs from the usual
-// landscape oriented bounds.
-TEST_P(WaylandScreenTest, OutputPropertyChangesWithPortraitPanelRotation) {
- TestDisplayObserver observer;
- platform_screen_->AddObserver(&observer);
-
- // wl_output.geometry origin is set in DIP screen coordinates.
- const gfx::Point origin(50, 70);
- // wl_output.mode size is sent in physical coordinates, so it has portrait
- // dimensions for a display panel with portrait natural orientation.
- const gfx::Size physical_size(1200, 1600);
- output_->SetRect({origin, physical_size});
-
- // Inset is sent in logical coordinates.
- const gfx::Insets insets = gfx::Insets::TLBR(10, 20, 30, 40);
- ASSERT_TRUE(output_->GetAuraOutput());
- output_->GetAuraOutput()->SetInsets(insets);
-
- // Display panel's natural orientation is in portrait, so it needs a transform
- // of 90 degrees to be in landscape.
- output_->SetTransform(WL_OUTPUT_TRANSFORM_90);
- // Begin with the logical transform at 0 degrees.
- output_->GetAuraOutput()->SetLogicalTransform(WL_OUTPUT_TRANSFORM_NORMAL);
-
- output_->SetScale(2);
- output_->Flush();
-
- Sync();
-
- uint32_t changed_values =
- display::DisplayObserver::DISPLAY_METRIC_BOUNDS |
- display::DisplayObserver::DISPLAY_METRIC_WORK_AREA |
- display::DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR |
- display::DisplayObserver::DISPLAY_METRIC_ROTATION;
- EXPECT_EQ(observer.GetAndClearChangedMetrics(), changed_values);
-
- // Logical bounds should be in landscape.
- const gfx::Rect expected_bounds(origin, gfx::Size(800, 600));
- EXPECT_EQ(observer.GetDisplay().bounds(), expected_bounds);
- const gfx::Size expected_size_in_pixels(1600, 1200);
- EXPECT_EQ(observer.GetDisplay().GetSizeInPixel(), expected_size_in_pixels);
-
- gfx::Rect expected_work_area(expected_bounds);
- expected_work_area.Inset(insets);
- EXPECT_EQ(observer.GetDisplay().work_area(), expected_work_area);
-
- // Panel rotation and display rotation should have an offset.
- EXPECT_EQ(observer.GetDisplay().panel_rotation(),
- display::Display::Rotation::ROTATE_270);
- EXPECT_EQ(observer.GetDisplay().rotation(),
- display::Display::Rotation::ROTATE_0);
-
- // Further rotate the display to logical portrait orientation, which is 180
- // with the natural orientation offset.
- output_->SetTransform(WL_OUTPUT_TRANSFORM_180);
- output_->GetAuraOutput()->SetLogicalTransform(WL_OUTPUT_TRANSFORM_90);
- output_->Flush();
-
- Sync();
-
- changed_values = display::DisplayObserver::DISPLAY_METRIC_BOUNDS |
- display::DisplayObserver::DISPLAY_METRIC_WORK_AREA |
- display::DisplayObserver::DISPLAY_METRIC_ROTATION;
- EXPECT_EQ(observer.GetAndClearChangedMetrics(), changed_values);
-
- // Logical bounds should now be portrait.
- const gfx::Rect portrait_bounds(origin, gfx::Size(600, 800));
- EXPECT_EQ(observer.GetDisplay().bounds(), portrait_bounds);
- const gfx::Size portrait_size_in_pixels(1200, 1600);
- EXPECT_EQ(observer.GetDisplay().GetSizeInPixel(), portrait_size_in_pixels);
-
- gfx::Rect portrait_work_area(portrait_bounds);
- portrait_work_area.Inset(insets);
- EXPECT_EQ(observer.GetDisplay().work_area(), portrait_work_area);
-
- // Panel rotation and display rotation should still have an offset.
- EXPECT_EQ(observer.GetDisplay().panel_rotation(),
- display::Display::Rotation::ROTATE_180);
- EXPECT_EQ(observer.GetDisplay().rotation(),
- display::Display::Rotation::ROTATE_270);
-
- platform_screen_->RemoveObserver(&observer);
-}
-
TEST_P(WaylandScreenTest, OutputPropertyChangesMissingLogicalSize) {
TestDisplayObserver observer;
platform_screen_->AddObserver(&observer);
@@ -485,9 +308,9 @@ TEST_P(WaylandScreenTest, OutputPropertyChangesMissingLogicalSize) {
// Test with missing logical size. Should fall back to calculating from
// physical size.
- platform_screen_->OnOutputAddedOrUpdated(display_id, origin, gfx::Size(),
- physical_size, insets, scale,
- panel_transform, logical_transform);
+ platform_screen_->OnOutputAddedOrUpdated(
+ display_id, origin, gfx::Size(), physical_size, insets, scale,
+ panel_transform, logical_transform, "display");
const display::Display new_display(observer.GetDisplay());
EXPECT_EQ(new_display.id(), display_id);
@@ -499,6 +322,7 @@ TEST_P(WaylandScreenTest, OutputPropertyChangesMissingLogicalSize) {
EXPECT_EQ(new_display.panel_rotation(), display::Display::ROTATE_270);
EXPECT_EQ(new_display.rotation(), display::Display::ROTATE_0);
EXPECT_EQ(new_display.device_scale_factor(), scale);
+ EXPECT_EQ(new_display.label(), "display");
platform_screen_->RemoveObserver(&observer);
}
@@ -514,12 +338,12 @@ TEST_P(WaylandScreenTest, OutputPropertyChangesPrimaryDisplayChanged) {
display1.id(), display1.bounds().origin(), display1.size(),
display1.GetSizeInPixel(), display1.GetWorkAreaInsets(),
display1.device_scale_factor(), WL_OUTPUT_TRANSFORM_NORMAL,
- WL_OUTPUT_TRANSFORM_NORMAL);
+ WL_OUTPUT_TRANSFORM_NORMAL, std::string());
platform_screen_->OnOutputAddedOrUpdated(
display2.id(), display2.bounds().origin(), display2.size(),
display2.GetSizeInPixel(), display2.GetWorkAreaInsets(),
display2.device_scale_factor(), WL_OUTPUT_TRANSFORM_NORMAL,
- WL_OUTPUT_TRANSFORM_NORMAL);
+ WL_OUTPUT_TRANSFORM_NORMAL, std::string());
EXPECT_EQ(platform_screen_->GetPrimaryDisplay(), display1);
@@ -533,12 +357,12 @@ TEST_P(WaylandScreenTest, OutputPropertyChangesPrimaryDisplayChanged) {
display2.id(), display2.bounds().origin(), display2.size(),
display2.GetSizeInPixel(), display2.GetWorkAreaInsets(),
display2.device_scale_factor(), WL_OUTPUT_TRANSFORM_NORMAL,
- WL_OUTPUT_TRANSFORM_NORMAL);
+ WL_OUTPUT_TRANSFORM_NORMAL, std::string());
platform_screen_->OnOutputAddedOrUpdated(
display1.id(), display1.bounds().origin(), display1.size(),
display1.GetSizeInPixel(), display1.GetWorkAreaInsets(),
display1.device_scale_factor(), WL_OUTPUT_TRANSFORM_NORMAL,
- WL_OUTPUT_TRANSFORM_NORMAL);
+ WL_OUTPUT_TRANSFORM_NORMAL, std::string());
EXPECT_EQ(platform_screen_->GetPrimaryDisplay(), display2);
@@ -563,22 +387,22 @@ TEST_P(WaylandScreenTest, GetAcceleratedWidgetAtScreenPoint) {
EXPECT_EQ(widget_at_screen_point, gfx::kNullAcceleratedWidget);
// Set a focus to the main window. Now, that focused window must be returned.
- window_->SetPointerFocus(true);
+ SetPointerFocusedWindow(window_.get());
widget_at_screen_point =
platform_screen_->GetAcceleratedWidgetAtScreenPoint(gfx::Point(10, 10));
EXPECT_EQ(widget_at_screen_point, window_->GetWidget());
// Getting a widget at a screen point outside its bounds, must result in a
// null widget.
- const gfx::Rect window_bounds = window_->GetBoundsInPixels();
+ const gfx::Rect window_bounds = window_->GetBoundsInDIP();
widget_at_screen_point = platform_screen_->GetAcceleratedWidgetAtScreenPoint(
gfx::Point(window_bounds.width() + 1, window_bounds.height() + 1));
EXPECT_EQ(widget_at_screen_point, gfx::kNullAcceleratedWidget);
MockWaylandPlatformWindowDelegate delegate;
auto menu_window_bounds =
- gfx::Rect(window_->GetBoundsInPixels().width() - 10,
- window_->GetBoundsInPixels().height() - 10, 100, 100);
+ gfx::Rect(window_->GetBoundsInDIP().width() - 10,
+ window_->GetBoundsInDIP().height() - 10, 100, 100);
std::unique_ptr<WaylandWindow> menu_window =
CreateWaylandWindowWithProperties(menu_window_bounds,
PlatformWindowType::kMenu,
@@ -588,24 +412,23 @@ TEST_P(WaylandScreenTest, GetAcceleratedWidgetAtScreenPoint) {
// Imagine the mouse enters a menu window, which is located on top of the main
// window, and gathers focus.
- window_->SetPointerFocus(false);
- menu_window->SetPointerFocus(true);
+ SetPointerFocusedWindow(menu_window.get());
+
widget_at_screen_point = platform_screen_->GetAcceleratedWidgetAtScreenPoint(
- gfx::Point(menu_window->GetBoundsInPixels().x() + 1,
- menu_window->GetBoundsInPixels().y() + 1));
+ gfx::Point(menu_window->GetBoundsInDIP().x() + 1,
+ menu_window->GetBoundsInDIP().y() + 1));
EXPECT_EQ(widget_at_screen_point, menu_window->GetWidget());
// Whenever a mouse pointer leaves the menu window, the accelerated widget
// of that focused window must be returned.
- window_->SetPointerFocus(true);
- menu_window->SetPointerFocus(false);
+ SetPointerFocusedWindow(window_.get());
widget_at_screen_point =
platform_screen_->GetAcceleratedWidgetAtScreenPoint(gfx::Point(0, 0));
EXPECT_EQ(widget_at_screen_point, window_->GetWidget());
// Reset the focus to avoid crash on dtor as long as there is no real pointer
// object.
- window_->SetPointerFocus(false);
+ SetPointerFocusedWindow(nullptr);
// Part 2: test that the window is found when display's scale changes.
// Update scale.
@@ -614,11 +437,9 @@ TEST_P(WaylandScreenTest, GetAcceleratedWidgetAtScreenPoint) {
Sync();
- auto menu_bounds_px = menu_window->GetBoundsInPixels();
- // Translate the point to dip.
- auto point_in_screen =
- gfx::ScaleToRoundedPoint(menu_bounds_px.origin(), 1.f / 2);
- menu_window->SetPointerFocus(true);
+ auto menu_bounds = menu_window->GetBoundsInDIP();
+ auto point_in_screen = menu_bounds.origin();
+ SetPointerFocusedWindow(menu_window.get());
widget_at_screen_point =
platform_screen_->GetAcceleratedWidgetAtScreenPoint(point_in_screen);
EXPECT_EQ(widget_at_screen_point, menu_window->GetWidget());
@@ -630,7 +451,7 @@ TEST_P(WaylandScreenTest, GetLocalProcessWidgetAtPoint) {
gfx::kNullAcceleratedWidget);
// Set a focus to the main window. Now, that focused window must be returned.
- window_->SetPointerFocus(true);
+ SetPointerFocusedWindow(window_.get());
EXPECT_EQ(platform_screen_->GetLocalProcessWidgetAtPoint(point, {}),
window_->GetWidget());
@@ -640,10 +461,6 @@ TEST_P(WaylandScreenTest, GetLocalProcessWidgetAtPoint) {
EXPECT_EQ(
platform_screen_->GetLocalProcessWidgetAtPoint(point, {w - 1, w, w + 1}),
gfx::kNullAcceleratedWidget);
-
- // Reset the focus to avoid crash on dtor as long as there is no real pointer
- // object.
- window_->SetPointerFocus(false);
}
TEST_P(WaylandScreenTest, GetDisplayMatching) {
@@ -821,6 +638,7 @@ TEST_P(WaylandScreenTest, GetCursorScreenPoint) {
uint32_t time = 1002;
wl_pointer_send_enter(pointer->resource(), ++serial, surface->resource(), 0,
0);
+ wl_pointer_send_frame(pointer->resource());
wl_pointer_send_motion(pointer->resource(), ++time, wl_fixed_from_int(10),
wl_fixed_from_int(20));
@@ -834,8 +652,10 @@ TEST_P(WaylandScreenTest, GetCursorScreenPoint) {
ASSERT_TRUE(second_surface);
// Now, leave the first surface and enter second one.
wl_pointer_send_leave(pointer->resource(), ++serial, surface->resource());
+ wl_pointer_send_frame(pointer->resource());
wl_pointer_send_enter(pointer->resource(), ++serial,
second_surface->resource(), 0, 0);
+ wl_pointer_send_frame(pointer->resource());
wl_pointer_send_motion(pointer->resource(), ++time, wl_fixed_from_int(20),
wl_fixed_from_int(10));
@@ -847,16 +667,17 @@ TEST_P(WaylandScreenTest, GetCursorScreenPoint) {
// Clear pointer focus.
wl_pointer_send_leave(pointer->resource(), ++serial,
second_surface->resource());
+ wl_pointer_send_frame(pointer->resource());
Sync();
// WaylandScreen must return a point, which is located outside of bounds of
// any window. Basically, it means that it takes the largest window and adds
// 10 pixels to its width and height, and returns the value.
- const gfx::Rect second_window_bounds = second_window->GetBoundsInPixels();
+ const gfx::Rect second_window_bounds = second_window->GetBoundsInDIP();
// A second window has largest bounds. Thus, these bounds must be taken as a
// ground for the point outside any of the surfaces.
- ASSERT_TRUE(window_->GetBoundsInPixels() < second_window_bounds);
+ ASSERT_TRUE(window_->GetBoundsInDIP() < second_window_bounds);
EXPECT_EQ(gfx::Point(second_window_bounds.width() + 10,
second_window_bounds.height() + 10),
platform_screen_->GetCursorScreenPoint());
@@ -877,6 +698,7 @@ TEST_P(WaylandScreenTest, GetCursorScreenPoint) {
wl_pointer_send_enter(pointer->resource(), ++serial, menu_surface->resource(),
0, 0);
+ wl_pointer_send_frame(pointer->resource());
wl_pointer_send_motion(pointer->resource(), ++time, wl_fixed_from_int(2),
wl_fixed_from_int(1));
@@ -892,8 +714,10 @@ TEST_P(WaylandScreenTest, GetCursorScreenPoint) {
// Leave the menu window and enter the top level window.
wl_pointer_send_leave(pointer->resource(), ++serial,
menu_surface->resource());
+ wl_pointer_send_frame(pointer->resource());
wl_pointer_send_enter(pointer->resource(), ++serial,
second_surface->resource(), 0, 0);
+ wl_pointer_send_frame(pointer->resource());
wl_pointer_send_motion(pointer->resource(), ++time, wl_fixed_from_int(1912),
wl_fixed_from_int(1071));
@@ -905,11 +729,12 @@ TEST_P(WaylandScreenTest, GetCursorScreenPoint) {
wl_pointer_send_leave(pointer->resource(), ++serial,
second_surface->resource());
+ wl_pointer_send_frame(pointer->resource());
// Now, create a nested menu window and make sure that the cursor screen point
// still has been correct. The location of the window is on the right side of
// the main menu window.
- const gfx::Rect menu_window_bounds = menu_window->GetBoundsInPixels();
+ const gfx::Rect menu_window_bounds = menu_window->GetBoundsInDIP();
std::unique_ptr<WaylandWindow> nested_menu_window =
CreateWaylandWindowWithProperties(
gfx::Rect(menu_window_bounds.x() + menu_window_bounds.width(),
@@ -924,6 +749,7 @@ TEST_P(WaylandScreenTest, GetCursorScreenPoint) {
wl_pointer_send_enter(pointer->resource(), ++serial,
nested_menu_surface->resource(), 0, 0);
+ wl_pointer_send_frame(pointer->resource());
wl_pointer_send_motion(pointer->resource(), ++time, wl_fixed_from_int(2),
wl_fixed_from_int(3));
@@ -935,8 +761,10 @@ TEST_P(WaylandScreenTest, GetCursorScreenPoint) {
// point still must be reported correctly.
wl_pointer_send_leave(pointer->resource(), ++serial,
nested_menu_surface->resource());
+ wl_pointer_send_frame(pointer->resource());
wl_pointer_send_enter(pointer->resource(), ++serial, menu_surface->resource(),
0, 0);
+ wl_pointer_send_frame(pointer->resource());
wl_pointer_send_motion(pointer->resource(), ++time, wl_fixed_from_int(2),
wl_fixed_from_int(1));
@@ -987,6 +815,36 @@ TEST_P(WaylandScreenTest, SetWindowScale) {
display::Display::ResetForceDeviceScaleFactorForTesting();
}
+// Regression test for https://crbug.com/1346534.
+//
+// Scenario: With (at least) one output connected and a surface, with no output
+// associated yet, ie: wl_surface.enter event not received yet for that surface,
+// which implies in its scale being set to the primary output's scale at its
+// initialization, any primary output scale update (or other properties that
+// lead to scale change) must be propagated to the window.
+TEST_P(WaylandScreenTest, SetWindowScaleWithoutEnteredOutput) {
+ // Test pre-conditions: single output setup whereas |output_| is the primary
+ // output managed by |output_manager_|, with initial scale == 1.
+ ASSERT_EQ(1u, output_manager_->GetAllOutputs().size());
+ ASSERT_TRUE(output_);
+ ASSERT_EQ(1, output_->GetScale());
+
+ // Ensure |surface_| has not entered any wl_output. Assuming |window_| has
+ // been already initialized with |output_|'s scale.
+ wl_surface_send_leave(surface_->resource(), output_->resource());
+ Sync();
+ ASSERT_EQ(0u, window_->GetPreferredEnteredOutputId());
+
+ // Change |output_|'s scale and make sure |window_|'s scale is update
+ // accordingly.
+ output_->SetScale(2);
+ output_->Flush();
+ Sync();
+
+ EXPECT_EQ(window_->window_scale(), 2);
+ EXPECT_EQ(window_->ui_scale(), 2);
+}
+
// Checks that output transform is properly translated into Display orientation.
// The first one is counter-clockwise, while the latter is clockwise.
TEST_P(WaylandScreenTest, Transform) {
@@ -1058,9 +916,9 @@ class LazilyConfiguredScreenTest
aux_output_->SetRect({0, 0, 800, 600});
}
- wl::TestOutput* primary_output_ = nullptr;
- wl::TestOutput* aux_output_ = nullptr;
- WaylandOutputManager* output_manager_ = nullptr;
+ raw_ptr<wl::TestOutput> primary_output_ = nullptr;
+ raw_ptr<wl::TestOutput> aux_output_ = nullptr;
+ raw_ptr<WaylandOutputManager> output_manager_ = nullptr;
bool auto_configure;
};
@@ -1089,10 +947,202 @@ TEST_P(LazilyConfiguredScreenTest, DualOutput) {
EXPECT_EQ(2u, screen_->GetAllDisplays().size());
}
+// Tests that use aura-shell extension should use wl::ShellVersion::kStable.
+class WaylandAuraShellScreenTest : public WaylandScreenTest {
+ public:
+ WaylandAuraShellScreenTest() = default;
+ WaylandAuraShellScreenTest(const WaylandAuraShellScreenTest&) = delete;
+ WaylandAuraShellScreenTest& operator=(const WaylandAuraShellScreenTest&) =
+ delete;
+ ~WaylandAuraShellScreenTest() override = default;
+
+ void SetUp() override {
+ ASSERT_EQ(GetParam().shell_version, wl::ShellVersion::kStable);
+ WaylandScreenTest::SetUp();
+ }
+};
+
+TEST_P(WaylandAuraShellScreenTest, OutputPropertyChanges) {
+ TestDisplayObserver observer;
+ platform_screen_->AddObserver(&observer);
+
+ const gfx::Rect physical_bounds{800, 600};
+ output_->SetRect(physical_bounds);
+ output_->Flush();
+
+ Sync();
+
+ uint32_t changed_values = display::DisplayObserver::DISPLAY_METRIC_BOUNDS |
+ display::DisplayObserver::DISPLAY_METRIC_WORK_AREA;
+ EXPECT_EQ(observer.GetAndClearChangedMetrics(), changed_values);
+ const gfx::Rect expected_bounds{800, 600};
+ EXPECT_EQ(observer.GetDisplay().bounds(), expected_bounds);
+ const gfx::Size expected_size_in_pixels{800, 600};
+ EXPECT_EQ(observer.GetDisplay().GetSizeInPixel(), expected_size_in_pixels);
+ EXPECT_EQ(observer.GetDisplay().work_area(), expected_bounds);
+
+ // Test work area.
+ const gfx::Rect new_work_area{10, 20, 700, 500};
+ const gfx::Insets expected_inset = expected_bounds.InsetsFrom(new_work_area);
+ ASSERT_TRUE(output_->GetAuraOutput());
+ output_->GetAuraOutput()->SetInsets(expected_inset);
+ output_->Flush();
+
+ Sync();
+
+ changed_values = display::DisplayObserver::DISPLAY_METRIC_WORK_AREA;
+ EXPECT_EQ(observer.GetAndClearChangedMetrics(), changed_values);
+ // Bounds should be unchanged.
+ EXPECT_EQ(observer.GetDisplay().bounds(), expected_bounds);
+ EXPECT_EQ(observer.GetDisplay().GetSizeInPixel(), expected_size_in_pixels);
+ // Work area should have new value.
+ EXPECT_EQ(observer.GetDisplay().work_area(), new_work_area);
+
+ // Test scaling.
+ const int32_t new_scale_value = 2;
+ output_->SetScale(new_scale_value);
+ output_->Flush();
+
+ Sync();
+
+ changed_values =
+ display::DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR |
+ display::DisplayObserver::DISPLAY_METRIC_WORK_AREA |
+ display::DisplayObserver::DISPLAY_METRIC_BOUNDS;
+ EXPECT_EQ(observer.GetAndClearChangedMetrics(), changed_values);
+ EXPECT_EQ(observer.GetDisplay().device_scale_factor(), new_scale_value);
+ // Logical bounds should shrink due to scaling.
+ const gfx::Rect scaled_bounds{400, 300};
+ EXPECT_EQ(observer.GetDisplay().bounds(), scaled_bounds);
+ // Size in pixel should stay unscaled.
+ EXPECT_EQ(observer.GetDisplay().GetSizeInPixel(), expected_size_in_pixels);
+ gfx::Rect scaled_work_area(scaled_bounds);
+ scaled_work_area.Inset(expected_inset);
+ EXPECT_EQ(observer.GetDisplay().work_area(), scaled_work_area);
+
+ // Test rotation.
+ output_->SetTransform(WL_OUTPUT_TRANSFORM_90);
+ output_->Flush();
+
+ Sync();
+
+ changed_values = display::DisplayObserver::DISPLAY_METRIC_WORK_AREA |
+ display::DisplayObserver::DISPLAY_METRIC_BOUNDS |
+ display::DisplayObserver::DISPLAY_METRIC_ROTATION;
+ EXPECT_EQ(observer.GetAndClearChangedMetrics(), changed_values);
+ // Logical bounds should now be rotated to portrait.
+ const gfx::Rect rotated_bounds{300, 400};
+ EXPECT_EQ(observer.GetDisplay().bounds(), rotated_bounds);
+ // Size in pixel gets rotated too, but stays unscaled.
+ const gfx::Size rotated_size_in_pixels{600, 800};
+ EXPECT_EQ(observer.GetDisplay().GetSizeInPixel(), rotated_size_in_pixels);
+ gfx::Rect rotated_work_area(rotated_bounds);
+ rotated_work_area.Inset(expected_inset);
+ EXPECT_EQ(observer.GetDisplay().work_area(), rotated_work_area);
+ EXPECT_EQ(observer.GetDisplay().panel_rotation(),
+ display::Display::Rotation::ROTATE_270);
+ EXPECT_EQ(observer.GetDisplay().rotation(),
+ display::Display::Rotation::ROTATE_270);
+
+ platform_screen_->RemoveObserver(&observer);
+}
+
+// Regression test for crbug.com/1310981.
+// Some devices use display panels built in portrait orientation, but are used
+// in landscape orientation. Thus their physical bounds are in portrait
+// orientation along with an offset transform, which differs from the usual
+// landscape oriented bounds.
+TEST_P(WaylandAuraShellScreenTest,
+ OutputPropertyChangesWithPortraitPanelRotation) {
+ TestDisplayObserver observer;
+ platform_screen_->AddObserver(&observer);
+
+ // wl_output.geometry origin is set in DIP screen coordinates.
+ const gfx::Point origin(50, 70);
+ // wl_output.mode size is sent in physical coordinates, so it has portrait
+ // dimensions for a display panel with portrait natural orientation.
+ const gfx::Size physical_size(1200, 1600);
+ output_->SetRect({origin, physical_size});
+
+ // Inset is sent in logical coordinates.
+ const gfx::Insets insets = gfx::Insets::TLBR(10, 20, 30, 40);
+ ASSERT_TRUE(output_->GetAuraOutput());
+ output_->GetAuraOutput()->SetInsets(insets);
+
+ // Display panel's natural orientation is in portrait, so it needs a transform
+ // of 90 degrees to be in landscape.
+ output_->SetTransform(WL_OUTPUT_TRANSFORM_90);
+ // Begin with the logical transform at 0 degrees.
+ output_->GetAuraOutput()->SetLogicalTransform(WL_OUTPUT_TRANSFORM_NORMAL);
+
+ output_->SetScale(2);
+ output_->Flush();
+
+ Sync();
+
+ uint32_t changed_values =
+ display::DisplayObserver::DISPLAY_METRIC_BOUNDS |
+ display::DisplayObserver::DISPLAY_METRIC_WORK_AREA |
+ display::DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR |
+ display::DisplayObserver::DISPLAY_METRIC_ROTATION;
+ EXPECT_EQ(observer.GetAndClearChangedMetrics(), changed_values);
+
+ // Logical bounds should be in landscape.
+ const gfx::Rect expected_bounds(origin, gfx::Size(800, 600));
+ EXPECT_EQ(observer.GetDisplay().bounds(), expected_bounds);
+ const gfx::Size expected_size_in_pixels(1600, 1200);
+ EXPECT_EQ(observer.GetDisplay().GetSizeInPixel(), expected_size_in_pixels);
+
+ gfx::Rect expected_work_area(expected_bounds);
+ expected_work_area.Inset(insets);
+ EXPECT_EQ(observer.GetDisplay().work_area(), expected_work_area);
+
+ // Panel rotation and display rotation should have an offset.
+ EXPECT_EQ(observer.GetDisplay().panel_rotation(),
+ display::Display::Rotation::ROTATE_270);
+ EXPECT_EQ(observer.GetDisplay().rotation(),
+ display::Display::Rotation::ROTATE_0);
+
+ // Further rotate the display to logical portrait orientation, which is 180
+ // with the natural orientation offset.
+ output_->SetTransform(WL_OUTPUT_TRANSFORM_180);
+ output_->GetAuraOutput()->SetLogicalTransform(WL_OUTPUT_TRANSFORM_90);
+ output_->Flush();
+
+ Sync();
+
+ changed_values = display::DisplayObserver::DISPLAY_METRIC_BOUNDS |
+ display::DisplayObserver::DISPLAY_METRIC_WORK_AREA |
+ display::DisplayObserver::DISPLAY_METRIC_ROTATION;
+ EXPECT_EQ(observer.GetAndClearChangedMetrics(), changed_values);
+
+ // Logical bounds should now be portrait.
+ const gfx::Rect portrait_bounds(origin, gfx::Size(600, 800));
+ EXPECT_EQ(observer.GetDisplay().bounds(), portrait_bounds);
+ const gfx::Size portrait_size_in_pixels(1200, 1600);
+ EXPECT_EQ(observer.GetDisplay().GetSizeInPixel(), portrait_size_in_pixels);
+
+ gfx::Rect portrait_work_area(portrait_bounds);
+ portrait_work_area.Inset(insets);
+ EXPECT_EQ(observer.GetDisplay().work_area(), portrait_work_area);
+
+ // Panel rotation and display rotation should still have an offset.
+ EXPECT_EQ(observer.GetDisplay().panel_rotation(),
+ display::Display::Rotation::ROTATE_180);
+ EXPECT_EQ(observer.GetDisplay().rotation(),
+ display::Display::Rotation::ROTATE_270);
+
+ platform_screen_->RemoveObserver(&observer);
+}
+
INSTANTIATE_TEST_SUITE_P(XdgVersionStableTest,
WaylandScreenTest,
Values(wl::ServerConfig{
.shell_version = wl::ShellVersion::kStable}));
+INSTANTIATE_TEST_SUITE_P(XdgVersionStableTest,
+ WaylandAuraShellScreenTest,
+ Values(wl::ServerConfig{
+ .shell_version = wl::ShellVersion::kStable}));
INSTANTIATE_TEST_SUITE_P(XdgVersionV6Test,
WaylandScreenTest,
Values(wl::ServerConfig{
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_seat.h b/chromium/ui/ozone/platform/wayland/host/wayland_seat.h
index db07a4ea2e9..2139c13ac49 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_seat.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_seat.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
namespace ui {
@@ -59,7 +60,7 @@ class WaylandSeat : public wl::GlobalObjectRegistrar<WaylandSeat> {
// Wayland object wrapped by this class.
wl::Object<wl_seat> obj_;
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
// Input device objects.
std::unique_ptr<WaylandKeyboard> keyboard_;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_shm.cc b/chromium/ui/ozone/platform/wayland/host/wayland_shm.cc
index 3869b2858a7..b6de107bc0f 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_shm.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_shm.cc
@@ -5,6 +5,7 @@
#include "ui/ozone/platform/wayland/host/wayland_shm.h"
#include "base/logging.h"
+#include "ui/ozone/platform/wayland/host/wayland_buffer_factory.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
namespace ui {
@@ -24,7 +25,8 @@ void WaylandShm::Instantiate(WaylandConnection* connection,
uint32_t version) {
DCHECK_EQ(interface, kInterfaceName);
- if (connection->shm_ ||
+ auto* buffer_factory = connection->wayland_buffer_factory();
+ if (buffer_factory->wayland_shm_ ||
!wl::CanBind(interface, version, kMinVersion, kMinVersion)) {
return;
}
@@ -34,7 +36,8 @@ void WaylandShm::Instantiate(WaylandConnection* connection,
LOG(ERROR) << "Failed to bind to wl_shm global";
return;
}
- connection->shm_ = std::make_unique<WaylandShm>(shm.release(), connection);
+ buffer_factory->wayland_shm_ =
+ std::make_unique<WaylandShm>(shm.release(), connection);
}
WaylandShm::WaylandShm(wl_shm* shm, WaylandConnection* connection)
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_shm.h b/chromium/ui/ozone/platform/wayland/host/wayland_shm.h
index af32d3cdd01..7d137c196b0 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_shm.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_shm.h
@@ -6,6 +6,7 @@
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_SHM_H_
#include "base/files/scoped_file.h"
+#include "base/memory/raw_ptr.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include "ui/ozone/platform/wayland/common/wayland_util.h"
@@ -38,19 +39,16 @@ class WaylandShm : public wl::GlobalObjectRegistrar<WaylandShm> {
// Creates a wl_buffer based on shared memory handle with the specified
// |length| and |size|. Whereas |with_alpha_channel| indicates whether the
// buffer's color format should use or not the alpha channel.
- //
- // TODO(crbug.com/1269044): Remove |with_alpha_channel| parameter once
- // Exo-side Skia Renderer issue is fixed.
wl::Object<struct wl_buffer> CreateBuffer(const base::ScopedFD& fd,
size_t length,
const gfx::Size& size,
- bool with_alpha_channel = true);
+ bool with_alpha_channel);
private:
wl::Object<wl_shm> const shm_;
// Non-owned pointer to the main connection.
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_shm_buffer.cc b/chromium/ui/ozone/platform/wayland/host/wayland_shm_buffer.cc
index 0592613cb1f..7f88515c4b1 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_shm_buffer.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_shm_buffer.cc
@@ -8,14 +8,15 @@
#include "base/memory/platform_shared_memory_region.h"
#include "base/memory/unsafe_shared_memory_region.h"
#include "ui/gfx/geometry/skia_conversions.h"
+#include "ui/ozone/platform/wayland/host/wayland_buffer_factory.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
-#include "ui/ozone/platform/wayland/host/wayland_shm.h"
namespace ui {
-WaylandShmBuffer::WaylandShmBuffer(WaylandShm* shm, const gfx::Size& size)
+WaylandShmBuffer::WaylandShmBuffer(WaylandBufferFactory* buffer_factory,
+ const gfx::Size& size)
: size_(size) {
- Initialize(shm);
+ Initialize(buffer_factory);
}
WaylandShmBuffer::~WaylandShmBuffer() = default;
@@ -23,8 +24,8 @@ WaylandShmBuffer::WaylandShmBuffer(WaylandShmBuffer&& buffer) = default;
WaylandShmBuffer& WaylandShmBuffer::operator=(WaylandShmBuffer&& buffer) =
default;
-void WaylandShmBuffer::Initialize(WaylandShm* shm) {
- DCHECK(shm);
+void WaylandShmBuffer::Initialize(WaylandBufferFactory* buffer_factory) {
+ DCHECK(buffer_factory);
SkImageInfo info = SkImageInfo::MakeN32Premul(size_.width(), size_.height());
int stride = info.minRowBytes();
@@ -46,7 +47,8 @@ void WaylandShmBuffer::Initialize(WaylandShm* shm) {
base::subtle::ScopedFDPair fd_pair =
platform_shared_memory.PassPlatformHandle();
- buffer_ = shm->CreateBuffer(std::move(fd_pair.fd), buffer_size, size_);
+ buffer_ = buffer_factory->CreateShmBuffer(std::move(fd_pair.fd), buffer_size,
+ size_);
if (!buffer_) {
shared_memory_mapping_ = base::WritableSharedMemoryMapping();
return;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_shm_buffer.h b/chromium/ui/ozone/platform/wayland/host/wayland_shm_buffer.h
index 01ad3013238..6e366f1d9f3 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_shm_buffer.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_shm_buffer.h
@@ -13,7 +13,7 @@
namespace ui {
-class WaylandShm;
+class WaylandBufferFactory;
// Encapsulates a Wayland SHM buffer, covering basically 2 use cases:
// (1) Buffers created and mmap'ed locally to draw skia bitmap(s) into; and
@@ -23,7 +23,7 @@ class WaylandShm;
// wl_buffer and WritableSharedMemoryMapping (if any) instance.
class WaylandShmBuffer {
public:
- WaylandShmBuffer(WaylandShm* shm, const gfx::Size& size);
+ WaylandShmBuffer(WaylandBufferFactory* buffer_factory, const gfx::Size& size);
WaylandShmBuffer(const WaylandShmBuffer&) = delete;
WaylandShmBuffer& operator=(const WaylandShmBuffer&) = delete;
@@ -50,7 +50,7 @@ class WaylandShmBuffer {
int stride() const { return stride_; }
private:
- void Initialize(WaylandShm* shm);
+ void Initialize(WaylandBufferFactory* buffer_factory);
gfx::Size size_;
int stride_;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_subsurface.h b/chromium/ui/ozone/platform/wayland/host/wayland_subsurface.h
index db2455a47b7..e829aed84cd 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_subsurface.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_subsurface.h
@@ -6,6 +6,7 @@
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_SUBSURFACE_H_
#include "base/containers/linked_list.h"
+#include "base/memory/raw_ptr.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include "ui/ozone/platform/wayland/host/wayland_surface.h"
@@ -63,10 +64,10 @@ class WaylandSubsurface : public base::LinkNode<WaylandSubsurface> {
wl::Object<augmented_sub_surface> augmented_subsurface_;
gfx::PointF position_dip_;
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
// |parent_| refers to the WaylandWindow whose wl_surface is the parent to
// this subsurface.
- WaylandWindow* const parent_;
+ const raw_ptr<WaylandWindow> parent_;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_surface.cc b/chromium/ui/ozone/platform/wayland/host/wayland_surface.cc
index 8d3139f77a4..77e002a38fd 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_surface.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_surface.cc
@@ -83,7 +83,8 @@ WaylandSurface::~WaylandSurface() {
if (explicit_release_callback_.is_null())
return;
for (auto& release : linux_buffer_releases_) {
- explicit_release_callback_.Run(release.second.buffer, base::ScopedFD());
+ explicit_release_callback_.Run(release.second.buffer.get(),
+ base::ScopedFD());
}
}
@@ -277,38 +278,17 @@ wl::Object<wl_region> WaylandSurface::CreateAndAddRegion(
wl::Object<wl_region> region(
wl_compositor_create_region(connection_->compositor()));
- auto window_shape_in_dips = root_window_->GetWindowShape();
-
- bool surface_submission_in_pixel_coordinates =
+ const bool surface_submission_in_pixel_coordinates =
SurfaceSubmissionInPixelCoordinates();
- // Only root_surface and primary_subsurface should use |window_shape_in_dips|.
- // Do not use non empty |window_shape_in_dips| if |region_px| is empty, i.e.
- // this surface is transluscent.
- bool is_primary_or_root =
- root_window_->root_surface() == this ||
- (root_window()->primary_subsurface() &&
- root_window()->primary_subsurface()->wayland_surface() == this);
- bool is_empty =
- std::all_of(region_px.begin(), region_px.end(),
- [](const gfx::Rect& rect) { return rect.IsEmpty(); });
- if (window_shape_in_dips.has_value() && !is_empty && is_primary_or_root) {
- for (auto& rect : window_shape_in_dips.value()) {
- if (surface_submission_in_pixel_coordinates)
- rect = gfx::ScaleToEnclosingRect(rect, root_window_->window_scale());
+ for (const auto& rect_px : region_px) {
+ if (surface_submission_in_pixel_coordinates) {
+ wl_region_add(region.get(), rect_px.x(), rect_px.y(), rect_px.width(),
+ rect_px.height());
+ } else {
+ gfx::Rect rect = gfx::ScaleToEnclosingRect(rect_px, 1.f / buffer_scale);
wl_region_add(region.get(), rect.x(), rect.y(), rect.width(),
rect.height());
}
- } else {
- for (const auto& rect_px : region_px) {
- if (surface_submission_in_pixel_coordinates) {
- wl_region_add(region.get(), rect_px.x(), rect_px.y(), rect_px.width(),
- rect_px.height());
- } else {
- gfx::Rect rect = gfx::ScaleToEnclosingRect(rect_px, 1.f / buffer_scale);
- wl_region_add(region.get(), rect.x(), rect.y(), rect.width(),
- rect.height());
- }
- }
}
return region;
}
@@ -698,7 +678,7 @@ void WaylandSurface::ExplicitRelease(
DCHECK(iter != linux_buffer_releases_.end());
DCHECK(iter->second.buffer);
if (!explicit_release_callback_.is_null())
- explicit_release_callback_.Run(iter->second.buffer, std::move(fence));
+ explicit_release_callback_.Run(iter->second.buffer.get(), std::move(fence));
linux_buffer_releases_.erase(iter);
}
@@ -806,7 +786,7 @@ void WaylandSurface::SetRoundedClipBounds(
}
void WaylandSurface::SetBackgroundColor(
- absl::optional<SkColor> background_color) {
+ absl::optional<SkColor4f> background_color) {
if (GetAugmentedSurface())
pending_state_.background_color = background_color;
}
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_surface.h b/chromium/ui/ozone/platform/wayland/host/wayland_surface.h
index 7b5dec9d11c..526a5982651 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_surface.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_surface.h
@@ -11,6 +11,7 @@
#include "base/callback.h"
#include "base/containers/flat_map.h"
#include "base/files/scoped_file.h"
+#include "base/memory/raw_ptr.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/gfx/geometry/rect.h"
@@ -159,7 +160,7 @@ class WaylandSurface {
// Sets the background color for this surface, which will be blended with the
// wl_buffer contents during the compositing step on the Wayland compositor
// side.
- void SetBackgroundColor(absl::optional<SkColor> background_color);
+ void SetBackgroundColor(absl::optional<SkColor4f> background_color);
// Validates the |pending_state_| and generates the corresponding requests.
// Then copy |pending_states_| to |states_|.
@@ -196,7 +197,7 @@ class WaylandSurface {
wl::Object<zwp_linux_buffer_release_v1> linux_buffer_release;
// The buffer associated with this explicit release.
- wl_buffer* buffer;
+ raw_ptr<wl_buffer> buffer;
};
struct State {
@@ -217,7 +218,7 @@ class WaylandSurface {
// buffer_handle owning this wl_buffer is destroyed. Accessing this field
// should ensure wl_buffer exists by calling
// WaylandBufferManagerHost::EnsureBufferHandle(buffer_id).
- wl_buffer* buffer = nullptr;
+ raw_ptr<wl_buffer> buffer = nullptr;
gfx::Size buffer_size_px;
// Current scale factor of a next attached buffer used by the GPU process.
@@ -252,7 +253,7 @@ class WaylandSurface {
// Optional background color for this surface. This information
// can be used by Wayland compositor to correctly display delegated textures
// which require background color applied.
- absl::optional<SkColor> background_color;
+ absl::optional<SkColor4f> background_color;
};
// Tracks the last sent src and dst values across wayland protocol s.t. we
@@ -282,8 +283,8 @@ class WaylandSurface {
zwp_linux_surface_synchronization_v1* GetSurfaceSync();
augmented_surface* GetAugmentedSurface();
- WaylandConnection* const connection_;
- WaylandWindow* root_window_ = nullptr;
+ const raw_ptr<WaylandConnection> connection_;
+ raw_ptr<WaylandWindow> root_window_ = nullptr;
bool apply_state_immediately_ = false;
wl::Object<wl_surface> surface_;
wl::Object<wp_viewport> viewport_;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc b/chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
index 27b58bfd058..079bf56a31e 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
@@ -29,6 +29,7 @@
#include "ui/ozone/platform/wayland/host/wayland_window_drag_controller.h"
#include "ui/ozone/platform/wayland/host/wayland_zaura_shell.h"
#include "ui/ozone/platform/wayland/host/wayland_zwp_pointer_constraints.h"
+#include "ui/ozone/platform/wayland/host/xdg_activation.h"
#include "ui/platform_window/common/platform_window_defaults.h"
#include "ui/platform_window/extensions/wayland_extension.h"
@@ -93,9 +94,8 @@ bool WaylandToplevelWindow::CreateShellToplevel() {
ZAURA_SURFACE_FRAME_TYPE_SHADOW);
}
- // TODO(oshima): Change to use DIP.
if (screen_coordinates_enabled_)
- SetBoundsInPixels(GetBoundsInPixels());
+ SetBoundsInDIP(GetBoundsInDIP());
// This could be the proper time to update window mask using
// NonClientView::GetWindowMask, since |non_client_view| is not created yet
@@ -106,7 +106,7 @@ bool WaylandToplevelWindow::CreateShellToplevel() {
}
void WaylandToplevelWindow::ApplyPendingBounds() {
- if (HasPendingConfigures()) {
+ if (has_pending_configures()) {
DCHECK(shell_toplevel_);
WaylandWindow::ApplyPendingBounds();
}
@@ -153,6 +153,10 @@ void WaylandToplevelWindow::Hide() {
}
WaylandWindow::Hide();
+ if (aura_surface_ && wl::get_version_of_object(aura_surface_.get()) >=
+ ZAURA_SURFACE_RELEASE_SINCE_VERSION) {
+ aura_surface_.reset();
+ }
shell_toplevel_.reset();
connection()->ScheduleFlush();
}
@@ -236,6 +240,8 @@ void WaylandToplevelWindow::Activate() {
if (aura_surface_ && zaura_surface_get_version(aura_surface_.get()) >=
ZAURA_SURFACE_ACTIVATE_SINCE_VERSION) {
zaura_surface_activate(aura_surface_.get());
+ } else if (connection()->xdg_activation()) {
+ connection()->xdg_activation()->Activate(root_surface()->surface());
} else if (gtk_surface1_) {
gtk_surface1_->RequestFocus();
}
@@ -324,9 +330,8 @@ void WaylandToplevelWindow::SetAspectRatio(const gfx::SizeF& aspect_ratio) {
}
}
-absl::optional<std::vector<gfx::Rect>> WaylandToplevelWindow::GetWindowShape()
- const {
- return window_shape_in_dips_;
+bool WaylandToplevelWindow::IsScreenCoordinatesEnabled() const {
+ return screen_coordinates_enabled_;
}
// static
@@ -409,14 +414,13 @@ void WaylandToplevelWindow::HandleAuraToplevelConfigure(int32_t x,
bounds_dip.set_origin({x, y});
}
} else if (is_normal) {
- gfx::Size size_in_dip = restored_size_dip().IsEmpty()
- ? GetBoundsInDIP().size()
- : restored_size_dip();
- bounds_dip.set_origin(gfx::Point(x, y));
- bounds_dip.set_size(size_in_dip);
+ bounds_dip = !restored_size_dip().IsEmpty() ? gfx::Rect(restored_size_dip())
+ : GetBoundsInDIP();
}
set_pending_bounds_dip(AdjustBoundsToConstraintsDIP(bounds_dip));
+ set_pending_size_px(
+ delegate()->ConvertRectToPixels(pending_bounds_dip()).size());
// Store the restored bounds if current state differs from the normal state.
// It can be client or compositor side change from normal to something else.
@@ -442,33 +446,41 @@ void WaylandToplevelWindow::SetBoundsInPixels(const gfx::Rect& bounds) {
}
}
+void WaylandToplevelWindow::SetBoundsInDIP(const gfx::Rect& bounds_dip) {
+ WaylandWindow::SetBoundsInDIP(bounds_dip);
+ if (shell_toplevel_ && screen_coordinates_enabled_)
+ shell_toplevel_->RequestWindowBounds(bounds_dip);
+}
+
void WaylandToplevelWindow::SetOrigin(const gfx::Point& origin) {
- // TODO(crbug.com/1306688): Using UpdateBoundsInDIP changes the size of the
- // window due to the rounding. Change this to use SetBoundsInDIP when
- // `bounds_px_` becomes `bounds_dip_`.
- gfx::Point origin_px =
- gfx::ScaleToFlooredPoint(origin, window_scale(), window_scale());
- WaylandWindow::SetBoundsInPixels(
- gfx::Rect(origin_px, GetBoundsInPixels().size()));
+ gfx::Rect new_bounds(origin, GetBoundsInDIP().size());
+ WaylandWindow::SetBoundsInDIP(new_bounds);
}
void WaylandToplevelWindow::HandleSurfaceConfigure(uint32_t serial) {
ProcessPendingBoundsDip(serial);
set_pending_bounds_dip({});
+ set_pending_size_px({});
}
-void WaylandToplevelWindow::UpdateVisualSize(const gfx::Size& size_px,
- float scale_factor) {
- WaylandWindow::UpdateVisualSize(size_px, scale_factor);
+void WaylandToplevelWindow::UpdateVisualSize(const gfx::Size& size_px) {
+ WaylandWindow::UpdateVisualSize(size_px);
if (!shell_toplevel_)
return;
- if (!ProcessVisualSizeUpdate(size_px, scale_factor) &&
- set_geometry_on_next_frame_) {
- auto size_dip = gfx::ScaleToRoundedSize(size_px, 1.f / scale_factor);
- SetWindowGeometry(gfx::Rect(size_dip));
- set_geometry_on_next_frame_ = false;
+ if (!ProcessVisualSizeUpdate(size_px)) {
+ // Early-out if shell surface is still not configure at this point, which
+ // indicates it is not mapped yet, which should happen in an upcoming frame.
+ if (!shell_toplevel()->IsConfigured())
+ return;
+
+ if (set_geometry_on_next_frame_) {
+ auto size_dip = gfx::ScaleToRoundedSize(size_px, 1.f / window_scale());
+ // TODO(crbug.com/3814157): Use DIP bounds instead.
+ SetWindowGeometry(gfx::Rect(size_dip));
+ set_geometry_on_next_frame_ = false;
+ }
}
// UpdateVisualSize() indicates a frame update, which means we can forward new
@@ -491,6 +503,8 @@ bool WaylandToplevelWindow::OnInitialize(
SetWorkspaceExtensionDelegate(properties.workspace_extension_delegate);
SetDeskExtension(this, static_cast<DeskExtension*>(this));
+ z_order_ = properties.z_order;
+
if (!properties.workspace.empty()) {
int workspace;
base::StringToInt(properties.workspace, &workspace);
@@ -873,17 +887,21 @@ void WaylandToplevelWindow::SetOrResetRestoredBounds() {
void WaylandToplevelWindow::SetUpShellIntegration() {
// This method should be called after the XDG surface is initialized.
DCHECK(shell_toplevel_);
- if (connection()->zaura_shell() && !aura_surface_) {
- static constexpr zaura_surface_listener zaura_surface_listener = {
- &OcclusionChanged, &LockFrame, &UnlockFrame, &OcclusionStateChanged,
- &DeskChanged, &StartThrottle, &EndThrottle,
- };
- aura_surface_.reset(zaura_shell_get_aura_surface(
- connection()->zaura_shell()->wl_object(), root_surface()->surface()));
- zaura_surface_add_listener(aura_surface_.get(), &zaura_surface_listener,
- this);
+ if (connection()->zaura_shell()) {
+ if (!aura_surface_) {
+ static constexpr zaura_surface_listener zaura_surface_listener = {
+ &OcclusionChanged, &LockFrame, &UnlockFrame,
+ &OcclusionStateChanged, &DeskChanged, &StartThrottle,
+ &EndThrottle,
+ };
+ aura_surface_.reset(zaura_shell_get_aura_surface(
+ connection()->zaura_shell()->wl_object(), root_surface()->surface()));
+ zaura_surface_add_listener(aura_surface_.get(), &zaura_surface_listener,
+ this);
+ }
zaura_surface_set_occlusion_tracking(aura_surface_.get());
SetImmersiveFullscreenStatus(false);
+ SetInitialZOrder();
SetInitialWorkspace();
if (restore_window_id_) {
DCHECK(!restore_window_id_source_);
@@ -949,6 +967,10 @@ void WaylandToplevelWindow::SetInitialWorkspace() {
}
}
+void WaylandToplevelWindow::SetInitialZOrder() {
+ shell_toplevel_->SetZOrder(z_order_);
+}
+
void WaylandToplevelWindow::UpdateWindowMask() {
std::vector<gfx::Rect> region{gfx::Rect({}, visual_size_px())};
root_surface()->SetOpaqueRegion(opaque_region_px_.has_value()
@@ -962,4 +984,12 @@ bool WaylandToplevelWindow::GetTabletMode() {
return connection()->GetTabletMode();
}
+void WaylandToplevelWindow::SetFloat(bool value) {
+ DCHECK(shell_toplevel_);
+ if (value)
+ shell_toplevel_->SetFloat();
+ else
+ shell_toplevel_->UnSetFloat();
+}
+
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.h b/chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.h
index 2911821e5bb..d25ab3c0dc2 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_TOPLEVEL_WINDOW_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_TOPLEVEL_WINDOW_H_
+#include "base/memory/raw_ptr.h"
#include "build/chromeos_buildflags.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/geometry/vector2d.h"
@@ -73,16 +74,13 @@ class WaylandToplevelWindow : public WaylandWindow,
void NotifyStartupComplete(const std::string& startup_id) override;
void SetAspectRatio(const gfx::SizeF& aspect_ratio) override;
void SetBoundsInPixels(const gfx::Rect& bounds) override;
+ void SetBoundsInDIP(const gfx::Rect& bounds) override;
// Sets the window's origin.
void SetOrigin(const gfx::Point& origin);
// WaylandWindow overrides:
- absl::optional<std::vector<gfx::Rect>> GetWindowShape() const override;
-
- bool screen_coordinates_enabled() const {
- return screen_coordinates_enabled_;
- }
+ bool IsScreenCoordinatesEnabled() const override;
// Client-side decorations on Wayland take some portion of the window surface,
// and when they are turned on or off, the window geometry is changed. That
@@ -108,7 +106,7 @@ class WaylandToplevelWindow : public WaylandWindow,
bool is_fullscreen,
bool is_activated) override;
void HandleSurfaceConfigure(uint32_t serial) override;
- void UpdateVisualSize(const gfx::Size& size_px, float scale_factor) override;
+ void UpdateVisualSize(const gfx::Size& size_px) override;
bool OnInitialize(PlatformWindowInitProperties properties) override;
bool IsActive() const override;
bool IsSurfaceConfigured() override;
@@ -157,6 +155,7 @@ class WaylandToplevelWindow : public WaylandWindow,
void Lock(WaylandOrientationLockType lock_Type) override;
void Unlock() override;
bool GetTabletMode() override;
+ void SetFloat(bool value) override;
// DeskExtension:
int GetNumberOfDesks() const override;
@@ -217,6 +216,10 @@ class WaylandToplevelWindow : public WaylandWindow,
// This must be called in SetUpShellIntegration().
void SetInitialWorkspace();
+ // Sets `z_order_` in the `shell_toplevel_`.
+ // Must be called in SetUpShellIntegration().
+ void SetInitialZOrder();
+
// Wrappers around shell surface.
std::unique_ptr<ShellToplevelWrapper> shell_toplevel_;
@@ -253,8 +256,6 @@ class WaylandToplevelWindow : public WaylandWindow,
// e.g. lacros-taskmanager.
bool use_native_frame_ = false;
- absl::optional<std::vector<gfx::Rect>> window_shape_in_dips_;
-
absl::optional<std::vector<gfx::Rect>> opaque_region_px_;
absl::optional<gfx::Rect> input_region_px_;
@@ -299,10 +300,13 @@ class WaylandToplevelWindow : public WaylandWindow,
// If |workspace_| is -1, window is visible on all workspaces.
absl::optional<int> workspace_ = absl::nullopt;
+ // The z order for the window.
+ ZOrderLevel z_order_ = ZOrderLevel::kNormal;
+
// True when screen coordinates is enabled.
bool screen_coordinates_enabled_;
- WorkspaceExtensionDelegate* workspace_extension_delegate_ = nullptr;
+ raw_ptr<WorkspaceExtensionDelegate> workspace_extension_delegate_ = nullptr;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_touch.cc b/chromium/ui/ozone/platform/wayland/host/wayland_touch.cc
index 2f09d660dce..39926708863 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_touch.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_touch.cc
@@ -12,6 +12,7 @@
#include "ui/gfx/geometry/point_f.h"
#include "ui/ozone/platform/wayland/common/wayland_util.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
#include "ui/ozone/platform/wayland/host/wayland_serial_tracker.h"
#include "ui/ozone/platform/wayland/host/wayland_window.h"
@@ -45,7 +46,7 @@ void WaylandTouch::Down(void* data,
if (!surface)
return;
- WaylandTouch* touch = static_cast<WaylandTouch*>(data);
+ auto* touch = static_cast<WaylandTouch*>(data);
DCHECK(touch);
touch->connection_->serial_tracker().UpdateSerial(wl::SerialType::kTouchPress,
@@ -56,7 +57,7 @@ void WaylandTouch::Down(void* data,
gfx::PointF(wl_fixed_to_double(x), wl_fixed_to_double(y)), window);
base::TimeTicks timestamp = base::TimeTicks() + base::Milliseconds(time);
touch->delegate_->OnTouchPressEvent(window, location, timestamp, id,
- Delegate::EventDispatchPolicy::kOnFrame);
+ wl::EventDispatchPolicy::kOnFrame);
}
void WaylandTouch::Up(void* data,
@@ -64,12 +65,22 @@ void WaylandTouch::Up(void* data,
uint32_t serial,
uint32_t time,
int32_t id) {
- WaylandTouch* touch = static_cast<WaylandTouch*>(data);
+ auto* touch = static_cast<WaylandTouch*>(data);
DCHECK(touch);
+ // TODO(https://crbug.com/1353873): Gnome/Wayland, KDE and Weston compositors
+ // have a bug where wl_touch.up does not come accompanied by a respective
+ // wl_touch.frame event. On these particular set ups, dispatch the event
+ // immediately.
+ auto event_dispatch_policy =
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+ wl::EventDispatchPolicy::kOnFrame;
+#else
+ wl::EventDispatchPolicy::kImmediate;
+#endif
+
base::TimeTicks timestamp = base::TimeTicks() + base::Milliseconds(time);
- touch->delegate_->OnTouchReleaseEvent(
- timestamp, id, Delegate::EventDispatchPolicy::kOnFrame);
+ touch->delegate_->OnTouchReleaseEvent(timestamp, id, event_dispatch_policy);
}
void WaylandTouch::Motion(void* data,
@@ -78,8 +89,9 @@ void WaylandTouch::Motion(void* data,
int32_t id,
wl_fixed_t x,
wl_fixed_t y) {
- WaylandTouch* touch = static_cast<WaylandTouch*>(data);
+ auto* touch = static_cast<WaylandTouch*>(data);
DCHECK(touch);
+
const WaylandWindow* target = touch->delegate_->GetTouchTarget(id);
if (!target) {
LOG(WARNING) << "Touch event fired with wrong id";
@@ -89,18 +101,20 @@ void WaylandTouch::Motion(void* data,
gfx::PointF(wl_fixed_to_double(x), wl_fixed_to_double(y)), target);
base::TimeTicks timestamp = base::TimeTicks() + base::Milliseconds(time);
touch->delegate_->OnTouchMotionEvent(location, timestamp, id,
- Delegate::EventDispatchPolicy::kOnFrame);
+ wl::EventDispatchPolicy::kOnFrame);
}
void WaylandTouch::Cancel(void* data, wl_touch* obj) {
- WaylandTouch* touch = static_cast<WaylandTouch*>(data);
+ auto* touch = static_cast<WaylandTouch*>(data);
DCHECK(touch);
+
touch->delegate_->OnTouchCancelEvent();
}
void WaylandTouch::Frame(void* data, wl_touch* obj) {
auto* touch = static_cast<WaylandTouch*>(data);
DCHECK(touch);
+
touch->delegate_->OnTouchFrame();
}
@@ -123,7 +137,8 @@ void WaylandTouch::Tool(void* data,
struct zcr_touch_stylus_v2* obj,
uint32_t id,
uint32_t stylus_type) {
- auto* pointer = static_cast<WaylandTouch*>(data);
+ auto* touch = static_cast<WaylandTouch*>(data);
+ DCHECK(touch);
ui::EventPointerType pointer_type = ui::EventPointerType::kTouch;
switch (stylus_type) {
@@ -137,7 +152,7 @@ void WaylandTouch::Tool(void* data,
break;
}
- pointer->delegate_->OnTouchStylusToolChanged(id, pointer_type);
+ touch->delegate_->OnTouchStylusToolChanged(id, pointer_type);
}
// static
@@ -146,7 +161,10 @@ void WaylandTouch::Force(void* data,
uint32_t time,
uint32_t id,
wl_fixed_t force) {
- NOTIMPLEMENTED_LOG_ONCE();
+ auto* touch = static_cast<WaylandTouch*>(data);
+ DCHECK(touch);
+
+ touch->delegate_->OnTouchStylusForceChanged(id, wl_fixed_to_double(force));
}
// static
@@ -156,7 +174,12 @@ void WaylandTouch::Tilt(void* data,
uint32_t id,
wl_fixed_t tilt_x,
wl_fixed_t tilt_y) {
- NOTIMPLEMENTED_LOG_ONCE();
+ auto* touch = static_cast<WaylandTouch*>(data);
+ DCHECK(touch);
+
+ touch->delegate_->OnTouchStylusTiltChanged(
+ id,
+ gfx::Vector2dF(wl_fixed_to_double(tilt_x), wl_fixed_to_double(tilt_y)));
}
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_touch.h b/chromium/ui/ozone/platform/wayland/host/wayland_touch.h
index 4b7b336e9c1..2d43acd27dc 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_touch.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_touch.h
@@ -7,6 +7,7 @@
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "ui/events/pointer_details.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
@@ -15,6 +16,10 @@ namespace gfx {
class PointF;
} // namespace gfx
+namespace wl {
+enum class EventDispatchPolicy;
+}
+
namespace ui {
class WaylandConnection;
@@ -78,28 +83,24 @@ class WaylandTouch {
wl::Object<wl_touch> obj_;
wl::Object<zcr_touch_stylus_v2> zcr_touch_stylus_v2_;
- WaylandConnection* const connection_;
- Delegate* const delegate_;
+ const raw_ptr<WaylandConnection> connection_;
+ const raw_ptr<Delegate> delegate_;
};
class WaylandTouch::Delegate {
public:
- enum class EventDispatchPolicy {
- kImmediate,
- kOnFrame,
- };
virtual void OnTouchPressEvent(WaylandWindow* window,
const gfx::PointF& location,
base::TimeTicks timestamp,
PointerId id,
- EventDispatchPolicy dispatch_policy) = 0;
+ wl::EventDispatchPolicy dispatch_policy) = 0;
virtual void OnTouchReleaseEvent(base::TimeTicks timestamp,
PointerId id,
- EventDispatchPolicy dispatch_policy) = 0;
+ wl::EventDispatchPolicy dispatch_policy) = 0;
virtual void OnTouchMotionEvent(const gfx::PointF& location,
base::TimeTicks timestamp,
PointerId id,
- EventDispatchPolicy dispatch_policy) = 0;
+ wl::EventDispatchPolicy dispatch_policy) = 0;
virtual void OnTouchCancelEvent() = 0;
virtual void OnTouchFrame() = 0;
virtual void OnTouchFocusChanged(WaylandWindow* window) = 0;
@@ -107,6 +108,9 @@ class WaylandTouch::Delegate {
virtual const WaylandWindow* GetTouchTarget(PointerId id) const = 0;
virtual void OnTouchStylusToolChanged(PointerId pointer_id,
EventPointerType pointer_type) = 0;
+ virtual void OnTouchStylusForceChanged(PointerId pointer_id, float force) = 0;
+ virtual void OnTouchStylusTiltChanged(PointerId pointer_id,
+ const gfx::Vector2dF& tilt) = 0;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_touch_unittest.cc b/chromium/ui/ozone/platform/wayland/host/wayland_touch_unittest.cc
index 95f56011dc2..6cb8bafb95c 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_touch_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_touch_unittest.cc
@@ -8,6 +8,7 @@
#include <cstdint>
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/events/devices/device_data_manager.h"
@@ -22,6 +23,14 @@
#include "ui/ozone/platform/wayland/test/wayland_test.h"
#include "ui/ozone/test/mock_platform_window_delegate.h"
+#if BUILDFLAG(USE_XKBCOMMON)
+#include "base/memory/free_deleter.h"
+#include "base/memory/platform_shared_memory_region.h"
+#include "base/memory/shared_memory_mapping.h"
+#include "base/memory/unsafe_shared_memory_region.h"
+#include "ui/events/keycodes/scoped_xkb.h" // nogncheck
+#endif
+
using ::testing::_;
using ::testing::SaveArg;
using ::testing::Values;
@@ -31,7 +40,12 @@ namespace ui {
namespace {
ACTION_P(CloneEvent, ptr) {
- *ptr = Event::Clone(*arg0);
+ *ptr = arg0->Clone();
+}
+
+bool CompareFloat(float a, float b) {
+ constexpr float kEpsilon = std::numeric_limits<float>::epsilon();
+ return std::isnan(a) ? std::isnan(b) : fabs(a - b) < kEpsilon;
}
} // namespace
@@ -63,15 +77,22 @@ class WaylandTouchTest : public WaylandTest {
void CheckEventType(
ui::EventType event_type,
ui::Event* event,
- ui::EventPointerType pointer_type = ui::EventPointerType::kTouch) {
+ ui::EventPointerType pointer_type = ui::EventPointerType::kTouch,
+ float force = std::numeric_limits<float>::quiet_NaN(),
+ float tilt_x = 0.0,
+ float tilt_y = 0.0) {
ASSERT_TRUE(event);
ASSERT_TRUE(event->IsTouchEvent());
auto* touch_event = event->AsTouchEvent();
EXPECT_EQ(event_type, touch_event->type());
+ EXPECT_EQ(pointer_type, touch_event->pointer_details().pointer_type);
+ EXPECT_TRUE(CompareFloat(force, touch_event->pointer_details().force));
+ EXPECT_TRUE(CompareFloat(tilt_x, touch_event->pointer_details().tilt_x));
+ EXPECT_TRUE(CompareFloat(tilt_y, touch_event->pointer_details().tilt_y));
}
- wl::TestTouch* touch_;
+ raw_ptr<wl::TestTouch> touch_;
};
TEST_P(WaylandTouchTest, TouchPressAndMotion) {
@@ -126,7 +147,47 @@ TEST_P(WaylandTouchTest, TouchPressAndMotionWithStylus) {
wl_touch_send_frame(touch_->resource());
Sync();
- CheckEventType(ui::ET_TOUCH_RELEASED, event.get());
+ CheckEventType(ui::ET_TOUCH_RELEASED, event.get(),
+ ui::EventPointerType::kPen);
+}
+
+// Tests that touch events with stylus pen work. This variant of the test sends
+// the tool information after the touch down event, and ensures that
+// wl_touch::frame event handles it correctly.
+TEST_P(WaylandTouchTest, TouchPressAndMotionWithStylus2) {
+ std::unique_ptr<Event> event;
+ EXPECT_CALL(delegate_, DispatchEvent(_)).WillRepeatedly(CloneEvent(&event));
+
+ uint32_t time = 0;
+ wl_touch_send_down(touch_->resource(), 1, 0, surface_->resource(), 0 /* id */,
+ wl_fixed_from_int(50), wl_fixed_from_int(100));
+ zcr_touch_stylus_v2_send_tool(touch_->touch_stylus()->resource(), 0 /* id */,
+ ZCR_TOUCH_STYLUS_V2_TOOL_TYPE_PEN);
+ zcr_touch_stylus_v2_send_force(touch_->touch_stylus()->resource(), ++time,
+ 0 /* id */, wl_fixed_from_double(1.0f));
+ zcr_touch_stylus_v2_send_tilt(touch_->touch_stylus()->resource(), ++time,
+ 0 /* id */, wl_fixed_from_double(-45),
+ wl_fixed_from_double(45));
+ wl_touch_send_frame(touch_->resource());
+
+ Sync();
+ CheckEventType(ui::ET_TOUCH_PRESSED, event.get(), ui::EventPointerType::kPen,
+ 1.0f /* force */, -45.0f /* tilt_x */, 45.0f /* tilt_y */);
+
+ wl_touch_send_motion(touch_->resource(), 500, 0 /* id */,
+ wl_fixed_from_int(100), wl_fixed_from_int(100));
+ wl_touch_send_frame(touch_->resource());
+
+ Sync();
+ CheckEventType(ui::ET_TOUCH_MOVED, event.get(), ui::EventPointerType::kPen,
+ 1.0f /* force */, -45.0f /* tilt_x */, 45.0f /* tilt_y */);
+
+ wl_touch_send_up(touch_->resource(), 1, 1000, 0 /* id */);
+ wl_touch_send_frame(touch_->resource());
+
+ Sync();
+ CheckEventType(ui::ET_TOUCH_RELEASED, event.get(), ui::EventPointerType::kPen,
+ 1.0f /* force */, -45.0f /* tilt_x */, 45.0f /* tilt_y */);
}
// Tests that touch focus is correctly set and released.
@@ -226,7 +287,39 @@ TEST_P(WaylandTouchTest, KeyboardFlagsSet) {
wl::TestKeyboard* keyboard = server_.seat()->keyboard();
ASSERT_TRUE(keyboard);
+#if BUILDFLAG(USE_XKBCOMMON)
+ // Set up XKB bits and set the keymap to the client.
+ std::unique_ptr<xkb_context, ui::XkbContextDeleter> xkb_context(
+ xkb_context_new(XKB_CONTEXT_NO_FLAGS));
+ std::unique_ptr<xkb_keymap, ui::XkbKeymapDeleter> xkb_keymap(
+ xkb_keymap_new_from_names(xkb_context.get(), nullptr /*names*/,
+ XKB_KEYMAP_COMPILE_NO_FLAGS));
+ std::unique_ptr<xkb_state, ui::XkbStateDeleter> xkb_state(
+ xkb_state_new(xkb_keymap.get()));
+
+ std::unique_ptr<char, base::FreeDeleter> keymap_string(
+ xkb_keymap_get_as_string(xkb_keymap.get(), XKB_KEYMAP_FORMAT_TEXT_V1));
+ DCHECK(keymap_string.get());
+ size_t keymap_size = strlen(keymap_string.get()) + 1;
+
+ base::UnsafeSharedMemoryRegion shared_keymap_region =
+ base::UnsafeSharedMemoryRegion::Create(keymap_size);
+ base::WritableSharedMemoryMapping shared_keymap = shared_keymap_region.Map();
+ base::subtle::PlatformSharedMemoryRegion platform_shared_keymap =
+ base::UnsafeSharedMemoryRegion::TakeHandleForSerialization(
+ std::move(shared_keymap_region));
+ DCHECK(shared_keymap.IsValid());
+
+ memcpy(shared_keymap.memory(), keymap_string.get(), keymap_size);
+ wl_keyboard_send_keymap(
+ keyboard->resource(), WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
+ platform_shared_keymap.GetPlatformHandle().fd, keymap_size);
+#endif
+
// Press 'control' key.
+ wl_keyboard_send_modifiers(keyboard->resource(), 3, 4 /* mods_depressed*/,
+ 0 /* mods_latched */, 0 /* mods_locked */,
+ 0 /* group */);
wl_keyboard_send_key(keyboard->resource(), ++serial, ++timestamp,
29 /* Control */, WL_KEYBOARD_KEY_STATE_PRESSED);
Sync();
@@ -256,6 +349,9 @@ TEST_P(WaylandTouchTest, KeyboardFlagsSet) {
EXPECT_TRUE(event->flags() & ui::EF_CONTROL_DOWN);
// Release 'control' key.
+ wl_keyboard_send_modifiers(keyboard->resource(), 3, 0 /* mods_depressed*/,
+ 0 /* mods_latched */, 0 /* mods_locked */,
+ 0 /* group */);
wl_keyboard_send_key(keyboard->resource(), ++serial, ++timestamp,
29 /* Control */, WL_KEYBOARD_KEY_STATE_RELEASED);
Sync();
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window.cc b/chromium/ui/ozone/platform/wayland/host/wayland_window.cc
index 5ffe811c143..4b9e3781cef 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window.cc
@@ -21,9 +21,11 @@
#include "ui/base/dragdrop/mojom/drag_drop_types.mojom.h"
#include "ui/base/dragdrop/os_exchange_data.h"
#include "ui/events/event.h"
+#include "ui/events/event_target_iterator.h"
#include "ui/events/event_utils.h"
#include "ui/events/ozone/events_ozone.h"
#include "ui/events/platform/platform_event_source.h"
+#include "ui/gfx/color_space.h"
#include "ui/gfx/geometry/point_f.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/native_widget_types.h"
@@ -32,7 +34,6 @@
#include "ui/ozone/common/features.h"
#include "ui/ozone/platform/wayland/common/wayland_overlay_config.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
-#include "ui/ozone/platform/wayland/host/wayland_cursor_position.h"
#include "ui/ozone/platform/wayland/host/wayland_data_drag_controller.h"
#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
#include "ui/ozone/platform/wayland/host/wayland_frame_manager.h"
@@ -129,12 +130,8 @@ void WaylandWindow::UpdateWindowScale(bool update_bounds) {
float new_scale = output->scale_factor();
ui_scale_ = output->GetUIScaleFactor();
- float old_scale = window_scale();
- window_scale_ = new_scale;
-
- // We need to keep DIP size of the window the same whenever the scale changes.
- if (update_bounds)
- UpdateBoundsInDIP(gfx::ScaleToEnclosedRect(bounds_px_, 1.0 / old_scale));
+ if (SetWindowScale(new_scale))
+ delegate_->OnBoundsChanged({true});
// Propagate update to the child windows
if (child_window_)
@@ -145,9 +142,12 @@ gfx::AcceleratedWidget WaylandWindow::GetWidget() const {
return accelerated_widget_;
}
-void WaylandWindow::SetWindowScale(float new_scale) {
+bool WaylandWindow::SetWindowScale(float new_scale) {
DCHECK_GE(new_scale, 0.f);
+ bool changed = window_scale_ != new_scale;
window_scale_ = new_scale;
+ size_px_ = gfx::ScaleToEnclosingRect(bounds_dip_, new_scale).size();
+ return changed;
}
uint32_t WaylandWindow::GetPreferredEnteredOutputId() {
@@ -194,16 +194,24 @@ uint32_t WaylandWindow::GetPreferredEnteredOutputId() {
return preferred_output_id;
}
-void WaylandWindow::SetPointerFocus(bool focus) {
- has_pointer_focus_ = focus;
-
+void WaylandWindow::OnPointerFocusChanged(bool focused) {
// Whenever the window gets the pointer focus back, the cursor shape must be
// updated. Otherwise, it is invalidated upon wl_pointer::leave and is not
// restored by the Wayland compositor.
- if (has_pointer_focus_ && cursor_)
+ if (focused && cursor_)
UpdateCursorShape(cursor_);
}
+bool WaylandWindow::HasPointerFocus() const {
+ return this == connection_->wayland_window_manager()
+ ->GetCurrentPointerFocusedWindow();
+}
+
+bool WaylandWindow::HasKeyboardFocus() const {
+ return this == connection_->wayland_window_manager()
+ ->GetCurrentKeyboardFocusedWindow();
+}
+
void WaylandWindow::RemoveEnteredOutput(uint32_t output_id) {
root_surface_->RemoveEnteredOutput(output_id);
}
@@ -245,7 +253,7 @@ void WaylandWindow::Show(bool inactive) {
}
void WaylandWindow::Hide() {
- can_submit_frames_ = false;
+ received_configure_event_ = false;
// Mutter compositor crashes if we don't remove subsurface roles when hiding.
if (primary_subsurface_) {
@@ -290,32 +298,30 @@ void WaylandWindow::PrepareForShutdown() {
}
void WaylandWindow::SetBoundsInPixels(const gfx::Rect& bounds_px) {
- gfx::Rect adjusted_bounds_px = AdjustBoundsToConstraintsPx(bounds_px);
- if (bounds_px_ == adjusted_bounds_px)
- return;
- bounds_px_ = adjusted_bounds_px;
-
- if (update_visual_size_immediately_)
- UpdateVisualSize(bounds_px.size(), window_scale());
- delegate_->OnBoundsChanged(bounds_px_);
+ // TODO(crbug.com/): This is currently used only by unit tests.
+ // Figure out how to migrate to test only methods.
+ auto bounds_dip = delegate_->ConvertRectToDIP(bounds_px);
+ SetBoundsInDIP(bounds_dip);
}
gfx::Rect WaylandWindow::GetBoundsInPixels() const {
- return bounds_px_;
+ // TODO(crbug.com/): This is currently used only by unit tests.
+ // Figure out how to migrate to test only methods.
+ return delegate_->ConvertRectToPixels(bounds_dip_);
}
-void WaylandWindow::SetBoundsInDIP(const gfx::Rect& bounds) {
- SetBoundsInPixels(delegate_->ConvertRectToPixels(bounds));
+void WaylandWindow::SetBoundsInDIP(const gfx::Rect& bounds_dip) {
+ UpdateBoundsInDIP(bounds_dip);
}
gfx::Rect WaylandWindow::GetBoundsInDIP() const {
- return delegate_->ConvertRectToDIP(bounds_px_);
+ return bounds_dip_;
}
void WaylandWindow::OnSurfaceConfigureEvent() {
- if (can_submit_frames_)
+ if (received_configure_event_)
return;
- can_submit_frames_ = true;
+ received_configure_event_ = true;
frame_manager_->MaybeProcessPendingFrame();
}
@@ -438,15 +444,7 @@ bool WaylandWindow::ShouldUpdateWindowShape() const {
}
bool WaylandWindow::CanDispatchEvent(const PlatformEvent& event) {
- if (event->IsMouseEvent() || event->IsPinchEvent())
- return has_pointer_focus_;
- if (event->IsKeyEvent())
- return has_keyboard_focus_;
- if (event->IsTouchEvent())
- return has_touch_focus_;
- if (event->IsScrollEvent())
- return has_pointer_focus_;
- return false;
+ return CanAcceptEvent(*event);
}
uint32_t WaylandWindow::DispatchEvent(const PlatformEvent& native_event) {
@@ -457,8 +455,6 @@ uint32_t WaylandWindow::DispatchEvent(const PlatformEvent& native_event) {
connection_->wayland_window_manager()->located_events_grabber();
auto* root_parent_window = GetRootParentWindow();
- UpdateCursorPositionFromEvent(event);
-
// We must reroute the events to the event grabber iff these windows belong
// to the same root parent window. For example, there are 2 top level
// Wayland windows. One of them (window_1) has a child menu window that is
@@ -473,25 +469,51 @@ uint32_t WaylandWindow::DispatchEvent(const PlatformEvent& native_event) {
event_grabber &&
root_parent_window == event_grabber->GetRootParentWindow();
if (send_to_grabber) {
- ConvertEventLocationToTargetWindowLocation(
- event_grabber->GetBoundsInDIP().origin(), GetBoundsInDIP().origin(),
- event->AsLocatedEvent());
+ WaylandEventSource::ConvertEventToTarget(event_grabber,
+ event->AsLocatedEvent());
+ Event::DispatcherApi(event).set_target(event_grabber);
}
- // Wayland sends locations in DIP so they need to be translated to
- // physical pixels.
+ // Wayland sends locations in DIP but dispatch code expects pixels, so they
+ // need to be translated to physical pixels.
event->AsLocatedEvent()->set_location_f(gfx::ScalePoint(
event->AsLocatedEvent()->location_f(), window_scale(), window_scale()));
- if (send_to_grabber)
- return event_grabber->DispatchEventToDelegate(native_event);
+ if (send_to_grabber) {
+ event_grabber->DispatchEventToDelegate(event);
+ // The event should be handled by the grabber, so don't send to next
+ // dispacher.
+ return POST_DISPATCH_STOP_PROPAGATION;
+ }
}
// Dispatch all keyboard events to the root window.
if (event->IsKeyEvent())
return GetRootParentWindow()->DispatchEventToDelegate(event);
- return DispatchEventToDelegate(native_event);
+ return DispatchEventToDelegate(event);
+}
+
+// EventTarget:
+bool WaylandWindow::CanAcceptEvent(const Event& event) {
+#if DCHECK_IS_ON()
+ if (!disable_null_target_dcheck_for_test_)
+ DCHECK(event.target());
+#endif
+ return this == event.target();
+}
+
+EventTarget* WaylandWindow::GetParentTarget() {
+ return nullptr;
+}
+
+std::unique_ptr<EventTargetIterator> WaylandWindow::GetChildIterator() const {
+ NOTREACHED();
+ return nullptr;
+}
+
+EventTargeter* WaylandWindow::GetEventTargeter() {
+ return nullptr;
}
void WaylandWindow::HandleSurfaceConfigure(uint32_t serial) {
@@ -523,14 +545,13 @@ void WaylandWindow::HandlePopupConfigure(const gfx::Rect& bounds_dip) {
NOTREACHED() << "Only shell popups must receive HandlePopupConfigure calls.";
}
-void WaylandWindow::UpdateVisualSize(const gfx::Size& size_px,
- float scale_factor) {
+void WaylandWindow::UpdateVisualSize(const gfx::Size& size_px) {
if (visual_size_px_ == size_px)
return;
visual_size_px_ = size_px;
UpdateWindowMask();
- if (apply_pending_state_on_update_visual_size_) {
+ if (apply_pending_state_on_update_visual_size_for_testing_) {
root_surface_->ApplyPendingState();
connection_->ScheduleFlush();
}
@@ -540,10 +561,6 @@ void WaylandWindow::OnCloseRequest() {
delegate_->OnCloseRequest();
}
-absl::optional<std::vector<gfx::Rect>> WaylandWindow::GetWindowShape() const {
- return absl::nullopt;
-}
-
void WaylandWindow::OnDragEnter(const gfx::PointF& point,
std::unique_ptr<OSExchangeData> data,
int operation) {
@@ -589,10 +606,16 @@ void WaylandWindow::OnDragSessionClose(DragOperation operation) {
}
void WaylandWindow::UpdateBoundsInDIP(const gfx::Rect& bounds_dip) {
- // This method is used to update the content size by calling WindowWindow's
- // SetBounds, instead of WaylandToplevelWindow's override, which sends a
- // request to the compositor.
- WaylandWindow::SetBoundsInPixels(delegate_->ConvertRectToPixels(bounds_dip));
+ gfx::Rect adjusted_bounds_dip = AdjustBoundsToConstraintsDIP(bounds_dip);
+ if (bounds_dip_ == adjusted_bounds_dip)
+ return;
+ bool origin_changed = bounds_dip_.origin() != bounds_dip.origin();
+ bounds_dip_ = adjusted_bounds_dip;
+ size_px_ = delegate_->ConvertRectToPixels(bounds_dip).size();
+
+ if (update_visual_size_immediately_for_testing_)
+ UpdateVisualSize(size_px());
+ delegate_->OnBoundsChanged({origin_changed});
}
bool WaylandWindow::Initialize(PlatformWindowInitProperties properties) {
@@ -607,13 +630,16 @@ bool WaylandWindow::Initialize(PlatformWindowInitProperties properties) {
// Update visual size in tests immediately if the test config is set.
// Otherwise, such tests as interactive_ui_tests fail.
- if (!update_visual_size_immediately_)
- set_update_visual_size_immediately(UseTestConfigForPlatformWindows());
+ if (!update_visual_size_immediately_for_testing_) {
+ set_update_visual_size_immediately_for_testing(
+ UseTestConfigForPlatformWindows());
+ }
+ bounds_dip_ = properties.bounds;
// Properties contain DIP bounds but the buffer scale is initially 1 so it's
// OK to assign. The bounds will be recalculated when the buffer scale
// changes.
- bounds_px_ = properties.bounds;
+ size_px_ = bounds_dip_.size();
opacity_ = properties.opacity;
type_ = properties.type;
@@ -634,7 +660,7 @@ bool WaylandWindow::Initialize(PlatformWindowInitProperties properties) {
PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this);
delegate_->OnAcceleratedWidgetAvailable(GetWidget());
- std::vector<gfx::Rect> region{gfx::Rect{bounds_px_.size()}};
+ std::vector<gfx::Rect> region{gfx::Rect{size_px_}};
root_surface_->SetOpaqueRegion(&region);
root_surface_->ApplyPendingState();
connection_->ScheduleFlush();
@@ -644,6 +670,14 @@ bool WaylandWindow::Initialize(PlatformWindowInitProperties properties) {
void WaylandWindow::SetWindowGeometry(gfx::Rect bounds) {}
+gfx::Vector2d WaylandWindow::GetWindowGeometryOffsetInDIP() const {
+ if (!frame_insets_px_.has_value())
+ return {};
+
+ return {static_cast<int>(frame_insets_px_->left() / window_scale_),
+ static_cast<int>(frame_insets_px_->top() / window_scale_)};
+}
+
void WaylandWindow::UpdateDecorations() {}
WaylandWindow* WaylandWindow::GetRootParentWindow() {
@@ -666,45 +700,8 @@ void WaylandWindow::OnLeftOutput() {
// event.
if (AsWaylandPopup())
return;
- // Do not update the window scale where. It'll be updated when entring a new
- // output.
-}
-
-void WaylandWindow::UpdateCursorPositionFromEvent(const Event* orig_event) {
- DCHECK(orig_event->IsLocatedEvent());
-
- // This is a tricky part. Initially, Wayland sends events to surfaces the
- // events are targeted for. But, in order to fulfill Chromium's assumptions
- // about event targets, some of the events are rerouted and their locations
- // are converted. The event we got here is rerouted and it has had its
- // location fixed.
- //
- // Basically, this method must translate coordinates of all events
- // in regards to top-level windows' coordinates as it's always located at
- // origin (0,0) from Chromium point of view (remember that wl_shell/xdg_shell
- // doesn't provide global coordinates to its clients). And it's totally fine
- // to use it as the target. Thus, the location of the |event| is always
- // converted using the top-level window's bounds as the target excluding
- // cases, when the mouse/touch is over a top-level window.
- auto* cursor_position = connection_->wayland_cursor_position();
- if (!cursor_position)
- return;
- const LocatedEvent* located_event = orig_event->AsLocatedEvent();
- std::unique_ptr<Event> event;
-
- auto* toplevel_window = GetRootParentWindow();
- if (toplevel_window != this) {
- event = Event::Clone(*orig_event);
- ConvertEventLocationToTargetWindowLocation(
- toplevel_window->GetBoundsInDIP().origin(), GetBoundsInDIP().origin(),
- event->AsLocatedEvent());
- located_event = event->AsLocatedEvent();
- }
-
- cursor_position->OnCursorPositionChanged(
- located_event->location() +
- toplevel_window->GetBoundsInDIP().origin().OffsetFromOrigin());
+ UpdateWindowScale(true);
}
WaylandWindow* WaylandWindow::GetTopMostChildWindow() {
@@ -724,6 +721,10 @@ WaylandPopup* WaylandWindow::AsWaylandPopup() {
return nullptr;
}
+bool WaylandWindow::IsScreenCoordinatesEnabled() const {
+ return false;
+}
+
uint32_t WaylandWindow::DispatchEventToDelegate(
const PlatformEvent& native_event) {
bool handled = DispatchEventFromNativeUiEvent(
@@ -874,7 +875,7 @@ bool WaylandWindow::CommitOverlays(
gfx::RectF(visual_size), gfx::RectF(),
root_surface()->use_blending(), gfx::Rect(),
root_surface()->opacity(), gfx::OverlayPriorityHint::kNone,
- rounded_clip_bounds, gfx::ColorSpace(), absl::nullopt),
+ rounded_clip_bounds, gfx::ColorSpace::CreateSRGB(), absl::nullopt),
nullptr, root_surface()->buffer_id(), buffer_scale);
}
@@ -964,7 +965,8 @@ void WaylandWindow::ProcessPendingBoundsDip(uint32_t serial) {
// for a frame update, which will invoke UpdateVisualSize().
LOG_IF(WARNING, pending_configures_.size() > 100u)
<< "The queue of configures is longer than 100!";
- pending_configures_.push_back({pending_bounds_dip_, serial});
+ pending_configures_.push_back(
+ {pending_bounds_dip_, pending_size_px_, serial});
// The Wayland compositor can generate xdg-shell.configure events more
// frequently than frame updates from gpu process. Throttle
// ApplyPendingBounds() such that we forward new bounds to
@@ -1030,24 +1032,17 @@ gfx::Rect WaylandWindow::AdjustBoundsToConstraintsDIP(
return adjusted_bounds_dip;
}
-bool WaylandWindow::ProcessVisualSizeUpdate(const gfx::Size& size_px,
- float scale_factor) {
+bool WaylandWindow::ProcessVisualSizeUpdate(const gfx::Size& size_px) {
// TODO(crbug.com/1307501): Optimize this to be less expensive. Maybe
// precompute in pixels for configure events. pending_configures_ can have 10s
// of elements in it for several frames under some conditions.
// The `pending_configures_` should store px size instead of dip.
- auto result = std::find_if(
- pending_configures_.begin(), pending_configures_.end(),
- [this, &size_px, &scale_factor](auto& configure) {
- // Since size_px comes from SetBounds via UpdateVisualSize in
- // WaylandTopLevelWindow, we also need to adjust it for bounds to see if
- // we match.
- return AdjustBoundsToConstraintsPx(
- gfx::ScaleToEnclosingRect(configure.bounds_dip,
- scale_factor))
- .size() == size_px &&
- configure.set;
- });
+ auto result =
+ std::find_if(pending_configures_.begin(), pending_configures_.end(),
+ [&size_px](auto& configure) {
+ // Should we adjust?
+ return configure.size_px == size_px && configure.set;
+ });
if (result != pending_configures_.end()) {
auto serial = result->serial;
@@ -1064,11 +1059,8 @@ void WaylandWindow::ApplyPendingBounds() {
DCHECK(!pending_configures_.empty());
for (auto& configure : pending_configures_)
configure.set = true;
+ // Do not call SetBoundsInDIP which may be overridden by a subclass.
UpdateBoundsInDIP(pending_configures_.back().bounds_dip);
}
-bool WaylandWindow::HasPendingConfigures() const {
- return !pending_configures_.empty();
-}
-
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window.h b/chromium/ui/ozone/platform/wayland/host/wayland_window.h
index 4c76e6140d5..603fb3cf3f6 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window.h
@@ -15,10 +15,12 @@
#include "base/containers/flat_set.h"
#include "base/containers/linked_list.h"
#include "base/gtest_prod_util.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/task/single_thread_task_runner.h"
#include "ui/base/dragdrop/mojom/drag_drop_types.mojom-forward.h"
+#include "ui/events/event_target.h"
#include "ui/events/platform/platform_event_dispatcher.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/geometry/point_f.h"
@@ -51,7 +53,8 @@ using WidgetSubsurfaceSet = base::flat_set<std::unique_ptr<WaylandSubsurface>>;
class WaylandWindow : public PlatformWindow,
public PlatformEventDispatcher,
- public WmDragHandler {
+ public WmDragHandler,
+ public EventTarget {
public:
WaylandWindow(const WaylandWindow&) = delete;
WaylandWindow& operator=(const WaylandWindow&) = delete;
@@ -105,13 +108,12 @@ class WaylandWindow : public PlatformWindow,
bool CommitOverlays(uint32_t frame_id,
std::vector<wl::WaylandOverlayConfig>& overlays);
- // Set whether this window has pointer focus and should dispatch mouse events.
- void SetPointerFocus(bool focus);
- bool has_pointer_focus() const { return has_pointer_focus_; }
+ // Called when the focus changed on this window.
+ void OnPointerFocusChanged(bool focused);
- // Set whether this window has keyboard focus and should dispatch key events.
- void set_keyboard_focus(bool focus) { has_keyboard_focus_ = focus; }
- bool has_keyboard_focus() const { return has_keyboard_focus_; }
+ // Returns the focus status of this window.
+ bool HasPointerFocus() const;
+ bool HasKeyboardFocus() const;
// The methods set or return whether this window has touch focus and should
// dispatch touch events.
@@ -124,9 +126,9 @@ class WaylandWindow : public PlatformWindow,
WaylandWindow* child_window() const { return child_window_; }
// Sets the window_scale for this window with respect to a display this window
- // is located at. This determines how events can be translated and how size of
- // the surface is treated (px to DIP conversion and vice versa.)
- void SetWindowScale(float new_scale);
+ // is located at. Returns true if the scale has changed. This determines how
+ // events can be translated and how pixel size of the surface is treated.
+ bool SetWindowScale(float new_scale);
float window_scale() const { return window_scale_; }
float ui_scale() const { return ui_scale_; }
@@ -140,6 +142,10 @@ class WaylandWindow : public PlatformWindow,
// Returns current type of the window.
PlatformWindowType type() const { return type_; }
+ // The pixel size of the surface.
+ gfx::Size size_px() const { return size_px_; }
+
+ // The pixel size of the buffer for the surface.
gfx::Size visual_size_px() const { return visual_size_px_; }
absl::optional<gfx::Insets> frame_insets_px() const {
@@ -147,15 +153,7 @@ class WaylandWindow : public PlatformWindow,
}
void set_frame_insets_px(gfx::Insets insets) { frame_insets_px_ = insets; }
- bool can_submit_frames() const { return can_submit_frames_; }
-
- // These are never intended to be used except in unit tests.
- void set_update_visual_size_immediately(bool update_immediately) {
- update_visual_size_immediately_ = update_immediately;
- }
- void set_apply_pending_state_on_update_visual_size(bool apply_immediately) {
- apply_pending_state_on_update_visual_size_ = apply_immediately;
- }
+ bool received_configure_event() const { return received_configure_event_; }
// Remove WaylandOutput associated with WaylandSurface of this window.
void RemoveEnteredOutput(uint32_t output_id);
@@ -211,6 +209,12 @@ class WaylandWindow : public PlatformWindow,
bool CanDispatchEvent(const PlatformEvent& event) override;
uint32_t DispatchEvent(const PlatformEvent& event) override;
+ // EventTarget:
+ bool CanAcceptEvent(const Event& event) override;
+ EventTarget* GetParentTarget() override;
+ std::unique_ptr<EventTargetIterator> GetChildIterator() const override;
+ EventTargeter* GetEventTargeter() override;
+
// Handles the configuration events coming from the shell objects.
// The width and height come in DIP of the output that the surface is
// currently bound to.
@@ -229,7 +233,7 @@ class WaylandWindow : public PlatformWindow,
bool is_activated);
virtual void HandlePopupConfigure(const gfx::Rect& bounds);
// The final size of the Wayland surface is determined by the buffer size in
- // px * scale that the Chromium compositor renders at. If the window changes a
+ // px that the Chromium compositor renders at. If the window changes a
// display (and scale changes from 1 to 2), the buffers are recreated with
// some delays. Thus, applying a visual size using window_scale (which is the
// current scale of a wl_output where the window is located at) is wrong, as
@@ -245,7 +249,7 @@ class WaylandWindow : public PlatformWindow,
// factor than the primary display's one. Thus, this method gets a scale
// factor that helps to determine size of the surface in dip respecting
// size that GPU renders at.
- virtual void UpdateVisualSize(const gfx::Size& size_px, float scale_factor);
+ virtual void UpdateVisualSize(const gfx::Size& size_px);
// Handles close requests.
virtual void OnCloseRequest();
@@ -260,8 +264,6 @@ class WaylandWindow : public PlatformWindow,
virtual void OnDragLeave();
virtual void OnDragSessionClose(ui::mojom::DragOperation operation);
- virtual absl::optional<std::vector<gfx::Rect>> GetWindowShape() const;
-
// Tells if the surface has already been configured.
virtual bool IsSurfaceConfigured() = 0;
@@ -272,6 +274,9 @@ class WaylandWindow : public PlatformWindow,
// Sets the window geometry.
virtual void SetWindowGeometry(gfx::Rect bounds);
+ // Returns the offset of the window geometry within the window surface.
+ gfx::Vector2d GetWindowGeometryOffsetInDIP() const;
+
// Sends configure acknowledgement to the wayland server.
virtual void AckConfigure(uint32_t serial) = 0;
@@ -306,6 +311,9 @@ class WaylandWindow : public PlatformWindow,
// WaylandPopup, if |this| has type of WaylandPopup.
virtual WaylandPopup* AsWaylandPopup();
+ // Returns true if the window's bounds is in screen coordinates.
+ virtual bool IsScreenCoordinatesEnabled() const;
+
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner() {
return ui_task_runner_;
}
@@ -317,6 +325,23 @@ class WaylandWindow : public PlatformWindow,
// Clears the state of the |frame_manager_| when the GPU channel is destroyed.
void OnChannelDestroyed();
+ // These are never intended to be used except in unit tests.
+ void set_update_visual_size_immediately_for_testing(bool update) {
+ update_visual_size_immediately_for_testing_ = update;
+ }
+
+ void set_apply_pending_state_on_update_visual_size_for_testing(bool apply) {
+ apply_pending_state_on_update_visual_size_for_testing_ = apply;
+ }
+
+#if DCHECK_IS_ON()
+ void disable_null_target_dcheck_for_testing() {
+ disable_null_target_dcheck_for_test_ = true;
+ }
+#endif
+
+ bool has_pending_configures() const { return !pending_configures_.empty(); }
+
protected:
WaylandWindow(PlatformWindowDelegate* delegate,
WaylandConnection* connection);
@@ -348,23 +373,24 @@ class WaylandWindow : public PlatformWindow,
// Processes the size information form visual size update and returns true if
// any pending configure is fulfilled.
- bool ProcessVisualSizeUpdate(const gfx::Size& size_px, float scale_factor);
+ bool ProcessVisualSizeUpdate(const gfx::Size& size_px);
// Applies pending bounds.
virtual void ApplyPendingBounds();
- bool HasPendingConfigures() const;
-
gfx::Rect pending_bounds_dip() const { return pending_bounds_dip_; }
- void set_pending_bounds_dip(const gfx::Rect rect) {
+ void set_pending_bounds_dip(const gfx::Rect& rect) {
pending_bounds_dip_ = rect;
}
+ gfx::Size pending_size_px() const { return pending_size_px_; }
+ void set_pending_size_px(const gfx::Size& size) { pending_size_px_ = size; }
const gfx::Size& restored_size_dip() const { return restored_size_dip_; }
private:
friend class WaylandBufferManagerViewportTest;
friend class BlockableWaylandToplevelWindow;
+ friend class WaylandWindowManager;
FRIEND_TEST_ALL_PREFIXES(WaylandScreenTest, SetWindowScale);
FRIEND_TEST_ALL_PREFIXES(WaylandBufferManagerTest, CanSubmitOverlayPriority);
@@ -373,8 +399,6 @@ class WaylandWindow : public PlatformWindow,
// Initializes the WaylandWindow with supplied properties.
bool Initialize(PlatformWindowInitProperties properties);
- void UpdateCursorPositionFromEvent(const Event* event);
-
uint32_t DispatchEventToDelegate(const PlatformEvent& native_event);
// Additional initialization of derived classes.
@@ -391,13 +415,13 @@ class WaylandWindow : public PlatformWindow,
void UpdateCursorShape(scoped_refptr<BitmapCursor> cursor);
- PlatformWindowDelegate* delegate_;
- WaylandConnection* connection_;
- WaylandWindow* parent_window_ = nullptr;
- WaylandWindow* child_window_ = nullptr;
+ raw_ptr<PlatformWindowDelegate> delegate_;
+ raw_ptr<WaylandConnection> connection_;
+ raw_ptr<WaylandWindow> parent_window_ = nullptr;
+ raw_ptr<WaylandWindow> child_window_ = nullptr;
std::unique_ptr<WaylandFrameManager> frame_manager_;
- bool can_submit_frames_ = false;
+ bool received_configure_event_ = false;
// |root_surface_| is a surface for the opaque background. Its z-order is
// INT32_MIN.
@@ -427,7 +451,10 @@ class WaylandWindow : public PlatformWindow,
// delegate_->OnBoundsChanged() is called and updates current_surface_size in
// Viz. However, it is not guaranteed that the next arriving frame will match
// |bounds_px_|.
- gfx::Rect bounds_px_;
+ // gfx::Rect bounds_px_;
+
+ gfx::Rect bounds_dip_;
+ gfx::Size size_px_;
// The size presented by the gpu process. This is the visible size of the
// window, which can be different from |bounds_px_| due to renderers taking
@@ -443,8 +470,6 @@ class WaylandWindow : public PlatformWindow,
// areas outside the geometry are used to draw client-side window decorations.
absl::optional<gfx::Insets> frame_insets_px_;
- bool has_pointer_focus_ = false;
- bool has_keyboard_focus_ = false;
bool has_touch_focus_ = false;
// The UI scale may be forced through the command line, which means that it
// replaces the default value that is equal to the natural device scale.
@@ -466,13 +491,13 @@ class WaylandWindow : public PlatformWindow,
// visible in |visual_size_px_|, but in some unit tests there will never be
// any frame updates. This flag causes UpdateVisualSize() to be invoked during
// SetBounds() in unit tests.
- bool update_visual_size_immediately_ = false;
+ bool update_visual_size_immediately_for_testing_ = false;
// In a non-test environment, root_surface_->ApplyPendingBounds() is called to
// send Wayland protocol requests, but in some unit tests there will never be
// any frame updates. This flag causes root_surface_->ApplyPendingBounds() to
// be invoked during UpdateVisualSize() in unit tests.
- bool apply_pending_state_on_update_visual_size_ = false;
+ bool apply_pending_state_on_update_visual_size_for_testing_ = false;
// These bounds attributes below have suffixes that indicate units used.
// Wayland operates in DIP but the platform operates in physical pixels so
@@ -485,6 +510,7 @@ class WaylandWindow : public PlatformWindow,
// bounds via |ApplyPendingBounds|. Measured in DIP because updated in the
// handler that receives DIP from Wayland.
gfx::Rect pending_bounds_dip_;
+ gfx::Size pending_size_px_;
// The size of the platform window before it went maximized or fullscreen in
// dip.
@@ -494,6 +520,7 @@ class WaylandWindow : public PlatformWindow,
// ack_configure request with |serial| will be sent to the Wayland compositor.
struct PendingConfigure {
gfx::Rect bounds_dip;
+ gfx::Size size_px;
uint32_t serial;
// True if this configure has been passed to the compositor for rendering.
bool set = false;
@@ -507,6 +534,10 @@ class WaylandWindow : public PlatformWindow,
base::OnceClosure drag_loop_quit_closure_;
+#if DCHECK_IS_ON()
+ bool disable_null_target_dcheck_for_test_ = false;
+#endif
+
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
base::WeakPtrFactory<WaylandWindow> weak_ptr_factory_{this};
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc b/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc
index 06b5bfaaeda..191d7e0006b 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc
@@ -40,6 +40,7 @@
#include "ui/ozone/platform/wayland/host/wayland_data_device_manager.h"
#include "ui/ozone/platform/wayland/host/wayland_data_offer.h"
#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
+#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
#include "ui/ozone/platform/wayland/host/wayland_output_manager.h"
#include "ui/ozone/platform/wayland/host/wayland_screen.h"
#include "ui/ozone/platform/wayland/host/wayland_serial_tracker.h"
@@ -228,10 +229,13 @@ void WaylandWindowDragController::OnDragEnter(WaylandWindow* window,
pointer_location_ = location;
DCHECK(drag_source_.has_value());
- if (*drag_source_ == DragSource::kMouse)
- pointer_delegate_->OnPointerFocusChanged(window, location);
- else
+ // Check if this is necessary.
+ if (*drag_source_ == DragSource::kMouse) {
+ pointer_delegate_->OnPointerFocusChanged(
+ window, location, wl::EventDispatchPolicy::kImmediate);
+ } else {
touch_delegate_->OnTouchFocusChanged(window);
+ }
DVLOG(1) << "OnEnter. widget=" << window->GetWidget();
@@ -269,9 +273,9 @@ void WaylandWindowDragController::OnDragMotion(const gfx::PointF& location) {
base::TimeTicks timestamp = base::TimeTicks::Now();
auto touch_pointer_ids = touch_delegate_->GetActiveTouchPointIds();
DCHECK_EQ(touch_pointer_ids.size(), 1u);
- touch_delegate_->OnTouchMotionEvent(
- location, timestamp, touch_pointer_ids[0],
- WaylandTouch::Delegate::EventDispatchPolicy::kImmediate);
+ touch_delegate_->OnTouchMotionEvent(location, timestamp,
+ touch_pointer_ids[0],
+ wl::EventDispatchPolicy::kImmediate);
}
}
@@ -299,15 +303,15 @@ void WaylandWindowDragController::OnDragLeave() {
DVLOG(1) << "OnLeave";
data_offer_.reset();
- // As Wayland clients are only aware of surface-local coordinates and there is
- // no implicit grab during DND sessions, a fake motion event with negative
- // y coordinate is used here to allow higher level UI components to detect
- // when a window should be detached. E.g: On Chrome, dragging a tab all the
- // way up to the top edge of the window won't work without this fake motion
- // event upon wl_data_device::leave events. This is a workaround and should
- // ideally be reworked in the future, at higher level layers such that they
- // properly handle platforms that do not support global screen coordinates,
- // like Wayland.
+ // As wl-shell/xdg-shell clients are only aware of surface-local coordinates
+ // and there is no implicit grab during DND sessions, a fake motion event with
+ // negative y coordinate is used here to allow higher level UI components to
+ // detect when a window should be detached. E.g: On Chrome, dragging a tab all
+ // the way up to the top edge of the window won't work without this fake
+ // motion event upon wl_data_device::leave events. This is a workaround and
+ // should ideally be reworked in the future, at higher level layers such that
+ // they properly handle platforms that do not support global screen
+ // coordinates, like Wayland.
//
// TODO(https://crbug.com/1282186): Find a better solution for upwards tab
// detaching.
@@ -328,8 +332,7 @@ void WaylandWindowDragController::OnDragLeave() {
// the drag event is discarded.
touch_delegate_->OnTouchMotionEvent(
{pointer_location_.x(), kHorizontalRailExitThreshold}, timestamp,
- touch_pointer_ids[0],
- WaylandTouch::Delegate::EventDispatchPolicy::kImmediate);
+ touch_pointer_ids[0], wl::EventDispatchPolicy::kImmediate);
}
}
@@ -373,8 +376,11 @@ void WaylandWindowDragController::OnDataSourceFinish(bool completed) {
// In case of touch, though, we simply reset the focus altogether.
if (IsExtendedDragAvailableInternal() && dragged_window_) {
if (*drag_source_ == DragSource::kMouse) {
- pointer_delegate_->OnPointerFocusChanged(dragged_window_,
- pointer_location_);
+ // TODO: check if this usage is correct.
+
+ pointer_delegate_->OnPointerFocusChanged(
+ dragged_window_, pointer_location_,
+ wl::EventDispatchPolicy::kImmediate);
} else {
touch_delegate_->OnTouchFocusChanged(dragged_window_);
}
@@ -456,15 +462,6 @@ void WaylandWindowDragController::HandleMotionEvent(LocatedEvent* event) {
if (!should_process_drag_event_)
return;
- // Update current cursor position relative to the event source
- // (focused window) so it can be retrieved later on through
- // |Screen::GetCursorScreenPoint| API.
- auto* pointer_focused_window = connection_->wayland_window_manager()
- ->GetCurrentPointerOrTouchFocusedWindow();
-
- if (pointer_focused_window)
- pointer_focused_window->UpdateCursorPositionFromEvent(event);
-
// Notify listeners about window bounds change (i.e: re-positioning) event.
// To do so, set the new bounds as per the motion event location and the drag
// offset. Note that setting a new location (i.e: bounds.origin()) for a
@@ -501,9 +498,9 @@ void WaylandWindowDragController::HandleDropAndResetState() {
} else {
auto touch_pointer_ids = touch_delegate_->GetActiveTouchPointIds();
DCHECK_EQ(touch_pointer_ids.size(), 1u);
- touch_delegate_->OnTouchReleaseEvent(
- base::TimeTicks::Now(), touch_pointer_ids[0],
- WaylandTouch::Delegate::EventDispatchPolicy::kImmediate);
+ touch_delegate_->OnTouchReleaseEvent(base::TimeTicks::Now(),
+ touch_pointer_ids[0],
+ wl::EventDispatchPolicy::kImmediate);
}
pointer_grab_owner_ = nullptr;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.h b/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.h
index d0f5bd5e589..667123b3137 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.h
@@ -11,6 +11,7 @@
#include <string>
#include "base/callback_forward.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "ui/events/event.h"
#include "ui/events/platform/platform_event_dispatcher.h"
@@ -142,12 +143,12 @@ class WaylandWindowDragController : public WaylandDataDevice::DragDelegate,
// |set_extended_drag_available_for_testing_|.
bool IsExtendedDragAvailableInternal() const;
- WaylandConnection* const connection_;
- WaylandDataDeviceManager* const data_device_manager_;
- WaylandDataDevice* const data_device_;
- WaylandWindowManager* const window_manager_;
- WaylandPointer::Delegate* const pointer_delegate_;
- WaylandTouch::Delegate* const touch_delegate_;
+ const raw_ptr<WaylandConnection> connection_;
+ const raw_ptr<WaylandDataDeviceManager> data_device_manager_;
+ const raw_ptr<WaylandDataDevice> data_device_;
+ const raw_ptr<WaylandWindowManager> window_manager_;
+ const raw_ptr<WaylandPointer::Delegate> pointer_delegate_;
+ const raw_ptr<WaylandTouch::Delegate> touch_delegate_;
State state_ = State::kIdle;
absl::optional<DragSource> drag_source_;
@@ -163,17 +164,17 @@ class WaylandWindowDragController : public WaylandDataDevice::DragDelegate,
std::unique_ptr<ExtendedDragSource> extended_drag_source_;
// The current toplevel window being dragged, when in detached mode.
- WaylandToplevelWindow* dragged_window_ = nullptr;
+ raw_ptr<WaylandToplevelWindow> dragged_window_ = nullptr;
// Keeps track of the window that holds the pointer grab. i.e: the owner of
// the surface that must receive the mouse release event upon drop.
- WaylandWindow* pointer_grab_owner_ = nullptr;
+ raw_ptr<WaylandWindow> pointer_grab_owner_ = nullptr;
// The window where the DND session originated from. i.e: which had the
// pointer focus when the session was initiated.
- WaylandWindow* origin_window_ = nullptr;
+ raw_ptr<WaylandWindow> origin_window_ = nullptr;
- WaylandWindow* drag_target_window_ = nullptr;
+ raw_ptr<WaylandWindow> drag_target_window_ = nullptr;
// The |origin_window_| can be destroyed during the DND session. If this
// happens, |origin_surface_| takes ownership of its surface and ensure it
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc b/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc
index 630bf226a49..9c5805b2c2c 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc
@@ -55,7 +55,7 @@ class WaylandWindowDragControllerTest : public WaylandDragDropTest {
WaylandDragDropTest::SetUp();
drag_controller()->SetExtendedDragAvailableForTesting();
- EXPECT_FALSE(window_->has_pointer_focus());
+ EXPECT_FALSE(window_->HasPointerFocus());
EXPECT_EQ(State::kIdle, drag_controller()->state());
}
@@ -64,6 +64,7 @@ class WaylandWindowDragControllerTest : public WaylandDragDropTest {
}
MockWaylandPlatformWindowDelegate& delegate() { return delegate_; }
+ WaylandWindow* window() { return window_.get(); }
protected:
using State = WaylandWindowDragController::State;
@@ -215,10 +216,11 @@ TEST_P(WaylandWindowDragControllerTest, DragInsideWindowAndDrop) {
});
EXPECT_CALL(delegate_, OnBoundsChanged(_))
- .WillOnce([&](const PlatformWindowDelegate::BoundsChange& bounds) {
+ .WillOnce([&](const PlatformWindowDelegate::BoundsChange& change) {
EXPECT_EQ(State::kDetached, drag_controller()->state());
EXPECT_EQ(kDragging, test_step);
- EXPECT_EQ(gfx::Point(20, 20), bounds.bounds.origin());
+ EXPECT_EQ(gfx::Point(20, 20), window_->GetBoundsInDIP().origin());
+ EXPECT_TRUE(change.origin_changed);
SendDndDrop();
test_step = kDropping;
@@ -292,10 +294,11 @@ TEST_P(WaylandWindowDragControllerTest, DragInsideWindowAndDrop_TOUCH) {
});
EXPECT_CALL(delegate_, OnBoundsChanged(_))
- .WillOnce([&](const PlatformWindowDelegate::BoundsChange& bounds) {
+ .WillOnce([&](const PlatformWindowDelegate::BoundsChange& change) {
EXPECT_EQ(State::kDetached, drag_controller()->state());
EXPECT_EQ(kDragging, test_step);
- EXPECT_EQ(gfx::Point(20, 20), bounds.bounds.origin());
+ EXPECT_EQ(gfx::Point(20, 20), window_->GetBoundsInDIP().origin());
+ EXPECT_TRUE(change.origin_changed);
SendDndDrop();
test_step = kDropping;
@@ -448,10 +451,11 @@ TEST_P(WaylandWindowDragControllerTest, DragExitWindowAndDrop) {
});
EXPECT_CALL(delegate_, OnBoundsChanged(_))
- .WillOnce([&](const PlatformWindowDelegate::BoundsChange& bounds) {
+ .WillOnce([&](const PlatformWindowDelegate::BoundsChange& change) {
EXPECT_EQ(State::kDetached, drag_controller()->state());
EXPECT_EQ(kDragging, test_step);
- EXPECT_EQ(gfx::Point(20, 20), bounds.bounds.origin());
+ EXPECT_EQ(gfx::Point(20, 20), window_->GetBoundsInDIP().origin());
+ EXPECT_TRUE(change.origin_changed);
SendDndLeave();
SendDndDrop();
@@ -557,10 +561,11 @@ TEST_P(WaylandWindowDragControllerTest, DragToOtherWindowSnapDragDrop) {
});
EXPECT_CALL(delegate_, OnBoundsChanged(_))
- .WillOnce([&](const PlatformWindowDelegate::BoundsChange& bounds) {
+ .WillOnce([&](const PlatformWindowDelegate::BoundsChange& change) {
EXPECT_EQ(State::kDetached, drag_controller()->state());
EXPECT_EQ(kDragging, test_step);
- EXPECT_EQ(gfx::Point(50, 50), bounds.bounds.origin());
+ EXPECT_EQ(gfx::Point(50, 50), window_->GetBoundsInDIP().origin());
+ EXPECT_TRUE(change.origin_changed);
// Exit |source_window| and enter the |target_window|.
SendDndLeave();
@@ -687,10 +692,11 @@ TEST_P(WaylandWindowDragControllerTest, DragToOtherWindowSnapDragDrop_TOUCH) {
} test_step = kStarted;
EXPECT_CALL(delegate_, OnBoundsChanged(_))
- .WillOnce([&](const PlatformWindowDelegate::BoundsChange& bounds) {
+ .WillOnce([&](const PlatformWindowDelegate::BoundsChange& change) {
EXPECT_EQ(State::kDetached, drag_controller()->state());
EXPECT_EQ(kDragging, test_step);
- EXPECT_EQ(gfx::Point(50, 50), bounds.bounds.origin());
+ EXPECT_EQ(gfx::Point(50, 50), window_->GetBoundsInDIP().origin());
+ EXPECT_TRUE(change.origin_changed);
// Exit |source_window| and enter the |target_window|.
SendDndLeave();
@@ -858,18 +864,23 @@ TEST_P(WaylandWindowDragControllerTest, DragExitAttached_TOUCH) {
Sync();
}
+using BoundsChange = PlatformWindowDelegate::BoundsChange;
+
TEST_P(WaylandWindowDragControllerTest, RestoreDuringWindowDragSession) {
- const gfx::Rect original_bounds = window_->GetBoundsInPixels();
+ const gfx::Rect original_bounds = window_->GetBoundsInDIP();
wl::ScopedWlArray states({XDG_TOPLEVEL_STATE_ACTIVATED});
// Maximize and check restored bounds is correctly set.
- gfx::Rect maximized_bounds = {0, 0, 1024, 768};
- EXPECT_CALL(delegate_, OnBoundsChanged(testing::Eq(maximized_bounds)));
+ constexpr gfx::Rect kMaximizedBounds{1024, 768};
+ EXPECT_CALL(delegate_, OnBoundsChanged(testing::Eq(BoundsChange(false))));
window_->Maximize();
states.AddStateToWlArray(XDG_TOPLEVEL_STATE_MAXIMIZED);
- SendConfigureEvent(surface_->xdg_surface(), maximized_bounds.width(),
- maximized_bounds.height(), 1, states.get());
+ SendConfigureEvent(surface_->xdg_surface(), kMaximizedBounds.size(), 1,
+ states.get());
Sync();
+
+ EXPECT_EQ(kMaximizedBounds, window_->GetBoundsInDIP());
+
auto restored_bounds = window_->GetRestoredBoundsInDIP();
EXPECT_EQ(original_bounds, restored_bounds);
@@ -970,10 +981,12 @@ TEST_P(WaylandWindowDragControllerTest, IgnorePointerEventsUntilDrop) {
});
EXPECT_CALL(delegate_, OnBoundsChanged(_))
- .WillOnce([&](const PlatformWindowDelegate::BoundsChange& bounds) {
+ .WillOnce([&](const PlatformWindowDelegate::BoundsChange& change) {
EXPECT_EQ(State::kDetached, drag_controller()->state());
EXPECT_EQ(kDragging, test_step);
- EXPECT_EQ(gfx::Point(100, 100), bounds.bounds.origin());
+ EXPECT_TRUE(change.origin_changed);
+ EXPECT_EQ(gfx::Point(100, 100), window_->GetBoundsInDIP().origin());
+ EXPECT_TRUE(change.origin_changed);
// Send a few wl_pointer::motion events skipping sync and dispatch
// checks, which will be done at |kDropping| test step handling.
@@ -1034,7 +1047,9 @@ TEST_P(WaylandWindowDragControllerTest, MotionEventsSkippedWhileReattaching) {
self->SendDndMotion({30, 30});
EXPECT_CALL(self->delegate(), OnBoundsChanged(_))
.WillOnce([&](const PlatformWindowDelegate::BoundsChange& change) {
- EXPECT_EQ(gfx::Point(30, 30), change.bounds.origin());
+ EXPECT_EQ(gfx::Point(30, 30),
+ self->window()->GetBoundsInDIP().origin());
+ EXPECT_TRUE(change.origin_changed);
});
self->Sync();
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window_factory.cc b/chromium/ui/ozone/platform/wayland/host/wayland_window_factory.cc
index ed35763da2d..b270ef30fb6 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_factory.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_factory.cc
@@ -58,8 +58,9 @@ std::unique_ptr<WaylandWindow> WaylandWindow::Create(
NOTREACHED();
break;
}
- window->set_update_visual_size_immediately(update_visual_size_immediately);
- window->set_apply_pending_state_on_update_visual_size(
+ window->set_update_visual_size_immediately_for_testing(
+ update_visual_size_immediately);
+ window->set_apply_pending_state_on_update_visual_size_for_testing(
apply_pending_state_on_update_visual_size);
return window && window->Initialize(std::move(properties)) ? std::move(window)
: nullptr;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window_manager.cc b/chromium/ui/ozone/platform/wayland/host/wayland_window_manager.cc
index 85cda44d54d..d350c2af994 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_manager.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_manager.cc
@@ -29,13 +29,18 @@ void WaylandWindowManager::NotifyWindowConfigured(WaylandWindow* window) {
observer.OnWindowConfigured(window);
}
+void WaylandWindowManager::NotifyWindowRoleAssigned(WaylandWindow* window) {
+ for (WaylandWindowObserver& observer : observers_)
+ observer.OnWindowRoleAssigned(window);
+}
+
void WaylandWindowManager::GrabLocatedEvents(WaylandWindow* window) {
DCHECK_NE(located_events_grabber_, window);
// Wayland doesn't allow to grab the mouse. However, we start forwarding all
// mouse events received by WaylandWindow to the aura::WindowEventDispatcher
// which has capture.
- auto* old_grabber = located_events_grabber_;
+ auto* old_grabber = located_events_grabber_.get();
located_events_grabber_ = window;
if (old_grabber)
old_grabber->OnWindowLostCapture();
@@ -43,7 +48,7 @@ void WaylandWindowManager::GrabLocatedEvents(WaylandWindow* window) {
void WaylandWindowManager::UngrabLocatedEvents(WaylandWindow* window) {
DCHECK_EQ(located_events_grabber_, window);
- auto* old_grabber = located_events_grabber_;
+ auto* old_grabber = located_events_grabber_.get();
located_events_grabber_ = nullptr;
old_grabber->OnWindowLostCapture();
}
@@ -80,9 +85,10 @@ WaylandWindow* WaylandWindowManager::GetCurrentActiveWindow() const {
WaylandWindow* WaylandWindowManager::GetCurrentFocusedWindow() const {
for (const auto& entry : window_map_) {
WaylandWindow* window = entry.second;
- if (window->has_pointer_focus() || window->has_touch_focus() ||
- window->has_keyboard_focus())
+ if (window == pointer_focused_window_ || window->has_touch_focus() ||
+ window == keyboard_focused_window_) {
return window;
+ }
}
return nullptr;
}
@@ -102,19 +108,25 @@ WaylandWindow* WaylandWindowManager::GetCurrentPointerOrTouchFocusedWindow()
for (const auto& entry : window_map_) {
WaylandWindow* window = entry.second;
- if (window->has_pointer_focus() || window->has_touch_focus())
+ if (window == pointer_focused_window_ || window->has_touch_focus())
return window;
}
return nullptr;
}
WaylandWindow* WaylandWindowManager::GetCurrentPointerFocusedWindow() const {
+#if DCHECK_IS_ON()
+ bool found = !pointer_focused_window_;
for (const auto& entry : window_map_) {
WaylandWindow* window = entry.second;
- if (window->has_pointer_focus())
- return window;
+ if (window == pointer_focused_window_) {
+ found = true;
+ break;
+ }
}
- return nullptr;
+ DCHECK(found);
+#endif
+ return pointer_focused_window_;
}
WaylandWindow* WaylandWindowManager::GetCurrentTouchFocusedWindow() const {
@@ -127,12 +139,18 @@ WaylandWindow* WaylandWindowManager::GetCurrentTouchFocusedWindow() const {
}
WaylandWindow* WaylandWindowManager::GetCurrentKeyboardFocusedWindow() const {
+#if DCHECK_IS_ON()
+ bool found = !keyboard_focused_window_;
for (const auto& entry : window_map_) {
WaylandWindow* window = entry.second;
- if (window->has_keyboard_focus())
- return window;
+ if (window == keyboard_focused_window_) {
+ found = true;
+ break;
+ }
}
- return nullptr;
+ DCHECK(found);
+#endif
+ return keyboard_focused_window_;
}
void WaylandWindowManager::SetPointerFocusedWindow(WaylandWindow* window) {
@@ -140,9 +158,10 @@ void WaylandWindowManager::SetPointerFocusedWindow(WaylandWindow* window) {
if (window == old_focused_window)
return;
if (old_focused_window)
- old_focused_window->SetPointerFocus(false);
+ old_focused_window->OnPointerFocusChanged(false);
+ pointer_focused_window_ = window;
if (window)
- window->SetPointerFocus(true);
+ window->OnPointerFocusChanged(true);
}
void WaylandWindowManager::SetTouchFocusedWindow(WaylandWindow* window) {
@@ -159,24 +178,11 @@ void WaylandWindowManager::SetKeyboardFocusedWindow(WaylandWindow* window) {
auto* old_focused_window = GetCurrentKeyboardFocusedWindow();
if (window == old_focused_window)
return;
- if (old_focused_window)
- old_focused_window->set_keyboard_focus(false);
- if (window)
- window->set_keyboard_focus(true);
+ keyboard_focused_window_ = window;
for (auto& observer : observers_)
observer.OnKeyboardFocusedWindowChanged();
}
-std::vector<WaylandWindow*> WaylandWindowManager::GetWindowsOnOutput(
- uint32_t output_id) {
- std::vector<WaylandWindow*> result;
- for (auto entry : window_map_) {
- if (entry.second->GetPreferredEnteredOutputId() == output_id)
- result.push_back(entry.second);
- }
- return result;
-}
-
void WaylandWindowManager::AddWindow(gfx::AcceleratedWidget widget,
WaylandWindow* window) {
window_map_[widget] = window;
@@ -194,10 +200,13 @@ void WaylandWindowManager::RemoveWindow(gfx::AcceleratedWidget widget) {
for (WaylandWindowObserver& observer : observers_)
observer.OnWindowRemoved(window);
- if (window->has_keyboard_focus()) {
+ if (window == keyboard_focused_window_) {
+ keyboard_focused_window_ = nullptr;
for (auto& observer : observers_)
observer.OnKeyboardFocusedWindowChanged();
}
+ if (window == pointer_focused_window_)
+ pointer_focused_window_ = nullptr;
}
void WaylandWindowManager::AddSubsurface(gfx::AcceleratedWidget widget,
@@ -229,4 +238,12 @@ std::vector<WaylandWindow*> WaylandWindowManager::GetAllWindows() const {
return result;
}
+bool WaylandWindowManager::IsWindowValid(const WaylandWindow* window) const {
+ for (auto pair : window_map_) {
+ if (pair.second == window)
+ return true;
+ }
+ return false;
+}
+
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window_manager.h b/chromium/ui/ozone/platform/wayland/host/wayland_window_manager.h
index a746457627e..bc8c7e95b10 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_manager.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_manager.h
@@ -8,6 +8,7 @@
#include <memory>
#include "base/containers/flat_map.h"
+#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "ui/gfx/geometry/size_f.h"
#include "ui/gfx/native_widget_types.h"
@@ -35,6 +36,9 @@ class WaylandWindowManager {
// WaylandBufferManagerHost can start attaching buffers to the |surface_|.
void NotifyWindowConfigured(WaylandWindow* window);
+ // Notifies observers that the window's wayland role has been assigned.
+ void NotifyWindowRoleAssigned(WaylandWindow* window);
+
// Stores the window that should grab the located events.
void GrabLocatedEvents(WaylandWindow* event_grabber);
@@ -91,13 +95,12 @@ class WaylandWindowManager {
// The given |window| must be managed by this manager.
void SetKeyboardFocusedWindow(WaylandWindow* window);
- // TODO(crbug.com/971525): remove this in favor of targeted subscription of
- // windows to their outputs.
- std::vector<WaylandWindow*> GetWindowsOnOutput(uint32_t output_id);
-
// Returns all stored windows.
std::vector<WaylandWindow*> GetAllWindows() const;
+ // Returns true if the |window| still exists.
+ bool IsWindowValid(const WaylandWindow* window) const;
+
void AddWindow(gfx::AcceleratedWidget widget, WaylandWindow* window);
void RemoveWindow(gfx::AcceleratedWidget widget);
void AddSubsurface(gfx::AcceleratedWidget widget,
@@ -109,13 +112,16 @@ class WaylandWindowManager {
gfx::AcceleratedWidget AllocateAcceleratedWidget();
private:
- WaylandConnection* const connection_;
+ WaylandWindow* pointer_focused_window_ = nullptr;
+ WaylandWindow* keyboard_focused_window_ = nullptr;
+
+ const raw_ptr<WaylandConnection> connection_;
base::ObserverList<WaylandWindowObserver> observers_;
base::flat_map<gfx::AcceleratedWidget, WaylandWindow*> window_map_;
- WaylandWindow* located_events_grabber_ = nullptr;
+ raw_ptr<WaylandWindow> located_events_grabber_ = nullptr;
// Stores strictly monotonically increasing counter for allocating unique
// AccelerateWidgets.
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window_manager_unittests.cc b/chromium/ui/ozone/platform/wayland/host/wayland_window_manager_unittests.cc
index 0e8af0f518d..08e2d1594dd 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_manager_unittests.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_manager_unittests.cc
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/memory/raw_ptr.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/ozone/platform/wayland/host/wayland_output.h"
#include "ui/ozone/platform/wayland/test/mock_pointer.h"
@@ -48,7 +49,7 @@ class WaylandWindowManagerTest : public WaylandTest {
return window;
}
- WaylandWindowManager* manager_ = nullptr;
+ raw_ptr<WaylandWindowManager> manager_ = nullptr;
};
TEST_P(WaylandWindowManagerTest, GetWindow) {
@@ -93,8 +94,7 @@ TEST_P(WaylandWindowManagerTest, GetCurrentFocusedWindow) {
auto window1 = CreateWaylandWindowWithParams(PlatformWindowType::kWindow,
kDefaultBounds, &delegate);
// When window is shown, it automatically gets keyboard focus. Reset it.
- window_->set_keyboard_focus(false);
- window1->set_keyboard_focus(false);
+ connection_->wayland_window_manager()->SetKeyboardFocusedWindow(nullptr);
Sync();
@@ -108,6 +108,7 @@ TEST_P(WaylandWindowManagerTest, GetCurrentFocusedWindow) {
wl::MockSurface* surface = server_.GetObject<wl::MockSurface>(
window1->root_surface()->GetSurfaceId());
wl_pointer_send_enter(pointer->resource(), 1, surface->resource(), 0, 0);
+ wl_pointer_send_frame(pointer->resource());
Sync();
@@ -118,6 +119,7 @@ TEST_P(WaylandWindowManagerTest, GetCurrentFocusedWindow) {
EXPECT_TRUE(window1.get() == manager_->GetCurrentPointerFocusedWindow());
wl_pointer_send_leave(pointer->resource(), 2, surface->resource());
+ wl_pointer_send_frame(pointer->resource());
Sync();
@@ -137,8 +139,7 @@ TEST_P(WaylandWindowManagerTest, GetCurrentKeyboardFocusedWindow) {
auto window1 = CreateWaylandWindowWithParams(PlatformWindowType::kWindow,
kDefaultBounds, &delegate);
// When window is shown, it automatically gets keyboard focus. Reset it.
- window_->set_keyboard_focus(false);
- window1->set_keyboard_focus(false);
+ connection_->wayland_window_manager()->SetKeyboardFocusedWindow(nullptr);
Sync();
@@ -167,58 +168,6 @@ TEST_P(WaylandWindowManagerTest, GetCurrentKeyboardFocusedWindow) {
EXPECT_FALSE(manager_->GetCurrentKeyboardFocusedWindow());
}
-TEST_P(WaylandWindowManagerTest, GetWindowsOnOutput) {
- MockPlatformWindowDelegate delegate;
-
- // Create a second wl_output.
- wl::TestOutput* output = server_.CreateAndInitializeOutput();
- Sync();
-
- // Place it at the right of the first output.
- int x = server_.output()->GetRect().x();
- output->SetRect({x, 0, 800, 600});
- output->Flush();
- Sync();
-
- auto window1 = CreateWaylandWindowWithParams(PlatformWindowType::kWindow,
- kDefaultBounds, &delegate);
-
- auto window2 = CreateWaylandWindowWithParams(PlatformWindowType::kWindow,
- kDefaultBounds, &delegate);
-
- Sync();
-
- wl::MockSurface* surface = server_.GetObject<wl::MockSurface>(
- window1->root_surface()->GetSurfaceId());
- ASSERT_TRUE(surface);
- wl_surface_send_enter(surface->resource(), output->resource());
-
- Sync();
-
- auto entered_outputs_window1 = window1->root_surface()->entered_outputs();
- EXPECT_EQ(1u, entered_outputs_window1.size());
-
- uint32_t output_id = (*entered_outputs_window1.begin());
-
- auto windows_on_output = manager_->GetWindowsOnOutput(output_id);
- EXPECT_EQ(1u, windows_on_output.size());
-
- EXPECT_TRUE(window1.get() == *windows_on_output.begin());
-
- surface = server_.GetObject<wl::MockSurface>(
- window2->root_surface()->GetSurfaceId());
- ASSERT_TRUE(surface);
- wl_surface_send_enter(surface->resource(), output->resource());
-
- Sync();
-
- windows_on_output = manager_->GetWindowsOnOutput(output_id);
- EXPECT_EQ(2u, windows_on_output.size());
-
- output->DestroyGlobal();
- Sync();
-}
-
TEST_P(WaylandWindowManagerTest, GetAllWindows) {
MockPlatformWindowDelegate delegate;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window_observer.cc b/chromium/ui/ozone/platform/wayland/host/wayland_window_observer.cc
index 97c029f907b..de1e13431a5 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_observer.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_observer.cc
@@ -14,6 +14,8 @@ void WaylandWindowObserver::OnWindowRemoved(WaylandWindow* window) {}
void WaylandWindowObserver::OnWindowConfigured(WaylandWindow* window) {}
+void WaylandWindowObserver::OnWindowRoleAssigned(WaylandWindow* window) {}
+
void WaylandWindowObserver::OnSubsurfaceAdded(WaylandWindow* window,
WaylandSubsurface* subsurface) {}
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window_observer.h b/chromium/ui/ozone/platform/wayland/host/wayland_window_observer.h
index cc577ffa38f..729bf9d665f 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_observer.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_observer.h
@@ -24,6 +24,9 @@ class WaylandWindowObserver : public base::CheckedObserver {
// Called when |window| has been ack configured.
virtual void OnWindowConfigured(WaylandWindow* window);
+ // Called when |window| has been assigned a role.
+ virtual void OnWindowRoleAssigned(WaylandWindow* window);
+
// Called when |window| adds |subsurface|.
virtual void OnSubsurfaceAdded(WaylandWindow* window,
WaylandSubsurface* subsurface);
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window_unittest.cc b/chromium/ui/ozone/platform/wayland/host/wayland_window_unittest.cc
index 7df9e99d9b8..dbe56638bc4 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_unittest.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "ui/ozone/platform/wayland/host/wayland_window.h"
+#include "base/memory/raw_ptr.h"
#include <cstddef>
#include <memory>
@@ -30,6 +31,7 @@
#include "ui/base/hit_test.h"
#include "ui/base/ui_base_types.h"
#include "ui/display/display.h"
+#include "ui/display/types/display_constants.h"
#include "ui/events/base_event_utils.h"
#include "ui/events/event.h"
#include "ui/gfx/geometry/insets.h"
@@ -139,6 +141,10 @@ class MockZcrCursorShapes : public WaylandZcrCursorShapes {
MOCK_METHOD(void, SetCursorShape, (int32_t), (override));
};
+using BoundsChange = PlatformWindowDelegate::BoundsChange;
+
+constexpr BoundsChange kDefaultBoundsChange{false};
+
} // namespace
class WaylandWindowTest : public WaylandTest {
@@ -155,9 +161,6 @@ class WaylandWindowTest : public WaylandTest {
WaylandWindowTest& operator=(const WaylandWindowTest&) = delete;
void SetUp() override {
- disabled_features_.push_back(
- ui::kWaylandSurfaceSubmissionInPixelCoordinates);
-
WaylandTest::SetUp();
xdg_surface_ = surface_->xdg_surface();
@@ -166,7 +169,7 @@ class WaylandWindowTest : public WaylandTest {
protected:
void SendConfigureEventPopup(WaylandWindow* menu_window,
- const gfx::Rect bounds) {
+ const gfx::Rect& bounds) {
auto* popup = GetTestXdgPopupByWindow(menu_window);
ASSERT_TRUE(popup);
if (GetParam().shell_version == wl::ShellVersion::kV6) {
@@ -200,7 +203,7 @@ class WaylandWindowTest : public WaylandTest {
std::unique_ptr<WaylandWindow> CreateWaylandWindowWithParams(
PlatformWindowType type,
gfx::AcceleratedWidget parent_widget,
- const gfx::Rect bounds,
+ const gfx::Rect& bounds,
MockWaylandPlatformWindowDelegate* delegate) {
PlatformWindowInitProperties properties;
// TODO(msisov): use a fancy method to calculate position of a popup window.
@@ -253,10 +256,14 @@ class WaylandWindowTest : public WaylandTest {
}
void VerifyCanDispatchMouseEvents(
- const std::vector<WaylandWindow*>& dispatching_windows,
+ WaylandWindow* dispatching_window,
const std::vector<WaylandWindow*>& non_dispatching_windows) {
- for (auto* window : dispatching_windows)
- EXPECT_TRUE(window->CanDispatchEvent(&test_mouse_event_));
+ auto* pointer_focused_window =
+ connection_->wayland_window_manager()->GetCurrentPointerFocusedWindow();
+
+ DCHECK(pointer_focused_window);
+ Event::DispatcherApi(&test_mouse_event_).set_target(pointer_focused_window);
+ EXPECT_TRUE(dispatching_window->CanDispatchEvent(&test_mouse_event_));
for (auto* window : non_dispatching_windows)
EXPECT_FALSE(window->CanDispatchEvent(&test_mouse_event_));
}
@@ -264,23 +271,55 @@ class WaylandWindowTest : public WaylandTest {
void VerifyCanDispatchTouchEvents(
const std::vector<WaylandWindow*>& dispatching_windows,
const std::vector<WaylandWindow*>& non_dispatching_windows) {
+ DCHECK(dispatching_windows.size() < 2);
+ auto* touch_focused_window =
+ connection_->wayland_window_manager()->GetCurrentTouchFocusedWindow();
+ // There must be focused window to dispatch.
+ if (dispatching_windows.size() == 0)
+ EXPECT_FALSE(touch_focused_window);
+
PointerDetails pointer_details(EventPointerType::kTouch, 1);
TouchEvent test_touch_event(ET_TOUCH_PRESSED, {1, 1}, base::TimeTicks(),
pointer_details);
+ if (touch_focused_window)
+ Event::DispatcherApi(&test_touch_event).set_target(touch_focused_window);
for (auto* window : dispatching_windows)
EXPECT_TRUE(window->CanDispatchEvent(&test_touch_event));
- for (auto* window : non_dispatching_windows)
+ for (auto* window : non_dispatching_windows) {
+ // Make sure that the CanDispatcEvent works on release build.
+#if DCHECK_IS_ON()
+ // Disable DCHECK when enabled.
+ window->disable_null_target_dcheck_for_testing();
+#endif
EXPECT_FALSE(window->CanDispatchEvent(&test_touch_event));
+ }
}
void VerifyCanDispatchKeyEvents(
const std::vector<WaylandWindow*>& dispatching_windows,
const std::vector<WaylandWindow*>& non_dispatching_windows) {
+ DCHECK(dispatching_windows.size() < 2);
+ auto* keyboard_focused_window = connection_->wayland_window_manager()
+ ->GetCurrentKeyboardFocusedWindow();
+
+ // There must be focused window to dispatch.
+ if (dispatching_windows.size() == 0)
+ EXPECT_FALSE(keyboard_focused_window);
+
KeyEvent test_key_event(ET_KEY_PRESSED, VKEY_0, 0);
+ if (keyboard_focused_window)
+ Event::DispatcherApi(&test_key_event).set_target(keyboard_focused_window);
+
for (auto* window : dispatching_windows)
EXPECT_TRUE(window->CanDispatchEvent(&test_key_event));
- for (auto* window : non_dispatching_windows)
+ for (auto* window : non_dispatching_windows) {
+ // Make sure that the CanDispatcEvent works on release build.
+#if DCHECK_IS_ON()
+ // Disable DCHECK when enabled.
+ window->disable_null_target_dcheck_for_testing();
+#endif
EXPECT_FALSE(window->CanDispatchEvent(&test_key_event));
+ }
}
wl::TestXdgPopup* GetTestXdgPopupByWindow(WaylandWindow* window) {
@@ -294,7 +333,7 @@ class WaylandWindowTest : public WaylandTest {
return nullptr;
}
- wl::MockXdgSurface* xdg_surface_;
+ raw_ptr<wl::MockXdgSurface> xdg_surface_;
MouseEvent test_mouse_event_;
};
@@ -305,42 +344,40 @@ TEST_P(WaylandWindowTest, SetTitle) {
}
TEST_P(WaylandWindowTest, UpdateVisualSizeConfiguresWaylandWindow) {
- const auto kNormalBounds = gfx::Rect{0, 0, 500, 300};
+ constexpr gfx::Rect kNormalBounds{500, 300};
uint32_t serial = 0;
auto state = InitializeWlArrayWithActivatedState();
- window_->set_update_visual_size_immediately(false);
+ window_->set_update_visual_size_immediately_for_testing(false);
auto* mock_surface = server_.GetObject<wl::MockSurface>(
window_->root_surface()->GetSurfaceId());
// Configure event makes Wayland update bounds, but does not change toplevel
// input region, opaque region or window geometry immediately. Such actions
// are postponed to UpdateVisualSize();
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kNormalBounds)));
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, kNormalBounds.width(),
- kNormalBounds.height()))
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
+ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(gfx::Rect(kNormalBounds.size())))
.Times(0);
EXPECT_CALL(*xdg_surface_, AckConfigure(1)).Times(0);
EXPECT_CALL(*mock_surface, SetOpaqueRegion(_)).Times(0);
EXPECT_CALL(*mock_surface, SetInputRegion(_)).Times(0);
- SendConfigureEvent(xdg_surface_, kNormalBounds.width(),
- kNormalBounds.height(), ++serial, state.get());
+ SendConfigureEvent(xdg_surface_, kNormalBounds.size(), ++serial, state.get());
Sync();
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, kNormalBounds.width(),
- kNormalBounds.height()));
+ EXPECT_CALL(*xdg_surface_,
+ SetWindowGeometry(gfx::Rect(kNormalBounds.size())));
EXPECT_CALL(*xdg_surface_, AckConfigure(1));
EXPECT_CALL(*mock_surface, SetOpaqueRegion(_));
EXPECT_CALL(*mock_surface, SetInputRegion(_));
- window_->UpdateVisualSize(kNormalBounds.size(), 1.0f);
+ window_->UpdateVisualSize(kNormalBounds.size());
}
// WaylandSurface state changes are sent to wayland compositor when
// ApplyPendingState() is called.
TEST_P(WaylandWindowTest, ApplyPendingStatesAndCommit) {
- window_->set_update_visual_size_immediately(false);
- window_->set_apply_pending_state_on_update_visual_size(false);
+ window_->set_update_visual_size_immediately_for_testing(false);
+ window_->set_apply_pending_state_on_update_visual_size_for_testing(false);
auto* mock_surface = server_.GetObject<wl::MockSurface>(
window_->root_surface()->GetSurfaceId());
@@ -350,7 +387,7 @@ TEST_P(WaylandWindowTest, ApplyPendingStatesAndCommit) {
EXPECT_CALL(*mock_surface, SetInputRegion(_)).Times(0);
EXPECT_CALL(*mock_surface, SetBufferScale(2)).Times(0);
- std::vector<gfx::Rect> region_px = {gfx::Rect{0, 0, 500, 300}};
+ std::vector<gfx::Rect> region_px = {gfx::Rect{500, 300}};
window_->root_surface()->SetOpaqueRegion(&region_px);
window_->root_surface()->SetInputRegion(region_px.data());
window_->root_surface()->SetSurfaceBufferScale(2);
@@ -374,11 +411,14 @@ TEST_P(WaylandWindowTest, ApplyPendingStatesAndCommit) {
// WaylandToplevelWindow::HandleToplevelConfigure does correct rounding when
// some sides of insets divides by 2 with remainder.
TEST_P(WaylandWindowTest, SetDecorationInsets) {
- const auto kNormalBounds = gfx::Rect{0, 0, 956, 556};
+ constexpr gfx::Rect kNormalBounds{956, 556};
const auto kHiDpiScale = 2;
- const auto kHiDpiBounds = gfx::ScaleToRoundedRect(kNormalBounds, kHiDpiScale);
+ const gfx::Size kHiDpiSize =
+ gfx::ScaleToRoundedRect(kNormalBounds, kHiDpiScale).size();
+ const BoundsChange kHiDpiBounds{true};
- window_->SetBoundsInPixels(kNormalBounds);
+ // TODO(crbug.com/1306688): Change this to SetBoundsInDIP.
+ window_->SetBoundsInDIP(kNormalBounds);
uint32_t serial = 0;
auto state = InitializeWlArrayWithActivatedState();
@@ -399,29 +439,24 @@ TEST_P(WaylandWindowTest, SetDecorationInsets) {
auto bounds_with_insets = kNormalBounds;
bounds_with_insets.Inset(kDecorationInsets);
EXPECT_CALL(delegate_, OnBoundsChanged(_)).Times(0);
- EXPECT_CALL(*xdg_surface_,
- SetWindowGeometry(bounds_with_insets.x(), bounds_with_insets.y(),
- bounds_with_insets.width(),
- bounds_with_insets.height()));
+ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(bounds_with_insets));
window_->SetDecorationInsets(&kDecorationInsets);
// Setting the decoration insets does not trigger the immediate update of the
// window geometry. Emulate updating the visual size (sending the frame
// update) for that.
- window_->UpdateVisualSize(kNormalBounds.size(), 1.0f);
+ window_->UpdateVisualSize(kNormalBounds.size());
Sync();
EXPECT_CALL(delegate_, OnBoundsChanged(_)).Times(0);
- EXPECT_CALL(*xdg_surface_,
- SetWindowGeometry(bounds_with_insets.x(), bounds_with_insets.y(),
- bounds_with_insets.width(),
- bounds_with_insets.height()));
- SendConfigureEvent(xdg_surface_, bounds_with_insets.width(),
- bounds_with_insets.height(), ++serial, state.get());
+ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(bounds_with_insets));
+ SendConfigureEvent(xdg_surface_, bounds_with_insets.size(), ++serial,
+ state.get());
Sync();
- // Change scale. This is the only time when we expect the bounds to change.
+ // Change scale. This is the only time when we expect the pixel position to
+ // change.
EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kHiDpiBounds))).Times(1);
output->SetScale(kHiDpiScale);
output->Flush();
@@ -432,170 +467,164 @@ TEST_P(WaylandWindowTest, SetDecorationInsets) {
window_->root_surface()->SetSurfaceBufferScale(kHiDpiScale);
// Set new insets so that rounding does not result in integer.
- const auto kDecorationInsets_2x = gfx::Insets::TLBR(48, 55, 63, 55);
- EXPECT_CALL(*xdg_surface_,
- SetWindowGeometry(bounds_with_insets.x(), bounds_with_insets.y(),
- bounds_with_insets.width(),
- bounds_with_insets.height()));
+ constexpr auto kDecorationInsets_2x = gfx::Insets::TLBR(48, 55, 63, 55);
+ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(bounds_with_insets));
window_->SetDecorationInsets(&kDecorationInsets_2x);
// Setting the decoration insets does not trigger the immediate update of the
// window geometry. Emulate updating the visual size (sending the frame
// update) for that.
- window_->UpdateVisualSize(kHiDpiBounds.size(), kHiDpiScale);
+ window_->UpdateVisualSize(kHiDpiSize);
Sync();
// Now send configure events many times - bounds mustn't change.
for (size_t i = 0; i < 10; i++) {
EXPECT_CALL(delegate_, OnBoundsChanged(_)).Times(0);
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(bounds_with_insets.x(),
- bounds_with_insets.y(),
- bounds_with_insets.width(),
- bounds_with_insets.height()));
- SendConfigureEvent(xdg_surface_, bounds_with_insets.width(),
- bounds_with_insets.height(), ++serial, state.get());
+ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(bounds_with_insets));
+ SendConfigureEvent(xdg_surface_, bounds_with_insets.size(), ++serial,
+ state.get());
Sync();
}
}
TEST_P(WaylandWindowTest, DisregardUnpassedWindowConfigure) {
- const auto kNormalBounds1 = gfx::Rect{0, 0, 500, 300};
- const auto kNormalBounds2 = gfx::Rect{0, 0, 800, 600};
- const auto kNormalBounds3 = gfx::Rect{0, 0, 700, 400};
+ constexpr gfx::Rect kNormalBounds1{500, 300};
+ constexpr gfx::Rect kNormalBounds2{800, 600};
+ constexpr gfx::Rect kNormalBounds3{700, 400};
uint32_t serial = 1;
- window_->set_update_visual_size_immediately(false);
+ window_->set_update_visual_size_immediately_for_testing(false);
// Send 3 configures, and call UpdateVisualSize out of order. The out-of-order
// UpdateVisualSize(kNormalBounds2) should disregarded b/c kNormalBounds2
// never reached UI Compositor when UpdateVisualSize(kNormalBounds2) is
// called.
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, kNormalBounds1.width(),
- kNormalBounds1.height()));
+ EXPECT_CALL(*xdg_surface_,
+ SetWindowGeometry(gfx::Rect(kNormalBounds1.size())));
EXPECT_CALL(*xdg_surface_, AckConfigure(2));
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, kNormalBounds2.width(),
- kNormalBounds2.height()))
+ EXPECT_CALL(*xdg_surface_,
+ SetWindowGeometry(gfx::Rect(kNormalBounds2.size())))
.Times(0);
EXPECT_CALL(*xdg_surface_, AckConfigure(3)).Times(0);
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, kNormalBounds3.width(),
- kNormalBounds3.height()));
+ EXPECT_CALL(*xdg_surface_,
+ SetWindowGeometry(gfx::Rect(kNormalBounds3.size())));
EXPECT_CALL(*xdg_surface_, AckConfigure(4));
auto state = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, kNormalBounds1.width(),
- kNormalBounds1.height(), ++serial, state.get());
+ SendConfigureEvent(xdg_surface_, kNormalBounds1.size(), ++serial,
+ state.get());
state = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, kNormalBounds2.width(),
- kNormalBounds2.height(), ++serial, state.get());
+ SendConfigureEvent(xdg_surface_, kNormalBounds2.size(), ++serial,
+ state.get());
state = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, kNormalBounds3.width(),
- kNormalBounds3.height(), ++serial, state.get());
+ SendConfigureEvent(xdg_surface_, kNormalBounds3.size(), ++serial,
+ state.get());
Sync();
- window_->UpdateVisualSize(kNormalBounds2.size(), 1.0f);
- window_->UpdateVisualSize(kNormalBounds1.size(), 1.0f);
- window_->UpdateVisualSize(kNormalBounds3.size(), 1.0f);
+ window_->UpdateVisualSize(kNormalBounds2.size());
+ window_->UpdateVisualSize(kNormalBounds1.size());
+ window_->UpdateVisualSize(kNormalBounds3.size());
}
TEST_P(WaylandWindowTest, MismatchUpdateVisualSize) {
- const auto kNormalBounds1 = gfx::Rect{0, 0, 500, 300};
- const auto kNormalBounds2 = gfx::Rect{0, 0, 800, 600};
- const auto kNormalBounds3 = gfx::Rect{0, 0, 700, 400};
+ constexpr gfx::Rect kNormalBounds1{500, 300};
+ constexpr gfx::Rect kNormalBounds2{800, 600};
+ constexpr gfx::Rect kNormalBounds3{700, 400};
uint32_t serial = 1;
- window_->set_update_visual_size_immediately(false);
+ window_->set_update_visual_size_immediately_for_testing(false);
auto* mock_surface = server_.GetObject<wl::MockSurface>(
window_->root_surface()->GetSurfaceId());
// UpdateVisualSize with different size from configure events does not
// acknowledge toplevel configure.
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(_, _, _, _)).Times(0);
+ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(_)).Times(0);
EXPECT_CALL(*xdg_surface_, AckConfigure(_)).Times(0);
EXPECT_CALL(*mock_surface, SetOpaqueRegion(_));
EXPECT_CALL(*mock_surface, SetInputRegion(_));
auto state = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, kNormalBounds1.width(),
- kNormalBounds1.height(), ++serial, state.get());
+ SendConfigureEvent(xdg_surface_, kNormalBounds1.size(), ++serial,
+ state.get());
state = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, kNormalBounds2.width(),
- kNormalBounds2.height(), ++serial, state.get());
+ SendConfigureEvent(xdg_surface_, kNormalBounds2.size(), ++serial,
+ state.get());
state = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, kNormalBounds3.width(),
- kNormalBounds3.height(), ++serial, state.get());
+ SendConfigureEvent(xdg_surface_, kNormalBounds3.size(), ++serial,
+ state.get());
Sync();
- window_->UpdateVisualSize({100, 100}, 1.0f);
+ window_->UpdateVisualSize({100, 100});
}
TEST_P(WaylandWindowTest, UpdateVisualSizeClearsPreviousUnackedConfigures) {
- const auto kNormalBounds1 = gfx::Rect{0, 0, 500, 300};
- const auto kNormalBounds2 = gfx::Rect{0, 0, 800, 600};
- const auto kNormalBounds3 = gfx::Rect{0, 0, 700, 400};
+ constexpr gfx::Rect kNormalBounds1{500, 300};
+ constexpr gfx::Rect kNormalBounds2{800, 600};
+ constexpr gfx::Rect kNormalBounds3{700, 400};
uint32_t serial = 1;
auto state = InitializeWlArrayWithActivatedState();
- window_->set_update_visual_size_immediately(false);
+ window_->set_update_visual_size_immediately_for_testing(false);
// Send 3 configures. Calling UpdateVisualSize(kNormalBounds3) will cause the
// kNormalBounds3 to be passed onto UI compositor. Hence, kNormalBounds1/2/3
// configs will be acknowledgeable. The next UpdateVisualSize(kNormalBounds3)
- // wiil ack kNormalBounds3 and skip kNormalBounds1/2.
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, kNormalBounds1.width(),
- kNormalBounds1.height()))
+ // will ack kNormalBounds3 and skip kNormalBounds1/2.
+ EXPECT_CALL(*xdg_surface_,
+ SetWindowGeometry(gfx::Rect(kNormalBounds1.size())))
.Times(0);
EXPECT_CALL(*xdg_surface_, AckConfigure(2)).Times(0);
- SendConfigureEvent(xdg_surface_, kNormalBounds1.width(),
- kNormalBounds1.height(), ++serial, state.get());
+ SendConfigureEvent(xdg_surface_, kNormalBounds1.size(), ++serial,
+ state.get());
Sync();
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, kNormalBounds2.width(),
- kNormalBounds2.height()))
+ EXPECT_CALL(*xdg_surface_,
+ SetWindowGeometry(gfx::Rect(kNormalBounds2.size())))
.Times(0);
EXPECT_CALL(*xdg_surface_, AckConfigure(3)).Times(0);
state = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, kNormalBounds2.width(),
- kNormalBounds2.height(), ++serial, state.get());
+ SendConfigureEvent(xdg_surface_, kNormalBounds2.size(), ++serial,
+ state.get());
Sync();
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, kNormalBounds3.width(),
- kNormalBounds3.height()));
+ EXPECT_CALL(*xdg_surface_,
+ SetWindowGeometry(gfx::Rect(kNormalBounds3.size())));
EXPECT_CALL(*xdg_surface_, AckConfigure(4));
state = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, kNormalBounds3.width(),
- kNormalBounds3.height(), ++serial, state.get());
+ SendConfigureEvent(xdg_surface_, kNormalBounds3.size(), ++serial,
+ state.get());
Sync();
- window_->UpdateVisualSize(kNormalBounds3.size(), 1.0f);
- window_->UpdateVisualSize(kNormalBounds3.size(), 1.0f);
+ window_->UpdateVisualSize(kNormalBounds3.size());
+ window_->UpdateVisualSize(kNormalBounds3.size());
}
TEST_P(WaylandWindowTest, MaximizeAndRestore) {
- const auto kNormalBounds = gfx::Rect{0, 0, 500, 300};
- const auto kMaximizedBounds = gfx::Rect{0, 0, 800, 600};
+ constexpr gfx::Rect kNormalBounds{500, 300};
+ constexpr gfx::Rect kMaximizedBounds{800, 600};
uint32_t serial = 0;
// Make sure the window has normal state initially.
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kNormalBounds)));
- window_->SetBoundsInPixels(kNormalBounds);
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
+ window_->SetBoundsInDIP(gfx::Rect(kNormalBounds.size()));
EXPECT_EQ(PlatformWindowState::kNormal, window_->GetPlatformWindowState());
VerifyAndClearExpectations();
// Deactivate the surface.
auto empty_state = MakeStateArray({});
- SendConfigureEvent(xdg_surface_, 0, 0, ++serial, empty_state.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, ++serial, empty_state.get());
Sync();
auto active_maximized = MakeStateArray(
{XDG_TOPLEVEL_STATE_ACTIVATED, XDG_TOPLEVEL_STATE_MAXIMIZED});
EXPECT_CALL(*GetXdgToplevel(), SetMaximized());
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, kMaximizedBounds.width(),
- kMaximizedBounds.height()));
+ EXPECT_CALL(*xdg_surface_,
+ SetWindowGeometry(gfx::Rect(kMaximizedBounds.size())));
EXPECT_CALL(delegate_, OnActivationChanged(Eq(true)));
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kMaximizedBounds)));
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
// Emulate a piece of behaviour of BrowserDesktopWindowTreeHostLinux, which is
// the real delegate. Its OnWindowStateChanged() may (through some chain of
// calls) invoke SetWindowGeometry(), but that should not happen during the
@@ -606,35 +635,32 @@ TEST_P(WaylandWindowTest, MaximizeAndRestore) {
.WillOnce(
testing::Invoke([this]() { window_->SetDecorationInsets({}); }));
window_->Maximize();
- SendConfigureEvent(xdg_surface_, kMaximizedBounds.width(),
- kMaximizedBounds.height(), ++serial,
+ SendConfigureEvent(xdg_surface_, kMaximizedBounds.size(), ++serial,
active_maximized.get());
Sync();
VerifyAndClearExpectations();
auto inactive_maximized = MakeStateArray({XDG_TOPLEVEL_STATE_MAXIMIZED});
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, kMaximizedBounds.width(),
- kMaximizedBounds.height()));
+ EXPECT_CALL(*xdg_surface_,
+ SetWindowGeometry(gfx::Rect(kMaximizedBounds.size())));
EXPECT_CALL(delegate_, OnActivationChanged(Eq(false)));
EXPECT_CALL(delegate_, OnBoundsChanged(_)).Times(0);
- SendConfigureEvent(xdg_surface_, kMaximizedBounds.width(),
- kMaximizedBounds.height(), ++serial,
+ SendConfigureEvent(xdg_surface_, kMaximizedBounds.size(), ++serial,
inactive_maximized.get());
Sync();
VerifyAndClearExpectations();
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, kMaximizedBounds.width(),
- kMaximizedBounds.height()));
+ EXPECT_CALL(*xdg_surface_,
+ SetWindowGeometry(gfx::Rect(kMaximizedBounds.size())));
EXPECT_CALL(delegate_, OnActivationChanged(Eq(true)));
EXPECT_CALL(delegate_, OnBoundsChanged(_)).Times(0);
- SendConfigureEvent(xdg_surface_, kMaximizedBounds.width(),
- kMaximizedBounds.height(), ++serial,
+ SendConfigureEvent(xdg_surface_, kMaximizedBounds.size(), ++serial,
active_maximized.get());
Sync();
VerifyAndClearExpectations();
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, kNormalBounds.width(),
- kNormalBounds.height()));
+ EXPECT_CALL(*xdg_surface_,
+ SetWindowGeometry(gfx::Rect(kNormalBounds.size())));
// Emulate a piece of behaviour of BrowserDesktopWindowTreeHostLinux, which is
// the real delegate. Its OnWindowStateChanged() may (through some chain of
// calls) invoke SetWindowGeometry(), but that should not happen during the
@@ -645,12 +671,12 @@ TEST_P(WaylandWindowTest, MaximizeAndRestore) {
.WillOnce(
testing::Invoke([this]() { window_->SetDecorationInsets({}); }));
EXPECT_CALL(delegate_, OnActivationChanged(_)).Times(0);
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kNormalBounds)));
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
EXPECT_CALL(*GetXdgToplevel(), UnsetMaximized());
window_->Restore();
// Reinitialize wl_array, which removes previous old states.
auto active = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, 0, 0, ++serial, active.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, ++serial, active.get());
Sync();
}
@@ -659,7 +685,7 @@ TEST_P(WaylandWindowTest, Minimize) {
// Make sure the window is initialized to normal state from the beginning.
EXPECT_EQ(PlatformWindowState::kNormal, window_->GetPlatformWindowState());
- SendConfigureEvent(xdg_surface_, 0, 0, 1, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 1, states.get());
Sync();
EXPECT_CALL(*GetXdgToplevel(), SetMinimized());
@@ -669,7 +695,7 @@ TEST_P(WaylandWindowTest, Minimize) {
// Reinitialize wl_array, which removes previous old states.
states = ScopedWlArray();
- SendConfigureEvent(xdg_surface_, 0, 0, 2, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 2, states.get());
Sync();
// Wayland compositor doesn't notify clients about minimized state, but rather
@@ -688,11 +714,11 @@ TEST_P(WaylandWindowTest, Minimize) {
.WillRepeatedly(DoAll(SaveArg<0>(&state), InvokeWithoutArgs([&]() {
EXPECT_EQ(state, PlatformWindowState::kMinimized);
})));
- SendConfigureEvent(xdg_surface_, 0, 0, 3, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 3, states.get());
Sync();
// And one last time to ensure the behaviour.
- SendConfigureEvent(xdg_surface_, 0, 0, 4, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 4, states.get());
Sync();
}
@@ -701,7 +727,7 @@ TEST_P(WaylandWindowTest, SetFullscreenAndRestore) {
EXPECT_EQ(PlatformWindowState::kNormal, window_->GetPlatformWindowState());
ScopedWlArray states = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, 0, 0, 1, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 1, states.get());
Sync();
AddStateToWlArray(XDG_TOPLEVEL_STATE_FULLSCREEN, states.get());
@@ -713,7 +739,7 @@ TEST_P(WaylandWindowTest, SetFullscreenAndRestore) {
// comment in the WaylandWindow::ToggleFullscreen.
EXPECT_EQ(window_->GetPlatformWindowState(),
PlatformWindowState::kFullScreen);
- SendConfigureEvent(xdg_surface_, 0, 0, 2, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 2, states.get());
Sync();
EXPECT_CALL(*GetXdgToplevel(), UnsetFullscreen());
@@ -722,7 +748,7 @@ TEST_P(WaylandWindowTest, SetFullscreenAndRestore) {
EXPECT_EQ(window_->GetPlatformWindowState(), PlatformWindowState::kNormal);
// Reinitialize wl_array, which removes previous old states.
states = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, 0, 0, 3, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 3, states.get());
Sync();
EXPECT_EQ(window_->GetPlatformWindowState(), PlatformWindowState::kNormal);
}
@@ -730,7 +756,7 @@ TEST_P(WaylandWindowTest, SetFullscreenAndRestore) {
TEST_P(WaylandWindowTest, StartWithFullscreen) {
MockWaylandPlatformWindowDelegate delegate;
PlatformWindowInitProperties properties;
- properties.bounds = gfx::Rect(0, 0, 100, 100);
+ properties.bounds = gfx::Rect(100, 100);
properties.type = PlatformWindowType::kWindow;
// We need to create a window avoid calling Show() on it as it is what upper
// views layer does - when Widget initialize DesktopWindowTreeHost, the Show()
@@ -764,7 +790,7 @@ TEST_P(WaylandWindowTest, StartWithFullscreen) {
// Activate the surface.
ScopedWlArray states = InitializeWlArrayWithActivatedState();
AddStateToWlArray(XDG_TOPLEVEL_STATE_FULLSCREEN, states.get());
- SendConfigureEvent(xdg_surface_, 0, 0, 1, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 1, states.get());
Sync();
@@ -775,7 +801,7 @@ TEST_P(WaylandWindowTest, StartWithFullscreen) {
TEST_P(WaylandWindowTest, StartMaximized) {
MockWaylandPlatformWindowDelegate delegate;
PlatformWindowInitProperties properties;
- properties.bounds = gfx::Rect(0, 0, 100, 100);
+ properties.bounds = gfx::Rect(100, 100);
properties.type = PlatformWindowType::kWindow;
// We need to create a window avoid calling Show() on it as it is what upper
// views layer does - when Widget initialize DesktopWindowTreeHost, the Show()
@@ -810,7 +836,7 @@ TEST_P(WaylandWindowTest, StartMaximized) {
// Activate the surface.
ScopedWlArray states = InitializeWlArrayWithActivatedState();
AddStateToWlArray(XDG_TOPLEVEL_STATE_MAXIMIZED, states.get());
- SendConfigureEvent(xdg_surface_, 0, 0, 1, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 1, states.get());
Sync();
@@ -820,7 +846,7 @@ TEST_P(WaylandWindowTest, StartMaximized) {
TEST_P(WaylandWindowTest, CompositorSideStateChanges) {
// Real insets used by default on HiDPI.
const auto kInsets = gfx::Insets::TLBR(38, 44, 55, 44);
- const auto kNormalBounds = window_->GetBoundsInPixels();
+ const auto kNormalBounds = window_->GetBoundsInDIP();
EXPECT_EQ(window_->GetPlatformWindowState(), PlatformWindowState::kNormal);
@@ -831,12 +857,12 @@ TEST_P(WaylandWindowTest, CompositorSideStateChanges) {
ScopedWlArray states = InitializeWlArrayWithActivatedState();
AddStateToWlArray(XDG_TOPLEVEL_STATE_MAXIMIZED, states.get());
- SendConfigureEvent(xdg_surface_, 2000, 2000, 1, states.get());
+ SendConfigureEvent(xdg_surface_, {2000, 2000}, 1, states.get());
EXPECT_CALL(delegate_,
OnWindowStateChanged(_, Eq(PlatformWindowState::kMaximized)))
.Times(1);
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, 2000, 2000));
+ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(gfx::Rect{2000, 2000}));
Sync();
@@ -844,110 +870,112 @@ TEST_P(WaylandWindowTest, CompositorSideStateChanges) {
// Unmaximize
states = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, 0, 0, 2, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 2, states.get());
EXPECT_CALL(delegate_,
OnWindowStateChanged(_, Eq(PlatformWindowState::kNormal)))
.Times(1);
- EXPECT_CALL(*xdg_surface_,
- SetWindowGeometry(
- kInsets.left(), kInsets.top(),
- kNormalBounds.width() - (kInsets.left() + kInsets.right()),
- kNormalBounds.height() - (kInsets.top() + kInsets.bottom())));
+ EXPECT_CALL(
+ *xdg_surface_,
+ SetWindowGeometry(gfx::Rect(
+ kInsets.left(), kInsets.top(),
+ kNormalBounds.width() - (kInsets.left() + kInsets.right()),
+ kNormalBounds.height() - (kInsets.top() + kInsets.bottom()))));
Sync();
// Now, set to fullscreen.
AddStateToWlArray(XDG_TOPLEVEL_STATE_FULLSCREEN, states.get());
- SendConfigureEvent(xdg_surface_, 2005, 2005, 3, states.get());
+ SendConfigureEvent(xdg_surface_, {2005, 2005}, 3, states.get());
EXPECT_CALL(delegate_,
OnWindowStateChanged(_, Eq(PlatformWindowState::kFullScreen)))
.Times(1);
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, 2005, 2005));
+ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(gfx::Rect(2005, 2005)));
Sync();
// Unfullscreen
states = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, 0, 0, 4, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 4, states.get());
EXPECT_CALL(delegate_,
OnWindowStateChanged(_, Eq(PlatformWindowState::kNormal)))
.Times(1);
- EXPECT_CALL(*xdg_surface_,
- SetWindowGeometry(
- kInsets.left(), kInsets.top(),
- kNormalBounds.width() - (kInsets.left() + kInsets.right()),
- kNormalBounds.height() - (kInsets.top() + kInsets.bottom())));
+ EXPECT_CALL(
+ *xdg_surface_,
+ SetWindowGeometry(gfx::Rect(
+ kInsets.left(), kInsets.top(),
+ kNormalBounds.width() - (kInsets.left() + kInsets.right()),
+ kNormalBounds.height() - (kInsets.top() + kInsets.bottom()))));
Sync();
// Now, maximize, fullscreen and restore.
states = InitializeWlArrayWithActivatedState();
AddStateToWlArray(XDG_TOPLEVEL_STATE_MAXIMIZED, states.get());
- SendConfigureEvent(xdg_surface_, 2000, 2000, 1, states.get());
+ SendConfigureEvent(xdg_surface_, {2000, 2000}, 1, states.get());
EXPECT_CALL(delegate_,
OnWindowStateChanged(_, Eq(PlatformWindowState::kMaximized)))
.Times(1);
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, 2000, 2000));
+ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(gfx::Rect(2000, 2000)));
Sync();
AddStateToWlArray(XDG_TOPLEVEL_STATE_FULLSCREEN, states.get());
- SendConfigureEvent(xdg_surface_, 2005, 2005, 1, states.get());
+ SendConfigureEvent(xdg_surface_, {2005, 2005}, 1, states.get());
EXPECT_CALL(delegate_,
OnWindowStateChanged(_, Eq(PlatformWindowState::kFullScreen)))
.Times(1);
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, 2005, 2005));
+ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(gfx::Rect(2005, 2005)));
// Restore
states = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, 0, 0, 4, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 4, states.get());
EXPECT_CALL(delegate_,
OnWindowStateChanged(_, Eq(PlatformWindowState::kNormal)))
.Times(1);
- EXPECT_CALL(*xdg_surface_,
- SetWindowGeometry(
- kInsets.left(), kInsets.top(),
- kNormalBounds.width() - (kInsets.left() + kInsets.right()),
- kNormalBounds.height() - (kInsets.top() + kInsets.bottom())));
+ EXPECT_CALL(
+ *xdg_surface_,
+ SetWindowGeometry(gfx::Rect(
+ kInsets.left(), kInsets.top(),
+ kNormalBounds.width() - (kInsets.left() + kInsets.right()),
+ kNormalBounds.height() - (kInsets.top() + kInsets.bottom()))));
Sync();
}
TEST_P(WaylandWindowTest, SetMaximizedFullscreenAndRestore) {
- const auto kNormalBounds = gfx::Rect{0, 0, 500, 300};
- const auto kMaximizedBounds = gfx::Rect{0, 0, 800, 600};
+ constexpr gfx::Rect kNormalBounds{500, 300};
+ constexpr gfx::Rect kMaximizedBounds{800, 600};
uint32_t serial = 0;
// Make sure the window has normal state initially.
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kNormalBounds)));
- window_->SetBoundsInPixels(kNormalBounds);
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
+ window_->SetBoundsInDIP(gfx::Rect(kNormalBounds.size()));
EXPECT_EQ(PlatformWindowState::kNormal, window_->GetPlatformWindowState());
VerifyAndClearExpectations();
// Deactivate the surface.
ScopedWlArray empty_state;
- SendConfigureEvent(xdg_surface_, 0, 0, ++serial, empty_state.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, ++serial, empty_state.get());
Sync();
auto active_maximized = MakeStateArray(
{XDG_TOPLEVEL_STATE_ACTIVATED, XDG_TOPLEVEL_STATE_MAXIMIZED});
EXPECT_CALL(*GetXdgToplevel(), SetMaximized());
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, kMaximizedBounds.width(),
- kMaximizedBounds.height()));
+ EXPECT_CALL(*xdg_surface_,
+ SetWindowGeometry(gfx::Rect(kMaximizedBounds.size())));
EXPECT_CALL(delegate_, OnActivationChanged(Eq(true)));
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kMaximizedBounds)));
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
EXPECT_CALL(delegate_, OnWindowStateChanged(_, _)).Times(1);
window_->Maximize();
// State changes are synchronous.
EXPECT_EQ(PlatformWindowState::kMaximized, window_->GetPlatformWindowState());
- SendConfigureEvent(xdg_surface_, kMaximizedBounds.width(),
- kMaximizedBounds.height(), ++serial,
+ SendConfigureEvent(xdg_surface_, kMaximizedBounds.size(), ++serial,
active_maximized.get());
Sync();
// Verify that the state has not been changed.
@@ -955,8 +983,8 @@ TEST_P(WaylandWindowTest, SetMaximizedFullscreenAndRestore) {
VerifyAndClearExpectations();
EXPECT_CALL(*GetXdgToplevel(), SetFullscreen());
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, kMaximizedBounds.width(),
- kMaximizedBounds.height()));
+ EXPECT_CALL(*xdg_surface_,
+ SetWindowGeometry(gfx::Rect(kMaximizedBounds.size())));
EXPECT_CALL(delegate_, OnBoundsChanged(_)).Times(0);
EXPECT_CALL(delegate_, OnWindowStateChanged(_, _)).Times(1);
window_->ToggleFullscreen();
@@ -964,8 +992,7 @@ TEST_P(WaylandWindowTest, SetMaximizedFullscreenAndRestore) {
EXPECT_EQ(PlatformWindowState::kFullScreen,
window_->GetPlatformWindowState());
AddStateToWlArray(XDG_TOPLEVEL_STATE_FULLSCREEN, active_maximized.get());
- SendConfigureEvent(xdg_surface_, kMaximizedBounds.width(),
- kMaximizedBounds.height(), ++serial,
+ SendConfigureEvent(xdg_surface_, kMaximizedBounds.size(), ++serial,
active_maximized.get());
Sync();
// Verify that the state has not been changed.
@@ -973,167 +1000,161 @@ TEST_P(WaylandWindowTest, SetMaximizedFullscreenAndRestore) {
window_->GetPlatformWindowState());
VerifyAndClearExpectations();
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, kNormalBounds.width(),
- kNormalBounds.height()));
+ EXPECT_CALL(*xdg_surface_,
+ SetWindowGeometry(gfx::Rect(kNormalBounds.size())));
EXPECT_CALL(*GetXdgToplevel(), UnsetFullscreen());
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kNormalBounds)));
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
EXPECT_CALL(delegate_, OnWindowStateChanged(_, _)).Times(1);
window_->Restore();
EXPECT_EQ(PlatformWindowState::kNormal, window_->GetPlatformWindowState());
// Reinitialize wl_array, which removes previous old states.
auto active = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, 0, 0, ++serial, active.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, ++serial, active.get());
Sync();
EXPECT_EQ(PlatformWindowState::kNormal, window_->GetPlatformWindowState());
}
TEST_P(WaylandWindowTest, RestoreBoundsAfterMaximize) {
- const gfx::Rect current_bounds = window_->GetBoundsInPixels();
+ const gfx::Rect current_bounds = window_->GetBoundsInDIP();
ScopedWlArray states = InitializeWlArrayWithActivatedState();
gfx::Rect restored_bounds = window_->GetRestoredBoundsInDIP();
EXPECT_TRUE(restored_bounds.IsEmpty());
- gfx::Rect bounds = window_->GetBoundsInPixels();
+ gfx::Rect bounds = window_->GetBoundsInDIP();
- const gfx::Rect maximized_bounds = gfx::Rect(0, 0, 1024, 768);
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(maximized_bounds)));
+ constexpr gfx::Rect kMaximizedBounds(1024, 768);
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
window_->Maximize();
AddStateToWlArray(XDG_TOPLEVEL_STATE_MAXIMIZED, states.get());
- SendConfigureEvent(xdg_surface_, maximized_bounds.width(),
- maximized_bounds.height(), 1, states.get());
+ SendConfigureEvent(xdg_surface_, kMaximizedBounds.size(), 1, states.get());
Sync();
restored_bounds = window_->GetRestoredBoundsInDIP();
EXPECT_EQ(bounds, restored_bounds);
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(current_bounds)));
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
// Both in XdgV5 and XdgV6, surfaces implement SetWindowGeometry method.
// Thus, using a toplevel object in XdgV6 case is not right thing. Use a
// surface here instead.
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, current_bounds.width(),
- current_bounds.height()));
+ EXPECT_CALL(*xdg_surface_,
+ SetWindowGeometry(gfx::Rect{current_bounds.size()}));
window_->Restore();
// Reinitialize wl_array, which removes previous old states.
states = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, 0, 0, 2, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 2, states.get());
Sync();
- bounds = window_->GetBoundsInPixels();
+ bounds = window_->GetBoundsInDIP();
EXPECT_EQ(bounds, restored_bounds);
restored_bounds = window_->GetRestoredBoundsInDIP();
EXPECT_EQ(restored_bounds, gfx::Rect());
}
TEST_P(WaylandWindowTest, RestoreBoundsAfterFullscreen) {
- const gfx::Rect current_bounds = window_->GetBoundsInPixels();
+ const gfx::Rect current_bounds = window_->GetBoundsInDIP();
ScopedWlArray states = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, 0, 0, 1, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 1, states.get());
Sync();
gfx::Rect restored_bounds = window_->GetRestoredBoundsInDIP();
EXPECT_EQ(restored_bounds, gfx::Rect());
- gfx::Rect bounds = window_->GetBoundsInPixels();
+ gfx::Rect bounds = window_->GetBoundsInDIP();
- const gfx::Rect fullscreen_bounds = gfx::Rect(0, 0, 1280, 720);
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(fullscreen_bounds)));
+ constexpr gfx::Rect kFullscreenBounds(1280, 720);
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
window_->ToggleFullscreen();
AddStateToWlArray(XDG_TOPLEVEL_STATE_FULLSCREEN, states.get());
- SendConfigureEvent(xdg_surface_, fullscreen_bounds.width(),
- fullscreen_bounds.height(), 2, states.get());
+ SendConfigureEvent(xdg_surface_, kFullscreenBounds.size(), 2, states.get());
Sync();
restored_bounds = window_->GetRestoredBoundsInDIP();
EXPECT_EQ(bounds, restored_bounds);
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(current_bounds)));
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
// Both in XdgV5 and XdgV6, surfaces implement SetWindowGeometry method.
// Thus, using a toplevel object in XdgV6 case is not right thing. Use a
// surface here instead.
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, current_bounds.width(),
- current_bounds.height()));
+ EXPECT_CALL(*xdg_surface_,
+ SetWindowGeometry(gfx::Rect(current_bounds.size())));
window_->Restore();
// Reinitialize wl_array, which removes previous old states.
states = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, 0, 0, 3, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 3, states.get());
Sync();
- bounds = window_->GetBoundsInPixels();
+ bounds = window_->GetBoundsInDIP();
EXPECT_EQ(bounds, restored_bounds);
restored_bounds = window_->GetRestoredBoundsInDIP();
EXPECT_EQ(restored_bounds, gfx::Rect());
}
TEST_P(WaylandWindowTest, RestoreBoundsAfterMaximizeAndFullscreen) {
- const gfx::Rect current_bounds = window_->GetBoundsInPixels();
+ const gfx::Rect current_bounds = window_->GetBoundsInDIP();
ScopedWlArray states = InitializeWlArrayWithActivatedState();
gfx::Rect restored_bounds = window_->GetRestoredBoundsInDIP();
EXPECT_EQ(restored_bounds, gfx::Rect());
- gfx::Rect bounds = window_->GetBoundsInPixels();
+ gfx::Rect bounds = window_->GetBoundsInDIP();
- const gfx::Rect maximized_bounds = gfx::Rect(0, 0, 1024, 768);
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(maximized_bounds)));
+ constexpr gfx::Rect kMaximizedBounds(1024, 768);
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
window_->Maximize();
AddStateToWlArray(XDG_TOPLEVEL_STATE_MAXIMIZED, states.get());
- SendConfigureEvent(xdg_surface_, maximized_bounds.width(),
- maximized_bounds.height(), 1, states.get());
+ SendConfigureEvent(xdg_surface_, kMaximizedBounds.size(), 1, states.get());
Sync();
restored_bounds = window_->GetRestoredBoundsInDIP();
EXPECT_EQ(bounds, restored_bounds);
- const gfx::Rect fullscreen_bounds = gfx::Rect(0, 0, 1280, 720);
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(fullscreen_bounds)));
+ constexpr gfx::Rect kFullscreenBounds(1280, 720);
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
window_->ToggleFullscreen();
AddStateToWlArray(XDG_TOPLEVEL_STATE_FULLSCREEN, states.get());
- SendConfigureEvent(xdg_surface_, fullscreen_bounds.width(),
- fullscreen_bounds.height(), 2, states.get());
+ SendConfigureEvent(xdg_surface_, kFullscreenBounds.size(), 2, states.get());
Sync();
gfx::Rect fullscreen_restore_bounds = window_->GetRestoredBoundsInDIP();
EXPECT_EQ(restored_bounds, fullscreen_restore_bounds);
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(maximized_bounds)));
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
window_->Maximize();
// Reinitialize wl_array, which removes previous old states.
states = InitializeWlArrayWithActivatedState();
AddStateToWlArray(XDG_TOPLEVEL_STATE_MAXIMIZED, states.get());
- SendConfigureEvent(xdg_surface_, maximized_bounds.width(),
- maximized_bounds.height(), 3, states.get());
+ SendConfigureEvent(xdg_surface_, kMaximizedBounds.size(), 3, states.get());
Sync();
restored_bounds = window_->GetRestoredBoundsInDIP();
EXPECT_EQ(restored_bounds, fullscreen_restore_bounds);
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(current_bounds)));
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
// Both in XdgV5 and XdgV6, surfaces implement SetWindowGeometry method.
// Thus, using a toplevel object in XdgV6 case is not right thing. Use a
// surface here instead.
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, current_bounds.width(),
- current_bounds.height()));
+ EXPECT_CALL(*xdg_surface_,
+ SetWindowGeometry(gfx::Rect(current_bounds.size())));
window_->Restore();
// Reinitialize wl_array, which removes previous old states.
states = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, 0, 0, 4, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 4, states.get());
Sync();
- bounds = window_->GetBoundsInPixels();
+ bounds = window_->GetBoundsInDIP();
EXPECT_EQ(bounds, restored_bounds);
restored_bounds = window_->GetRestoredBoundsInDIP();
EXPECT_EQ(restored_bounds, gfx::Rect());
}
TEST_P(WaylandWindowTest, SendsBoundsOnRequest) {
- const gfx::Rect initial_bounds = window_->GetBoundsInPixels();
+ const gfx::Rect initial_bounds = window_->GetBoundsInDIP();
- const gfx::Rect new_bounds = gfx::Rect(0, 0, initial_bounds.width() + 10,
- initial_bounds.height() + 10);
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(new_bounds)));
- window_->SetBoundsInPixels(new_bounds);
+ const gfx::Rect new_bounds =
+ gfx::Rect(initial_bounds.width() + 10, initial_bounds.height() + 10);
+ EXPECT_CALL(delegate_, OnBoundsChanged(kDefaultBoundsChange));
+ window_->SetBoundsInDIP(new_bounds);
ScopedWlArray states = InitializeWlArrayWithActivatedState();
// First case is when Wayland sends a configure event with 0,0 height and
// width.
- EXPECT_CALL(*xdg_surface_,
- SetWindowGeometry(0, 0, new_bounds.width(), new_bounds.height()))
+ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(gfx::Rect(new_bounds.size())))
.Times(2);
- SendConfigureEvent(xdg_surface_, 0, 0, 2, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 2, states.get());
Sync();
// Restored bounds should keep empty value.
@@ -1143,7 +1164,7 @@ TEST_P(WaylandWindowTest, SendsBoundsOnRequest) {
// Second case is when Wayland sends a configure event with 1, 1 height and
// width. It looks more like a bug in Gnome Shell with Wayland as long as the
// documentation says it must be set to 0, 0, when wayland requests bounds.
- SendConfigureEvent(xdg_surface_, 0, 0, 3, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 3, states.get());
Sync();
// Restored bounds should keep empty value.
@@ -1156,12 +1177,12 @@ TEST_P(WaylandWindowTest, UpdateWindowRegion) {
window_->root_surface()->GetSurfaceId());
// Change bounds.
- const gfx::Rect initial_bounds = window_->GetBoundsInPixels();
- const gfx::Rect new_bounds = gfx::Rect(0, 0, initial_bounds.width() + 10,
- initial_bounds.height() + 10);
+ const gfx::Rect initial_bounds = window_->GetBoundsInDIP();
+ const gfx::Rect new_bounds =
+ gfx::Rect(initial_bounds.width() + 10, initial_bounds.height() + 10);
EXPECT_CALL(*mock_surface, SetOpaqueRegion(_)).Times(1);
EXPECT_CALL(*mock_surface, SetInputRegion(_)).Times(1);
- window_->SetBoundsInPixels(new_bounds);
+ window_->SetBoundsInDIP(new_bounds);
Sync();
VerifyAndClearExpectations();
EXPECT_EQ(mock_surface->opaque_region(), new_bounds);
@@ -1171,15 +1192,14 @@ TEST_P(WaylandWindowTest, UpdateWindowRegion) {
ScopedWlArray states = InitializeWlArrayWithActivatedState();
EXPECT_CALL(*mock_surface, SetOpaqueRegion(_)).Times(1);
EXPECT_CALL(*mock_surface, SetInputRegion(_)).Times(1);
- const gfx::Rect maximized_bounds = gfx::Rect(0, 0, 1024, 768);
+ constexpr gfx::Rect kMaximizedBounds(1024, 768);
window_->Maximize();
AddStateToWlArray(XDG_TOPLEVEL_STATE_MAXIMIZED, states.get());
- SendConfigureEvent(xdg_surface_, maximized_bounds.width(),
- maximized_bounds.height(), 1, states.get());
+ SendConfigureEvent(xdg_surface_, kMaximizedBounds.size(), 1, states.get());
Sync();
VerifyAndClearExpectations();
- EXPECT_EQ(mock_surface->opaque_region(), maximized_bounds);
- EXPECT_EQ(mock_surface->input_region(), maximized_bounds);
+ EXPECT_EQ(mock_surface->opaque_region(), kMaximizedBounds);
+ EXPECT_EQ(mock_surface->input_region(), kMaximizedBounds);
// Restore.
const gfx::Rect restored_bounds = window_->GetRestoredBoundsInDIP();
@@ -1188,7 +1208,7 @@ TEST_P(WaylandWindowTest, UpdateWindowRegion) {
window_->Restore();
// Reinitialize wl_array, which removes previous old states.
auto active = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, 0, 0, 2, active.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 2, active.get());
Sync();
VerifyAndClearExpectations();
@@ -1196,25 +1216,17 @@ TEST_P(WaylandWindowTest, UpdateWindowRegion) {
EXPECT_EQ(mock_surface->input_region(), restored_bounds);
}
-TEST_P(WaylandWindowTest, CanDispatchMouseEventDefault) {
- EXPECT_FALSE(window_->CanDispatchEvent(&test_mouse_event_));
-}
-
TEST_P(WaylandWindowTest, CanDispatchMouseEventFocus) {
- // SetPointerFocus(true) requires a WaylandPointer.
+ // SetPointerFocusedWindow requires a WaylandPointer.
wl_seat_send_capabilities(server_.seat()->resource(),
WL_SEAT_CAPABILITY_POINTER);
Sync();
ASSERT_TRUE(connection_->seat()->pointer());
- window_->SetPointerFocus(true);
+ SetPointerFocusedWindow(window_.get());
+ Event::DispatcherApi(&test_mouse_event_).set_target(window_.get());
EXPECT_TRUE(window_->CanDispatchEvent(&test_mouse_event_));
}
-TEST_P(WaylandWindowTest, CanDispatchMouseEventUnfocus) {
- EXPECT_FALSE(window_->has_pointer_focus());
- EXPECT_FALSE(window_->CanDispatchEvent(&test_mouse_event_));
-}
-
TEST_P(WaylandWindowTest, SetCursorUsesZcrCursorShapesForCommonTypes) {
MockZcrCursorShapes* mock_cursor_shapes = InstallMockZcrCursorShapes();
@@ -1268,7 +1280,7 @@ TEST_P(WaylandWindowTest, SetCursorDoesNotUseZcrCursorShapesForCustomCursors) {
}
ACTION_P(CloneEvent, ptr) {
- *ptr = Event::Clone(*arg0);
+ *ptr = arg0->Clone();
}
TEST_P(WaylandWindowTest, DispatchEvent) {
@@ -1292,23 +1304,25 @@ TEST_P(WaylandWindowTest, ConfigureEvent) {
// The surface must react on each configure event and send bounds to its
// delegate.
+ constexpr gfx::Size kSize{1000, 1000};
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(gfx::Rect(0, 0, 1000, 1000))));
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
// Responding to a configure event, the window geometry in here must respect
// the sizing negotiations specified by the configure event.
// |xdg_surface_| must receive the following calls in both xdg_shell_v5 and
// xdg_shell_v6. Other calls like SetTitle or SetMaximized are recieved by
// xdg_toplevel in xdg_shell_v6 and by xdg_surface_ in xdg_shell_v5.
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, 1000, 1000)).Times(1);
+ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(gfx::Rect(kSize))).Times(1);
EXPECT_CALL(*xdg_surface_, AckConfigure(12));
- SendConfigureEvent(xdg_surface_, 1000, 1000, 12, states.get());
+ SendConfigureEvent(xdg_surface_, kSize, 12, states.get());
Sync();
+ constexpr gfx::Size kNewSize{1500, 1000};
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(gfx::Rect(0, 0, 1500, 1000))));
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, 1500, 1000)).Times(1);
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
+ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(gfx::Rect(kNewSize))).Times(1);
EXPECT_CALL(*xdg_surface_, AckConfigure(13));
- SendConfigureEvent(xdg_surface_, 1500, 1000, 13, states.get());
+ SendConfigureEvent(xdg_surface_, kNewSize, 13, states.get());
}
TEST_P(WaylandWindowTest, ConfigureEventWithNulledSize) {
@@ -1317,11 +1331,11 @@ TEST_P(WaylandWindowTest, ConfigureEventWithNulledSize) {
// If Wayland sends configure event with 0 width and 0 size, client should
// call back with desired sizes. In this case, that's the actual size of
// the window.
- SendConfigureEvent(xdg_surface_, 0, 0, 14, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 14, states.get());
// |xdg_surface_| must receive the following calls in both xdg_shell_v5 and
// xdg_shell_v6. Other calls like SetTitle or SetMaximized are recieved by
// xdg_toplevel in xdg_shell_v6 and by xdg_surface_ in xdg_shell_v5.
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, 800, 600));
+ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(gfx::Rect(800, 600)));
EXPECT_CALL(*xdg_surface_, AckConfigure(14));
}
@@ -1330,19 +1344,19 @@ TEST_P(WaylandWindowTest, OnActivationChanged) {
// Deactivate the surface.
ScopedWlArray empty_state;
- SendConfigureEvent(xdg_surface_, 0, 0, ++serial, empty_state.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, ++serial, empty_state.get());
Sync();
{
ScopedWlArray states = InitializeWlArrayWithActivatedState();
EXPECT_CALL(delegate_, OnActivationChanged(Eq(true)));
- SendConfigureEvent(xdg_surface_, 0, 0, ++serial, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, ++serial, states.get());
Sync();
}
ScopedWlArray states;
EXPECT_CALL(delegate_, OnActivationChanged(Eq(false)));
- SendConfigureEvent(xdg_surface_, 0, 0, ++serial, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, ++serial, states.get());
Sync();
}
@@ -1361,23 +1375,23 @@ TEST_P(WaylandWindowTest, CanCreateMenuWindow) {
WL_SEAT_CAPABILITY_POINTER | WL_SEAT_CAPABILITY_TOUCH);
Sync();
ASSERT_TRUE(connection_->seat()->pointer() && connection_->seat()->touch());
- window_->SetPointerFocus(true);
+ SetPointerFocusedWindow(window_.get());
std::unique_ptr<WaylandWindow> menu_window = CreateWaylandWindowWithParams(
- PlatformWindowType::kMenu, gfx::kNullAcceleratedWidget,
- gfx::Rect(0, 0, 10, 10), &menu_window_delegate);
+ PlatformWindowType::kMenu, gfx::kNullAcceleratedWidget, gfx::Rect(10, 10),
+ &menu_window_delegate);
EXPECT_TRUE(menu_window);
Sync();
- window_->SetPointerFocus(false);
+ SetPointerFocusedWindow(window_.get());
window_->set_touch_focus(false);
// Given that there is no parent passed and we don't have any focused windows,
// Wayland must still create a window.
menu_window = CreateWaylandWindowWithParams(
- PlatformWindowType::kMenu, gfx::kNullAcceleratedWidget,
- gfx::Rect(0, 0, 10, 10), &menu_window_delegate);
+ PlatformWindowType::kMenu, gfx::kNullAcceleratedWidget, gfx::Rect(10, 10),
+ &menu_window_delegate);
EXPECT_TRUE(menu_window);
Sync();
@@ -1385,8 +1399,8 @@ TEST_P(WaylandWindowTest, CanCreateMenuWindow) {
window_->set_touch_focus(true);
menu_window = CreateWaylandWindowWithParams(
- PlatformWindowType::kMenu, gfx::kNullAcceleratedWidget,
- gfx::Rect(0, 0, 10, 10), &menu_window_delegate);
+ PlatformWindowType::kMenu, gfx::kNullAcceleratedWidget, gfx::Rect(10, 10),
+ &menu_window_delegate);
EXPECT_TRUE(menu_window);
Sync();
@@ -1400,9 +1414,9 @@ TEST_P(WaylandWindowTest, CreateAndDestroyNestedMenuWindow) {
EXPECT_CALL(menu_window_delegate, GetMenuType())
.WillRepeatedly(Return(MenuType::kRootContextMenu));
- std::unique_ptr<WaylandWindow> menu_window = CreateWaylandWindowWithParams(
- PlatformWindowType::kMenu, widget_, gfx::Rect(0, 0, 10, 10),
- &menu_window_delegate);
+ std::unique_ptr<WaylandWindow> menu_window =
+ CreateWaylandWindowWithParams(PlatformWindowType::kMenu, widget_,
+ gfx::Rect(10, 10), &menu_window_delegate);
EXPECT_TRUE(menu_window);
ASSERT_NE(menu_window_widget, gfx::kNullAcceleratedWidget);
@@ -1431,10 +1445,10 @@ TEST_P(WaylandWindowTest, DispatchesLocatedEventsToCapturedWindow) {
WL_SEAT_CAPABILITY_POINTER);
Sync();
ASSERT_TRUE(connection_->seat()->pointer());
- window_->SetPointerFocus(true);
+ SetPointerFocusedWindow(window_.get());
// Make sure the events are handled by the window that has the pointer focus.
- VerifyCanDispatchMouseEvents({window_.get()}, {menu_window.get()});
+ VerifyCanDispatchMouseEvents(window_.get(), {menu_window.get()});
// The |window_| that has the pointer focus must receive the event.
EXPECT_CALL(menu_window_delegate, DispatchEvent(_)).Times(0);
@@ -1456,7 +1470,7 @@ TEST_P(WaylandWindowTest, DispatchesLocatedEventsToCapturedWindow) {
// It's still the |window_| that can dispatch the events, but it will reroute
// the event to correct window and fix the location.
- VerifyCanDispatchMouseEvents({window_.get()}, {menu_window.get()});
+ VerifyCanDispatchMouseEvents(window_.get(), {menu_window.get()});
// The |window_| that has the pointer focus must receive the event.
EXPECT_CALL(delegate_, DispatchEvent(_)).Times(0);
@@ -1502,12 +1516,11 @@ TEST_P(WaylandWindowTest, DispatchesLocatedEventsToCapturedWindow) {
Sync();
- window_->SetPointerFocus(false);
- nested_menu_window->SetPointerFocus(true);
+ SetPointerFocusedWindow(nested_menu_window.get());
// The event is processed by the window that has the pointer focus, but
// dispatched by the window that has the capture.
- VerifyCanDispatchMouseEvents({nested_menu_window.get()},
+ VerifyCanDispatchMouseEvents(nested_menu_window.get(),
{window_.get(), menu_window.get()});
EXPECT_TRUE(menu_window->HasCapture());
@@ -1548,17 +1561,17 @@ TEST_P(WaylandWindowTest,
std::unique_ptr<WaylandWindow> toplevel_window2 =
CreateWaylandWindowWithParams(
PlatformWindowType::kWindow, gfx::kNullAcceleratedWidget,
- window_->GetBoundsInPixels(), &toplevel_window2_delegate);
+ window_->GetBoundsInDIP(), &toplevel_window2_delegate);
EXPECT_TRUE(toplevel_window2);
wl_seat_send_capabilities(server_.seat()->resource(),
WL_SEAT_CAPABILITY_POINTER);
Sync();
ASSERT_TRUE(connection_->seat()->pointer());
- window_->SetPointerFocus(true);
+ SetPointerFocusedWindow(window_.get());
// Make sure the events are handled by the window that has the pointer focus.
- VerifyCanDispatchMouseEvents({window_.get()},
+ VerifyCanDispatchMouseEvents(window_.get(),
{menu_window.get(), toplevel_window2.get()});
menu_window->SetCapture();
@@ -1582,10 +1595,9 @@ TEST_P(WaylandWindowTest,
// Now, pretend that the second toplevel window gets the pointer focus - the
// event grabber must be disragerder now.
- window_->SetPointerFocus(false);
- toplevel_window2->SetPointerFocus(true);
+ SetPointerFocusedWindow(toplevel_window2.get());
- VerifyCanDispatchMouseEvents({toplevel_window2.get()},
+ VerifyCanDispatchMouseEvents(toplevel_window2.get(),
{menu_window.get(), window_.get()});
// The |toplevel_window2| that has capture and must receive the event.
@@ -1620,7 +1632,7 @@ TEST_P(WaylandWindowTest, DispatchesKeyboardEventToToplevelWindow) {
WL_SEAT_CAPABILITY_KEYBOARD);
Sync();
ASSERT_TRUE(connection_->seat()->keyboard());
- menu_window->set_keyboard_focus(true);
+ SetKeyboardFocusedWindow(menu_window.get());
// Even though the menu window has the keyboard focus, the keyboard events are
// dispatched by the root parent wayland window in the end.
@@ -1664,9 +1676,9 @@ TEST_P(WaylandWindowTest, CanDispatchEvent) {
EXPECT_CALL(menu_window_delegate, GetMenuType())
.WillOnce(Return(MenuType::kRootContextMenu));
- std::unique_ptr<WaylandWindow> menu_window = CreateWaylandWindowWithParams(
- PlatformWindowType::kMenu, widget_, gfx::Rect(0, 0, 10, 10),
- &menu_window_delegate);
+ std::unique_ptr<WaylandWindow> menu_window =
+ CreateWaylandWindowWithParams(PlatformWindowType::kMenu, widget_,
+ gfx::Rect(10, 10), &menu_window_delegate);
EXPECT_TRUE(menu_window);
Sync();
@@ -1702,7 +1714,7 @@ TEST_P(WaylandWindowTest, CanDispatchEvent) {
Sync();
// Only |window_| can dispatch MouseEvents.
- VerifyCanDispatchMouseEvents({window_.get()},
+ VerifyCanDispatchMouseEvents(window_.get(),
{menu_window.get(), nested_menu_window.get()});
VerifyCanDispatchTouchEvents(
{}, {window_.get(), menu_window.get(), nested_menu_window.get()});
@@ -1717,7 +1729,7 @@ TEST_P(WaylandWindowTest, CanDispatchEvent) {
Sync();
// Only |window_| can dispatch MouseEvents and KeyEvents.
- VerifyCanDispatchMouseEvents({window_.get()},
+ VerifyCanDispatchMouseEvents(window_.get(),
{menu_window.get(), nested_menu_window.get()});
VerifyCanDispatchTouchEvents(
{}, {window_.get(), menu_window.get(), nested_menu_window.get()});
@@ -1732,7 +1744,7 @@ TEST_P(WaylandWindowTest, CanDispatchEvent) {
Sync();
// Only |window_| can dispatch MouseEvents and KeyEvents.
- VerifyCanDispatchMouseEvents({window_.get()},
+ VerifyCanDispatchMouseEvents(window_.get(),
{menu_window.get(), nested_menu_window.get()});
VerifyCanDispatchTouchEvents({window_.get()},
{menu_window.get(), nested_menu_window.get()});
@@ -1756,7 +1768,7 @@ TEST_P(WaylandWindowTest, CanDispatchEvent) {
Sync();
// Only |menu_window| can dispatch MouseEvents.
- VerifyCanDispatchMouseEvents({menu_window.get()},
+ VerifyCanDispatchMouseEvents(menu_window.get(),
{window_.get(), nested_menu_window.get()});
VerifyCanDispatchTouchEvents(
{}, {window_.get(), menu_window.get(), nested_menu_window.get()});
@@ -1775,7 +1787,7 @@ TEST_P(WaylandWindowTest, CanDispatchEvent) {
Sync();
// Only |nested_menu_window| can dispatch MouseEvents.
- VerifyCanDispatchMouseEvents({nested_menu_window.get()},
+ VerifyCanDispatchMouseEvents(nested_menu_window.get(),
{window_.get(), menu_window.get()});
VerifyCanDispatchTouchEvents(
{}, {window_.get(), menu_window.get(), nested_menu_window.get()});
@@ -1837,13 +1849,13 @@ TEST_P(WaylandWindowTest, ToplevelWindowUpdateWindowScale) {
// Creating an output with scale 1.
wl::TestOutput* output1 = server_.CreateAndInitializeOutput();
- output1->SetRect(gfx::Rect(0, 0, 1920, 1080));
+ output1->SetRect(gfx::Rect(1920, 1080));
output1->SetScale(1);
Sync();
// Creating an output with scale 2.
wl::TestOutput* output2 = server_.CreateAndInitializeOutput();
- output2->SetRect(gfx::Rect(0, 0, 1920, 1080));
+ output2->SetRect(gfx::Rect(1920, 1080));
output2->SetScale(2);
Sync();
@@ -1856,7 +1868,8 @@ TEST_P(WaylandWindowTest, ToplevelWindowUpdateWindowScale) {
// The window's scale and bounds must remain unchanged.
EXPECT_EQ(1, window_->window_scale());
- EXPECT_EQ(gfx::Rect(0, 0, 800, 600), window_->GetBoundsInPixels());
+ EXPECT_EQ(gfx::Size(800, 600), window_->size_px());
+ EXPECT_EQ(gfx::Rect(800, 600), window_->GetBoundsInDIP());
// Simulating drag process from |output1| to |output2|.
wl_surface_send_enter(surface->resource(), output2->resource());
@@ -1865,7 +1878,8 @@ TEST_P(WaylandWindowTest, ToplevelWindowUpdateWindowScale) {
// The window must change its scale and bounds to keep DIP bounds the same.
EXPECT_EQ(2, window_->window_scale());
- EXPECT_EQ(gfx::Rect(0, 0, 1600, 1200), window_->GetBoundsInPixels());
+ EXPECT_EQ(gfx::Size(1600, 1200), window_->size_px());
+ EXPECT_EQ(gfx::Rect(800, 600), window_->GetBoundsInDIP());
}
TEST_P(WaylandWindowTest, WaylandPopupSurfaceScale) {
@@ -1873,7 +1887,7 @@ TEST_P(WaylandWindowTest, WaylandPopupSurfaceScale) {
// Creating an output with scale 1.
wl::TestOutput* output1 = server_.CreateAndInitializeOutput();
- output1->SetRect(gfx::Rect(0, 0, 1920, 1080));
+ output1->SetRect(gfx::Rect(1920, 1080));
output1->SetScale(1);
Sync();
@@ -1894,7 +1908,7 @@ TEST_P(WaylandWindowTest, WaylandPopupSurfaceScale) {
Sync();
// Creating a wayland_popup on |window_|.
- window_->SetPointerFocus(true);
+ SetPointerFocusedWindow(window_.get());
gfx::Rect wayland_popup_bounds(15, 15, 10, 10);
auto wayland_popup = CreateWaylandWindowWithParams(
type, window_->GetWidget(), wayland_popup_bounds, &delegate_);
@@ -1905,7 +1919,8 @@ TEST_P(WaylandWindowTest, WaylandPopupSurfaceScale) {
// window.
EXPECT_EQ(1, window_->window_scale());
EXPECT_EQ(window_->window_scale(), wayland_popup->window_scale());
- EXPECT_EQ(wayland_popup_bounds, wayland_popup->GetBoundsInPixels());
+ EXPECT_EQ(wayland_popup_bounds.size(), wayland_popup->size_px());
+ EXPECT_EQ(wayland_popup_bounds, wayland_popup->GetBoundsInDIP());
wayland_popup->Hide();
// Send the window to |output2|.
@@ -1921,12 +1936,12 @@ TEST_P(WaylandWindowTest, WaylandPopupSurfaceScale) {
// |wayland_popup|'s scale and bounds must change whenever its parents
// scale is changed.
EXPECT_EQ(window_->window_scale(), wayland_popup->window_scale());
- EXPECT_EQ(gfx::ScaleToRoundedRect(wayland_popup_bounds,
- wayland_popup->window_scale()),
- wayland_popup->GetBoundsInPixels());
+ EXPECT_EQ(gfx::ScaleToCeiledSize(wayland_popup_bounds.size(),
+ wayland_popup->window_scale()),
+ wayland_popup->size_px());
wayland_popup->Hide();
- window_->SetPointerFocus(false);
+ SetPointerFocusedWindow(nullptr);
wl_surface_send_leave(surface->resource(), output2->resource());
Sync();
@@ -1941,7 +1956,7 @@ TEST_P(WaylandWindowTest, WaylandPopupInitialBufferScale) {
VerifyAndClearExpectations();
wl::TestOutput* main_output = server_.CreateAndInitializeOutput();
- main_output->SetRect(gfx::Rect(0, 0, 1920, 1080));
+ main_output->SetRect(gfx::Rect(1920, 1080));
main_output->SetScale(1);
Sync();
@@ -1955,7 +1970,7 @@ TEST_P(WaylandWindowTest, WaylandPopupInitialBufferScale) {
ASSERT_TRUE(surface);
struct {
- wl::TestOutput* output;
+ raw_ptr<wl::TestOutput> output;
const char* label;
} screen[] = {{main_output, "main output"},
{secondary_output, "secondary output"}};
@@ -1980,7 +1995,7 @@ TEST_P(WaylandWindowTest, WaylandPopupInitialBufferScale) {
// DesktopWindowTreeHostPlatform uses the scale of the current display
// of the parent window to translate initial bounds of the popup to
// pixels.
- const auto effective_scale = entered_output.output->GetScale();
+ const int32_t effective_scale = entered_output.output->GetScale();
gfx::Transform transform;
transform.Scale(effective_scale, effective_scale);
gfx::RectF rect_in_pixels = gfx::RectF(bounds_dip);
@@ -1989,19 +2004,19 @@ TEST_P(WaylandWindowTest, WaylandPopupInitialBufferScale) {
std::unique_ptr<WaylandWindow> wayland_popup =
CreateWaylandWindowWithParams(PlatformWindowType::kMenu,
- window_->GetWidget(),
- wayland_popup_bounds, &delegate_);
+ window_->GetWidget(), bounds_dip,
+ &delegate_);
EXPECT_TRUE(wayland_popup);
wayland_popup->Show(false);
- gfx::Rect expected_bounds = wayland_popup_bounds;
+ gfx::Size expected_px_size = wayland_popup_bounds.size();
if (entered_output.output == secondary_output) {
- expected_bounds =
- gfx::ScaleToRoundedRect(bounds_dip, secondary_output_scale);
+ expected_px_size =
+ gfx::ScaleToCeiledSize(bounds_dip.size(), secondary_output_scale);
}
- EXPECT_EQ(expected_bounds, wayland_popup->GetBoundsInPixels())
+ EXPECT_EQ(expected_px_size, wayland_popup->size_px())
<< " when the window is on " << entered_output.label
<< " that has scale " << entered_output.output->GetScale();
}
@@ -2012,18 +2027,12 @@ TEST_P(WaylandWindowTest, WaylandPopupInitialBufferScale) {
}
}
-// Verifies that when the forced scale factor is set, bounds are always the same
-// regardless of the scale of the display.
-TEST_P(WaylandWindowTest, WaylandPopupInitialBufferScaleForcedScale) {
+TEST_P(WaylandWindowTest, WaylandPopupInitialBufferUsesParentScale) {
VerifyAndClearExpectations();
- const auto forced_scale = 1.2;
-
- display::Display::SetForceDeviceScaleFactor(forced_scale);
-
// Creating an output with scale 1.
wl::TestOutput* main_output = server_.CreateAndInitializeOutput();
- main_output->SetRect(gfx::Rect(0, 0, 1920, 1080));
+ main_output->SetRect(gfx::Rect(1920, 1080));
main_output->SetScale(1);
Sync();
@@ -2041,30 +2050,17 @@ TEST_P(WaylandWindowTest, WaylandPopupInitialBufferScaleForcedScale) {
wl_surface_send_enter(surface->resource(), secondary_output->resource());
Sync();
- const gfx::Rect bounds_dip{50, 50, 100, 100};
- const gfx::Rect expected_bounds_px =
- gfx::ScaleToRoundedRect(bounds_dip, forced_scale);
-
- // DesktopWindowTreeHostPlatform has always to use a primary display's
- // scale to translate initial bounds to pixels. However, the primary display
- // will use forced device scale factor and ignore wl_output's scale. Thus, use
- // primary output's scale to make initial bounds. This code snippet is a copy
- // of DesktopWindowTreeHostPlatform::ToPixelRect.
- gfx::Transform transform;
- transform.Scale(display::Display::GetForcedDeviceScaleFactor(),
- display::Display::GetForcedDeviceScaleFactor());
- gfx::RectF rect_in_pixels = gfx::RectF(bounds_dip);
- transform.TransformRect(&rect_in_pixels);
- gfx::Rect wayland_popup_bounds = gfx::ToEnclosingRect(rect_in_pixels);
+ constexpr gfx::Rect kBoundsDip{50, 50, 100, 100};
+ const gfx::Size expected_size_px =
+ gfx::ScaleToCeiledSize(kBoundsDip.size(), secondary_output->GetScale());
std::unique_ptr<WaylandWindow> wayland_popup = CreateWaylandWindowWithParams(
- PlatformWindowType::kMenu, window_->GetWidget(), wayland_popup_bounds,
- &delegate_);
+ PlatformWindowType::kMenu, window_->GetWidget(), kBoundsDip, &delegate_);
EXPECT_TRUE(wayland_popup);
wayland_popup->Show(false);
- EXPECT_EQ(expected_bounds_px, wayland_popup->GetBoundsInPixels());
+ EXPECT_EQ(expected_size_px, wayland_popup->size_px());
wl_surface_send_leave(surface->resource(), secondary_output->resource());
Sync();
@@ -2081,7 +2077,7 @@ TEST_P(WaylandWindowTest, GetPreferredOutput) {
// Creating an output with scale 1.
wl::TestOutput* output1 = server_.CreateAndInitializeOutput();
- output1->SetRect(gfx::Rect(0, 0, 1920, 1080));
+ output1->SetRect(gfx::Rect(1920, 1080));
Sync();
// Creating an output with scale 2.
@@ -2190,7 +2186,7 @@ TEST_P(WaylandWindowTest, GetChildrenPreferredOutput) {
// Creating an output with scale 1.
wl::TestOutput* output1 = server_.CreateAndInitializeOutput();
- output1->SetRect(gfx::Rect(0, 0, 1920, 1080));
+ output1->SetRect(gfx::Rect(1920, 1080));
Sync();
// Creating an output with scale 2.
@@ -2290,7 +2286,7 @@ TEST_P(WaylandWindowTest, PopupPassesDefaultAnchorInformation) {
}
auto* toplevel_window = window_.get();
- toplevel_window->SetBoundsInPixels(gfx::Rect(0, 0, 739, 574));
+ toplevel_window->SetBoundsInDIP(gfx::Rect(739, 574));
// Case 1: properties are not provided. In this case, bounds' origin must
// be used as anchor rect and anchor position, gravity and constraints should
@@ -2298,7 +2294,7 @@ TEST_P(WaylandWindowTest, PopupPassesDefaultAnchorInformation) {
MockWaylandPlatformWindowDelegate menu_window_delegate;
EXPECT_CALL(menu_window_delegate, GetMenuType())
.WillOnce(Return(MenuType::kRootMenu));
- EXPECT_CALL(menu_window_delegate, GetOwnedWindowAnchorAndRectInPx())
+ EXPECT_CALL(menu_window_delegate, GetOwnedWindowAnchorAndRectInDIP())
.WillOnce(Return(absl::nullopt));
gfx::Rect menu_window_bounds(gfx::Point(439, 46),
menu_window_positioner.size);
@@ -2316,7 +2312,7 @@ TEST_P(WaylandWindowTest, PopupPassesDefaultAnchorInformation) {
Sync();
- EXPECT_EQ(menu_window->GetBoundsInPixels(), menu_window_bounds);
+ EXPECT_EQ(menu_window->GetBoundsInDIP(), menu_window_bounds);
// Case 2: the nested menu window is positioned normally.
MockWaylandPlatformWindowDelegate nested_menu_window_delegate;
@@ -2368,7 +2364,7 @@ TEST_P(WaylandWindowTest, PopupPassesSetAnchorInformation) {
}
auto* toplevel_window = window_.get();
- toplevel_window->SetBoundsInPixels(gfx::Rect(0, 0, 508, 212));
+ toplevel_window->SetBoundsInDIP(gfx::Rect(508, 212));
MockWaylandPlatformWindowDelegate menu_window_delegate;
EXPECT_CALL(menu_window_delegate, GetMenuType())
@@ -2378,7 +2374,7 @@ TEST_P(WaylandWindowTest, PopupPassesSetAnchorInformation) {
OwnedWindowAnchorPosition::kBottomRight,
OwnedWindowAnchorGravity::kBottomLeft,
OwnedWindowConstraintAdjustment::kAdjustmentFlipY};
- EXPECT_CALL(menu_window_delegate, GetOwnedWindowAnchorAndRectInPx())
+ EXPECT_CALL(menu_window_delegate, GetOwnedWindowAnchorAndRectInDIP())
.WillOnce(Return(anchor));
gfx::Rect menu_window_bounds(gfx::Point(176, 74),
menu_window_positioner.size);
@@ -2401,7 +2397,7 @@ TEST_P(WaylandWindowTest, PopupPassesSetAnchorInformation) {
OwnedWindowAnchorGravity::kBottomRight,
OwnedWindowConstraintAdjustment::kAdjustmentFlipY |
OwnedWindowConstraintAdjustment::kAdjustmentFlipX};
- EXPECT_CALL(nested_menu_window_delegate, GetOwnedWindowAnchorAndRectInPx())
+ EXPECT_CALL(nested_menu_window_delegate, GetOwnedWindowAnchorAndRectInDIP())
.WillOnce(Return(anchor));
gfx::Rect nested_menu_window_bounds(gfx::Point(492, 157),
nested_menu_window_positioner.size);
@@ -2426,10 +2422,9 @@ TEST_P(WaylandWindowTest, SetOpaqueRegion) {
wl::MockSurface* mock_surface = server_.GetObject<wl::MockSurface>(
window_->root_surface()->GetSurfaceId());
- gfx::Rect new_bounds(0, 0, 500, 600);
+ gfx::Rect new_bounds(500, 600);
auto state_array = MakeStateArray({XDG_TOPLEVEL_STATE_ACTIVATED});
- SendConfigureEvent(xdg_surface_, new_bounds.width(), new_bounds.height(), 1,
- state_array.get());
+ SendConfigureEvent(xdg_surface_, new_bounds.size(), 1, state_array.get());
SkIRect rect =
SkIRect::MakeXYWH(0, 0, new_bounds.width(), new_bounds.height());
@@ -2441,8 +2436,7 @@ TEST_P(WaylandWindowTest, SetOpaqueRegion) {
EXPECT_EQ(mock_surface->opaque_region(), new_bounds);
new_bounds.set_size(gfx::Size(1000, 534));
- SendConfigureEvent(xdg_surface_, new_bounds.width(), new_bounds.height(), 2,
- state_array.get());
+ SendConfigureEvent(xdg_surface_, new_bounds.size(), 2, state_array.get());
rect = SkIRect::MakeXYWH(0, 0, new_bounds.width(), new_bounds.height());
EXPECT_CALL(*mock_surface, SetOpaqueRegion(_)).WillOnce(VerifyRegion(&rect));
@@ -2491,7 +2485,6 @@ TEST_P(WaylandWindowTest, WaylandPopupSimpleParent) {
gfx::Rect(wayland_popup_bounds.size()));
wayland_popup->Hide();
- window_->SetPointerFocus(false);
}
TEST_P(WaylandWindowTest, WaylandPopupNestedParent) {
@@ -2504,7 +2497,7 @@ TEST_P(WaylandWindowTest, WaylandPopupNestedParent) {
EXPECT_TRUE(menu_window);
VerifyAndClearExpectations();
- menu_window->SetPointerFocus(true);
+ SetPointerFocusedWindow(menu_window.get());
std::vector<PlatformWindowType> window_types{PlatformWindowType::kMenu,
PlatformWindowType::kTooltip};
@@ -2533,43 +2526,41 @@ TEST_P(WaylandWindowTest, WaylandPopupNestedParent) {
EXPECT_EQ(mock_surface_nested->opaque_region(),
gfx::Rect(nested_wayland_popup_bounds.size()));
- menu_window->SetPointerFocus(false);
+ SetPointerFocusedWindow(nullptr);
nested_wayland_popup->Hide();
}
}
// Tests that size constraints returned by the `ui::PlatformWindowDelegate` are
// obeyed by the window when its bounds are set internally via its
-// SetBoundsInPixels() implementation.
+// SetBoundsInDIP() implementation.
TEST_P(WaylandWindowTest, SizeConstraintsInternal) {
- const gfx::Rect kMinBounds{0, 0, 100, 100};
- const gfx::Rect kMaxBounds{0, 0, 300, 300};
+ constexpr gfx::Size kMinSize{100, 100};
+ constexpr gfx::Size kMaxSize{300, 300};
- window_->SetBoundsInPixels({0, 0, 200, 200});
+ window_->SetBoundsInDIP({0, 0, 200, 200});
Sync();
- auto even_smaller_bounds = kMinBounds;
+ gfx::Rect even_smaller_bounds(kMinSize);
even_smaller_bounds.Inset(10);
even_smaller_bounds.set_origin({0, 0});
- EXPECT_CALL(delegate_, GetMinimumSizeForWindow())
- .WillOnce(Return(kMinBounds.size()));
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kMinBounds)));
+ EXPECT_CALL(delegate_, GetMinimumSizeForWindow()).WillOnce(Return(kMinSize));
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
- window_->SetBoundsInPixels(even_smaller_bounds);
+ window_->SetBoundsInDIP(even_smaller_bounds);
Sync();
VerifyAndClearExpectations();
- auto even_greater_bounds = kMaxBounds;
+ gfx::Rect even_greater_bounds(kMaxSize);
even_greater_bounds.Outset(10);
even_greater_bounds.set_origin({0, 0});
- EXPECT_CALL(delegate_, GetMaximumSizeForWindow())
- .WillOnce(Return(kMaxBounds.size()));
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kMaxBounds)));
+ EXPECT_CALL(delegate_, GetMaximumSizeForWindow()).WillOnce(Return(kMaxSize));
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
- window_->SetBoundsInPixels(even_greater_bounds);
+ window_->SetBoundsInDIP(even_greater_bounds);
Sync();
}
@@ -2577,45 +2568,45 @@ TEST_P(WaylandWindowTest, SizeConstraintsInternal) {
// obeyed by the window when its bounds are set externally via the configure
// event sent by the compositor.
TEST_P(WaylandWindowTest, SizeConstraintsExternal) {
- const gfx::Rect kMinBounds{0, 0, 100, 100};
- const gfx::Rect kMaxBounds{0, 0, 300, 300};
+ constexpr gfx::Size kMinSize{100, 100};
+ constexpr gfx::Size kMaxSize{300, 300};
EXPECT_CALL(delegate_, GetMinimumSizeForWindow())
- .WillRepeatedly(Return(kMinBounds.size()));
+ .WillRepeatedly(Return(kMinSize));
EXPECT_CALL(delegate_, GetMaximumSizeForWindow())
- .WillRepeatedly(Return(kMaxBounds.size()));
+ .WillRepeatedly(Return(kMaxSize));
- window_->SetBoundsInPixels({0, 0, 200, 200});
+ window_->SetBoundsInDIP({0, 0, 200, 200});
Sync();
uint32_t serial = 0;
auto state = InitializeWlArrayWithActivatedState();
- auto even_smaller_bounds = kMinBounds;
+ gfx::Rect even_smaller_bounds(kMinSize);
even_smaller_bounds.Inset(10);
even_smaller_bounds.set_origin({0, 0});
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kMinBounds)));
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
- SendConfigureEvent(xdg_surface_, even_smaller_bounds.width(),
- even_smaller_bounds.height(), ++serial, state.get());
+ SendConfigureEvent(xdg_surface_, even_smaller_bounds.size(), ++serial,
+ state.get());
Sync();
VerifyAndClearExpectations();
EXPECT_CALL(delegate_, GetMinimumSizeForWindow())
- .WillRepeatedly(Return(kMinBounds.size()));
+ .WillRepeatedly(Return(kMinSize));
EXPECT_CALL(delegate_, GetMaximumSizeForWindow())
- .WillRepeatedly(Return(kMaxBounds.size()));
+ .WillRepeatedly(Return(kMaxSize));
- auto even_greater_bounds = kMaxBounds;
+ gfx::Rect even_greater_bounds(kMaxSize);
even_greater_bounds.Outset(10);
even_greater_bounds.set_origin({0, 0});
- EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kMaxBounds)));
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
- SendConfigureEvent(xdg_surface_, even_greater_bounds.width(),
- even_greater_bounds.height(), ++serial, state.get());
+ SendConfigureEvent(xdg_surface_, even_greater_bounds.size(), ++serial,
+ state.get());
Sync();
}
@@ -2649,9 +2640,9 @@ TEST_P(WaylandWindowTest, OnSizeConstraintsChanged) {
TEST_P(WaylandWindowTest, DestroysCreatesSurfaceOnHideShow) {
MockWaylandPlatformWindowDelegate delegate;
- auto window = CreateWaylandWindowWithParams(
- PlatformWindowType::kWindow, gfx::kNullAcceleratedWidget,
- gfx::Rect(0, 0, 100, 100), &delegate);
+ auto window = CreateWaylandWindowWithParams(PlatformWindowType::kWindow,
+ gfx::kNullAcceleratedWidget,
+ gfx::Rect(100, 100), &delegate);
ASSERT_TRUE(window);
Sync();
@@ -2681,9 +2672,9 @@ TEST_P(WaylandWindowTest, DestroysCreatesPopupsOnHideShow) {
MockWaylandPlatformWindowDelegate delegate;
EXPECT_CALL(delegate, GetMenuType())
.WillRepeatedly(Return(MenuType::kRootContextMenu));
- auto window = CreateWaylandWindowWithParams(
- PlatformWindowType::kMenu, window_->GetWidget(), gfx::Rect(0, 0, 50, 50),
- &delegate);
+ auto window = CreateWaylandWindowWithParams(PlatformWindowType::kMenu,
+ window_->GetWidget(),
+ gfx::Rect(50, 50), &delegate);
ASSERT_TRUE(window);
Sync();
@@ -2730,9 +2721,9 @@ TEST_P(WaylandWindowTest, ReattachesBackgroundOnShow) {
// Create window.
MockWaylandPlatformWindowDelegate delegate;
- auto window = CreateWaylandWindowWithParams(
- PlatformWindowType::kWindow, gfx::kNullAcceleratedWidget,
- gfx::Rect(0, 0, 100, 100), &delegate);
+ auto window = CreateWaylandWindowWithParams(PlatformWindowType::kWindow,
+ gfx::kNullAcceleratedWidget,
+ gfx::Rect(100, 100), &delegate);
ASSERT_TRUE(window);
auto states = InitializeWlArrayWithActivatedState();
@@ -2743,7 +2734,7 @@ TEST_P(WaylandWindowTest, ReattachesBackgroundOnShow) {
window->root_surface()->GetSurfaceId());
EXPECT_TRUE(mock_surface->xdg_surface());
EXPECT_TRUE(mock_surface->xdg_surface()->xdg_toplevel());
- SendConfigureEvent(mock_surface->xdg_surface(), 100, 100, 1, states.get());
+ SendConfigureEvent(mock_surface->xdg_surface(), {100, 100}, 1, states.get());
// Commit a frame with only background.
std::vector<wl::WaylandOverlayConfig> overlays;
@@ -2769,7 +2760,7 @@ TEST_P(WaylandWindowTest, ReattachesBackgroundOnShow) {
Sync();
- SendConfigureEvent(mock_surface->xdg_surface(), 100, 100, 2, states.get());
+ SendConfigureEvent(mock_surface->xdg_surface(), {100, 100}, 2, states.get());
// Expects to receive an attach request on next frame.
EXPECT_CALL(*mock_surface, Attach(_, _, _)).Times(1);
@@ -2796,7 +2787,7 @@ TEST_P(WaylandWindowTest, SetsPropertiesOnShow) {
const std::u16string kTitle(u"WaylandWindowTest");
PlatformWindowInitProperties properties;
- properties.bounds = gfx::Rect(0, 0, 100, 100);
+ properties.bounds = gfx::Rect(100, 100);
properties.type = PlatformWindowType::kWindow;
properties.wm_class_class = kAppId;
@@ -2875,16 +2866,22 @@ TEST_P(WaylandWindowTest, CreatesPopupOnButtonPressSerial) {
Sync();
- constexpr uint32_t enter_serial = 1;
- constexpr uint32_t button_press_serial = 2;
- constexpr uint32_t button_release_serial = 3;
+ constexpr uint32_t keyboard_enter_serial = 1;
+ constexpr uint32_t pointer_enter_serial = 2;
+ constexpr uint32_t button_press_serial = 3;
+ constexpr uint32_t button_release_serial = 4;
wl::MockSurface* toplevel_surface = server_.GetObject<wl::MockSurface>(
window_->root_surface()->GetSurfaceId());
struct wl_array empty;
wl_array_init(&empty);
- wl_keyboard_send_enter(server_.seat()->keyboard()->resource(), enter_serial,
- toplevel_surface->resource(), &empty);
+ wl_keyboard_send_enter(server_.seat()->keyboard()->resource(),
+ keyboard_enter_serial, toplevel_surface->resource(),
+ &empty);
+
+ wl_pointer_send_enter(server_.seat()->pointer()->resource(),
+ pointer_enter_serial, toplevel_surface->resource(),
+ wl_fixed_from_int(0), wl_fixed_from_int(0));
// Send two events - button down and button up.
wl_pointer_send_button(server_.seat()->pointer()->resource(),
@@ -2899,9 +2896,9 @@ TEST_P(WaylandWindowTest, CreatesPopupOnButtonPressSerial) {
MockWaylandPlatformWindowDelegate delegate;
EXPECT_CALL(delegate, GetMenuType())
.WillOnce(Return(MenuType::kRootContextMenu));
- auto popup = CreateWaylandWindowWithParams(
- PlatformWindowType::kMenu, window_->GetWidget(),
- gfx::Rect(0, 0, 50, 50), &delegate);
+ auto popup = CreateWaylandWindowWithParams(PlatformWindowType::kMenu,
+ window_->GetWidget(),
+ gfx::Rect(50, 50), &delegate);
ASSERT_TRUE(popup);
Sync();
@@ -2966,9 +2963,9 @@ TEST_P(WaylandWindowTest, CreatesPopupOnTouchDownSerial) {
MockWaylandPlatformWindowDelegate delegate;
EXPECT_CALL(delegate, GetMenuType())
.WillRepeatedly(Return(MenuType::kRootContextMenu));
- auto popup = CreateWaylandWindowWithParams(
- PlatformWindowType::kMenu, window_->GetWidget(),
- gfx::Rect(0, 0, 50, 50), &delegate);
+ auto popup = CreateWaylandWindowWithParams(PlatformWindowType::kMenu,
+ window_->GetWidget(),
+ gfx::Rect(50, 50), &delegate);
ASSERT_TRUE(popup);
Sync();
@@ -3065,9 +3062,9 @@ TEST_P(WaylandWindowTest, DoesNotGrabPopupIfNoSeat) {
MockWaylandPlatformWindowDelegate delegate;
EXPECT_CALL(delegate, GetMenuType())
.WillOnce(Return(MenuType::kRootContextMenu));
- auto popup = CreateWaylandWindowWithParams(
- PlatformWindowType::kMenu, window_->GetWidget(), gfx::Rect(0, 0, 50, 50),
- &delegate);
+ auto popup = CreateWaylandWindowWithParams(PlatformWindowType::kMenu,
+ window_->GetWidget(),
+ gfx::Rect(50, 50), &delegate);
ASSERT_TRUE(popup);
Sync();
@@ -3083,7 +3080,7 @@ TEST_P(WaylandWindowTest, DoesNotGrabPopupUnlessParentHasGrab) {
WL_SEAT_CAPABILITY_POINTER);
Sync();
ASSERT_TRUE(connection_->seat()->pointer());
- window_->SetPointerFocus(true);
+ SetPointerFocusedWindow(window_.get());
// Emulate a root menu creation with no serial available and ensure
// ozone/wayland does not attempt to grab it.
@@ -3113,6 +3110,7 @@ TEST_P(WaylandWindowTest, DoesNotGrabPopupUnlessParentHasGrab) {
auto* pointer_resource = server_.seat()->pointer()->resource();
wl_pointer_send_enter(pointer_resource, 3u /*serial*/,
server_root_menu_surface->resource(), 0, 0);
+ wl_pointer_send_frame(pointer_resource);
wl_pointer_send_button(pointer_resource, 4u /*serial*/, 1, BTN_LEFT,
WL_POINTER_BUTTON_STATE_PRESSED);
EXPECT_CALL(delegate, DispatchEvent(_)).Times(2);
@@ -3136,6 +3134,7 @@ TEST_P(WaylandWindowTest, DoesNotGrabPopupUnlessParentHasGrab) {
wl_pointer_send_leave(pointer_resource, 5u /*serial*/,
server_root_menu_surface->resource());
+ wl_pointer_send_frame(pointer_resource);
Sync();
}
@@ -3143,10 +3142,10 @@ TEST_P(WaylandWindowTest, InitialBounds) {
testing::NiceMock<MockWaylandPlatformWindowDelegate> delegate_2;
auto toplevel = CreateWaylandWindowWithParams(
PlatformWindowType::kWindow, 0, gfx::Rect(10, 10, 200, 200), &delegate_2);
- toplevel->HandleAuraToplevelConfigure(20, 20, 0, 0, false, false, true);
+ toplevel->HandleAuraToplevelConfigure(0, 0, 0, 0, false, false, true);
toplevel->HandleSurfaceConfigure(2);
static_cast<WaylandToplevelWindow*>(toplevel.get())->ApplyPendingBounds();
- EXPECT_EQ(gfx::Rect(20, 20, 200, 200), toplevel->GetBoundsInDIP());
+ EXPECT_EQ(gfx::Rect(10, 10, 200, 200), toplevel->GetBoundsInDIP());
}
namespace {
@@ -3164,7 +3163,7 @@ class WaylandSubsurfaceTest : public WaylandWindowTest {
std::unique_ptr<WaylandWindow> window = CreateWaylandWindowWithParams(
PlatformWindowType::kWindow, gfx::kNullAcceleratedWidget,
- gfx::Rect(0, 0, 640, 480), &delegate_);
+ gfx::Rect(640, 480), &delegate_);
EXPECT_TRUE(window);
bool result = window->RequestSubsurface();
@@ -3419,11 +3418,11 @@ TEST_P(WaylandWindowTest, RepositionPopups) {
VerifyAndClearExpectations();
- const gfx::Rect damage_rect = {0, 0, menu_window_bounds.width(),
- menu_window_bounds.height()};
+ const gfx::Rect damage_rect{menu_window_bounds.width(),
+ menu_window_bounds.height()};
EXPECT_CALL(delegate_, OnDamageRect(Eq(damage_rect))).Times(1);
menu_window_bounds.set_origin({10, 10});
- menu_window->SetBoundsInPixels(menu_window_bounds);
+ menu_window->SetBoundsInDIP(menu_window_bounds);
Sync();
@@ -3440,7 +3439,7 @@ TEST_P(WaylandWindowTest, RepositionPopups) {
// This will send a configure event for the xdg_surface that backs the
// xdg_popup. Size and state are not used there.
- SendConfigureEvent(mock_surface_popup->xdg_surface(), 0, 0, 1, nullptr);
+ SendConfigureEvent(mock_surface_popup->xdg_surface(), {0, 0}, 1, nullptr);
// Call sync so that server's configuration event is received by
// Ozone/Wayland.
@@ -3463,7 +3462,7 @@ TEST_P(WaylandWindowTest, StartWithMinimized) {
EXPECT_EQ(PlatformWindowState::kNormal, window_->GetPlatformWindowState());
ScopedWlArray states = InitializeWlArrayWithActivatedState();
- SendConfigureEvent(xdg_surface_, 0, 0, 1, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 1, states.get());
Sync();
EXPECT_CALL(delegate_, OnWindowStateChanged(_, _)).Times(1);
@@ -3483,12 +3482,12 @@ TEST_P(WaylandWindowTest, StartWithMinimized) {
})));
// The window geometry has to be set to the current bounds of the window for
// minimized state.
- gfx::Rect bounds = window_->GetBoundsInPixels();
- EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, bounds.width(), bounds.height()));
+ gfx::Rect bounds = window_->GetBoundsInDIP();
+ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(gfx::Rect(bounds.size())));
// Send one additional empty configuration event for minimized state.
// (which means the surface is not maximized, fullscreen or activated)
states = ScopedWlArray();
- SendConfigureEvent(xdg_surface_, 0, 0, 2, states.get());
+ SendConfigureEvent(xdg_surface_, {0, 0}, 2, states.get());
Sync();
}
@@ -3499,14 +3498,13 @@ class BlockableWaylandToplevelWindow : public WaylandToplevelWindow {
: WaylandToplevelWindow(delegate, connection) {}
static std::unique_ptr<BlockableWaylandToplevelWindow> Create(
- const gfx::Rect bounds,
+ const gfx::Rect& bounds,
WaylandConnection* connection,
MockWaylandPlatformWindowDelegate* delegate) {
auto window =
std::make_unique<BlockableWaylandToplevelWindow>(delegate, connection);
- window->set_update_visual_size_immediately(/*update_immediately=*/true);
- window->set_apply_pending_state_on_update_visual_size(
- /*apply_immediately=*/true);
+ window->set_update_visual_size_immediately_for_testing(true);
+ window->set_apply_pending_state_on_update_visual_size_for_testing(true);
PlatformWindowInitProperties properties;
properties.bounds = bounds;
@@ -3557,7 +3555,7 @@ TEST_P(WaylandWindowTest, DISABLED_BlockingTouchDownUp_NoCrash) {
MockWaylandPlatformWindowDelegate delegate;
auto window = BlockableWaylandToplevelWindow::Create(
- gfx::Rect(0, 0, 800, 600), connection_.get(), &delegate);
+ gfx::Rect(800, 600), connection_.get(), &delegate);
wl_seat_send_capabilities(
server_.seat()->resource(),
@@ -3600,6 +3598,117 @@ TEST_P(WaylandWindowTest, DISABLED_BlockingTouchDownUp_NoCrash) {
Sync();
}
+// Make sure that changing focus during dispatch will not re-dispatch the event
+// to the newly focused window. (crbug.com/1339082);
+// Flaky on device/VM: https://crbug.com/1348046
+#if BUILDFLAG(IS_CHROMEOS_DEVICE)
+#define MAYBE_ChangeFocusDuringDispatch DISABLED_ChangeFocusDuringDispatch
+#else
+#define MAYBE_ChangeFocusDuringDispatch ChangeFocusDuringDispatch
+#endif
+TEST_P(WaylandWindowTest, MAYBE_ChangeFocusDuringDispatch) {
+ MockPlatformWindowDelegate other_delegate;
+ gfx::AcceleratedWidget other_widget = gfx::kNullAcceleratedWidget;
+ EXPECT_CALL(other_delegate, OnAcceleratedWidgetAvailable(_))
+ .WillOnce(SaveArg<0>(&other_widget));
+
+ PlatformWindowInitProperties properties;
+ properties.bounds = gfx::Rect(10, 10);
+ properties.type = PlatformWindowType::kWindow;
+ auto other_window = WaylandWindow::Create(&other_delegate, connection_.get(),
+ std::move(properties));
+ ASSERT_NE(other_widget, gfx::kNullAcceleratedWidget);
+
+ wl_seat_send_capabilities(server_.seat()->resource(),
+ WL_SEAT_CAPABILITY_POINTER);
+ Sync();
+
+ wl::MockSurface* other_surface = server_.GetObject<wl::MockSurface>(
+ other_window->root_surface()->GetSurfaceId());
+ ASSERT_TRUE(other_surface);
+ auto* pointer = server_.seat()->pointer();
+
+ wl_pointer_send_enter(pointer->resource(), 1, surface_->resource(), 0, 0);
+ // The Enter event is coupled with the frame event.
+ wl_pointer_send_frame(pointer->resource());
+ wl_pointer_send_button(pointer->resource(), 2, 1004, BTN_LEFT,
+ WL_POINTER_BUTTON_STATE_PRESSED);
+
+ int count = 0;
+ EXPECT_CALL(delegate_, DispatchEvent(_)).WillRepeatedly([&](Event* event) {
+ count++;
+ if (event->type() == ui::ET_MOUSE_PRESSED) {
+ wl_pointer_send_leave(pointer->resource(), 3, surface_->resource());
+ wl_pointer_send_enter(pointer->resource(), 4, other_surface->resource(),
+ 0, 0);
+ wl_pointer_send_frame(pointer->resource());
+ Sync();
+ }
+ });
+ EXPECT_CALL(other_delegate, DispatchEvent(_)).Times(1);
+
+ Sync();
+ EXPECT_EQ(count, 3);
+}
+
+TEST_P(WaylandWindowTest, WindowMovedResized) {
+ const gfx::Rect initial_bounds = window_->GetBoundsInDIP();
+
+ gfx::Rect new_bounds(initial_bounds);
+ new_bounds.set_x(new_bounds.origin().x() + 10);
+ new_bounds.set_y(new_bounds.origin().y() + 10);
+ // Configure is not necessary to just move.
+ EXPECT_CALL(delegate_, OnBoundsChanged(BoundsChange(true)));
+ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(gfx::Rect(new_bounds.size())))
+ .Times(0);
+ window_->SetBoundsInDIP(new_bounds);
+
+ // Resize and move.
+ new_bounds.Inset(5);
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(BoundsChange(true)))).Times(1);
+ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(gfx::Rect(new_bounds.size())))
+ .Times(0);
+ window_->SetBoundsInDIP(new_bounds);
+
+ // Xdg configure event will reset the origin.
+ EXPECT_CALL(delegate_, OnBoundsChanged(Eq(BoundsChange(true)))).Times(1);
+ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(gfx::Rect(new_bounds.size())))
+ .Times(1);
+ ScopedWlArray states = InitializeWlArrayWithActivatedState();
+ SendConfigureEvent(xdg_surface_, new_bounds.size(), 1, states.get());
+ Sync();
+}
+
+// Make sure that creating a window with DIP bounds creates a window with
+// the same DIP bounds with various fractional scales.
+TEST_P(WaylandWindowTest, NoRoundingErrorInDIP) {
+ VerifyAndClearExpectations();
+ auto* primary_output =
+ connection_->wayland_output_manager()->GetPrimaryOutput();
+ constexpr float kScales[] = {display::kDsf_1_777, display::kDsf_2_252,
+ display::kDsf_2_666, display::kDsf_1_8};
+ for (float scale : kScales) {
+ primary_output->SetScaleFactorForTesting(scale);
+ // Update to delegate to use the correct scale;
+ window_->UpdateWindowScale(true);
+
+ testing::NiceMock<MockWaylandPlatformWindowDelegate> delegate;
+ std::unique_ptr<WaylandWindow> wayland_window =
+ CreateWaylandWindowWithParams(PlatformWindowType::kWindow,
+ gfx::kNullAcceleratedWidget,
+ gfx::Rect(20, 0, 100, 100), &delegate);
+ for (int i = 100; i < 3000; i++) {
+ const gfx::Rect kBoundsDip{20, 0, i, 3000 - i};
+ const gfx::Rect bounds_in_px = delegate_.ConvertRectToPixels(kBoundsDip);
+ wayland_window->SetBoundsInDIP(kBoundsDip);
+ EXPECT_EQ(bounds_in_px.size(), wayland_window->size_px());
+ EXPECT_EQ(kBoundsDip, wayland_window->GetBoundsInDIP());
+ Sync();
+ }
+ }
+ VerifyAndClearExpectations();
+}
+
INSTANTIATE_TEST_SUITE_P(XdgVersionStableTest,
WaylandWindowTest,
Values(wl::ServerConfig{
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zaura_output_unittest.cc b/chromium/ui/ozone/platform/wayland/host/wayland_zaura_output_unittest.cc
index a29d9c68e10..9873d164022 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_zaura_output_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zaura_output_unittest.cc
@@ -8,6 +8,7 @@
#include <aura-shell-server-protocol.h>
#include <wayland-server-protocol.h>
+#include "base/memory/raw_ptr.h"
#include "base/run_loop.h"
#include "base/test/task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -71,7 +72,7 @@ class WaylandZAuraOutputTest : public ::testing::Test {
wl::MockZAuraShell mock_zaura_shell_;
WaylandConnection connection_;
- WaylandOutputManager* output_manager_ = nullptr;
+ raw_ptr<WaylandOutputManager> output_manager_ = nullptr;
std::unique_ptr<WaylandScreen> platform_screen_;
};
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell.cc b/chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell.cc
index 6c8b645452b..b6d3e3543dd 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell.cc
@@ -20,7 +20,7 @@ namespace ui {
namespace {
constexpr uint32_t kMinVersion = 1;
-constexpr uint32_t kMaxVersion = 34;
+constexpr uint32_t kMaxVersion = 40;
}
// static
@@ -100,7 +100,7 @@ void WaylandZAuraShell::OnLayoutMode(void* data,
struct zaura_shell* zaura_shell,
uint32_t layout_mode) {
auto* self = static_cast<WaylandZAuraShell*>(data);
- auto* connection = self->connection_;
+ auto* connection = self->connection_.get();
auto* screen = connection->wayland_output_manager()->wayland_screen();
// |screen| is null in some unit test suites.
if (!screen)
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell.h b/chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell.h
index 56b7e9c4979..496e964e2b5 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell.h
@@ -6,6 +6,7 @@
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZAURA_SHELL_H_
#include "base/containers/flat_set.h"
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
namespace ui {
@@ -58,7 +59,7 @@ class WaylandZAuraShell : public wl::GlobalObjectRegistrar<WaylandZAuraShell> {
struct wl_surface* lost_active);
wl::Object<zaura_shell> obj_;
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
base::flat_set<uint32_t> bug_fix_ids_;
std::vector<std::string> desks_;
int active_desk_index_ = 0;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell_unittest.cc b/chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell_unittest.cc
index 676086acd83..93e77bd746f 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell_unittest.cc
@@ -22,8 +22,7 @@ TEST(WaylandZAuraShellTest, BugFix) {
base::test::SingleThreadTaskEnvironment::MainThreadType::UI);
wl::TestWaylandServerThread server;
ASSERT_TRUE(server.Start({.shell_version = wl::ShellVersion::kStable}));
- wl::MockZAuraShell zaura_shell_obj;
- zaura_shell_obj.Initialize(server.display());
+ wl::MockZAuraShell* zaura_shell = server.zaura_shell();
WaylandConnection connection;
ASSERT_TRUE(connection.Initialize());
@@ -32,8 +31,9 @@ TEST(WaylandZAuraShellTest, BugFix) {
base::RunLoop().RunUntilIdle();
server.Pause();
- zaura_shell_send_bug_fix(zaura_shell_obj.resource(), 1);
- zaura_shell_send_bug_fix(zaura_shell_obj.resource(), 3);
+ ASSERT_TRUE(server.zaura_shell()->resource());
+ zaura_shell_send_bug_fix(zaura_shell->resource(), 1);
+ zaura_shell_send_bug_fix(zaura_shell->resource(), 3);
server.Resume();
base::RunLoop().RunUntilIdle();
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.cc b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.cc
new file mode 100644
index 00000000000..687618dfbb3
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.cc
@@ -0,0 +1,64 @@
+// 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/wayland/host/wayland_zcr_color_management_output.h"
+
+#include <chrome-color-management-client-protocol.h>
+#include <memory>
+
+#include "base/notreached.h"
+#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+#include "ui/ozone/platform/wayland/host/wayland_output.h"
+
+namespace ui {
+
+WaylandZcrColorManagementOutput::WaylandZcrColorManagementOutput(
+ zcr_color_management_output_v1* color_management_output)
+ : zcr_color_management_output_(color_management_output) {
+ DCHECK(color_management_output);
+ static const zcr_color_management_output_v1_listener listener = {
+ &WaylandZcrColorManagementOutput::OnColorSpaceChanged,
+ &WaylandZcrColorManagementOutput::OnExtendedDynamicRange,
+ };
+
+ zcr_color_management_output_v1_add_listener(
+ zcr_color_management_output_.get(), &listener, this);
+}
+
+WaylandZcrColorManagementOutput::~WaylandZcrColorManagementOutput() = default;
+
+// static
+void WaylandZcrColorManagementOutput::OnColorSpaceChanged(
+ void* data,
+ struct zcr_color_management_output_v1* cmo) {
+ WaylandZcrColorManagementOutput* zcr_color_management_output =
+ static_cast<WaylandZcrColorManagementOutput*>(data);
+ DCHECK(zcr_color_management_output);
+
+ // request new color space
+ zcr_color_management_output->color_space_ =
+ std::make_unique<WaylandZcrColorSpace>(
+ zcr_color_management_output_v1_get_color_space(
+ zcr_color_management_output->zcr_color_management_output_.get()));
+
+ zcr_color_management_output->color_space_->SetColorSpaceDoneCallback(
+ base::BindOnce(&WaylandZcrColorManagementOutput::OnColorSpaceDone,
+ zcr_color_management_output->weak_factory_.GetWeakPtr()));
+}
+
+// static
+void WaylandZcrColorManagementOutput::OnColorSpaceDone(
+ const gfx::ColorSpace& color_space) {
+ gfx_color_space_ = std::make_unique<gfx::ColorSpace>(color_space);
+}
+
+// static
+void WaylandZcrColorManagementOutput::OnExtendedDynamicRange(
+ void* data,
+ struct zcr_color_management_output_v1* cmo,
+ uint32_t value) {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.h b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.h
new file mode 100644
index 00000000000..c9cc767ff9a
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_management_output.h
@@ -0,0 +1,47 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_MANAGEMENT_OUTPUT_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_MANAGEMENT_OUTPUT_H_
+
+#include "base/memory/weak_ptr.h"
+#include "ui/gfx/color_space.h"
+#include "ui/ozone/platform/wayland/host/wayland_zcr_color_space.h"
+
+namespace ui {
+
+// WaylandZcrColorManagementOutput tracks the color space of its associated
+// Wayland Output.
+class WaylandZcrColorManagementOutput {
+ public:
+ explicit WaylandZcrColorManagementOutput(
+ struct zcr_color_management_output_v1* management_output);
+ WaylandZcrColorManagementOutput(const WaylandZcrColorManagementOutput&) =
+ delete;
+ WaylandZcrColorManagementOutput& operator=(
+ const WaylandZcrColorManagementOutput&) = delete;
+ ~WaylandZcrColorManagementOutput();
+
+ gfx::ColorSpace* gfx_color_space() const { return gfx_color_space_.get(); }
+ WaylandZcrColorSpace* color_space() const { return color_space_.get(); }
+
+ private:
+ // zcr_color_management_output_v1_listener
+ static void OnColorSpaceChanged(void* data,
+ struct zcr_color_management_output_v1* cmo);
+ static void OnExtendedDynamicRange(void* data,
+ struct zcr_color_management_output_v1* cmo,
+ uint32_t value);
+
+ void OnColorSpaceDone(const gfx::ColorSpace& color_space);
+
+ wl::Object<zcr_color_management_output_v1> zcr_color_management_output_;
+ std::unique_ptr<gfx::ColorSpace> gfx_color_space_;
+ std::unique_ptr<WaylandZcrColorSpace> color_space_;
+ base::WeakPtrFactory<WaylandZcrColorManagementOutput> weak_factory_{this};
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_MANAGEMENT_OUTPUT_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_management_surface.cc b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_management_surface.cc
new file mode 100644
index 00000000000..b757fe7a3b3
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_management_surface.cc
@@ -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.
+
+#include "ui/ozone/platform/wayland/host/wayland_zcr_color_management_surface.h"
+
+#include <chrome-color-management-client-protocol.h>
+#include <memory>
+
+#include "base/notreached.h"
+#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+
+namespace ui {
+
+WaylandZcrColorManagementSurface::WaylandZcrColorManagementSurface(
+ zcr_color_management_surface_v1* color_management_surface,
+ WaylandConnection* connection)
+ : zcr_color_management_surface_(color_management_surface),
+ connection_(connection) {
+ DCHECK(color_management_surface);
+ static const zcr_color_management_surface_v1_listener listener = {
+ &WaylandZcrColorManagementSurface::OnPreferredColorSpace,
+ };
+
+ zcr_color_management_surface_v1_add_listener(
+ zcr_color_management_surface_.get(), &listener, this);
+}
+
+WaylandZcrColorManagementSurface::~WaylandZcrColorManagementSurface() = default;
+
+void WaylandZcrColorManagementSurface::SetDefaultColorSpace() {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
+void WaylandZcrColorManagementSurface::SetColorSpace(
+ gfx::ColorSpace color_space) {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
+// static
+void WaylandZcrColorManagementSurface::OnPreferredColorSpace(
+ void* data,
+ struct zcr_color_management_surface_v1* cms,
+ struct wl_output* output) {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_management_surface.h b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_management_surface.h
new file mode 100644
index 00000000000..958df8a41bd
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_management_surface.h
@@ -0,0 +1,43 @@
+// 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_WAYLAND_HOST_WAYLAND_ZCR_COLOR_MANAGEMENT_SURFACE_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_MANAGEMENT_SURFACE_H_
+
+#include "ui/gfx/color_space.h"
+#include "ui/ozone/platform/wayland/host/wayland_zcr_color_space.h"
+
+namespace ui {
+
+class WaylandConnection;
+
+// TODO(b/237094484): merge into wayland_surface.h along with
+// color_space_creator zcr_color_mangement_surface_v1
+class WaylandZcrColorManagementSurface {
+ public:
+ explicit WaylandZcrColorManagementSurface(
+ struct zcr_color_management_surface_v1* management_surface,
+ WaylandConnection* connection);
+ WaylandZcrColorManagementSurface(const WaylandZcrColorManagementSurface&) =
+ delete;
+ WaylandZcrColorManagementSurface& operator=(
+ const WaylandZcrColorManagementSurface&) = delete;
+ ~WaylandZcrColorManagementSurface();
+
+ void SetDefaultColorSpace();
+ void SetColorSpace(gfx::ColorSpace color_space);
+
+ private:
+ // zcr_color_management_surface_v1_listener
+ static void OnPreferredColorSpace(void* data,
+ struct zcr_color_management_surface_v1* cms,
+ struct wl_output* output);
+
+ wl::Object<zcr_color_management_surface_v1> zcr_color_management_surface_;
+ const raw_ptr<WaylandConnection> connection_;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_MANAGEMENT_SURFACE_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_manager.cc b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_manager.cc
new file mode 100644
index 00000000000..c3ff81d7a4a
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_manager.cc
@@ -0,0 +1,60 @@
+// 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/wayland/host/wayland_zcr_color_manager.h"
+
+#include <chrome-color-management-client-protocol.h>
+
+#include "base/logging.h"
+#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+#include "ui/ozone/platform/wayland/host/wayland_output_manager.h"
+
+namespace ui {
+
+namespace {
+constexpr uint32_t kMinVersion = 1;
+constexpr uint32_t kMaxVersion = 1;
+} // namespace
+
+// static
+constexpr char WaylandZcrColorManager::kInterfaceName[];
+
+// static
+void WaylandZcrColorManager::Instantiate(WaylandConnection* connection,
+ wl_registry* registry,
+ uint32_t name,
+ const std::string& interface,
+ uint32_t version) {
+ DCHECK_EQ(interface, kInterfaceName);
+
+ if (connection->zcr_color_manager_)
+ return;
+
+ auto color_manager = wl::Bind<struct zcr_color_manager_v1>(
+ registry, name, std::min(kMinVersion, kMaxVersion));
+ if (!color_manager) {
+ LOG(ERROR) << "Failed to bind zcr_color_manager_v1";
+ return;
+ }
+ connection->zcr_color_manager_ = std::make_unique<WaylandZcrColorManager>(
+ color_manager.release(), connection);
+ if (connection->wayland_output_manager())
+ connection->wayland_output_manager()->InitializeAllColorManagementOutputs();
+}
+
+WaylandZcrColorManager::WaylandZcrColorManager(
+ zcr_color_manager_v1* zcr_color_manager,
+ WaylandConnection* connection)
+ : zcr_color_manager_(zcr_color_manager), connection_(connection) {}
+
+WaylandZcrColorManager::~WaylandZcrColorManager() = default;
+
+wl::Object<zcr_color_management_output_v1>
+WaylandZcrColorManager::CreateColorManagementOutput(wl_output* output) {
+ return wl::Object<zcr_color_management_output_v1>(
+ zcr_color_manager_v1_get_color_management_output(zcr_color_manager_.get(),
+ output));
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_manager.h b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_manager.h
new file mode 100644
index 00000000000..56907a84f19
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_manager.h
@@ -0,0 +1,52 @@
+// 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_WAYLAND_HOST_WAYLAND_ZCR_COLOR_MANAGER_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_MANAGER_H_
+
+#include "base/memory/raw_ptr.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
+#include "ui/ozone/platform/wayland/common/wayland_util.h"
+
+struct zcr_color_manager_v1;
+
+namespace ui {
+
+class WaylandConnection;
+
+// Wrapper around |zcr_color_manager_v1| Wayland factory
+class WaylandZcrColorManager
+ : public wl::GlobalObjectRegistrar<WaylandZcrColorManager> {
+ public:
+ static constexpr char kInterfaceName[] = "zcr_color_manager_v1";
+
+ static void Instantiate(WaylandConnection* connection,
+ wl_registry* registry,
+ uint32_t name,
+ const std::string& interface,
+ uint32_t version);
+
+ WaylandZcrColorManager(zcr_color_manager_v1* zcr_color_manager_,
+ WaylandConnection* connection);
+
+ WaylandZcrColorManager(const WaylandZcrColorManager&) = delete;
+ WaylandZcrColorManager& operator=(const WaylandZcrColorManager&) = delete;
+
+ ~WaylandZcrColorManager();
+
+ wl::Object<zcr_color_management_output_v1> CreateColorManagementOutput(
+ wl_output* output);
+
+ private:
+ // Holds pointer to the zcr_color_manager_v1 Wayland factory.
+ const wl::Object<zcr_color_manager_v1> zcr_color_manager_;
+
+ // Non-owned.
+ const raw_ptr<WaylandConnection> connection_;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_MANAGER_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_space.cc b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_space.cc
new file mode 100644
index 00000000000..08aa952a384
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_space.cc
@@ -0,0 +1,128 @@
+// 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/wayland/host/wayland_zcr_color_space.h"
+
+#include <chrome-color-management-client-protocol.h>
+#include <cstdint>
+
+#include "base/logging.h"
+#include "base/notreached.h"
+#include "base/strings/stringprintf.h"
+#include "third_party/skia/include/core/SkColorSpace.h"
+#include "ui/base/wayland/color_manager_util.h"
+#include "ui/gfx/color_space.h"
+#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+#include "ui/ozone/platform/wayland/wayland_utils.h"
+
+namespace ui {
+
+WaylandZcrColorSpace::WaylandZcrColorSpace(
+ struct zcr_color_space_v1* color_space)
+ : zcr_color_space_(color_space) {
+ DCHECK(color_space);
+ static const zcr_color_space_v1_listener listener = {
+ &WaylandZcrColorSpace::OnIccFile,
+ &WaylandZcrColorSpace::OnNames,
+ &WaylandZcrColorSpace::OnParams,
+ &WaylandZcrColorSpace::OnDone,
+ };
+
+ zcr_color_space_v1_add_listener(zcr_color_space_.get(), &listener, this);
+ zcr_color_space_v1_get_information(zcr_color_space_.get());
+}
+
+WaylandZcrColorSpace::~WaylandZcrColorSpace() = default;
+
+// static
+void WaylandZcrColorSpace::OnIccFile(void* data,
+ struct zcr_color_space_v1* cs,
+ int32_t icc,
+ uint32_t icc_size) {
+ WaylandZcrColorSpace* zcr_color_space =
+ static_cast<WaylandZcrColorSpace*>(data);
+ DCHECK(zcr_color_space);
+ // TODO(b/192562912): construct a color space from an icc file.
+}
+
+// static
+void WaylandZcrColorSpace::OnNames(void* data,
+ struct zcr_color_space_v1* cs,
+ uint32_t eotf,
+ uint32_t chromaticity,
+ uint32_t whitepoint) {
+ WaylandZcrColorSpace* zcr_color_space =
+ static_cast<WaylandZcrColorSpace*>(data);
+ DCHECK(zcr_color_space);
+ auto primaryID = ui::wayland::kChromaticityMap.contains(chromaticity)
+ ? ui::wayland::kChromaticityMap.at(chromaticity)
+ : gfx::ColorSpace::PrimaryID::INVALID;
+ auto transferID = ui::wayland::kEotfMap.contains(eotf)
+ ? ui::wayland::kEotfMap.at(eotf)
+ : gfx::ColorSpace::TransferID::INVALID;
+ zcr_color_space
+ ->gathered_information[static_cast<uint8_t>(InformationType::kNames)] =
+ gfx::ColorSpace(primaryID, transferID, gfx::ColorSpace::MatrixID::RGB,
+ gfx::ColorSpace::RangeID::FULL);
+}
+
+// static
+void WaylandZcrColorSpace::OnParams(void* data,
+ struct zcr_color_space_v1* cs,
+ uint32_t eotf,
+ uint32_t primary_r_x,
+ uint32_t primary_r_y,
+ uint32_t primary_g_x,
+ uint32_t primary_g_y,
+ uint32_t primary_b_x,
+ uint32_t primary_b_y,
+ uint32_t whitepoint_x,
+ uint32_t whitepoint_y) {
+ WaylandZcrColorSpace* zcr_color_space =
+ static_cast<WaylandZcrColorSpace*>(data);
+ DCHECK(zcr_color_space);
+ auto transferID = ui::wayland::kEotfMap.contains(eotf)
+ ? ui::wayland::kEotfMap.at(eotf)
+ : gfx::ColorSpace::TransferID::INVALID;
+ SkColorSpacePrimaries primaries = {
+ PARAM_TO_FLOAT(primary_r_x), PARAM_TO_FLOAT(primary_r_y),
+ PARAM_TO_FLOAT(primary_g_x), PARAM_TO_FLOAT(primary_g_y),
+ PARAM_TO_FLOAT(primary_b_x), PARAM_TO_FLOAT(primary_b_y),
+ PARAM_TO_FLOAT(whitepoint_x), PARAM_TO_FLOAT(whitepoint_y)};
+
+ skcms_Matrix3x3 xyzd50 = {};
+ if (!primaries.toXYZD50(&xyzd50)) {
+ DLOG(ERROR) << base::StringPrintf(
+ "Unable to translate color space primaries to XYZD50: "
+ "{%f, %f, %f, %f, %f, %f, %f, %f}",
+ primaries.fRX, primaries.fRY, primaries.fGX, primaries.fGY,
+ primaries.fBX, primaries.fBY, primaries.fWX, primaries.fWY);
+ return;
+ }
+ zcr_color_space
+ ->gathered_information[static_cast<uint8_t>(InformationType::kParams)] =
+ gfx::ColorSpace::CreateCustom(xyzd50, transferID);
+}
+
+gfx::ColorSpace WaylandZcrColorSpace::GetPriorityInformationType() {
+ for (auto maybe_colorspace : gathered_information) {
+ if (maybe_colorspace.has_value())
+ return maybe_colorspace.value();
+ }
+ DLOG(ERROR) << "No color space information gathered";
+ return gfx::ColorSpace::CreateSRGB();
+}
+
+// static
+void WaylandZcrColorSpace::OnDone(void* data, struct zcr_color_space_v1* cs) {
+ WaylandZcrColorSpace* zcr_color_space =
+ static_cast<WaylandZcrColorSpace*>(data);
+ DCHECK(zcr_color_space);
+ if (zcr_color_space->HasColorSpaceDoneCallback())
+ std::move(zcr_color_space->color_space_done_callback_)
+ .Run(zcr_color_space->GetPriorityInformationType());
+ zcr_color_space->gathered_information.fill({});
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_space.h b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_space.h
new file mode 100644
index 00000000000..ed8381d5307
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_space.h
@@ -0,0 +1,85 @@
+// 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_WAYLAND_HOST_WAYLAND_ZCR_COLOR_SPACE_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_SPACE_H_
+
+#include <array>
+#include <memory>
+#include <utility>
+
+#include "base/callback.h"
+#include "ui/gfx/color_space.h"
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
+
+namespace ui {
+
+// ZcrColorSpace is used to send color space information over wayland protocol.
+// its requests and events are specified in chrome-color-management.xml.
+// The ui::gfx::ColorSpace equivalent of ZcrColorSpace can be gotten with
+// gfx_color_space().
+class WaylandZcrColorSpace {
+ public:
+ using WaylandZcrColorSpaceDoneCallback =
+ base::OnceCallback<void(const gfx::ColorSpace&)>;
+ explicit WaylandZcrColorSpace(zcr_color_space_v1* color_space);
+ WaylandZcrColorSpace(const WaylandZcrColorSpace&) = delete;
+ WaylandZcrColorSpace& operator=(const WaylandZcrColorSpace&) = delete;
+ ~WaylandZcrColorSpace();
+
+ zcr_color_space_v1* zcr_color_space() const { return zcr_color_space_.get(); }
+ bool HasColorSpaceDoneCallback() const {
+ return !color_space_done_callback_.is_null();
+ }
+ void SetColorSpaceDoneCallback(WaylandZcrColorSpaceDoneCallback callback) {
+ color_space_done_callback_ = std::move(callback);
+ }
+
+ private:
+ // InformationType is an enumeration of the possible events following a
+ // get_information request in order of their priority (0 is highest).
+ enum class InformationType : uint8_t {
+ kNames = 0,
+ kIccFile = 1,
+ kParams = 2,
+ kMaxValue = kParams,
+ };
+
+ gfx::ColorSpace GetPriorityInformationType();
+ // zcr_color_space_v1_listener
+ static void OnIccFile(void* data,
+ struct zcr_color_space_v1* cs,
+ int32_t icc,
+ uint32_t icc_size);
+ static void OnNames(void* data,
+ struct zcr_color_space_v1* cs,
+ uint32_t eotf,
+ uint32_t chromaticity,
+ uint32_t whitepoint);
+ static void OnDone(void* data, struct zcr_color_space_v1* cs);
+ static void OnParams(void* data,
+ struct zcr_color_space_v1* cs,
+ uint32_t eotf,
+ uint32_t primary_r_x,
+ uint32_t primary_r_y,
+ uint32_t primary_g_x,
+ uint32_t primary_g_y,
+ uint32_t primary_b_x,
+ uint32_t primary_b_y,
+ uint32_t whitepoint_x,
+ uint32_t whitepoint_y);
+
+ // Information events should store color space info at their enum index in
+ // this array. Cleared on the OnDone event. Choosing the highest priority
+ // InformationType available is simple with forward iteration.
+ std::array<absl::optional<gfx::ColorSpace>,
+ static_cast<uint8_t>(InformationType::kMaxValue) + 1>
+ gathered_information;
+ wl::Object<zcr_color_space_v1> zcr_color_space_;
+ WaylandZcrColorSpaceDoneCallback color_space_done_callback_;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_SPACE_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_space_creator.cc b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_space_creator.cc
new file mode 100644
index 00000000000..b0467cb69c2
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_space_creator.cc
@@ -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.
+
+#include "ui/ozone/platform/wayland/host/wayland_zcr_color_space_creator.h"
+
+#include <chrome-color-management-client-protocol.h>
+#include <memory>
+
+#include "base/check.h"
+#include "base/notreached.h"
+
+namespace ui {
+
+WaylandZcrColorSpaceCreator::WaylandZcrColorSpaceCreator(
+ struct zcr_color_space_creator_v1* color_space_creator,
+ struct zcr_color_management_surface_v1* management_surface)
+ : zcr_color_space_creator_(color_space_creator),
+ zcr_color_management_surface_(management_surface) {
+ DCHECK(color_space_creator);
+ static const zcr_color_space_creator_v1_listener listener = {
+ &WaylandZcrColorSpaceCreator::OnCreated,
+ &WaylandZcrColorSpaceCreator::OnError,
+ };
+ DCHECK(zcr_color_management_surface_);
+ zcr_color_space_creator_v1_add_listener(zcr_color_space_creator_.get(),
+ &listener, this);
+}
+
+WaylandZcrColorSpaceCreator::~WaylandZcrColorSpaceCreator() = default;
+
+// static
+void WaylandZcrColorSpaceCreator::OnCreated(
+ void* data,
+ struct zcr_color_space_creator_v1* css,
+ struct zcr_color_space_v1* color_space) {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
+// static
+void WaylandZcrColorSpaceCreator::OnError(
+ void* data,
+ struct zcr_color_space_creator_v1* css,
+ uint32_t error) {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_space_creator.h b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_space_creator.h
new file mode 100644
index 00000000000..14276472092
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_color_space_creator.h
@@ -0,0 +1,40 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_SPACE_CREATOR_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_SPACE_CREATOR_H_
+
+#include "ui/gfx/color_space.h"
+#include "ui/ozone/platform/wayland/host/wayland_zcr_color_space.h"
+
+namespace ui {
+
+// WaylandZcrColorSpaceCreator is used to create a zcr_color_space_v1 object
+// that can be sent to exo over wayland protocol.
+class WaylandZcrColorSpaceCreator {
+ public:
+ WaylandZcrColorSpaceCreator(
+ struct zcr_color_space_creator_v1* creator,
+ struct zcr_color_management_surface_v1* management_surface);
+ WaylandZcrColorSpaceCreator(const WaylandZcrColorSpaceCreator&) = delete;
+ WaylandZcrColorSpaceCreator& operator=(const WaylandZcrColorSpaceCreator&) =
+ delete;
+ ~WaylandZcrColorSpaceCreator();
+
+ private:
+ // zcr_color_space_creator_v1_listener
+ static void OnCreated(void* data,
+ struct zcr_color_space_creator_v1* css,
+ struct zcr_color_space_v1* color_space);
+ static void OnError(void* data,
+ struct zcr_color_space_creator_v1* css,
+ uint32_t error);
+
+ wl::Object<zcr_color_space_creator_v1> zcr_color_space_creator_;
+ zcr_color_management_surface_v1* zcr_color_management_surface_;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_COLOR_SPACE_CREATOR_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.h b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.h
index 29af2085b5d..2556483a44b 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_CURSOR_SHAPES_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_CURSOR_SHAPES_H_
+#include "base/memory/raw_ptr.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-forward.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
@@ -43,7 +44,7 @@ class WaylandZcrCursorShapes
private:
wl::Object<zcr_cursor_shapes_v1> zcr_cursor_shapes_v1_;
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zcr_touchpad_haptics.h b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_touchpad_haptics.h
index df306190c5e..d563b3a783d 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_zcr_touchpad_haptics.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_touchpad_haptics.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_TOUCHPAD_HAPTICS_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_TOUCHPAD_HAPTICS_H_
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
namespace ui {
@@ -44,7 +45,7 @@ class WaylandZcrTouchpadHaptics
struct zcr_touchpad_haptics_v1* zcr_touchpad_haptics_v1);
wl::Object<zcr_touchpad_haptics_v1> obj_;
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.cc b/chromium/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.cc
index 6b4ec3871d1..01ef1ae7d7b 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.cc
@@ -9,6 +9,7 @@
#include "base/logging.h"
#include "ui/gfx/linux/drm_util_linux.h"
+#include "ui/ozone/platform/wayland/host/wayland_buffer_factory.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
namespace ui {
@@ -28,8 +29,8 @@ void WaylandZwpLinuxDmabuf::Instantiate(WaylandConnection* connection,
const std::string& interface,
uint32_t version) {
DCHECK_EQ(interface, kInterfaceName);
-
- if (connection->zwp_dmabuf() ||
+ auto* buffer_factory = connection->wayland_buffer_factory();
+ if (buffer_factory->wayland_zwp_dmabuf_ ||
!wl::CanBind(interface, version, kMinVersion, kMaxVersion)) {
return;
}
@@ -40,7 +41,7 @@ void WaylandZwpLinuxDmabuf::Instantiate(WaylandConnection* connection,
LOG(ERROR) << "Failed to bind zwp_linux_dmabuf_v1";
return;
}
- connection->zwp_dmabuf_ = std::make_unique<WaylandZwpLinuxDmabuf>(
+ buffer_factory->wayland_zwp_dmabuf_ = std::make_unique<WaylandZwpLinuxDmabuf>(
zwp_linux_dmabuf.release(), connection);
}
@@ -87,8 +88,7 @@ void WaylandZwpLinuxDmabuf::CreateBuffer(const base::ScopedFD& fd,
// It's possible to avoid waiting until the buffer is created and have it
// immediately. This method is only available since the protocol version 2.
- if (wl::get_version_of_object(zwp_linux_dmabuf_.get()) >=
- ZWP_LINUX_BUFFER_PARAMS_V1_CREATE_IMMED_SINCE_VERSION) {
+ if (CanCreateBufferImmed()) {
wl::Object<wl_buffer> buffer(zwp_linux_buffer_params_v1_create_immed(
params.get(), size.width(), size.height(), format, 0));
std::move(callback).Run(std::move(buffer));
@@ -105,6 +105,11 @@ void WaylandZwpLinuxDmabuf::CreateBuffer(const base::ScopedFD& fd,
connection_->ScheduleFlush();
}
+bool WaylandZwpLinuxDmabuf::CanCreateBufferImmed() const {
+ return wl::get_version_of_object(zwp_linux_dmabuf_.get()) >=
+ ZWP_LINUX_BUFFER_PARAMS_V1_CREATE_IMMED_SINCE_VERSION;
+}
+
void WaylandZwpLinuxDmabuf::AddSupportedFourCCFormatAndModifier(
uint32_t fourcc_format,
absl::optional<uint64_t> modifier) {
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.h b/chromium/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.h
index e6bc80ea803..03bdc70eb2d 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.h
@@ -8,6 +8,7 @@
#include <vector>
#include "base/files/scoped_file.h"
+#include "base/memory/raw_ptr.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include "ui/ozone/platform/wayland/common/wayland_util.h"
@@ -63,6 +64,10 @@ class WaylandZwpLinuxDmabuf
return supported_buffer_formats_with_modifiers_;
}
+ // Says if a new buffer can be created immediately. Depends on the version of
+ // the |zwp_linux_dmabuf| object.
+ bool CanCreateBufferImmed() const;
+
private:
// Receives supported |fourcc_format| from either ::Modifers or ::Format call
// (depending on the protocol version), and stores it as gfx::BufferFormat to
@@ -100,7 +105,7 @@ class WaylandZwpLinuxDmabuf
const wl::Object<zwp_linux_dmabuf_v1> zwp_linux_dmabuf_;
// Non-owned.
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
// Holds supported DRM formats translated to gfx::BufferFormat.
wl::BufferFormatsWithModifiersMap supported_buffer_formats_with_modifiers_;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zwp_pointer_constraints.h b/chromium/ui/ozone/platform/wayland/host/wayland_zwp_pointer_constraints.h
index 3ad33bbe194..756a03132c4 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_zwp_pointer_constraints.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zwp_pointer_constraints.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZWP_POINTER_CONSTRAINTS_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZWP_POINTER_CONSTRAINTS_H_
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
namespace ui {
@@ -44,7 +45,7 @@ class WaylandZwpPointerConstraints
wl::Object<zwp_pointer_constraints_v1> obj_;
wl::Object<zwp_locked_pointer_v1> locked_pointer_;
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zwp_pointer_gestures.h b/chromium/ui/ozone/platform/wayland/host/wayland_zwp_pointer_gestures.h
index de8e4e2d8f0..dbd6c75a8b2 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_zwp_pointer_gestures.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zwp_pointer_gestures.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZWP_POINTER_GESTURES_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZWP_POINTER_GESTURES_H_
+#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/events/types/event_type.h"
@@ -71,8 +72,8 @@ class WaylandZwpPointerGestures
wl::Object<zwp_pointer_gestures_v1> obj_;
wl::Object<zwp_pointer_gesture_pinch_v1> pinch_;
double current_scale_ = 1;
- WaylandConnection* const connection_;
- Delegate* const delegate_;
+ const raw_ptr<WaylandConnection> connection_;
+ const raw_ptr<Delegate> delegate_;
};
class WaylandZwpPointerGestures::Delegate {
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zwp_pointer_gestures_unittest.cc b/chromium/ui/ozone/platform/wayland/host/wayland_zwp_pointer_gestures_unittest.cc
index 318e1d77f16..cecfac489ba 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_zwp_pointer_gestures_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zwp_pointer_gestures_unittest.cc
@@ -10,6 +10,7 @@
#include "ui/events/platform/platform_event_observer.h"
#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
#include "ui/ozone/platform/wayland/host/wayland_zwp_pointer_gestures.h"
+#include "ui/ozone/platform/wayland/test/mock_pointer.h"
#include "ui/ozone/platform/wayland/test/mock_surface.h"
#include "ui/ozone/platform/wayland/test/wayland_test.h"
@@ -75,14 +76,6 @@ class WaylandPointerGesturesTest : public WaylandTest {
}
};
-// TODO(crbug.com/1298099): Reenable test when exo has been fixed and the
-// libinput behavior has been restored.
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-#define MAYBE(x) DISABLED_##x
-#else
-#define MAYBE(x) x
-#endif
-
// Tests that scale in pinch zoom events is fixed to the progression expected by
// the compositor.
//
@@ -94,15 +87,20 @@ class WaylandPointerGesturesTest : public WaylandTest {
// WaylandZwpPointerGestures methods.
//
// See https://crbug.com/1283652
-TEST_P(WaylandPointerGesturesTest, MAYBE(PinchZoomScale)) {
+TEST_P(WaylandPointerGesturesTest, PinchZoomScale) {
auto* const mock_surface = server_.GetObject<wl::MockSurface>(
window_->root_surface()->GetSurfaceId());
+ uint32_t serial = 0;
+ auto* pointer = server_.seat()->pointer();
+ wl_pointer_send_enter(pointer->resource(), ++serial, mock_surface->resource(),
+ wl_fixed_from_int(50), wl_fixed_from_int(50));
+ wl_pointer_send_frame(pointer->resource());
+
PinchEventScaleRecorder observer;
auto* pinch_resource = server_.wp_pointer_gestures().pinch()->resource();
- zwp_pointer_gesture_pinch_v1_send_begin(pinch_resource,
- /* serial */ 0,
+ zwp_pointer_gesture_pinch_v1_send_begin(pinch_resource, ++serial,
/* time */ 0,
mock_surface->resource(),
/* fingers */ 2);
@@ -111,18 +109,13 @@ TEST_P(WaylandPointerGesturesTest, MAYBE(PinchZoomScale)) {
constexpr double kScales[] = {1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.4,
1.3, 1.2, 1.1, 1.0, 0.9, 0.8, 0.7,
0.6, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0};
- auto previous_scale = kScales[0];
for (auto scale : kScales) {
zwp_pointer_gesture_pinch_v1_send_update(
pinch_resource, /* time */ 0, /* dx */ 0, /* dy */ 0,
wl_fixed_from_double(scale), /* rotation */ 0);
Sync();
- // The conversion from double to fixed and back is necessary because it
- // happens during the roundtrip, and it creates significant error.
- EXPECT_FLOAT_EQ(
- observer.latest_scale_update(),
- wl_fixed_to_double(wl_fixed_from_double(scale)) / previous_scale);
- previous_scale = wl_fixed_to_double(wl_fixed_from_double(scale));
+ EXPECT_FLOAT_EQ(observer.latest_scale_update(),
+ wl_fixed_to_double(wl_fixed_from_double(scale)));
}
}
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zwp_relative_pointer_manager.h b/chromium/ui/ozone/platform/wayland/host/wayland_zwp_relative_pointer_manager.h
index 014829a0a54..6a86996da95 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_zwp_relative_pointer_manager.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zwp_relative_pointer_manager.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZWP_RELATIVE_POINTER_MANAGER_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZWP_RELATIVE_POINTER_MANAGER_H_
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
namespace gfx {
@@ -55,8 +56,8 @@ class WaylandZwpRelativePointerManager
wl::Object<zwp_relative_pointer_manager_v1> obj_;
wl::Object<zwp_relative_pointer_v1> relative_pointer_;
- WaylandConnection* const connection_;
- Delegate* const delegate_;
+ const raw_ptr<WaylandConnection> connection_;
+ const raw_ptr<Delegate> delegate_;
};
class WaylandZwpRelativePointerManager::Delegate {
diff --git a/chromium/ui/ozone/platform/wayland/host/xdg_activation.cc b/chromium/ui/ozone/platform/wayland/host/xdg_activation.cc
new file mode 100644
index 00000000000..ad964e91cf9
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/xdg_activation.cc
@@ -0,0 +1,144 @@
+// 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/wayland/host/xdg_activation.h"
+
+#include <xdg-activation-v1-client-protocol.h>
+
+#include <memory>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/check_op.h"
+#include "base/logging.h"
+#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+#include "ui/ozone/platform/wayland/host/wayland_seat.h"
+#include "ui/ozone/platform/wayland/host/wayland_serial_tracker.h"
+#include "ui/ozone/platform/wayland/host/wayland_window.h"
+
+namespace ui {
+
+namespace {
+constexpr uint32_t kMaxVersion = 1;
+}
+
+using ActivationDoneCallback = base::OnceCallback<void(std::string token)>;
+
+// Wraps the actual activation token.
+class XdgActivation::Token {
+ public:
+ Token(wl::Object<xdg_activation_token_v1> token,
+ wl_surface* surface,
+ wl_seat* seat,
+ absl::optional<wl::Serial> serial,
+ ActivationDoneCallback callback);
+ Token(const Token&) = delete;
+ Token& operator=(const Token&) = delete;
+ ~Token();
+
+ private:
+ static void Done(void* data,
+ struct xdg_activation_token_v1* xdg_activation_token_v1,
+ const char* token);
+
+ wl::Object<xdg_activation_token_v1> token_;
+
+ ActivationDoneCallback callback_;
+};
+
+// static
+constexpr char XdgActivation::kInterfaceName[];
+
+// static
+void XdgActivation::Instantiate(WaylandConnection* connection,
+ wl_registry* registry,
+ uint32_t name,
+ const std::string& interface,
+ uint32_t version) {
+ DCHECK_EQ(interface, kInterfaceName);
+
+ if (connection->xdg_activation_)
+ return;
+
+ auto instance = wl::Bind<::xdg_activation_v1>(registry, name,
+ std::min(version, kMaxVersion));
+ if (!instance) {
+ LOG(ERROR) << "Failed to bind " << kInterfaceName;
+ return;
+ }
+ connection->xdg_activation_ =
+ std::make_unique<XdgActivation>(std::move(instance), connection);
+}
+
+XdgActivation::XdgActivation(wl::Object<xdg_activation_v1> xdg_activation_v1,
+ WaylandConnection* connection)
+ : xdg_activation_v1_(std::move(xdg_activation_v1)),
+ connection_(connection) {}
+
+XdgActivation::~XdgActivation() = default;
+
+void XdgActivation::Activate(wl_surface* surface) const {
+ const WaylandWindow* const active_window =
+ connection_->wayland_window_manager()->GetCurrentActiveWindow();
+ if (!active_window) {
+ LOG(WARNING) << "Cannot activate a window because no active windows found!";
+ return;
+ }
+
+ if (token_.get() != nullptr) {
+ // TODO(crbug.com/1175327): chain the incoming request and try to serve it
+ // after the current one is done.
+ LOG(WARNING) << "Another activation request is in progress!";
+ return;
+ }
+
+ auto* const token =
+ xdg_activation_v1_get_activation_token(xdg_activation_v1_.get());
+ if (!token) {
+ LOG(WARNING) << "Could not get an XDG activation token!";
+ return;
+ }
+
+ token_ = std::make_unique<Token>(
+ wl::Object<xdg_activation_token_v1>(token),
+ active_window->root_surface()->surface(),
+ connection_->seat()->wl_object(),
+ connection_->serial_tracker().GetSerial(
+ {wl::SerialType::kTouchPress, wl::SerialType::kMousePress,
+ wl::SerialType::kMouseEnter, wl::SerialType::kKeyPress}),
+ base::BindOnce(&XdgActivation::OnActivateDone, weak_factory_.GetWeakPtr(),
+ surface));
+}
+
+void XdgActivation::OnActivateDone(wl_surface* surface, std::string token) {
+ xdg_activation_v1_activate(xdg_activation_v1_.get(), token.c_str(), surface);
+ token_.reset();
+}
+
+XdgActivation::Token::Token(wl::Object<xdg_activation_token_v1> token,
+ wl_surface* surface,
+ wl_seat* seat,
+ absl::optional<wl::Serial> serial,
+ ActivationDoneCallback callback)
+ : token_(std::move(token)), callback_(std::move(callback)) {
+ static constexpr xdg_activation_token_v1_listener kListener = {&Done};
+ xdg_activation_token_v1_add_listener(token_.get(), &kListener, this);
+ xdg_activation_token_v1_set_surface(token_.get(), surface);
+ if (serial)
+ xdg_activation_token_v1_set_serial(token_.get(), serial->value, seat);
+ xdg_activation_token_v1_commit(token_.get());
+}
+
+XdgActivation::Token::~Token() = default;
+
+// static
+void XdgActivation::Token::Done(
+ void* data,
+ struct xdg_activation_token_v1* xdg_activation_token_v1,
+ const char* token) {
+ auto* const self = static_cast<XdgActivation::Token*>(data);
+ std::move(self->callback_).Run(token);
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/xdg_activation.h b/chromium/ui/ozone/platform/wayland/host/xdg_activation.h
new file mode 100644
index 00000000000..3256996bd2c
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/xdg_activation.h
@@ -0,0 +1,55 @@
+// 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_WAYLAND_HOST_XDG_ACTIVATION_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_XDG_ACTIVATION_H_
+
+#include "base/memory/raw_ptr.h"
+#include "base/memory/weak_ptr.h"
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
+
+namespace ui {
+
+// Implements the XDG activation Wayland protocol extension.
+class XdgActivation : public wl::GlobalObjectRegistrar<XdgActivation> {
+ public:
+ static constexpr char kInterfaceName[] = "xdg_activation_v1";
+
+ static void Instantiate(WaylandConnection* connection,
+ wl_registry* registry,
+ uint32_t name,
+ const std::string& interface,
+ uint32_t version);
+
+ XdgActivation(wl::Object<xdg_activation_v1> xdg_activation_v1,
+ WaylandConnection* connection);
+ XdgActivation(const XdgActivation&) = delete;
+ XdgActivation& operator=(const XdgActivation&) = delete;
+ ~XdgActivation();
+
+ // Requests activation of the `surface`.
+ // The actual activation happens asynchronously, after a round trip to the
+ // server.
+ // Does nothing if no other window is currently active, or if there is already
+ // an unfinished activation request.
+ void Activate(wl_surface* surface) const;
+
+ private:
+ class Token;
+
+ void OnActivateDone(wl_surface* surface, std::string token);
+
+ // Wayland object wrapped by this class.
+ wl::Object<xdg_activation_v1> xdg_activation_v1_;
+ // The actual activation token.
+ mutable std::unique_ptr<Token> token_;
+
+ const raw_ptr<WaylandConnection> connection_;
+
+ base::WeakPtrFactory<XdgActivation> weak_factory_{this};
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_XDG_ACTIVATION_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/xdg_foreign_wrapper.cc b/chromium/ui/ozone/platform/wayland/host/xdg_foreign_wrapper.cc
index 2586adf9b85..be5f2846f66 100644
--- a/chromium/ui/ozone/platform/wayland/host/xdg_foreign_wrapper.cc
+++ b/chromium/ui/ozone/platform/wayland/host/xdg_foreign_wrapper.cc
@@ -8,6 +8,7 @@
#include <xdg-foreign-unstable-v2-client-protocol.h>
#include "base/logging.h"
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
#include "ui/ozone/platform/wayland/host/wayland_window.h"
#include "ui/platform_window/platform_window_init_properties.h"
@@ -52,7 +53,7 @@ struct ExportedSurface {
~ExportedSurface() = default;
// Surface that is exported.
- wl_surface* surface_for_export = nullptr;
+ raw_ptr<wl_surface> surface_for_export = nullptr;
// Exported |surface|.
wl::Object<ExportedType> exported;
@@ -148,7 +149,7 @@ class XdgForeignWrapperImpl
exported_surface_it->callbacks.clear();
}
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
wl::Object<ExporterType> exporter_;
std::vector<ExportedSurface<ExportedType>> exported_surfaces_;
};
diff --git a/chromium/ui/ozone/platform/wayland/host/xdg_output.cc b/chromium/ui/ozone/platform/wayland/host/xdg_output.cc
index e0326739f62..f9f09074acd 100644
--- a/chromium/ui/ozone/platform/wayland/host/xdg_output.cc
+++ b/chromium/ui/ozone/platform/wayland/host/xdg_output.cc
@@ -51,11 +51,20 @@ void XDGOutput::OutputHandleDone(void* data,
// static
void XDGOutput::OutputHandleName(void* data,
struct zxdg_output_v1* zxdg_output_v1,
- const char* name) {}
+ const char* name) {
+ if (XDGOutput* xdg_output = static_cast<XDGOutput*>(data)) {
+ xdg_output->name_ = name ? std::string(name) : std::string();
+ }
+}
// static
void XDGOutput::OutputHandleDescription(void* data,
struct zxdg_output_v1* zxdg_output_v1,
- const char* description) {}
+ const char* description) {
+ if (XDGOutput* xdg_output = static_cast<XDGOutput*>(data)) {
+ xdg_output->description_ =
+ description ? std::string(description) : std::string();
+ }
+}
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/xdg_output.h b/chromium/ui/ozone/platform/wayland/host/xdg_output.h
index 441db6853d0..72a3d3eccbb 100644
--- a/chromium/ui/ozone/platform/wayland/host/xdg_output.h
+++ b/chromium/ui/ozone/platform/wayland/host/xdg_output.h
@@ -25,6 +25,8 @@ class XDGOutput {
return logical_position_;
}
gfx::Size logical_size() const { return logical_size_; }
+ const std::string& description() const { return description_; }
+ const std::string& name() const { return name_; }
private:
static void OutputHandleLogicalPosition(void* data,
@@ -47,6 +49,8 @@ class XDGOutput {
wl::Object<zxdg_output_v1> xdg_output_;
absl::optional<gfx::Point> logical_position_;
gfx::Size logical_size_;
+ std::string description_;
+ std::string name_;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.cc b/chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.cc
index dd032a8ced4..bcd64d228a4 100644
--- a/chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.cc
+++ b/chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.cc
@@ -172,6 +172,8 @@ bool XDGPopupWrapperImpl::Initialize(const ShellPopupParams& params) {
positioner.get()));
if (!xdg_popup_)
return false;
+ connection_->wayland_window_manager()->NotifyWindowRoleAssigned(
+ wayland_window_);
if (connection_->zaura_shell()) {
uint32_t version =
@@ -184,6 +186,10 @@ bool XDGPopupWrapperImpl::Initialize(const ShellPopupParams& params) {
ZAURA_POPUP_SURFACE_SUBMISSION_IN_PIXEL_COORDINATES_SINCE_VERSION) {
zaura_popup_surface_submission_in_pixel_coordinates(aura_popup_.get());
}
+ if (version >= ZAURA_POPUP_SET_MENU_SINCE_VERSION &&
+ wayland_window_->type() == PlatformWindowType::kMenu) {
+ zaura_popup_set_menu(aura_popup_.get());
+ }
}
}
@@ -238,6 +244,18 @@ void XDGPopupWrapperImpl::Grab(uint32_t serial) {
xdg_popup_grab(xdg_popup_.get(), connection_->seat()->wl_object(), serial);
}
+bool XDGPopupWrapperImpl::SupportsDecoration() {
+ if (!aura_popup_)
+ return false;
+ uint32_t version = zaura_popup_get_version(aura_popup_.get());
+ return version >= ZAURA_POPUP_SET_DECORATION_SINCE_VERSION;
+}
+
+void XDGPopupWrapperImpl::Decorate() {
+ zaura_popup_set_decoration(aura_popup_.get(),
+ ZAURA_POPUP_DECORATION_TYPE_SHADOW);
+}
+
wl::Object<xdg_positioner> XDGPopupWrapperImpl::CreatePositioner() {
wl::Object<xdg_positioner> positioner(
xdg_wm_base_create_positioner(connection_->shell()));
diff --git a/chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.h b/chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.h
index 49d4da7737e..adad069a9b4 100644
--- a/chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.h
+++ b/chromium/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/host/shell_popup_wrapper.h"
namespace ui {
@@ -27,13 +28,15 @@ class XDGPopupWrapperImpl : public ShellPopupWrapper {
~XDGPopupWrapperImpl() override;
- // XDGPopupWrapper:
+ // ShellPopupWrapper overrides:
bool Initialize(const ShellPopupParams& params) override;
void AckConfigure(uint32_t serial) override;
bool IsConfigured() override;
bool SetBounds(const gfx::Rect& new_bounds) override;
void SetWindowGeometry(const gfx::Rect& bounds) override;
void Grab(uint32_t serial) override;
+ bool SupportsDecoration() override;
+ void Decorate() override;
private:
wl::Object<xdg_positioner> CreatePositioner();
@@ -53,8 +56,8 @@ class XDGPopupWrapperImpl : public ShellPopupWrapper {
XDGSurfaceWrapperImpl* xdg_surface_wrapper() const;
// Non-owned WaylandWindow that uses this popup.
- WaylandWindow* const wayland_window_;
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandWindow> wayland_window_;
+ const raw_ptr<WaylandConnection> connection_;
// Ground surface for this popup.
std::unique_ptr<XDGSurfaceWrapperImpl> xdg_surface_wrapper_;
diff --git a/chromium/ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.cc b/chromium/ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.cc
index 32c9079069f..2d175c926ab 100644
--- a/chromium/ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.cc
+++ b/chromium/ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.cc
@@ -74,10 +74,10 @@ void XDGSurfaceWrapperImpl::Configure(void* data,
// toplevel window, and deleting this object.
auto weak_window = surface->wayland_window_->AsWeakPtr();
weak_window->HandleSurfaceConfigure(serial);
-
+
if (!weak_window)
return;
-
+
weak_window->OnSurfaceConfigureEvent();
}
diff --git a/chromium/ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.h b/chromium/ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.h
index a44a5d82d0e..c73848afc5b 100644
--- a/chromium/ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.h
+++ b/chromium/ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_XDG_SURFACE_WRAPPER_IMPL_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_XDG_SURFACE_WRAPPER_IMPL_H_
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/host/shell_surface_wrapper.h"
#include <cstdint>
@@ -44,8 +45,8 @@ class XDGSurfaceWrapperImpl : public ShellSurfaceWrapper {
uint32_t serial);
// Non-owing WaylandWindow that uses this surface wrapper.
- WaylandWindow* const wayland_window_;
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandWindow> wayland_window_;
+ const raw_ptr<WaylandConnection> connection_;
bool is_configured_ = false;
diff --git a/chromium/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.cc b/chromium/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.cc
index 9935ab94cd7..9e06965fd2d 100644
--- a/chromium/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.cc
+++ b/chromium/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.cc
@@ -62,6 +62,23 @@ absl::optional<wl::Serial> GetSerialForMoveResize(
wl::SerialType::kKeyPress});
}
+zaura_toplevel_z_order_level ToZauraToplevelZOrderLevel(
+ ZOrderLevel z_order_level) {
+ switch (z_order_level) {
+ case ZOrderLevel::kNormal:
+ return ZAURA_TOPLEVEL_Z_ORDER_LEVEL_NORMAL;
+ case ZOrderLevel::kFloatingWindow:
+ return ZAURA_TOPLEVEL_Z_ORDER_LEVEL_FLOATING_WINDOW;
+ case ZOrderLevel::kFloatingUIElement:
+ return ZAURA_TOPLEVEL_Z_ORDER_LEVEL_FLOATING_UI_ELEMENT;
+ case ZOrderLevel::kSecuritySurface:
+ return ZAURA_TOPLEVEL_Z_ORDER_LEVEL_SECURITY_SURFACE;
+ }
+
+ NOTREACHED();
+ return ZAURA_TOPLEVEL_Z_ORDER_LEVEL_NORMAL;
+}
+
} // namespace
XDGToplevelWrapperImpl::XDGToplevelWrapperImpl(
@@ -84,6 +101,10 @@ bool XDGToplevelWrapperImpl::Initialize() {
static constexpr xdg_toplevel_listener xdg_toplevel_listener = {
&ConfigureTopLevel,
&CloseTopLevel,
+ // Since v4
+ &ConfigureBounds,
+ // Since v5
+ &WmCapabilities,
};
if (!xdg_surface_wrapper_)
@@ -95,6 +116,8 @@ bool XDGToplevelWrapperImpl::Initialize() {
LOG(ERROR) << "Failed to create xdg_toplevel";
return false;
}
+ connection_->wayland_window_manager()->NotifyWindowRoleAssigned(
+ wayland_window_);
if (connection_->zaura_shell()) {
uint32_t version =
@@ -278,6 +301,21 @@ void XDGToplevelWrapperImpl::CloseTopLevel(void* data,
surface->wayland_window_->OnCloseRequest();
}
+// static
+void XDGToplevelWrapperImpl::ConfigureBounds(void* data,
+ struct xdg_toplevel* xdg_toplevel,
+ int32_t width,
+ int32_t height) {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
+// static
+void XDGToplevelWrapperImpl::WmCapabilities(void* data,
+ struct xdg_toplevel* xdg_toplevel,
+ struct wl_array* capabilities) {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
void XDGToplevelWrapperImpl::SetTopLevelDecorationMode(
DecorationMode requested_mode) {
if (!zxdg_toplevel_decoration_ || requested_mode == decoration_mode_)
@@ -369,9 +407,12 @@ void XDGToplevelWrapperImpl::RequestWindowBounds(const gfx::Rect& bounds) {
// `output` can be null in unit tests where it doesn't wait for output events.
if (!output)
return;
- zaura_toplevel_set_window_bounds(aura_toplevel_.get(), bounds.x(), bounds.y(),
- bounds.width(), bounds.height(),
- output->get_output());
+ if (aura_toplevel_ && zaura_toplevel_get_version(aura_toplevel_.get()) >=
+ ZAURA_TOPLEVEL_SET_WINDOW_BOUNDS_SINCE_VERSION) {
+ zaura_toplevel_set_window_bounds(aura_toplevel_.get(), bounds.x(),
+ bounds.y(), bounds.width(),
+ bounds.height(), output->get_output());
+ }
}
void XDGToplevelWrapperImpl::SetSystemModal(bool modal) {
@@ -410,6 +451,14 @@ void XDGToplevelWrapperImpl::EnableScreenCoordinates() {
this);
}
+void XDGToplevelWrapperImpl::SetZOrder(ZOrderLevel z_order) {
+ if (aura_toplevel_ && zaura_toplevel_get_version(aura_toplevel_.get()) >=
+ ZAURA_TOPLEVEL_SET_Z_ORDER_SINCE_VERSION) {
+ zaura_toplevel_set_z_order(aura_toplevel_.get(),
+ ToZauraToplevelZOrderLevel(z_order));
+ }
+}
+
void XDGToplevelWrapperImpl::SetRestoreInfo(int32_t restore_session_id,
int32_t restore_window_id) {
if (aura_toplevel_ && zaura_toplevel_get_version(aura_toplevel_.get()) >=
@@ -431,4 +480,18 @@ void XDGToplevelWrapperImpl::SetRestoreInfoWithWindowIdSource(
}
}
+void XDGToplevelWrapperImpl::SetFloat() {
+ if (aura_toplevel_ && zaura_toplevel_get_version(aura_toplevel_.get()) >=
+ ZAURA_TOPLEVEL_SET_FLOAT_SINCE_VERSION) {
+ zaura_toplevel_set_float(aura_toplevel_.get());
+ }
+}
+
+void XDGToplevelWrapperImpl::UnSetFloat() {
+ if (aura_toplevel_ && zaura_toplevel_get_version(aura_toplevel_.get()) >=
+ ZAURA_TOPLEVEL_UNSET_FLOAT_SINCE_VERSION) {
+ zaura_toplevel_unset_float(aura_toplevel_.get());
+ }
+}
+
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.h b/chromium/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.h
index c8d7830b9b4..7e3116b4b48 100644
--- a/chromium/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.h
+++ b/chromium/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/host/shell_toplevel_wrapper.h"
namespace ui {
@@ -50,6 +51,9 @@ class XDGToplevelWrapperImpl : public ShellToplevelWrapper {
void SetSystemModal(bool modal) override;
bool SupportsScreenCoordinates() const override;
void EnableScreenCoordinates() override;
+ void SetFloat() override;
+ void UnSetFloat() override;
+ void SetZOrder(ZOrderLevel z_order) override;
XDGSurfaceWrapperImpl* xdg_surface_wrapper() const;
@@ -61,6 +65,13 @@ class XDGToplevelWrapperImpl : public ShellToplevelWrapper {
int32_t height,
struct wl_array* states);
static void CloseTopLevel(void* data, struct xdg_toplevel* xdg_toplevel);
+ static void ConfigureBounds(void* data,
+ struct xdg_toplevel* xdg_toplevel,
+ int32_t width,
+ int32_t height);
+ static void WmCapabilities(void* data,
+ struct xdg_toplevel* xdg_toplevel,
+ struct wl_array* capabilities);
// zxdg_decoration_listener
static void ConfigureDecoration(
@@ -92,8 +103,8 @@ class XDGToplevelWrapperImpl : public ShellToplevelWrapper {
std::unique_ptr<XDGSurfaceWrapperImpl> xdg_surface_wrapper_;
// Non-owing WaylandWindow that uses this toplevel wrapper.
- WaylandWindow* const wayland_window_;
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandWindow> wayland_window_;
+ const raw_ptr<WaylandConnection> connection_;
// XDG Shell Stable object.
wl::Object<xdg_toplevel> xdg_toplevel_;
diff --git a/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.h b/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.h
index 053105ad509..019869a2624 100644
--- a/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.h
+++ b/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
@@ -46,7 +47,7 @@ class ZwpPrimarySelectionDeviceManager
private:
wl::Object<zwp_primary_selection_device_manager_v1> device_manager_;
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
std::unique_ptr<ZwpPrimarySelectionDevice> device_;
};
diff --git a/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper.h b/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper.h
index 0d245fe5994..f8852306ec0 100644
--- a/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper.h
+++ b/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper.h
@@ -11,6 +11,7 @@
#include <vector>
#include "base/strings/string_piece.h"
+#include "ui/base/ime/grammar_fragment.h"
#include "ui/base/ime/text_input_mode.h"
#include "ui/base/ime/text_input_type.h"
@@ -47,6 +48,11 @@ class ZWPTextInputWrapperClient {
// result of some composing (pre-edit).
virtual void OnCommitString(base::StringPiece text) = 0;
+ // Called when the cursor position or selection should be modified. The new
+ // cursor position is applied on the next OnCommitString. |index| and |anchor|
+ // are measured in UTF-8 bytes.
+ virtual void OnCursorPosition(int32_t index, int32_t anchor) = 0;
+
// Called when client needs to delete all or part of the text surrounding
// the cursor. |index| and |length| are expected to be a byte offset of |text|
// passed via ZWPTextInputWrapper::SetSurroundingText.
@@ -68,6 +74,23 @@ class ZWPTextInputWrapperClient {
uint32_t length,
const std::vector<SpanStyle>& spans) = 0;
+ // Called when client needs to clear all grammar fragments in |range|. All
+ // indices are measured in UTF-8 bytes.
+ virtual void OnClearGrammarFragments(const gfx::Range& range) = 0;
+
+ // Called when client requests to add a new grammar marker. All indices are
+ // measured in UTF-8 bytes.
+ virtual void OnAddGrammarFragment(const ui::GrammarFragment& fragment) = 0;
+
+ // Sets the autocorrect range in the text input client.
+ // |range| is in UTF-16 code range.
+ virtual void OnSetAutocorrectRange(const gfx::Range& range) = 0;
+
+ // Called when the virtual keyboard's occluded bounds is updated.
+ // The bounds are in screen DIP.
+ virtual void OnSetVirtualKeyboardOccludedBounds(
+ const gfx::Rect& screen_bounds) = 0;
+
// Called when the visibility state of the input panel changed.
// There's no detailed spec of |state|, and no actual implementor except
// components/exo is found in the world at this moment.
@@ -107,6 +130,11 @@ class ZWPTextInputWrapper {
ui::TextInputMode mode,
uint32_t flags,
bool should_do_learning) = 0;
+
+ virtual void SetGrammarFragmentAtCursor(
+ const ui::GrammarFragment& fragment) = 0;
+ virtual void SetAutocorrectInfo(const gfx::Range& autocorrect_range,
+ const gfx::Rect& autocorrect_bounds) = 0;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.cc b/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.cc
index da1971cc1b1..97eda7d684a 100644
--- a/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.cc
+++ b/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.cc
@@ -121,7 +121,11 @@ ZWPTextInputWrapperV1::ZWPTextInputWrapperV1(
static constexpr zcr_extended_text_input_v1_listener
extended_text_input_listener = {
- &OnSetPreeditRegion, // extended_text_input_set_preedit_region,
+ &OnSetPreeditRegion, // extended_text_input_set_preedit_region,
+ &OnClearGrammarFragments, // extended_text_input_clear_grammar_fragments,
+ &OnAddGrammarFragment, // extended_text_input_add_grammar_fragment,
+ &OnSetAutocorrectRange, // extended_text_input_set_autocorrect_range,
+ &OnSetVirtualKeyboardOccludedBounds, // extended_text_input_set_virtual_keyboard_occluded_bounds,
};
auto* text_input =
@@ -208,6 +212,30 @@ void ZWPTextInputWrapperV1::SetContentType(ui::TextInputType type,
zwp_text_input_v1_set_content_type(obj_.get(), content_hint, content_purpose);
}
+void ZWPTextInputWrapperV1::SetGrammarFragmentAtCursor(
+ const ui::GrammarFragment& fragment) {
+ if (extended_obj_.get() &&
+ wl::get_version_of_object(extended_obj_.get()) >=
+ ZCR_EXTENDED_TEXT_INPUT_V1_SET_GRAMMAR_FRAGMENT_AT_CURSOR_SINCE_VERSION) {
+ zcr_extended_text_input_v1_set_grammar_fragment_at_cursor(
+ extended_obj_.get(), fragment.range.start(), fragment.range.end(),
+ fragment.suggestion.c_str());
+ }
+}
+
+void ZWPTextInputWrapperV1::SetAutocorrectInfo(
+ const gfx::Range& autocorrect_range,
+ const gfx::Rect& autocorrect_bounds) {
+ if (extended_obj_.get() &&
+ wl::get_version_of_object(extended_obj_.get()) >=
+ ZCR_EXTENDED_TEXT_INPUT_V1_SET_AUTOCORRECT_INFO_SINCE_VERSION) {
+ zcr_extended_text_input_v1_set_autocorrect_info(
+ extended_obj_.get(), autocorrect_range.start(), autocorrect_range.end(),
+ autocorrect_bounds.x(), autocorrect_bounds.y(),
+ autocorrect_bounds.width(), autocorrect_bounds.height());
+ }
+}
+
void ZWPTextInputWrapperV1::ResetInputEventState() {
spans_.clear();
preedit_cursor_ = -1;
@@ -294,7 +322,8 @@ void ZWPTextInputWrapperV1::OnCursorPosition(
struct zwp_text_input_v1* text_input,
int32_t index,
int32_t anchor) {
- NOTIMPLEMENTED_LOG_ONCE();
+ auto* self = static_cast<ZWPTextInputWrapperV1*>(data);
+ self->client_->OnCursorPosition(index, anchor);
}
// static
@@ -348,4 +377,49 @@ void ZWPTextInputWrapperV1::OnSetPreeditRegion(
self->client_->OnSetPreeditRegion(index, length, spans);
}
+// static
+void ZWPTextInputWrapperV1::OnClearGrammarFragments(
+ void* data,
+ struct zcr_extended_text_input_v1* extended_text_input,
+ uint32_t start,
+ uint32_t end) {
+ auto* self = static_cast<ZWPTextInputWrapperV1*>(data);
+ self->client_->OnClearGrammarFragments(gfx::Range(start, end));
+}
+
+// static
+void ZWPTextInputWrapperV1::OnAddGrammarFragment(
+ void* data,
+ struct zcr_extended_text_input_v1* extended_text_input,
+ uint32_t start,
+ uint32_t end,
+ const char* suggestion) {
+ auto* self = static_cast<ZWPTextInputWrapperV1*>(data);
+ self->client_->OnAddGrammarFragment(
+ ui::GrammarFragment(gfx::Range(start, end), suggestion));
+}
+
+// static
+void ZWPTextInputWrapperV1::OnSetAutocorrectRange(
+ void* data,
+ struct zcr_extended_text_input_v1* extended_text_input,
+ uint32_t start,
+ uint32_t end) {
+ auto* self = static_cast<ZWPTextInputWrapperV1*>(data);
+ self->client_->OnSetAutocorrectRange(gfx::Range(start, end));
+}
+
+// static
+void ZWPTextInputWrapperV1::OnSetVirtualKeyboardOccludedBounds(
+ void* data,
+ struct zcr_extended_text_input_v1* extended_text_input,
+ int32_t x,
+ int32_t y,
+ int32_t width,
+ int32_t height) {
+ auto* self = static_cast<ZWPTextInputWrapperV1*>(data);
+ gfx::Rect screen_bounds(x, y, width, height);
+ self->client_->OnSetVirtualKeyboardOccludedBounds(screen_bounds);
+}
+
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.h b/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.h
index 7daa3f90b72..fd17d52d2f2 100644
--- a/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.h
+++ b/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.h
@@ -12,6 +12,7 @@
#include <text-input-extension-unstable-v1-client-protocol.h>
#include <text-input-unstable-v1-client-protocol.h>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include "ui/ozone/platform/wayland/host/zwp_text_input_wrapper.h"
@@ -50,6 +51,9 @@ class ZWPTextInputWrapperV1 : public ZWPTextInputWrapper {
TextInputMode mode,
uint32_t flags,
bool should_do_learning) override;
+ void SetGrammarFragmentAtCursor(const ui::GrammarFragment& fragment) override;
+ void SetAutocorrectInfo(const gfx::Range& autocorrect_range,
+ const gfx::Rect& autocorrect_bounds) override;
private:
void ResetInputEventState();
@@ -112,11 +116,34 @@ class ZWPTextInputWrapperV1 : public ZWPTextInputWrapper {
struct zcr_extended_text_input_v1* extended_text_input,
int32_t index,
uint32_t length);
+ static void OnClearGrammarFragments(
+ void* data,
+ struct zcr_extended_text_input_v1* extended_text_input,
+ uint32_t start,
+ uint32_t end);
+ static void OnAddGrammarFragment(
+ void* data,
+ struct zcr_extended_text_input_v1* extended_text_input,
+ uint32_t start,
+ uint32_t end,
+ const char* suggestion);
+ static void OnSetAutocorrectRange(
+ void* data,
+ struct zcr_extended_text_input_v1* extended_text_input,
+ uint32_t start,
+ uint32_t end);
+ static void OnSetVirtualKeyboardOccludedBounds(
+ void* data,
+ struct zcr_extended_text_input_v1* extended_text_input,
+ int32_t x,
+ int32_t y,
+ int32_t width,
+ int32_t height);
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
wl::Object<zwp_text_input_v1> obj_;
wl::Object<zcr_extended_text_input_v1> extended_obj_;
- ZWPTextInputWrapperClient* const client_;
+ const raw_ptr<ZWPTextInputWrapperClient> client_;
std::vector<ZWPTextInputWrapperClient::SpanStyle> spans_;
int32_t preedit_cursor_ = -1;
diff --git a/chromium/ui/ozone/platform/wayland/host/zxdg_popup_v6_wrapper_impl.cc b/chromium/ui/ozone/platform/wayland/host/zxdg_popup_v6_wrapper_impl.cc
index f9b7719e1ad..ff62ad8fb24 100644
--- a/chromium/ui/ozone/platform/wayland/host/zxdg_popup_v6_wrapper_impl.cc
+++ b/chromium/ui/ozone/platform/wayland/host/zxdg_popup_v6_wrapper_impl.cc
@@ -168,6 +168,8 @@ bool ZXDGPopupV6WrapperImpl::Initialize(const ShellPopupParams& params) {
parent_xdg_surface->zxdg_surface(), positioner.get()));
if (!zxdg_popup_v6_)
return false;
+ connection_->wayland_window_manager()->NotifyWindowRoleAssigned(
+ wayland_window_);
GrabIfPossible(connection_, wayland_window_->parent_window());
@@ -207,6 +209,15 @@ void ZXDGPopupV6WrapperImpl::Grab(uint32_t serial) {
serial);
}
+bool ZXDGPopupV6WrapperImpl::SupportsDecoration() {
+ // zxdg_popup_v6 doesn't support frame configuration.
+ return false;
+}
+
+void ZXDGPopupV6WrapperImpl::Decorate() {
+ NOTREACHED();
+}
+
wl::Object<zxdg_positioner_v6> ZXDGPopupV6WrapperImpl::CreatePositioner() {
wl::Object<zxdg_positioner_v6> positioner(
zxdg_shell_v6_create_positioner(connection_->shell_v6()));
diff --git a/chromium/ui/ozone/platform/wayland/host/zxdg_popup_v6_wrapper_impl.h b/chromium/ui/ozone/platform/wayland/host/zxdg_popup_v6_wrapper_impl.h
index c1ba2bab46d..2b91335f452 100644
--- a/chromium/ui/ozone/platform/wayland/host/zxdg_popup_v6_wrapper_impl.h
+++ b/chromium/ui/ozone/platform/wayland/host/zxdg_popup_v6_wrapper_impl.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/host/shell_popup_wrapper.h"
namespace ui {
@@ -34,6 +35,8 @@ class ZXDGPopupV6WrapperImpl : public ShellPopupWrapper {
bool SetBounds(const gfx::Rect& new_bounds) override;
void SetWindowGeometry(const gfx::Rect& bounds) override;
void Grab(uint32_t serial) override;
+ bool SupportsDecoration() override;
+ void Decorate() override;
private:
wl::Object<zxdg_positioner_v6> CreatePositioner();
@@ -50,9 +53,9 @@ class ZXDGPopupV6WrapperImpl : public ShellPopupWrapper {
ZXDGSurfaceV6WrapperImpl* zxdg_surface_v6_wrapper() const;
// Non-owned WaylandWindow that uses this popup.
- WaylandWindow* const wayland_window_;
+ const raw_ptr<WaylandWindow> wayland_window_;
// Non-owned WaylandConnection.
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
// Ground surface for this popup.
std::unique_ptr<ZXDGSurfaceV6WrapperImpl> zxdg_surface_v6_wrapper_;
diff --git a/chromium/ui/ozone/platform/wayland/host/zxdg_surface_v6_wrapper_impl.cc b/chromium/ui/ozone/platform/wayland/host/zxdg_surface_v6_wrapper_impl.cc
index 33786ef73f7..b02b46a9f7f 100644
--- a/chromium/ui/ozone/platform/wayland/host/zxdg_surface_v6_wrapper_impl.cc
+++ b/chromium/ui/ozone/platform/wayland/host/zxdg_surface_v6_wrapper_impl.cc
@@ -74,8 +74,15 @@ void ZXDGSurfaceV6WrapperImpl::Configure(
auto* surface = static_cast<ZXDGSurfaceV6WrapperImpl*>(data);
DCHECK(surface);
- surface->wayland_window_->HandleSurfaceConfigure(serial);
- surface->wayland_window_->OnSurfaceConfigureEvent();
+ // Calls to HandleSurfaceConfigure() might end up hiding the enclosing
+ // toplevel window, and deleting this object.
+ auto weak_window = surface->wayland_window_->AsWeakPtr();
+ weak_window->HandleSurfaceConfigure(serial);
+
+ if (!weak_window)
+ return;
+
+ weak_window->OnSurfaceConfigureEvent();
}
zxdg_surface_v6* ZXDGSurfaceV6WrapperImpl::zxdg_surface() const {
diff --git a/chromium/ui/ozone/platform/wayland/host/zxdg_surface_v6_wrapper_impl.h b/chromium/ui/ozone/platform/wayland/host/zxdg_surface_v6_wrapper_impl.h
index 2794969b6ad..e5aa3da587e 100644
--- a/chromium/ui/ozone/platform/wayland/host/zxdg_surface_v6_wrapper_impl.h
+++ b/chromium/ui/ozone/platform/wayland/host/zxdg_surface_v6_wrapper_impl.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_ZXDG_SURFACE_V6_WRAPPER_IMPL_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_ZXDG_SURFACE_V6_WRAPPER_IMPL_H_
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/host/shell_surface_wrapper.h"
#include <cstdint>
@@ -44,8 +45,8 @@ class ZXDGSurfaceV6WrapperImpl : public ShellSurfaceWrapper {
private:
// Non-owing WaylandWindow that uses this surface wrapper.
- WaylandWindow* const wayland_window_;
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandWindow> wayland_window_;
+ const raw_ptr<WaylandConnection> connection_;
bool is_configured_ = false;
diff --git a/chromium/ui/ozone/platform/wayland/host/zxdg_toplevel_v6_wrapper_impl.cc b/chromium/ui/ozone/platform/wayland/host/zxdg_toplevel_v6_wrapper_impl.cc
index 4ddb3a61341..b48a5e67cb1 100644
--- a/chromium/ui/ozone/platform/wayland/host/zxdg_toplevel_v6_wrapper_impl.cc
+++ b/chromium/ui/ozone/platform/wayland/host/zxdg_toplevel_v6_wrapper_impl.cc
@@ -63,6 +63,8 @@ bool ZXDGToplevelV6WrapperImpl::Initialize() {
LOG(ERROR) << "Failed to create zxdg_toplevel";
return false;
}
+ connection_->wayland_window_manager()->NotifyWindowRoleAssigned(
+ wayland_window_);
zxdg_toplevel_v6_add_listener(zxdg_toplevel_v6_.get(),
&zxdg_toplevel_v6_listener, this);
@@ -213,4 +215,10 @@ bool ZXDGToplevelV6WrapperImpl::SupportsScreenCoordinates() const {
void ZXDGToplevelV6WrapperImpl::EnableScreenCoordinates() {}
+void ZXDGToplevelV6WrapperImpl::SetFloat() {}
+
+void ZXDGToplevelV6WrapperImpl::UnSetFloat() {}
+
+void ZXDGToplevelV6WrapperImpl::SetZOrder(ZOrderLevel z_order) {}
+
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/zxdg_toplevel_v6_wrapper_impl.h b/chromium/ui/ozone/platform/wayland/host/zxdg_toplevel_v6_wrapper_impl.h
index 140c677889d..2d66a7992f4 100644
--- a/chromium/ui/ozone/platform/wayland/host/zxdg_toplevel_v6_wrapper_impl.h
+++ b/chromium/ui/ozone/platform/wayland/host/zxdg_toplevel_v6_wrapper_impl.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/host/shell_toplevel_wrapper.h"
namespace ui {
@@ -54,6 +55,9 @@ class ZXDGToplevelV6WrapperImpl : public ShellToplevelWrapper {
void SetSystemModal(bool modal) override;
bool SupportsScreenCoordinates() const override;
void EnableScreenCoordinates() override;
+ void SetFloat() override;
+ void UnSetFloat() override;
+ void SetZOrder(ZOrderLevel z_order) override;
ZXDGSurfaceV6WrapperImpl* zxdg_surface_v6_wrapper() const;
@@ -71,8 +75,8 @@ class ZXDGToplevelV6WrapperImpl : public ShellToplevelWrapper {
std::unique_ptr<ZXDGSurfaceV6WrapperImpl> zxdg_surface_v6_wrapper_;
// Non-owing WaylandWindow that uses this toplevel wrapper.
- WaylandWindow* const wayland_window_;
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandWindow> wayland_window_;
+ const raw_ptr<WaylandConnection> connection_;
// XDG Shell V6 object.
wl::Object<zxdg_toplevel_v6> zxdg_toplevel_v6_;
diff --git a/chromium/ui/ozone/platform/wayland/mojom/DEPS b/chromium/ui/ozone/platform/wayland/mojom/DEPS
index ad262d08a11..78b4871c7f4 100644
--- a/chromium/ui/ozone/platform/wayland/mojom/DEPS
+++ b/chromium/ui/ozone/platform/wayland/mojom/DEPS
@@ -1,6 +1,6 @@
specific_include_rules = {
"wayland_overlay_config_mojom_traits.*" : [
"+components/crash/core/common/crash_key.h",
- "+skia/public/mojom/skcolor_mojom_traits.h",
+ "+skia/public/mojom/skcolor4f_mojom_traits.h",
],
}
diff --git a/chromium/ui/ozone/platform/wayland/mojom/wayland_buffer_manager.mojom b/chromium/ui/ozone/platform/wayland/mojom/wayland_buffer_manager.mojom
index 52cbbec45ae..39fd913ac48 100644
--- a/chromium/ui/ozone/platform/wayland/mojom/wayland_buffer_manager.mojom
+++ b/chromium/ui/ozone/platform/wayland/mojom/wayland_buffer_manager.mojom
@@ -5,7 +5,7 @@
module ui.ozone.mojom;
import "mojo/public/mojom/base/file_path.mojom";
-import "skia/public/mojom/skcolor.mojom";
+import "skia/public/mojom/skcolor4f.mojom";
import "ui/gfx/geometry/mojom/geometry.mojom";
import "ui/gfx/mojom/accelerated_widget.mojom";
import "ui/gfx/mojom/buffer_types.mojom";
@@ -68,7 +68,7 @@ interface WaylandBufferManagerHost {
// used to identify imported wl_buffers on the browser process side and map
// them with the buffer objects on the gpu process side.
CreateSolidColorBuffer(gfx.mojom.Size size,
- skia.mojom.SkColor color,
+ skia.mojom.SkColor4f color,
uint32 buffer_id);
// These two methods are independent from the type of rendering.
diff --git a/chromium/ui/ozone/platform/wayland/mojom/wayland_overlay_config.mojom b/chromium/ui/ozone/platform/wayland/mojom/wayland_overlay_config.mojom
index c3fb2a10400..8edc8071978 100644
--- a/chromium/ui/ozone/platform/wayland/mojom/wayland_overlay_config.mojom
+++ b/chromium/ui/ozone/platform/wayland/mojom/wayland_overlay_config.mojom
@@ -5,11 +5,12 @@
module wl.mojom;
import "ui/gfx/geometry/mojom/geometry.mojom";
+import "ui/gfx/mojom/color_space.mojom";
import "ui/gfx/mojom/gpu_fence_handle.mojom";
import "ui/gfx/mojom/overlay_transform.mojom";
import "ui/gfx/mojom/overlay_priority_hint.mojom";
import "ui/gfx/mojom/rrect_f.mojom";
-import "skia/public/mojom/skcolor.mojom";
+import "skia/public/mojom/skcolor4f.mojom";
// This is not a mirror of ui::OverlayPlane, it only contains things that are
// useful to ozone/wayland.
@@ -18,6 +19,9 @@ struct WaylandOverlayConfig {
// plane.
int32 z_order;
+ // Specifies the color space data of the wayland config.
+ gfx.mojom.ColorSpace color_space;
+
// Specifies how the buffer is to be transformed during composition.
gfx.mojom.OverlayTransform transform;
@@ -64,5 +68,5 @@ struct WaylandOverlayConfig {
gfx.mojom.RRectF rounded_clip_bounds;
// Optional: background color of this overlay plane.
- skia.mojom.SkColor? background_color;
+ skia.mojom.SkColor4f? background_color;
};
diff --git a/chromium/ui/ozone/platform/wayland/mojom/wayland_overlay_config_mojom_traits.cc b/chromium/ui/ozone/platform/wayland/mojom/wayland_overlay_config_mojom_traits.cc
index 2a8f04e167d..63694c27757 100644
--- a/chromium/ui/ozone/platform/wayland/mojom/wayland_overlay_config_mojom_traits.cc
+++ b/chromium/ui/ozone/platform/wayland/mojom/wayland_overlay_config_mojom_traits.cc
@@ -24,6 +24,9 @@ bool StructTraits<wl::mojom::WaylandOverlayConfigDataView,
wl::WaylandOverlayConfig* out) {
out->z_order = data.z_order();
+ if (!data.ReadColorSpace(&out->color_space))
+ return false;
+
if (!data.ReadTransform(&out->transform))
return false;
diff --git a/chromium/ui/ozone/platform/wayland/mojom/wayland_overlay_config_mojom_traits.h b/chromium/ui/ozone/platform/wayland/mojom/wayland_overlay_config_mojom_traits.h
index 933edd9bb59..a0aaf07a1cf 100644
--- a/chromium/ui/ozone/platform/wayland/mojom/wayland_overlay_config_mojom_traits.h
+++ b/chromium/ui/ozone/platform/wayland/mojom/wayland_overlay_config_mojom_traits.h
@@ -5,7 +5,8 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_MOJOM_WAYLAND_OVERLAY_CONFIG_MOJOM_TRAITS_H_
#define UI_OZONE_PLATFORM_WAYLAND_MOJOM_WAYLAND_OVERLAY_CONFIG_MOJOM_TRAITS_H_
-#include "skia/public/mojom/skcolor_mojom_traits.h"
+#include "skia/public/mojom/skcolor4f_mojom_traits.h"
+#include "ui/gfx/mojom/color_space_mojom_traits.h"
#include "ui/gfx/mojom/gpu_fence_handle_mojom_traits.h"
#include "ui/gfx/mojom/overlay_priority_hint_mojom_traits.h"
#include "ui/gfx/mojom/overlay_transform_mojom_traits.h"
@@ -22,6 +23,11 @@ struct StructTraits<wl::mojom::WaylandOverlayConfigDataView,
return input.z_order;
}
+ static const gfx::ColorSpace color_space(
+ const wl::WaylandOverlayConfig& input) {
+ return input.color_space;
+ }
+
static const gfx::OverlayTransform& transform(
const wl::WaylandOverlayConfig& input) {
return input.transform;
@@ -70,7 +76,7 @@ struct StructTraits<wl::mojom::WaylandOverlayConfigDataView,
return input.rounded_clip_bounds;
}
- static const absl::optional<SkColor>& background_color(
+ static const absl::optional<SkColor4f>& background_color(
const wl::WaylandOverlayConfig& input) {
return input.background_color;
}
diff --git a/chromium/ui/ozone/platform/wayland/ozone_platform_wayland.cc b/chromium/ui/ozone/platform/wayland/ozone_platform_wayland.cc
index 8d82c2df694..ff630dc28cc 100644
--- a/chromium/ui/ozone/platform/wayland/ozone_platform_wayland.cc
+++ b/chromium/ui/ozone/platform/wayland/ozone_platform_wayland.cc
@@ -20,6 +20,7 @@
#include "ui/base/cursor/cursor_factory.h"
#include "ui/base/dragdrop/os_exchange_data_provider_factory_ozone.h"
#include "ui/base/ime/linux/input_method_auralinux.h"
+#include "ui/base/ime/linux/linux_input_method_context_factory.h"
#include "ui/base/ui_base_features.h"
#include "ui/display/display_switches.h"
#include "ui/events/devices/device_data_manager.h"
@@ -38,9 +39,10 @@
#include "ui/ozone/platform/wayland/host/wayland_buffer_manager_connector.h"
#include "ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
#include "ui/ozone/platform/wayland/host/wayland_exchange_data_provider.h"
#include "ui/ozone/platform/wayland/host/wayland_input_controller.h"
-#include "ui/ozone/platform/wayland/host/wayland_input_method_context_factory.h"
+#include "ui/ozone/platform/wayland/host/wayland_input_method_context.h"
#include "ui/ozone/platform/wayland/host/wayland_menu_utils.h"
#include "ui/ozone/platform/wayland/host/wayland_output_manager.h"
#include "ui/ozone/platform/wayland/host/wayland_window.h"
@@ -100,6 +102,7 @@ class OzonePlatformWayland : public OzonePlatform,
~OzonePlatformWayland() override {
KeyEvent::SetSynthesizeKeyRepeatEnabled(old_synthesize_key_repeat_enabled_);
+ GetInputMethodContextFactoryForOzone() = LinuxInputMethodContextFactory();
}
// OzonePlatform
@@ -165,19 +168,9 @@ class OzonePlatformWayland : public OzonePlatform,
}
std::unique_ptr<InputMethod> CreateInputMethod(
- internal::InputMethodDelegate* delegate,
+ ImeKeyEventDispatcher* ime_key_event_dispatcher,
gfx::AcceleratedWidget widget) override {
- // Instantiate and set LinuxInputMethodContextFactory unless it is already
- // set (e.g: tests may have already set it).
- if (!LinuxInputMethodContextFactory::instance() &&
- !input_method_context_factory_) {
- input_method_context_factory_ =
- std::make_unique<WaylandInputMethodContextFactory>(connection_.get());
- LinuxInputMethodContextFactory::SetInstance(
- input_method_context_factory_.get());
- }
-
- return std::make_unique<InputMethodAuraLinux>(delegate);
+ return std::make_unique<InputMethodAuraLinux>(ime_key_event_dispatcher);
}
PlatformMenuUtils* GetPlatformMenuUtils() override {
@@ -248,6 +241,17 @@ class OzonePlatformWayland : public OzonePlatform,
menu_utils_ = std::make_unique<WaylandMenuUtils>(connection_.get());
wayland_utils_ = std::make_unique<WaylandUtils>(connection_.get());
+ GetInputMethodContextFactoryForOzone() = base::BindRepeating(
+ [](WaylandConnection* connection,
+ WaylandKeyboard::Delegate* key_delegate,
+ LinuxInputMethodContextDelegate* ime_delegate)
+ -> std::unique_ptr<LinuxInputMethodContext> {
+ return std::make_unique<WaylandInputMethodContext>(
+ connection, key_delegate, ime_delegate);
+ },
+ base::Unretained(connection_.get()),
+ base::Unretained(connection_->event_source()));
+
return true;
}
@@ -399,8 +403,6 @@ class OzonePlatformWayland : public OzonePlatform,
std::unique_ptr<CursorFactory> cursor_factory_;
std::unique_ptr<InputController> input_controller_;
std::unique_ptr<GpuPlatformSupportHost> gpu_platform_support_host_;
- std::unique_ptr<WaylandInputMethodContextFactory>
- input_method_context_factory_;
std::unique_ptr<WaylandBufferManagerConnector> buffer_manager_connector_;
std::unique_ptr<WaylandMenuUtils> menu_utils_;
std::unique_ptr<WaylandUtils> wayland_utils_;
diff --git a/chromium/ui/ozone/platform/wayland/test/global_object.h b/chromium/ui/ozone/platform/wayland/test/global_object.h
index e3c99cb68ab..2e241e21e1c 100644
--- a/chromium/ui/ozone/platform/wayland/test/global_object.h
+++ b/chromium/ui/ozone/platform/wayland/test/global_object.h
@@ -7,6 +7,8 @@
#include <memory>
+#include "base/memory/raw_ptr.h"
+
struct wl_client;
struct wl_display;
struct wl_global;
@@ -56,10 +58,10 @@ class GlobalObject {
std::unique_ptr<wl_global, Deleter> global_;
- const wl_interface* interface_;
- const void* implementation_;
+ raw_ptr<const wl_interface> interface_;
+ raw_ptr<const void> implementation_;
const uint32_t version_;
- wl_resource* resource_ = nullptr;
+ raw_ptr<wl_resource> resource_ = nullptr;
};
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/mock_surface.h b/chromium/ui/ozone/platform/wayland/test/mock_surface.h
index fb4fedbf5a4..c2dd7c85f04 100644
--- a/chromium/ui/ozone/platform/wayland/test/mock_surface.h
+++ b/chromium/ui/ozone/platform/wayland/test/mock_surface.h
@@ -9,6 +9,7 @@
#include <wayland-server-protocol.h>
#include "base/containers/flat_map.h"
+#include "base/memory/raw_ptr.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "ui/gfx/gpu_fence_handle.h"
#include "ui/ozone/platform/wayland/test/mock_xdg_surface.h"
@@ -114,20 +115,20 @@ class MockSurface : public ServerObject {
void set_buffer_scale(int32_t buffer_scale) { buffer_scale_ = buffer_scale; }
private:
- MockXdgSurface* xdg_surface_ = nullptr;
- TestSubSurface* sub_surface_ = nullptr;
- TestViewport* viewport_ = nullptr;
- TestAlphaBlending* blending_ = nullptr;
- TestOverlayPrioritizedSurface* prioritized_surface_ = nullptr;
- TestAugmentedSurface* augmented_surface_ = nullptr;
+ raw_ptr<MockXdgSurface> xdg_surface_ = nullptr;
+ raw_ptr<TestSubSurface> sub_surface_ = nullptr;
+ raw_ptr<TestViewport> viewport_ = nullptr;
+ raw_ptr<TestAlphaBlending> blending_ = nullptr;
+ raw_ptr<TestOverlayPrioritizedSurface> prioritized_surface_ = nullptr;
+ raw_ptr<TestAugmentedSurface> augmented_surface_ = nullptr;
gfx::Rect opaque_region_ = {-1, -1, 0, 0};
gfx::Rect input_region_ = {-1, -1, 0, 0};
- wl_resource* frame_callback_ = nullptr;
+ raw_ptr<wl_resource> frame_callback_ = nullptr;
base::flat_map<wl_resource*, wl_resource*> linux_buffer_releases_;
- wl_resource* attached_buffer_ = nullptr;
- wl_resource* prev_attached_buffer_ = nullptr;
+ raw_ptr<wl_resource> attached_buffer_ = nullptr;
+ raw_ptr<wl_resource> prev_attached_buffer_ = nullptr;
int32_t buffer_scale_ = -1;
};
diff --git a/chromium/ui/ozone/platform/wayland/test/mock_wayland_platform_window_delegate.h b/chromium/ui/ozone/platform/wayland/test/mock_wayland_platform_window_delegate.h
index b4f462a434e..904f172b313 100644
--- a/chromium/ui/ozone/platform/wayland/test/mock_wayland_platform_window_delegate.h
+++ b/chromium/ui/ozone/platform/wayland/test/mock_wayland_platform_window_delegate.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_TEST_MOCK_WAYLAND_PLATFORM_WINDOW_DELEGATE_H_
#define UI_OZONE_PLATFORM_WAYLAND_TEST_MOCK_WAYLAND_PLATFORM_WINDOW_DELEGATE_H_
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/test/mock_platform_window_delegate.h"
namespace ui {
@@ -32,7 +33,7 @@ class MockWaylandPlatformWindowDelegate : public MockPlatformWindowDelegate {
gfx::Rect ConvertRectToDIP(const gfx::Rect& rect_in_pixels) const override;
private:
- WaylandWindow* wayland_window_ = nullptr;
+ raw_ptr<WaylandWindow> wayland_window_ = nullptr;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.cc b/chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.cc
index cd87cb8aafc..d4117d99e46 100644
--- a/chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.cc
+++ b/chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.cc
@@ -37,7 +37,7 @@ MockWpPresentation::MockWpPresentation()
MockWpPresentation::~MockWpPresentation() {}
wl_resource* MockWpPresentation::ReleasePresentationCallback() {
- auto* presentation_callback = presentation_callback_;
+ auto* presentation_callback = presentation_callback_.get();
presentation_callback_ = nullptr;
return presentation_callback;
}
diff --git a/chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.h b/chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.h
index 5230ceabee7..2ae53bf94f2 100644
--- a/chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.h
+++ b/chromium/ui/ozone/platform/wayland/test/mock_wp_presentation.h
@@ -8,6 +8,7 @@
#include <presentation-time-server-protocol.h>
#include "base/check.h"
+#include "base/memory/raw_ptr.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "ui/ozone/platform/wayland/test/global_object.h"
@@ -43,7 +44,7 @@ class MockWpPresentation : public GlobalObject {
void SendPresentationCallbackDiscarded();
private:
- wl_resource* presentation_callback_ = nullptr;
+ raw_ptr<wl_resource> presentation_callback_ = nullptr;
};
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/mock_xdg_surface.cc b/chromium/ui/ozone/platform/wayland/test/mock_xdg_surface.cc
index 7ffadf1e148..46d3bd879dc 100644
--- a/chromium/ui/ozone/platform/wayland/test/mock_xdg_surface.cc
+++ b/chromium/ui/ozone/platform/wayland/test/mock_xdg_surface.cc
@@ -52,8 +52,8 @@ void SetWindowGeometry(wl_client* client,
int32_t y,
int32_t width,
int32_t height) {
- GetUserDataAs<MockXdgSurface>(resource)->SetWindowGeometry(x, y, width,
- height);
+ GetUserDataAs<MockXdgSurface>(resource)->SetWindowGeometry(
+ {x, y, width, height});
}
void SetMaximized(wl_client* client, wl_resource* resource) {
@@ -113,8 +113,9 @@ void GetTopLevel(wl_client* client, wl_resource* resource, uint32_t id) {
wl_client_post_no_memory(client);
return;
}
- surface->set_xdg_toplevel(std::make_unique<MockXdgTopLevel>(
- xdg_toplevel_resource, &kMockXdgToplevelImpl));
+ surface->set_xdg_toplevel(
+ std::make_unique<testing::NiceMock<MockXdgTopLevel>>(
+ xdg_toplevel_resource, &kMockXdgToplevelImpl));
}
void GetTopLevelV6(wl_client* client, wl_resource* resource, uint32_t id) {
@@ -130,8 +131,9 @@ void GetTopLevelV6(wl_client* client, wl_resource* resource, uint32_t id) {
wl_client_post_no_memory(client);
return;
}
- surface->set_xdg_toplevel(std::make_unique<MockXdgTopLevel>(
- xdg_toplevel_resource, &kMockZxdgToplevelV6Impl));
+ surface->set_xdg_toplevel(
+ std::make_unique<testing::NiceMock<MockXdgTopLevel>>(
+ xdg_toplevel_resource, &kMockZxdgToplevelV6Impl));
}
void GetXdgPopup(struct wl_client* client,
diff --git a/chromium/ui/ozone/platform/wayland/test/mock_xdg_surface.h b/chromium/ui/ozone/platform/wayland/test/mock_xdg_surface.h
index 2eacf1f3e66..71c984e570b 100644
--- a/chromium/ui/ozone/platform/wayland/test/mock_xdg_surface.h
+++ b/chromium/ui/ozone/platform/wayland/test/mock_xdg_surface.h
@@ -11,6 +11,7 @@
#include <xdg-shell-server-protocol.h>
#include <xdg-shell-unstable-v6-server-protocol.h>
+#include "base/memory/raw_ptr.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "ui/ozone/platform/wayland/test/server_object.h"
#include "ui/ozone/platform/wayland/test/test_xdg_popup.h"
@@ -38,8 +39,7 @@ class MockXdgSurface : public ServerObject {
~MockXdgSurface() override;
MOCK_METHOD1(AckConfigure, void(uint32_t serial));
- MOCK_METHOD4(SetWindowGeometry,
- void(int32_t x, int32_t y, int32_t width, int32_t height));
+ MOCK_METHOD1(SetWindowGeometry, void(const gfx::Rect&));
void set_xdg_toplevel(std::unique_ptr<MockXdgTopLevel> xdg_toplevel) {
xdg_toplevel_ = std::move(xdg_toplevel);
@@ -53,10 +53,10 @@ class MockXdgSurface : public ServerObject {
// Has either toplevel role..
std::unique_ptr<MockXdgTopLevel> xdg_toplevel_;
// Or popup role.
- TestXdgPopup* xdg_popup_ = nullptr;
+ raw_ptr<TestXdgPopup> xdg_popup_ = nullptr;
// MockSurface that is the ground for this xdg_surface.
- wl_resource* surface_ = nullptr;
+ raw_ptr<wl_resource> surface_ = nullptr;
};
// Manage zxdg_toplevel for providing desktop UI.
diff --git a/chromium/ui/ozone/platform/wayland/test/mock_zaura_shell.cc b/chromium/ui/ozone/platform/wayland/test/mock_zaura_shell.cc
index 7bad5c3adb5..9acb0dcc864 100644
--- a/chromium/ui/ozone/platform/wayland/test/mock_zaura_shell.cc
+++ b/chromium/ui/ozone/platform/wayland/test/mock_zaura_shell.cc
@@ -4,37 +4,74 @@
#include "ui/ozone/platform/wayland/test/mock_zaura_shell.h"
+#include "base/notreached.h"
#include "ui/ozone/platform/wayland/test/server_object.h"
#include "ui/ozone/platform/wayland/test/test_output.h"
#include "ui/ozone/platform/wayland/test/test_zaura_output.h"
+#include "ui/ozone/platform/wayland/test/test_zaura_popup.h"
+#include "ui/ozone/platform/wayland/test/test_zaura_surface.h"
+#include "ui/ozone/platform/wayland/test/test_zaura_toplevel.h"
namespace wl {
namespace {
-constexpr uint32_t kZAuraShellVersion = 34;
-constexpr uint32_t kZAuraOutputVersion = 34;
+constexpr uint32_t kZAuraShellVersion = 40;
+constexpr uint32_t kZAuraOutputVersion = 38;
void GetAuraSurface(wl_client* client,
wl_resource* resource,
uint32_t id,
- wl_resource* surface_resource) {}
+ wl_resource* surface_resource) {
+ CreateResourceWithImpl<TestZAuraSurface>(client, &zaura_surface_interface,
+ kZAuraShellVersion,
+ &kTestZAuraSurfaceImpl, id);
+}
void GetAuraOutput(wl_client* client,
wl_resource* resource,
uint32_t id,
wl_resource* output_resource) {
wl_resource* zaura_output_resource = CreateResourceWithImpl<TestZAuraOutput>(
- client, &zaura_output_interface, kZAuraOutputVersion, nullptr, id);
+ client, &zaura_output_interface, kZAuraOutputVersion,
+ &kTestZAuraToplevelImpl, id);
auto* output = GetUserDataAs<TestOutput>(output_resource);
output->SetAuraOutput(GetUserDataAs<TestZAuraOutput>(zaura_output_resource));
}
void SurfaceSubmissionInPixelCoordinates(wl_client* client,
- wl_resource* resource) {}
+ wl_resource* resource) {
+ // TODO(crbug.com/1346347): Implement zaura-shell protocol requests and test
+ // their usage.
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
+void GetAuraToplevelForXdgToplevel(wl_client* client,
+ wl_resource* resource,
+ uint32_t id,
+ wl_resource* toplevel) {
+ CreateResourceWithImpl<TestZAuraToplevel>(client, &zaura_toplevel_interface,
+ kZAuraShellVersion,
+ &kTestZAuraToplevelImpl, id);
+}
+
+void GetAuraPopupForXdgPopup(wl_client* client,
+ wl_resource* resource,
+ uint32_t id,
+ wl_resource* popup) {
+ CreateResourceWithImpl<TestZAuraPopup>(client, &zaura_popup_interface,
+ kZAuraShellVersion,
+ &kTestZAuraPopupImpl, id);
+}
const struct zaura_shell_interface kMockZAuraShellImpl = {
- &GetAuraSurface, &GetAuraOutput, &SurfaceSubmissionInPixelCoordinates};
+ &GetAuraSurface,
+ &GetAuraOutput,
+ &SurfaceSubmissionInPixelCoordinates,
+ &GetAuraToplevelForXdgToplevel,
+ &GetAuraPopupForXdgPopup,
+ &DestroyResource,
+};
} // namespace
diff --git a/chromium/ui/ozone/platform/wayland/test/server_object.h b/chromium/ui/ozone/platform/wayland/test/server_object.h
index 24e5410dc61..87555cba6ba 100644
--- a/chromium/ui/ozone/platform/wayland/test/server_object.h
+++ b/chromium/ui/ozone/platform/wayland/test/server_object.h
@@ -11,6 +11,8 @@
#include <wayland-server-core.h>
+#include "base/memory/raw_ptr.h"
+
struct wl_client;
struct wl_resource;
@@ -31,7 +33,7 @@ class ServerObject {
static void OnResourceDestroyed(wl_resource* resource);
private:
- wl_resource* resource_;
+ raw_ptr<wl_resource> resource_;
};
template <class T>
diff --git a/chromium/ui/ozone/platform/wayland/test/test_alpha_blending.h b/chromium/ui/ozone/platform/wayland/test/test_alpha_blending.h
index 296990d71a3..70c339003a0 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_alpha_blending.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_alpha_blending.h
@@ -7,6 +7,7 @@
#include <alpha-compositing-unstable-v1-server-protocol.h>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/test/server_object.h"
struct wl_resource;
@@ -24,7 +25,7 @@ class TestAlphaBlending : public ServerObject {
private:
// Surface resource that is the ground for this Viewport.
- wl_resource* surface_ = nullptr;
+ raw_ptr<wl_resource> surface_ = nullptr;
};
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/test_augmented_subsurface.h b/chromium/ui/ozone/platform/wayland/test/test_augmented_subsurface.h
index 33c594c686f..2ff51062d03 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_augmented_subsurface.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_augmented_subsurface.h
@@ -7,6 +7,7 @@
#include <surface-augmenter-server-protocol.h>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/test/server_object.h"
namespace wl {
@@ -27,7 +28,7 @@ class TestAugmentedSubSurface : public ServerObject {
private:
// Subsurface resource that is the ground for this augmented surface.
- wl_resource* sub_surface_ = nullptr;
+ raw_ptr<wl_resource> sub_surface_ = nullptr;
};
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/test_augmented_surface.h b/chromium/ui/ozone/platform/wayland/test/test_augmented_surface.h
index 709ce10a0f3..b8a618f59c1 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_augmented_surface.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_augmented_surface.h
@@ -7,6 +7,7 @@
#include <surface-augmenter-server-protocol.h>
+#include "base/memory/raw_ptr.h"
#include "ui/gfx/geometry/rrect_f.h"
#include "ui/ozone/platform/wayland/test/server_object.h"
@@ -32,7 +33,7 @@ class TestAugmentedSurface : public ServerObject {
private:
// Surface resource that is the ground for this augmented surface.
- wl_resource* surface_ = nullptr;
+ raw_ptr<wl_resource> surface_ = nullptr;
gfx::RRectF rounded_clip_bounds_;
};
diff --git a/chromium/ui/ozone/platform/wayland/test/test_data_device.cc b/chromium/ui/ozone/platform/wayland/test/test_data_device.cc
index ee3fc397545..286181779ec 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_data_device.cc
+++ b/chromium/ui/ozone/platform/wayland/test/test_data_device.cc
@@ -8,6 +8,7 @@
#include <cstdint>
+#include "base/memory/raw_ptr.h"
#include "base/notreached.h"
#include "ui/ozone/platform/wayland/test/mock_surface.h"
#include "ui/ozone/platform/wayland/test/server_object.h"
@@ -67,7 +68,7 @@ struct WlDataDeviceImpl : public TestSelectionDevice::Delegate {
void OnDestroying() override { delete this; }
private:
- TestDataDevice* const device_;
+ const raw_ptr<TestDataDevice> device_;
};
} // namespace
diff --git a/chromium/ui/ozone/platform/wayland/test/test_data_device.h b/chromium/ui/ozone/platform/wayland/test/test_data_device.h
index 16242fb49ca..69f506691ff 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_data_device.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_data_device.h
@@ -9,6 +9,7 @@
#include <cstdint>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/test/mock_surface.h"
#include "ui/ozone/platform/wayland/test/test_selection_device_manager.h"
@@ -60,10 +61,10 @@ class TestDataDevice : public TestSelectionDevice {
wl_client* client() { return client_; }
private:
- wl_client* client_ = nullptr;
- DragDelegate* drag_delegate_ = nullptr;
+ raw_ptr<wl_client> client_ = nullptr;
+ raw_ptr<DragDelegate> drag_delegate_ = nullptr;
- TestDataDeviceManager* const manager_;
+ const raw_ptr<TestDataDeviceManager> manager_;
};
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/test_data_device_manager.h b/chromium/ui/ozone/platform/wayland/test/test_data_device_manager.h
index 650e84589ee..86d67101d8e 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_data_device_manager.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_data_device_manager.h
@@ -7,6 +7,7 @@
#include <wayland-server-protocol.h>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/test/global_object.h"
namespace wl {
@@ -37,8 +38,8 @@ class TestDataDeviceManager : public GlobalObject {
}
private:
- TestDataDevice* data_device_ = nullptr;
- TestDataSource* data_source_ = nullptr;
+ raw_ptr<TestDataDevice> data_device_ = nullptr;
+ raw_ptr<TestDataSource> data_source_ = nullptr;
};
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/test_data_offer.cc b/chromium/ui/ozone/platform/wayland/test/test_data_offer.cc
index fbafddb2214..48387b84995 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_data_offer.cc
+++ b/chromium/ui/ozone/platform/wayland/test/test_data_offer.cc
@@ -9,6 +9,7 @@
#include "base/bind.h"
#include "base/logging.h"
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/test/test_selection_device_manager.h"
namespace wl {
@@ -52,7 +53,7 @@ struct WlDataOfferImpl : public TestSelectionOffer::Delegate {
void OnDestroying() override { delete this; }
private:
- TestDataOffer* const offer_;
+ const raw_ptr<TestDataOffer> offer_;
};
} // namespace
diff --git a/chromium/ui/ozone/platform/wayland/test/test_data_source.cc b/chromium/ui/ozone/platform/wayland/test/test_data_source.cc
index 8970cb82dc6..f0a92572acf 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_data_source.cc
+++ b/chromium/ui/ozone/platform/wayland/test/test_data_source.cc
@@ -9,6 +9,7 @@
#include <string>
#include "base/logging.h"
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/test/test_selection_device_manager.h"
namespace wl {
@@ -50,7 +51,7 @@ struct WlDataSourceImpl : public TestSelectionSource::Delegate {
void OnDestroying() override { delete this; }
private:
- TestDataSource* const source_;
+ const raw_ptr<TestDataSource> source_;
};
} // namespace
diff --git a/chromium/ui/ozone/platform/wayland/test/test_output.h b/chromium/ui/ozone/platform/wayland/test/test_output.h
index 5b90dc06b2f..7f78bf74e08 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_output.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_output.h
@@ -8,6 +8,7 @@
#include <wayland-server-protocol.h>
#include <cstdint>
+#include "base/memory/raw_ptr.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/ozone/platform/wayland/test/global_object.h"
@@ -48,7 +49,7 @@ class TestOutput : public GlobalObject {
absl::optional<int32_t> pending_scale_ = absl::nullopt;
absl::optional<wl_output_transform> pending_transform_ = absl::nullopt;
- TestZAuraOutput* aura_output_ = nullptr;
+ raw_ptr<TestZAuraOutput> aura_output_ = nullptr;
};
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/test_overlay_prioritized_surface.h b/chromium/ui/ozone/platform/wayland/test/test_overlay_prioritized_surface.h
index 3d52c8dc3e8..fe6462a625d 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_overlay_prioritized_surface.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_overlay_prioritized_surface.h
@@ -7,6 +7,7 @@
#include <overlay-prioritizer-server-protocol.h>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/test/server_object.h"
struct wl_resource;
@@ -30,7 +31,7 @@ class TestOverlayPrioritizedSurface : public ServerObject {
private:
// Surface resource that is the ground for this prioritized surface.
- wl_resource* surface_ = nullptr;
+ raw_ptr<wl_resource> surface_ = nullptr;
uint32_t overlay_priority_ =
OVERLAY_PRIORITIZED_SURFACE_OVERLAY_PRIORITY_NONE;
diff --git a/chromium/ui/ozone/platform/wayland/test/test_seat.h b/chromium/ui/ozone/platform/wayland/test/test_seat.h
index 94b85ab2b59..ec30c24b936 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_seat.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_seat.h
@@ -7,6 +7,7 @@
#include <wayland-server-protocol.h>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/test/global_object.h"
namespace wl {
@@ -42,9 +43,9 @@ class TestSeat : public GlobalObject {
TestTouch* touch() const { return touch_; }
private:
- MockPointer* pointer_;
- TestKeyboard* keyboard_;
- TestTouch* touch_;
+ raw_ptr<MockPointer> pointer_;
+ raw_ptr<TestKeyboard> keyboard_;
+ raw_ptr<TestTouch> touch_;
};
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/test_selection_device_manager.h b/chromium/ui/ozone/platform/wayland/test/test_selection_device_manager.h
index bf4c9578f00..b514fa5cb0c 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_selection_device_manager.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_selection_device_manager.h
@@ -11,6 +11,7 @@
#include "base/callback_forward.h"
#include "base/files/scoped_file.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/threading/thread.h"
#include "ui/ozone/platform/wayland/test/global_object.h"
@@ -72,10 +73,10 @@ class TestSelectionDeviceManager : public GlobalObject {
wl_resource* seat_resource);
private:
- Delegate* const delegate_;
+ const raw_ptr<Delegate> delegate_;
- TestSelectionDevice* device_ = nullptr;
- TestSelectionSource* source_ = nullptr;
+ raw_ptr<TestSelectionDevice> device_ = nullptr;
+ raw_ptr<TestSelectionSource> source_ = nullptr;
};
class TestSelectionOffer : public ServerObject {
@@ -103,7 +104,7 @@ class TestSelectionOffer : public ServerObject {
int fd);
private:
- Delegate* const delegate_;
+ const raw_ptr<Delegate> delegate_;
const scoped_refptr<base::SequencedTaskRunner> task_runner_;
ui::PlatformClipboard::DataMap data_to_offer_;
@@ -139,7 +140,7 @@ class TestSelectionSource : public ServerObject {
const char* mime_type);
private:
- Delegate* const delegate_;
+ const raw_ptr<Delegate> delegate_;
std::vector<std::string> mime_types_;
const scoped_refptr<base::SequencedTaskRunner> task_runner_;
@@ -178,11 +179,11 @@ class TestSelectionDevice : public ServerObject {
uint32_t selection_serial() const { return selection_serial_; }
private:
- Delegate* const delegate_;
+ const raw_ptr<Delegate> delegate_;
uint32_t selection_serial_ = 0;
- TestSelectionDeviceManager* manager_ = nullptr;
+ raw_ptr<TestSelectionDeviceManager> manager_ = nullptr;
};
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/test_subsurface.h b/chromium/ui/ozone/platform/wayland/test/test_subsurface.h
index 833248e4d4a..0c713f442ef 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_subsurface.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_subsurface.h
@@ -7,7 +7,7 @@
#include <wayland-server-protocol.h>
-
+#include "base/memory/raw_ptr.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "ui/gfx/geometry/point_f.h"
#include "ui/ozone/platform/wayland/test/server_object.h"
@@ -53,12 +53,12 @@ class TestSubSurface : public ServerObject {
bool sync_ = false;
// Surface resource that is the ground for this subsurface.
- wl_resource* surface_ = nullptr;
+ raw_ptr<wl_resource> surface_ = nullptr;
// Parent surface resource.
- wl_resource* parent_resource_ = nullptr;
+ raw_ptr<wl_resource> parent_resource_ = nullptr;
- TestAugmentedSubSurface* augmented_subsurface_ = nullptr;
+ raw_ptr<TestAugmentedSubSurface> augmented_subsurface_ = nullptr;
};
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/test_touch.h b/chromium/ui/ozone/platform/wayland/test/test_touch.h
index 7da05200ae7..ac21cb0a9ae 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_touch.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_touch.h
@@ -7,6 +7,7 @@
#include <wayland-server-protocol.h>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/test/server_object.h"
struct wl_resource;
@@ -32,7 +33,7 @@ class TestTouch : public ServerObject {
MockZcrTouchStylus* touch_stylus() const { return touch_stylus_; }
private:
- MockZcrTouchStylus* touch_stylus_ = nullptr;
+ raw_ptr<MockZcrTouchStylus> touch_stylus_ = nullptr;
};
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/test_viewport.h b/chromium/ui/ozone/platform/wayland/test/test_viewport.h
index 4ac792a0c24..1f24dfded9b 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_viewport.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_viewport.h
@@ -7,6 +7,7 @@
#include <viewporter-server-protocol.h>
+#include "base/memory/raw_ptr.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "ui/gfx/geometry/size_f.h"
#include "ui/ozone/platform/wayland/test/server_object.h"
@@ -32,7 +33,7 @@ class TestViewport : public ServerObject {
private:
// Surface resource that is the ground for this Viewport.
- wl_resource* surface_ = nullptr;
+ raw_ptr<wl_resource> surface_ = nullptr;
gfx::SizeF destination_size_;
};
diff --git a/chromium/ui/ozone/platform/wayland/test/test_wayland_server_thread.cc b/chromium/ui/ozone/platform/wayland/test/test_wayland_server_thread.cc
index 00860dd76a0..e1e729ba902 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_wayland_server_thread.cc
+++ b/chromium/ui/ozone/platform/wayland/test/test_wayland_server_thread.cc
@@ -92,6 +92,8 @@ bool TestWaylandServerThread::Start(const ServerConfig& config) {
} else {
if (!xdg_shell_.Initialize(display_.get()))
return false;
+ if (!zaura_shell_.Initialize(display_.get()))
+ return false;
}
if (!zcr_stylus_.Initialize(display_.get()))
return false;
diff --git a/chromium/ui/ozone/platform/wayland/test/test_wayland_server_thread.h b/chromium/ui/ozone/platform/wayland/test/test_wayland_server_thread.h
index b08b191e0c4..3583d5d57f3 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_wayland_server_thread.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_wayland_server_thread.h
@@ -11,12 +11,14 @@
#include <memory>
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "base/message_loop/message_pump_libevent.h"
#include "base/synchronization/waitable_event.h"
#include "base/threading/thread.h"
#include "ui/ozone/platform/wayland/test/global_object.h"
#include "ui/ozone/platform/wayland/test/mock_wp_presentation.h"
#include "ui/ozone/platform/wayland/test/mock_xdg_shell.h"
+#include "ui/ozone/platform/wayland/test/mock_zaura_shell.h"
#include "ui/ozone/platform/wayland/test/mock_zwp_linux_dmabuf.h"
#include "ui/ozone/platform/wayland/test/test_alpha_compositing.h"
#include "ui/ozone/platform/wayland/test/test_compositor.h"
@@ -111,6 +113,7 @@ class TestWaylandServerThread : public base::Thread,
TestDataDeviceManager* data_device_manager() { return &data_device_manager_; }
TestSeat* seat() { return &seat_; }
MockXdgShell* xdg_shell() { return &xdg_shell_; }
+ MockZAuraShell* zaura_shell() { return &zaura_shell_; }
TestOutput* output() { return &output_; }
TestZcrTextInputExtensionV1* text_input_extension_v1() {
return &zcr_text_input_extension_v1_;
@@ -152,8 +155,8 @@ class TestWaylandServerThread : public base::Thread,
void OnFileCanWriteWithoutBlocking(int fd) override;
std::unique_ptr<wl_display, DisplayDeleter> display_;
- wl_client* client_ = nullptr;
- wl_event_loop* event_loop_ = nullptr;
+ raw_ptr<wl_client> client_ = nullptr;
+ raw_ptr<wl_event_loop> event_loop_ = nullptr;
base::WaitableEvent pause_event_;
base::WaitableEvent resume_event_;
@@ -175,6 +178,7 @@ class TestWaylandServerThread : public base::Thread,
TestSeat seat_;
MockXdgShell xdg_shell_;
MockZxdgShellV6 zxdg_shell_v6_;
+ MockZAuraShell zaura_shell_;
TestZcrStylus zcr_stylus_;
TestZcrTextInputExtensionV1 zcr_text_input_extension_v1_;
TestZwpTextInputManagerV1 zwp_text_input_manager_v1_;
@@ -188,7 +192,7 @@ class TestWaylandServerThread : public base::Thread,
base::MessagePumpLibevent::FdWatchController controller_;
- OutputDelegate* output_delegate_ = nullptr;
+ raw_ptr<OutputDelegate> output_delegate_ = nullptr;
};
class TestWaylandServerThread::OutputDelegate {
diff --git a/chromium/ui/ozone/platform/wayland/test/test_wp_pointer_gestures.h b/chromium/ui/ozone/platform/wayland/test/test_wp_pointer_gestures.h
index d275dee9569..e5a9ce1081f 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_wp_pointer_gestures.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_wp_pointer_gestures.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_WP_POINTER_GESTURES_H_
#define UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_WP_POINTER_GESTURES_H_
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/test/global_object.h"
#include "ui/ozone/platform/wayland/test/server_object.h"
@@ -42,7 +43,7 @@ class TestWpPointerGestures : public GlobalObject {
struct wl_resource* pointer);
private:
- TestPinchGesture* pinch_;
+ raw_ptr<TestPinchGesture> pinch_;
};
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/test_xdg_popup.h b/chromium/ui/ozone/platform/wayland/test/test_xdg_popup.h
index 0beecc56664..6e4ba0d75d2 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_xdg_popup.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_xdg_popup.h
@@ -10,6 +10,7 @@
#include <xdg-shell-server-protocol.h>
#include <xdg-shell-unstable-v6-server-protocol.h>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/test/server_object.h"
#include "ui/ozone/platform/wayland/test/test_positioner.h"
@@ -50,7 +51,7 @@ class TestXdgPopup : public ServerObject {
struct TestPositioner::PopupPosition position_;
// Ground surface for this popup.
- wl_resource* surface_ = nullptr;
+ raw_ptr<wl_resource> surface_ = nullptr;
uint32_t grab_serial_ = 0;
};
diff --git a/chromium/ui/ozone/platform/wayland/test/test_zaura_popup.cc b/chromium/ui/ozone/platform/wayland/test/test_zaura_popup.cc
new file mode 100644
index 00000000000..7aec2056b3b
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/test/test_zaura_popup.cc
@@ -0,0 +1,46 @@
+// 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/wayland/test/test_zaura_popup.h"
+
+#include <aura-shell-server-protocol.h>
+
+#include "base/notreached.h"
+
+namespace wl {
+
+namespace {
+
+void SurfaceSubmissionInPixelCoordinates(struct wl_client* client,
+ struct wl_resource* resource) {
+ // TODO(crbug.com/1346347): Implement zaura-shell protocol requests and test
+ // their usage.
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
+void SetDecoration(struct wl_client* client,
+ struct wl_resource* resource,
+ uint32_t type) {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
+void SetMenu(struct wl_client* client, struct wl_resource* resource) {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
+} // namespace
+
+TestZAuraPopup::TestZAuraPopup(wl_resource* resource)
+ : ServerObject(resource) {}
+
+TestZAuraPopup::~TestZAuraPopup() = default;
+
+const struct zaura_popup_interface kTestZAuraPopupImpl = {
+ &SurfaceSubmissionInPixelCoordinates,
+ &SetDecoration,
+ &SetMenu,
+ &DestroyResource,
+};
+
+} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/test_zaura_popup.h b/chromium/ui/ozone/platform/wayland/test/test_zaura_popup.h
new file mode 100644
index 00000000000..3398dc5f179
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/test/test_zaura_popup.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 UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_ZAURA_POPUP_H_
+#define UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_ZAURA_POPUP_H_
+
+#include <aura-shell-server-protocol.h>
+
+#include "ui/ozone/platform/wayland/test/server_object.h"
+
+namespace wl {
+
+extern const struct zaura_popup_interface kTestZAuraPopupImpl;
+
+// Manages zaura_popup object.
+class TestZAuraPopup : public ServerObject {
+ public:
+ explicit TestZAuraPopup(wl_resource* resource);
+
+ TestZAuraPopup(const TestZAuraPopup&) = delete;
+ TestZAuraPopup& operator=(const TestZAuraPopup&) = delete;
+
+ ~TestZAuraPopup() override;
+};
+
+} // namespace wl
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_ZAURA_POPUP_H_
diff --git a/chromium/ui/ozone/platform/wayland/test/test_zaura_surface.cc b/chromium/ui/ozone/platform/wayland/test/test_zaura_surface.cc
new file mode 100644
index 00000000000..f5dff2bde15
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/test/test_zaura_surface.cc
@@ -0,0 +1,170 @@
+// 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/wayland/test/test_zaura_surface.h"
+
+#include <aura-shell-server-protocol.h>
+
+#include "base/notreached.h"
+#include "ui/ozone/platform/wayland/test/server_object.h"
+
+namespace wl {
+
+namespace {
+
+void set_frame(struct wl_client* client,
+ struct wl_resource* resource,
+ uint32_t type) {
+ NOTREACHED();
+}
+void set_parent(struct wl_client* client,
+ struct wl_resource* resource,
+ struct wl_resource* parent,
+ int32_t x,
+ int32_t y) {
+ NOTREACHED();
+}
+void set_frame_colors(struct wl_client* client,
+ struct wl_resource* resource,
+ uint32_t active_color,
+ uint32_t inactive_color) {
+ NOTREACHED();
+}
+void set_startup_id(struct wl_client* client,
+ struct wl_resource* resource,
+ const char* startup_id) {
+ NOTREACHED();
+}
+void set_application_id(struct wl_client* client,
+ struct wl_resource* resource,
+ const char* application_id) {
+ NOTREACHED();
+}
+void set_client_surface_id(struct wl_client* client,
+ struct wl_resource* resource,
+ int32_t client_surface_id) {
+ NOTREACHED();
+}
+void set_occlusion_tracking(struct wl_client* client,
+ struct wl_resource* resource) {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+void unset_occlusion_tracking(struct wl_client* client,
+ struct wl_resource* resource) {
+ NOTREACHED();
+}
+void activate(struct wl_client* client, struct wl_resource* resource) {
+ NOTREACHED();
+}
+void draw_attention(struct wl_client* client, struct wl_resource* resource) {
+ NOTREACHED();
+}
+void set_fullscreen_mode(struct wl_client* client,
+ struct wl_resource* resource,
+ uint32_t mode) {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+void set_client_surface_str_id(struct wl_client* client,
+ struct wl_resource* resource,
+ const char* client_surface_id) {
+ NOTREACHED();
+}
+void set_server_start_resize(struct wl_client* client,
+ struct wl_resource* resource) {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+void intent_to_snap(struct wl_client* client,
+ struct wl_resource* resource,
+ uint32_t direction) {
+ NOTREACHED();
+}
+void set_snap_left(struct wl_client* client, struct wl_resource* resource) {
+ NOTREACHED();
+}
+void set_snap_right(struct wl_client* client, struct wl_resource* resource) {
+ NOTREACHED();
+}
+void unset_snap(struct wl_client* client, struct wl_resource* resource) {
+ NOTREACHED();
+}
+void set_window_session_id(struct wl_client* client,
+ struct wl_resource* resource,
+ int32_t id) {
+ NOTREACHED();
+}
+void set_can_go_back(struct wl_client* client, struct wl_resource* resource) {
+ NOTREACHED();
+}
+void unset_can_go_back(struct wl_client* client, struct wl_resource* resource) {
+ NOTREACHED();
+}
+void set_pip(struct wl_client* client, struct wl_resource* resource) {
+ NOTREACHED();
+}
+void unset_pip(struct wl_client* client, struct wl_resource* resource) {
+ NOTREACHED();
+}
+void set_aspect_ratio(struct wl_client* client,
+ struct wl_resource* resource,
+ int32_t width,
+ int32_t height) {
+ NOTREACHED();
+}
+void move_to_desk(struct wl_client* client,
+ struct wl_resource* resource,
+ int32_t index) {
+ NOTREACHED();
+}
+void set_initial_workspace(struct wl_client* client,
+ struct wl_resource* resource,
+ const char* initial_workspace) {
+ NOTREACHED();
+}
+void set_pin(struct wl_client* client,
+ struct wl_resource* resource,
+ int32_t trusted) {
+ NOTREACHED();
+}
+void unset_pin(struct wl_client* client, struct wl_resource* resource) {
+ NOTREACHED();
+}
+} // namespace
+
+TestZAuraSurface::TestZAuraSurface(wl_resource* resource)
+ : ServerObject(resource) {}
+
+TestZAuraSurface::~TestZAuraSurface() = default;
+
+const struct zaura_surface_interface kTestZAuraSurfaceImpl = {
+ &set_frame,
+ &set_parent,
+ &set_frame_colors,
+ &set_startup_id,
+ &set_application_id,
+ &set_client_surface_id,
+ &set_occlusion_tracking,
+ &unset_occlusion_tracking,
+ &activate,
+ &draw_attention,
+ &set_fullscreen_mode,
+ &set_client_surface_str_id,
+ &set_server_start_resize,
+ &intent_to_snap,
+ &set_snap_left,
+ &set_snap_right,
+ &unset_snap,
+ &set_window_session_id,
+ &set_can_go_back,
+ &unset_can_go_back,
+ &set_pip,
+ &unset_pip,
+ &set_aspect_ratio,
+ &move_to_desk,
+ &set_initial_workspace,
+ &set_pin,
+ &unset_pin,
+ &DestroyResource,
+};
+
+} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/test_zaura_surface.h b/chromium/ui/ozone/platform/wayland/test/test_zaura_surface.h
new file mode 100644
index 00000000000..773bf02cfbd
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/test/test_zaura_surface.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 UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_ZAURA_SURFACE_H_
+#define UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_ZAURA_SURFACE_H_
+
+#include <aura-shell-server-protocol.h>
+
+#include "ui/ozone/platform/wayland/test/server_object.h"
+
+namespace wl {
+
+extern const struct zaura_surface_interface kTestZAuraSurfaceImpl;
+
+// Manages zaura_surface object.
+class TestZAuraSurface : public ServerObject {
+ public:
+ explicit TestZAuraSurface(wl_resource* resource);
+
+ TestZAuraSurface(const TestZAuraSurface&) = delete;
+ TestZAuraSurface& operator=(const TestZAuraSurface&) = delete;
+
+ ~TestZAuraSurface() override;
+};
+
+} // namespace wl
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_ZAURA_SURFACE_H_
diff --git a/chromium/ui/ozone/platform/wayland/test/test_zaura_toplevel.cc b/chromium/ui/ozone/platform/wayland/test/test_zaura_toplevel.cc
new file mode 100644
index 00000000000..392fbdf78c0
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/test/test_zaura_toplevel.cc
@@ -0,0 +1,108 @@
+// 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/wayland/test/test_zaura_toplevel.h"
+
+#include <aura-shell-server-protocol.h>
+
+#include "base/notreached.h"
+
+namespace wl {
+
+namespace {
+
+void SetOrientationLock(struct wl_client* client,
+ struct wl_resource* resource,
+ uint32_t orientation_lock) {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
+void SurfaceSubmissionInPixelCoordinates(struct wl_client* client,
+ struct wl_resource* resource) {
+ // TODO(crbug.com/1346347): Implement zaura-shell protocol requests and test
+ // their usage.
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
+void SetSupportsScreenCoordinates(struct wl_client* client,
+ struct wl_resource* resource) {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
+void SetWindowBounds(struct wl_client* client,
+ struct wl_resource* resource,
+ int32_t x,
+ int32_t y,
+ int32_t width,
+ int32_t height,
+ struct wl_resource* output) {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
+void SetRestoreInfo(struct wl_client* client,
+ struct wl_resource* resource,
+ int32_t restore_session_id,
+ int32_t restore_window_id) {
+ NOTREACHED();
+}
+
+void SetSystemModal(struct wl_client* client, struct wl_resource* resource) {
+ NOTREACHED();
+}
+
+void UnsetSystemModal(struct wl_client* client, struct wl_resource* resource) {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
+void SetRestoreInfoWithWindowIdSource(struct wl_client* client,
+ struct wl_resource* resource,
+ int32_t restore_session_id,
+ const char* restore_window_id_source) {
+ NOTREACHED();
+}
+
+void SetDecoration(struct wl_client* client,
+ struct wl_resource* resource,
+ uint32_t type) {
+ NOTREACHED();
+}
+
+void SetFloat(struct wl_client* client, struct wl_resource* resource) {
+ NOTREACHED();
+}
+
+void UnSetFloat(struct wl_client* client, struct wl_resource* resource) {
+ NOTREACHED();
+}
+
+void SetZOrder(struct wl_client* client,
+ struct wl_resource* resource,
+ uint32_t z_order) {
+ NOTIMPLEMENTED_LOG_ONCE();
+}
+
+} // namespace
+
+TestZAuraToplevel::TestZAuraToplevel(wl_resource* resource)
+ : ServerObject(resource) {}
+
+TestZAuraToplevel::~TestZAuraToplevel() = default;
+
+const struct zaura_toplevel_interface kTestZAuraToplevelImpl = {
+ &SetOrientationLock,
+ &SurfaceSubmissionInPixelCoordinates,
+ &SetSupportsScreenCoordinates,
+ &SetWindowBounds,
+ &SetRestoreInfo,
+ &SetSystemModal,
+ &UnsetSystemModal,
+ &SetRestoreInfoWithWindowIdSource,
+ &SetDecoration,
+ &DestroyResource,
+ &SetFloat,
+ &UnSetFloat,
+ &SetZOrder,
+};
+
+} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/test_zaura_toplevel.h b/chromium/ui/ozone/platform/wayland/test/test_zaura_toplevel.h
new file mode 100644
index 00000000000..86a023a5086
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/test/test_zaura_toplevel.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 UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_ZAURA_TOPLEVEL_H_
+#define UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_ZAURA_TOPLEVEL_H_
+
+#include <aura-shell-server-protocol.h>
+
+#include "ui/ozone/platform/wayland/test/server_object.h"
+
+namespace wl {
+
+extern const struct zaura_toplevel_interface kTestZAuraToplevelImpl;
+
+// Manages zaura_toplevel object.
+class TestZAuraToplevel : public ServerObject {
+ public:
+ explicit TestZAuraToplevel(wl_resource* resource);
+
+ TestZAuraToplevel(const TestZAuraToplevel&) = delete;
+ TestZAuraToplevel& operator=(const TestZAuraToplevel&) = delete;
+
+ ~TestZAuraToplevel() override;
+};
+
+} // namespace wl
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_ZAURA_TOPLEVEL_H_
diff --git a/chromium/ui/ozone/platform/wayland/test/test_zcr_text_input_extension.h b/chromium/ui/ozone/platform/wayland/test/test_zcr_text_input_extension.h
index c0eff201f77..9f9b9b1ffd3 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_zcr_text_input_extension.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_zcr_text_input_extension.h
@@ -7,6 +7,7 @@
#include <text-input-extension-unstable-v1-server-protocol.h>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/test/global_object.h"
namespace wl {
@@ -33,7 +34,7 @@ class TestZcrTextInputExtensionV1 : public GlobalObject {
}
private:
- MockZcrExtendedTextInput* extended_text_input_;
+ raw_ptr<MockZcrExtendedTextInput> extended_text_input_;
};
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/test_zwp_linux_buffer_params.h b/chromium/ui/ozone/platform/wayland/test/test_zwp_linux_buffer_params.h
index bd518fee56d..40829b78ab6 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_zwp_linux_buffer_params.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_zwp_linux_buffer_params.h
@@ -8,6 +8,7 @@
#include <linux-dmabuf-unstable-v1-server-protocol.h>
#include "base/files/scoped_file.h"
+#include "base/memory/raw_ptr.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "ui/ozone/platform/wayland/test/server_object.h"
@@ -70,11 +71,11 @@ class TestZwpLinuxBufferParamsV1 : public ServerObject {
// Non-owned pointer to the linux dmabuf object, which created this params
// resource and holds a pointer to it. On destruction, must notify it about
// going out of scope.
- MockZwpLinuxDmabufV1* linux_dmabuf_ = nullptr;
+ raw_ptr<MockZwpLinuxDmabufV1> linux_dmabuf_ = nullptr;
// A buffer resource, which is created on Create or CreateImmed call. Can be
// null if not created/failed to be created.
- wl_resource* buffer_resource_ = nullptr;
+ raw_ptr<wl_resource> buffer_resource_ = nullptr;
};
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/test_zwp_linux_explicit_synchronization.h b/chromium/ui/ozone/platform/wayland/test/test_zwp_linux_explicit_synchronization.h
index 4b817fa76d8..f4fe0af4976 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_zwp_linux_explicit_synchronization.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_zwp_linux_explicit_synchronization.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_ZWP_LINUX_EXPLICIT_SYNCHRONIZATION_H_
#define UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_ZWP_LINUX_EXPLICIT_SYNCHRONIZATION_H_
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/test/global_object.h"
#include "ui/ozone/platform/wayland/test/server_object.h"
@@ -20,7 +21,7 @@ class TestLinuxSurfaceSynchronization : public ServerObject {
wl_resource* surface_resource() const { return surface_resource_; }
private:
- wl_resource* surface_resource_;
+ raw_ptr<wl_resource> surface_resource_;
};
// Manage wl_viewporter object.
diff --git a/chromium/ui/ozone/platform/wayland/test/test_zwp_text_input_manager.h b/chromium/ui/ozone/platform/wayland/test/test_zwp_text_input_manager.h
index 44cbdd1129b..4a04634cdfb 100644
--- a/chromium/ui/ozone/platform/wayland/test/test_zwp_text_input_manager.h
+++ b/chromium/ui/ozone/platform/wayland/test/test_zwp_text_input_manager.h
@@ -7,6 +7,7 @@
#include <text-input-unstable-v1-server-protocol.h>
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/test/global_object.h"
namespace wl {
@@ -33,7 +34,7 @@ class TestZwpTextInputManagerV1 : public GlobalObject {
MockZwpTextInput* text_input() const { return text_input_; }
private:
- MockZwpTextInput* text_input_;
+ raw_ptr<MockZwpTextInput> text_input_;
};
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/wayland_drag_drop_test.cc b/chromium/ui/ozone/platform/wayland/test/wayland_drag_drop_test.cc
index 9c1397c0bc1..e1c390ffebc 100644
--- a/chromium/ui/ozone/platform/wayland/test/wayland_drag_drop_test.cc
+++ b/chromium/ui/ozone/platform/wayland/test/wayland_drag_drop_test.cc
@@ -71,6 +71,7 @@ void WaylandDragDropTest::SendPointerEnter(
window->root_surface()->GetSurfaceId());
wl_pointer_send_enter(pointer_->resource(), NextSerial(), surface->resource(),
0, 0);
+ wl_pointer_send_frame(pointer_->resource());
}
void WaylandDragDropTest::SendPointerLeave(
@@ -80,6 +81,7 @@ void WaylandDragDropTest::SendPointerLeave(
window->root_surface()->GetSurfaceId());
wl_pointer_send_leave(pointer_->resource(), NextSerial(),
surface->resource());
+ wl_pointer_send_frame(pointer_->resource());
}
void WaylandDragDropTest::SendPointerButton(
diff --git a/chromium/ui/ozone/platform/wayland/test/wayland_drag_drop_test.h b/chromium/ui/ozone/platform/wayland/test/wayland_drag_drop_test.h
index eaf4c633886..460068e06f9 100644
--- a/chromium/ui/ozone/platform/wayland/test/wayland_drag_drop_test.h
+++ b/chromium/ui/ozone/platform/wayland/test/wayland_drag_drop_test.h
@@ -8,6 +8,7 @@
#include <cstdint>
#include "base/callback_forward.h"
+#include "base/memory/raw_ptr.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "ui/ozone/platform/wayland/test/test_data_device.h"
#include "ui/ozone/platform/wayland/test/test_data_source.h"
@@ -92,10 +93,10 @@ class WaylandDragDropTest : public WaylandTest,
}
// Server objects
- wl::TestDataDeviceManager* data_device_manager_;
- wl::TestDataSource* data_source_;
- wl::MockPointer* pointer_;
- wl::TestTouch* touch_;
+ raw_ptr<wl::TestDataDeviceManager> data_device_manager_;
+ raw_ptr<wl::TestDataSource> data_source_;
+ raw_ptr<wl::MockPointer> pointer_;
+ raw_ptr<wl::TestTouch> touch_;
uint32_t current_serial_;
};
diff --git a/chromium/ui/ozone/platform/wayland/test/wayland_ozone_ui_controls_test_helper.cc b/chromium/ui/ozone/platform/wayland/test/wayland_ozone_ui_controls_test_helper.cc
index 90a26c0bd89..5fb61caf255 100644
--- a/chromium/ui/ozone/platform/wayland/test/wayland_ozone_ui_controls_test_helper.cc
+++ b/chromium/ui/ozone/platform/wayland/test/wayland_ozone_ui_controls_test_helper.cc
@@ -3,9 +3,11 @@
// found in the LICENSE file.
#include "ui/ozone/platform/wayland/test/wayland_ozone_ui_controls_test_helper.h"
+#include "base/memory/raw_ptr.h"
#include <linux/input.h>
+#include "base/run_loop.h"
#include "base/threading/thread_task_runner_handle.h"
#include "ui/events/keycodes/dom/keycode_converter.h"
#include "ui/events/keycodes/keyboard_code_conversion.h"
@@ -28,39 +30,14 @@ class WaylandGlobalEventWaiter : public WaylandInputEmulate::Observer {
kMotion,
kButton,
kKey,
+ kTouch,
kUnknown,
};
- static WaylandGlobalEventWaiter* Create(WaylandEventType event_type,
- int button,
- bool pressed,
- base::OnceClosure closure,
- WaylandInputEmulate* emulate) {
- DCHECK_NE(event_type, WaylandEventType::kUnknown);
- return closure.is_null()
- ? nullptr
- : new WaylandGlobalEventWaiter(event_type, button, pressed,
- std::move(closure), emulate);
- }
-
- static WaylandGlobalEventWaiter* Create(WaylandEventType event_type,
- const gfx::Point& screen_point,
- base::OnceClosure closure,
- WaylandInputEmulate* emulate) {
- DCHECK_NE(event_type, WaylandEventType::kUnknown);
- return closure.is_null()
- ? nullptr
- : new WaylandGlobalEventWaiter(event_type, screen_point,
- std::move(closure), emulate);
- }
-
- private:
WaylandGlobalEventWaiter(WaylandEventType event_type,
const gfx::Point& screen_point,
- base::OnceClosure closure,
WaylandInputEmulate* emulate)
: event_type_(event_type),
- closure_(std::move(closure)),
emulate_(emulate),
screen_point_(screen_point) {
Initialize();
@@ -69,57 +46,94 @@ class WaylandGlobalEventWaiter : public WaylandInputEmulate::Observer {
WaylandGlobalEventWaiter(WaylandEventType event_type,
int button,
bool pressed,
- base::OnceClosure closure,
WaylandInputEmulate* emulate)
: event_type_(event_type),
- closure_(std::move(closure)),
emulate_(emulate),
button_or_key_(button),
pressed_(pressed) {
Initialize();
}
+ ~WaylandGlobalEventWaiter() override = default;
+
+ // This method assumes that a request has already been queued, with metadata
+ // for the expected response stored on the WaylandGlobalEventWaiter. This:
+ // * Flushes queued requests.
+ // * Spins a nested run loop waiting for the expected response (event).
+ // * When the event is received, synchronously flushes all pending
+ // requests and events via wl_display_roundtrip_queue. See
+ // https://crbug.com/1336706#c11 for why this is necessary.
+ // * Dispatches the QuitClosure to avoid re-entrancy.
+ void Wait() {
+ // There's no guarantee that a flush has been scheduled. Given that we're
+ // waiting for a response, we must manually flush.
+ wl::WaylandProxy::GetInstance()->FlushForTesting();
+
+ // We disallow nestable tasks as that can result in re-entrancy if the test
+ // is listening for side-effects from a wayland-event and then calls
+ // PostTask. By using a non-nestable run loop we are relying on the
+ // assumption that the ozone-wayland implementation does not rely on
+ // PostTask.
+ base::RunLoop run_loop;
+
+ // This will be invoked causing the run-loop to quit once the expected event
+ // is received.
+ quit_closure_ = run_loop.QuitClosure();
+ run_loop.Run();
+ }
- ~WaylandGlobalEventWaiter() override { emulate_->RemoveObserver(this); }
-
+ private:
void Initialize() {
DCHECK_NE(event_type_, WaylandEventType::kUnknown);
- DCHECK(!closure_.is_null());
emulate_->AddObserver(this);
}
void OnPointerMotionGlobal(const gfx::Point& screen_position) override {
if (event_type_ == WaylandEventType::kMotion) {
- ExecuteClosure();
+ QuitRunLoop();
}
}
void OnPointerButtonGlobal(int32_t button, bool pressed) override {
if (event_type_ == WaylandEventType::kButton && button_or_key_ == button &&
pressed == pressed_) {
- ExecuteClosure();
+ QuitRunLoop();
}
}
void OnKeyboardKey(int32_t key, bool pressed) override {
if (event_type_ == WaylandEventType::kKey && button_or_key_ == key &&
pressed == pressed_) {
- ExecuteClosure();
+ QuitRunLoop();
}
}
- void ExecuteClosure() {
- DCHECK(!closure_.is_null());
- base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
- std::move(closure_));
- delete this;
+ void OnTouchReceived(const gfx::Point& screen_position) override {
+ if (event_type_ == WaylandEventType::kTouch) {
+ QuitRunLoop();
+ }
+ }
+
+ void QuitRunLoop() {
+ // Immediately remove the observer so that no further callbacks are posted.
+ emulate_->RemoveObserver(this);
+
+ // The weston-test protocol does not map cleanly onto ui controls semantics.
+ // We need to wait for a wayland round-trip to ensure that all side-effects
+ // have been processed. See https://crbug.com/1336706#c11 for details.
+ wl::WaylandProxy::GetInstance()->RoundTripQueue();
+
+ // We're in a nested run-loop that doesn't support re-entrancy. Directly
+ // invoke the quit closure.
+ std::move(quit_closure_).Run();
}
// Expected event type.
WaylandEventType event_type_ = WaylandEventType::kUnknown;
- base::OnceClosure closure_;
+ // Internal closure used to quit the nested run loop.
+ base::RepeatingClosure quit_closure_;
- WaylandInputEmulate* const emulate_;
+ const raw_ptr<WaylandInputEmulate> emulate_;
// Expected pointer location on screen.
gfx::Point screen_point_;
@@ -159,13 +173,20 @@ void WaylandOzoneUIControlsTestHelper::SendKeyPressEvent(
void WaylandOzoneUIControlsTestHelper::SendMouseMotionNotifyEvent(
gfx::AcceleratedWidget widget,
const gfx::Point& mouse_loc,
- const gfx::Point& mouse_root_loc,
+ const gfx::Point& mouse_screen_loc_in_px,
base::OnceClosure closure) {
- WaylandGlobalEventWaiter::Create(
+ WaylandGlobalEventWaiter waiter(
WaylandGlobalEventWaiter::WaylandEventType::kMotion, mouse_loc,
- std::move(closure), input_emulate_.get());
+ input_emulate_.get());
+ input_emulate_->EmulatePointerMotion(widget, mouse_loc,
+ mouse_screen_loc_in_px);
+ waiter.Wait();
- input_emulate_->EmulatePointerMotion(widget, mouse_loc);
+ if (!closure.is_null()) {
+ // PostTask to avoid re-entrancy.
+ base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+ std::move(closure));
+ }
}
void WaylandOzoneUIControlsTestHelper::SendMouseEvent(
@@ -174,7 +195,7 @@ void WaylandOzoneUIControlsTestHelper::SendMouseEvent(
int button_state,
int accelerator_state,
const gfx::Point& mouse_loc,
- const gfx::Point& mouse_root_loc,
+ const gfx::Point& mouse_screen_loc_in_px,
base::OnceClosure closure) {
uint32_t changed_button = 0;
switch (type) {
@@ -191,6 +212,8 @@ void WaylandOzoneUIControlsTestHelper::SendMouseEvent(
NOTREACHED();
}
+ SendMouseMotionNotifyEvent(widget, mouse_loc, mouse_screen_loc_in_px, {});
+
// Press accelerator keys.
if (accelerator_state) {
SendKeyPressInternal(widget, ui::KeyboardCode::VKEY_UNKNOWN,
@@ -200,21 +223,23 @@ void WaylandOzoneUIControlsTestHelper::SendMouseEvent(
accelerator_state & ui_controls::kCommand, {}, true);
}
- SendMouseMotionNotifyEvent(widget, mouse_loc, mouse_root_loc, {});
-
- WaylandGlobalEventWaiter::Create(
- WaylandGlobalEventWaiter::WaylandEventType::kButton, changed_button,
- button_state & DOWN, std::move(closure), input_emulate_.get());
-
if (button_state & DOWN) {
+ WaylandGlobalEventWaiter waiter(
+ WaylandGlobalEventWaiter::WaylandEventType::kButton, changed_button,
+ /*pressed=*/true, input_emulate_.get());
input_emulate_->EmulatePointerButton(
widget, ui::EventType::ET_MOUSE_PRESSED, changed_button);
button_down_mask_ |= changed_button;
+ waiter.Wait();
}
if (button_state & UP) {
+ WaylandGlobalEventWaiter waiter(
+ WaylandGlobalEventWaiter::WaylandEventType::kButton, changed_button,
+ /*pressed=*/false, input_emulate_.get());
input_emulate_->EmulatePointerButton(
widget, ui::EventType::ET_MOUSE_RELEASED, changed_button);
button_down_mask_ = (button_down_mask_ | changed_button) ^ changed_button;
+ waiter.Wait();
}
// Depress accelerator keys.
@@ -225,8 +250,47 @@ void WaylandOzoneUIControlsTestHelper::SendMouseEvent(
accelerator_state & ui_controls::kAlt,
accelerator_state & ui_controls::kCommand, {}, false);
}
+ if (!closure.is_null()) {
+ // PostTask to avoid re-entrancy.
+ base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+ std::move(closure));
+ }
}
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+void WaylandOzoneUIControlsTestHelper::SendTouchEvent(
+ gfx::AcceleratedWidget widget,
+ int action,
+ int id,
+ const gfx::Point& touch_loc,
+ base::OnceClosure closure) {
+ // TODO(rivr): ui_controls::TouchType is a bitmask, do we need to handle the
+ // case where multiple actions are requested together?
+ ui::EventType event_type;
+ switch (action) {
+ case ui_controls::PRESS:
+ event_type = ui::EventType::ET_TOUCH_PRESSED;
+ break;
+ case ui_controls::RELEASE:
+ event_type = ui::EventType::ET_TOUCH_RELEASED;
+ break;
+ default:
+ event_type = ui::EventType::ET_TOUCH_MOVED;
+ }
+
+ WaylandGlobalEventWaiter waiter(
+ WaylandGlobalEventWaiter::WaylandEventType::kTouch, touch_loc,
+ input_emulate_.get());
+ input_emulate_->EmulateTouch(widget, event_type, id, touch_loc);
+ waiter.Wait();
+ if (!closure.is_null()) {
+ // PostTask to avoid re-entrancy.
+ base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+ std::move(closure));
+ }
+}
+#endif
+
void WaylandOzoneUIControlsTestHelper::RunClosureAfterAllPendingUIEvents(
base::OnceClosure closure) {
NOTREACHED();
@@ -247,39 +311,45 @@ void WaylandOzoneUIControlsTestHelper::SendKeyPressInternal(
bool press_key) {
auto dom_code = UsLayoutKeyboardCodeToDomCode(key);
- WaylandGlobalEventWaiter::Create(
- WaylandGlobalEventWaiter::WaylandEventType::kKey,
- ui::KeycodeConverter::DomCodeToEvdevCode(dom_code), press_key,
- std::move(closure), input_emulate_.get());
-
if (press_key) {
- if (control)
+ if (control) {
DispatchKeyPress(widget, ui::EventType::ET_KEY_PRESSED,
ui::DomCode::CONTROL_LEFT);
+ }
- if (shift)
+ if (shift) {
DispatchKeyPress(widget, ui::EventType::ET_KEY_PRESSED,
ui::DomCode::SHIFT_LEFT);
+ }
- if (alt)
+ if (alt) {
DispatchKeyPress(widget, ui::EventType::ET_KEY_PRESSED,
ui::DomCode::ALT_LEFT);
+ }
DispatchKeyPress(widget, ui::EventType::ET_KEY_PRESSED, dom_code);
} else {
DispatchKeyPress(widget, ui::EventType::ET_KEY_RELEASED, dom_code);
- if (alt)
- DispatchKeyPress(widget, ui::EventType::ET_KEY_RELEASED,
+ if (alt) {
+ DispatchKeyPress(/*widget=*/0, ui::EventType::ET_KEY_RELEASED,
ui::DomCode::ALT_LEFT);
+ }
- if (shift)
- DispatchKeyPress(widget, ui::EventType::ET_KEY_RELEASED,
+ if (shift) {
+ DispatchKeyPress(/*widget=*/0, ui::EventType::ET_KEY_RELEASED,
ui::DomCode::SHIFT_LEFT);
+ }
- if (control)
- DispatchKeyPress(widget, ui::EventType::ET_KEY_RELEASED,
+ if (control) {
+ DispatchKeyPress(/*widget=*/0, ui::EventType::ET_KEY_RELEASED,
ui::DomCode::CONTROL_LEFT);
+ }
+ }
+ if (!closure.is_null()) {
+ // PostTask to avoid re-entrancy.
+ base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+ std::move(closure));
}
}
@@ -287,7 +357,13 @@ void WaylandOzoneUIControlsTestHelper::DispatchKeyPress(
gfx::AcceleratedWidget widget,
ui::EventType event_type,
ui::DomCode dom_code) {
+ WaylandGlobalEventWaiter waiter(
+ WaylandGlobalEventWaiter::WaylandEventType::kKey,
+ ui::KeycodeConverter::DomCodeToEvdevCode(dom_code),
+ /*press_key=*/event_type == ui::EventType::ET_KEY_PRESSED,
+ input_emulate_.get());
input_emulate_->EmulateKeyboardKey(widget, event_type, dom_code);
+ waiter.Wait();
}
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/test/wayland_ozone_ui_controls_test_helper.h b/chromium/ui/ozone/platform/wayland/test/wayland_ozone_ui_controls_test_helper.h
index e89aff57835..2264adf1196 100644
--- a/chromium/ui/ozone/platform/wayland/test/wayland_ozone_ui_controls_test_helper.h
+++ b/chromium/ui/ozone/platform/wayland/test/wayland_ozone_ui_controls_test_helper.h
@@ -41,6 +41,13 @@ class WaylandOzoneUIControlsTestHelper : public ui::OzoneUIControlsTestHelper {
const gfx::Point& mouse_loc,
const gfx::Point& mouse_root_loc,
base::OnceClosure closure) override;
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+ void SendTouchEvent(gfx::AcceleratedWidget widget,
+ int action,
+ int id,
+ const gfx::Point& touch_loc,
+ base::OnceClosure closure) override;
+#endif
void RunClosureAfterAllPendingUIEvents(base::OnceClosure closure) override;
bool MustUseUiControlsForMoveCursorTo() override;
diff --git a/chromium/ui/ozone/platform/wayland/test/wayland_test.cc b/chromium/ui/ozone/platform/wayland/test/wayland_test.cc
index ef738bf62b8..bf061055f76 100644
--- a/chromium/ui/ozone/platform/wayland/test/wayland_test.cc
+++ b/chromium/ui/ozone/platform/wayland/test/wayland_test.cc
@@ -50,6 +50,9 @@ WaylandTest::WaylandTest()
WaylandTest::~WaylandTest() {}
void WaylandTest::SetUp() {
+ disabled_features_.push_back(ui::kWaylandSurfaceSubmissionInPixelCoordinates);
+ disabled_features_.push_back(features::kWaylandScreenCoordinatesEnabled);
+
feature_list_.InitWithFeatures(enabled_features_, disabled_features_);
if (DeviceDataManager::HasInstance()) {
@@ -115,11 +118,20 @@ void WaylandTest::Sync() {
server_.Pause();
}
+void WaylandTest::SetPointerFocusedWindow(WaylandWindow* window) {
+ connection_->wayland_window_manager()->SetPointerFocusedWindow(window);
+}
+
+void WaylandTest::SetKeyboardFocusedWindow(WaylandWindow* window) {
+ connection_->wayland_window_manager()->SetKeyboardFocusedWindow(window);
+}
+
void WaylandTest::SendConfigureEvent(wl::MockXdgSurface* xdg_surface,
- int width,
- int height,
+ const gfx::Size& size,
uint32_t serial,
struct wl_array* states) {
+ const int32_t width = size.width();
+ const int32_t height = size.height();
// In xdg_shell_v6+, both surfaces send serial configure event and toplevel
// surfaces send other data like states, heights and widths.
// Please note that toplevel surfaces may not exist if the surface was created
@@ -128,12 +140,20 @@ void WaylandTest::SendConfigureEvent(wl::MockXdgSurface* xdg_surface,
if (xdg_surface->xdg_toplevel()) {
zxdg_toplevel_v6_send_configure(xdg_surface->xdg_toplevel()->resource(),
width, height, states);
+ } else {
+ ASSERT_TRUE(xdg_surface->xdg_popup()->resource());
+ zxdg_popup_v6_send_configure(xdg_surface->xdg_popup()->resource(), 0, 0,
+ width, height);
}
zxdg_surface_v6_send_configure(xdg_surface->resource(), serial);
} else {
if (xdg_surface->xdg_toplevel()) {
xdg_toplevel_send_configure(xdg_surface->xdg_toplevel()->resource(),
width, height, states);
+ } else {
+ ASSERT_TRUE(xdg_surface->xdg_popup()->resource());
+ xdg_popup_send_configure(xdg_surface->xdg_popup()->resource(), 0, 0,
+ width, height);
}
xdg_surface_send_configure(xdg_surface->resource(), serial);
}
@@ -141,7 +161,7 @@ void WaylandTest::SendConfigureEvent(wl::MockXdgSurface* xdg_surface,
void WaylandTest::ActivateSurface(wl::MockXdgSurface* xdg_surface) {
wl::ScopedWlArray state({XDG_TOPLEVEL_STATE_ACTIVATED});
- SendConfigureEvent(xdg_surface, 0, 0, 1, state.get());
+ SendConfigureEvent(xdg_surface, {0, 0}, 1, state.get());
}
void WaylandTest::InitializeSurfaceAugmenter() {
diff --git a/chromium/ui/ozone/platform/wayland/test/wayland_test.h b/chromium/ui/ozone/platform/wayland/test/wayland_test.h
index a27417c19b9..cb7ee9fceab 100644
--- a/chromium/ui/ozone/platform/wayland/test/wayland_test.h
+++ b/chromium/ui/ozone/platform/wayland/test/wayland_test.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -51,10 +52,12 @@ class WaylandTest : public ::testing::TestWithParam<wl::ServerConfig> {
void Sync();
protected:
+ void SetPointerFocusedWindow(WaylandWindow* window);
+ void SetKeyboardFocusedWindow(WaylandWindow* window);
+
// Sends configure event for the |xdg_surface|.
void SendConfigureEvent(wl::MockXdgSurface* xdg_surface,
- int width,
- int height,
+ const gfx::Size& size,
uint32_t serial,
struct wl_array* states);
@@ -69,7 +72,7 @@ class WaylandTest : public ::testing::TestWithParam<wl::ServerConfig> {
base::test::TaskEnvironment task_environment_;
wl::TestWaylandServerThread server_;
- wl::MockSurface* surface_;
+ raw_ptr<wl::MockSurface> surface_;
MockWaylandPlatformWindowDelegate delegate_;
std::unique_ptr<ScopedKeyboardLayoutEngine> scoped_keyboard_layout_engine_;
diff --git a/chromium/ui/ozone/platform/wayland/wayland_buffer_manager_unittest.cc b/chromium/ui/ozone/platform/wayland/wayland_buffer_manager_unittest.cc
index 2d5b889f437..58804a06caf 100644
--- a/chromium/ui/ozone/platform/wayland/wayland_buffer_manager_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/wayland_buffer_manager_unittest.cc
@@ -10,10 +10,12 @@
#include "base/files/file_path.h"
#include "base/files/file_util.h"
+#include "base/memory/raw_ptr.h"
#include "base/test/mock_callback.h"
#include "mojo/public/cpp/system/platform_handle.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/rect_conversions.h"
#include "ui/gfx/geometry/rect_f.h"
#include "ui/gfx/geometry/rounded_corners_f.h"
@@ -26,6 +28,7 @@
#include "ui/ozone/platform/wayland/common/wayland_overlay_config.h"
#include "ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.h"
#include "ui/ozone/platform/wayland/gpu/wayland_surface_gpu.h"
+#include "ui/ozone/platform/wayland/host/wayland_buffer_factory.h"
#include "ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
#include "ui/ozone/platform/wayland/host/wayland_subsurface.h"
@@ -36,6 +39,7 @@
#include "ui/ozone/platform/wayland/test/test_overlay_prioritized_surface.h"
#include "ui/ozone/platform/wayland/test/test_zwp_linux_buffer_params.h"
#include "ui/ozone/platform/wayland/test/wayland_test.h"
+#include "ui/platform_window/platform_window_init_properties.h"
using testing::_;
using testing::Truly;
@@ -89,7 +93,7 @@ class MockSurfaceGpu : public WaylandSurfaceGpu {
const gfx::PresentationFeedback& feedback));
private:
- WaylandBufferManagerGpu* const buffer_manager_;
+ const raw_ptr<WaylandBufferManagerGpu> buffer_manager_;
const gfx::AcceleratedWidget widget_;
};
@@ -118,8 +122,8 @@ class WaylandBufferManagerTest : public WaylandTest {
false,
kAugmentedSurfaceNotSupportedVersion);
- window_->set_update_visual_size_immediately(false);
- window_->set_apply_pending_state_on_update_visual_size(false);
+ window_->set_update_visual_size_immediately_for_testing(false);
+ window_->set_apply_pending_state_on_update_visual_size_for_testing(false);
}
protected:
@@ -147,22 +151,23 @@ class WaylandBufferManagerTest : public WaylandTest {
} else {
EXPECT_CALL(*callback, Run(_))
.Times(1)
- .WillRepeatedly(::testing::Invoke([this, callback](
- std::string error_string) {
- channel_destroyed_error_message_ = error_string;
-
- manager_host_->OnChannelDestroyed();
-
- manager_host_->SetTerminateGpuCallback(callback->Get());
-
- auto interface_ptr = manager_host_->BindInterface();
- // Recreate the gpu side manager (the production code does the
- // same).
- buffer_manager_gpu_ = std::make_unique<WaylandBufferManagerGpu>();
- buffer_manager_gpu_->Initialize(
- std::move(interface_ptr), {}, false, true, false,
- kAugmentedSurfaceNotSupportedVersion);
- }));
+ .WillRepeatedly(
+ ::testing::Invoke([this, callback](std::string error_string) {
+ channel_destroyed_error_message_ = error_string;
+
+ manager_host_->OnChannelDestroyed();
+
+ manager_host_->SetTerminateGpuCallback(callback->Get());
+
+ auto interface_ptr = manager_host_->BindInterface();
+ // Recreate the gpu side manager (the production code does the
+ // same).
+ buffer_manager_gpu_ =
+ std::make_unique<WaylandBufferManagerGpu>();
+ buffer_manager_gpu_->Initialize(
+ std::move(interface_ptr), {}, false, true, false,
+ kAugmentedSurfaceNotSupportedVersion);
+ }));
}
}
@@ -265,7 +270,7 @@ class WaylandBufferManagerTest : public WaylandTest {
}
MockTerminateGpuCallback callback_;
- WaylandBufferManagerHost* manager_host_;
+ raw_ptr<WaylandBufferManagerHost> manager_host_;
// Error message that is received when the manager_host destroys the channel.
std::string channel_destroyed_error_message_;
};
@@ -299,7 +304,8 @@ TEST_P(WaylandBufferManagerTest, VerifyModifiers) {
Sync();
- auto buffer_formats = connection_->zwp_dmabuf()->supported_buffer_formats();
+ auto buffer_formats =
+ connection_->wayland_buffer_factory()->GetSupportedBufferFormats();
DCHECK_EQ(buffer_formats.size(), 1u);
DCHECK_EQ(buffer_formats.begin()->first,
GetBufferFormatFromFourCCFormat(kFourccFormatR8));
@@ -398,7 +404,7 @@ TEST_P(WaylandBufferManagerTest, CreateAndDestroyBuffer) {
buffer_manager_gpu_->CommitBuffer(
widget, kBufferId1, kBufferId1, window_->GetBoundsInPixels(),
- kDefaultScale, window_->GetBoundsInPixels());
+ gfx::RoundedCornersF(), kDefaultScale, gfx::Rect(window_->size_px()));
CreateDmabufBasedBufferAndSetTerminateExpectation(true /*fail*/,
kBufferId1);
@@ -421,7 +427,7 @@ TEST_P(WaylandBufferManagerTest, CreateAndDestroyBuffer) {
buffer_manager_gpu_->CommitBuffer(
widget, kBufferId1, kBufferId1, window_->GetBoundsInPixels(),
- kDefaultScale, window_->GetBoundsInPixels());
+ gfx::RoundedCornersF(), kDefaultScale, gfx::Rect(window_->size_px()));
DestroyBufferAndSetTerminateExpectation(kBufferId1, false /*fail*/);
}
@@ -443,7 +449,7 @@ TEST_P(WaylandBufferManagerTest, CreateAndDestroyBuffer) {
// Attach to a surface.
buffer_manager_gpu_->CommitBuffer(
widget, kBufferId1, kBufferId1, window_->GetBoundsInPixels(),
- kDefaultScale, window_->GetBoundsInPixels());
+ gfx::RoundedCornersF(), kDefaultScale, gfx::Rect(window_->size_px()));
// Created non-attached buffer as well.
CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/,
@@ -482,9 +488,9 @@ TEST_P(WaylandBufferManagerTest, CommitBufferNonExistingBufferId) {
EXPECT_CALL(*mock_surface, Frame(_)).Times(kNumberOfCommits);
EXPECT_CALL(*mock_surface, Commit()).Times(kNumberOfCommits);
- buffer_manager_gpu_->CommitBuffer(window_->GetWidget(), 1u, 5u,
- window_->GetBoundsInPixels(), kDefaultScale,
- window_->GetBoundsInPixels());
+ buffer_manager_gpu_->CommitBuffer(
+ window_->GetWidget(), 1u, 5u, window_->GetBoundsInPixels(),
+ gfx::RoundedCornersF(), kDefaultScale, gfx::Rect(window_->size_px()));
Sync();
}
@@ -549,9 +555,9 @@ TEST_P(WaylandBufferManagerTest, CommitBufferNullWidget) {
// Can't commit for non-existing widget.
SetTerminateCallbackExpectationAndDestroyChannel(&callback_, true /*fail*/);
- buffer_manager_gpu_->CommitBuffer(gfx::kNullAcceleratedWidget, 1u, kBufferId,
- window_->GetBoundsInPixels(), kDefaultScale,
- window_->GetBoundsInPixels());
+ buffer_manager_gpu_->CommitBuffer(
+ gfx::kNullAcceleratedWidget, 1u, kBufferId, window_->GetBoundsInPixels(),
+ gfx::RoundedCornersF(), kDefaultScale, gfx::Rect(window_->size_px()));
Sync();
}
@@ -594,7 +600,7 @@ TEST_P(WaylandBufferManagerTest, EnsureCorrectOrderOfCallbacks) {
const gfx::AcceleratedWidget widget = window_->GetWidget();
const gfx::Rect bounds = gfx::Rect({0, 0}, kDefaultSize);
- window_->SetBoundsInPixels(bounds);
+ window_->SetBoundsInDIP(bounds);
MockSurfaceGpu mock_surface_gpu(buffer_manager_gpu_.get(), widget_);
@@ -627,7 +633,8 @@ TEST_P(WaylandBufferManagerTest, EnsureCorrectOrderOfCallbacks) {
EXPECT_CALL(mock_surface_gpu, OnPresentation(kBufferId1, _)).Times(1);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
@@ -639,7 +646,8 @@ TEST_P(WaylandBufferManagerTest, EnsureCorrectOrderOfCallbacks) {
// Commit second buffer now.
buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
@@ -669,7 +677,8 @@ TEST_P(WaylandBufferManagerTest, EnsureCorrectOrderOfCallbacks) {
// Commit second buffer now.
buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
@@ -706,7 +715,7 @@ TEST_P(WaylandBufferManagerTest,
const gfx::AcceleratedWidget widget = window_->GetWidget();
const gfx::Rect bounds = gfx::Rect({0, 0}, kDefaultSize);
- window_->SetBoundsInPixels(bounds);
+ window_->SetBoundsInDIP(bounds);
MockSurfaceGpu mock_surface_gpu(buffer_manager_gpu_.get(), widget_);
@@ -747,7 +756,8 @@ TEST_P(WaylandBufferManagerTest,
OnSubmission(kBufferId1, gfx::SwapResult::SWAP_ACK, _))
.Times(1);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
mock_surface->SendFrameCallback();
Sync();
@@ -757,7 +767,8 @@ TEST_P(WaylandBufferManagerTest,
// Commit second buffer now.
buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
mock_surface->SendFrameCallback();
Sync();
@@ -779,7 +790,8 @@ TEST_P(WaylandBufferManagerTest,
// not call OnPresentation as OnSubmission hasn't been called yet.
EXPECT_CALL(mock_surface_gpu, OnPresentation(_, _)).Times(0);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId3, kBufferId3, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
mock_surface->SendFrameCallback();
mock_wp_presentation->SendPresentationCallback();
Sync();
@@ -830,7 +842,7 @@ TEST_P(WaylandBufferManagerTest,
const gfx::AcceleratedWidget widget = window_->GetWidget();
const gfx::Rect bounds = gfx::Rect({0, 0}, kDefaultSize);
- window_->SetBoundsInPixels(bounds);
+ window_->SetBoundsInDIP(bounds);
MockSurfaceGpu mock_surface_gpu(buffer_manager_gpu_.get(), widget_);
@@ -862,7 +874,8 @@ TEST_P(WaylandBufferManagerTest,
// Commit first buffer
buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
@@ -881,7 +894,8 @@ TEST_P(WaylandBufferManagerTest,
// Commit second buffer
buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
@@ -902,7 +916,8 @@ TEST_P(WaylandBufferManagerTest,
// Commit third buffer
buffer_manager_gpu_->CommitBuffer(widget, kBufferId3, kBufferId3, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
@@ -986,9 +1001,9 @@ TEST_P(WaylandBufferManagerTest, TestCommitBufferConditions) {
EXPECT_CALL(*mock_surface, Frame(_)).Times(0);
EXPECT_CALL(*mock_surface, Commit()).Times(0);
- buffer_manager_gpu_->CommitBuffer(widget, kDmabufBufferId, kDmabufBufferId,
- window_->GetBoundsInPixels(), kDefaultScale,
- window_->GetBoundsInPixels());
+ buffer_manager_gpu_->CommitBuffer(
+ widget, kDmabufBufferId, kDmabufBufferId, window_->GetBoundsInPixels(),
+ gfx::RoundedCornersF(), kDefaultScale, gfx::Rect(window_->size_px()));
Sync();
EXPECT_CALL(*mock_surface, Attach(_, _, _)).Times(1);
@@ -1020,9 +1035,9 @@ TEST_P(WaylandBufferManagerTest, TestCommitBufferConditions) {
EXPECT_CALL(*mock_surface, Frame(_)).Times(0);
EXPECT_CALL(*mock_surface, Commit()).Times(0);
- buffer_manager_gpu_->CommitBuffer(widget, kDmabufBufferId2, kDmabufBufferId2,
- window_->GetBoundsInPixels(), kDefaultScale,
- window_->GetBoundsInPixels());
+ buffer_manager_gpu_->CommitBuffer(
+ widget, kDmabufBufferId2, kDmabufBufferId2, window_->GetBoundsInPixels(),
+ gfx::RoundedCornersF(), kDefaultScale, gfx::Rect(window_->size_px()));
Sync();
@@ -1074,28 +1089,36 @@ TEST_P(WaylandBufferManagerTest, TestCommitBufferConditionsAckConfigured) {
Sync();
+ auto* xdg_surface = mock_surface->xdg_surface();
+ ASSERT_TRUE(xdg_surface);
+ ASSERT_FALSE(temp_window->IsSurfaceConfigured());
+
ProcessCreatedBufferResourcesWithExpectation(1u /* expected size */,
false /* fail */);
+ EXPECT_CALL(*xdg_surface, SetWindowGeometry(_)).Times(0);
+ EXPECT_CALL(*xdg_surface, AckConfigure(_)).Times(0);
EXPECT_CALL(*mock_surface, Attach(_, _, _)).Times(0);
EXPECT_CALL(*mock_surface, Frame(_)).Times(0);
EXPECT_CALL(*mock_surface, Commit()).Times(0);
buffer_manager_gpu_->CommitBuffer(
widget, kDmabufBufferId, kDmabufBufferId, window_->GetBoundsInPixels(),
- kDefaultScale, window_->GetBoundsInPixels());
+ gfx::RoundedCornersF(), kDefaultScale, window_->GetBoundsInPixels());
Sync();
+ testing::Mock::VerifyAndClearExpectations(mock_surface);
- DCHECK(mock_surface->xdg_surface());
- ActivateSurface(mock_surface->xdg_surface());
-
+ EXPECT_CALL(*xdg_surface, SetWindowGeometry(gfx::Rect(800, 600))).Times(1);
+ EXPECT_CALL(*xdg_surface, AckConfigure(_)).Times(1);
EXPECT_CALL(*mock_surface, Attach(_, _, _)).Times(1);
EXPECT_CALL(*mock_surface, Frame(_)).Times(1);
EXPECT_CALL(*mock_surface, Commit()).Times(1);
+ ActivateSurface(mock_surface->xdg_surface());
Sync();
+ testing::Mock::VerifyAndClearExpectations(mock_surface);
- window_->SetPointerFocus(false);
+ SetPointerFocusedWindow(nullptr);
temp_window.reset();
DestroyBufferAndSetTerminateExpectation(kDmabufBufferId, false /*fail*/);
@@ -1103,6 +1126,107 @@ TEST_P(WaylandBufferManagerTest, TestCommitBufferConditionsAckConfigured) {
}
}
+// Verifies toplevel surfaces do not have buffers attached until configured,
+// even when the initial configure sequence is not acked in response to
+// xdg_surface.configure event, i.e: done asynchronously when UpdateVisualSize()
+// is called by they FrameManager).
+//
+// Regression test for https://crbug.com/1313023.
+TEST_P(WaylandBufferManagerTest,
+ CommitBufferConditionsWithDeferredAckConfigure) {
+ constexpr gfx::Rect kNormalBounds{800, 800};
+ constexpr gfx::Rect kRestoredBounds{500, 500};
+ constexpr uint32_t kDmabufBufferId = 1;
+
+ testing::Mock::VerifyAndClearExpectations(&delegate_);
+ PlatformWindowInitProperties properties;
+ properties.type = PlatformWindowType::kWindow;
+ properties.bounds = kNormalBounds;
+ auto window = WaylandWindow::Create(&delegate_, connection_.get(),
+ std::move(properties));
+ ASSERT_TRUE(window);
+ ASSERT_NE(window->GetWidget(), gfx::kNullAcceleratedWidget);
+ auto widget = window->GetWidget();
+
+ // Set restored bounds to a value different from the initial window bounds in
+ // order to force WaylandWindow::ProcessPendingBoundsDip() to defer the very
+ // first configure ack to be done in the subsequent UpdateVisualSize() call.
+ window->SetRestoredBoundsInDIP(kRestoredBounds);
+
+ // Disable auto immediate visual size update (when, for example, calling into
+ // WaylandWindow::SetBoundsInPixels) so that we can emulate deferred call to
+ // WaylandToplevelWindow::UpdateVisualSize() with mismatching parameters, when
+ // processing initial frame sent by the GPU.
+ window->set_update_visual_size_immediately_for_testing(false);
+ window->set_apply_pending_state_on_update_visual_size_for_testing(false);
+
+ Sync();
+
+ gfx::Insets insets;
+ window->SetDecorationInsets(&insets);
+ window->Show(false);
+ Sync();
+
+ auto* mock_surface = server_.GetObject<wl::MockSurface>(
+ window->root_surface()->GetSurfaceId());
+ MockSurfaceGpu mock_surface_gpu(buffer_manager_gpu_.get(), widget);
+
+ auto* linux_dmabuf = server_.zwp_linux_dmabuf_v1();
+ EXPECT_CALL(*linux_dmabuf, CreateParams(_, _, _)).Times(1);
+
+ CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/,
+ kDmabufBufferId);
+
+ Sync();
+
+ auto* xdg_surface = mock_surface->xdg_surface();
+ ASSERT_TRUE(xdg_surface);
+ ASSERT_FALSE(window->IsSurfaceConfigured());
+
+ ProcessCreatedBufferResourcesWithExpectation(1u /* expected size */,
+ false /* fail */);
+
+ // Emulate the following steps:
+ //
+ // 1. A CommitBuffer request coming from the GPU service, with frame
+ // bounds that do not match the one stored in |pending_configures_| at Host
+ // side (filled when processing 0x0 initial configure sequence sent by the
+ // Wayland compositor.
+ // 2. The initial configure sequence (i.e: with 0x0 size which means the
+ // client must suggest the initial geometry of the surface.
+ // 3. And then a CommitBuffer with the expected bounds (ie: suggested to the
+ // Wayland compositor through a set_geometry/ack_configure sequence when
+ // processing (2).
+ //
+ // And ensures the xdg and wl_surface objects received the correct requests
+ // amount. I.e: No buffer attaches before setting geometry + acking initial
+ // configure sequence, etc.
+
+ EXPECT_CALL(*xdg_surface, SetWindowGeometry(kRestoredBounds)).Times(1);
+ EXPECT_CALL(*xdg_surface, AckConfigure(1)).Times(1);
+ EXPECT_CALL(*mock_surface, Attach(_, 0, 0)).Times(1);
+ EXPECT_CALL(*mock_surface, Frame(_)).Times(1);
+ EXPECT_CALL(*mock_surface, Commit()).Times(1);
+
+ buffer_manager_gpu_->CommitBuffer(widget, kDmabufBufferId, kDmabufBufferId,
+ gfx::Rect{55, 55}, gfx::RoundedCornersF(),
+ kDefaultScale, gfx::Rect{55, 55});
+ ActivateSurface(mock_surface->xdg_surface());
+
+ Sync();
+
+ buffer_manager_gpu_->CommitBuffer(widget, kDmabufBufferId, kDmabufBufferId,
+ kRestoredBounds, gfx::RoundedCornersF(),
+ kDefaultScale, kRestoredBounds);
+ Sync();
+
+ SetPointerFocusedWindow(nullptr);
+ window.reset();
+ DestroyBufferAndSetTerminateExpectation(kDmabufBufferId, false /*fail*/);
+
+ Sync();
+}
+
// The buffer that is not originally attached to any of the surfaces,
// must be attached when a commit request comes. Also, it must setup a buffer
// release listener and OnSubmission must be called for that buffer if it is
@@ -1114,7 +1238,7 @@ TEST_P(WaylandBufferManagerTest, AnonymousBufferAttachedAndReleased) {
const gfx::AcceleratedWidget widget = window_->GetWidget();
const gfx::Rect bounds = gfx::Rect({0, 0}, kDefaultSize);
- window_->SetBoundsInPixels(bounds);
+ window_->SetBoundsInDIP(bounds);
MockSurfaceGpu mock_surface_gpu(buffer_manager_gpu_.get(), widget_);
@@ -1144,7 +1268,8 @@ TEST_P(WaylandBufferManagerTest, AnonymousBufferAttachedAndReleased) {
// Commit second buffer now.
buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
@@ -1169,7 +1294,8 @@ TEST_P(WaylandBufferManagerTest, AnonymousBufferAttachedAndReleased) {
// Commit second buffer now.
buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
@@ -1194,7 +1320,8 @@ TEST_P(WaylandBufferManagerTest, AnonymousBufferAttachedAndReleased) {
EXPECT_CALL(mock_surface_gpu, OnPresentation(kBufferId3, _)).Times(0);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId3, kBufferId3, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
@@ -1232,7 +1359,7 @@ TEST_P(WaylandBufferManagerTest, DestroyBufferForDestroyedWindow) {
buffer_manager_gpu_->CommitBuffer(
widget, kBufferId, kBufferId, temp_window->GetBoundsInPixels(),
- kDefaultScale, temp_window->GetBoundsInPixels());
+ gfx::RoundedCornersF(), kDefaultScale, temp_window->GetBoundsInPixels());
Sync();
@@ -1265,7 +1392,8 @@ TEST_P(WaylandBufferManagerTest, DestroyedWindowNoSubmissionSingleBuffer) {
temp_window.reset();
buffer_manager_gpu_->CommitBuffer(widget, kBufferId, kBufferId, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
@@ -1307,7 +1435,8 @@ TEST_P(WaylandBufferManagerTest, DestroyedWindowNoSubmissionMultipleBuffers) {
EXPECT_CALL(mock_surface_gpu, OnPresentation(_, _)).Times(1);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
@@ -1328,7 +1457,8 @@ TEST_P(WaylandBufferManagerTest, DestroyedWindowNoSubmissionMultipleBuffers) {
EXPECT_CALL(mock_surface_gpu, OnPresentation(kBufferId2, _)).Times(1);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
@@ -1341,7 +1471,8 @@ TEST_P(WaylandBufferManagerTest, DestroyedWindowNoSubmissionMultipleBuffers) {
temp_window.reset();
buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
@@ -1378,7 +1509,8 @@ TEST_P(WaylandBufferManagerTest, DestroyBufferCommittedTwiceInARow) {
EXPECT_CALL(mock_surface_gpu, OnPresentation(kBufferId1, _)).Times(1);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
mock_surface->SendFrameCallback();
Sync();
testing::Mock::VerifyAndClearExpectations(&mock_surface_gpu);
@@ -1388,12 +1520,14 @@ TEST_P(WaylandBufferManagerTest, DestroyBufferCommittedTwiceInARow) {
EXPECT_CALL(mock_surface_gpu, OnPresentation(_, _)).Times(0);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
mock_surface->SendFrameCallback();
Sync();
buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
mock_surface->SendFrameCallback();
Sync();
@@ -1445,7 +1579,8 @@ TEST_P(WaylandBufferManagerTest, ReleaseBufferCommittedTwiceInARow) {
EXPECT_CALL(mock_surface_gpu, OnPresentation(kBufferId1, _)).Times(1);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
mock_surface->SendFrameCallback();
Sync();
testing::Mock::VerifyAndClearExpectations(&mock_surface_gpu);
@@ -1456,12 +1591,14 @@ TEST_P(WaylandBufferManagerTest, ReleaseBufferCommittedTwiceInARow) {
EXPECT_CALL(mock_surface_gpu, OnPresentation(_, _)).Times(0);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
mock_surface->SendFrameCallback();
Sync();
buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
mock_surface->SendFrameCallback();
Sync();
@@ -1513,7 +1650,8 @@ TEST_P(WaylandBufferManagerTest, ReleaseOrderDifferentToCommitOrder) {
EXPECT_CALL(*mock_surface, Attach(_, _, _)).Times(1);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
mock_surface->SendFrameCallback();
Sync();
testing::Mock::VerifyAndClearExpectations(&mock_surface_gpu);
@@ -1525,13 +1663,15 @@ TEST_P(WaylandBufferManagerTest, ReleaseOrderDifferentToCommitOrder) {
EXPECT_CALL(*mock_surface, Attach(_, _, _)).Times(2);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
mock_surface->SendFrameCallback();
Sync();
auto* wl_buffer2 = mock_surface->attached_buffer();
buffer_manager_gpu_->CommitBuffer(widget, kBufferId3, kBufferId3, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
mock_surface->SendFrameCallback();
Sync();
@@ -1602,7 +1742,8 @@ TEST_P(WaylandBufferManagerTest,
EXPECT_CALL(*mock_surface, Commit()).Times(1);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
@@ -1625,7 +1766,8 @@ TEST_P(WaylandBufferManagerTest,
// Commit second buffer now.
buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
@@ -1667,7 +1809,8 @@ TEST_P(WaylandBufferManagerTest,
// Commit second buffer now.
buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
@@ -1702,7 +1845,8 @@ TEST_P(WaylandBufferManagerTest,
EXPECT_CALL(*mock_surface, Commit()).Times(1);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
@@ -1752,7 +1896,8 @@ TEST_P(WaylandBufferManagerTest, OnSubmissionCalledForSingleBuffer) {
EXPECT_CALL(mock_surface_gpu, OnPresentation(kBufferId1, _)).Times(1);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
DestroyBufferAndSetTerminateExpectation(kBufferId1, false /*fail*/);
@@ -1830,7 +1975,7 @@ TEST_P(WaylandBufferManagerTest, FencedRelease) {
const gfx::AcceleratedWidget widget = window_->GetWidget();
const gfx::Rect bounds = gfx::Rect({0, 0}, kDefaultSize);
- window_->SetBoundsInPixels(bounds);
+ window_->SetBoundsInDIP(bounds);
MockSurfaceGpu mock_surface_gpu(buffer_manager_gpu_.get(), widget_);
@@ -1864,13 +2009,15 @@ TEST_P(WaylandBufferManagerTest, FencedRelease) {
Truly([](const auto& fence) { return fence.is_null(); })))
.Times(1);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
mock_surface->SendFrameCallback();
Sync();
// Commit the second buffer now.
buffer_manager_gpu_->CommitBuffer(widget, kBufferId2, kBufferId2, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
mock_surface->SendFrameCallback();
Sync();
@@ -1891,7 +2038,8 @@ TEST_P(WaylandBufferManagerTest, FencedRelease) {
// Commit the third buffer now.
buffer_manager_gpu_->CommitBuffer(widget, kBufferId3, kBufferId3, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
mock_surface->SendFrameCallback();
Sync();
@@ -1947,7 +2095,8 @@ TEST_P(WaylandBufferManagerTest,
EXPECT_CALL(*mock_surface_gpu.get(), OnPresentation(kBufferId1, _)).Times(1);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
// The root surface shouldn't get null buffer attached.
@@ -1997,7 +2146,8 @@ TEST_P(WaylandBufferManagerTest,
EXPECT_CALL(*mock_surface_gpu.get(), OnPresentation(kBufferId1, _)).Times(1);
buffer_manager_gpu_->CommitBuffer(widget, kBufferId1, kBufferId1, bounds,
- kDefaultScale, bounds);
+ gfx::RoundedCornersF(), kDefaultScale,
+ bounds);
Sync();
DestroyBufferAndSetTerminateExpectation(kBufferId1, false /*fail*/);
@@ -2302,7 +2452,7 @@ TEST_P(WaylandBufferManagerTest, FeedbacksAreDiscardedIfClientMisbehaves) {
const gfx::AcceleratedWidget widget = window_->GetWidget();
const gfx::Rect bounds = gfx::Rect({0, 0}, kDefaultSize);
- window_->SetBoundsInPixels(bounds);
+ window_->SetBoundsInDIP(bounds);
MockSurfaceGpu mock_surface_gpu(buffer_manager_gpu_.get(), widget_);
@@ -2362,9 +2512,9 @@ TEST_P(WaylandBufferManagerTest, FeedbacksAreDiscardedIfClientMisbehaves) {
EXPECT_CALL(mock_surface_gpu, OnPresentation(_, _)).Times(0);
}
- buffer_manager_gpu_->CommitBuffer(widget, next_buffer_id_commit,
- next_buffer_id_commit, bounds,
- kDefaultScale, bounds);
+ buffer_manager_gpu_->CommitBuffer(
+ widget, next_buffer_id_commit, next_buffer_id_commit, bounds,
+ gfx::RoundedCornersF(), kDefaultScale, bounds);
Sync();
@@ -2396,10 +2546,10 @@ TEST_P(WaylandBufferManagerTest, ExecutesTasksAfterInitialization) {
constexpr uint32_t kDmabufBufferId = 1;
CreateDmabufBasedBufferAndSetTerminateExpectation(false /*fail*/,
kDmabufBufferId);
- buffer_manager_gpu_->CommitBuffer(window_->GetWidget(), kDmabufBufferId,
- kDmabufBufferId,
- window_->GetBoundsInPixels(), kDefaultScale,
- window_->GetBoundsInPixels());
+ buffer_manager_gpu_->CommitBuffer(
+ window_->GetWidget(), kDmabufBufferId, kDmabufBufferId,
+ window_->GetBoundsInPixels(), gfx::RoundedCornersF(), kDefaultScale,
+ window_->GetBoundsInPixels());
DestroyBufferAndSetTerminateExpectation(kDmabufBufferId, false /*fail*/);
base::RunLoop().RunUntilIdle();
diff --git a/chromium/ui/ozone/platform/wayland/wayland_utils.h b/chromium/ui/ozone/platform/wayland/wayland_utils.h
index 52e1e4b37d6..8c7cadb22d2 100644
--- a/chromium/ui/ozone/platform/wayland/wayland_utils.h
+++ b/chromium/ui/ozone/platform/wayland/wayland_utils.h
@@ -5,10 +5,14 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_WAYLAND_UTILS_H_
#define UI_OZONE_PLATFORM_WAYLAND_WAYLAND_UTILS_H_
+#include "base/memory/raw_ptr.h"
#include "ui/ozone/public/platform_utils.h"
namespace ui {
+#define PARAM_TO_FLOAT(x) (x / 10000.f)
+#define FLOAT_TO_PARAM(x) static_cast<uint32_t>(x * 10000)
+
class WaylandConnection;
class WaylandUtils : public PlatformUtils {
@@ -25,7 +29,7 @@ class WaylandUtils : public PlatformUtils {
void OnUnhandledKeyEvent(const KeyEvent& key_event) override;
private:
- WaylandConnection* const connection_;
+ const raw_ptr<WaylandConnection> connection_;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/x11/BUILD.gn b/chromium/ui/ozone/platform/x11/BUILD.gn
index 252986ee44f..34126e87bb6 100644
--- a/chromium/ui/ozone/platform/x11/BUILD.gn
+++ b/chromium/ui/ozone/platform/x11/BUILD.gn
@@ -22,8 +22,10 @@ source_set("x11") {
"gl_surface_egl_readback_x11.h",
"hit_test_x11.cc",
"hit_test_x11.h",
- "linux_ui_delegate_x11.cc",
- "linux_ui_delegate_x11.h",
+ "native_pixmap_egl_x11_binding.cc",
+ "native_pixmap_egl_x11_binding.h",
+ "native_pixmap_glx_binding.cc",
+ "native_pixmap_glx_binding.h",
"os_exchange_data_provider_x11.cc",
"os_exchange_data_provider_x11.h",
"ozone_platform_x11.cc",
@@ -94,6 +96,14 @@ source_set("x11") {
"//ui/platform_window/wm",
]
+ if (is_linux) {
+ sources += [
+ "linux_ui_delegate_x11.cc",
+ "linux_ui_delegate_x11.h",
+ ]
+ deps += [ "//ui/linux:linux_ui" ]
+ }
+
if (is_chromeos_ash) {
deps += [ "//ui/base/ime/ash" ]
} else {
diff --git a/chromium/ui/ozone/platform/x11/DEPS b/chromium/ui/ozone/platform/x11/DEPS
index 000509f75d6..925730595f4 100644
--- a/chromium/ui/ozone/platform/x11/DEPS
+++ b/chromium/ui/ozone/platform/x11/DEPS
@@ -2,4 +2,5 @@ include_rules = [
"+net/base/network_interfaces.h",
"+ui/base/x",
"+ui/base",
+ "+ui/linux",
]
diff --git a/chromium/ui/ozone/platform/x11/gl_ozone_glx.cc b/chromium/ui/ozone/platform/x11/gl_ozone_glx.cc
index 6f3bd251c53..23ff67c3c82 100644
--- a/chromium/ui/ozone/platform/x11/gl_ozone_glx.cc
+++ b/chromium/ui/ozone/platform/x11/gl_ozone_glx.cc
@@ -10,8 +10,10 @@
#include "ui/gl/gl_context_glx.h"
#include "ui/gl/gl_gl_api_implementation.h"
#include "ui/gl/gl_glx_api_implementation.h"
+#include "ui/gl/gl_image_glx_native_pixmap.h"
#include "ui/gl/gl_surface_glx_x11.h"
#include "ui/gl/gl_utils.h"
+#include "ui/ozone/platform/x11/native_pixmap_glx_binding.h"
namespace ui {
@@ -87,6 +89,22 @@ void GLOzoneGLX::ShutdownGL(gl::GLDisplay* display) {
gl::ClearBindingsGLX();
}
+bool GLOzoneGLX::CanImportNativePixmap() {
+ return false;
+}
+
+std::unique_ptr<NativePixmapGLBinding> GLOzoneGLX::ImportNativePixmap(
+ scoped_refptr<gfx::NativePixmap> pixmap,
+ gfx::BufferFormat plane_format,
+ gfx::BufferPlane plane,
+ gfx::Size plane_size,
+ const gfx::ColorSpace& color_space,
+ GLenum target,
+ GLuint texture_id) {
+ return NativePixmapGLXBinding::Create(pixmap, plane_format, plane, plane_size,
+ target, texture_id);
+}
+
bool GLOzoneGLX::GetGLWindowSystemBindingInfo(
const gl::GLVersionInfo& gl_info,
gl::GLWindowSystemBindingInfo* info) {
@@ -102,16 +120,19 @@ scoped_refptr<gl::GLContext> GLOzoneGLX::CreateGLContext(
}
scoped_refptr<gl::GLSurface> GLOzoneGLX::CreateViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget window) {
return gl::InitializeGLSurface(new gl::GLSurfaceGLXX11(window));
}
scoped_refptr<gl::GLSurface> GLOzoneGLX::CreateSurfacelessViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget window) {
return nullptr;
}
scoped_refptr<gl::GLSurface> GLOzoneGLX::CreateOffscreenGLSurface(
+ gl::GLDisplay* display,
const gfx::Size& size) {
return gl::InitializeGLSurface(new gl::UnmappedNativeViewGLSurfaceGLX(size));
}
diff --git a/chromium/ui/ozone/platform/x11/gl_ozone_glx.h b/chromium/ui/ozone/platform/x11/gl_ozone_glx.h
index 1fb05ff3826..05f3b43b68c 100644
--- a/chromium/ui/ozone/platform/x11/gl_ozone_glx.h
+++ b/chromium/ui/ozone/platform/x11/gl_ozone_glx.h
@@ -27,6 +27,15 @@ class GLOzoneGLX : public GLOzone {
bool InitializeExtensionSettingsOneOffPlatform(
gl::GLDisplay* display) override;
void ShutdownGL(gl::GLDisplay* display) override;
+ bool CanImportNativePixmap() override;
+ std::unique_ptr<NativePixmapGLBinding> ImportNativePixmap(
+ scoped_refptr<gfx::NativePixmap> pixmap,
+ gfx::BufferFormat plane_format,
+ gfx::BufferPlane plane,
+ gfx::Size plane_size,
+ const gfx::ColorSpace& color_space,
+ GLenum target,
+ GLuint texture_id) override;
bool GetGLWindowSystemBindingInfo(
const gl::GLVersionInfo& gl_info,
gl::GLWindowSystemBindingInfo* info) override;
@@ -35,10 +44,13 @@ class GLOzoneGLX : public GLOzone {
gl::GLSurface* compatible_surface,
const gl::GLContextAttribs& attribs) override;
scoped_refptr<gl::GLSurface> CreateViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget window) override;
scoped_refptr<gl::GLSurface> CreateSurfacelessViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget window) override;
scoped_refptr<gl::GLSurface> CreateOffscreenGLSurface(
+ gl::GLDisplay* display,
const gfx::Size& size) override;
};
diff --git a/chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.cc b/chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.cc
index c76733fc1dd..7118a30e3d6 100644
--- a/chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.cc
+++ b/chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.cc
@@ -18,8 +18,10 @@ constexpr x11::GraphicsContext kNoGC = x11::GraphicsContext{};
}
-GLSurfaceEglReadbackX11::GLSurfaceEglReadbackX11(gfx::AcceleratedWidget window)
- : window_(static_cast<x11::Window>(window)),
+GLSurfaceEglReadbackX11::GLSurfaceEglReadbackX11(gl::GLDisplayEGL* display,
+ gfx::AcceleratedWidget window)
+ : GLSurfaceEglReadback(display),
+ window_(static_cast<x11::Window>(window)),
connection_(x11::Connection::Get()) {}
bool GLSurfaceEglReadbackX11::Initialize(gl::GLSurfaceFormat format) {
diff --git a/chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.h b/chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.h
index 7459e004fcd..63cc4211071 100644
--- a/chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.h
+++ b/chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.h
@@ -5,6 +5,7 @@
#ifndef UI_OZONE_PLATFORM_X11_GL_SURFACE_EGL_READBACK_X11_H_
#define UI_OZONE_PLATFORM_X11_GL_SURFACE_EGL_READBACK_X11_H_
+#include "base/memory/raw_ptr.h"
#include "ui/gfx/x/xproto.h"
#include "ui/ozone/common/gl_surface_egl_readback.h"
@@ -13,7 +14,8 @@ namespace ui {
// GLSurface implementation that copies pixels from readback to an XWindow.
class GLSurfaceEglReadbackX11 : public GLSurfaceEglReadback {
public:
- explicit GLSurfaceEglReadbackX11(gfx::AcceleratedWidget window);
+ GLSurfaceEglReadbackX11(gl::GLDisplayEGL* display,
+ gfx::AcceleratedWidget window);
GLSurfaceEglReadbackX11(const GLSurfaceEglReadbackX11&) = delete;
GLSurfaceEglReadbackX11& operator=(const GLSurfaceEglReadbackX11&) = delete;
@@ -29,7 +31,7 @@ class GLSurfaceEglReadbackX11 : public GLSurfaceEglReadback {
bool HandlePixels(uint8_t* pixels) override;
const x11::Window window_;
- x11::Connection* const connection_;
+ const raw_ptr<x11::Connection> connection_;
x11::GraphicsContext window_graphics_context_{};
x11::VisualId visual_{};
};
diff --git a/chromium/ui/ozone/platform/x11/linux_ui_delegate_x11.h b/chromium/ui/ozone/platform/x11/linux_ui_delegate_x11.h
index 512a818912f..b2fe905cc51 100644
--- a/chromium/ui/ozone/platform/x11/linux_ui_delegate_x11.h
+++ b/chromium/ui/ozone/platform/x11/linux_ui_delegate_x11.h
@@ -5,8 +5,8 @@
#ifndef UI_OZONE_PLATFORM_X11_LINUX_UI_DELEGATE_X11_H_
#define UI_OZONE_PLATFORM_X11_LINUX_UI_DELEGATE_X11_H_
-#include "ui/base/linux/linux_ui_delegate.h"
#include "ui/gfx/native_widget_types.h"
+#include "ui/linux/linux_ui_delegate.h"
namespace ui {
diff --git a/chromium/ui/ozone/platform/x11/native_pixmap_egl_x11_binding.cc b/chromium/ui/ozone/platform/x11/native_pixmap_egl_x11_binding.cc
new file mode 100644
index 00000000000..27d6fefa2d2
--- /dev/null
+++ b/chromium/ui/ozone/platform/x11/native_pixmap_egl_x11_binding.cc
@@ -0,0 +1,45 @@
+// 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/x11/native_pixmap_egl_x11_binding.h"
+
+#include "base/logging.h"
+#include "base/memory/scoped_refptr.h"
+#include "ui/gfx/linux/native_pixmap_dmabuf.h"
+#include "ui/gl/gl_image_egl_pixmap.h"
+#include "ui/gl/glx_util.h"
+
+namespace ui {
+
+NativePixmapEGLX11Binding::NativePixmapEGLX11Binding() = default;
+NativePixmapEGLX11Binding::~NativePixmapEGLX11Binding() = default;
+
+// static
+std::unique_ptr<NativePixmapGLBinding> NativePixmapEGLX11Binding::Create(
+ scoped_refptr<gfx::NativePixmap> native_pixmap,
+ gfx::BufferFormat plane_format,
+ gfx::Size plane_size,
+ GLenum target,
+ GLuint texture_id) {
+ auto gl_image =
+ base::MakeRefCounted<gl::GLImageEGLPixmap>(plane_size, plane_format);
+ x11::Pixmap pixmap = gl::XPixmapFromNativePixmap(
+ *static_cast<gfx::NativePixmapDmaBuf*>(native_pixmap.get()),
+ plane_format);
+
+ // Initialize the image calling eglCreatePixmapSurface.
+ if (!gl_image->Initialize(std::move(pixmap))) {
+ LOG(ERROR) << "Unable to initialize GL image from pixmap";
+ return nullptr;
+ }
+
+ auto binding = std::make_unique<NativePixmapEGLX11Binding>();
+ if (!binding->BindTexture(std::move(gl_image), target, texture_id)) {
+ return nullptr;
+ }
+
+ return binding;
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/x11/native_pixmap_egl_x11_binding.h b/chromium/ui/ozone/platform/x11/native_pixmap_egl_x11_binding.h
new file mode 100644
index 00000000000..311c103c275
--- /dev/null
+++ b/chromium/ui/ozone/platform/x11/native_pixmap_egl_x11_binding.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 UI_OZONE_PLATFORM_X11_NATIVE_PIXMAP_EGL_X11_BINDING_H_
+#define UI_OZONE_PLATFORM_X11_NATIVE_PIXMAP_EGL_X11_BINDING_H_
+
+#include "ui/ozone/public/native_pixmap_gl_binding.h"
+
+namespace ui {
+
+// A binding maintained between GLImageEGLPixmap and GL Textures in Ozone. This
+// is used on X11.
+class NativePixmapEGLX11Binding : public NativePixmapGLBinding {
+ public:
+ NativePixmapEGLX11Binding();
+ ~NativePixmapEGLX11Binding() override;
+
+ static std::unique_ptr<NativePixmapGLBinding> Create(
+ scoped_refptr<gfx::NativePixmap> pixmap,
+ gfx::BufferFormat plane_format,
+ gfx::Size plane_size,
+ GLenum target,
+ GLuint texture_id);
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_X11_NATIVE_PIXMAP_EGL_X11_BINDING_H_
diff --git a/chromium/ui/ozone/platform/x11/native_pixmap_glx_binding.cc b/chromium/ui/ozone/platform/x11/native_pixmap_glx_binding.cc
new file mode 100644
index 00000000000..78b6606fbea
--- /dev/null
+++ b/chromium/ui/ozone/platform/x11/native_pixmap_glx_binding.cc
@@ -0,0 +1,41 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/platform/x11/native_pixmap_glx_binding.h"
+
+#include "base/logging.h"
+#include "base/memory/scoped_refptr.h"
+#include "ui/gl/gl_image_glx_native_pixmap.h"
+
+namespace ui {
+
+NativePixmapGLXBinding::NativePixmapGLXBinding() = default;
+NativePixmapGLXBinding::~NativePixmapGLXBinding() = default;
+
+// static
+std::unique_ptr<NativePixmapGLBinding> NativePixmapGLXBinding::Create(
+ scoped_refptr<gfx::NativePixmap> pixmap,
+ gfx::BufferFormat plane_format,
+ gfx::BufferPlane plane,
+ gfx::Size plane_size,
+ GLenum target,
+ GLuint texture_id) {
+ auto gl_image = base::MakeRefCounted<gl::GLImageGLXNativePixmap>(
+ plane_size, plane_format, plane);
+
+ // Initialize the image using glXCreatePixmap.
+ if (!gl_image->Initialize(std::move(pixmap))) {
+ LOG(ERROR) << "Unable to initialize GL image from pixmap";
+ return nullptr;
+ }
+
+ auto binding = std::make_unique<NativePixmapGLXBinding>();
+ if (!binding->BindTexture(std::move(gl_image), target, texture_id)) {
+ return nullptr;
+ }
+
+ return binding;
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/x11/native_pixmap_glx_binding.h b/chromium/ui/ozone/platform/x11/native_pixmap_glx_binding.h
new file mode 100644
index 00000000000..c59487eb911
--- /dev/null
+++ b/chromium/ui/ozone/platform/x11/native_pixmap_glx_binding.h
@@ -0,0 +1,31 @@
+// 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_X11_NATIVE_PIXMAP_GLX_BINDING_H_
+#define UI_OZONE_PLATFORM_X11_NATIVE_PIXMAP_GLX_BINDING_H_
+
+#include "ui/ozone/public/native_pixmap_gl_binding.h"
+
+namespace ui {
+
+// A binding maintained between GLImageGLXNativePixmap and GL Textures in Ozone.
+// This binding is used for ChromeOS-on-Linux and for Linux/Ozone/X11 with
+// Drm/Kms.
+class NativePixmapGLXBinding : public NativePixmapGLBinding {
+ public:
+ NativePixmapGLXBinding();
+ ~NativePixmapGLXBinding() override;
+
+ static std::unique_ptr<NativePixmapGLBinding> Create(
+ scoped_refptr<gfx::NativePixmap> pixmap,
+ gfx::BufferFormat plane_format,
+ gfx::BufferPlane plane,
+ gfx::Size plane_size,
+ GLenum target,
+ GLuint texture_id);
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_X11C_NATIVE_PIXMAP_GLX_BINDING_H_
diff --git a/chromium/ui/ozone/platform/x11/ozone_platform_x11.cc b/chromium/ui/ozone/platform/x11/ozone_platform_x11.cc
index 9008af97342..f7fe443469c 100644
--- a/chromium/ui/ozone/platform/x11/ozone_platform_x11.cc
+++ b/chromium/ui/ozone/platform/x11/ozone_platform_x11.cc
@@ -20,8 +20,6 @@
#include "ui/base/buildflags.h"
#include "ui/base/cursor/cursor_factory.h"
#include "ui/base/dragdrop/os_exchange_data_provider_factory_ozone.h"
-#include "ui/base/ime/linux/linux_input_method_context_factory.h"
-#include "ui/base/linux/linux_ui_delegate.h"
#include "ui/base/x/x11_cursor_factory.h"
#include "ui/base/x/x11_util.h"
#include "ui/display/fake/fake_display_delegate.h"
@@ -32,6 +30,7 @@
#include "ui/gfx/linux/gpu_memory_buffer_support_x11.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/switches.h"
+#include "ui/linux/linux_ui_delegate.h"
#include "ui/ozone/common/stub_overlay_manager.h"
#include "ui/ozone/platform/x11/gl_egl_utility_x11.h"
#include "ui/ozone/platform/x11/linux_ui_delegate_x11.h"
@@ -102,7 +101,6 @@ class OzonePlatformX11 : public OzonePlatform,
PlatformWindowInitProperties properties) override {
auto window = std::make_unique<X11Window>(delegate);
window->Initialize(std::move(properties));
- window->SetTitle(u"Ozone X11");
return std::move(window);
}
@@ -132,18 +130,12 @@ class OzonePlatformX11 : public OzonePlatform,
}
std::unique_ptr<InputMethod> CreateInputMethod(
- internal::InputMethodDelegate* delegate,
+ ImeKeyEventDispatcher* ime_key_event_dispatcher,
gfx::AcceleratedWidget) override {
#if BUILDFLAG(IS_CHROMEOS_ASH)
- return std::make_unique<InputMethodAsh>(delegate);
+ return std::make_unique<InputMethodAsh>(ime_key_event_dispatcher);
#else
- // This method is used by upper layer components (e.g: GtkUi) to determine
- // if the LinuxInputMethodContextFactory instance is provided by the Ozone
- // platform implementation, so we must consider the case that it is still
- // not set at this point.
- if (!ui::LinuxInputMethodContextFactory::instance())
- return nullptr;
- return std::make_unique<InputMethodAuraLinux>(delegate);
+ return std::make_unique<InputMethodAuraLinux>(ime_key_event_dispatcher);
#endif
}
diff --git a/chromium/ui/ozone/platform/x11/test/device_data_manager_x11_unittest.cc b/chromium/ui/ozone/platform/x11/test/device_data_manager_x11_unittest.cc
index 88fccb6b919..b688cdf8549 100644
--- a/chromium/ui/ozone/platform/x11/test/device_data_manager_x11_unittest.cc
+++ b/chromium/ui/ozone/platform/x11/test/device_data_manager_x11_unittest.cc
@@ -6,6 +6,7 @@
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/events/devices/device_hotplug_event_observer.h"
#include "ui/events/devices/input_device.h"
@@ -41,7 +42,7 @@ class TestInputDeviceObserver : public InputDeviceEventObserver {
void Reset() { change_notified_ = false; }
private:
- DeviceDataManager* manager_;
+ raw_ptr<DeviceDataManager> manager_;
bool change_notified_;
};
diff --git a/chromium/ui/ozone/platform/x11/test/x11_drag_drop_client_unittest.cc b/chromium/ui/ozone/platform/x11/test/x11_drag_drop_client_unittest.cc
index e4f8670646a..02c02bfdcf7 100644
--- a/chromium/ui/ozone/platform/x11/test/x11_drag_drop_client_unittest.cc
+++ b/chromium/ui/ozone/platform/x11/test/x11_drag_drop_client_unittest.cc
@@ -12,6 +12,7 @@
#include "base/bind.h"
#include "base/location.h"
#include "base/memory/ptr_util.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/run_loop.h"
#include "base/strings/utf_string_conversions.h"
@@ -72,7 +73,7 @@ class ClientMessageEventCollector {
x11::Window window_;
// Not owned.
- TestDragDropClient* client_;
+ raw_ptr<TestDragDropClient> client_;
std::vector<x11::ClientMessageEvent> events_;
};
@@ -96,7 +97,7 @@ class TestMoveLoop : public X11MoveLoop {
private:
// Not owned.
- X11MoveLoopDelegate* delegate_;
+ raw_ptr<X11MoveLoopDelegate> delegate_;
// Ends the move loop.
base::OnceClosure quit_closure_;
@@ -155,7 +156,7 @@ class SimpleTestDragDropClient : public XDragDropClient,
x11::Window target_window_ = x11::Window::None;
// The move loop. Not owned.
- TestMoveLoop* loop_ = nullptr;
+ raw_ptr<TestMoveLoop> loop_ = nullptr;
base::OnceClosure quit_closure_;
};
@@ -296,7 +297,7 @@ bool SimpleTestDragDropClient::IsMoveLoopRunning() {
std::unique_ptr<X11MoveLoop> SimpleTestDragDropClient::CreateMoveLoop(
X11MoveLoopDelegate* delegate) {
loop_ = new TestMoveLoop(delegate);
- return base::WrapUnique(loop_);
+ return base::WrapUnique(loop_.get());
}
DragOperation SimpleTestDragDropClient::StartDragAndDrop(
diff --git a/chromium/ui/ozone/platform/x11/test/x11_window_unittest.cc b/chromium/ui/ozone/platform/x11/test/x11_window_unittest.cc
index cccb2e240c2..de2af40a931 100644
--- a/chromium/ui/ozone/platform/x11/test/x11_window_unittest.cc
+++ b/chromium/ui/ozone/platform/x11/test/x11_window_unittest.cc
@@ -25,6 +25,7 @@
#include "ui/gfx/x/x11_atom_cache.h"
#include "ui/gfx/x/xproto.h"
#include "ui/gfx/x/xproto_util.h"
+#include "ui/ozone/test/mock_platform_window_delegate.h"
#include "ui/platform_window/extensions/x11_extension_delegate.h"
namespace ui {
@@ -33,6 +34,8 @@ namespace {
constexpr int kPointerDeviceId = 1;
+using BoundsChange = PlatformWindowDelegate::BoundsChange;
+
class TestPlatformWindowDelegate : public PlatformWindowDelegate {
public:
TestPlatformWindowDelegate() = default;
@@ -44,10 +47,11 @@ class TestPlatformWindowDelegate : public PlatformWindowDelegate {
gfx::AcceleratedWidget widget() const { return widget_; }
PlatformWindowState state() const { return state_; }
- void WaitForBoundsSet(const gfx::Rect& expected_bounds) {
- if (changed_bounds_ == expected_bounds)
+ void WaitForBoundsChange(
+ const PlatformWindowDelegate::BoundsChange& expected_change) {
+ if (expected_change_ == expected_change)
return;
- expected_bounds_ = expected_bounds;
+ expected_change_ = expected_change;
base::RunLoop run_loop;
quit_closure_ = run_loop.QuitClosure();
run_loop.Run();
@@ -56,8 +60,9 @@ class TestPlatformWindowDelegate : public PlatformWindowDelegate {
// PlatformWindowDelegate:
void OnBoundsChanged(
const PlatformWindowDelegate::BoundsChange& change) override {
- changed_bounds_ = change.bounds;
- if (!quit_closure_.is_null() && changed_bounds_ == expected_bounds_)
+ changed_ = change;
+ size_px_ = window_->GetBoundsInPixels().size();
+ if (!quit_closure_.is_null() && changed_ == expected_change_)
std::move(quit_closure_).Run();
}
void OnDamageRect(const gfx::Rect& damaged_region) override {}
@@ -80,8 +85,8 @@ class TestPlatformWindowDelegate : public PlatformWindowDelegate {
void OnMouseEnter() override {}
SkPath GetWindowMaskForWindowShapeInPixels() override {
SkPath window_mask;
- int right = changed_bounds_.width();
- int bottom = changed_bounds_.height();
+ int right = size_px_.width();
+ int bottom = size_px_.height();
window_mask.moveTo(0, 0);
window_mask.lineTo(0, bottom);
@@ -93,11 +98,15 @@ class TestPlatformWindowDelegate : public PlatformWindowDelegate {
return window_mask;
}
+ void set_window(X11Window* window) { window_ = window; }
+
private:
+ X11Window* window_ = nullptr;
gfx::AcceleratedWidget widget_ = gfx::kNullAcceleratedWidget;
PlatformWindowState state_ = PlatformWindowState::kUnknown;
- gfx::Rect changed_bounds_;
- gfx::Rect expected_bounds_;
+ PlatformWindowDelegate::BoundsChange changed_{false};
+ gfx::Size size_px_;
+ PlatformWindowDelegate::BoundsChange expected_change_{false};
// Ends the run loop.
base::OnceClosure quit_closure_;
@@ -270,6 +279,7 @@ TEST_F(X11WindowTest, DISABLED_Shape) {
ShapedX11ExtensionDelegate x11_extension_delegate;
constexpr gfx::Rect bounds(100, 100, 100, 100);
auto window = CreateX11Window(&delegate, bounds, &x11_extension_delegate);
+ delegate.set_window(window.get());
window->Show(false);
const x11::Window x11_window = window->window();
@@ -402,6 +412,7 @@ TEST_F(X11WindowTest, MAYBE_WindowManagerTogglesFullscreen) {
constexpr gfx::Rect bounds(100, 100, 100, 100);
x11_extension_delegate.set_guessed_bounds(bounds);
auto window = CreateX11Window(&delegate, bounds, &x11_extension_delegate);
+ delegate.set_window(window.get());
x11::Window x11_window = window->window();
window->Show(false);
@@ -432,7 +443,7 @@ TEST_F(X11WindowTest, MAYBE_WindowManagerTogglesFullscreen) {
// Ensure it continues in browser fullscreen mode and bounds are restored to
// |initial_bounds|.
EXPECT_EQ(window->GetPlatformWindowState(), PlatformWindowState::kFullScreen);
- delegate.WaitForBoundsSet(initial_bounds);
+ delegate.WaitForBoundsChange({false});
EXPECT_EQ(initial_bounds, window->GetBoundsInPixels());
// Emulate window resize (through X11 configure events) while in browser
@@ -448,14 +459,14 @@ TEST_F(X11WindowTest, MAYBE_WindowManagerTogglesFullscreen) {
base::RunLoop().RunUntilIdle();
}
EXPECT_EQ(window->GetPlatformWindowState(), PlatformWindowState::kFullScreen);
- delegate.WaitForBoundsSet(initial_bounds);
+ delegate.WaitForBoundsChange({false});
EXPECT_EQ(initial_bounds, window->GetBoundsInPixels());
// Calling Widget::SetFullscreen(false) should clear the widget's fullscreen
// state and clean things up.
window->ToggleFullscreen();
EXPECT_NE(window->GetPlatformWindowState(), PlatformWindowState::kFullScreen);
- delegate.WaitForBoundsSet(initial_bounds);
+ delegate.WaitForBoundsChange({false});
EXPECT_EQ(initial_bounds, window->GetBoundsInPixels());
}
@@ -467,6 +478,7 @@ TEST_F(X11WindowTest,
TestPlatformWindowDelegate delegate;
constexpr gfx::Rect bounds(10, 10, 100, 100);
auto window = CreateX11Window(&delegate, bounds, nullptr);
+ delegate.set_window(window.get());
window->Show(false);
window->Activate();
diff --git a/chromium/ui/ozone/platform/x11/x11_screen_ozone.cc b/chromium/ui/ozone/platform/x11/x11_screen_ozone.cc
index 96960570df7..8b25f6b83b2 100644
--- a/chromium/ui/ozone/platform/x11/x11_screen_ozone.cc
+++ b/chromium/ui/ozone/platform/x11/x11_screen_ozone.cc
@@ -4,6 +4,8 @@
#include "ui/ozone/platform/x11/x11_screen_ozone.h"
+#include <memory>
+
#include "base/containers/flat_set.h"
#include "ui/base/linux/linux_desktop.h"
#include "ui/base/x/x11_idle_query.h"
@@ -111,8 +113,8 @@ gfx::AcceleratedWidget X11ScreenOzone::GetLocalProcessWidgetAtPoint(
gfx::Point point_in_pixels = gfx::ToFlooredPoint(
gfx::ConvertPointToPixels(point, GetXDisplayScaleFactor()));
base::flat_set<x11::Window> ignore_windows;
- for (auto widget : ignore)
- ignore_windows.insert(static_cast<x11::Window>(widget));
+ for (auto ignore_widget : ignore)
+ ignore_windows.insert(static_cast<x11::Window>(ignore_widget));
widget = static_cast<gfx::AcceleratedWidget>(
x11::GetWindowAtPoint(point_in_pixels, &ignore_windows));
}
@@ -135,8 +137,29 @@ display::Display X11ScreenOzone::GetDisplayMatching(
return matching_display ? *matching_display : GetPrimaryDisplay();
}
-bool X11ScreenOzone::SetScreenSaverSuspended(bool suspend) {
- return SuspendX11ScreenSaver(suspend);
+X11ScreenOzone::X11ScreenSaverSuspender::X11ScreenSaverSuspender() {
+ is_suspending_ = SuspendX11ScreenSaver(true);
+}
+
+std::unique_ptr<X11ScreenOzone::X11ScreenSaverSuspender>
+X11ScreenOzone::X11ScreenSaverSuspender::Create() {
+ auto suspender = base::WrapUnique(new X11ScreenSaverSuspender());
+ if (suspender->is_suspending_) {
+ return suspender;
+ }
+
+ return nullptr;
+}
+
+X11ScreenOzone::X11ScreenSaverSuspender::~X11ScreenSaverSuspender() {
+ if (is_suspending_) {
+ SuspendX11ScreenSaver(false);
+ }
+}
+
+std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender>
+X11ScreenOzone::SuspendScreenSaver() {
+ return X11ScreenSaverSuspender::Create();
}
bool X11ScreenOzone::IsScreenSaverActive() const {
@@ -161,7 +184,7 @@ std::string X11ScreenOzone::GetCurrentWorkspace() {
return x11_display_manager_->GetCurrentWorkspace();
}
-std::vector<base::Value> X11ScreenOzone::GetGpuExtraInfo(
+base::Value::List X11ScreenOzone::GetGpuExtraInfo(
const gfx::GpuExtraInfo& gpu_extra_info) {
auto result = GetDesktopEnvironmentInfo();
StorePlatformNameIntoListOfValues(result, "x11");
diff --git a/chromium/ui/ozone/platform/x11/x11_screen_ozone.h b/chromium/ui/ozone/platform/x11/x11_screen_ozone.h
index d86acae9aa9..effedc4d439 100644
--- a/chromium/ui/ozone/platform/x11/x11_screen_ozone.h
+++ b/chromium/ui/ozone/platform/x11/x11_screen_ozone.h
@@ -9,6 +9,7 @@
#include <utility>
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "ui/base/x/x11_display_manager.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/x/event.h"
@@ -50,13 +51,14 @@ class X11ScreenOzone : public PlatformScreen,
const gfx::Point& point) const override;
display::Display GetDisplayMatching(
const gfx::Rect& match_rect) const override;
- bool SetScreenSaverSuspended(bool suspend) override;
+ std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender>
+ SuspendScreenSaver() override;
bool IsScreenSaverActive() const override;
base::TimeDelta CalculateIdleTime() const override;
void AddObserver(display::DisplayObserver* observer) override;
void RemoveObserver(display::DisplayObserver* observer) override;
std::string GetCurrentWorkspace() override;
- std::vector<base::Value> GetGpuExtraInfo(
+ base::Value::List GetGpuExtraInfo(
const gfx::GpuExtraInfo& gpu_extra_info) override;
void SetDeviceScaleFactor(float scale) override;
@@ -66,14 +68,30 @@ class X11ScreenOzone : public PlatformScreen,
private:
friend class X11ScreenOzoneTest;
+ class X11ScreenSaverSuspender
+ : public PlatformScreen::PlatformScreenSaverSuspender {
+ public:
+ X11ScreenSaverSuspender(const X11ScreenSaverSuspender&) = delete;
+ X11ScreenSaverSuspender& operator=(const X11ScreenSaverSuspender&) = delete;
+
+ ~X11ScreenSaverSuspender() override;
+
+ static std::unique_ptr<X11ScreenSaverSuspender> Create();
+
+ private:
+ X11ScreenSaverSuspender();
+
+ bool is_suspending_ = false;
+ };
+
// Overridden from ui::XDisplayManager::Delegate:
void OnXDisplayListUpdated() override;
float GetXDisplayScaleFactor() const override;
gfx::Point GetCursorLocation() const;
- x11::Connection* const connection_;
- X11WindowManager* const window_manager_;
+ const raw_ptr<x11::Connection> connection_;
+ const raw_ptr<X11WindowManager> window_manager_;
std::unique_ptr<ui::XDisplayManager> x11_display_manager_;
// Scale value that DesktopScreenOzoneLinux sets by listening to
diff --git a/chromium/ui/ozone/platform/x11/x11_surface_factory.cc b/chromium/ui/ozone/platform/x11/x11_surface_factory.cc
index 054344a4493..2efa942a2c7 100644
--- a/chromium/ui/ozone/platform/x11/x11_surface_factory.cc
+++ b/chromium/ui/ozone/platform/x11/x11_surface_factory.cc
@@ -12,12 +12,15 @@
#include "ui/gfx/linux/gpu_memory_buffer_support_x11.h"
#include "ui/gfx/linux/native_pixmap_dmabuf.h"
#include "ui/gfx/x/connection.h"
+#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_surface_egl.h"
#include "ui/gl/gl_surface_egl_x11_gles2.h"
#include "ui/ozone/common/egl_util.h"
#include "ui/ozone/common/gl_ozone_egl.h"
+#include "ui/ozone/common/native_pixmap_egl_binding.h"
#include "ui/ozone/platform/x11/gl_ozone_glx.h"
#include "ui/ozone/platform/x11/gl_surface_egl_readback_x11.h"
+#include "ui/ozone/platform/x11/native_pixmap_egl_x11_binding.h"
#include "ui/ozone/platform/x11/x11_canvas_surface.h"
#if BUILDFLAG(ENABLE_VULKAN)
@@ -43,22 +46,42 @@ class GLOzoneEGLX11 : public GLOzoneEGL {
return GLOzoneEGL::InitializeStaticGLBindings(implementation);
}
+ bool CanImportNativePixmap() override {
+ return gl::GLSurfaceEGL::GetGLDisplayEGL()
+ ->ext->b_EGL_EXT_image_dma_buf_import;
+ }
+
+ std::unique_ptr<NativePixmapGLBinding> ImportNativePixmap(
+ scoped_refptr<gfx::NativePixmap> pixmap,
+ gfx::BufferFormat plane_format,
+ gfx::BufferPlane plane,
+ gfx::Size plane_size,
+ const gfx::ColorSpace& color_space,
+ GLenum target,
+ GLuint texture_id) override {
+ return NativePixmapEGLBinding::Create(pixmap, plane_format, plane,
+ plane_size, color_space, target,
+ texture_id);
+ }
+
scoped_refptr<gl::GLSurface> CreateViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget window) override {
if (is_swiftshader_) {
return gl::InitializeGLSurface(
- base::MakeRefCounted<GLSurfaceEglReadbackX11>(window));
+ base::MakeRefCounted<GLSurfaceEglReadbackX11>(
+ display->GetAs<gl::GLDisplayEGL>(), window));
} else {
switch (gl::GetGLImplementation()) {
case gl::kGLImplementationEGLGLES2:
DCHECK(window != gfx::kNullAcceleratedWidget);
return gl::InitializeGLSurface(new gl::NativeViewGLSurfaceEGLX11GLES2(
- gl::GLSurfaceEGL::GetGLDisplayEGL(),
+ display->GetAs<gl::GLDisplayEGL>(),
static_cast<x11::Window>(window)));
case gl::kGLImplementationEGLANGLE:
DCHECK(window != gfx::kNullAcceleratedWidget);
return gl::InitializeGLSurface(new gl::NativeViewGLSurfaceEGLX11(
- gl::GLSurfaceEGL::GetGLDisplayEGL(),
+ display->GetAs<gl::GLDisplayEGL>(),
static_cast<x11::Window>(window)));
default:
NOTREACHED();
@@ -68,15 +91,15 @@ class GLOzoneEGLX11 : public GLOzoneEGL {
}
scoped_refptr<gl::GLSurface> CreateOffscreenGLSurface(
+ gl::GLDisplay* display,
const gfx::Size& size) override {
- if (gl::GLSurfaceEGL::GetGLDisplayEGL()
- ->IsEGLSurfacelessContextSupported() &&
- size.width() == 0 && size.height() == 0) {
- return InitializeGLSurface(
- new gl::SurfacelessEGL(gl::GLSurfaceEGL::GetGLDisplayEGL(), size));
+ gl::GLDisplayEGL* egl_display = display->GetAs<gl::GLDisplayEGL>();
+ if (egl_display->IsEGLSurfacelessContextSupported() && size.width() == 0 &&
+ size.height() == 0) {
+ return InitializeGLSurface(new gl::SurfacelessEGL(egl_display, size));
} else {
- return InitializeGLSurface(new gl::PbufferGLSurfaceEGL(
- gl::GLSurfaceEGL::GetGLDisplayEGL(), size));
+ return InitializeGLSurface(
+ new gl::PbufferGLSurfaceEGL(egl_display, size));
}
}
@@ -193,9 +216,9 @@ X11SurfaceFactory::CreateNativePixmapFromHandle(
ui::GpuMemoryBufferSupportX11::GetInstance()->CreateBufferFromHandle(
size, format, std::move(handle));
if (buffer) {
- gfx::NativePixmapHandle handle = buffer->ExportHandle();
- pixmap = base::MakeRefCounted<gfx::NativePixmapDmaBuf>(size, format,
- std::move(handle));
+ gfx::NativePixmapHandle buffer_handle = buffer->ExportHandle();
+ pixmap = base::MakeRefCounted<gfx::NativePixmapDmaBuf>(
+ size, format, std::move(buffer_handle));
}
return pixmap;
}
diff --git a/chromium/ui/ozone/platform/x11/x11_window.cc b/chromium/ui/ozone/platform/x11/x11_window.cc
index 7371f85c84f..6c1689e6ab2 100644
--- a/chromium/ui/ozone/platform/x11/x11_window.cc
+++ b/chromium/ui/ozone/platform/x11/x11_window.cc
@@ -5,6 +5,7 @@
#include "ui/ozone/platform/x11/x11_window.h"
#include "base/memory/scoped_refptr.h"
+#include "base/no_destructor.h"
#include "base/notreached.h"
#include "base/strings/string_number_conversions.h"
#include "base/threading/thread_task_runner_handle.h"
@@ -183,6 +184,11 @@ std::vector<x11::Window> GetParentsList(x11::Connection* connection,
return result;
}
+std::vector<x11::Window>& GetSecuritySurfaces() {
+ static base::NoDestructor<std::vector<x11::Window>> security_surfaces;
+ return *security_surfaces;
+}
+
} // namespace
X11Window::X11Window(PlatformWindowDelegate* platform_window_delegate)
@@ -326,6 +332,17 @@ void X11Window::Initialize(PlatformWindowInitProperties properties) {
if (is_always_on_top_)
window_properties_.insert(x11::GetAtom("_NET_WM_STATE_ABOVE"));
+ is_security_surface_ = properties.is_security_surface;
+ if (is_security_surface_) {
+ GetSecuritySurfaces().push_back(xwindow_);
+ } else {
+ // Newly created windows appear at the top of the stacking order, so raise
+ // any security surfaces since the WM will not do it if the window is
+ // override-redirect.
+ for (x11::Window window : GetSecuritySurfaces())
+ RaiseWindow(window);
+ }
+
workspace_ = absl::nullopt;
if (properties.visible_on_all_workspaces) {
window_properties_.insert(x11::GetAtom("_NET_WM_STATE_STICKY"));
@@ -363,6 +380,8 @@ void X11Window::Initialize(PlatformWindowInitProperties properties) {
if (wm_role_name)
SetWindowRole(xwindow_, std::string(wm_role_name));
+ SetTitle(u"");
+
if (properties.remove_standard_frame) {
// Setting _GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED tells gnome-shell to not force
// fullscreen on the window when it matches the desktop size.
@@ -517,8 +536,10 @@ void X11Window::SetBoundsInPixels(const gfx::Rect& bounds) {
req.y = new_bounds_in_pixels.y();
}
- if (origin_changed || size_changed)
+ if (origin_changed || size_changed) {
+ bounds_change_in_flight_ = true;
connection_->ConfigureWindow(req);
+ }
// Assume that the resize will go through as requested, which should be the
// case if we're running without a window manager. If there's a window
@@ -531,7 +552,7 @@ void X11Window::SetBoundsInPixels(const gfx::Rect& bounds) {
// Even if the pixel bounds didn't change this call to the delegate should
// still happen. The device scale factor may have changed which effectively
// changes the bounds.
- OnXWindowBoundsChanged(new_bounds_in_pixels);
+ platform_window_delegate_->OnBoundsChanged({origin_changed});
}
gfx::Rect X11Window::GetBoundsInPixels() const {
@@ -644,20 +665,22 @@ void X11Window::ToggleFullscreen() {
// Do not go through SetBounds as long as it adjusts bounds and sets them to X
// Server. Instead, we just store the bounds and notify the client that the
// window occupies the entire screen.
+ bool origin_changed = bounds_in_pixels_.origin() != new_bounds_px.origin();
bounds_in_pixels_ = new_bounds_px;
- // If there is a restore in flight, then set a flag to ignore the single
- // configure event (hopefully) coming from that restore. This prevents any
- // in-flight restore requests from changing the bounds in a way that conflicts
- // with the `bounds_in_pixels_` setting above. This is not perfect, and if
- // there is some other in-flight bounds change for some reason, or if the
- // ordering of events from the WM behaves differently, this will not prevent
- // the issue. See: http://crbug.com/1227451
- ignore_next_configure_ = restore_in_flight_;
-
+ // If there is a restore and/or bounds change in flight, then set a flag to
+ // ignore the next one or two configure events (hopefully) coming from those
+ // requests. This prevents any in-flight restore requests from changing the
+ // bounds in a way that conflicts with the `bounds_in_pixels_` setting above.
+ // This is not perfect, and if there is some other in-flight bounds change for
+ // some reason, or if the ordering of events from the WM behaves differently,
+ // this will not prevent the issue. See: http://crbug.com/1227451
+ ignore_next_configures_ = restore_in_flight_ ? 1 : 0;
+ if (bounds_change_in_flight_)
+ ignore_next_configures_++;
// This must be the final call in this function, as `this` may be deleted
// during the observation of this event.
- platform_window_delegate_->OnBoundsChanged(new_bounds_px);
+ platform_window_delegate_->OnBoundsChanged({origin_changed});
}
void X11Window::Maximize() {
@@ -1411,10 +1434,6 @@ void X11Window::OnXWindowDamageEvent(const gfx::Rect& damage_rect) {
platform_window_delegate_->OnDamageRect(damage_rect);
}
-void X11Window::OnXWindowBoundsChanged(const gfx::Rect& bounds) {
- platform_window_delegate_->OnBoundsChanged(bounds);
-}
-
void X11Window::OnXWindowCloseRequested() {
platform_window_delegate_->OnCloseRequest();
}
@@ -1664,7 +1683,9 @@ gfx::Size X11Window::AdjustSizeForDisplay(
}
void X11Window::CreateXWindow(const PlatformWindowInitProperties& properties) {
- auto bounds = properties.bounds;
+ auto bounds =
+ platform_window_delegate_->ConvertRectToPixels(properties.bounds);
+
gfx::Size adjusted_size_in_pixels = AdjustSizeForDisplay(bounds.size());
bounds.set_size(adjusted_size_in_pixels);
const auto override_redirect =
@@ -1773,6 +1794,13 @@ void X11Window::CloseXWindow() {
CancelResize();
UnconfineCursor();
+ // Unregister from the global security surface list if necessary.
+ if (is_security_surface_) {
+ auto& security_surfaces = GetSecuritySurfaces();
+ security_surfaces.erase(
+ std::find(security_surfaces.begin(), security_surfaces.end(), xwindow_),
+ security_surfaces.end());
+ }
connection_->DestroyWindow({xwindow_});
xwindow_ = x11::Window::None;
@@ -2111,7 +2139,7 @@ void X11Window::HandleEvent(const x11::Event& xev) {
gfx::Point window_origin = gfx::Point() + (root_point - window_point);
if (bounds_in_pixels_.origin() != window_origin) {
bounds_in_pixels_.set_origin(window_origin);
- NotifyBoundsChanged(bounds_in_pixels_);
+ NotifyBoundsChanged(/*origin changed=*/true);
}
}
@@ -2243,15 +2271,24 @@ void X11Window::OnConfigureEvent(const x11::ConfigureNotifyEvent& configure,
pending_counter_value_ = 0;
}
- // During a Restore() -> ToggleFullscreen() sequence, ignore the configure
- // event from the restore if we're waiting on fullscreen. After
+ // During a Restore() -> ToggleFullscreen() or Restore() -> SetBounds() ->
+ // ToggleFullscreen() sequence, ignore the configure events from the Restore
+ // and SetBounds requests, if we're waiting on fullscreen. After
// OnXWindowStateChanged unsets this flag, there will be a configuration event
// that will set the bounds to the final fullscreen bounds.
- if (ignore_next_configure_) {
- ignore_next_configure_ = false;
+ if (ignore_next_configures_ > 0) {
+ ignore_next_configures_--;
return;
}
+ // Note: This OnConfigureEvent might not necessarily correspond to a previous
+ // SetBounds request. Due to limitations in X11 there isn't a way to
+ // match events to its original request. For now, we assume that the next
+ // OnConfigureEvent event after a SetBounds (ConfigureWindow) request is from
+ // that request. This would break in some scenarios (for example calling
+ // SetBounds more than once quickly). See crbug.com/1227451.
+ bounds_change_in_flight_ = false;
+
// It's possible that the X window may be resized by some other means than
// from within aura (e.g. the X window manager can change the size). Make
// sure the root window size is maintained properly.
@@ -2274,9 +2311,9 @@ void X11Window::OnConfigureEvent(const x11::ConfigureNotifyEvent& configure,
bounds_in_pixels_ = new_bounds_px;
if (size_changed)
- DispatchResize();
+ DispatchResize(origin_changed);
else if (origin_changed)
- NotifyBoundsChanged(bounds_in_pixels_);
+ NotifyBoundsChanged(/*origin changed=*/true);
}
void X11Window::SetWMSpecState(bool enabled,
@@ -2346,13 +2383,13 @@ void X11Window::OnFrameExtentsUpdated() {
// Removes |delayed_resize_task_| from the task queue (if it's in the queue) and
// adds it back at the end of the queue.
-void X11Window::DispatchResize() {
+void X11Window::DispatchResize(bool origin_changed) {
if (update_counter_ == x11::Sync::Counter{} ||
configure_counter_value_ == 0) {
// WM doesn't support _NET_WM_SYNC_REQUEST. Or we are too slow, so
// _NET_WM_SYNC_REQUEST is disabled by the compositor.
delayed_resize_task_.Reset(base::BindOnce(
- &X11Window::DelayedResize, base::Unretained(this), bounds_in_pixels_));
+ &X11Window::DelayedResize, base::Unretained(this), origin_changed));
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, delayed_resize_task_.callback());
return;
@@ -2369,10 +2406,10 @@ void X11Window::DispatchResize() {
// If _NET_WM_SYNC_REQUEST is used to synchronize with compositor during
// resizing, the compositor will not resize the window, until last resize is
// handled, so we don't need accumulate resize events.
- DelayedResize(bounds_in_pixels_);
+ DelayedResize(origin_changed);
}
-void X11Window::DelayedResize(const gfx::Rect& bounds_in_pixels) {
+void X11Window::DelayedResize(bool origin_changed) {
if (configure_counter_value_is_extended_ &&
(current_counter_value_ % 2) == 0) {
// Increase the |extended_update_counter_|, so the compositor will know we
@@ -2384,7 +2421,7 @@ void X11Window::DelayedResize(const gfx::Rect& bounds_in_pixels) {
}
CancelResize();
- NotifyBoundsChanged(bounds_in_pixels);
+ NotifyBoundsChanged(/*origin changed=*/origin_changed);
// No more member accesses here: bounds change propagation may have deleted
// |this| (e.g. when a chrome window is snapped into a tab strip. Further
@@ -2447,9 +2484,9 @@ void X11Window::UpdateWindowRegion(
}
}
-void X11Window::NotifyBoundsChanged(const gfx::Rect& new_bounds_in_px) {
+void X11Window::NotifyBoundsChanged(bool origin_changed) {
ResetWindowRegion();
- OnXWindowBoundsChanged(new_bounds_in_px);
+ platform_window_delegate_->OnBoundsChanged({origin_changed});
}
bool X11Window::InitializeAsStatusIcon() {
diff --git a/chromium/ui/ozone/platform/x11/x11_window.h b/chromium/ui/ozone/platform/x11/x11_window.h
index 509003b0103..28ed150d302 100644
--- a/chromium/ui/ozone/platform/x11/x11_window.h
+++ b/chromium/ui/ozone/platform/x11/x11_window.h
@@ -13,6 +13,7 @@
#include "base/cancelable_callback.h"
#include "base/containers/flat_set.h"
#include "base/gtest_prod_util.h"
+#include "base/memory/raw_ptr.h"
#include "ui/base/dragdrop/mojom/drag_drop_types.mojom-forward.h"
#include "ui/base/x/x11_desktop_window_move_client.h"
#include "ui/base/x/x11_drag_drop_client.h"
@@ -148,7 +149,6 @@ class X11Window : public PlatformWindow,
void OnXWindowStateChanged();
void OnXWindowDamageEvent(const gfx::Rect& damage_rect);
- void OnXWindowBoundsChanged(const gfx::Rect& size);
void OnXWindowCloseRequested();
void OnXWindowIsActiveChanged(bool active);
void OnXWindowWorkspaceChanged();
@@ -240,7 +240,7 @@ class X11Window : public PlatformWindow,
void SetFlashFrameHint(bool flash_frame);
void UpdateMinAndMaxSize();
- void DispatchResize();
+ void DispatchResize(bool origin_changed);
void CancelResize();
// Resets the window region for the current window bounds if necessary.
@@ -287,7 +287,7 @@ class X11Window : public PlatformWindow,
void MaybeUpdateOcclusionState();
- void DelayedResize(const gfx::Rect& bounds_in_pixels);
+ void DelayedResize(bool origin_changed);
// If mapped, sends a message to the window manager to enable or disable the
// states |state1| and |state2|. Otherwise, the states will be enabled or
@@ -307,7 +307,7 @@ class X11Window : public PlatformWindow,
void UpdateWindowRegion(std::unique_ptr<std::vector<x11::Rectangle>> region);
- void NotifyBoundsChanged(const gfx::Rect& new_bounds_in_px);
+ void NotifyBoundsChanged(bool origin_changed);
// Initializes as a status icon window.
bool InitializeAsStatusIcon();
@@ -315,11 +315,11 @@ class X11Window : public PlatformWindow,
// Stores current state of this window.
PlatformWindowState state_ = PlatformWindowState::kUnknown;
- PlatformWindowDelegate* const platform_window_delegate_;
+ const raw_ptr<PlatformWindowDelegate> platform_window_delegate_;
- WorkspaceExtensionDelegate* workspace_extension_delegate_ = nullptr;
+ raw_ptr<WorkspaceExtensionDelegate> workspace_extension_delegate_ = nullptr;
- X11ExtensionDelegate* x11_extension_delegate_ = nullptr;
+ raw_ptr<X11ExtensionDelegate> x11_extension_delegate_ = nullptr;
// Tells if the window got a ::Close call.
bool is_shutting_down_ = false;
@@ -341,7 +341,7 @@ class X11Window : public PlatformWindow,
// Handles XDND events going through this window.
std::unique_ptr<XDragDropClient> drag_drop_client_;
WmDragHandler::DragFinishedCallback drag_finished_callback_;
- WmDragHandler::LocationDelegate* drag_location_delegate_ = nullptr;
+ raw_ptr<WmDragHandler::LocationDelegate> drag_location_delegate_ = nullptr;
// Run loop used while dragging from this window.
std::unique_ptr<X11MoveLoop> drag_loop_;
@@ -350,7 +350,7 @@ class X11Window : public PlatformWindow,
std::unique_ptr<x11::XScopedEventSelector> source_window_events_;
// The display and the native X window hosting the root window.
- x11::Connection* const connection_;
+ const raw_ptr<x11::Connection> connection_;
x11::Window xwindow_ = x11::Window::None;
x11::Window x_root_window_ = x11::Window::None;
@@ -369,7 +369,7 @@ class X11Window : public PlatformWindow,
// Was this window initialized with the override_redirect window attribute?
bool override_redirect_ = false;
- std::u16string window_title_;
+ absl::optional<std::u16string> window_title_;
// Whether the window is visible with respect to Aura.
bool window_mapped_in_client_ = false;
@@ -392,6 +392,9 @@ class X11Window : public PlatformWindow,
// True if the window should stay on top of most other windows.
bool is_always_on_top_ = false;
+ // True if the window is security-sensitive. Implies |is_always_on_top_|.
+ bool is_security_surface_ = false;
+
// True if the window is fully obscured by another window.
bool is_occluded_ = false;
@@ -487,10 +490,14 @@ class X11Window : public PlatformWindow,
// cross-display fullscreening, there is a Restore() (called by BrowserView)
// that may cause configuration bounds updates that make this window appear to
// temporarily be on a different screen than its destination screen. This
- // restore only happens if the window is maximized.
- bool ignore_next_configure_ = false;
+ // restore only happens if the window is maximized. The integer represents how
+ // many events to ignore.
+ int ignore_next_configures_ = 0;
// True between Restore() and the next OnXWindowStateChanged().
bool restore_in_flight_ = false;
+ // True between SetBoundsInPixels (when the bounds actually change) and the
+ // next OnConfigureEvent.
+ bool bounds_change_in_flight_ = false;
base::CancelableOnceClosure delayed_resize_task_;
diff --git a/chromium/ui/ozone/platform/x11/x11_window_manager.cc b/chromium/ui/ozone/platform/x11/x11_window_manager.cc
index 2db427e0fcd..d1add9c0a5c 100644
--- a/chromium/ui/ozone/platform/x11/x11_window_manager.cc
+++ b/chromium/ui/ozone/platform/x11/x11_window_manager.cc
@@ -42,7 +42,7 @@ void X11WindowManager::GrabEvents(X11Window* window) {
// - |located_events_grabber_| is set to have capture.
// OR
// - The topmost window underneath the mouse is managed by Chrome.
- auto* old_grabber = located_events_grabber_;
+ auto* old_grabber = located_events_grabber_.get();
// Update |located_events_grabber_| prior to calling OnXWindowLostCapture() to
// avoid releasing pointer grab.
@@ -58,7 +58,7 @@ void X11WindowManager::UngrabEvents(X11Window* window) {
// Release mouse grab asynchronously. A window managed by Chrome is likely
// the topmost window underneath the mouse so the capture release being
// asynchronous is likely inconsequential.
- auto* old_grabber = located_events_grabber_;
+ auto* old_grabber = located_events_grabber_.get();
located_events_grabber_ = nullptr;
old_grabber->OnXWindowLostCapture();
}
diff --git a/chromium/ui/ozone/platform/x11/x11_window_manager.h b/chromium/ui/ozone/platform/x11/x11_window_manager.h
index 0ca496cb4a5..dbceb44192f 100644
--- a/chromium/ui/ozone/platform/x11/x11_window_manager.h
+++ b/chromium/ui/ozone/platform/x11/x11_window_manager.h
@@ -6,6 +6,7 @@
#define UI_OZONE_PLATFORM_X11_X11_WINDOW_MANAGER_H_
#include "base/containers/flat_map.h"
+#include "base/memory/raw_ptr.h"
#include "ui/gfx/native_widget_types.h"
namespace ui {
@@ -48,8 +49,8 @@ class X11WindowManager {
}
private:
- X11Window* located_events_grabber_ = nullptr;
- X11Window* window_mouse_currently_on_ = nullptr;
+ raw_ptr<X11Window> located_events_grabber_ = nullptr;
+ raw_ptr<X11Window> window_mouse_currently_on_ = nullptr;
base::flat_map<gfx::AcceleratedWidget, X11Window*> windows_;
};
diff --git a/chromium/ui/ozone/platform/x11/x11_window_ozone_unittest.cc b/chromium/ui/ozone/platform/x11/x11_window_ozone_unittest.cc
index 8f8953cb32b..7b9c5732b18 100644
--- a/chromium/ui/ozone/platform/x11/x11_window_ozone_unittest.cc
+++ b/chromium/ui/ozone/platform/x11/x11_window_ozone_unittest.cc
@@ -36,7 +36,7 @@ ACTION_P(StoreWidget, widget_ptr) {
}
ACTION_P(CloneEvent, event_ptr) {
- *event_ptr = Event::Clone(*arg0);
+ *event_ptr = arg0->Clone();
}
// TestScreen implementation. We need to set a screen instance, because
@@ -292,8 +292,10 @@ TEST_F(X11WindowOzoneTest, ToggleFullscreen) {
FakeX11ExtensionDelegateForSize x11_extension_delegate(screen_bounds_in_px);
auto window =
CreatePlatformWindow(&delegate, bounds, &widget, &x11_extension_delegate);
+ EXPECT_CALL(
+ delegate,
+ OnBoundsChanged(testing::Eq(PlatformWindowDelegate::BoundsChange{true})));
- EXPECT_CALL(delegate, OnBoundsChanged(testing::Eq(screen_bounds_in_px)));
window->ToggleFullscreen();
}
diff --git a/chromium/ui/ozone/public/gl_ozone.h b/chromium/ui/ozone/public/gl_ozone.h
index ef4ec09e51a..31f243b3782 100644
--- a/chromium/ui/ozone/public/gl_ozone.h
+++ b/chromium/ui/ozone/public/gl_ozone.h
@@ -14,6 +14,7 @@
#include "ui/gl/gl_display.h"
#include "ui/gl/gl_implementation.h"
#include "ui/gl/gpu_preference.h"
+#include "ui/ozone/public/native_pixmap_gl_binding.h"
namespace gl {
class GLContext;
@@ -56,6 +57,24 @@ class COMPONENT_EXPORT(OZONE_BASE) GLOzone {
// Clears static GL bindings.
virtual void ShutdownGL(gl::GLDisplay* display) = 0;
+ // Returns true if the NativePixmap of the specified type can be imported
+ // into GL using ImportNativePixmap().
+ virtual bool CanImportNativePixmap() = 0;
+
+ // Imports NativePixmap into GL and binds it to the provided texture_id. The
+ // NativePixmapGLBinding does not take ownership of the provided texture_id
+ // and the client is expected to keep the binding alive while the texture is
+ // being used. This is because the NativePixmapGLBinding is not guaranteed to
+ // live until glDeleteTextures fn is called on all platforms.
+ virtual std::unique_ptr<NativePixmapGLBinding> ImportNativePixmap(
+ scoped_refptr<gfx::NativePixmap> pixmap,
+ gfx::BufferFormat plane_format,
+ gfx::BufferPlane plane,
+ gfx::Size plane_size,
+ const gfx::ColorSpace& color_space,
+ GLenum target,
+ GLuint texture_id) = 0;
+
// Returns information about the GL window system binding implementation (eg.
// EGL, GLX, WGL). Returns true if the information was retrieved successfully.
virtual bool GetGLWindowSystemBindingInfo(
@@ -72,6 +91,7 @@ class COMPONENT_EXPORT(OZONE_BASE) GLOzone {
// Creates a GL surface that renders directly to a view.
virtual scoped_refptr<gl::GLSurface> CreateViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget window) = 0;
// Creates a GL surface that renders directly into a window with surfaceless
@@ -80,10 +100,12 @@ class COMPONENT_EXPORT(OZONE_BASE) GLOzone {
// unsupported.
// TODO(spang): Consider deprecating this and using OverlaySurface for GL.
virtual scoped_refptr<gl::GLSurface> CreateSurfacelessViewGLSurface(
+ gl::GLDisplay* display,
gfx::AcceleratedWidget window) = 0;
// Creates a GL surface used for offscreen rendering.
virtual scoped_refptr<gl::GLSurface> CreateOffscreenGLSurface(
+ gl::GLDisplay* display,
const gfx::Size& size) = 0;
};
diff --git a/chromium/ui/ozone/public/hardware_capabilities.h b/chromium/ui/ozone/public/hardware_capabilities.h
index d802b6645cc..cb2b474b866 100644
--- a/chromium/ui/ozone/public/hardware_capabilities.h
+++ b/chromium/ui/ozone/public/hardware_capabilities.h
@@ -16,6 +16,11 @@ struct HardwareCapabilities {
// This is specifically the count of non-CURSOR planes, because some boards
// may have extra PRIMARY planes that could be used for overlays.
int num_overlay_capable_planes = 0;
+ // Whether the CURSOR plane can be displayed independently of the other
+ // planes. On some platforms, the CURSOR plane is flattened to the topmost
+ // plane before presentation, so all transformations on the topmost plane
+ // (e.g. translation, scaling) are erroneously applied to the CURSOR as well.
+ bool has_independent_cursor_plane = true;
};
using HardwareCapabilitiesCallback =
base::RepeatingCallback<void(HardwareCapabilities)>;
diff --git a/chromium/ui/ozone/public/native_pixmap_gl_binding.cc b/chromium/ui/ozone/public/native_pixmap_gl_binding.cc
new file mode 100644
index 00000000000..896c8342b4b
--- /dev/null
+++ b/chromium/ui/ozone/public/native_pixmap_gl_binding.cc
@@ -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.
+
+#include "ui/ozone/public/native_pixmap_gl_binding.h"
+
+#include "base/logging.h"
+#include "base/memory/scoped_refptr.h"
+#include "ui/gl/gl_bindings.h"
+#include "ui/gl/scoped_binders.h"
+
+namespace ui {
+
+NativePixmapGLBinding::NativePixmapGLBinding() = default;
+NativePixmapGLBinding::~NativePixmapGLBinding() = default;
+
+// The GLImgeNativePixmap::BindTexImage and GLImageNativePixmap::Initialize will
+// be merged to NativePixmapEGLBinding and corresponding code for
+// GLImageGLXNativePixmap will move to NativePixmapGLXBinding leading to the
+// deletion of BindTexture here.
+bool NativePixmapGLBinding::BindTexture(scoped_refptr<gl::GLImage> gl_image,
+ GLenum target,
+ GLuint texture_id) {
+ gl_image_ = gl_image;
+ gl::ScopedTextureBinder binder(target, texture_id);
+
+ gl::GLApi* api = gl::g_current_gl_context;
+ DCHECK(api);
+ api->glTexParameteriFn(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ api->glTexParameteriFn(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ api->glTexParameteriFn(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ api->glTexParameteriFn(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ if (!gl_image_->BindTexImage(target)) {
+ LOG(ERROR) << "Unable to bind GL image to target = " << target;
+ return false;
+ }
+
+ return true;
+}
+
+GLuint NativePixmapGLBinding::GetInternalFormat() {
+ return gl_image_->GetInternalFormat();
+}
+
+GLenum NativePixmapGLBinding::GetDataFormat() {
+ return gl_image_->GetDataFormat();
+}
+
+GLenum NativePixmapGLBinding::GetDataType() {
+ return gl_image_->GetDataType();
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/public/native_pixmap_gl_binding.h b/chromium/ui/ozone/public/native_pixmap_gl_binding.h
new file mode 100644
index 00000000000..9553c936212
--- /dev/null
+++ b/chromium/ui/ozone/public/native_pixmap_gl_binding.h
@@ -0,0 +1,40 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PUBLIC_NATIVE_PIXMAP_GL_BINDING_H_
+#define UI_OZONE_PUBLIC_NATIVE_PIXMAP_GL_BINDING_H_
+
+#include "base/component_export.h"
+#include "ui/gl/gl_image.h"
+
+typedef unsigned int GLuint;
+typedef unsigned int GLenum;
+
+namespace ui {
+
+// A binding maintained between NativePixmap and GL Texture in Ozone.
+class COMPONENT_EXPORT(OZONE_BASE) NativePixmapGLBinding {
+ public:
+ NativePixmapGLBinding();
+ virtual ~NativePixmapGLBinding();
+
+ GLuint GetInternalFormat();
+ GLenum GetDataFormat();
+ GLenum GetDataType();
+
+ protected:
+ bool BindTexture(scoped_refptr<gl::GLImage>,
+ GLenum target,
+ GLuint texture_id);
+
+ private:
+ // TODO(hitawala): Merge BindTexImage, Initialize from GLImage and its
+ // subclasses {NativePixmap, GLXNativePixmap} to NativePixmapGLBinding and its
+ // subclasses once we stop using them elsewhere eg. VDA decoders in media.
+ scoped_refptr<gl::GLImage> gl_image_;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PUBLIC_NATIVE_PIXMAP_GL_BINDING_H_
diff --git a/chromium/ui/ozone/public/overlay_surface_candidate.cc b/chromium/ui/ozone/public/overlay_surface_candidate.cc
index 3b1e59e1f93..712eb61657d 100644
--- a/chromium/ui/ozone/public/overlay_surface_candidate.cc
+++ b/chromium/ui/ozone/public/overlay_surface_candidate.cc
@@ -28,10 +28,11 @@ bool OverlaySurfaceCandidate::operator<(
gfx::Rect rrect = gfx::ToNearestRect(param.display_rect);
return std::tie(plane_z_order, format, lrect, lwidth, lheight, transform,
- crop_rect, is_opaque, opacity, native_pixmap_unique_id) <
+ crop_rect, is_opaque, opacity, native_pixmap_unique_id,
+ color_space) <
std::tie(param.plane_z_order, param.format, rrect, rwidth, rheight,
param.transform, param.crop_rect, param.is_opaque,
- param.opacity, param.native_pixmap_unique_id);
+ param.opacity, param.native_pixmap_unique_id, color_space);
}
} // namespace ui
diff --git a/chromium/ui/ozone/public/overlay_surface_candidate.h b/chromium/ui/ozone/public/overlay_surface_candidate.h
index 6a722f2604e..2fc79c7c693 100644
--- a/chromium/ui/ozone/public/overlay_surface_candidate.h
+++ b/chromium/ui/ozone/public/overlay_surface_candidate.h
@@ -11,6 +11,7 @@
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/gfx/buffer_types.h"
+#include "ui/gfx/color_space.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/rect_f.h"
#include "ui/gfx/geometry/rrect_f.h"
@@ -43,6 +44,8 @@ class COMPONENT_EXPORT(OZONE_BASE) OverlaySurfaceCandidate {
gfx::OverlayTransform transform = gfx::OVERLAY_TRANSFORM_NONE;
// Format of the buffer to composite.
gfx::BufferFormat format = gfx::BufferFormat::BGRA_8888;
+ // Color space of the buffer
+ gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();
// Stacking order of the overlay plane relative to the main surface,
// which is 0. Signed to allow for "underlays".
int plane_z_order = 0;
diff --git a/chromium/ui/ozone/public/ozone_platform.h b/chromium/ui/ozone/public/ozone_platform.h
index df6b551b94b..193224d3328 100644
--- a/chromium/ui/ozone/public/ozone_platform.h
+++ b/chromium/ui/ozone/public/ozone_platform.h
@@ -31,6 +31,8 @@ enum class PlatformKeyboardHookTypes;
class CursorFactory;
class GpuPlatformSupportHost;
+class ImeKeyEventDispatcher;
+class InputMethod;
class InputController;
class KeyEvent;
class OverlayManagerOzone;
@@ -46,11 +48,6 @@ class PlatformUtils;
class SurfaceFactoryOzone;
class SystemInputInjector;
-namespace internal {
-class InputMethodDelegate;
-} // namespace internal
-class InputMethod;
-
struct PlatformWindowInitProperties;
// Base class for Ozone platform implementations.
@@ -268,7 +265,7 @@ class COMPONENT_EXPORT(OZONE) OzonePlatform {
virtual void InitScreen(PlatformScreen* screen) = 0;
virtual PlatformClipboard* GetPlatformClipboard();
virtual std::unique_ptr<InputMethod> CreateInputMethod(
- internal::InputMethodDelegate* delegate,
+ ImeKeyEventDispatcher* ime_key_event_dispatcher,
gfx::AcceleratedWidget widget) = 0;
virtual PlatformGLEGLUtility* GetPlatformGLEGLUtility();
virtual PlatformMenuUtils* GetPlatformMenuUtils();
diff --git a/chromium/ui/ozone/public/ozone_ui_controls_test_helper.h b/chromium/ui/ozone/public/ozone_ui_controls_test_helper.h
index a0bdd18f33e..0a67db3d949 100644
--- a/chromium/ui/ozone/public/ozone_ui_controls_test_helper.h
+++ b/chromium/ui/ozone/public/ozone_ui_controls_test_helper.h
@@ -50,6 +50,15 @@ class OzoneUIControlsTestHelper {
const gfx::Point& mouse_root_loc,
base::OnceClosure closure) = 0;
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+ // Sends touch event and executes |closure| when done.
+ virtual void SendTouchEvent(gfx::AcceleratedWidget widget,
+ int action,
+ int id,
+ const gfx::Point& touch_loc,
+ base::OnceClosure closure) = 0;
+#endif
+
// Executes closure after all pending ui events are sent.
virtual void RunClosureAfterAllPendingUIEvents(base::OnceClosure closure) = 0;
diff --git a/chromium/ui/ozone/public/platform_global_shortcut_listener.h b/chromium/ui/ozone/public/platform_global_shortcut_listener.h
index a5b539d4e74..5b6ceb2e23d 100644
--- a/chromium/ui/ozone/public/platform_global_shortcut_listener.h
+++ b/chromium/ui/ozone/public/platform_global_shortcut_listener.h
@@ -6,6 +6,7 @@
#define UI_OZONE_PUBLIC_PLATFORM_GLOBAL_SHORTCUT_LISTENER_H_
#include "base/component_export.h"
+#include "base/memory/raw_ptr.h"
#include "ui/events/keycodes/keyboard_codes.h"
namespace ui {
@@ -61,7 +62,7 @@ class COMPONENT_EXPORT(OZONE_BASE) PlatformGlobalShortcutListener {
PlatformGlobalShortcutListenerDelegate* delegate() { return delegate_; }
private:
- PlatformGlobalShortcutListenerDelegate* delegate_;
+ raw_ptr<PlatformGlobalShortcutListenerDelegate> delegate_;
};
} // namespace ui
diff --git a/chromium/ui/ozone/public/platform_screen.cc b/chromium/ui/ozone/public/platform_screen.cc
index 98f599aa41d..07b8699fe36 100644
--- a/chromium/ui/ozone/public/platform_screen.cc
+++ b/chromium/ui/ozone/public/platform_screen.cc
@@ -14,7 +14,7 @@ PlatformScreen::PlatformScreen() = default;
PlatformScreen::~PlatformScreen() = default;
gfx::AcceleratedWidget PlatformScreen::GetLocalProcessWidgetAtPoint(
- const gfx::Point& point,
+ const gfx::Point& point_in_dip,
const std::set<gfx::AcceleratedWidget>& ignore) const {
NOTIMPLEMENTED_LOG_ONCE();
return gfx::kNullAcceleratedWidget;
@@ -30,9 +30,13 @@ std::string PlatformScreen::GetCurrentWorkspace() {
return {};
}
-bool PlatformScreen::SetScreenSaverSuspended(bool suspend) {
+PlatformScreen::PlatformScreenSaverSuspender::~PlatformScreenSaverSuspender() =
+ default;
+
+std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender>
+PlatformScreen::SuspendScreenSaver() {
NOTIMPLEMENTED_LOG_ONCE();
- return false;
+ return nullptr;
}
bool PlatformScreen::IsScreenSaverActive() const {
@@ -45,20 +49,20 @@ base::TimeDelta PlatformScreen::CalculateIdleTime() const {
return base::Seconds(0);
}
-std::vector<base::Value> PlatformScreen::GetGpuExtraInfo(
+base::Value::List PlatformScreen::GetGpuExtraInfo(
const gfx::GpuExtraInfo& gpu_extra_info) {
- return std::vector<base::Value>();
+ return base::Value::List();
}
void PlatformScreen::SetDeviceScaleFactor(float scale) {}
void PlatformScreen::StorePlatformNameIntoListOfValues(
- std::vector<base::Value>& values,
+ base::Value::List& values,
const std::string& platform_name) {
- base::Value dict(base::Value::Type::DICTIONARY);
- dict.SetKey("description", base::Value("Ozone platform"));
- dict.SetKey("value", base::Value(platform_name));
- values.push_back(std::move(dict));
+ base::Value::Dict dict;
+ dict.Set("description", "Ozone platform");
+ dict.Set("value", platform_name);
+ values.Append(std::move(dict));
}
} // namespace ui
diff --git a/chromium/ui/ozone/public/platform_screen.h b/chromium/ui/ozone/public/platform_screen.h
index 091220a99f7..d8b85c5277d 100644
--- a/chromium/ui/ozone/public/platform_screen.h
+++ b/chromium/ui/ozone/public/platform_screen.h
@@ -51,7 +51,7 @@ class COMPONENT_EXPORT(OZONE_BASE) PlatformScreen {
virtual ~PlatformScreen();
- // Provide a |display:;Display| for each physical display available to Chrome.
+ // Provide a |display::Display| for each physical display available to Chrome.
virtual const std::vector<display::Display>& GetAllDisplays() const = 0;
// Returns the |Display| whose origin (top left corner) is 0,0 in the
@@ -72,16 +72,16 @@ class COMPONENT_EXPORT(OZONE_BASE) PlatformScreen {
gfx::AcceleratedWidget widget) const;
virtual gfx::AcceleratedWidget GetAcceleratedWidgetAtScreenPoint(
- const gfx::Point& point) const = 0;
+ const gfx::Point& point_in_dip) const = 0;
// Returns top level accelerated widget at |point| ignoring |ignore|.
virtual gfx::AcceleratedWidget GetLocalProcessWidgetAtPoint(
- const gfx::Point& point,
+ const gfx::Point& point_in_dip,
const std::set<gfx::AcceleratedWidget>& ignore) const;
// Returns the |Display| nearest the specified point. |point| must be in DIPs.
virtual display::Display GetDisplayNearestPoint(
- const gfx::Point& point) const = 0;
+ const gfx::Point& point_in_dip) const = 0;
// Returns the |Display| that most closely intersects the provided rect if one
// exists.
@@ -89,11 +89,27 @@ class COMPONENT_EXPORT(OZONE_BASE) PlatformScreen {
virtual display::Display GetDisplayMatching(
const gfx::Rect& match_rect) const = 0;
- // Suspends or un-suspends the platform-specific screensaver, and returns
- // whether the operation was successful. Can be called more than once with the
- // same value for |suspend|, but those states should not stack: the first
- // alternating value should toggle the state of the suspend.
- virtual bool SetScreenSaverSuspended(bool suspend);
+ // Object which suspends the platform-specific screensaver for the duration of
+ // its existence.
+ class PlatformScreenSaverSuspender {
+ public:
+ PlatformScreenSaverSuspender() = default;
+
+ PlatformScreenSaverSuspender(const PlatformScreenSaverSuspender&) = delete;
+ PlatformScreenSaverSuspender& operator=(
+ const PlatformScreenSaverSuspender&) = delete;
+
+ // Causes the platform-specific screensaver to be un-suspended iff this is
+ // the last remaining instance.
+ virtual ~PlatformScreenSaverSuspender() = 0;
+ };
+
+ // Suspends the platform-specific screensaver until the returned
+ // |PlatformScreenSaverSuspender| is destructed, or returns nullptr if
+ // suspension failed. This method allows stacking multiple overlapping calls,
+ // such that the platform-specific screensaver will not be un-suspended until
+ // all returned |PlatformScreenSaverSuspender| instances have been destructed.
+ virtual std::unique_ptr<PlatformScreenSaverSuspender> SuspendScreenSaver();
// Returns whether the screensaver is currently running.
virtual bool IsScreenSaverActive() const;
@@ -111,7 +127,7 @@ class COMPONENT_EXPORT(OZONE_BASE) PlatformScreen {
// Returns human readable description of the window manager, desktop, and
// other system properties related to the compositing.
- virtual std::vector<base::Value> GetGpuExtraInfo(
+ virtual base::Value::List GetGpuExtraInfo(
const gfx::GpuExtraInfo& gpu_extra_info);
// Sets device scale factor received from external sources such as toolkits.
@@ -119,7 +135,7 @@ class COMPONENT_EXPORT(OZONE_BASE) PlatformScreen {
virtual void SetDeviceScaleFactor(float scale);
protected:
- void StorePlatformNameIntoListOfValues(std::vector<base::Value>& values,
+ void StorePlatformNameIntoListOfValues(base::Value::List& values,
const std::string& platform_name);
};
diff --git a/chromium/ui/ozone/public/surface_factory_ozone.cc b/chromium/ui/ozone/public/surface_factory_ozone.cc
index 1a2954b16f3..e8d00fb7025 100644
--- a/chromium/ui/ozone/public/surface_factory_ozone.cc
+++ b/chromium/ui/ozone/public/surface_factory_ozone.cc
@@ -10,6 +10,7 @@
#include "base/command_line.h"
#include "gpu/vulkan/buildflags.h"
#include "ui/gfx/native_pixmap.h"
+#include "ui/gl/gl_implementation.h"
#include "ui/ozone/public/overlay_surface.h"
#include "ui/ozone/public/platform_window_surface.h"
#include "ui/ozone/public/surface_ozone_canvas.h"
@@ -34,6 +35,10 @@ GLOzone* SurfaceFactoryOzone::GetGLOzone(
return nullptr;
}
+GLOzone* SurfaceFactoryOzone::GetCurrentGLOzone() {
+ return GetGLOzone(gl::GetGLImplementationParts());
+}
+
#if BUILDFLAG(ENABLE_VULKAN)
std::unique_ptr<gpu::VulkanImplementation>
SurfaceFactoryOzone::CreateVulkanImplementation(bool use_swiftshader,
diff --git a/chromium/ui/ozone/public/surface_factory_ozone.h b/chromium/ui/ozone/public/surface_factory_ozone.h
index a4e49a5f596..2e664aee22e 100644
--- a/chromium/ui/ozone/public/surface_factory_ozone.h
+++ b/chromium/ui/ozone/public/surface_factory_ozone.h
@@ -78,6 +78,10 @@ class COMPONENT_EXPORT(OZONE_BASE) SurfaceFactoryOzone {
// GL implementation doesn't exist.
virtual GLOzone* GetGLOzone(const gl::GLImplementationParts& implementation);
+ // Returns the current GLOzone based on the OzonePlatform and
+ // GLImplementationParts currently in use.
+ GLOzone* GetCurrentGLOzone();
+
#if BUILDFLAG(ENABLE_VULKAN)
// Creates the vulkan implementation. This object should be capable of
// creating surfaces that swap to a platform window.
diff --git a/chromium/ui/ozone/test/mock_platform_window_delegate.cc b/chromium/ui/ozone/test/mock_platform_window_delegate.cc
index 76bdda12d91..4ab6df34f87 100644
--- a/chromium/ui/ozone/test/mock_platform_window_delegate.cc
+++ b/chromium/ui/ozone/test/mock_platform_window_delegate.cc
@@ -10,9 +10,9 @@ MockPlatformWindowDelegate::MockPlatformWindowDelegate() {}
MockPlatformWindowDelegate::~MockPlatformWindowDelegate() {}
-bool operator==(const PlatformWindowDelegate::BoundsChange& bounds,
- const gfx::Rect& rect) {
- return bounds.bounds == rect;
+bool operator==(const PlatformWindowDelegate::BoundsChange& a,
+ const PlatformWindowDelegate::BoundsChange& b) {
+ return a.origin_changed == b.origin_changed;
}
} // namespace ui
diff --git a/chromium/ui/ozone/test/mock_platform_window_delegate.h b/chromium/ui/ozone/test/mock_platform_window_delegate.h
index 9da86660d04..9a45ab3ccd7 100644
--- a/chromium/ui/ozone/test/mock_platform_window_delegate.h
+++ b/chromium/ui/ozone/test/mock_platform_window_delegate.h
@@ -40,13 +40,13 @@ class MockPlatformWindowDelegate : public PlatformWindowDelegate {
MOCK_METHOD0(GetMinimumSizeForWindow, absl::optional<gfx::Size>());
MOCK_METHOD0(GetMaximumSizeForWindow, absl::optional<gfx::Size>());
MOCK_METHOD0(GetMenuType, absl::optional<MenuType>());
- MOCK_METHOD0(GetOwnedWindowAnchorAndRectInPx,
+ MOCK_METHOD0(GetOwnedWindowAnchorAndRectInDIP,
absl::optional<OwnedWindowAnchor>());
MOCK_METHOD0(OnMouseEnter, void());
};
-bool operator==(const PlatformWindowDelegate::BoundsChange& bounds,
- const gfx::Rect& rect);
+bool operator==(const PlatformWindowDelegate::BoundsChange& a,
+ const PlatformWindowDelegate::BoundsChange& b);
} // namespace ui
diff --git a/chromium/ui/platform_window/extensions/wayland_extension.h b/chromium/ui/platform_window/extensions/wayland_extension.h
index 7241f6efd1f..4e4036d866b 100644
--- a/chromium/ui/platform_window/extensions/wayland_extension.h
+++ b/chromium/ui/platform_window/extensions/wayland_extension.h
@@ -75,6 +75,10 @@ class COMPONENT_EXPORT(PLATFORM_WINDOW) WaylandExtension {
// Retrieve current layout state.
virtual bool GetTabletMode() = 0;
+ // Signals the underneath platform to float the browser window on top other
+ // windows.
+ virtual void SetFloat(bool value) = 0;
+
protected:
virtual ~WaylandExtension();
diff --git a/chromium/ui/platform_window/platform_window_delegate.cc b/chromium/ui/platform_window/platform_window_delegate.cc
index ea10ab55688..33c4d3505ef 100644
--- a/chromium/ui/platform_window/platform_window_delegate.cc
+++ b/chromium/ui/platform_window/platform_window_delegate.cc
@@ -11,13 +11,6 @@
namespace ui {
-PlatformWindowDelegate::BoundsChange::BoundsChange() = default;
-
-PlatformWindowDelegate::BoundsChange::BoundsChange(const gfx::Rect& bounds)
- : bounds(bounds) {}
-
-PlatformWindowDelegate::BoundsChange::~BoundsChange() = default;
-
PlatformWindowDelegate::PlatformWindowDelegate() = default;
PlatformWindowDelegate::~PlatformWindowDelegate() = default;
@@ -44,7 +37,7 @@ void PlatformWindowDelegate::OnOcclusionStateChanged(
PlatformWindowOcclusionState occlusion_state) {}
absl::optional<OwnedWindowAnchor>
-PlatformWindowDelegate::GetOwnedWindowAnchorAndRectInPx() {
+PlatformWindowDelegate::GetOwnedWindowAnchorAndRectInDIP() {
return absl::nullopt;
}
diff --git a/chromium/ui/platform_window/platform_window_delegate.h b/chromium/ui/platform_window/platform_window_delegate.h
index 1bae07b641d..470c4a1be22 100644
--- a/chromium/ui/platform_window/platform_window_delegate.h
+++ b/chromium/ui/platform_window/platform_window_delegate.h
@@ -46,12 +46,13 @@ enum class PlatformWindowOcclusionState {
class COMPONENT_EXPORT(PLATFORM_WINDOW) PlatformWindowDelegate {
public:
struct COMPONENT_EXPORT(PLATFORM_WINDOW) BoundsChange {
- BoundsChange();
- BoundsChange(const gfx::Rect& bounds);
- ~BoundsChange();
+ BoundsChange() = delete;
+ constexpr BoundsChange(bool origin_changed)
+ : origin_changed(origin_changed) {}
+ ~BoundsChange() = default;
- // The dimensions of the window, in physical window coordinates.
- gfx::Rect bounds;
+ // True if the bounds change resulted in the origin change.
+ bool origin_changed : 1;
#if BUILDFLAG(IS_FUCHSIA)
// The widths of border regions which are obscured by overlapping
@@ -135,7 +136,7 @@ class COMPONENT_EXPORT(PLATFORM_WINDOW) PlatformWindowDelegate {
// positioning. Useful for such backends as Wayland as it provides flexibility
// in positioning child windows, which must be repositioned if the originally
// intended position caused the surface to be constrained.
- virtual absl::optional<OwnedWindowAnchor> GetOwnedWindowAnchorAndRectInPx();
+ virtual absl::optional<OwnedWindowAnchor> GetOwnedWindowAnchorAndRectInDIP();
// Enables or disables frame rate throttling.
virtual void SetFrameRateThrottleEnabled(bool enabled);
diff --git a/chromium/ui/platform_window/platform_window_init_properties.h b/chromium/ui/platform_window/platform_window_init_properties.h
index 1a28dd570d8..d22d103be7d 100644
--- a/chromium/ui/platform_window/platform_window_init_properties.h
+++ b/chromium/ui/platform_window/platform_window_init_properties.h
@@ -11,6 +11,8 @@
#include "base/memory/raw_ptr.h"
#include "build/build_config.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
+#include "third_party/skia/include/core/SkColor.h"
+#include "ui/base/ui_base_types.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/native_widget_types.h"
@@ -106,9 +108,11 @@ struct COMPONENT_EXPORT(PLATFORM_WINDOW) PlatformWindowInitProperties {
bool activatable = true;
bool force_show_in_taskbar;
bool keep_on_top = false;
+ bool is_security_surface = false;
bool visible_on_all_workspaces = false;
bool remove_standard_frame = false;
std::string workspace;
+ ZOrderLevel z_order = ZOrderLevel::kNormal;
raw_ptr<WorkspaceExtensionDelegate> workspace_extension_delegate = nullptr;
@@ -116,8 +120,8 @@ struct COMPONENT_EXPORT(PLATFORM_WINDOW) PlatformWindowInitProperties {
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
bool prefer_dark_theme = false;
- gfx::ImageSkia* icon = nullptr;
- absl::optional<int> background_color;
+ raw_ptr<gfx::ImageSkia> icon = nullptr;
+ absl::optional<SkColor> background_color;
// Specifies the res_name and res_class fields,
// respectively, of the WM_CLASS window property. Controls window grouping
@@ -126,7 +130,7 @@ struct COMPONENT_EXPORT(PLATFORM_WINDOW) PlatformWindowInitProperties {
std::string wm_class_name;
std::string wm_class_class;
- X11ExtensionDelegate* x11_extension_delegate = nullptr;
+ raw_ptr<X11ExtensionDelegate> x11_extension_delegate = nullptr;
// Wayland specific. Holds the application ID that is used by the window
// manager to match the desktop entry and group windows.
diff --git a/chromium/ui/platform_window/stub/stub_window.cc b/chromium/ui/platform_window/stub/stub_window.cc
index 5057c6c7de5..2e9a421dc00 100644
--- a/chromium/ui/platform_window/stub/stub_window.cc
+++ b/chromium/ui/platform_window/stub/stub_window.cc
@@ -50,8 +50,9 @@ void StubWindow::SetBoundsInPixels(const gfx::Rect& bounds) {
// Even if the pixel bounds didn't change this call to the delegate should
// still happen. The device scale factor may have changed which effectively
// changes the bounds.
+ bool origin_changed = bounds_.origin() != bounds.origin();
bounds_ = bounds;
- delegate_->OnBoundsChanged(bounds);
+ delegate_->OnBoundsChanged({origin_changed});
}
gfx::Rect StubWindow::GetBoundsInPixels() const {
diff --git a/chromium/ui/platform_window/win/win_window.cc b/chromium/ui/platform_window/win/win_window.cc
index a522f774991..03ac2848d05 100644
--- a/chromium/ui/platform_window/win/win_window.cc
+++ b/chromium/ui/platform_window/win/win_window.cc
@@ -311,8 +311,7 @@ void WinWindow::OnWindowPosChanged(WINDOWPOS* window_pos) {
if (!(window_pos->flags & SWP_NOSIZE) || !(window_pos->flags & SWP_NOMOVE)) {
RECT cr;
GetClientRect(hwnd(), &cr);
- delegate_->OnBoundsChanged(gfx::Rect(
- window_pos->x, window_pos->y, cr.right - cr.left, cr.bottom - cr.top));
+ delegate_->OnBoundsChanged({true});
}
}
diff --git a/chromium/ui/qt/BUILD.gn b/chromium/ui/qt/BUILD.gn
index a74956f9e34..2382cd30cc4 100644
--- a/chromium/ui/qt/BUILD.gn
+++ b/chromium/ui/qt/BUILD.gn
@@ -8,7 +8,7 @@ import("//ui/qt/qt.gni")
assert(use_qt)
assert(is_linux)
-assert(!is_chromecast)
+assert(!is_castos)
pkg_config("qt5_config") {
packages = [
@@ -79,7 +79,7 @@ shared_library("qt5_shim") {
}
component("qt") {
- visibility = [ "//ui/views/linux_ui:linux_ui_factory" ]
+ visibility = [ "//ui/linux:linux_ui_factory" ]
defines = [ "IS_QT_IMPL" ]
@@ -88,14 +88,17 @@ component("qt") {
deps = [
":qt_interface",
"//base",
- "//skia",
+ "//printing/buildflags",
+ "//ui/base/ime/linux",
"//ui/color",
"//ui/color:mixers",
"//ui/gfx",
+ "//ui/linux:linux_ui_impl",
"//ui/native_theme",
"//ui/shell_dialogs",
"//ui/views",
]
+ public_deps = [ "//skia" ]
sources = [
"qt_ui.cc",
diff --git a/chromium/ui/qt/DEPS b/chromium/ui/qt/DEPS
index a41bfb887b5..1d8a7b31b85 100644
--- a/chromium/ui/qt/DEPS
+++ b/chromium/ui/qt/DEPS
@@ -1,7 +1,11 @@
include_rules = [
+ "+chrome/browser/themes/theme_properties.h",
+ "+printing",
"+third_party/skia",
+ "+ui/base",
"+ui/color",
"+ui/gfx",
+ "+ui/linux",
"+ui/native_theme",
"+ui/shell_dialogs",
"+ui/views",
diff --git a/chromium/ui/qt/qt_interface.h b/chromium/ui/qt/qt_interface.h
index df4f1d546c0..24627bda71e 100644
--- a/chromium/ui/qt/qt_interface.h
+++ b/chromium/ui/qt/qt_interface.h
@@ -111,6 +111,7 @@ class QtInterface {
virtual ~Delegate() = default;
virtual void FontChanged() = 0;
+ virtual void ThemeChanged() = 0;
};
QtInterface() = default;
@@ -124,6 +125,15 @@ class QtInterface {
virtual Image GetIconForContentType(const String& content_type,
int size) const = 0;
virtual SkColor GetColor(ColorType role, ColorState state) const = 0;
+ virtual SkColor GetFrameColor(ColorState state,
+ bool use_custom_frame) const = 0;
+ virtual Image DrawHeader(int width,
+ int height,
+ SkColor default_color,
+ ColorState state,
+ bool use_custom_frame) const = 0;
+ virtual int GetCursorBlinkIntervalMs() const = 0;
+ virtual int GetAnimationDurationMs() const = 0;
};
} // namespace qt
diff --git a/chromium/ui/qt/qt_shim.cc b/chromium/ui/qt/qt_shim.cc
index 0cb5e4f64c0..5bdcf61caca 100644
--- a/chromium/ui/qt/qt_shim.cc
+++ b/chromium/ui/qt/qt_shim.cc
@@ -11,7 +11,10 @@
#include <QIcon>
#include <QMimeDatabase>
#include <QMimeType>
+#include <QPainter>
#include <QPalette>
+#include <QStyle>
+#include <QStyleOptionTitleBar>
namespace qt {
@@ -90,12 +93,13 @@ SkColor TextureColor(QImage image) {
size_t r = 0;
size_t g = 0;
size_t b = 0;
- const auto* pixels = image.bits();
+ const auto* pixels = reinterpret_cast<QRgb*>(image.bits());
for (size_t i = 0; i < size; i++) {
- a += pixels[4 * i + 0];
- r += pixels[4 * i + 1];
- g += pixels[4 * i + 2];
- b += pixels[4 * i + 3];
+ auto color = QColor::fromRgba(pixels[i]);
+ a += color.alpha();
+ r += color.red();
+ g += color.green();
+ b += color.blue();
}
return qRgba(r / size, g / size, b / size, a / size);
}
@@ -194,6 +198,8 @@ QtShim::QtShim(QtInterface::Delegate* delegate, int* argc, char** argv)
: delegate_(delegate), app_(*argc, argv) {
connect(&app_, SIGNAL(fontChanged(const QFont&)), this,
SLOT(FontChanged(const QFont&)));
+ connect(&app_, SIGNAL(paletteChanged(const QPalette&)), this,
+ SLOT(PaletteChanged(const QPalette&)));
}
QtShim::~QtShim() = default;
@@ -249,10 +255,67 @@ SkColor QtShim::GetColor(ColorType role, ColorState state) const {
ColorTypeToColorRole(role)));
}
+SkColor QtShim::GetFrameColor(ColorState state, bool use_custom_frame) const {
+ constexpr int kSampleSize = 32;
+ return TextureColor(DrawHeaderImpl(kSampleSize, kSampleSize,
+ GetColor(ColorType::kWindowBg, state),
+ state, use_custom_frame));
+}
+
+int QtShim::GetCursorBlinkIntervalMs() const {
+ return app_.cursorFlashTime();
+}
+
+int QtShim::GetAnimationDurationMs() const {
+ return app_.style()->styleHint(QStyle::SH_Widget_Animation_Duration);
+}
+
void QtShim::FontChanged(const QFont& font) {
delegate_->FontChanged();
}
+void QtShim::PaletteChanged(const QPalette& palette) {
+ delegate_->ThemeChanged();
+}
+
+Image QtShim::DrawHeader(int width,
+ int height,
+ SkColor default_color,
+ ColorState state,
+ bool use_custom_frame) const {
+ QImage image =
+ DrawHeaderImpl(width, height, default_color, state, use_custom_frame);
+ return {width, height, 1.0f, Buffer(image.bits(), image.sizeInBytes())};
+}
+
+QImage QtShim::DrawHeaderImpl(int width,
+ int height,
+ SkColor default_color,
+ ColorState state,
+ bool use_custom_frame) const {
+ QImage image(width, height, QImage::Format_ARGB32_Premultiplied);
+ image.fill(default_color);
+ QPainter painter(&image);
+ if (use_custom_frame) {
+ // Chrome renders it's own window border, so clip the border out by
+ // rendering the titlebar larger than the image.
+ constexpr int kBorderWidth = 5;
+
+ QStyleOptionTitleBar opt;
+ opt.rect = QRect(-kBorderWidth, -kBorderWidth, width + 2 * kBorderWidth,
+ height + 2 * kBorderWidth);
+ if (state == ColorState::kNormal)
+ opt.titleBarState = QStyle::State_Active;
+ app_.style()->drawComplexControl(QStyle::CC_TitleBar, &opt, &painter,
+ nullptr);
+ } else {
+ painter.fillRect(
+ 0, 0, width, height,
+ app_.palette().brush(ColorStateToColorGroup(state), QPalette::Window));
+ }
+ return image;
+}
+
} // namespace qt
qt::QtInterface* CreateQtInterface(qt::QtInterface::Delegate* delegate,
diff --git a/chromium/ui/qt/qt_shim.h b/chromium/ui/qt/qt_shim.h
index 8b707b81f8f..3255eb5eab2 100644
--- a/chromium/ui/qt/qt_shim.h
+++ b/chromium/ui/qt/qt_shim.h
@@ -6,6 +6,7 @@
#define UI_QT_QT_SHIM_H_
#include <QApplication>
+#include <QImage>
#include <QObject>
#include "ui/qt/qt_interface.h"
@@ -29,11 +30,25 @@ class QtShim : public QObject, public QtInterface {
Image GetIconForContentType(const String& content_type,
int size) const override;
SkColor GetColor(ColorType role, ColorState state) const override;
+ SkColor GetFrameColor(ColorState state, bool use_custom_frame) const override;
+ Image DrawHeader(int width,
+ int height,
+ SkColor default_color,
+ ColorState state,
+ bool use_custom_frame) const override;
+ int GetCursorBlinkIntervalMs() const override;
+ int GetAnimationDurationMs() const override;
private slots:
void FontChanged(const QFont& font);
+ void PaletteChanged(const QPalette& palette);
private:
+ QImage DrawHeaderImpl(int width,
+ int height,
+ SkColor default_color,
+ ColorState state,
+ bool use_custom_frame) const;
QtInterface::Delegate* const delegate_;
QApplication app_;
diff --git a/chromium/ui/qt/qt_shim_moc.cc b/chromium/ui/qt/qt_shim_moc.cc
index 9d2c2bb539d..e88d2cc0164 100644
--- a/chromium/ui/qt/qt_shim_moc.cc
+++ b/chromium/ui/qt/qt_shim_moc.cc
@@ -26,8 +26,8 @@ QT_BEGIN_MOC_NAMESPACE
QT_WARNING_PUSH
QT_WARNING_DISABLE_DEPRECATED
struct qt_meta_stringdata_qt__QtShim_t {
- QByteArrayData data[4];
- char stringdata0[29];
+ QByteArrayData data[6];
+ char stringdata0[52];
};
#define QT_MOC_LITERAL(idx, ofs, len) \
Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET( \
@@ -38,10 +38,13 @@ static const qt_meta_stringdata_qt__QtShim_t qt_meta_stringdata_qt__QtShim = {
QT_MOC_LITERAL(0, 0, 10), // "qt::QtShim"
QT_MOC_LITERAL(1, 11, 11), // "FontChanged"
QT_MOC_LITERAL(2, 23, 0), // ""
- QT_MOC_LITERAL(3, 24, 4) // "font"
+ QT_MOC_LITERAL(3, 24, 4), // "font"
+ QT_MOC_LITERAL(4, 29, 14), // "PaletteChanged"
+ QT_MOC_LITERAL(5, 44, 7) // "palette"
},
- "qt::QtShim\0FontChanged\0\0font"};
+ "qt::QtShim\0FontChanged\0\0font\0"
+ "PaletteChanged\0palette"};
#undef QT_MOC_LITERAL
static const uint qt_meta_data_qt__QtShim[] = {
@@ -50,7 +53,7 @@ static const uint qt_meta_data_qt__QtShim[] = {
8, // revision
0, // classname
0, 0, // classinfo
- 1, 14, // methods
+ 2, 14, // methods
0, 0, // properties
0, 0, // enums/sets
0, 0, // constructors
@@ -58,10 +61,11 @@ static const uint qt_meta_data_qt__QtShim[] = {
0, // signalCount
// slots: name, argc, parameters, tag, flags
- 1, 1, 19, 2, 0x08 /* Private */,
+ 1, 1, 24, 2, 0x08 /* Private */, 4, 1, 27, 2, 0x08 /* Private */,
// slots: parameters
- QMetaType::Void, QMetaType::QFont, 3,
+ QMetaType::Void, QMetaType::QFont, 3, QMetaType::Void, QMetaType::QPalette,
+ 5,
0 // eod
};
@@ -77,6 +81,9 @@ void qt::QtShim::qt_static_metacall(QObject* _o,
case 0:
_t->FontChanged((*reinterpret_cast<const QFont(*)>(_a[1])));
break;
+ case 1:
+ _t->PaletteChanged((*reinterpret_cast<const QPalette(*)>(_a[1])));
+ break;
default:;
}
}
@@ -107,13 +114,13 @@ int qt::QtShim::qt_metacall(QMetaObject::Call _c, int _id, void** _a) {
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
- if (_id < 1)
+ if (_id < 2)
qt_static_metacall(this, _c, _id, _a);
- _id -= 1;
+ _id -= 2;
} else if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
- if (_id < 1)
+ if (_id < 2)
*reinterpret_cast<int*>(_a[0]) = -1;
- _id -= 1;
+ _id -= 2;
}
return _id;
}
diff --git a/chromium/ui/qt/qt_ui.cc b/chromium/ui/qt/qt_ui.cc
index 41e16bbb30f..5cb57982e34 100644
--- a/chromium/ui/qt/qt_ui.cc
+++ b/chromium/ui/qt/qt_ui.cc
@@ -9,23 +9,30 @@
#include "base/check.h"
#include "base/command_line.h"
#include "base/cxx17_backports.h"
+#include "base/memory/raw_ptr.h"
#include "base/notreached.h"
#include "base/path_service.h"
+#include "base/time/time.h"
+#include "chrome/browser/themes/theme_properties.h" // nogncheck
#include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/base/ime/linux/linux_input_method_context.h"
#include "ui/color/color_mixer.h"
#include "ui/color/color_provider.h"
#include "ui/color/color_recipe.h"
#include "ui/gfx/color_palette.h"
+#include "ui/gfx/color_utils.h"
#include "ui/gfx/font.h"
#include "ui/gfx/font_render_params.h"
#include "ui/gfx/font_render_params_linux.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/image/image_skia_rep.h"
#include "ui/gfx/image/image_skia_source.h"
+#include "ui/linux/linux_ui.h"
#include "ui/native_theme/native_theme_aura.h"
#include "ui/native_theme/native_theme_base.h"
#include "ui/qt/qt_interface.h"
#include "ui/shell_dialogs/select_file_policy.h"
+#include "ui/shell_dialogs/shell_dialog_linux.h"
#include "ui/views/controls/button/label_button_border.h"
namespace qt {
@@ -73,27 +80,54 @@ gfx::FontRenderParams::Hinting QtHintingToGfxHinting(
} // namespace
-// We currently don't render any QT widgets, so this class is just a stub.
class QtNativeTheme : public ui::NativeThemeAura {
public:
- QtNativeTheme()
+ explicit QtNativeTheme(QtInterface* shim)
: ui::NativeThemeAura(/*use_overlay_scrollbars=*/false,
/*should_only_use_dark_colors=*/false,
- /*is_custom_system_theme=*/true) {}
+ /*is_custom_system_theme=*/true),
+ shim_(shim) {}
QtNativeTheme(const QtNativeTheme&) = delete;
QtNativeTheme& operator=(const QtNativeTheme&) = delete;
~QtNativeTheme() override = default;
+
+ // ui::NativeTheme:
+ void PaintFrameTopArea(cc::PaintCanvas* canvas,
+ State state,
+ const gfx::Rect& rect,
+ const FrameTopAreaExtraParams& frame_top_area,
+ ColorScheme color_scheme) const override {
+ auto image = shim_->DrawHeader(
+ rect.width(), rect.height(), frame_top_area.default_background_color,
+ frame_top_area.is_active ? ColorState::kNormal : ColorState::kInactive,
+ frame_top_area.use_custom_frame);
+ SkImageInfo image_info = SkImageInfo::Make(
+ image.width, image.height, kBGRA_8888_SkColorType, kPremul_SkAlphaType);
+ SkBitmap bitmap;
+ bitmap.installPixels(
+ image_info, image.data_argb.Take(), image_info.minRowBytes(),
+ [](void* data, void*) { free(data); }, nullptr);
+ bitmap.setImmutable();
+ canvas->drawImage(cc::PaintImage::CreateFromBitmap(std::move(bitmap)),
+ rect.x(), rect.y());
+ }
+
+ private:
+ raw_ptr<QtInterface> const shim_;
};
-QtUi::QtUi() = default;
+QtUi::QtUi(std::unique_ptr<ui::LinuxUi> fallback_linux_ui)
+ : fallback_linux_ui_(std::move(fallback_linux_ui)) {}
-QtUi::~QtUi() = default;
+QtUi::~QtUi() {
+ shell_dialog_linux::Finalize();
+}
std::unique_ptr<ui::LinuxInputMethodContext> QtUi::CreateInputMethodContext(
- ui::LinuxInputMethodContextDelegate* delegate,
- bool is_simple) const {
- NOTIMPLEMENTED_LOG_ONCE();
- return nullptr;
+ ui::LinuxInputMethodContextDelegate* delegate) const {
+ return fallback_linux_ui_
+ ? fallback_linux_ui_->CreateInputMethodContext(delegate)
+ : nullptr;
}
gfx::FontRenderParams QtUi::GetDefaultFontRenderParams() const {
@@ -103,7 +137,7 @@ gfx::FontRenderParams QtUi::GetDefaultFontRenderParams() const {
void QtUi::GetDefaultFontDescription(std::string* family_out,
int* size_pixels_out,
int* style_out,
- gfx::Font::Weight* weight_out,
+ int* weight_out,
gfx::FontRenderParams* params_out) const {
if (family_out)
*family_out = font_family_;
@@ -118,10 +152,11 @@ void QtUi::GetDefaultFontDescription(std::string* family_out,
}
ui::SelectFileDialog* QtUi::CreateSelectFileDialog(
- ui::SelectFileDialog::Listener* listener,
+ void* listener,
std::unique_ptr<ui::SelectFilePolicy> policy) const {
- NOTIMPLEMENTED_LOG_ONCE();
- return nullptr;
+ return fallback_linux_ui_ ? fallback_linux_ui_->CreateSelectFileDialog(
+ listener, std::move(policy))
+ : nullptr;
}
bool QtUi::Initialize() {
@@ -138,57 +173,54 @@ bool QtUi::Initialize() {
cmd_line_ = CopyCmdLine(*base::CommandLine::ForCurrentProcess());
shim_.reset((reinterpret_cast<decltype(&CreateQtInterface)>(
create_qt_interface)(this, &cmd_line_.argc, cmd_line_.argv.data())));
- native_theme_ = std::make_unique<QtNativeTheme>();
+ native_theme_ = std::make_unique<QtNativeTheme>(shim_.get());
ui::ColorProviderManager::Get().AppendColorProviderInitializer(
base::BindRepeating(&QtUi::AddNativeColorMixer, base::Unretained(this)));
FontChanged();
+ shell_dialog_linux::Initialize();
return true;
}
-bool QtUi::GetTint(int id, color_utils::HSL* tint) const {
- NOTIMPLEMENTED_LOG_ONCE();
- return false;
-}
-
bool QtUi::GetColor(int id, SkColor* color, bool use_custom_frame) const {
- NOTIMPLEMENTED_LOG_ONCE();
- return false;
+ auto value = GetColor(id, use_custom_frame);
+ if (value)
+ *color = *value;
+ return value.has_value();
}
bool QtUi::GetDisplayProperty(int id, int* result) const {
- NOTIMPLEMENTED_LOG_ONCE();
- return false;
+ switch (id) {
+ case ThemeProperties::SHOULD_FILL_BACKGROUND_TAB_COLOR:
+ *result = false;
+ return true;
+ default:
+ return false;
+ }
}
SkColor QtUi::GetFocusRingColor() const {
- NOTIMPLEMENTED_LOG_ONCE();
- return gfx::kPlaceholderColor;
+ return shim_->GetColor(ColorType::kHighlightBg, ColorState::kNormal);
}
SkColor QtUi::GetActiveSelectionBgColor() const {
- NOTIMPLEMENTED_LOG_ONCE();
- return gfx::kPlaceholderColor;
+ return shim_->GetColor(ColorType::kHighlightBg, ColorState::kNormal);
}
SkColor QtUi::GetActiveSelectionFgColor() const {
- NOTIMPLEMENTED_LOG_ONCE();
- return gfx::kPlaceholderColor;
+ return shim_->GetColor(ColorType::kHighlightFg, ColorState::kNormal);
}
SkColor QtUi::GetInactiveSelectionBgColor() const {
- NOTIMPLEMENTED_LOG_ONCE();
- return gfx::kPlaceholderColor;
+ return shim_->GetColor(ColorType::kHighlightBg, ColorState::kInactive);
}
SkColor QtUi::GetInactiveSelectionFgColor() const {
- NOTIMPLEMENTED_LOG_ONCE();
- return gfx::kPlaceholderColor;
+ return shim_->GetColor(ColorType::kHighlightFg, ColorState::kInactive);
}
base::TimeDelta QtUi::GetCursorBlinkInterval() const {
- NOTIMPLEMENTED_LOG_ONCE();
- return base::TimeDelta();
+ return base::Milliseconds(shim_->GetCursorBlinkIntervalMs());
}
gfx::Image QtUi::GetIconForContentType(const std::string& content_type,
@@ -231,28 +263,27 @@ float QtUi::GetDeviceScaleFactor() const {
}
bool QtUi::PreferDarkTheme() const {
- NOTIMPLEMENTED_LOG_ONCE();
- return false;
+ return color_utils::IsDark(
+ shim_->GetColor(ColorType::kWindowBg, ColorState::kNormal));
}
bool QtUi::AnimationsEnabled() const {
- NOTIMPLEMENTED_LOG_ONCE();
- return true;
+ return shim_->GetAnimationDurationMs() > 0;
}
-std::unique_ptr<views::NavButtonProvider> QtUi::CreateNavButtonProvider() {
+std::unique_ptr<ui::NavButtonProvider> QtUi::CreateNavButtonProvider() {
// QT prefers server-side decorations.
return nullptr;
}
-views::WindowFrameProvider* QtUi::GetWindowFrameProvider(bool solid_frame) {
+ui::WindowFrameProvider* QtUi::GetWindowFrameProvider(bool solid_frame) {
// QT prefers server-side decorations.
return nullptr;
}
base::flat_map<std::string, std::string> QtUi::GetKeyboardLayoutMap() {
- NOTIMPLEMENTED_LOG_ONCE();
- return {};
+ return fallback_linux_ui_ ? fallback_linux_ui_->GetKeyboardLayoutMap()
+ : base::flat_map<std::string, std::string>{};
}
std::string QtUi::GetCursorThemeName() {
@@ -267,29 +298,29 @@ int QtUi::GetCursorThemeSize() {
return 0;
}
-std::vector<std::string> QtUi::GetAvailableSystemThemeNamesForTest() const {
- // In QT, themes are binary plugins that are loaded on start and can't be
- // changed at runtime. The style may change, but there's no common interface
- // for doing this from a client. Return a single empty theme here to
- // represent the current theme.
- return {std::string()};
+ui::NativeTheme* QtUi::GetNativeThemeImpl() const {
+ return native_theme_.get();
}
-void QtUi::SetSystemThemeByNameForTest(const std::string& theme_name) {
- // Ensure we only get passed the "current theme" name that we returned from
- // GetAvailableSystemThemeNamesForTest() above.
- DCHECK(theme_name.empty());
+bool QtUi::GetTextEditCommandsForEvent(
+ const ui::Event& event,
+ std::vector<ui::TextEditCommandAuraLinux>* commands) {
+ // QT doesn't have "key themes" (eg. readline bindings) like GTK.
+ return false;
}
-ui::NativeTheme* QtUi::GetNativeTheme() const {
- return native_theme_.get();
+#if BUILDFLAG(ENABLE_PRINTING)
+printing::PrintDialogLinuxInterface* QtUi::CreatePrintDialog(
+ printing::PrintingContextLinux* context) {
+ return fallback_linux_ui_ ? fallback_linux_ui_->CreatePrintDialog(context)
+ : nullptr;
}
-bool QtUi::MatchEvent(const ui::Event& event,
- std::vector<ui::TextEditCommandAuraLinux>* commands) {
- // QT doesn't have "key themes" (eg. readline bindings) like GTK.
- return false;
+gfx::Size QtUi::GetPdfPaperSize(printing::PrintingContextLinux* context) {
+ return fallback_linux_ui_ ? fallback_linux_ui_->GetPdfPaperSize(context)
+ : gfx::Size();
}
+#endif
void QtUi::FontChanged() {
auto params = shim_->GetFontRenderParams();
@@ -304,15 +335,14 @@ void QtUi::FontChanged() {
font_size_pixels_ = font_size_points_ * GetDeviceScaleFactor();
}
font_style_ = desc.is_italic ? gfx::Font::ITALIC : gfx::Font::NORMAL;
- font_weight_ =
- static_cast<gfx::Font::Weight>(QtWeightToCssWeight(desc.weight));
+ font_weight_ = QtWeightToCssWeight(desc.weight);
gfx::FontRenderParamsQuery query;
query.families = {font_family_};
query.pixel_size = font_size_pixels_;
query.point_size = font_size_points_;
query.style = font_style_;
- query.weight = font_weight_;
+ query.weight = static_cast<gfx::Font::Weight>(font_weight_);
gfx::FontRenderParams fc_params;
gfx::QueryFontconfig(query, &fc_params, nullptr);
@@ -326,6 +356,10 @@ void QtUi::FontChanged() {
};
}
+void QtUi::ThemeChanged() {
+ native_theme_->NotifyOnNativeThemeUpdated();
+}
+
void QtUi::AddNativeColorMixer(ui::ColorProvider* provider,
const ui::ColorProviderManager::Key& key) {
if (key.system_theme == ui::ColorProviderManager::SystemTheme::kDefault)
@@ -385,10 +419,81 @@ void QtUi::AddNativeColorMixer(ui::ColorProvider* provider,
};
for (const auto& map : kMaps)
mixer[map.id] = {shim_->GetColor(map.role, map.state)};
+
+ mixer[ui::kColorFrameActive] = {
+ shim_->GetFrameColor(ColorState::kNormal, true)};
+ mixer[ui::kColorFrameInactive] = {
+ shim_->GetFrameColor(ColorState::kInactive, true)};
+}
+
+absl::optional<SkColor> QtUi::GetColor(int id, bool use_custom_frame) const {
+ switch (id) {
+ case ThemeProperties::COLOR_LOCATION_BAR_BORDER:
+ return shim_->GetColor(ColorType::kEntryFg, ColorState::kNormal);
+ case ThemeProperties::COLOR_TOOLBAR_CONTENT_AREA_SEPARATOR:
+ return shim_->GetColor(ColorType::kButtonFg, ColorState::kNormal);
+ case ThemeProperties::COLOR_TOOLBAR_VERTICAL_SEPARATOR:
+ return shim_->GetColor(ColorType::kButtonFg, ColorState::kNormal);
+ case ThemeProperties::COLOR_NTP_BACKGROUND:
+ return shim_->GetColor(ColorType::kEntryBg, ColorState::kNormal);
+ case ThemeProperties::COLOR_NTP_TEXT:
+ return shim_->GetColor(ColorType::kEntryFg, ColorState::kNormal);
+ case ThemeProperties::COLOR_NTP_HEADER:
+ return shim_->GetColor(ColorType::kButtonFg, ColorState::kNormal);
+ case ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON:
+ return shim_->GetColor(ColorType::kWindowFg, ColorState::kNormal);
+ case ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON_HOVERED:
+ return shim_->GetColor(ColorType::kWindowFg, ColorState::kNormal);
+ case ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON_PRESSED:
+ return shim_->GetColor(ColorType::kWindowFg, ColorState::kNormal);
+ case ThemeProperties::COLOR_TOOLBAR_TEXT:
+ return shim_->GetColor(ColorType::kWindowFg, ColorState::kNormal);
+ case ThemeProperties::COLOR_NTP_LINK:
+ return shim_->GetColor(ColorType::kHighlightBg, ColorState::kNormal);
+ case ThemeProperties::COLOR_FRAME_ACTIVE:
+ return shim_->GetFrameColor(ColorState::kNormal, use_custom_frame);
+ case ThemeProperties::COLOR_FRAME_INACTIVE:
+ return shim_->GetFrameColor(ColorState::kInactive, use_custom_frame);
+ case ThemeProperties::COLOR_FRAME_ACTIVE_INCOGNITO:
+ return shim_->GetFrameColor(ColorState::kNormal, use_custom_frame);
+ case ThemeProperties::COLOR_FRAME_INACTIVE_INCOGNITO:
+ return shim_->GetFrameColor(ColorState::kInactive, use_custom_frame);
+ case ThemeProperties::COLOR_TOOLBAR:
+ return shim_->GetColor(ColorType::kButtonBg, ColorState::kNormal);
+ case ThemeProperties::COLOR_TAB_BACKGROUND_ACTIVE_FRAME_ACTIVE:
+ return shim_->GetColor(ColorType::kButtonBg, ColorState::kNormal);
+ case ThemeProperties::COLOR_TAB_BACKGROUND_ACTIVE_FRAME_INACTIVE:
+ return shim_->GetColor(ColorType::kButtonBg, ColorState::kInactive);
+ case ThemeProperties::COLOR_TAB_FOREGROUND_INACTIVE_FRAME_ACTIVE:
+ return color_utils::BlendForMinContrast(
+ shim_->GetColor(ColorType::kButtonBg, ColorState::kNormal),
+ shim_->GetFrameColor(ColorState::kNormal, use_custom_frame))
+ .color;
+ case ThemeProperties::COLOR_TAB_FOREGROUND_INACTIVE_FRAME_INACTIVE:
+ return color_utils::BlendForMinContrast(
+ shim_->GetColor(ColorType::kButtonBg, ColorState::kInactive),
+ shim_->GetFrameColor(ColorState::kInactive, use_custom_frame))
+ .color;
+ case ThemeProperties::COLOR_TAB_STROKE_FRAME_ACTIVE:
+ return color_utils::BlendForMinContrast(
+ shim_->GetColor(ColorType::kButtonBg, ColorState::kNormal),
+ shim_->GetColor(ColorType::kButtonBg, ColorState::kNormal),
+ SK_ColorBLACK, 2.0)
+ .color;
+ case ThemeProperties::COLOR_TAB_STROKE_FRAME_INACTIVE:
+ return color_utils::BlendForMinContrast(
+ shim_->GetColor(ColorType::kButtonBg, ColorState::kInactive),
+ shim_->GetColor(ColorType::kButtonBg, ColorState::kInactive),
+ SK_ColorBLACK, 2.0)
+ .color;
+ default:
+ return absl::nullopt;
+ }
}
-std::unique_ptr<views::LinuxUI> CreateQtUi() {
- return std::make_unique<QtUi>();
+std::unique_ptr<ui::LinuxUi> CreateQtUi(
+ std::unique_ptr<ui::LinuxUi> fallback_linux_ui) {
+ return std::make_unique<QtUi>(std::move(fallback_linux_ui));
}
} // namespace qt
diff --git a/chromium/ui/qt/qt_ui.h b/chromium/ui/qt/qt_ui.h
index 4e19bcb9dce..2735e2675f2 100644
--- a/chromium/ui/qt/qt_ui.h
+++ b/chromium/ui/qt/qt_ui.h
@@ -8,17 +8,26 @@
#include <memory>
#include "base/component_export.h"
+#include "printing/buildflags/buildflags.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+#include "ui/color/color_provider.h"
+#include "ui/color/color_provider_manager.h"
+#include "ui/gfx/font_render_params.h"
+#include "ui/linux/linux_ui_base.h"
#include "ui/qt/qt_interface.h"
-#include "ui/views/linux_ui/linux_ui.h"
+
+#if BUILDFLAG(ENABLE_PRINTING)
+#include "printing/printing_context_linux.h" // nogncheck
+#endif
namespace qt {
class QtNativeTheme;
// Interface to QT desktop features.
-class QtUi : public views::LinuxUI, QtInterface::Delegate {
+class QtUi : public ui::LinuxUiBase, QtInterface::Delegate {
public:
- QtUi();
+ explicit QtUi(std::unique_ptr<ui::LinuxUi> fallback_linux_ui);
QtUi(const QtUi&) = delete;
QtUi& operator=(const QtUi&) = delete;
@@ -27,8 +36,7 @@ class QtUi : public views::LinuxUI, QtInterface::Delegate {
// ui::LinuxInputMethodContextFactory:
std::unique_ptr<ui::LinuxInputMethodContext> CreateInputMethodContext(
- ui::LinuxInputMethodContextDelegate* delegate,
- bool is_simple) const override;
+ ui::LinuxInputMethodContextDelegate* delegate) const override;
// gfx::LinuxFontDelegate:
gfx::FontRenderParams GetDefaultFontRenderParams() const override;
@@ -36,17 +44,16 @@ class QtUi : public views::LinuxUI, QtInterface::Delegate {
std::string* family_out,
int* size_pixels_out,
int* style_out,
- gfx::Font::Weight* weight_out,
+ int* weight_out,
gfx::FontRenderParams* params_out) const override;
// ui::ShellDialogLinux:
ui::SelectFileDialog* CreateSelectFileDialog(
- ui::SelectFileDialog::Listener* listener,
+ void* listener,
std::unique_ptr<ui::SelectFilePolicy> policy) const override;
- // views::LinuxUI:
+ // ui::LinuxUi:
bool Initialize() override;
- bool GetTint(int id, color_utils::HSL* tint) const override;
bool GetColor(int id, SkColor* color, bool use_custom_frame) const override;
bool GetDisplayProperty(int id, int* result) const override;
SkColor GetFocusRingColor() const override;
@@ -63,26 +70,39 @@ class QtUi : public views::LinuxUI, QtInterface::Delegate {
float GetDeviceScaleFactor() const override;
bool PreferDarkTheme() const override;
bool AnimationsEnabled() const override;
- std::unique_ptr<views::NavButtonProvider> CreateNavButtonProvider() override;
- views::WindowFrameProvider* GetWindowFrameProvider(bool solid_frame) override;
+ std::unique_ptr<ui::NavButtonProvider> CreateNavButtonProvider() override;
+ ui::WindowFrameProvider* GetWindowFrameProvider(bool solid_frame) override;
base::flat_map<std::string, std::string> GetKeyboardLayoutMap() override;
std::string GetCursorThemeName() override;
int GetCursorThemeSize() override;
- std::vector<std::string> GetAvailableSystemThemeNamesForTest() const override;
- void SetSystemThemeByNameForTest(const std::string& theme_name) override;
- ui::NativeTheme* GetNativeTheme() const override;
+ ui::NativeTheme* GetNativeThemeImpl() const override;
// ui::TextEditKeybindingDelegate:
- bool MatchEvent(const ui::Event& event,
- std::vector<ui::TextEditCommandAuraLinux>* commands) override;
+ bool GetTextEditCommandsForEvent(
+ const ui::Event& event,
+ std::vector<ui::TextEditCommandAuraLinux>* commands) override;
+
+#if BUILDFLAG(ENABLE_PRINTING)
+ // printing::PrintingContextLinuxDelegate:
+ printing::PrintDialogLinuxInterface* CreatePrintDialog(
+ printing::PrintingContextLinux* context) override;
+ gfx::Size GetPdfPaperSize(printing::PrintingContextLinux* context) override;
+#endif
// QtInterface::Delegate:
void FontChanged() override;
+ void ThemeChanged() override;
private:
void AddNativeColorMixer(ui::ColorProvider* provider,
const ui::ColorProviderManager::Key& key);
+ absl::optional<SkColor> GetColor(int id, bool use_custom_frame) const;
+
+ // TODO(https://crbug.com/1317782): This is a fallback for any unimplemented
+ // functionality in the QT backend and should eventually be removed.
+ std::unique_ptr<ui::LinuxUi> fallback_linux_ui_;
+
// QT modifies argc and argv, and they must be kept alive while
// `shim_` is alive.
CmdLineArgs cmd_line_;
@@ -92,7 +112,7 @@ class QtUi : public views::LinuxUI, QtInterface::Delegate {
int font_size_pixels_ = 0;
int font_size_points_ = 0;
gfx::Font::FontStyle font_style_ = gfx::Font::NORMAL;
- gfx::Font::Weight font_weight_;
+ int font_weight_;
gfx::FontRenderParams font_params_;
std::unique_ptr<QtInterface> shim_;
@@ -102,7 +122,8 @@ class QtUi : public views::LinuxUI, QtInterface::Delegate {
// This should be the only symbol exported from this component.
COMPONENT_EXPORT(QT)
-std::unique_ptr<views::LinuxUI> CreateQtUi();
+std::unique_ptr<ui::LinuxUi> CreateQtUi(
+ std::unique_ptr<ui::LinuxUi> fallback_linux_ui);
} // namespace qt
diff --git a/chromium/ui/resources/BUILD.gn b/chromium/ui/resources/BUILD.gn
index 044cfba1ae6..065b99cd501 100644
--- a/chromium/ui/resources/BUILD.gn
+++ b/chromium/ui/resources/BUILD.gn
@@ -159,14 +159,8 @@ repack("repack_ui_test_pak_100_percent") {
}
if (is_chromeos_ash) {
- sources += [
- "$root_gen_dir/ash/app_list/resources/app_list_resources_100_percent.pak",
- "$root_gen_dir/ui/chromeos/resources/ui_chromeos_resources_100_percent.pak",
- ]
- deps += [
- "//ash/app_list/resources",
- "//ui/chromeos/resources",
- ]
+ sources += [ "$root_gen_dir/ui/chromeos/resources/ui_chromeos_resources_100_percent.pak" ]
+ deps += [ "//ui/chromeos/resources" ]
}
if (toolkit_views) {
diff --git a/chromium/ui/shell_dialogs/BUILD.gn b/chromium/ui/shell_dialogs/BUILD.gn
index 83b8a4a81a1..3c75b8f9b83 100644
--- a/chromium/ui/shell_dialogs/BUILD.gn
+++ b/chromium/ui/shell_dialogs/BUILD.gn
@@ -41,11 +41,11 @@ component("shell_dialogs") {
"//url",
]
- if (is_chromeos || is_chromecast) {
+ if (is_chromeos || is_castos || is_cast_android) {
sources += [ "shell_dialog_stub.cc" ]
}
- if (is_linux && !is_chromecast) {
+ if (is_linux && !is_castos) {
sources += [
"select_file_dialog_linux.cc",
"select_file_dialog_linux.h",
@@ -54,7 +54,10 @@ component("shell_dialogs") {
"shell_dialog_linux.cc",
"shell_dialog_linux.h",
]
- deps += [ "//components/dbus/thread_linux" ]
+ deps += [
+ "//components/dbus/thread_linux",
+ "//ui/linux:linux_ui",
+ ]
if (use_dbus) {
defines += [ "USE_DBUS" ]
sources += [
diff --git a/chromium/ui/shell_dialogs/DEPS b/chromium/ui/shell_dialogs/DEPS
index abbefa1a86b..9d19ead467d 100644
--- a/chromium/ui/shell_dialogs/DEPS
+++ b/chromium/ui/shell_dialogs/DEPS
@@ -2,14 +2,15 @@ include_rules = [
"+chromeos/crosapi",
"+chromeos/lacros",
"+components/dbus/thread_linux",
- "+dbus",
"+components/remote_cocoa",
+ "+dbus",
"+mojo/core/embedder",
"+mojo/public/cpp/bindings",
"+ui/android/window_android.h",
"+ui/aura",
"+ui/base",
"+ui/gfx",
+ "+ui/linux",
"+ui/platform_window",
"+ui/strings/grit/ui_strings.h",
]
diff --git a/chromium/ui/shell_dialogs/select_file_dialog.h b/chromium/ui/shell_dialogs/select_file_dialog.h
index 8a417fc43a7..957ef752be4 100644
--- a/chromium/ui/shell_dialogs/select_file_dialog.h
+++ b/chromium/ui/shell_dialogs/select_file_dialog.h
@@ -90,7 +90,7 @@ class SHELL_DIALOGS_EXPORT SelectFileDialog
virtual void FileSelectionCanceled(void* params) {}
protected:
- virtual ~Listener() {}
+ virtual ~Listener() = default;
};
// Sets the factory that creates SelectFileDialog objects, overriding default
diff --git a/chromium/ui/shell_dialogs/select_file_dialog_lacros.h b/chromium/ui/shell_dialogs/select_file_dialog_lacros.h
index 8c92c49c410..3b7bd495467 100644
--- a/chromium/ui/shell_dialogs/select_file_dialog_lacros.h
+++ b/chromium/ui/shell_dialogs/select_file_dialog_lacros.h
@@ -7,6 +7,7 @@
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "chromeos/crosapi/mojom/select_file.mojom-forward.h"
#include "ui/shell_dialogs/select_file_dialog.h"
#include "ui/shell_dialogs/select_file_dialog_factory.h"
@@ -60,7 +61,7 @@ class SHELL_DIALOGS_EXPORT SelectFileDialogLacros : public SelectFileDialog {
int file_type_index);
// Cached parameters from the call to SelectFileImpl.
- void* params_ = nullptr;
+ raw_ptr<void> params_ = nullptr;
// The unique ID of the wayland shell surface that owns this dialog.
std::string owning_shell_window_id_;
diff --git a/chromium/ui/shell_dialogs/select_file_dialog_linux_portal.cc b/chromium/ui/shell_dialogs/select_file_dialog_linux_portal.cc
index d6ac1c8efef..bc0f77a1759 100644
--- a/chromium/ui/shell_dialogs/select_file_dialog_linux_portal.cc
+++ b/chromium/ui/shell_dialogs/select_file_dialog_linux_portal.cc
@@ -17,8 +17,8 @@
#include "dbus/property.h"
#include "ui/aura/window_tree_host.h"
#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/linux/linux_ui_delegate.h"
#include "ui/gfx/native_widget_types.h"
+#include "ui/linux/linux_ui_delegate.h"
#include "ui/strings/grit/ui_strings.h"
#include "url/url_util.h"
diff --git a/chromium/ui/shell_dialogs/select_file_dialog_linux_portal.h b/chromium/ui/shell_dialogs/select_file_dialog_linux_portal.h
index e048c160e1f..14c5b2b67b4 100644
--- a/chromium/ui/shell_dialogs/select_file_dialog_linux_portal.h
+++ b/chromium/ui/shell_dialogs/select_file_dialog_linux_portal.h
@@ -5,6 +5,7 @@
#ifndef UI_SHELL_DIALOGS_SELECT_FILE_DIALOG_LINUX_PORTAL_H_
#define UI_SHELL_DIALOGS_SELECT_FILE_DIALOG_LINUX_PORTAL_H_
+#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_refptr.h"
#include "base/synchronization/atomic_flag.h"
@@ -97,13 +98,13 @@ class SelectFileDialogLinuxPortal : public SelectFileDialogLinux {
// The response object handle that the portal will send a signal to upon the
// dialog's completion.
- dbus::ObjectProxy* response_handle = nullptr;
+ raw_ptr<dbus::ObjectProxy, DanglingUntriaged> response_handle = nullptr;
absl::optional<gfx::AcceleratedWidget> parent;
Type type;
// The task runner the SelectFileImpl method was called on.
scoped_refptr<base::SequencedTaskRunner> main_task_runner;
// The untyped params to pass to the listener.
- void* listener_params = nullptr;
+ raw_ptr<void> listener_params = nullptr;
private:
friend class base::RefCountedThreadSafe<DialogInfo>;
diff --git a/chromium/ui/shell_dialogs/select_file_dialog_mac.h b/chromium/ui/shell_dialogs/select_file_dialog_mac.h
index 8870eb2a364..b137c823880 100644
--- a/chromium/ui/shell_dialogs/select_file_dialog_mac.h
+++ b/chromium/ui/shell_dialogs/select_file_dialog_mac.h
@@ -10,6 +10,7 @@
#include <vector>
#include "base/callback_forward.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "components/remote_cocoa/common/select_file_dialog.mojom.h"
#include "mojo/public/cpp/bindings/remote.h"
@@ -66,7 +67,7 @@ class SHELL_DIALOGS_EXPORT SelectFileDialogImpl : public ui::SelectFileDialog {
gfx::NativeWindow parent_window;
// |params| user data associated with this file dialog.
- void* params;
+ raw_ptr<void> params;
// Bridge to the Cocoa NSSavePanel.
mojo::Remote<remote_cocoa::mojom::SelectFileDialog> select_file_dialog;
diff --git a/chromium/ui/shell_dialogs/select_file_dialog_mac_unittest.mm b/chromium/ui/shell_dialogs/select_file_dialog_mac_unittest.mm
index 329bf15585d..1d61bad86fa 100644
--- a/chromium/ui/shell_dialogs/select_file_dialog_mac_unittest.mm
+++ b/chromium/ui/shell_dialogs/select_file_dialog_mac_unittest.mm
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/memory/raw_ptr.h"
+
#import "ui/shell_dialogs/select_file_dialog_mac.h"
#include "base/callback_forward.h"
@@ -75,10 +77,10 @@ class SelectFileDialogMacTest : public ::testing::Test,
SelectFileDialog::Type type = SelectFileDialog::SELECT_SAVEAS_FILE;
std::u16string title;
base::FilePath default_path;
- SelectFileDialog::FileTypeInfo* file_types = nullptr;
+ raw_ptr<SelectFileDialog::FileTypeInfo> file_types = nullptr;
int file_type_index = 0;
base::FilePath::StringType default_extension;
- void* params = nullptr;
+ raw_ptr<void> params = nullptr;
};
// Helper method to create a dialog with the given `args`. Returns the created
diff --git a/chromium/ui/shell_dialogs/shell_dialog_linux.cc b/chromium/ui/shell_dialogs/shell_dialog_linux.cc
index 078fd3b1b15..65ac31c3e38 100644
--- a/chromium/ui/shell_dialogs/shell_dialog_linux.cc
+++ b/chromium/ui/shell_dialogs/shell_dialog_linux.cc
@@ -8,6 +8,7 @@
#include "base/no_destructor.h"
#include "base/notreached.h"
#include "build/chromeos_buildflags.h"
+#include "ui/linux/linux_ui.h"
#include "ui/shell_dialogs/select_file_dialog_linux.h"
#include "ui/shell_dialogs/select_file_dialog_linux_kde.h"
#include "ui/shell_dialogs/select_file_policy.h"
@@ -16,12 +17,26 @@
#include "ui/shell_dialogs/select_file_dialog_linux_portal.h"
#endif
+namespace shell_dialog_linux {
+
+void Initialize() {
+#if defined(USE_DBUS)
+ ui::SelectFileDialogLinuxPortal::StartAvailabilityTestInBackground();
+#endif
+}
+
+void Finalize() {
+#if defined(USE_DBUS)
+ ui::SelectFileDialogLinuxPortal::DestroyPortalConnection();
+#endif
+}
+
+} // namespace shell_dialog_linux
+
namespace ui {
namespace {
-ShellDialogLinux* g_shell_dialog_linux = nullptr;
-
enum FileDialogChoice {
kUnknown,
kToolkit,
@@ -69,40 +84,18 @@ FileDialogChoice GetFileDialogChoice() {
} // namespace
-ShellDialogLinux::ShellDialogLinux() = default;
-
-ShellDialogLinux::~ShellDialogLinux() {
-#if defined(USE_DBUS)
- SelectFileDialogLinuxPortal::DestroyPortalConnection();
-#endif
-}
-
-void ShellDialogLinux::SetInstance(ShellDialogLinux* instance) {
- g_shell_dialog_linux = instance;
-}
-
-const ShellDialogLinux* ShellDialogLinux::instance() {
- return g_shell_dialog_linux;
-}
-
-void ShellDialogLinux::Initialize() {
-#if defined(USE_DBUS)
- SelectFileDialogLinuxPortal::StartAvailabilityTestInBackground();
-#endif
-}
-
SelectFileDialog* CreateSelectFileDialog(
SelectFileDialog::Listener* listener,
std::unique_ptr<SelectFilePolicy> policy) {
if (dialog_choice_ == kUnknown)
dialog_choice_ = GetFileDialogChoice();
- const ShellDialogLinux* shell_dialogs = ShellDialogLinux::instance();
+ const LinuxUi* linux_ui = LinuxUi::instance();
switch (dialog_choice_) {
case kToolkit:
- if (!shell_dialogs)
+ if (!linux_ui)
break;
- return shell_dialogs->CreateSelectFileDialog(listener, std::move(policy));
+ return linux_ui->CreateSelectFileDialog(listener, std::move(policy));
#if defined(USE_DBUS)
case kPortal:
return new SelectFileDialogLinuxPortal(listener, std::move(policy));
diff --git a/chromium/ui/shell_dialogs/shell_dialog_linux.h b/chromium/ui/shell_dialogs/shell_dialog_linux.h
index 531944c64cd..b9a64dab4d7 100644
--- a/chromium/ui/shell_dialogs/shell_dialog_linux.h
+++ b/chromium/ui/shell_dialogs/shell_dialog_linux.h
@@ -5,39 +5,17 @@
#ifndef UI_SHELL_DIALOGS_SHELL_DIALOG_LINUX_H_
#define UI_SHELL_DIALOGS_SHELL_DIALOG_LINUX_H_
-#include "ui/shell_dialogs/select_file_dialog.h"
#include "ui/shell_dialogs/shell_dialogs_export.h"
-namespace ui {
-
-// An interface that lets different Linux platforms override the
-// CreateSelectFileDialog function declared here to return native file dialogs.
-class SHELL_DIALOGS_EXPORT ShellDialogLinux {
- public:
- ShellDialogLinux();
- virtual ~ShellDialogLinux();
-
- // Sets the dynamically loaded singleton that draws the desktop native
- // UI. This pointer is not owned, and if this method is called a second time,
- // the first instance is not deleted.
- static void SetInstance(ShellDialogLinux* instance);
-
- // Returns a LinuxUI instance for the toolkit used in the user's desktop
- // environment.
- //
- // Can return NULL, in case no toolkit has been set. (For example, if we're
- // running with the "--ash" flag.)
- static const ShellDialogLinux* instance();
-
- // Should be called before the first call to CreateSelectFileDialog.
- void Initialize();
-
- // Returns a native file selection dialog.
- virtual SelectFileDialog* CreateSelectFileDialog(
- SelectFileDialog::Listener* listener,
- std::unique_ptr<SelectFilePolicy> policy) const = 0;
-};
-
-} // namespace ui
+namespace shell_dialog_linux {
+
+// TODO(thomasanderson): Remove Initialize() and Finalize().
+
+// Should be called before the first call to CreateSelectFileDialog.
+SHELL_DIALOGS_EXPORT void Initialize();
+
+SHELL_DIALOGS_EXPORT void Finalize();
+
+} // namespace shell_dialog_linux
#endif // UI_SHELL_DIALOGS_SHELL_DIALOG_LINUX_H_
diff --git a/chromium/ui/snapshot/BUILD.gn b/chromium/ui/snapshot/BUILD.gn
index c2feefb599f..653ea227757 100644
--- a/chromium/ui/snapshot/BUILD.gn
+++ b/chromium/ui/snapshot/BUILD.gn
@@ -121,12 +121,15 @@ test("snapshot_unittests") {
}
if (is_fuchsia) {
- use_cfv2 = false
- additional_manifest_fragments = [
- # TODO(crbug.com/1185811): Figure out why jit_capabilities is needed.
- "//build/config/fuchsia/test/jit_capabilities.test-cmx",
+ use_cfv1 = false
+
+ # TODO(https://crbug.com/1185811): Investigate removing the requirement for
+ # job_policy_ambient_mark_vmo_exec for the sake of V8's allocator in tests.
+ test_runner_shard = "//build/config/fuchsia/test/elf_test_ambient_exec_runner.shard.test-cml"
- "//build/config/fuchsia/test/present_view_capabilities.test-cmx",
+ additional_manifest_fragments = [
+ "//build/config/fuchsia/test/present_view.shard.test-cml",
+ "//third_party/fuchsia-sdk/sdk/pkg/vulkan/client.shard.cml",
]
}
}
diff --git a/chromium/ui/snapshot/snapshot_mac_unittest.mm b/chromium/ui/snapshot/snapshot_mac_unittest.mm
index 9feeb03876d..ef8d88d5eb1 100644
--- a/chromium/ui/snapshot/snapshot_mac_unittest.mm
+++ b/chromium/ui/snapshot/snapshot_mac_unittest.mm
@@ -39,9 +39,7 @@ TEST_F(GrabWindowSnapshotTest, DISABLED_TestGrabWindowSnapshot) {
base::scoped_nsobject<NSBitmapImageRep> rep(
[[NSBitmapImageRep alloc] initWithCGImage:cgImage]);
EXPECT_TRUE([rep isKindOfClass:[NSBitmapImageRep class]]);
- CGFloat scaleFactor = 1.0f;
- if ([window respondsToSelector:@selector(backingScaleFactor)])
- scaleFactor = [window backingScaleFactor];
+ CGFloat scaleFactor = [window backingScaleFactor];
EXPECT_EQ(400 * scaleFactor, CGImageGetWidth([rep CGImage]));
NSColor* color = [rep colorAtX:200 * scaleFactor y:200 * scaleFactor];
CGFloat red = 0, green = 0, blue = 0, alpha = 0;
diff --git a/chromium/ui/strings/app_locale_settings.grd b/chromium/ui/strings/app_locale_settings.grd
index fd74617df75..27a6a07f76b 100644
--- a/chromium/ui/strings/app_locale_settings.grd
+++ b/chromium/ui/strings/app_locale_settings.grd
@@ -231,7 +231,7 @@
</message>
</if>
<!-- For ChromeOS -->
- <if expr="chromeos_ash or chromeos_lacros">
+ <if expr="is_chromeos">
<!-- The font name like: 'Font Name, 12px' -->
<message name="IDS_UI_FONT_FAMILY_CROS" use_name_for_id="true">
Roboto, 12px
diff --git a/chromium/ui/strings/translations/app_locale_settings_am.xtb b/chromium/ui/strings/translations/app_locale_settings_am.xtb
index 002db461d93..2c42c14ccc8 100644
--- a/chromium/ui/strings/translations/app_locale_settings_am.xtb
+++ b/chromium/ui/strings/translations/app_locale_settings_am.xtb
@@ -2,7 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="am">
<translation id="IDS_UI_FONT_FAMILY_XP">abyssinica sil</translation>
-<if expr="chromeos_ash or chromeos_lacros">
+<if expr="is_chromeos">
<translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Ethiopic, sans-serif, 13px</translation>
<translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Ethiopic, sans-serif</translation>
</if>
diff --git a/chromium/ui/strings/translations/app_locale_settings_ar.xtb b/chromium/ui/strings/translations/app_locale_settings_ar.xtb
index fe3bfbd8ac4..e9d4431947e 100644
--- a/chromium/ui/strings/translations/app_locale_settings_ar.xtb
+++ b/chromium/ui/strings/translations/app_locale_settings_ar.xtb
@@ -2,7 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="ar">
<translation id="IDS_MINIMUM_UI_FONT_SIZE">10</translation>
-<if expr="chromeos_ash or chromeos_lacros">
+<if expr="is_chromeos">
<translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Arabic UI, 13px</translation>
<translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Arabic UI, sans-serif</translation>
</if>
diff --git a/chromium/ui/strings/translations/app_locale_settings_bn.xtb b/chromium/ui/strings/translations/app_locale_settings_bn.xtb
index 443f9a6e313..3a62e6f48db 100644
--- a/chromium/ui/strings/translations/app_locale_settings_bn.xtb
+++ b/chromium/ui/strings/translations/app_locale_settings_bn.xtb
@@ -13,7 +13,7 @@
<if expr="is_linux">
<translation id="IDS_WEB_FONT_FAMILY">Lohit Bengali</translation>
</if>
-<if expr="chromeos_ash or chromeos_lacros">
+<if expr="is_chromeos">
<translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Bengali UI, 13px</translation>
<translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Bengali UI, sans-serif</translation>
</if>
diff --git a/chromium/ui/strings/translations/app_locale_settings_he.xtb b/chromium/ui/strings/translations/app_locale_settings_he.xtb
index 0e06e1d3581..982b0406807 100644
--- a/chromium/ui/strings/translations/app_locale_settings_he.xtb
+++ b/chromium/ui/strings/translations/app_locale_settings_he.xtb
@@ -1,7 +1,7 @@
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="he">
-<if expr="chromeos_ash or chromeos_lacros">
+<if expr="is_chromeos">
<translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Hebrew, 13px</translation>
<translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Hebrew, sans-serif</translation>
</if>
diff --git a/chromium/ui/strings/translations/app_locale_settings_hi.xtb b/chromium/ui/strings/translations/app_locale_settings_hi.xtb
index bc08f964f2d..81fd109f9a5 100644
--- a/chromium/ui/strings/translations/app_locale_settings_hi.xtb
+++ b/chromium/ui/strings/translations/app_locale_settings_hi.xtb
@@ -4,7 +4,7 @@
<translation id="IDS_UI_FONT_SIZE_SCALER_XP">140</translation>
<translation id="IDS_UI_FONT_SIZE_SCALER">125</translation>
<translation id="IDS_MINIMUM_UI_FONT_SIZE">10</translation>
-<if expr="chromeos_ash or chromeos_lacros">
+<if expr="is_chromeos">
<translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Devanagari UI, 13px</translation>
<translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Devanagari UI,sans-serif</translation>
</if>
diff --git a/chromium/ui/strings/translations/app_locale_settings_ja.xtb b/chromium/ui/strings/translations/app_locale_settings_ja.xtb
index f42b5750386..955331ef15f 100644
--- a/chromium/ui/strings/translations/app_locale_settings_ja.xtb
+++ b/chromium/ui/strings/translations/app_locale_settings_ja.xtb
@@ -15,7 +15,7 @@
<if expr="is_linux">
<translation id="IDS_WEB_FONT_FAMILY">VL PGothic,Sazanami Gothic,Kochi Gothic,sans-serif</translation>
</if>
-<if expr="chromeos_ash or chromeos_lacros">
+<if expr="is_chromeos">
<translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans CJK JP, 13px</translation>
<translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans CJK JP, sans-serif</translation>
</if>
diff --git a/chromium/ui/strings/translations/app_locale_settings_kn.xtb b/chromium/ui/strings/translations/app_locale_settings_kn.xtb
index 398c3647b7a..8529a04e4fd 100644
--- a/chromium/ui/strings/translations/app_locale_settings_kn.xtb
+++ b/chromium/ui/strings/translations/app_locale_settings_kn.xtb
@@ -6,7 +6,7 @@
<translation id="IDS_UI_FONT_SIZE_SCALER_XP">142</translation>
<translation id="IDS_UI_FONT_SIZE_SCALER">130</translation>
</if>
-<if expr="chromeos_ash or chromeos_lacros">
+<if expr="is_chromeos">
<translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Kannada UI, 13px</translation>
<translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Kannada UI, sans-serif</translation>
</if>
diff --git a/chromium/ui/strings/translations/app_locale_settings_ko.xtb b/chromium/ui/strings/translations/app_locale_settings_ko.xtb
index c91e06b6adb..afafa47c837 100644
--- a/chromium/ui/strings/translations/app_locale_settings_ko.xtb
+++ b/chromium/ui/strings/translations/app_locale_settings_ko.xtb
@@ -15,7 +15,7 @@
<if expr="is_linux">
<translation id="IDS_WEB_FONT_FAMILY">Noto Sans CJK KR,NanumGothic,UnDotum,Baekmuk Gulim,sans-serif</translation>
</if>
-<if expr="chromeos_ash or chromeos_lacros">
+<if expr="is_chromeos">
<translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans CJK KR, 13px</translation>
<translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans CJK KR, sans-serif</translation>
</if>
diff --git a/chromium/ui/strings/translations/app_locale_settings_ml.xtb b/chromium/ui/strings/translations/app_locale_settings_ml.xtb
index 45f9b86eb4b..00521398673 100644
--- a/chromium/ui/strings/translations/app_locale_settings_ml.xtb
+++ b/chromium/ui/strings/translations/app_locale_settings_ml.xtb
@@ -12,7 +12,7 @@
<if expr="is_linux">
<translation id="IDS_WEB_FONT_FAMILY">Arial,AnjaliOldLipi,Rachana,Kartika,sans-serif</translation>
</if>
-<if expr="chromeos_ash or chromeos_lacros">
+<if expr="is_chromeos">
<translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Malayalam UI, 13px</translation>
<translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Malayalam UI, sans-serif</translation>
</if>
diff --git a/chromium/ui/strings/translations/app_locale_settings_mr.xtb b/chromium/ui/strings/translations/app_locale_settings_mr.xtb
index c2a65b8c659..7be644e277c 100644
--- a/chromium/ui/strings/translations/app_locale_settings_mr.xtb
+++ b/chromium/ui/strings/translations/app_locale_settings_mr.xtb
@@ -4,7 +4,7 @@
<translation id="IDS_UI_FONT_SIZE_SCALER_XP">140</translation>
<translation id="IDS_UI_FONT_SIZE_SCALER">125</translation>
<translation id="IDS_MINIMUM_UI_FONT_SIZE">10</translation>
-<if expr="chromeos_ash or chromeos_lacros">
+<if expr="is_chromeos">
<translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Devanagari UI, 13px</translation>
<translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Devanagari UI,sans-serif</translation>
</if>
diff --git a/chromium/ui/strings/translations/app_locale_settings_ta.xtb b/chromium/ui/strings/translations/app_locale_settings_ta.xtb
index 0774a8be7ed..b165e8ec1d8 100644
--- a/chromium/ui/strings/translations/app_locale_settings_ta.xtb
+++ b/chromium/ui/strings/translations/app_locale_settings_ta.xtb
@@ -1,7 +1,7 @@
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="ta">
-<if expr="chromeos_ash or chromeos_lacros">
+<if expr="is_chromeos">
<translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Tamil UI, 13px</translation>
<translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Tamil UI,sans-serif</translation>
</if>
diff --git a/chromium/ui/strings/translations/app_locale_settings_te.xtb b/chromium/ui/strings/translations/app_locale_settings_te.xtb
index eb83bd851d0..9d996cacd31 100644
--- a/chromium/ui/strings/translations/app_locale_settings_te.xtb
+++ b/chromium/ui/strings/translations/app_locale_settings_te.xtb
@@ -6,7 +6,7 @@
<translation id="IDS_UI_FONT_SIZE_SCALER_XP">145</translation>
<translation id="IDS_UI_FONT_SIZE_SCALER">130</translation>
</if>
-<if expr="chromeos_ash or chromeos_lacros">
+<if expr="is_chromeos">
<translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Telugu UI, 13px</translation>
<translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Telugu UI, sans-serif</translation>
</if>
diff --git a/chromium/ui/strings/translations/app_locale_settings_th.xtb b/chromium/ui/strings/translations/app_locale_settings_th.xtb
index e8b98084b79..a8772ac6467 100644
--- a/chromium/ui/strings/translations/app_locale_settings_th.xtb
+++ b/chromium/ui/strings/translations/app_locale_settings_th.xtb
@@ -9,7 +9,7 @@
<if expr="is_linux">
<translation id="IDS_WEB_FONT_FAMILY">Norasi,Waree,Garuda,Loma,sans-serif</translation>
</if>
-<if expr="chromeos_ash or chromeos_lacros">
+<if expr="is_chromeos">
<translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Thai UI, 13px</translation>
<translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Thai UI,sans-serif</translation>
</if>
diff --git a/chromium/ui/strings/translations/app_locale_settings_zh-CN.xtb b/chromium/ui/strings/translations/app_locale_settings_zh-CN.xtb
index 5d6fa0cf952..a8094f552a7 100644
--- a/chromium/ui/strings/translations/app_locale_settings_zh-CN.xtb
+++ b/chromium/ui/strings/translations/app_locale_settings_zh-CN.xtb
@@ -15,7 +15,7 @@
<if expr="is_linux">
<translation id="IDS_WEB_FONT_FAMILY">Noto Sans CJK SC, WenQuanYi Zen Hei, sans-serif</translation>
</if>
-<if expr="chromeos_ash or chromeos_lacros">
+<if expr="is_chromeos">
<translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans CJK SC, 13px</translation>
<translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans CJK SC, sans-serif</translation>
</if>
diff --git a/chromium/ui/strings/translations/app_locale_settings_zh-TW.xtb b/chromium/ui/strings/translations/app_locale_settings_zh-TW.xtb
index b5d8d81d9d2..6a6c73f3429 100644
--- a/chromium/ui/strings/translations/app_locale_settings_zh-TW.xtb
+++ b/chromium/ui/strings/translations/app_locale_settings_zh-TW.xtb
@@ -15,7 +15,7 @@
<if expr="is_linux">
<translation id="IDS_WEB_FONT_FAMILY">Noto Sans CJK SC, WenQuanYi Zen Hei, sans-serif</translation>
</if>
-<if expr="chromeos_ash or chromeos_lacros">
+<if expr="is_chromeos">
<translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans CJK TC, 13px</translation>
<translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans CJK TC, sans-serif</translation>
</if>
diff --git a/chromium/ui/strings/translations/ax_strings_am.xtb b/chromium/ui/strings/translations/ax_strings_am.xtb
index e1f7dc353ae..74f56f4c796 100644
--- a/chromium/ui/strings/translations/ax_strings_am.xtb
+++ b/chromium/ui/strings/translations/ax_strings_am.xtb
@@ -119,7 +119,7 @@
<translation id="7661956066982048809">ግራፊካዊ ሰነድ</translation>
<translation id="7681220483256441252">መረጃ ጠቋሚ</translation>
<translation id="7740050170769002709">የኤች ቲ ኤም ኤል ይዘት</translation>
-<translation id="7802800022689234070">ይፋ ማሳወቂያ ሶስት ማዕዘን</translation>
+<translation id="7802800022689234070">ይፋ ማሳወቂያ ሦስት ማዕዘን</translation>
<translation id="7891486169920085145">መክፈያ</translation>
<translation id="8034303206267677282">ጠንካራ</translation>
<translation id="8053789581856978548">የጽሑፍ መስክ ፈልግ</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_af.xtb b/chromium/ui/strings/translations/ui_strings_af.xtb
index 0e3ec09434f..6b13508b9ca 100644
--- a/chromium/ui/strings/translations/ui_strings_af.xtb
+++ b/chromium/ui/strings/translations/ui_strings_af.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Begin praat</translation>
<translation id="4289540628985791613">Oorsig</translation>
<translation id="4306392492252714209">Verwyder van knipbord af.</translation>
+<translation id="4311195029067684288">Vol</translation>
<translation id="4491109536499578614">Prent</translation>
<translation id="4565377596337484307">Versteek wagwoord</translation>
<translation id="4588090240171750605">Rollees na regs</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Uitbreiding is ontspeld</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 maand oor}other{# maande oor}}</translation>
<translation id="4888938634149558681">Maak oproep</translation>
+<translation id="4937657825850660613">Half</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 sekonde}other{# sekondes}}</translation>
<translation id="4971687151119236543">Media vorige snit</translation>
+<translation id="4971925105143343452">Gedeeltelik</translation>
<translation id="5046499563572181734">Tik hier</translation>
<translation id="5076340679995252485">Plak</translation>
+<translation id="5123162024343028706">Dryf bo-op</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Kon nie stuur nie</translation>
<translation id="528468243742722775">Einde</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_am.xtb b/chromium/ui/strings/translations/ui_strings_am.xtb
index ee3fdca7e9e..97934e78ab3 100644
--- a/chromium/ui/strings/translations/ui_strings_am.xtb
+++ b/chromium/ui/strings/translations/ui_strings_am.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">መናገር ይጀምሩ</translation>
<translation id="4289540628985791613">ማጠቃለያ</translation>
<translation id="4306392492252714209">ከቅንጥብ ሰሌዳ ላይ አስወግድ።</translation>
+<translation id="4311195029067684288">ሙሉ</translation>
<translation id="4491109536499578614">ምስል</translation>
<translation id="4565377596337484307">የይለፍ ቃል ደብቅ</translation>
<translation id="4588090240171750605">ወደ ቀኝ ሸብልል</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">ቅጥያው ተነቅሏል</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 ወር ቀርቷል}one{# ወሮች ቀርተዋል}other{# ወሮች ቀርተዋል}}</translation>
<translation id="4888938634149558681">ጥሪ ያድርጉ</translation>
+<translation id="4937657825850660613">ግማሽ</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 ሰከንድ}one{# ሰከንዶች}other{# ሰከንዶች}}</translation>
<translation id="4971687151119236543">የሚዲያ ቀዳሚ ትራክ</translation>
+<translation id="4971925105143343452">ከፊል</translation>
<translation id="5046499563572181734">እዚህ መታ ያድርጉ</translation>
<translation id="5076340679995252485">&amp;ለጥፍ</translation>
+<translation id="5123162024343028706">ከላይ ተንሳፈፍ</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> ፔታ</translation>
<translation id="5278860589123563674">መላክ አልተሳካም</translation>
<translation id="528468243742722775">ጨርስ</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ar.xtb b/chromium/ui/strings/translations/ui_strings_ar.xtb
index b1f3aaf70d3..ac281d2badf 100644
--- a/chromium/ui/strings/translations/ui_strings_ar.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ar.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">بدء التحدث</translation>
<translation id="4289540628985791613">نظرة عامة</translation>
<translation id="4306392492252714209">إزالة من الحافظة</translation>
+<translation id="4311195029067684288">كامل</translation>
<translation id="4491109536499578614">صورة</translation>
<translation id="4565377596337484307">إخفاء كلمة المرور</translation>
<translation id="4588090240171750605">التمرير إلى اليسار</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">تمت إزالة تثبيت الإضافة.</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{يتبقى شهر واحد}zero{يتبقى # شهر}two{يتبقى شهرين (#)}few{يتبقى # أشهر}many{يتبقى # شهرًا}other{يتبقى # شهر}}</translation>
<translation id="4888938634149558681">إجراء مكالمة</translation>
+<translation id="4937657825850660613">تقسيم الشاشة إلى نصفين</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{ثانية واحدة}zero{# من الثواني}two{ثانيتان (#)}few{# ثوانٍ}many{# ثانية}other{# من الثواني}}</translation>
<translation id="4971687151119236543">المقطع الصوتي السابق للوسائط</translation>
+<translation id="4971925105143343452">جزئي</translation>
<translation id="5046499563572181734">انقر هنا</translation>
<translation id="5076340679995252485">ل&amp;صق</translation>
+<translation id="5123162024343028706">Float on top</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> بيتابايت</translation>
<translation id="5278860589123563674">تعذّر الإرسال</translation>
<translation id="528468243742722775">‏مفتاح End</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_as.xtb b/chromium/ui/strings/translations/ui_strings_as.xtb
index 72cbf77469a..0eee44a1560 100644
--- a/chromium/ui/strings/translations/ui_strings_as.xtb
+++ b/chromium/ui/strings/translations/ui_strings_as.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">কথা কওক</translation>
<translation id="4289540628985791613">ৰূপৰেখা</translation>
<translation id="4306392492252714209">ক্লিপব’ৰ্ডৰ পৰা আঁতৰাওক।</translation>
+<translation id="4311195029067684288">পূৰ্ণ</translation>
<translation id="4491109536499578614">প্ৰতিচ্ছবি</translation>
<translation id="4565377596337484307">পাছৱৰ্ড লুকুৱাওক</translation>
<translation id="4588090240171750605">সোঁফাললৈ স্ক্ৰ’ল কৰক</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">এক্সটেনশ্বন আনপিন কৰা আছে</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{১ মাহ বাকী আছে}one{# মাহ বাকী আছে}other{# মাহ বাকী আছে}}</translation>
<translation id="4888938634149558681">কল কৰক</translation>
+<translation id="4937657825850660613">আধা</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{১ ছেকেণ্ড}one{# ছেকেণ্ড}other{# ছেকেণ্ড}}</translation>
<translation id="4971687151119236543">মিডিয়াৰ পৰৱর্তী ট্ৰেক</translation>
+<translation id="4971925105143343452">আংশিক</translation>
<translation id="5046499563572181734">ইয়াত টিপক</translation>
<translation id="5076340679995252485">&amp;পেষ্ট কৰক</translation>
+<translation id="5123162024343028706">ওপৰৰ অংশত ৰাখক</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> পি.বি.</translation>
<translation id="5278860589123563674">পঠিয়াব পৰা নগ’ল</translation>
<translation id="528468243742722775">সমাপ্ত</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_az.xtb b/chromium/ui/strings/translations/ui_strings_az.xtb
index b428ed72c25..b52fae66973 100644
--- a/chromium/ui/strings/translations/ui_strings_az.xtb
+++ b/chromium/ui/strings/translations/ui_strings_az.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Danışmağa başlayın</translation>
<translation id="4289540628985791613">Baxış</translation>
<translation id="4306392492252714209">Mübadilə buferindən silin.</translation>
+<translation id="4311195029067684288">Tam</translation>
<translation id="4491109536499578614">Şəkil</translation>
<translation id="4565377596337484307">Parolu gizlədin</translation>
<translation id="4588090240171750605">Sağa Sürüşdürün</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Artırma çıxarılıb</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 ay qalıb}other{# ay qalıb}}</translation>
<translation id="4888938634149558681">Zəng edin</translation>
+<translation id="4937657825850660613">Yarı</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 saniyə}other{# saniyə}}</translation>
<translation id="4971687151119236543">Əvvəlki Media Trek</translation>
+<translation id="4971925105143343452">Qismən</translation>
<translation id="5046499563572181734">Buraya klikləyin</translation>
<translation id="5076340679995252485">&amp;Yerləşdirin</translation>
+<translation id="5123162024343028706">Üstdə üzən</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Göndərilmədi</translation>
<translation id="528468243742722775">Son</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_be.xtb b/chromium/ui/strings/translations/ui_strings_be.xtb
index 5c117682d63..55353dd0949 100644
--- a/chromium/ui/strings/translations/ui_strings_be.xtb
+++ b/chromium/ui/strings/translations/ui_strings_be.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Пачаць галасавы ўвод</translation>
<translation id="4289540628985791613">Агляд</translation>
<translation id="4306392492252714209">Выдаліць з буфера абмену.</translation>
+<translation id="4311195029067684288">Поўнасцю</translation>
<translation id="4491109536499578614">Відарыс</translation>
<translation id="4565377596337484307">Схаваць пароль</translation>
<translation id="4588090240171750605">Прагартаць управа</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Пашырэнне адмацавана</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Застаўся 1 месяц}one{Застаўся # месяц}few{Засталося # месяцы}many{Засталося # месяцаў}other{Засталося # месяца}}</translation>
<translation id="4888938634149558681">Зрабіць выклік</translation>
+<translation id="4937657825850660613">Напалавіну</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 секунда}one{# секунда}few{# секунды}many{# секунд}other{# секунды}}</translation>
<translation id="4971687151119236543">Папярэдні трэк</translation>
+<translation id="4971925105143343452">Часткова</translation>
<translation id="5046499563572181734">Дакраніцеся тут</translation>
<translation id="5076340679995252485">&amp;Уставіць</translation>
+<translation id="5123162024343028706">Замацаваць наверсе</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> ПБ</translation>
<translation id="5278860589123563674">Не ўдалося адправіць</translation>
<translation id="528468243742722775">Канец</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_bg.xtb b/chromium/ui/strings/translations/ui_strings_bg.xtb
index 2b258e04968..4ac0f9f3f21 100644
--- a/chromium/ui/strings/translations/ui_strings_bg.xtb
+++ b/chromium/ui/strings/translations/ui_strings_bg.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Start Speaking</translation>
<translation id="4289540628985791613">Общ преглед</translation>
<translation id="4306392492252714209">Премахване от буферната памет.</translation>
+<translation id="4311195029067684288">Пълно</translation>
<translation id="4491109536499578614">Изображение</translation>
<translation id="4565377596337484307">Скриване на паролата</translation>
<translation id="4588090240171750605">Превъртане надясно</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Разширението бе освободено</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Остава 1 месец}other{Остават # месеца}}</translation>
<translation id="4888938634149558681">Обаждане</translation>
+<translation id="4937657825850660613">Наполовина</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 секунда}other{# секунди}}</translation>
<translation id="4971687151119236543">Мултимедия, предишният запис</translation>
+<translation id="4971925105143343452">Частично</translation>
<translation id="5046499563572181734">Докоснете тук</translation>
<translation id="5076340679995252485">&amp;Поставяне</translation>
+<translation id="5123162024343028706">Фиксиране на преден план</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> ПБ</translation>
<translation id="5278860589123563674">Изпращането не бе успешно</translation>
<translation id="528468243742722775">Край</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_bn.xtb b/chromium/ui/strings/translations/ui_strings_bn.xtb
index 201b2a9c7f9..9945e7fa94f 100644
--- a/chromium/ui/strings/translations/ui_strings_bn.xtb
+++ b/chromium/ui/strings/translations/ui_strings_bn.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">কথা বলা শুরু করুন</translation>
<translation id="4289540628985791613">ওভারভিউ</translation>
<translation id="4306392492252714209">ক্লিপবোর্ড থেকে সরান।</translation>
+<translation id="4311195029067684288">পূর্ণ</translation>
<translation id="4491109536499578614">ছবি</translation>
<translation id="4565377596337484307">পাসওয়ার্ড লুকান</translation>
<translation id="4588090240171750605">ডান দিকে স্ক্রল করুন</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">এক্সটেনশন আনপিন করা হয়েছে</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{১ মাস বাকি}one{# মাস বাকি}other{# মাস বাকি}}</translation>
<translation id="4888938634149558681">কল করুন</translation>
+<translation id="4937657825850660613">হাফ</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{১ সেকেন্ড}one{# সেকেন্ড}other{# সেকেন্ড}}</translation>
<translation id="4971687151119236543">মিডিয়া পূর্ববর্তী ট্র্যাক</translation>
+<translation id="4971925105143343452">আংশিক</translation>
<translation id="5046499563572181734">এখানে আলতো চাপুন</translation>
<translation id="5076340679995252485">&amp;পেস্ট করুন</translation>
+<translation id="5123162024343028706">'উপরে দেখা যাবে' বোতাম</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">পাঠানো যায়নি</translation>
<translation id="528468243742722775">শেষ</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_bs.xtb b/chromium/ui/strings/translations/ui_strings_bs.xtb
index ace13a8ad09..3183ec07618 100644
--- a/chromium/ui/strings/translations/ui_strings_bs.xtb
+++ b/chromium/ui/strings/translations/ui_strings_bs.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Započinjanje govora</translation>
<translation id="4289540628985791613">Pregled</translation>
<translation id="4306392492252714209">Uklanjanje iz međumemorije.</translation>
+<translation id="4311195029067684288">Potpuno</translation>
<translation id="4491109536499578614">Slika</translation>
<translation id="4565377596337484307">Sakrij lozinku</translation>
<translation id="4588090240171750605">Kliznite udesno</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Ekstenzija je otkačena</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Preostao je 1 mjesec}one{Preostao je # mjesec}few{Preostala su # mjeseca}other{Preostalo je # mjeseci}}</translation>
<translation id="4888938634149558681">Uputi poziv</translation>
+<translation id="4937657825850660613">Napola</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunda}one{# sekunda}few{# sekunde}other{# sekundi}}</translation>
<translation id="4971687151119236543">Prethodna numera medijskog fajla</translation>
+<translation id="4971925105143343452">Djelomičnо</translation>
<translation id="5046499563572181734">Dodirnite ovdje</translation>
<translation id="5076340679995252485">&amp;Zalijepi</translation>
+<translation id="5123162024343028706">Plutanje na vrhu</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Slanje nije uspjelo</translation>
<translation id="528468243742722775">Prekid</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ca.xtb b/chromium/ui/strings/translations/ui_strings_ca.xtb
index ee096b7fca8..38ff8c46188 100644
--- a/chromium/ui/strings/translations/ui_strings_ca.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ca.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Comença a parlar</translation>
<translation id="4289540628985791613">Visió general</translation>
<translation id="4306392492252714209">Suprimeix del porta-retalls.</translation>
+<translation id="4311195029067684288">Complet</translation>
<translation id="4491109536499578614">Imatge</translation>
<translation id="4565377596337484307">Oculta la contrasenya</translation>
<translation id="4588090240171750605">Desplaçament a la dreta</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">L'extensió s'ha deixat de fixar</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{D'aquí a 1 mes}other{D'aquí a # mesos}}</translation>
<translation id="4888938634149558681">Fes una trucada</translation>
+<translation id="4937657825850660613">Meitat</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 segon}other{# segons}}</translation>
<translation id="4971687151119236543">Fitxer multimèdia: pista anterior</translation>
+<translation id="4971925105143343452">Parcial</translation>
<translation id="5046499563572181734">Toca aquí</translation>
<translation id="5076340679995252485">Engan&amp;xa</translation>
+<translation id="5123162024343028706">Flota al damunt</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">No s'ha pogut enviar</translation>
<translation id="528468243742722775">Finalitza</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_cs.xtb b/chromium/ui/strings/translations/ui_strings_cs.xtb
index 44734a4bb21..a2e35dd3286 100644
--- a/chromium/ui/strings/translations/ui_strings_cs.xtb
+++ b/chromium/ui/strings/translations/ui_strings_cs.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Začít mluvit</translation>
<translation id="4289540628985791613">Přehled</translation>
<translation id="4306392492252714209">Odstranit ze schránky.</translation>
+<translation id="4311195029067684288">Plné</translation>
<translation id="4491109536499578614">Obrázek</translation>
<translation id="4565377596337484307">Skrýt heslo</translation>
<translation id="4588090240171750605">Posuv doprava</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Rozšíření bylo uvolněno</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{zbývá 1 měsíc}few{zbývají # měsíce}many{zbývá # měsíce}other{zbývá # měsíců}}</translation>
<translation id="4888938634149558681">Volat</translation>
+<translation id="4937657825850660613">Polovina</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunda}few{# sekundy}many{# sekundy}other{# sekund}}</translation>
<translation id="4971687151119236543">Média – předchozí skladba</translation>
+<translation id="4971925105143343452">Částečné</translation>
<translation id="5046499563572181734">Klepněte sem</translation>
<translation id="5076340679995252485">Vložit</translation>
+<translation id="5123162024343028706">Připnout navrch</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Odeslání se nezdařilo</translation>
<translation id="528468243742722775">Konec</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_cy.xtb b/chromium/ui/strings/translations/ui_strings_cy.xtb
index 514aab0b02f..72ff97e1419 100644
--- a/chromium/ui/strings/translations/ui_strings_cy.xtb
+++ b/chromium/ui/strings/translations/ui_strings_cy.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Dechrau Siarad</translation>
<translation id="4289540628985791613">Trosolwg</translation>
<translation id="4306392492252714209">Tynnu o'r clipfwrdd.</translation>
+<translation id="4311195029067684288">Llawn</translation>
<translation id="4491109536499578614">Llun</translation>
<translation id="4565377596337484307">Cuddio'r cyfrinair</translation>
<translation id="4588090240171750605">Sgrolio i'r Dde</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Estyniad wedi'i ddadbinio</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 mis ar ôl}zero{# mis ar ôl}two{# fis ar ôl}few{# mis ar ôl}many{# mis ar ôl}other{# mis ar ôl}}</translation>
<translation id="4888938634149558681">Gwneud galwad</translation>
+<translation id="4937657825850660613">Hanner</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 eiliad}zero{# eiliad}two{# eiliad}few{# eiliad}many{# eiliad}other{# eiliad}}</translation>
<translation id="4971687151119236543">Trac Cyfryngau Blaenorol</translation>
+<translation id="4971925105143343452">Rhannol</translation>
<translation id="5046499563572181734">Tapiwch yma</translation>
<translation id="5076340679995252485">&amp;Gludo</translation>
+<translation id="5123162024343028706">Arnofio ar y brig</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Wedi methu ag anfon</translation>
<translation id="528468243742722775">Diwedd</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_da.xtb b/chromium/ui/strings/translations/ui_strings_da.xtb
index e5c9d863e78..a674d38d8e4 100644
--- a/chromium/ui/strings/translations/ui_strings_da.xtb
+++ b/chromium/ui/strings/translations/ui_strings_da.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Start indtaling</translation>
<translation id="4289540628985791613">Oversigt</translation>
<translation id="4306392492252714209">Fjern fra udklipsholder.</translation>
+<translation id="4311195029067684288">Fuld</translation>
<translation id="4491109536499578614">Billede</translation>
<translation id="4565377596337484307">Skjul adgangskode</translation>
<translation id="4588090240171750605">Scroll til højre</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Udvidelsen er frigjort</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Der er 1 måned tilbage}one{Der er # måned tilbage}other{Der er # måneder tilbage}}</translation>
<translation id="4888938634149558681">Ring op</translation>
+<translation id="4937657825850660613">Halver</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 sekund}one{# sekunder}other{# sekunder}}</translation>
<translation id="4971687151119236543">Medie: Forrige nummer</translation>
+<translation id="4971925105143343452">Delvis</translation>
<translation id="5046499563572181734">Tryk her</translation>
<translation id="5076340679995252485">&amp;Indsæt</translation>
+<translation id="5123162024343028706">Vis som svævende</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Afsendelsen mislykkedes</translation>
<translation id="528468243742722775">Afslut</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_de.xtb b/chromium/ui/strings/translations/ui_strings_de.xtb
index d3d7b0775d5..11d157f69d1 100644
--- a/chromium/ui/strings/translations/ui_strings_de.xtb
+++ b/chromium/ui/strings/translations/ui_strings_de.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Sprachausgabe starten</translation>
<translation id="4289540628985791613">Übersicht</translation>
<translation id="4306392492252714209">Aus der Zwischenablage entfernen.</translation>
+<translation id="4311195029067684288">Vollständig</translation>
<translation id="4491109536499578614">Bild</translation>
<translation id="4565377596337484307">Passwort ausblenden</translation>
<translation id="4588090240171750605">Nach rechts blättern</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Erweiterung losgelöst</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{noch 1 Monat}other{noch # Monate}}</translation>
<translation id="4888938634149558681">Anrufen</translation>
+<translation id="4937657825850660613">Hälfte</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 Sekunde}other{# Sekunden}}</translation>
<translation id="4971687151119236543">Medien – vorheriger Titel</translation>
+<translation id="4971925105143343452">Teilweise</translation>
<translation id="5046499563572181734">Hier tippen</translation>
<translation id="5076340679995252485">&amp;Einfügen</translation>
+<translation id="5123162024343028706">Unverankert im Vordergrund</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Fehler beim Senden</translation>
<translation id="528468243742722775">Ende</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_el.xtb b/chromium/ui/strings/translations/ui_strings_el.xtb
index 4e639f0b941..997d7ccf223 100644
--- a/chromium/ui/strings/translations/ui_strings_el.xtb
+++ b/chromium/ui/strings/translations/ui_strings_el.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Έναρξη ομιλίας</translation>
<translation id="4289540628985791613">Επισκόπηση</translation>
<translation id="4306392492252714209">Κατάργηση από το πρόχειρο.</translation>
+<translation id="4311195029067684288">Πλήρης</translation>
<translation id="4491109536499578614">Εικόνα</translation>
<translation id="4565377596337484307">Απόκρυψη κωδικού πρόσβασης</translation>
<translation id="4588090240171750605">Κύλιση δεξιά</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Η επέκταση ξεκαρφιτσώθηκε</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Απομένει 1 μήνας}other{Απομένουν # μήνες}}</translation>
<translation id="4888938634149558681">Πραγματοποίηση κλήσης</translation>
+<translation id="4937657825850660613">Μισό</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 δευτερόλεπτο}other{# δευτερόλεπτα}}</translation>
<translation id="4971687151119236543">Προηγούμενο κομμάτι πολυμέσων</translation>
+<translation id="4971925105143343452">Μερική</translation>
<translation id="5046499563572181734">Πατήστε εδώ</translation>
<translation id="5076340679995252485">&amp;Επικόλληση</translation>
+<translation id="5123162024343028706">Εμφάνιση από πάνω</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Αποτυχία αποστολής</translation>
<translation id="528468243742722775">Τέλος</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_en-GB.xtb b/chromium/ui/strings/translations/ui_strings_en-GB.xtb
index 3e415cc30e3..9b73e82f75d 100644
--- a/chromium/ui/strings/translations/ui_strings_en-GB.xtb
+++ b/chromium/ui/strings/translations/ui_strings_en-GB.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Start Speaking</translation>
<translation id="4289540628985791613">Overview</translation>
<translation id="4306392492252714209">Remove from clipboard.</translation>
+<translation id="4311195029067684288">Full</translation>
<translation id="4491109536499578614">Image</translation>
<translation id="4565377596337484307">Hide password</translation>
<translation id="4588090240171750605">Scroll Right</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Extension unpinned</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 month left}other{# months left}}</translation>
<translation id="4888938634149558681">Make call</translation>
+<translation id="4937657825850660613">Half</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 second}other{# seconds}}</translation>
<translation id="4971687151119236543">Media Previous Track</translation>
+<translation id="4971925105143343452">Partial</translation>
<translation id="5046499563572181734">Tap here</translation>
<translation id="5076340679995252485">&amp;Paste</translation>
+<translation id="5123162024343028706">Float on top</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Failed to send</translation>
<translation id="528468243742722775">End</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_es-419.xtb b/chromium/ui/strings/translations/ui_strings_es-419.xtb
index 22328be1650..d1d1d6ea197 100644
--- a/chromium/ui/strings/translations/ui_strings_es-419.xtb
+++ b/chromium/ui/strings/translations/ui_strings_es-419.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Empezar a hablar</translation>
<translation id="4289540628985791613">Descripción general</translation>
<translation id="4306392492252714209">Quitar del portapapeles.</translation>
+<translation id="4311195029067684288">Total</translation>
<translation id="4491109536499578614">Imagen</translation>
<translation id="4565377596337484307">Ocultar contraseña</translation>
<translation id="4588090240171750605">Desplazar a la derecha</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Se dejó de fijar la extensión</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Queda 1 mes}other{Quedan # meses}}</translation>
<translation id="4888938634149558681">Realizar llamada</translation>
+<translation id="4937657825850660613">Mitad</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 segundo}other{# segundos}}</translation>
<translation id="4971687151119236543">Pista multimedia anterior</translation>
+<translation id="4971925105143343452">Parcial</translation>
<translation id="5046499563572181734">Presiona aquí</translation>
<translation id="5076340679995252485">&amp;Pegar</translation>
+<translation id="5123162024343028706">Fijar en la parte superior</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">No se pudo enviar</translation>
<translation id="528468243742722775">Finalizar</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_es.xtb b/chromium/ui/strings/translations/ui_strings_es.xtb
index 6d288b6b6f9..e3743adeee7 100644
--- a/chromium/ui/strings/translations/ui_strings_es.xtb
+++ b/chromium/ui/strings/translations/ui_strings_es.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Empezar a hablar</translation>
<translation id="4289540628985791613">Vista general</translation>
<translation id="4306392492252714209">Quitar del portapapeles.</translation>
+<translation id="4311195029067684288">Vista completa</translation>
<translation id="4491109536499578614">Imagen</translation>
<translation id="4565377596337484307">Ocultar contraseña</translation>
<translation id="4588090240171750605">Desplazar a la derecha</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Extensión no fijada</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Queda 1 mes}other{Quedan # meses}}</translation>
<translation id="4888938634149558681">Llamar</translation>
+<translation id="4937657825850660613">Mitad</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 segundo}other{# segundos}}</translation>
<translation id="4971687151119236543">Pista anterior multimedia</translation>
+<translation id="4971925105143343452">Vista parcial</translation>
<translation id="5046499563572181734">Toca aquí</translation>
<translation id="5076340679995252485">&amp;Pegar</translation>
+<translation id="5123162024343028706">Fijar en primer plano</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">No se ha podido enviar</translation>
<translation id="528468243742722775">Finalizar</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_et.xtb b/chromium/ui/strings/translations/ui_strings_et.xtb
index bd70643dcbf..706f92ef20c 100644
--- a/chromium/ui/strings/translations/ui_strings_et.xtb
+++ b/chromium/ui/strings/translations/ui_strings_et.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Alusta rääkimist</translation>
<translation id="4289540628985791613">Ülevaade</translation>
<translation id="4306392492252714209">Eemalda lõikelaualt.</translation>
+<translation id="4311195029067684288">Täielik</translation>
<translation id="4491109536499578614">Image</translation>
<translation id="4565377596337484307">Peida parool</translation>
<translation id="4588090240171750605">Keri paremale</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Laiendus on vabastatud</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 kuu jäänud}other{# kuud jäänud}}</translation>
<translation id="4888938634149558681">Helista</translation>
+<translation id="4937657825850660613">Pool</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 sekund}other{# sekundit}}</translation>
<translation id="4971687151119236543">Meediumi eelmine lugu</translation>
+<translation id="4971925105143343452">Osaline</translation>
<translation id="5046499563572181734">Puudutage siin</translation>
<translation id="5076340679995252485">&amp;Kleebi</translation>
+<translation id="5123162024343028706">Hõljuta kõige peal</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Saatmine ebaõnnestus</translation>
<translation id="528468243742722775">Lõpeta</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_eu.xtb b/chromium/ui/strings/translations/ui_strings_eu.xtb
index e742040dc74..8bdfa859574 100644
--- a/chromium/ui/strings/translations/ui_strings_eu.xtb
+++ b/chromium/ui/strings/translations/ui_strings_eu.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Hasi hitz egiten</translation>
<translation id="4289540628985791613">Ikuspegi orokorra</translation>
<translation id="4306392492252714209">Kendu arbeletik.</translation>
+<translation id="4311195029067684288">Osoa</translation>
<translation id="4491109536499578614">Irudia</translation>
<translation id="4565377596337484307">Ezkutatu pasahitza</translation>
<translation id="4588090240171750605">Joan eskuinera</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Kendu da luzapenaren aingura</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 hilabete gelditzen da}other{# hilabete gelditzen dira}}</translation>
<translation id="4888938634149558681">Deitu</translation>
+<translation id="4937657825850660613">Erdia</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 segundo}other{# segundo}}</translation>
<translation id="4971687151119236543">Aurreko multimedia-pista</translation>
+<translation id="4971925105143343452">Partziala</translation>
<translation id="5046499563572181734">Sakatu hau</translation>
<translation id="5076340679995252485">It&amp;satsi</translation>
+<translation id="5123162024343028706">Mantendu gainean</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Ezin izan da bidali</translation>
<translation id="528468243742722775">Amaitu</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_fa.xtb b/chromium/ui/strings/translations/ui_strings_fa.xtb
index e0075ad5bd3..81606a72c5e 100644
--- a/chromium/ui/strings/translations/ui_strings_fa.xtb
+++ b/chromium/ui/strings/translations/ui_strings_fa.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">شروع صحبت</translation>
<translation id="4289540628985791613">نمای کلی</translation>
<translation id="4306392492252714209">برداشتن از بریده‌دان.</translation>
+<translation id="4311195029067684288">پر</translation>
<translation id="4491109536499578614">تصویر</translation>
<translation id="4565377596337484307">عدم نمایش گذرواژه</translation>
<translation id="4588090240171750605">پیمایش به راست</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">سنجاق افزونه برداشته شد</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{۱ ماه باقی مانده است}one{# ماه باقی مانده است}other{# ماه باقی مانده است}}</translation>
<translation id="4888938634149558681">برقراری تماس</translation>
+<translation id="4937657825850660613">نیمه</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{۱ ثانیه}one{# ثانیه}other{# ثانیه}}</translation>
<translation id="4971687151119236543">آهنگ قبلی رسانه</translation>
+<translation id="4971925105143343452">عمودی</translation>
<translation id="5046499563572181734">در اینجا ضربه بزنید</translation>
<translation id="5076340679995252485">&amp;جاگذاری</translation>
+<translation id="5123162024343028706">شناور در بالا</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> پتابایت</translation>
<translation id="5278860589123563674">ارسال نشد</translation>
<translation id="528468243742722775">پایان</translation>
@@ -186,7 +190,7 @@
<translation id="8090736967111090568">شماره از <ph name="ORIGIN" /></translation>
<translation id="8106081041558092062">{HOURS,plural, =1{۱ ساعت قبل}one{# ساعت قبل}other{# ساعت قبل}}</translation>
<translation id="8131263257437993507">{SECONDS,plural, =1{۱ ثانیه باقی مانده است}one{# ثانیه باقی مانده است}other{# ثانیه باقی مانده است}}</translation>
-<translation id="8134065097954893699">درحال تازه‌سازی این صفحه</translation>
+<translation id="8134065097954893699">درحال بار کردن مجدد این صفحه</translation>
<translation id="815598010540052116">پیمایش به پایین</translation>
<translation id="8179976553408161302">ورود</translation>
<translation id="8210608804940886430">صفحه پایین</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_fi.xtb b/chromium/ui/strings/translations/ui_strings_fi.xtb
index 9558080a8bd..fac69fe1204 100644
--- a/chromium/ui/strings/translations/ui_strings_fi.xtb
+++ b/chromium/ui/strings/translations/ui_strings_fi.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Aloita puhuminen</translation>
<translation id="4289540628985791613">Yleiskatsaus</translation>
<translation id="4306392492252714209">Poista leikepöydältä.</translation>
+<translation id="4311195029067684288">Täynnä</translation>
<translation id="4491109536499578614">Kuva</translation>
<translation id="4565377596337484307">Piilota salasana</translation>
<translation id="4588090240171750605">Vieritä oikealle</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Laajennus irrotettu</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 kuukausi jäljellä}other{# kuukautta jäljellä}}</translation>
<translation id="4888938634149558681">Soita</translation>
+<translation id="4937657825850660613">Puolikas</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunti}other{# sekuntia}}</translation>
<translation id="4971687151119236543">Media: edellinen kappale</translation>
+<translation id="4971925105143343452">Osittainen</translation>
<translation id="5046499563572181734">Napauta tätä</translation>
<translation id="5076340679995252485">&amp;Liitä</translation>
+<translation id="5123162024343028706">Kiinnitä ylös</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> Pt</translation>
<translation id="5278860589123563674">Lähetys epäonnistui</translation>
<translation id="528468243742722775">Loppu</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_fil.xtb b/chromium/ui/strings/translations/ui_strings_fil.xtb
index 32ebe0569fb..da7916c25f8 100644
--- a/chromium/ui/strings/translations/ui_strings_fil.xtb
+++ b/chromium/ui/strings/translations/ui_strings_fil.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Simulan ang Pagsasalita</translation>
<translation id="4289540628985791613">Pangkalahatang-ideya</translation>
<translation id="4306392492252714209">Alisin sa clipboard.</translation>
+<translation id="4311195029067684288">Buo</translation>
<translation id="4491109536499578614">Larawan</translation>
<translation id="4565377596337484307">Itago ang password</translation>
<translation id="4588090240171750605">Mag-scroll Pakanan</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Na-unpin ang extension</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 buwan ang natitira}one{# buwan ang natitira}other{# na buwan ang natitira}}</translation>
<translation id="4888938634149558681">Tumawag</translation>
+<translation id="4937657825850660613">Kalahati</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 segundo}one{# segundo}other{# na segundo}}</translation>
<translation id="4971687151119236543">Nakaraang Track ng Media</translation>
+<translation id="4971925105143343452">Hindi Buo</translation>
<translation id="5046499563572181734">Mag-tap dito</translation>
<translation id="5076340679995252485">&amp;Ilagay</translation>
+<translation id="5123162024343028706">Umibabaw</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> (na) PB</translation>
<translation id="5278860589123563674">Hindi naipadala</translation>
<translation id="528468243742722775">Tapusin</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_fr-CA.xtb b/chromium/ui/strings/translations/ui_strings_fr-CA.xtb
index 1b4febe4912..76d530fc9b4 100644
--- a/chromium/ui/strings/translations/ui_strings_fr-CA.xtb
+++ b/chromium/ui/strings/translations/ui_strings_fr-CA.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Commencer la lecture</translation>
<translation id="4289540628985791613">Aperçu</translation>
<translation id="4306392492252714209">Retirer du presse-papiers.</translation>
+<translation id="4311195029067684288">Complet</translation>
<translation id="4491109536499578614">Image</translation>
<translation id="4565377596337484307">Masquer le mot de passe</translation>
<translation id="4588090240171750605">Défilement vers la droite</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Épinglage de l'extension annulée</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Un mois restant}one{# mois restant}other{# mois restants}}</translation>
<translation id="4888938634149558681">Faire un appel</translation>
+<translation id="4937657825850660613">Moitié</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 seconde}one{# seconde}other{# secondes}}</translation>
<translation id="4971687151119236543">Titre précédent</translation>
+<translation id="4971925105143343452">Partiel</translation>
<translation id="5046499563572181734">Touchez ici</translation>
<translation id="5076340679995252485">C&amp;oller</translation>
+<translation id="5123162024343028706">Flotter par-dessus</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> Po</translation>
<translation id="5278860589123563674">Échec de l'envoi</translation>
<translation id="528468243742722775">Fin</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_fr.xtb b/chromium/ui/strings/translations/ui_strings_fr.xtb
index e49c6b1c0e6..042940f4403 100644
--- a/chromium/ui/strings/translations/ui_strings_fr.xtb
+++ b/chromium/ui/strings/translations/ui_strings_fr.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Commencer à parler</translation>
<translation id="4289540628985791613">Présentation</translation>
<translation id="4306392492252714209">Supprimer du presse-papiers.</translation>
+<translation id="4311195029067684288">Plein écran</translation>
<translation id="4491109536499578614">Image</translation>
<translation id="4565377596337484307">Masquer le mot de passe</translation>
<translation id="4588090240171750605">Défilement vers la droite</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Extension retirée</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 mois restant}one{# mois restant}other{# mois restants}}</translation>
<translation id="4888938634149558681">Passer un appel</translation>
+<translation id="4937657825850660613">Moitié</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 seconde}one{# seconde}other{# secondes}}</translation>
<translation id="4971687151119236543">Contenu multimédia : titre précédent</translation>
+<translation id="4971925105143343452">Partielle</translation>
<translation id="5046499563572181734">Appuyez ici</translation>
<translation id="5076340679995252485">C&amp;oller</translation>
+<translation id="5123162024343028706">Placer au premier plan</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> Po</translation>
<translation id="5278860589123563674">Échec de l'envoi</translation>
<translation id="528468243742722775">Fin</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_gl.xtb b/chromium/ui/strings/translations/ui_strings_gl.xtb
index ad6cd1ebbda..6d0f509847a 100644
--- a/chromium/ui/strings/translations/ui_strings_gl.xtb
+++ b/chromium/ui/strings/translations/ui_strings_gl.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Comeza a falar</translation>
<translation id="4289540628985791613">Visión xeral</translation>
<translation id="4306392492252714209">Quitar do portapapeis.</translation>
+<translation id="4311195029067684288">Completa</translation>
<translation id="4491109536499578614">Imaxe</translation>
<translation id="4565377596337484307">Ocultar contrasinal</translation>
<translation id="4588090240171750605">Desprazar cara á dereita</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Deixouse de fixar a extensión</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Queda 1 mes}other{Quedan # meses}}</translation>
<translation id="4888938634149558681">Chamar</translation>
+<translation id="4937657825850660613">Metade</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{Un segundo}other{# segundos}}</translation>
<translation id="4971687151119236543">Pista anterior multimedia</translation>
+<translation id="4971925105143343452">Parcial</translation>
<translation id="5046499563572181734">Toca aquí</translation>
<translation id="5076340679995252485">&amp;Pegar</translation>
+<translation id="5123162024343028706">Fixar enriba</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Produciuse un erro no envío</translation>
<translation id="528468243742722775">Final</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_gu.xtb b/chromium/ui/strings/translations/ui_strings_gu.xtb
index 4a52b5de8b4..49376818a35 100644
--- a/chromium/ui/strings/translations/ui_strings_gu.xtb
+++ b/chromium/ui/strings/translations/ui_strings_gu.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">બોલવાનું પ્રારંભ કરો</translation>
<translation id="4289540628985791613">ઓવરવ્યૂ</translation>
<translation id="4306392492252714209">ક્લિપબોર્ડમાંથી કાઢી નાખો.</translation>
+<translation id="4311195029067684288">પૂર્ણ</translation>
<translation id="4491109536499578614">છબી</translation>
<translation id="4565377596337484307">પાસવર્ડ છુપાવો</translation>
<translation id="4588090240171750605">જમણે સ્ક્રોલ કરો</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">એક્સ્ટેન્શન અનપિન કર્યું</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 મહિનો બાકી}one{# મહિનો બાકી}other{# મહિના બાકી}}</translation>
<translation id="4888938634149558681">કૉલ કરો</translation>
+<translation id="4937657825850660613">અડધી</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 સેકન્ડ}one{# સેકન્ડ}other{# સેકન્ડ}}</translation>
<translation id="4971687151119236543">મીડિયા પાછલું ગીત</translation>
+<translation id="4971925105143343452">આંશિક</translation>
<translation id="5046499563572181734">અહીં ટૅપ કરો</translation>
<translation id="5076340679995252485">પેસ્ટ કરો</translation>
+<translation id="5123162024343028706">સૌથી ઉપર પિન કરેલું રાખો</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">મોકલવામાં નિષ્ફળ રહ્યાં</translation>
<translation id="528468243742722775">સમાપ્ત</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_hi.xtb b/chromium/ui/strings/translations/ui_strings_hi.xtb
index 09a61f5edc9..4c3440b3711 100644
--- a/chromium/ui/strings/translations/ui_strings_hi.xtb
+++ b/chromium/ui/strings/translations/ui_strings_hi.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">बोलना प्रारंभ करें</translation>
<translation id="4289540628985791613">संक्षिप्त विवरण</translation>
<translation id="4306392492252714209">क्लिपबोर्ड से हटाएं.</translation>
+<translation id="4311195029067684288">पूर्ण</translation>
<translation id="4491109536499578614">इमेज</translation>
<translation id="4565377596337484307">पासवर्ड छिपाएं</translation>
<translation id="4588090240171750605">दाएं स्क्रोल करें</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">एक्सटेंशन अनपिन किया गया</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 माह शेष}one{# माह शेष}other{# माह शेष}}</translation>
<translation id="4888938634149558681">कॉल करें</translation>
+<translation id="4937657825850660613">स्क्रीन को आधे हिस्सों में बाटें</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 सेकंड}one{# सेकंड}other{# सेकंड}}</translation>
<translation id="4971687151119236543">मीडिया पिछला ट्रैक</translation>
+<translation id="4971925105143343452">आंशिक</translation>
<translation id="5046499563572181734">यहां टैप करें</translation>
<translation id="5076340679995252485">&amp;चिपकाएं</translation>
+<translation id="5123162024343028706">ऊपर की तरफ़ दिखता रहे</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">भेजा नहीं जा सका</translation>
<translation id="528468243742722775">खत्म</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_hr.xtb b/chromium/ui/strings/translations/ui_strings_hr.xtb
index 5a12db4caea..75ed0e5d1dd 100644
--- a/chromium/ui/strings/translations/ui_strings_hr.xtb
+++ b/chromium/ui/strings/translations/ui_strings_hr.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Počni govoriti</translation>
<translation id="4289540628985791613">Pregled</translation>
<translation id="4306392492252714209">Ukloni iz međuspremnika.</translation>
+<translation id="4311195029067684288">Potpuno</translation>
<translation id="4491109536499578614">Slika</translation>
<translation id="4565377596337484307">Sakrij zaporku</translation>
<translation id="4588090240171750605">Pomakni se desno</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Proširenje je otkvačeno</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Još mjesec dana}one{Još # mjesec}few{Još # mjeseca}other{Još # mjeseci}}</translation>
<translation id="4888938634149558681">Uputi poziv</translation>
+<translation id="4937657825850660613">Pola</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunda}one{# sekunda}few{# sekunde}other{# sekundi}}</translation>
<translation id="4971687151119236543">Prethodni zapis Medija</translation>
+<translation id="4971925105143343452">Djelomičnо</translation>
<translation id="5046499563572181734">Dodirnite ovdje</translation>
<translation id="5076340679995252485">&amp;Zalijepi</translation>
+<translation id="5123162024343028706">Pluta na vrhu</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Slanje nije uspjelo</translation>
<translation id="528468243742722775">Završi</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_hu.xtb b/chromium/ui/strings/translations/ui_strings_hu.xtb
index 6178ced471a..555e2950cb6 100644
--- a/chromium/ui/strings/translations/ui_strings_hu.xtb
+++ b/chromium/ui/strings/translations/ui_strings_hu.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Beszéd megkezdése</translation>
<translation id="4289540628985791613">Áttekintés</translation>
<translation id="4306392492252714209">Eltávolítás a vágólapról.</translation>
+<translation id="4311195029067684288">Teljes</translation>
<translation id="4491109536499578614">Kép</translation>
<translation id="4565377596337484307">Jelszó elrejtése</translation>
<translation id="4588090240171750605">Görgetés jobbra</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Bővítmény kitűzése feloldva</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{hátralévő idő: 1 hónap}other{hátralévő idő: # hónap}}</translation>
<translation id="4888938634149558681">Hívás indítása</translation>
+<translation id="4937657825850660613">Fél</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 másodperc}other{# másodperc}}</translation>
<translation id="4971687151119236543">Előző szám</translation>
+<translation id="4971925105143343452">Részleges</translation>
<translation id="5046499563572181734">Koppintson ide</translation>
<translation id="5076340679995252485">&amp;Beillesztés</translation>
+<translation id="5123162024343028706">Lebegés az oldal fölött</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Sikertelen küldés</translation>
<translation id="528468243742722775">Befejezés</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_hy.xtb b/chromium/ui/strings/translations/ui_strings_hy.xtb
index da0ccfe27a0..21a8d2aed6d 100644
--- a/chromium/ui/strings/translations/ui_strings_hy.xtb
+++ b/chromium/ui/strings/translations/ui_strings_hy.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Start Speaking</translation>
<translation id="4289540628985791613">Համատեսք</translation>
<translation id="4306392492252714209">Հեռացնել սեղմատախտակից։</translation>
+<translation id="4311195029067684288">Ամբողջական</translation>
<translation id="4491109536499578614">Պատկեր</translation>
<translation id="4565377596337484307">Թաքցնել գաղտնաբառը</translation>
<translation id="4588090240171750605">Ոլորել դեպի աջ</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Ընդլայնումն ապամրացվել է</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Մնացել է 1 ամիս}one{Մնացել է # ամիս}other{Մնացել է # ամիս}}</translation>
<translation id="4888938634149558681">Զանգել</translation>
+<translation id="4937657825850660613">Կիսված</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 վայրկյան}one{# վայրկյան}other{# վայրկյան}}</translation>
<translation id="4971687151119236543">Նախորդ կատարումը</translation>
+<translation id="4971925105143343452">Մասնակի</translation>
<translation id="5046499563572181734">Հպեք այստեղ</translation>
<translation id="5076340679995252485">&amp;Տեղադրել</translation>
+<translation id="5123162024343028706">Ամրացնել վերևում</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> ՊԲ</translation>
<translation id="5278860589123563674">Չհաջողվեց ուղարկել</translation>
<translation id="528468243742722775">Վերջ</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_id.xtb b/chromium/ui/strings/translations/ui_strings_id.xtb
index 30e2a7acb95..b24b7180e1e 100644
--- a/chromium/ui/strings/translations/ui_strings_id.xtb
+++ b/chromium/ui/strings/translations/ui_strings_id.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Mulai Berbicara</translation>
<translation id="4289540628985791613">Ikhtisar</translation>
<translation id="4306392492252714209">Hapus dari papan klip.</translation>
+<translation id="4311195029067684288">Penuh</translation>
<translation id="4491109536499578614">Gambar</translation>
<translation id="4565377596337484307">Sembunyikan sandi</translation>
<translation id="4588090240171750605">Gulir ke Kanan</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Ekstensi dilepaskan</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 bulan lagi}other{# bulan lagi}}</translation>
<translation id="4888938634149558681">Telepon</translation>
+<translation id="4937657825850660613">Setengah</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 detik}other{# detik}}</translation>
<translation id="4971687151119236543">Lacak Media Sebelumnya</translation>
+<translation id="4971925105143343452">Sebagian</translation>
<translation id="5046499563572181734">Ketuk di sini</translation>
<translation id="5076340679995252485">Tem&amp;pel</translation>
+<translation id="5123162024343028706">Sematkan di atas</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Gagal mengirim</translation>
<translation id="528468243742722775">Berakhir</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_is.xtb b/chromium/ui/strings/translations/ui_strings_is.xtb
index da3f8399afd..f8d070c59ec 100644
--- a/chromium/ui/strings/translations/ui_strings_is.xtb
+++ b/chromium/ui/strings/translations/ui_strings_is.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Byrja að tala</translation>
<translation id="4289540628985791613">Yfirlit</translation>
<translation id="4306392492252714209">Fjarlægja af klippiborði</translation>
+<translation id="4311195029067684288">Allur</translation>
<translation id="4491109536499578614">Mynd</translation>
<translation id="4565377596337484307">Fela aðgangsorð</translation>
<translation id="4588090240171750605">Fletta til hægri</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Viðbót losuð</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Einn mánuður eftir}one{# mánuður eftir}other{# mánuðir eftir}}</translation>
<translation id="4888938634149558681">Hringja</translation>
+<translation id="4937657825850660613">Hálfur</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 sekúnda}one{# sekúnda}other{# sekúndur}}</translation>
<translation id="4971687151119236543">Fyrra lag</translation>
+<translation id="4971925105143343452">Hluti</translation>
<translation id="5046499563572181734">Ýttu hér</translation>
<translation id="5076340679995252485">Líma</translation>
+<translation id="5123162024343028706">Fljóta efst</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Sending mistókst</translation>
<translation id="528468243742722775">Ljúka</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_it.xtb b/chromium/ui/strings/translations/ui_strings_it.xtb
index 646c5076c28..3dcc1315b36 100644
--- a/chromium/ui/strings/translations/ui_strings_it.xtb
+++ b/chromium/ui/strings/translations/ui_strings_it.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Avvia comandi vocali</translation>
<translation id="4289540628985791613">Panoramica</translation>
<translation id="4306392492252714209">Rimuovi dagli appunti.</translation>
+<translation id="4311195029067684288">Completo</translation>
<translation id="4491109536499578614">Immagine</translation>
<translation id="4565377596337484307">Nascondi password</translation>
<translation id="4588090240171750605">Scorri a destra</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Estensione sbloccata</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 mese rimasto}other{# mesi rimasti}}</translation>
<translation id="4888938634149558681">Chiama</translation>
+<translation id="4937657825850660613">Metà</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 secondo}other{# secondi}}</translation>
<translation id="4971687151119236543">Traccia precedente contenuti multimediali</translation>
+<translation id="4971925105143343452">Parziale</translation>
<translation id="5046499563572181734">Tocca qui</translation>
<translation id="5076340679995252485">&amp;Incolla</translation>
+<translation id="5123162024343028706">Mobile in primo piano</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Invio non riuscito</translation>
<translation id="528468243742722775">Fine</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_iw.xtb b/chromium/ui/strings/translations/ui_strings_iw.xtb
index dfc6e9f7c63..6803f36803a 100644
--- a/chromium/ui/strings/translations/ui_strings_iw.xtb
+++ b/chromium/ui/strings/translations/ui_strings_iw.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">יש להתחיל לדבר</translation>
<translation id="4289540628985791613">סקירה כללית</translation>
<translation id="4306392492252714209">הסרה מהלוח.</translation>
+<translation id="4311195029067684288">מלא</translation>
<translation id="4491109536499578614">תמונה</translation>
<translation id="4565377596337484307">הסתרת סיסמה</translation>
<translation id="4588090240171750605">גלילה ימינה</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">בוטלה ההצמדה של התוסף</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{נותר חודש אחד}two{נותרו חודשיים}many{נותרו # חודשים}other{נותרו # חודשים}}</translation>
<translation id="4888938634149558681">התקשרות</translation>
+<translation id="4937657825850660613">חצי</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{שנייה אחת}two{# שניות}many{# שניות}other{# שניות}}</translation>
<translation id="4971687151119236543">טראק קודם במדיה</translation>
+<translation id="4971925105143343452">חלקי</translation>
<translation id="5046499563572181734">יש להקיש כאן</translation>
<translation id="5076340679995252485">&amp;הדבקה</translation>
+<translation id="5123162024343028706">פתיחה בחלון צף</translation>
<translation id="520299402983819650"><ph name="QUANTITY" />PB</translation>
<translation id="5278860589123563674">השליחה נכשלה</translation>
<translation id="528468243742722775">סיום</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ja.xtb b/chromium/ui/strings/translations/ui_strings_ja.xtb
index 1c49b1c7efa..5984fc839cd 100644
--- a/chromium/ui/strings/translations/ui_strings_ja.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ja.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">読み上げを開始</translation>
<translation id="4289540628985791613">概要</translation>
<translation id="4306392492252714209">クリップボードから削除します。</translation>
+<translation id="4311195029067684288">100%</translation>
<translation id="4491109536499578614">画像</translation>
<translation id="4565377596337484307">パスワードを表示しない</translation>
<translation id="4588090240171750605">右にスクロール</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">拡張機能の固定を解除しました</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{残り 1 か月}other{残り # か月}}</translation>
<translation id="4888938634149558681">電話をかける</translation>
+<translation id="4937657825850660613">半分</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 秒}other{# 秒}}</translation>
<translation id="4971687151119236543">メディアの前のトラック</translation>
+<translation id="4971925105143343452">一部</translation>
<translation id="5046499563572181734">ここをタップしてください</translation>
<translation id="5076340679995252485">貼り付け(&amp;P)</translation>
+<translation id="5123162024343028706">上部に表示</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">送信できませんでした</translation>
<translation id="528468243742722775">終了</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ka.xtb b/chromium/ui/strings/translations/ui_strings_ka.xtb
index 688cea053ba..e5abd013a18 100644
--- a/chromium/ui/strings/translations/ui_strings_ka.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ka.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">დაიწყეთ ლაპარაკი</translation>
<translation id="4289540628985791613">მიმოხილვა</translation>
<translation id="4306392492252714209">გაცვლის ბუფერიდან ამოშლა.</translation>
+<translation id="4311195029067684288">მთლიანი</translation>
<translation id="4491109536499578614">გამოსახულება</translation>
<translation id="4565377596337484307">პაროლის დამალვა</translation>
<translation id="4588090240171750605">გადაადგილება მარჯვნივ</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">გაფართოების ჩამაგრება მოიხსნა</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{დარჩენილია 1 თვე}other{დარჩენილია # თვე}}</translation>
<translation id="4888938634149558681">დარეკვა</translation>
+<translation id="4937657825850660613">ნახევარი</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 წამი}other{# წამი}}</translation>
<translation id="4971687151119236543">მედია წინა ჩანაწერი</translation>
+<translation id="4971925105143343452">ნაწილობრივი</translation>
<translation id="5046499563572181734">შეეხეთ აქ</translation>
<translation id="5076340679995252485">&amp;ჩასმა</translation>
+<translation id="5123162024343028706">წინა პლანზე დატოვება</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> პბაიტი</translation>
<translation id="5278860589123563674">გაგზავნა ვერ მოხერხდა</translation>
<translation id="528468243742722775">დასასრული</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_kk.xtb b/chromium/ui/strings/translations/ui_strings_kk.xtb
index 3465b6b429d..17fe490075e 100644
--- a/chromium/ui/strings/translations/ui_strings_kk.xtb
+++ b/chromium/ui/strings/translations/ui_strings_kk.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Сөйлеуді бастау</translation>
<translation id="4289540628985791613">Шолу</translation>
<translation id="4306392492252714209">Буферден өшіру.</translation>
+<translation id="4311195029067684288">Толық</translation>
<translation id="4491109536499578614">Кескін</translation>
<translation id="4565377596337484307">Құпия сөзді жасыру</translation>
<translation id="4588090240171750605">Оңға айналдыру</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Кеңейтім босатылды.</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 ай қалды}other{# ай қалды}}</translation>
<translation id="4888938634149558681">Қоңырау шалу</translation>
+<translation id="4937657825850660613">Жартылай</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 секунд}other{# секунд}}</translation>
<translation id="4971687151119236543">Алдыңғы медиатрек</translation>
+<translation id="4971925105143343452">Ішінара</translation>
<translation id="5046499563572181734">Осы жерді түртіңіз</translation>
<translation id="5076340679995252485">&amp;Қою</translation>
+<translation id="5123162024343028706">Жоғарыға бекіту</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> ПБ</translation>
<translation id="5278860589123563674">Жіберілмеді</translation>
<translation id="528468243742722775">Соңы</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_km.xtb b/chromium/ui/strings/translations/ui_strings_km.xtb
index cc3397ef03e..fabdd9c0d00 100644
--- a/chromium/ui/strings/translations/ui_strings_km.xtb
+++ b/chromium/ui/strings/translations/ui_strings_km.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">ចាប់ផ្តើមនិយាយ</translation>
<translation id="4289540628985791613">ទិដ្ឋភាពទូទៅ</translation>
<translation id="4306392492252714209">លុបចេញពី​ឃ្លីបបត។</translation>
+<translation id="4311195029067684288">ពេញ</translation>
<translation id="4491109536499578614">រូបភាព</translation>
<translation id="4565377596337484307">លាក់​ពាក្យ​សម្ងាត់</translation>
<translation id="4588090240171750605">ទាញចុះទៅខាងស្តាំ</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">បានដកខ្ទាស់​កម្មវិធីបន្ថែម</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{នៅសល់ 1 ខែទៀត}other{នៅសល់ # ខែទៀត}}</translation>
<translation id="4888938634149558681">ហៅទូរសព្ទ</translation>
+<translation id="4937657825850660613">ពាក់​ក​ណ្តា​ល</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 វិនាទី}other{# វិនាទី}}</translation>
<translation id="4971687151119236543">Media Previous Track</translation>
+<translation id="4971925105143343452">ផ្នែកខ្លះ</translation>
<translation id="5046499563572181734">ចុច​ទីនេះ</translation>
<translation id="5076340679995252485">បិទភ្ជាប់</translation>
+<translation id="5123162024343028706">អណ្ដែតនៅផ្នែកខាងលើ</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">មិន​អាច​ផ្ញើ​បាន​ទេ</translation>
<translation id="528468243742722775">បញ្ចប់</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_kn.xtb b/chromium/ui/strings/translations/ui_strings_kn.xtb
index 5dd25942fdd..2f7f67fe602 100644
--- a/chromium/ui/strings/translations/ui_strings_kn.xtb
+++ b/chromium/ui/strings/translations/ui_strings_kn.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">ಮಾತನಾಡುವುದನ್ನು ಪ್ರಾರಂಭಿಸಿ</translation>
<translation id="4289540628985791613">ಅವಲೋಕನ</translation>
<translation id="4306392492252714209">ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ನಿಂದ ತೆಗೆದುಹಾಕಿ.</translation>
+<translation id="4311195029067684288">ಪೂರ್ಣ</translation>
<translation id="4491109536499578614">ಚಿತ್ರ</translation>
<translation id="4565377596337484307">ಪಾಸ್‌ವರ್ಡ್ ಮರೆಮಾಡಿ</translation>
<translation id="4588090240171750605">ಬಲಕ್ಕೆ ಸ್ಕ್ರೋಲ್ ಮಾಡಿ</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">ವಿಸ್ತರಣೆಯನ್ನು ಅನ್‌ಪಿನ್ ಮಾಡಲಾಗಿದೆ</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 ತಿಂಗಳು ಉಳಿದಿದೆ}one{# ತಿಂಗಳುಗಳು ಉಳಿದಿವೆ}other{# ತಿಂಗಳುಗಳು ಉಳಿದಿವೆ}}</translation>
<translation id="4888938634149558681">ಕರೆ ಮಾಡಿ</translation>
+<translation id="4937657825850660613">ಅರ್ಧ</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 ಸೆಕೆಂಡ್}one{# ಸೆಕೆಂಡುಗಳು}other{# ಸೆಕೆಂಡುಗಳು}}</translation>
<translation id="4971687151119236543">ಮೀಡಿಯಾದ ಹಿಂದಿನ ಟ್ರ್ಯಾಕ್</translation>
+<translation id="4971925105143343452">ಭಾಗಶಃ</translation>
<translation id="5046499563572181734">ಇಲ್ಲಿ ಟ್ಯಾಪ್ ಮಾಡಿ</translation>
<translation id="5076340679995252485">&amp;ಅಂಟಿಸಿ</translation>
+<translation id="5123162024343028706">ಮೇಲೆ ತೇಲು</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">ಕಳುಹಿಸಲು ವಿಫಲವಾಗಿದೆ</translation>
<translation id="528468243742722775">ಅಂತ್ಯ</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ko.xtb b/chromium/ui/strings/translations/ui_strings_ko.xtb
index ac985a9ed07..4120cb37625 100644
--- a/chromium/ui/strings/translations/ui_strings_ko.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ko.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">말하기 시작</translation>
<translation id="4289540628985791613">개요</translation>
<translation id="4306392492252714209">클립보드에서 삭제합니다.</translation>
+<translation id="4311195029067684288">전체화면</translation>
<translation id="4491109536499578614">이미지</translation>
<translation id="4565377596337484307">비밀번호 숨김</translation>
<translation id="4588090240171750605">오른쪽 스크롤</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">확장 프로그램 고정 해제됨</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1개월 남음}other{#개월 남음}}</translation>
<translation id="4888938634149558681">전화 걸기</translation>
+<translation id="4937657825850660613">절반 분할</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1초}other{#초}}</translation>
<translation id="4971687151119236543">미디어 이전 트랙</translation>
+<translation id="4971925105143343452">부분화면</translation>
<translation id="5046499563572181734">여기를 탭하세요.</translation>
<translation id="5076340679995252485">붙여넣기(&amp;P)</translation>
+<translation id="5123162024343028706">상단에 띄우기</translation>
<translation id="520299402983819650"><ph name="QUANTITY" />PB</translation>
<translation id="5278860589123563674">전송 실패</translation>
<translation id="528468243742722775">종료</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ky.xtb b/chromium/ui/strings/translations/ui_strings_ky.xtb
index ae73ad1e14b..f8fdbbd5065 100644
--- a/chromium/ui/strings/translations/ui_strings_ky.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ky.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Сүйлөп баштаңыз</translation>
<translation id="4289540628985791613">Сереп салуу</translation>
<translation id="4306392492252714209">Алмашуу буферинен өчүрүү.</translation>
+<translation id="4311195029067684288">Толук</translation>
<translation id="4491109536499578614">Сүрөт</translation>
<translation id="4565377596337484307">Сырсөздү жашыруу</translation>
<translation id="4588090240171750605">Оңго сыдырып кароо</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Кеңейтүү бошотулду</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 ай калды}other{# ай калды}}</translation>
<translation id="4888938634149558681">Чалуу</translation>
+<translation id="4937657825850660613">Жарымы</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 секунд}other{# секунд}}</translation>
<translation id="4971687151119236543">Медиа мурунку трэк</translation>
+<translation id="4971925105143343452">Жарым-жартылай</translation>
<translation id="5046499563572181734">Бул жерди таптаңыз</translation>
<translation id="5076340679995252485">&amp;Чаптоо</translation>
+<translation id="5123162024343028706">Үстүнө кадап коюу</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> Пб</translation>
<translation id="5278860589123563674">Жөнөтүлгөн жок</translation>
<translation id="528468243742722775">Бүтүрүү</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_lo.xtb b/chromium/ui/strings/translations/ui_strings_lo.xtb
index ddaf4e85116..ae2ef1cca6b 100644
--- a/chromium/ui/strings/translations/ui_strings_lo.xtb
+++ b/chromium/ui/strings/translations/ui_strings_lo.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">ເລີ່ມ​ຕົ້ນ​ເວົ້າ</translation>
<translation id="4289540628985791613">ພາບ​ລວມ</translation>
<translation id="4306392492252714209">ລຶບອອກຈາກຄລິບບອດ.</translation>
+<translation id="4311195029067684288">ເຕັມ</translation>
<translation id="4491109536499578614">ຮູບ​</translation>
<translation id="4565377596337484307">ເຊື່ອງລະຫັດຜ່ານ</translation>
<translation id="4588090240171750605">ເລື່ອນໄປທາງຂວາ</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">ຖອນໝຸດສ່ວນຂະຫຍາຍແລ້ວ</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{ຍັງເຫຼືອ 1 ເດືອນ}other{ຍັງເຫຼືອ # ເດືອນ}}</translation>
<translation id="4888938634149558681">ໂທອອກ</translation>
+<translation id="4937657825850660613">ເຄິ່ງໜຶ່ງ</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 ວິ​ນາ​ທີ}other{# ວິ​ນາ​ທີ}}</translation>
<translation id="4971687151119236543">ເພງຜ່ານມາຂອງມີເດຍ</translation>
+<translation id="4971925105143343452">ບາງສ່ວນ</translation>
<translation id="5046499563572181734">ແຕະບ່ອນນີ້</translation>
<translation id="5076340679995252485">ແປະໃສ່</translation>
+<translation id="5123162024343028706">ລອຍຢູ່ທາງເທິງ</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">ສົ່ງບໍ່ສຳເລັດ</translation>
<translation id="528468243742722775">ສິ້ນສຸດ</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_lt.xtb b/chromium/ui/strings/translations/ui_strings_lt.xtb
index 910e76c46f7..d5fce9facff 100644
--- a/chromium/ui/strings/translations/ui_strings_lt.xtb
+++ b/chromium/ui/strings/translations/ui_strings_lt.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Pradėti kalbėti</translation>
<translation id="4289540628985791613">Apžvalga</translation>
<translation id="4306392492252714209">Pašalinti iš iškarpinės.</translation>
+<translation id="4311195029067684288">Visas</translation>
<translation id="4491109536499578614">Vaizdas</translation>
<translation id="4565377596337484307">Slėpti slaptažodį</translation>
<translation id="4588090240171750605">Slinkti į dešinę</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Plėtinys atsegtas</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Liko 1 mėnuo}one{Liko # mėnuo}few{Liko # mėnesiai}many{Liko # mėnesio}other{Liko # mėnesių}}</translation>
<translation id="4888938634149558681">Skambinti</translation>
+<translation id="4937657825850660613">Pusė</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 sekundė}one{# sekundė}few{# sekundės}many{# sekundės}other{# sekundžių}}</translation>
<translation id="4971687151119236543">Ankstesnis medijos takelis</translation>
+<translation id="4971925105143343452">Dalinis</translation>
<translation id="5046499563572181734">Palieskite čia</translation>
<translation id="5076340679995252485">&amp;Įklijuoti</translation>
+<translation id="5123162024343028706">Rodyti viršuje</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Nepavyko išsiųsti</translation>
<translation id="528468243742722775">Baigti</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_lv.xtb b/chromium/ui/strings/translations/ui_strings_lv.xtb
index 7163c7d89c3..8347f20667a 100644
--- a/chromium/ui/strings/translations/ui_strings_lv.xtb
+++ b/chromium/ui/strings/translations/ui_strings_lv.xtb
@@ -10,7 +10,7 @@
<translation id="1266864766717917324">Nevarēja kopīgot: <ph name="CONTENT_TYPE" /></translation>
<translation id="1269641567813814718">Windows</translation>
<translation id="1291104554099683393">Kopīgojiet mazākus teksta fragmentus.</translation>
-<translation id="1293699935367580298">Atsolis</translation>
+<translation id="1293699935367580298">Esc</translation>
<translation id="1368832886055348810">No kreisās uz labo pusi</translation>
<translation id="1383876407941801731">Meklēt</translation>
<translation id="1398853756734560583">Maksimizēt</translation>
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Sākt runāt</translation>
<translation id="4289540628985791613">Kopsavilkums</translation>
<translation id="4306392492252714209">Noņemt no starpliktuves.</translation>
+<translation id="4311195029067684288">Pilns</translation>
<translation id="4491109536499578614">Attēls</translation>
<translation id="4565377596337484307">Slēpt paroli</translation>
<translation id="4588090240171750605">Ritināt pa labi</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Paplašinājums ir atsprausts</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Atlicis 1 mēnesis}zero{Atlikuši # mēneši}one{Atlicis # mēnesis}other{Atlikuši # mēneši}}</translation>
<translation id="4888938634149558681">Zvanīt</translation>
+<translation id="4937657825850660613">Puse</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunde}zero{# sekundes}one{# sekunde}other{# sekundes}}</translation>
<translation id="4971687151119236543">Multivide — iepriekšējā dziesma</translation>
+<translation id="4971925105143343452">Daļējs</translation>
<translation id="5046499563572181734">Pieskarieties šeit</translation>
<translation id="5076340679995252485">&amp;Ielīmēt</translation>
+<translation id="5123162024343028706">Piespraust augšdaļā</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Neizdevās nosūtīt</translation>
<translation id="528468243742722775">Beigas</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_mk.xtb b/chromium/ui/strings/translations/ui_strings_mk.xtb
index 3e7d7fb6bc2..9231c5a0911 100644
--- a/chromium/ui/strings/translations/ui_strings_mk.xtb
+++ b/chromium/ui/strings/translations/ui_strings_mk.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Започни со говорење</translation>
<translation id="4289540628985791613">Преглед</translation>
<translation id="4306392492252714209">Отстранете од привремената меморија.</translation>
+<translation id="4311195029067684288">Целосно</translation>
<translation id="4491109536499578614">Слика</translation>
<translation id="4565377596337484307">Сокриј ја лозинката</translation>
<translation id="4588090240171750605">Лизгај надесно</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Екстензијата е откачена</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Преостанува 1 месец}one{Преостанува # месец}other{Преостануваат # месеци}}</translation>
<translation id="4888938634149558681">Јави се</translation>
+<translation id="4937657825850660613">Половина</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 секунда}one{# секунда}other{# секунди}}</translation>
<translation id="4971687151119236543">Претходна песна на медиуми</translation>
+<translation id="4971925105143343452">Делумно</translation>
<translation id="5046499563572181734">Допрете тука</translation>
<translation id="5076340679995252485">&amp;Залепи</translation>
+<translation id="5123162024343028706">Лебди одозгора</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> ПБ</translation>
<translation id="5278860589123563674">Не успеа да се испрати</translation>
<translation id="528468243742722775">Крај</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ml.xtb b/chromium/ui/strings/translations/ui_strings_ml.xtb
index 1d6805b8907..be91544adec 100644
--- a/chromium/ui/strings/translations/ui_strings_ml.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ml.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">സംഭാഷണം ആരംഭിക്കുക</translation>
<translation id="4289540628985791613">അവലോകനം</translation>
<translation id="4306392492252714209">ക്ലിപ്പ്ബോർഡിൽ നിന്ന് നീക്കം ചെയ്യുക.</translation>
+<translation id="4311195029067684288">പൂർണ്ണം</translation>
<translation id="4491109536499578614">ചിത്രം</translation>
<translation id="4565377596337484307">പാസ്‌വേഡ് മറയ്ക്കുക</translation>
<translation id="4588090240171750605">വലത്തോട്ട് സ്ക്രോള്‍ ചെയ്യുക</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">വിപുലീകരണം അൺപിൻ ചെയ്തു</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{ഒരു മാസം ശേഷിക്കുന്നു}other{# മാസം ശേഷിക്കുന്നു}}</translation>
<translation id="4888938634149558681">കോൾ ചെയ്യുക</translation>
+<translation id="4937657825850660613">പകുതി</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{ഒരു സെക്കന്‍ഡ്}other{# സെക്കൻഡ്}}</translation>
<translation id="4971687151119236543">മുമ്പത്തെ മീഡിയാ ട്രാക്ക്</translation>
+<translation id="4971925105143343452">ഭാഗികം</translation>
<translation id="5046499563572181734">ഇവിടെ ടാപ്പുചെയ്യുക</translation>
<translation id="5076340679995252485">&amp;ഒട്ടിക്കുക</translation>
+<translation id="5123162024343028706">മുകളിൽ പിൻ ചെയ്യുക</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">അയയ്ക്കാനായില്ല</translation>
<translation id="528468243742722775">അവസാനിപ്പിക്കുക</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_mn.xtb b/chromium/ui/strings/translations/ui_strings_mn.xtb
index a6efd140193..da0ba9a7945 100644
--- a/chromium/ui/strings/translations/ui_strings_mn.xtb
+++ b/chromium/ui/strings/translations/ui_strings_mn.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Ярьж эхлэх</translation>
<translation id="4289540628985791613">Тойм</translation>
<translation id="4306392492252714209">Түр санах ойгоос хасна.</translation>
+<translation id="4311195029067684288">Бүтэн</translation>
<translation id="4491109536499578614">Зураг</translation>
<translation id="4565377596337484307">Нууц үгийг нуух</translation>
<translation id="4588090240171750605">Баруун тийш гүйлгэх</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Өргөтгөлийг бэхэлснийг болиулсан</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 сар үлдсэн}other{# сар үлдсэн}}</translation>
<translation id="4888938634149558681">Дуудлага хийх</translation>
+<translation id="4937657825850660613">Хагас</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 секунд}other{# секунд}}</translation>
<translation id="4971687151119236543">Өмнөх хөгжмийн медиа</translation>
+<translation id="4971925105143343452">Хэсэгчилсэн</translation>
<translation id="5046499563572181734">Энд товшино уу</translation>
<translation id="5076340679995252485">Хуулан буулгах</translation>
+<translation id="5123162024343028706">Дээд талд нь байлгах</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> ПБ</translation>
<translation id="5278860589123563674">Илгээж чадсангүй</translation>
<translation id="528468243742722775">Төгсгөл</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_mr.xtb b/chromium/ui/strings/translations/ui_strings_mr.xtb
index 36200e45c0f..a7db1d4bcd4 100644
--- a/chromium/ui/strings/translations/ui_strings_mr.xtb
+++ b/chromium/ui/strings/translations/ui_strings_mr.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">बोलणे सुरू करा</translation>
<translation id="4289540628985791613">विहंगावलोकन</translation>
<translation id="4306392492252714209">क्लिपबोर्डवरून काढून टाका.</translation>
+<translation id="4311195029067684288">पूर्ण</translation>
<translation id="4491109536499578614">इमेज</translation>
<translation id="4565377596337484307">पासवर्ड लपवा</translation>
<translation id="4588090240171750605">उजवे स्क्रोल करा</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">एक्स्टेंशन अनपिन केले</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 महिना राहिला}other{# महिने राहिले}}</translation>
<translation id="4888938634149558681">कॉल करा</translation>
+<translation id="4937657825850660613">अर्धा</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 सेकंद}other{# सेकंद}}</translation>
<translation id="4971687151119236543">मीडिया मागील ट्रॅक</translation>
+<translation id="4971925105143343452">अंशिक</translation>
<translation id="5046499563572181734">येथे टॅप करा</translation>
<translation id="5076340679995252485">&amp;पेस्ट करा</translation>
+<translation id="5123162024343028706">वरती फ्लोट करा</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">पाठवता आले नाही</translation>
<translation id="528468243742722775">बंद करा</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ms.xtb b/chromium/ui/strings/translations/ui_strings_ms.xtb
index 1022494fd6b..de2ace5c3b8 100644
--- a/chromium/ui/strings/translations/ui_strings_ms.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ms.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Mula Bercakap</translation>
<translation id="4289540628985791613">Gambaran keseluruhan</translation>
<translation id="4306392492252714209">Alih keluar daripada papan keratan.</translation>
+<translation id="4311195029067684288">Penuh</translation>
<translation id="4491109536499578614">Imej</translation>
<translation id="4565377596337484307">Sembunyikan kata laluan</translation>
<translation id="4588090240171750605">Tatal ke Kanan</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Sambungan dinyahsemat</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Berbaki 1 bulan}other{Berbaki # bulan}}</translation>
<translation id="4888938634149558681">Buat panggilan</translation>
+<translation id="4937657825850660613">Separuh</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 saat}other{# saat}}</translation>
<translation id="4971687151119236543">Lagu Media Sebelumnya</translation>
+<translation id="4971925105143343452">Separa</translation>
<translation id="5046499563572181734">Ketik di sini</translation>
<translation id="5076340679995252485">&amp;Tampal</translation>
+<translation id="5123162024343028706">Terapung di sebelah atas</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Gagal dihantar</translation>
<translation id="528468243742722775">End</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_my.xtb b/chromium/ui/strings/translations/ui_strings_my.xtb
index e472c768d8e..f776fc68faa 100644
--- a/chromium/ui/strings/translations/ui_strings_my.xtb
+++ b/chromium/ui/strings/translations/ui_strings_my.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">စတင် စကားပြော</translation>
<translation id="4289540628985791613">အကျဉ်းချုပ်</translation>
<translation id="4306392492252714209">ကလစ်ဘုတ်မှ ဖယ်ရှားလိုက်သည်။</translation>
+<translation id="4311195029067684288">အပြည့်</translation>
<translation id="4491109536499578614">ပုံ</translation>
<translation id="4565377596337484307">စကားဝှက်ကို ဖျောက်ရန်</translation>
<translation id="4588090240171750605">ညာဖက်သို့ ရွှေ့ရန်</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">‘နောက်ဆက်တွဲ’ ပင်ဖြုတ်ပြီးပြီ</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{၁ လ ကျန်သည်}other{# လ ကျန်သည်}}</translation>
<translation id="4888938634149558681">ဖုန်းခေါ်ရန်</translation>
+<translation id="4937657825850660613">တစ်ဝက်</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{၁ စက္ကန့်}other{# စက္ကန့်}}</translation>
<translation id="4971687151119236543">မီဒီယာ ယခင်သီချင်းပုဒ်</translation>
+<translation id="4971925105143343452">တစ်စိတ်တစ်ပိုင်း</translation>
<translation id="5046499563572181734">ဤနေရာကို တို့ပါ</translation>
<translation id="5076340679995252485">&amp;ကူးထည့်ရန်</translation>
+<translation id="5123162024343028706">Float on top</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">ပို့၍ မရပါ</translation>
<translation id="528468243742722775">အဆုံး</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ne.xtb b/chromium/ui/strings/translations/ui_strings_ne.xtb
index 7bb139c5bf7..2bca5ca34e6 100644
--- a/chromium/ui/strings/translations/ui_strings_ne.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ne.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">बोल्न सुरु गर्नुहोस्</translation>
<translation id="4289540628985791613">समीक्षा</translation>
<translation id="4306392492252714209">क्लिपबोर्डबाट हटाउनुहोस्।</translation>
+<translation id="4311195029067684288">फुल स्क्रिन खोल्नुहोस्</translation>
<translation id="4491109536499578614">छवि</translation>
<translation id="4565377596337484307">पासवर्ड लुकाउनुहोस्</translation>
<translation id="4588090240171750605">दायाँ तिर स्क्रोल गर्नुहोस्</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">एक्स्टेन्सन अनपिन गरियो</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{१ महिना बाँकी}other{# महिना बाँकी}}</translation>
<translation id="4888938634149558681">कल गर्नुहोस्</translation>
+<translation id="4937657825850660613">स्क्रिन दुई भागमा स्प्लिट गर्नुहोस्</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{ १ सेकेन्ड}other{ # सेकेन्ड}}</translation>
<translation id="4971687151119236543">मिडिया अघिल्लो ट्र्याक</translation>
+<translation id="4971925105143343452">स्क्रिनको केही भाग स्प्लिट गर्नुहोस्</translation>
<translation id="5046499563572181734">यहाँ ट्याप गर्नुहोस्</translation>
<translation id="5076340679995252485">&amp;टाँस्नुहोस्</translation>
+<translation id="5123162024343028706">माथि पिन गर्नुहोस्</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> पीबी</translation>
<translation id="5278860589123563674">पठाउन सकिएन</translation>
<translation id="528468243742722775">समाप्त</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_nl.xtb b/chromium/ui/strings/translations/ui_strings_nl.xtb
index 51cba3925d4..100a94444d7 100644
--- a/chromium/ui/strings/translations/ui_strings_nl.xtb
+++ b/chromium/ui/strings/translations/ui_strings_nl.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Inspreken starten</translation>
<translation id="4289540628985791613">Overzicht</translation>
<translation id="4306392492252714209">Verwijderen van het klembord.</translation>
+<translation id="4311195029067684288">Volledig</translation>
<translation id="4491109536499578614">Afbeelding</translation>
<translation id="4565377596337484307">Wachtwoord verbergen</translation>
<translation id="4588090240171750605">Naar rechts bladeren</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Extensie losgemaakt</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Nog 1 maand}other{Nog # maanden}}</translation>
<translation id="4888938634149558681">Bellen</translation>
+<translation id="4937657825850660613">Half</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 seconde}other{# seconden}}</translation>
<translation id="4971687151119236543">Vorige track voor media</translation>
+<translation id="4971925105143343452">Gedeeltelijk</translation>
<translation id="5046499563572181734">Tik hier</translation>
<translation id="5076340679995252485">&amp;Plakken</translation>
+<translation id="5123162024343028706">Altijd boven</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Verzenden mislukt</translation>
<translation id="528468243742722775">Beëindigen</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_no.xtb b/chromium/ui/strings/translations/ui_strings_no.xtb
index 2d433a6bc68..552e3e65acc 100644
--- a/chromium/ui/strings/translations/ui_strings_no.xtb
+++ b/chromium/ui/strings/translations/ui_strings_no.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Begynn å snakke</translation>
<translation id="4289540628985791613">Oversikt</translation>
<translation id="4306392492252714209">Fjern fra utklippstavlen.</translation>
+<translation id="4311195029067684288">Full</translation>
<translation id="4491109536499578614">Bilde</translation>
<translation id="4565377596337484307">Skjul passord</translation>
<translation id="4588090240171750605">Rull mot høyre</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Utvidelsen er løsnet</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 måned igjen}other{# måneder igjen}}</translation>
<translation id="4888938634149558681">Ring</translation>
+<translation id="4937657825850660613">Halv</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 sekund}other{# sekunder}}</translation>
<translation id="4971687151119236543">Media – forrige spor</translation>
+<translation id="4971925105143343452">Delvis</translation>
<translation id="5046499563572181734">Trykk her</translation>
<translation id="5076340679995252485">&amp;Lim inn</translation>
+<translation id="5123162024343028706">Fest øverst</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Kunne ikke sende</translation>
<translation id="528468243742722775">Avslutt</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_or.xtb b/chromium/ui/strings/translations/ui_strings_or.xtb
index c84ae6bc905..404c16e11c8 100644
--- a/chromium/ui/strings/translations/ui_strings_or.xtb
+++ b/chromium/ui/strings/translations/ui_strings_or.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">କହିବା ଆରମ୍ଭ କରନ୍ତୁ</translation>
<translation id="4289540628985791613">ଅବଲୋକନ</translation>
<translation id="4306392492252714209">କ୍ଲିପବୋର୍ଡରୁ କାଢ଼ି ଦିଅନ୍ତୁ।</translation>
+<translation id="4311195029067684288">ସମ୍ପୂର୍ଣ୍ଣ</translation>
<translation id="4491109536499578614">ଛବି</translation>
<translation id="4565377596337484307">ପାସୱାର୍ଡ୍ ଲୁଚାନ୍ତୁ</translation>
<translation id="4588090240171750605">ଦକ୍ଷିଣକୁ ସ୍କ୍ରୋଲ୍ କରନ୍ତୁ</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">ଏକ୍ସଟେନସନକୁ ଅନପିନ କରାଯାଇଛି</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 ମାସ ବାକି ଅଛି}other{# ମାସ ବାକି ଅଛି}}</translation>
<translation id="4888938634149558681">କଲ୍ କରନ୍ତୁ</translation>
+<translation id="4937657825850660613">ଅଧା</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 ସେକେଣ୍ଡ}other{# ସେକେଣ୍ଡ}}</translation>
<translation id="4971687151119236543">ମିଡିଆର ପୂର୍ବବର୍ତ୍ତୀ ଟ୍ରାକ୍</translation>
+<translation id="4971925105143343452">ଆଂଶିକ</translation>
<translation id="5046499563572181734">ଏଠାରେ ଟାପ୍ କରନ୍ତୁ</translation>
<translation id="5076340679995252485">&amp;ଲେପନ</translation>
+<translation id="5123162024343028706">ଉପରେ ଫ୍ଲୋଟ୍ କରନ୍ତୁ</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">ପଠାଇବାରେ ବିଫଳ ହେଲା</translation>
<translation id="528468243742722775">ସମାପ୍ତ କରନ୍ତୁ</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_pa.xtb b/chromium/ui/strings/translations/ui_strings_pa.xtb
index d099d7bba05..971d8e45228 100644
--- a/chromium/ui/strings/translations/ui_strings_pa.xtb
+++ b/chromium/ui/strings/translations/ui_strings_pa.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">ਬੋਲਣਾ ਸ਼ੁਰੂ ਕਰੋ</translation>
<translation id="4289540628985791613">ਓਵਰਵਿਊ</translation>
<translation id="4306392492252714209">ਕਲਿੱਪਬੋਰਡ ਵਿੱਚੋਂ ਹਟਾਓ।</translation>
+<translation id="4311195029067684288">ਪੂਰੀ ਸਕ੍ਰੀਨ</translation>
<translation id="4491109536499578614">ਚਿੱਤਰ</translation>
<translation id="4565377596337484307">ਪਾਸਵਰਡ ਲੁਕਾਓ</translation>
<translation id="4588090240171750605">ਸੱਜੇ ਪਾਸੇ ਸਕ੍ਰੌਲ ਕਰੋ</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">ਐਕਸਟੈਂਸ਼ਨ ਨੂੰ ਅਣਪਿੰਨ ਕੀਤਾ ਗਿਆ</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 ਮਹੀਨਾ ਬਾਕੀ}one{# ਮਹੀਨਾ ਬਾਕੀ}other{# ਮਹੀਨੇ ਬਾਕੀ}}</translation>
<translation id="4888938634149558681">ਕਾਲ ਕਰੋ</translation>
+<translation id="4937657825850660613">ਸਕ੍ਰੀਨ ਨੂੰ ਅੱਧੇ ਹਿੱਸੇ ਵਿੱਚ ਵੰਡੋ</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 ਸਕਿੰਟ}one{# ਸਕਿੰਟ }other{# ਸਕਿੰਟ }}</translation>
<translation id="4971687151119236543">ਮੀਡੀਆ ਪਿਛਲਾ ਟਰੈਕ</translation>
+<translation id="4971925105143343452">ਅੰਸ਼ਕ ਸਕ੍ਰੀਨ</translation>
<translation id="5046499563572181734">ਇੱਥੇ ਟੈਪ ਕਰੋ</translation>
<translation id="5076340679995252485">&amp;ਪੇਸਟ ਕਰੋ</translation>
+<translation id="5123162024343028706">ਸਿਖਰ 'ਤੇ ਲਿਜਾਓ</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">ਭੇਜਣਾ ਅਸਫਲ ਰਿਹਾ</translation>
<translation id="528468243742722775">ਸਮਾਪਤੀ</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_pl.xtb b/chromium/ui/strings/translations/ui_strings_pl.xtb
index 88b9c737b3b..1c3edf3914c 100644
--- a/chromium/ui/strings/translations/ui_strings_pl.xtb
+++ b/chromium/ui/strings/translations/ui_strings_pl.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Zacznij mówić</translation>
<translation id="4289540628985791613">Przegląd</translation>
<translation id="4306392492252714209">Usuń ze schowka.</translation>
+<translation id="4311195029067684288">Pełne</translation>
<translation id="4491109536499578614">Obraz</translation>
<translation id="4565377596337484307">Ukryj hasło</translation>
<translation id="4588090240171750605">Przewiń w prawo</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Rozszerzenie zostało odpięte</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Pozostał miesiąc}few{Pozostały # miesiące}many{Pozostało # miesięcy}other{Pozostało # miesiąca}}</translation>
<translation id="4888938634149558681">Zadzwoń</translation>
+<translation id="4937657825850660613">Połowa</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunda}few{# sekundy}many{# sekund}other{# sekundy}}</translation>
<translation id="4971687151119236543">Poprzedni utwór multimedialny</translation>
+<translation id="4971925105143343452">Częściowe</translation>
<translation id="5046499563572181734">Kliknij tutaj</translation>
<translation id="5076340679995252485">&amp;Wklej</translation>
+<translation id="5123162024343028706">Pokaż na wierzchu</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Nie udało się wysłać</translation>
<translation id="528468243742722775">Zakończ</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_pt-BR.xtb b/chromium/ui/strings/translations/ui_strings_pt-BR.xtb
index b69aed2cef8..4194d096851 100644
--- a/chromium/ui/strings/translations/ui_strings_pt-BR.xtb
+++ b/chromium/ui/strings/translations/ui_strings_pt-BR.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Comece a falar</translation>
<translation id="4289540628985791613">Visão geral</translation>
<translation id="4306392492252714209">Remover da área de transferência.</translation>
+<translation id="4311195029067684288">Inteira</translation>
<translation id="4491109536499578614">Imagem</translation>
<translation id="4565377596337484307">Ocultar senha</translation>
<translation id="4588090240171750605">Percorrer à direita</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">A extensão foi liberada</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 mês restante}one{# mês restante}other{# meses restantes}}</translation>
<translation id="4888938634149558681">Ligar</translation>
+<translation id="4937657825850660613">Metade</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{Um segundo}one{# segundos}other{# segundos}}</translation>
<translation id="4971687151119236543">Faixa anterior da mídia</translation>
+<translation id="4971925105143343452">Parcial</translation>
<translation id="5046499563572181734">Toque aqui</translation>
<translation id="5076340679995252485">&amp;Colar</translation>
+<translation id="5123162024343028706">Exibir por cima</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Falha ao enviar</translation>
<translation id="528468243742722775">Fim</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_pt-PT.xtb b/chromium/ui/strings/translations/ui_strings_pt-PT.xtb
index e9bd832f6cc..0aca7003913 100644
--- a/chromium/ui/strings/translations/ui_strings_pt-PT.xtb
+++ b/chromium/ui/strings/translations/ui_strings_pt-PT.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Comece a Falar</translation>
<translation id="4289540628985791613">Vista geral</translation>
<translation id="4306392492252714209">Remover da área de transferência</translation>
+<translation id="4311195029067684288">Completo</translation>
<translation id="4491109536499578614">Imagem</translation>
<translation id="4565377596337484307">Ocultar palavra-passe</translation>
<translation id="4588090240171750605">Deslocar-se para a direita</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Extensão desafixada</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Falta 1 mês}other{Faltam # meses}}</translation>
<translation id="4888938634149558681">Efetuar chamada</translation>
+<translation id="4937657825850660613">Metade</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 segundo}other{# segundos}}</translation>
<translation id="4971687151119236543">Faixa anterior de multimédia</translation>
+<translation id="4971925105143343452">Parcial</translation>
<translation id="5046499563572181734">Toque aqui</translation>
<translation id="5076340679995252485">C&amp;olar</translation>
+<translation id="5123162024343028706">Apresentar em cima</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Falha ao enviar</translation>
<translation id="528468243742722775">Sair</translation>
@@ -148,7 +152,7 @@
<translation id="6430678249303439055">Bloquear todas as notificações desta aplicação</translation>
<translation id="6483402905448010557">{SECONDS,plural, =1{Há 1 segundo}other{Há # segundos}}</translation>
<translation id="6503257047630241175">Conteúdo RTF</translation>
-<translation id="6539092367496845964">Ocorreu um erro. Tente novamente mais tarde.</translation>
+<translation id="6539092367496845964">Ocorreu um erro. Tente mais tarde.</translation>
<translation id="654149438358937226">Bloquear todas as notificações</translation>
<translation id="6612467943526193239">Para sair da calibração, prima Esc.</translation>
<translation id="6620110761915583480">Guardar ficheiro</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ro.xtb b/chromium/ui/strings/translations/ui_strings_ro.xtb
index a1a8a9a546f..83ae0385f71 100644
--- a/chromium/ui/strings/translations/ui_strings_ro.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ro.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Începeți să vorbiți</translation>
<translation id="4289540628985791613">Prezentare generală</translation>
<translation id="4306392492252714209">Elimină din clipboard.</translation>
+<translation id="4311195029067684288">Maxim</translation>
<translation id="4491109536499578614">Imagine</translation>
<translation id="4565377596337484307">Ascunde parola</translation>
<translation id="4588090240171750605">Derulează spre dreapta</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Fixarea extensiei a fost anulată</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 lună rămasă}few{# luni rămase}other{# de luni rămase}}</translation>
<translation id="4888938634149558681">Apelează</translation>
+<translation id="4937657825850660613">Jumătate</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{o secundă}few{# secunde}other{# de secunde}}</translation>
<translation id="4971687151119236543">Melodia anterioară din conținutul media</translation>
+<translation id="4971925105143343452">Parțial</translation>
<translation id="5046499563572181734">Atinge aici</translation>
<translation id="5076340679995252485">&amp;Inserează</translation>
+<translation id="5123162024343028706">Fixează deasupra</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Nu s-a trimis</translation>
<translation id="528468243742722775">Oprește</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ru.xtb b/chromium/ui/strings/translations/ui_strings_ru.xtb
index b8784312064..0c47e211ea9 100644
--- a/chromium/ui/strings/translations/ui_strings_ru.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ru.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Начать голосовой ввод</translation>
<translation id="4289540628985791613">Обзор</translation>
<translation id="4306392492252714209">Удалить из буфера обмена.</translation>
+<translation id="4311195029067684288">Максимальное увеличение</translation>
<translation id="4491109536499578614">Изображение</translation>
<translation id="4565377596337484307">Скрыть пароль</translation>
<translation id="4588090240171750605">Прокрутка вправо</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Расширение откреплено</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{остался 1 месяц}one{остался # месяц}few{осталось # месяца}many{осталось # месяцев}other{осталось # месяца}}</translation>
<translation id="4888938634149558681">Позвонить</translation>
+<translation id="4937657825850660613">Разделить экран</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 секунда}one{# секунда}few{# секунды}many{# секунд}other{# секунды}}</translation>
<translation id="4971687151119236543">Предыдущий трек</translation>
+<translation id="4971925105143343452">Частичное увеличение</translation>
<translation id="5046499563572181734">Нажмите здесь</translation>
<translation id="5076340679995252485">&amp;Вставить</translation>
+<translation id="5123162024343028706">На первом плане</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> ПБ</translation>
<translation id="5278860589123563674">Не удалось поделиться вкладкой</translation>
<translation id="528468243742722775">Завершить</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_si.xtb b/chromium/ui/strings/translations/ui_strings_si.xtb
index 76f9ca34c86..e97497a991d 100644
--- a/chromium/ui/strings/translations/ui_strings_si.xtb
+++ b/chromium/ui/strings/translations/ui_strings_si.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">කතා කිරීම අරඹන්න</translation>
<translation id="4289540628985791613">දළ විශ්ලේෂණය</translation>
<translation id="4306392492252714209">පසුරු පුවරුවෙන් ඉවත් කරන්න.</translation>
+<translation id="4311195029067684288">පූර්ණ</translation>
<translation id="4491109536499578614">රූපය</translation>
<translation id="4565377596337484307">මුරපදය සඟවන්න</translation>
<translation id="4588090240171750605">දකුණට අනුචලනය කරන්න</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">දිගුව ඇමිණීම ඉවත් කරන ලදි</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{මාස 1ක් ඉතිරියි}one{මාස #ක් ඉතිරියි}other{මාස #ක් ඉතිරියි}}</translation>
<translation id="4888938634149558681">ඇමතුම් කරන්න</translation>
+<translation id="4937657825850660613">භාගය</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{තත්පර 1}one{තත්පර #}other{තත්පර #}}</translation>
<translation id="4971687151119236543">මාධ්‍ය පෙර ගීතය</translation>
+<translation id="4971925105143343452">අර්ධ</translation>
<translation id="5046499563572181734">මෙහි තට්ටු කරන්න</translation>
<translation id="5076340679995252485">&amp;අලවන්න</translation>
+<translation id="5123162024343028706">මතුපිට පාවීම</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">යැවීම අසාර්ථකයි</translation>
<translation id="528468243742722775">අවසන් කරන්න</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sk.xtb b/chromium/ui/strings/translations/ui_strings_sk.xtb
index 956bf0d7933..9ea6b7f1eb4 100644
--- a/chromium/ui/strings/translations/ui_strings_sk.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sk.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Začať hovoriť</translation>
<translation id="4289540628985791613">Prehľad</translation>
<translation id="4306392492252714209">Odstrániť zo schránky</translation>
+<translation id="4311195029067684288">Úplné</translation>
<translation id="4491109536499578614">Obrázok</translation>
<translation id="4565377596337484307">Skryť heslo</translation>
<translation id="4588090240171750605">Rolovať doprava</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Rozšírenie bolo odopnuté</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{zostáva 1 mesiac}few{zostávajú # mesiace}many{zostáva # mesiaca}other{zostáva # mesiacov}}</translation>
<translation id="4888938634149558681">Volať</translation>
+<translation id="4937657825850660613">Polovica</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunda}few{# sekundy}many{# sekundy}other{# sekúnd}}</translation>
<translation id="4971687151119236543">Média – predchádzajúca stopa</translation>
+<translation id="4971925105143343452">Čiastočné</translation>
<translation id="5046499563572181734">Klepnite tu</translation>
<translation id="5076340679995252485">&amp;Prilepiť</translation>
+<translation id="5123162024343028706">Plávať navrchu</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Nepodarilo sa odoslať</translation>
<translation id="528468243742722775">Koniec</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sl.xtb b/chromium/ui/strings/translations/ui_strings_sl.xtb
index 293a4b5fa6f..edd17b4e356 100644
--- a/chromium/ui/strings/translations/ui_strings_sl.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sl.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Start Speaking</translation>
<translation id="4289540628985791613">Pregled</translation>
<translation id="4306392492252714209">Odstrani iz odložišča.</translation>
+<translation id="4311195029067684288">V celoti</translation>
<translation id="4491109536499578614">Slika</translation>
<translation id="4565377596337484307">Skrij geslo</translation>
<translation id="4588090240171750605">Pomik desno</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Razširitev je odpeta</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Še 1 mesec}one{Še # mesec}two{Še # meseca}few{Še # mesece}other{Še # mesecev}}</translation>
<translation id="4888938634149558681">Pokliči</translation>
+<translation id="4937657825850660613">Polovično</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 s}one{# s}two{# s}few{# s}other{# s}}</translation>
<translation id="4971687151119236543">Prejšnja skladba</translation>
+<translation id="4971925105143343452">Delno</translation>
<translation id="5046499563572181734">Dotaknite se tukaj</translation>
<translation id="5076340679995252485">&amp;Prilepi</translation>
+<translation id="5123162024343028706">Plavanje na vrhu</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Pošiljanje ni uspelo</translation>
<translation id="528468243742722775">Konec</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sq.xtb b/chromium/ui/strings/translations/ui_strings_sq.xtb
index b22159209eb..8c027a32961 100644
--- a/chromium/ui/strings/translations/ui_strings_sq.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sq.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Fillo të flasësh</translation>
<translation id="4289540628985791613">Përmbledhje</translation>
<translation id="4306392492252714209">Hiqe nga kujtesa e fragmenteve.</translation>
+<translation id="4311195029067684288">I plotë</translation>
<translation id="4491109536499578614">Imazh</translation>
<translation id="4565377596337484307">Fshih fjalëkalimin</translation>
<translation id="4588090240171750605">Lëvize djathtas</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Shtesa u zhgozhdua</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 muaj i mbetur}other{# muaj të mbetur}}</translation>
<translation id="4888938634149558681">Bëj një telefonatë</translation>
+<translation id="4937657825850660613">Gjysmë</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 sekondë}other{# sekonda}}</translation>
<translation id="4971687151119236543">Gjurma e mëparshme e medias</translation>
+<translation id="4971925105143343452">I pjesshëm</translation>
<translation id="5046499563572181734">Trokit këtu</translation>
<translation id="5076340679995252485">&amp;Ngjit</translation>
+<translation id="5123162024343028706">Plusko në krye</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Dërgimi dështoi</translation>
<translation id="528468243742722775">Fundi</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sr-Latn.xtb b/chromium/ui/strings/translations/ui_strings_sr-Latn.xtb
index b0392828ba9..6e941bccebc 100644
--- a/chromium/ui/strings/translations/ui_strings_sr-Latn.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sr-Latn.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Počnite da govorite</translation>
<translation id="4289540628985791613">Pregled</translation>
<translation id="4306392492252714209">Uklonite iz privremene memorije.</translation>
+<translation id="4311195029067684288">Potpuno</translation>
<translation id="4491109536499578614">Slika</translation>
<translation id="4565377596337484307">Sakrij lozinku</translation>
<translation id="4588090240171750605">Pomeri nadesno</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Dodatak je otkačen</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Još 1 mesec}one{Još # mesec}few{Još # meseca}other{Još # meseci}}</translation>
<translation id="4888938634149558681">Pozovi</translation>
+<translation id="4937657825850660613">Polovina</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunda}one{# sekunda}few{# sekunde}other{# sekundi}}</translation>
<translation id="4971687151119236543">Prethodna pesma medija</translation>
+<translation id="4971925105143343452">Delimično</translation>
<translation id="5046499563572181734">Dodirnite ovde</translation>
<translation id="5076340679995252485">&amp;Nalepi</translation>
+<translation id="5123162024343028706">Uvek na vrhu</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Slanje nije uspelo</translation>
<translation id="528468243742722775">Završi</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sr.xtb b/chromium/ui/strings/translations/ui_strings_sr.xtb
index 747f5e6cac5..7828d6c946e 100644
--- a/chromium/ui/strings/translations/ui_strings_sr.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sr.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Почните да говорите</translation>
<translation id="4289540628985791613">Преглед</translation>
<translation id="4306392492252714209">Уклоните из привремене меморије.</translation>
+<translation id="4311195029067684288">Потпуно</translation>
<translation id="4491109536499578614">Слика</translation>
<translation id="4565377596337484307">Сакриј лозинку</translation>
<translation id="4588090240171750605">Помери надесно</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Додатак је откачен</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Још 1 месец}one{Још # месец}few{Још # месеца}other{Још # месеци}}</translation>
<translation id="4888938634149558681">Позови</translation>
+<translation id="4937657825850660613">Половина</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 секунда}one{# секунда}few{# секунде}other{# секунди}}</translation>
<translation id="4971687151119236543">Претходна песма медија</translation>
+<translation id="4971925105143343452">Делимично</translation>
<translation id="5046499563572181734">Додирните овде</translation>
<translation id="5076340679995252485">&amp;Налепи</translation>
+<translation id="5123162024343028706">Увек на врху</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Слање није успело</translation>
<translation id="528468243742722775">Заврши</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sv.xtb b/chromium/ui/strings/translations/ui_strings_sv.xtb
index aaa0c2dbc84..7d6828219c6 100644
--- a/chromium/ui/strings/translations/ui_strings_sv.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sv.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Börja tala</translation>
<translation id="4289540628985791613">Översikt</translation>
<translation id="4306392492252714209">Ta bort från urklipp.</translation>
+<translation id="4311195029067684288">Fullt</translation>
<translation id="4491109536499578614">Bild</translation>
<translation id="4565377596337484307">Dölj lösenord</translation>
<translation id="4588090240171750605">Scrolla åt höger</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Tillägget har lossats</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 månad kvar}other{# månader kvar}}</translation>
<translation id="4888938634149558681">Ring</translation>
+<translation id="4937657825850660613">Halvskärm</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 sekund}other{# sekunder}}</translation>
<translation id="4971687151119236543">Föregående spår</translation>
+<translation id="4971925105143343452">Delvis</translation>
<translation id="5046499563572181734">Tryck här</translation>
<translation id="5076340679995252485">K&amp;listra in</translation>
+<translation id="5123162024343028706">Visa ovanpå</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Det gick inte att skicka</translation>
<translation id="528468243742722775">Avsluta</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sw.xtb b/chromium/ui/strings/translations/ui_strings_sw.xtb
index c929b5552d9..a4b1fe4ee74 100644
--- a/chromium/ui/strings/translations/ui_strings_sw.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sw.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Anza Kuzungumza</translation>
<translation id="4289540628985791613">Muhtasari</translation>
<translation id="4306392492252714209">Ondoa kwenye ubao wa kunakili.</translation>
+<translation id="4311195029067684288">Imejaa</translation>
<translation id="4491109536499578614">Picha</translation>
<translation id="4565377596337484307">Ficha nenosiri</translation>
<translation id="4588090240171750605">Sogeza Kulia</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Kiendelezi kimebanduliwa</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Umesalia mwezi 1}other{Imesalia miezi #}}</translation>
<translation id="4888938634149558681">Piga simu</translation>
+<translation id="4937657825850660613">Nusu</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{Sekunde 1}other{Sekunde #}}</translation>
<translation id="4971687151119236543">Wimbo wa Awali wa Media</translation>
+<translation id="4971925105143343452">Kiasi</translation>
<translation id="5046499563572181734">Gusa hapa</translation>
<translation id="5076340679995252485">&amp;Bandika</translation>
+<translation id="5123162024343028706">Elea juu</translation>
<translation id="520299402983819650">PB <ph name="QUANTITY" /></translation>
<translation id="5278860589123563674">Imeshindwa kutuma</translation>
<translation id="528468243742722775">Mwisho</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ta.xtb b/chromium/ui/strings/translations/ui_strings_ta.xtb
index 5a9d853fce6..739c947be21 100644
--- a/chromium/ui/strings/translations/ui_strings_ta.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ta.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">பேச்சைத் தொடங்கு</translation>
<translation id="4289540628985791613">மேலோட்டம்</translation>
<translation id="4306392492252714209">கிளிப்போர்டிலிருந்து அகற்றும்.</translation>
+<translation id="4311195029067684288">முழு</translation>
<translation id="4491109536499578614">படம்</translation>
<translation id="4565377596337484307">கடவுச்சொல்லை மறைக்கும்</translation>
<translation id="4588090240171750605">வலப்புறம் நகர்த்து</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">நீட்டிப்பு அகற்றப்பட்டது</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 மாதம் உள்ளது}other{# மாதங்கள் உள்ளன}}</translation>
<translation id="4888938634149558681">அழை</translation>
+<translation id="4937657825850660613">அரைப்பகுதி</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 நொடி}other{# நொடிகள்}}</translation>
<translation id="4971687151119236543">ஊடகத்தின் முந்தைய டிராக்</translation>
+<translation id="4971925105143343452">பகுதி சார்ந்த</translation>
<translation id="5046499563572181734">இங்கே தட்டவும்</translation>
<translation id="5076340679995252485">&amp;ஒட்டு</translation>
+<translation id="5123162024343028706">மேலே பின் செய்</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> பெ.பை</translation>
<translation id="5278860589123563674">அனுப்ப முடியவில்லை</translation>
<translation id="528468243742722775">நிறுத்து</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_te.xtb b/chromium/ui/strings/translations/ui_strings_te.xtb
index 5258c27b14a..4aabebe1562 100644
--- a/chromium/ui/strings/translations/ui_strings_te.xtb
+++ b/chromium/ui/strings/translations/ui_strings_te.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">మాట్లాడటాన్ని ప్రారంభించు</translation>
<translation id="4289540628985791613">స్థూలదృష్టి</translation>
<translation id="4306392492252714209">క్లిప్‌బోర్డ్ నుండి తీసివేయండి.</translation>
+<translation id="4311195029067684288">సంపూర్ణం</translation>
<translation id="4491109536499578614">చిత్రం</translation>
<translation id="4565377596337484307">పాస్‌వర్డ్‌ను దాచిపెట్టు</translation>
<translation id="4588090240171750605">కుడికి స్క్రోల్ చేయి</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">ఎక్స్‌టెన్షన్ అన్‌పిన్ చేయబడింది</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 నెల మిగిలి ఉంది}other{# నెలలు మిగిలి ఉన్నాయి}}</translation>
<translation id="4888938634149558681">కాల్ చేయి</translation>
+<translation id="4937657825850660613">సగం</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 సెకను}other{# సెకన్లు}}</translation>
<translation id="4971687151119236543">మీడియా మునుపటి ట్రాక్</translation>
+<translation id="4971925105143343452">పాక్షికం</translation>
<translation id="5046499563572181734">ఇక్కడ నొక్కండి</translation>
<translation id="5076340679995252485">&amp;అతికించు</translation>
+<translation id="5123162024343028706">పైన తేలియాడేలా ఉంచు</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">పంపడం విఫలమైంది</translation>
<translation id="528468243742722775">ముగించు</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_th.xtb b/chromium/ui/strings/translations/ui_strings_th.xtb
index ff79760a317..256c6195f2e 100644
--- a/chromium/ui/strings/translations/ui_strings_th.xtb
+++ b/chromium/ui/strings/translations/ui_strings_th.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">เริ่มพูด</translation>
<translation id="4289540628985791613">ภาพรวม</translation>
<translation id="4306392492252714209">นำออกจากคลิปบอร์ด</translation>
+<translation id="4311195029067684288">เต็ม</translation>
<translation id="4491109536499578614">รูปภาพ</translation>
<translation id="4565377596337484307">ซ่อนรหัสผ่าน</translation>
<translation id="4588090240171750605">เลื่อนทางขวา</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">เลิกปักหมุดส่วนขยายแล้ว</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{เหลือ 1 เดือน}other{เหลือ # เดือน}}</translation>
<translation id="4888938634149558681">โทรออก</translation>
+<translation id="4937657825850660613">ครึ่งหนึ่ง</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 วินาที}other{# วินาที}}</translation>
<translation id="4971687151119236543">แทร็กก่อนหน้าของสื่อ</translation>
+<translation id="4971925105143343452">บางส่วน</translation>
<translation id="5046499563572181734">แตะที่นี่</translation>
<translation id="5076340679995252485">&amp;วาง</translation>
+<translation id="5123162024343028706">ลอยอยู่ด้านบน</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">ส่งไม่สำเร็จ</translation>
<translation id="528468243742722775">สิ้นสุด</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_tr.xtb b/chromium/ui/strings/translations/ui_strings_tr.xtb
index f3472870833..01d60b4fd7e 100644
--- a/chromium/ui/strings/translations/ui_strings_tr.xtb
+++ b/chromium/ui/strings/translations/ui_strings_tr.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Konuşmaya Başla</translation>
<translation id="4289540628985791613">Genel bakış</translation>
<translation id="4306392492252714209">Panodan kaldır.</translation>
+<translation id="4311195029067684288">Tam</translation>
<translation id="4491109536499578614">Resim</translation>
<translation id="4565377596337484307">Şifreyi gizle</translation>
<translation id="4588090240171750605">Sağa Kaydır</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Uzantının sabitlemesi kaldırıldı</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 ay kaldı}other{# ay kaldı}}</translation>
<translation id="4888938634149558681">Telefon et</translation>
+<translation id="4937657825850660613">Yarı</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 saniye}other{# saniye}}</translation>
<translation id="4971687151119236543">Medya Önceki Parça</translation>
+<translation id="4971925105143343452">Kısmi</translation>
<translation id="5046499563572181734">Buraya dokunun</translation>
<translation id="5076340679995252485">&amp;Yapıştır</translation>
+<translation id="5123162024343028706">Üstte kayan</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Gönderilemedi</translation>
<translation id="528468243742722775">Son</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_uk.xtb b/chromium/ui/strings/translations/ui_strings_uk.xtb
index cc787db76f7..689e6c84f1d 100644
--- a/chromium/ui/strings/translations/ui_strings_uk.xtb
+++ b/chromium/ui/strings/translations/ui_strings_uk.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Start Speaking</translation>
<translation id="4289540628985791613">Огляд</translation>
<translation id="4306392492252714209">Видалити з буфера обміну.</translation>
+<translation id="4311195029067684288">Повністю</translation>
<translation id="4491109536499578614">Зображення</translation>
<translation id="4565377596337484307">Сховати пароль</translation>
<translation id="4588090240171750605">Прокрутка вправо</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Розширення відкріплено</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Залишився 1 місяць}one{Залишився # місяць}few{Залишилося # місяці}many{Залишилося # місяців}other{Залишилося # місяця}}</translation>
<translation id="4888938634149558681">Зателефонувати</translation>
+<translation id="4937657825850660613">Половина</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 секунда}one{# секунда}few{# секунди}many{# секунд}other{# секунди}}</translation>
<translation id="4971687151119236543">Попередня композиція</translation>
+<translation id="4971925105143343452">Частково</translation>
<translation id="5046499563572181734">Торкніться тут</translation>
<translation id="5076340679995252485">&amp;Вставити</translation>
+<translation id="5123162024343028706">Перемістити вгору</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> Пб</translation>
<translation id="5278860589123563674">Не вдалося надіслати</translation>
<translation id="528468243742722775">Завершити</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ur.xtb b/chromium/ui/strings/translations/ui_strings_ur.xtb
index 4ccdf0e547b..948fca8cca2 100644
--- a/chromium/ui/strings/translations/ui_strings_ur.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ur.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">بولنا شروع کریں</translation>
<translation id="4289540628985791613">عمومی جائزہ</translation>
<translation id="4306392492252714209">کلپ بورڈ سے ہٹائیں۔</translation>
+<translation id="4311195029067684288">مکمل</translation>
<translation id="4491109536499578614">تصویر</translation>
<translation id="4565377596337484307">پاس ورڈ چھپائیں</translation>
<translation id="4588090240171750605">دائیں سکرول کریں</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">ایکسٹینشن کا پن ہٹایا گیا</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 مہینہ باقی}other{# مہینے باقی}}</translation>
<translation id="4888938634149558681">کال کریں</translation>
+<translation id="4937657825850660613">ہاف</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 سیکنڈ}other{# سیکنڈ}}</translation>
<translation id="4971687151119236543">میڈیا پچھلا ٹریک</translation>
+<translation id="4971925105143343452">جزوی</translation>
<translation id="5046499563572181734">یہاں تھپتھپائیں</translation>
<translation id="5076340679995252485">&amp;پیسٹ کریں</translation>
+<translation id="5123162024343028706">اوپر دکھائيں</translation>
<translation id="520299402983819650">‎<ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">بھیجنا ناکام ہو گیا</translation>
<translation id="528468243742722775">اختتام</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_uz.xtb b/chromium/ui/strings/translations/ui_strings_uz.xtb
index 27bce4059b3..48d2e782422 100644
--- a/chromium/ui/strings/translations/ui_strings_uz.xtb
+++ b/chromium/ui/strings/translations/ui_strings_uz.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Gapirishni boshlang</translation>
<translation id="4289540628985791613">Umumiy</translation>
<translation id="4306392492252714209">Vaqtincha xotiradan olib tashlash</translation>
+<translation id="4311195029067684288">Toʻliq</translation>
<translation id="4491109536499578614">Tasvir</translation>
<translation id="4565377596337484307">Parolni berkitish</translation>
<translation id="4588090240171750605">O‘ngga aylantirish</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Kengaytma olib tashlandi</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 oy qoldi}other{# oy qoldi}}</translation>
<translation id="4888938634149558681">Telefon qilish</translation>
+<translation id="4937657825850660613">Yarim</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 soniya}other{# soniya}}</translation>
<translation id="4971687151119236543">Avvalgi trek</translation>
+<translation id="4971925105143343452">Qisman</translation>
<translation id="5046499563572181734">Bu yerga bosing</translation>
<translation id="5076340679995252485">&amp;Qo‘shib qo‘yish</translation>
+<translation id="5123162024343028706">Ustida erkin harakatlanuvchi</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Yuborilmadi</translation>
<translation id="528468243742722775">Tugatish</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_vi.xtb b/chromium/ui/strings/translations/ui_strings_vi.xtb
index 1ca6686991f..133b8d04b92 100644
--- a/chromium/ui/strings/translations/ui_strings_vi.xtb
+++ b/chromium/ui/strings/translations/ui_strings_vi.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Bắt đầu nói</translation>
<translation id="4289540628985791613">Tổng quan</translation>
<translation id="4306392492252714209">Xóa khỏi bảng nhớ tạm.</translation>
+<translation id="4311195029067684288">Toàn màn hình</translation>
<translation id="4491109536499578614">Hình ảnh</translation>
<translation id="4565377596337484307">Ẩn mật khẩu</translation>
<translation id="4588090240171750605">Cuộn qua Phải</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Đã bỏ ghim tiện ích</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{Còn 1 tháng}other{Còn # tháng}}</translation>
<translation id="4888938634149558681">Gọi điện</translation>
+<translation id="4937657825850660613">Chia nửa</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 giây}other{# giây}}</translation>
<translation id="4971687151119236543">Bản nhạc trước của trình phát phương tiện</translation>
+<translation id="4971925105143343452">Một phần</translation>
<translation id="5046499563572181734">Nhấn vào đây</translation>
<translation id="5076340679995252485">&amp;Dán</translation>
+<translation id="5123162024343028706">Ghim ở trên cùng</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Không gửi được</translation>
<translation id="528468243742722775">Kết thúc</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_zh-CN.xtb b/chromium/ui/strings/translations/ui_strings_zh-CN.xtb
index 5b751382e4a..11a164e0018 100644
--- a/chromium/ui/strings/translations/ui_strings_zh-CN.xtb
+++ b/chromium/ui/strings/translations/ui_strings_zh-CN.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">开始讲话</translation>
<translation id="4289540628985791613">概述</translation>
<translation id="4306392492252714209">从剪贴板中移除。</translation>
+<translation id="4311195029067684288">全屏</translation>
<translation id="4491109536499578614">图片</translation>
<translation id="4565377596337484307">隐藏密码</translation>
<translation id="4588090240171750605">向右滚动</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">已取消固定该扩展程序</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{还有 1 个月的时间}other{还有 # 个月的时间}}</translation>
<translation id="4888938634149558681">致电</translation>
+<translation id="4937657825850660613">分成两半</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 秒}other{# 秒}}</translation>
<translation id="4971687151119236543">媒体上一曲</translation>
+<translation id="4971925105143343452">局部</translation>
<translation id="5046499563572181734">点按此处</translation>
<translation id="5076340679995252485">粘贴(&amp;P)</translation>
+<translation id="5123162024343028706">固定在顶部</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">发送失败</translation>
<translation id="528468243742722775">结束</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_zh-HK.xtb b/chromium/ui/strings/translations/ui_strings_zh-HK.xtb
index 605f70ba648..8e0a9600de9 100644
--- a/chromium/ui/strings/translations/ui_strings_zh-HK.xtb
+++ b/chromium/ui/strings/translations/ui_strings_zh-HK.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">開始說</translation>
<translation id="4289540628985791613">概覽</translation>
<translation id="4306392492252714209">喺剪貼簿度移除。</translation>
+<translation id="4311195029067684288">完整</translation>
<translation id="4491109536499578614">圖片</translation>
<translation id="4565377596337484307">隱藏密碼</translation>
<translation id="4588090240171750605">向右捲動</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">已取消固定擴充程式</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{尚餘 1 個月}other{尚餘 # 個月}}</translation>
<translation id="4888938634149558681">撥打電話</translation>
+<translation id="4937657825850660613">半邊</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 秒}other{# 秒}}</translation>
<translation id="4971687151119236543">上一首媒體曲目</translation>
+<translation id="4971925105143343452">局部</translation>
<translation id="5046499563572181734">輕按此處</translation>
<translation id="5076340679995252485">貼上(&amp;P)</translation>
+<translation id="5123162024343028706">固定在上方</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">無法傳送</translation>
<translation id="528468243742722775">結束</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_zh-TW.xtb b/chromium/ui/strings/translations/ui_strings_zh-TW.xtb
index 1a44c200f6b..4071b9c5e72 100644
--- a/chromium/ui/strings/translations/ui_strings_zh-TW.xtb
+++ b/chromium/ui/strings/translations/ui_strings_zh-TW.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Start Speaking</translation>
<translation id="4289540628985791613">總覽</translation>
<translation id="4306392492252714209">從剪貼簿中移除。</translation>
+<translation id="4311195029067684288">完整</translation>
<translation id="4491109536499578614">圖片</translation>
<translation id="4565377596337484307">隱藏密碼</translation>
<translation id="4588090240171750605">向右捲動</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">已取消固定擴充功能</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{還剩 1 個月}other{還剩 # 個月}}</translation>
<translation id="4888938634149558681">撥打電話</translation>
+<translation id="4937657825850660613">半邊</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 秒}other{# 秒}}</translation>
<translation id="4971687151119236543">上一首媒體曲目</translation>
+<translation id="4971925105143343452">局部</translation>
<translation id="5046499563572181734">輕觸這裡</translation>
<translation id="5076340679995252485">貼上(&amp;P)</translation>
+<translation id="5123162024343028706">懸停在上方</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">無法傳送</translation>
<translation id="528468243742722775">結束</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_zu.xtb b/chromium/ui/strings/translations/ui_strings_zu.xtb
index ce7e208dafc..ac60699b1ea 100644
--- a/chromium/ui/strings/translations/ui_strings_zu.xtb
+++ b/chromium/ui/strings/translations/ui_strings_zu.xtb
@@ -103,6 +103,7 @@
<translation id="4289300219472526559">Qala ukukhuluma</translation>
<translation id="4289540628985791613">Ukubuka konke</translation>
<translation id="4306392492252714209">Yisuse kwibhodi yokunamathisela.</translation>
+<translation id="4311195029067684288">Igcwele</translation>
<translation id="4491109536499578614">Isithombe</translation>
<translation id="4565377596337484307">Fihla iphasiwedi</translation>
<translation id="4588090240171750605">Skrolela ngakwesokudla</translation>
@@ -110,10 +111,13 @@
<translation id="4746179598275229723">Isandiso sisuswe ukuphina</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 inyanga esele}one{# izinyanga ezisele}other{# izinyanga ezisele}}</translation>
<translation id="4888938634149558681">Yenza ikholi</translation>
+<translation id="4937657825850660613">Uhafu</translation>
<translation id="4968171027979920686">{SECONDS,plural, =1{1 isekhondi}one{# amasekhondi}other{# amasekhondi}}</translation>
<translation id="4971687151119236543">Ithrekhi yemidiya yangaphambili</translation>
+<translation id="4971925105143343452">Ngokwengxenye</translation>
<translation id="5046499563572181734">ThepTap here</translation>
<translation id="5076340679995252485">Namathisela</translation>
+<translation id="5123162024343028706">Ntanta phezulu</translation>
<translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation>
<translation id="5278860589123563674">Yehlulekile ukuthumela</translation>
<translation id="528468243742722775">Qeda</translation>
diff --git a/chromium/ui/strings/ui_strings.grd b/chromium/ui/strings/ui_strings.grd
index de137212bc2..c13631e2347 100644
--- a/chromium/ui/strings/ui_strings.grd
+++ b/chromium/ui/strings/ui_strings.grd
@@ -525,6 +525,18 @@ need to be translated for each locale.-->
<message name="IDS_APP_ACCNAME_COLOR_CHOOSER_HEX_INPUT" desc="The accessible name for the color chooser hexadecimal input field">
Hex color value
</message>
+ <message name="IDS_APP_ACCNAME_HALF" desc="The accessible name for the Half button on Multitask Menu">
+ Half
+ </message>
+ <message name="IDS_APP_ACCNAME_PARTIAL" desc="The accessible name for the Partial button on the Multitask Menu">
+ Partial
+ </message>
+ <message name="IDS_APP_ACCNAME_FULL" desc="The accessible name for the Full button on the Multitask Menu">
+ Full
+ </message>
+ <message name="IDS_APP_ACCNAME_FLOAT_ON_TOP" desc="The accessible name for the Float on top button on the Multitask Menu">
+ Float on top
+ </message>
<!-- Scroll Bar Context Menu Labels -->
<message name="IDS_APP_SCROLLBAR_CXMENU_SCROLLHERE" desc="The label for the 'Scroll Here' item">
diff --git a/chromium/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_FLOAT_ON_TOP.png.sha1 b/chromium/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_FLOAT_ON_TOP.png.sha1
new file mode 100644
index 00000000000..35595aea496
--- /dev/null
+++ b/chromium/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_FLOAT_ON_TOP.png.sha1
@@ -0,0 +1 @@
+ded49a8d4683847a3caa449f49bc5d6b95d58a50 \ No newline at end of file
diff --git a/chromium/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_FULL.png.sha1 b/chromium/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_FULL.png.sha1
new file mode 100644
index 00000000000..adacea2a29c
--- /dev/null
+++ b/chromium/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_FULL.png.sha1
@@ -0,0 +1 @@
+b3bbad8de6d49c9ccedfc8d9b8558427a4406564 \ No newline at end of file
diff --git a/chromium/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_HALF.png.sha1 b/chromium/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_HALF.png.sha1
new file mode 100644
index 00000000000..2805eb0f06c
--- /dev/null
+++ b/chromium/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_HALF.png.sha1
@@ -0,0 +1 @@
+345896126d653ee01d5edbd9d32dbd0df387f4c0 \ No newline at end of file
diff --git a/chromium/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_PARTIAL.png.sha1 b/chromium/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_PARTIAL.png.sha1
new file mode 100644
index 00000000000..fff1f0fb668
--- /dev/null
+++ b/chromium/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_PARTIAL.png.sha1
@@ -0,0 +1 @@
+64660eb22c59612af7b1762a6149f0d26e9bd350 \ No newline at end of file
diff --git a/chromium/ui/touch_selection/touch_handle.h b/chromium/ui/touch_selection/touch_handle.h
index 159b9bb206e..ef56e1a8476 100644
--- a/chromium/ui/touch_selection/touch_handle.h
+++ b/chromium/ui/touch_selection/touch_handle.h
@@ -142,7 +142,7 @@ class UI_TOUCH_SELECTION_EXPORT TouchHandle : public TouchSelectionDraggable {
std::unique_ptr<TouchHandleDrawable> drawable_;
- const raw_ptr<TouchHandleClient> client_;
+ const raw_ptr<TouchHandleClient, DanglingUntriaged> client_;
gfx::PointF focus_bottom_;
gfx::PointF focus_top_;
diff --git a/chromium/ui/touch_selection/touch_handle_drawable_aura.h b/chromium/ui/touch_selection/touch_handle_drawable_aura.h
index e854d5fa18d..c31ddb03a7b 100644
--- a/chromium/ui/touch_selection/touch_handle_drawable_aura.h
+++ b/chromium/ui/touch_selection/touch_handle_drawable_aura.h
@@ -45,7 +45,7 @@ class UI_TOUCH_SELECTION_EXPORT TouchHandleDrawableAura
gfx::RectF GetVisibleBounds() const override;
float GetDrawableHorizontalPaddingRatio() const override;
- raw_ptr<aura_extra::ImageWindowDelegate> window_delegate_;
+ raw_ptr<aura_extra::ImageWindowDelegate, DanglingUntriaged> window_delegate_;
std::unique_ptr<aura::Window> window_;
bool enabled_;
float alpha_;
diff --git a/chromium/ui/views/BUILD.gn b/chromium/ui/views/BUILD.gn
index 80bdceeb271..cd4828fb462 100644
--- a/chromium/ui/views/BUILD.gn
+++ b/chromium/ui/views/BUILD.gn
@@ -26,6 +26,8 @@ aggregate_vector_icons("views_vector_icons") {
"checkbox_active.icon",
"checkbox_normal.icon",
"close.icon",
+ "drag_general_selection.icon",
+ "drag_image_selection.icon",
"ic_close.icon",
"info.icon",
"launch.icon",
@@ -123,6 +125,7 @@ component("views") {
"controls/button/radio_button.h",
"controls/button/toggle_button.h",
"controls/combobox/combobox.h",
+ "controls/combobox/combobox_menu_model.h",
"controls/combobox/combobox_util.h",
"controls/dot_indicator.h",
"controls/editable_combobox/editable_combobox.h",
@@ -133,6 +136,7 @@ component("views") {
"controls/image_view_base.h",
"controls/label.h",
"controls/link.h",
+ "controls/link_fragment.h",
"controls/menu/menu_config.h",
"controls/menu/menu_controller.h",
"controls/menu/menu_controller_delegate.h",
@@ -348,6 +352,7 @@ component("views") {
"controls/button/radio_button.cc",
"controls/button/toggle_button.cc",
"controls/combobox/combobox.cc",
+ "controls/combobox/combobox_menu_model.cc",
"controls/combobox/combobox_util.cc",
"controls/combobox/empty_combobox_model.cc",
"controls/combobox/empty_combobox_model.h",
@@ -360,6 +365,7 @@ component("views") {
"controls/image_view_base.cc",
"controls/label.cc",
"controls/link.cc",
+ "controls/link_fragment.cc",
"controls/menu/menu_config.cc",
"controls/menu/menu_controller.cc",
"controls/menu/menu_delegate.cc",
@@ -496,7 +502,12 @@ component("views") {
]
sources += get_target_outputs(":views_vector_icons")
- configs += [ "//build/config:precompiled_headers" ]
+
+ configs += [
+ "//build/config:precompiled_headers",
+ "//build/config/compiler:prevent_unsafe_narrowing",
+ ]
+
defines = [ "VIEWS_IMPLEMENTATION" ]
deps = [
@@ -552,39 +563,29 @@ component("views") {
]
if (is_chromeos_ash) {
- public += [ "highlight_border.h" ]
- sources += [ "highlight_border.cc" ]
deps += [
"//ash/constants",
"//ui/base/ime/ash",
]
}
+ if (is_chromeos) {
+ public += [ "highlight_border.h" ]
+ sources += [ "highlight_border.cc" ]
+ deps += [ "//chromeos/constants" ]
+ }
+
+ if (is_linux) {
+ public_deps += [ "//ui/linux:linux_ui" ]
+ }
+
if (is_linux || is_chromeos || is_fuchsia) {
public += [ "color_chooser/color_chooser_view.h" ]
sources += [ "color_chooser/color_chooser_view.cc" ]
}
if (is_linux || is_chromeos_lacros) {
- public_deps += [ "//ui/base/cursor:theme_manager" ]
- deps += [
- "//build:chromecast_buildflags",
- "//ui/base/ime/linux",
- "//ui/shell_dialogs",
- ]
- public += [
- "linux_ui/device_scale_factor_observer.h",
- "linux_ui/linux_ui.h",
- "linux_ui/nav_button_provider.h",
- "linux_ui/status_icon_linux.h",
- "linux_ui/window_button_order_observer.h",
- "linux_ui/window_frame_provider.h",
- ]
- sources += [
- "linux_ui/linux_ui.cc",
- "linux_ui/status_icon_linux.cc",
- ]
-
+ deps += [ "//ui/base/ime/linux" ]
if (!is_chromeos_lacros) {
sources += [ "controls/menu/menu_config_linux.cc" ]
}
@@ -600,6 +601,7 @@ component("views") {
if (is_mac) {
public += [
+ "cocoa/immersive_mode_delegate_mac.h",
"cocoa/native_widget_mac_ns_window_host.h",
"controls/menu/menu_closure_animation_mac.h",
"controls/menu/menu_cocoa_watcher_mac.h",
@@ -797,7 +799,6 @@ component("views") {
"widget/desktop_aura/desktop_screen_position_client.cc",
"widget/desktop_aura/desktop_window_tree_host.cc",
]
- public_deps += [ "//ui/aura/cursor" ]
if (is_win) {
public += [ "widget/desktop_aura/desktop_window_tree_host_win.h" ]
sources += [
@@ -822,7 +823,7 @@ component("views") {
if (is_linux) {
public += [ "widget/desktop_aura/desktop_window_tree_host_linux.h" ]
sources += [
- "widget/desktop_aura/desktop_screen_linux.cc",
+ "widget/desktop_aura/desktop_screen_ozone_linux.cc",
"widget/desktop_aura/desktop_window_tree_host_linux.cc",
"widget/desktop_aura/window_event_filter_linux.cc",
"widget/desktop_aura/window_event_filter_linux.h",
@@ -1104,6 +1105,7 @@ test("views_unittests") {
use_xvfb = use_xvfb_in_this_config
sources = [
+ "accessibility/accessibility_paint_checks_unittest.cc",
"accessible_pane_view_unittest.cc",
"animation/animation_builder_unittest.cc",
"animation/bounds_animator_unittest.cc",
@@ -1141,6 +1143,7 @@ test("views_unittests") {
"controls/editable_combobox/editable_combobox_unittest.cc",
"controls/image_view_unittest.cc",
"controls/label_unittest.cc",
+ "controls/link_fragment_unittest.cc",
"controls/link_unittest.cc",
"controls/menu/menu_controller_unittest.cc",
"controls/menu/menu_item_view_unittest.cc",
@@ -1289,6 +1292,10 @@ test("views_unittests") {
]
}
+ if (is_linux) {
+ deps += [ "//ui/linux:test_support" ]
+ }
+
if (is_linux || is_chromeos_lacros) {
deps += [ "//ui/base/ime/linux" ]
}
@@ -1312,6 +1319,7 @@ test("views_unittests") {
if (is_mac) {
sources += [
+ "accessibility/view_ax_platform_node_delegate_mac_unittest.cc",
"cocoa/bridged_native_widget_unittest.mm",
"cocoa/cocoa_mouse_capture_unittest.mm",
"cocoa/drag_drop_client_mac_unittest.mm",
@@ -1335,15 +1343,15 @@ test("views_unittests") {
}
if (is_fuchsia) {
- use_cfv2 = false
- additional_manifest_fragments = [
- "//build/config/fuchsia/test/font_capabilities.test-cmx",
+ use_cfv1 = false
- # These tests use SwiftShader (crbug.com/1022542), which uses JIT.
- "//build/config/fuchsia/test/jit_capabilities.test-cmx",
+ # These tests use SwiftShader (crbug.com/1022542), which uses JIT.
+ test_runner_shard = "//build/config/fuchsia/test/elf_test_ambient_exec_runner.shard.test-cml"
- "//build/config/fuchsia/test/present_view_capabilities.test-cmx",
- "//build/config/fuchsia/test/vulkan_capabilities.test-cmx",
+ additional_manifest_fragments = [
+ "//build/config/fuchsia/test/fonts.shard.test-cml",
+ "//build/config/fuchsia/test/present_view.shard.test-cml",
+ "//third_party/fuchsia-sdk/sdk/pkg/vulkan/client.shard.cml",
]
}
diff --git a/chromium/ui/views/DEPS b/chromium/ui/views/DEPS
index e751e98f69f..d60b866a64b 100644
--- a/chromium/ui/views/DEPS
+++ b/chromium/ui/views/DEPS
@@ -1,6 +1,7 @@
include_rules = [
"+ash/constants",
"+cc/paint",
+ "+chromeos/constants",
"+components/crash/core/common/crash_key.h",
"+components/remote_cocoa",
"+components/url_formatter",
@@ -18,6 +19,7 @@ include_rules = [
"+ui/events",
"+ui/gfx",
"+ui/gl/test/gl_surface_test_support.h", # To initialize GL for tests.
+ "+ui/linux",
"+ui/lottie",
"+ui/native_theme",
"+ui/ozone/buildflags.h",
diff --git a/chromium/ui/views/OWNERS b/chromium/ui/views/OWNERS
index bd1791dcaee..bbe15824b08 100644
--- a/chromium/ui/views/OWNERS
+++ b/chromium/ui/views/OWNERS
@@ -4,7 +4,9 @@
# 5 minutes. This approach helps our team to load-balance incoming reviews.
# Googlers can read more about this at go/gwsq-gerrit.
+elainechien@chromium.org
ellyjones@chromium.org
+kerenzhu@chromium.org
kylixrd@chromium.org
msw@chromium.org
pbos@chromium.org
diff --git a/chromium/ui/views/accessibility/accessibility_paint_checks.cc b/chromium/ui/views/accessibility/accessibility_paint_checks.cc
index 190a080c08a..fbda0e2df78 100644
--- a/chromium/ui/views/accessibility/accessibility_paint_checks.cc
+++ b/chromium/ui/views/accessibility/accessibility_paint_checks.cc
@@ -13,6 +13,7 @@
#include "ui/views/accessibility/view_accessibility.h"
#include "ui/views/view.h"
#include "ui/views/view_utils.h"
+#include "ui/views/widget/widget.h"
namespace views {
@@ -28,9 +29,12 @@ void RunAccessibilityPaintChecks(View* view) {
if (view->GetProperty(kSkipAccessibilityPaintChecks))
return;
+ // Get accessible node data from ViewAccessibility instead of View, because
+ // some additional fields are processed and set there.
ui::AXNodeData node_data;
view->GetViewAccessibility().GetAccessibleNodeData(&node_data);
+ // No checks for unfocusable items yet.
if (!node_data.HasState(ax::mojom::State::kFocusable))
return;
@@ -51,6 +55,17 @@ void RunAccessibilityPaintChecks(View* view) {
<< GetViewDebugInfo(view);
#endif // !BUILDFLAG(IS_CHROMEOS_ASH)
+ // ViewAccessibility::GetAccessibleNodeData currently returns early, after
+ // setting the role to kUnknown, the NameFrom to kAttributeExplicitlyEmpty,
+ // and adding the kDisabled restriction, if the Widget is closed.
+ if (node_data.GetRestriction() != ax::mojom::Restriction::kDisabled) {
+ // Focusable views should have a valid role.
+ DCHECK(node_data.role != ax::mojom::Role::kNone &&
+ node_data.role != ax::mojom::Role::kUnknown)
+ << "View is focusable but lacks a valid role.\n"
+ << GetViewDebugInfo(view);
+ }
+
// Focusable nodes must have an accessible name, otherwise screen reader users
// will not know what they landed on. For example, the reload button should
// have an accessible name of "Reload".
@@ -74,8 +89,20 @@ void RunAccessibilityPaintChecks(View* view) {
DCHECK_EQ(node_data.GetNameFrom(),
ax::mojom::NameFrom::kAttributeExplicitlyEmpty)
<< "View is focusable but has no accessible name or placeholder, and is "
- "not explicitly marked as empty.\n"
+ "not explicitly marked as empty. The accessible name is spoken by "
+ "screen readers to end users. Thus if this is production code, the "
+ "accessible name should be localized.\n"
<< GetViewDebugInfo(view);
}
+void RunAccessibilityPaintChecksRecursive(View* view) {
+ RunAccessibilityPaintChecks(view);
+ for (auto* v : view->children())
+ RunAccessibilityPaintChecksRecursive(v);
+}
+
+void RunAccessibilityPaintChecks(Widget* widget) {
+ RunAccessibilityPaintChecksRecursive(widget->GetRootView());
+}
+
} // namespace views
diff --git a/chromium/ui/views/accessibility/accessibility_paint_checks.h b/chromium/ui/views/accessibility/accessibility_paint_checks.h
index 2c287e46c35..0ae28d1defb 100644
--- a/chromium/ui/views/accessibility/accessibility_paint_checks.h
+++ b/chromium/ui/views/accessibility/accessibility_paint_checks.h
@@ -11,10 +11,14 @@
namespace views {
class View;
+class Widget;
// This runs DCHECKs related to the view's state when painting. Generally, when
// a View is ready to be displayed to the user it should also be accessible.
-void RunAccessibilityPaintChecks(View* view);
+VIEWS_EXPORT void RunAccessibilityPaintChecks(View* view);
+
+// Runs the paint checks recursively starting from the Widget's RootView.
+VIEWS_EXPORT void RunAccessibilityPaintChecks(Widget* widget);
// Skip accessibility paint checks on a specific View.
// TODO(pbos): Remove this key. Do not add new uses to it, instead make sure
diff --git a/chromium/ui/views/accessibility/accessibility_paint_checks_unittest.cc b/chromium/ui/views/accessibility/accessibility_paint_checks_unittest.cc
new file mode 100644
index 00000000000..84fe4dfed98
--- /dev/null
+++ b/chromium/ui/views/accessibility/accessibility_paint_checks_unittest.cc
@@ -0,0 +1,61 @@
+// 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/views/accessibility/accessibility_paint_checks.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/strings/utf_string_conversions.h"
+#include "base/test/gtest_util.h"
+#include "ui/views/controls/button/image_button.h"
+#include "ui/views/test/views_test_base.h"
+#include "ui/views/view.h"
+#include "ui/views/widget/widget.h"
+
+namespace views {
+
+using AccessibilityPaintChecksTest = ViewsTestBase;
+
+// Test that a view that is not accessible will fail the accessibility audit.
+TEST_F(AccessibilityPaintChecksTest, VerifyAccessibilityCheckerFailAndPass) {
+ // Create containing widget.
+ Widget widget;
+ Widget::InitParams params =
+ Widget::InitParams(Widget::InitParams::TYPE_WINDOW);
+ params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ params.bounds = gfx::Rect(0, 0, 650, 650);
+ params.context = GetContext();
+ widget.Init(std::move(params));
+ widget.Show();
+
+ // Add the button.
+ auto* button =
+ widget.GetContentsView()->AddChildView(std::make_unique<ImageButton>());
+
+ // Accessibility test should pass as it is focusable but has a name.
+ button->SetFocusBehavior(View::FocusBehavior::ALWAYS);
+ button->SetAccessibleName(u"Some name");
+ RunAccessibilityPaintChecks(&widget);
+
+ // Accessibility test should pass as it has no name but is not focusable.
+ button->SetFocusBehavior(View::FocusBehavior::NEVER);
+ button->SetAccessibleName(u"");
+ RunAccessibilityPaintChecks(&widget);
+
+ // Accessibility test should fail as it has no name and is focusable.
+ button->SetFocusBehavior(View::FocusBehavior::ALWAYS);
+ EXPECT_DCHECK_DEATH_WITH(RunAccessibilityPaintChecks(&widget), "name");
+
+ // Restore the name of the button so that it is not the source of failure.
+ button->SetAccessibleName(u"Some name");
+
+ // Accessibility test should fail if the focusable view lacks a valid role.
+ auto* generic_view =
+ widget.GetContentsView()->AddChildView(std::make_unique<View>());
+ generic_view->SetFocusBehavior(View::FocusBehavior::ALWAYS);
+ EXPECT_DCHECK_DEATH_WITH(RunAccessibilityPaintChecks(&widget), "role");
+}
+
+} // namespace views
diff --git a/chromium/ui/views/accessibility/ax_aura_obj_cache_unittest.cc b/chromium/ui/views/accessibility/ax_aura_obj_cache_unittest.cc
index 6e6a9d162e5..6c3cf239d86 100644
--- a/chromium/ui/views/accessibility/ax_aura_obj_cache_unittest.cc
+++ b/chromium/ui/views/accessibility/ax_aura_obj_cache_unittest.cc
@@ -27,6 +27,7 @@
#include "ui/views/accessibility/view_accessibility.h"
#include "ui/views/controls/button/label_button.h"
#include "ui/views/test/widget_test.h"
+#include "ui/views/widget/unique_widget_ptr.h"
#include "ui/views/widget/widget_delegate.h"
namespace views {
@@ -70,10 +71,8 @@ class AXAuraObjCacheTest : public WidgetTest {
TEST_F(AXAuraObjCacheTest, TestViewRemoval) {
AXAuraObjCache cache;
WidgetAutoclosePtr widget(CreateTopLevelPlatformWidget());
- View* parent = new View();
- widget->GetRootView()->AddChildView(parent);
- View* child = new View();
- parent->AddChildView(child);
+ auto* parent = widget->GetRootView()->AddChildView(std::make_unique<View>());
+ auto* child = parent->AddChildView(std::make_unique<View>());
AXAuraObjWrapper* ax_widget = cache.GetOrCreate(widget.get());
ASSERT_NE(nullptr, ax_widget);
@@ -89,14 +88,10 @@ TEST_F(AXAuraObjCacheTest, TestViewRemoval) {
// Removing the parent view should remove both the parent and child
// from the cache, but leave the widget.
- widget->GetRootView()->RemoveChildView(parent);
+ widget->GetRootView()->RemoveChildViewT(parent);
ASSERT_NE(cache.GetID(widget.get()), ui::kInvalidAXNodeID);
ASSERT_EQ(ui::kInvalidAXNodeID, cache.GetID(parent));
ASSERT_EQ(ui::kInvalidAXNodeID, cache.GetID(child));
-
- // Explicitly delete |parent| to prevent a memory leak, since calling
- // RemoveChildView() doesn't delete it.
- delete parent;
}
// Helper for the ViewDestruction test.
@@ -160,9 +155,8 @@ TEST_F(AXAuraObjCacheTest, CacheDestructionUAF) {
// the cache.
AXAuraObjCache* cache = new AXAuraObjCache();
- Widget* widget = new Widget();
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(0, 0, 200, 200);
widget->Init(std::move(params));
cache->OnRootWindowObjCreated(widget->GetNativeWindow());
@@ -170,41 +164,36 @@ TEST_F(AXAuraObjCacheTest, CacheDestructionUAF) {
widget->Activate();
base::RunLoop().RunUntilIdle();
- cache->GetOrCreate(widget);
+ cache->GetOrCreate(widget.get());
// Everything should have an ID, indicating it's in the cache.
- EXPECT_NE(cache->GetID(widget), ui::kInvalidAXNodeID);
+ EXPECT_NE(cache->GetID(widget.get()), ui::kInvalidAXNodeID);
// Create a second top-level widget to ensure |root_windows_| isn't empty.
- Widget* widget2 = new Widget();
+ UniqueWidgetPtr widget2 = std::make_unique<Widget>();
Widget::InitParams params2 = CreateParams(Widget::InitParams::TYPE_WINDOW);
- params2.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params2.bounds = gfx::Rect(0, 0, 200, 200);
widget2->Init(std::move(params2));
cache->OnRootWindowObjCreated(widget2->GetNativeWindow());
- cache->GetOrCreate(widget2);
+ cache->GetOrCreate(widget2.get());
widget2->Activate();
base::RunLoop().RunUntilIdle();
// Everything should have an ID, indicating it's in the cache.
- EXPECT_NE(cache->GetID(widget2), ui::kInvalidAXNodeID);
+ EXPECT_NE(cache->GetID(widget2.get()), ui::kInvalidAXNodeID);
// Delete the first widget, then delete the cache.
cache->OnRootWindowObjDestroyed(widget->GetNativeWindow());
- delete widget;
+ widget.reset();
delete cache;
-
- // Delete |widget2| so it doesn't leak.
- delete widget2;
}
TEST_F(AXAuraObjCacheTest, ValidTree) {
// Create a parent window.
- std::unique_ptr<Widget> parent_widget = std::make_unique<Widget>();
+ UniqueWidgetPtr parent_widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
params.bounds = gfx::Rect(0, 0, 200, 200);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
parent_widget->Init(std::move(params));
parent_widget->GetNativeWindow()->SetTitle(u"ParentWindow");
parent_widget->Show();
@@ -247,10 +236,9 @@ TEST_F(AXAuraObjCacheTest, ValidTree) {
TEST_F(AXAuraObjCacheTest, GetFocusIsUnignoredAncestor) {
AXAuraObjCache cache;
- std::unique_ptr<Widget> widget = std::make_unique<Widget>();
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
params.bounds = gfx::Rect(0, 0, 200, 200);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.activatable = views::Widget::InitParams::Activatable::kYes;
widget->Init(std::move(params));
widget->Show();
@@ -266,13 +254,11 @@ TEST_F(AXAuraObjCacheTest, GetFocusIsUnignoredAncestor) {
client_child->GetViewAccessibility().OverrideChildTreeID(
ui::AXTreeID::CreateNewAXTreeID());
- View* parent = new View();
- widget->GetRootView()->AddChildView(parent);
+ auto* parent = widget->GetRootView()->AddChildView(std::make_unique<View>());
parent->GetViewAccessibility().OverrideRole(ax::mojom::Role::kTextField);
parent->SetFocusBehavior(View::FocusBehavior::ALWAYS);
- View* child = new View();
- parent->AddChildView(child);
+ auto* child = parent->AddChildView(std::make_unique<View>());
child->GetViewAccessibility().OverrideRole(ax::mojom::Role::kGroup);
child->SetFocusBehavior(View::FocusBehavior::ALWAYS);
@@ -375,16 +361,14 @@ TEST_F(AXAuraObjCacheTest, DoNotCreateWidgetWrapperOnDestroyed) {
TEST_F(AXAuraObjCacheTest, VirtualViews) {
AXAuraObjCache cache;
- std::unique_ptr<Widget> widget = std::make_unique<Widget>();
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
params.bounds = gfx::Rect(0, 0, 200, 200);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.activatable = views::Widget::InitParams::Activatable::kYes;
widget->Init(std::move(params));
widget->Show();
- View* parent = new View();
- widget->GetRootView()->AddChildView(parent);
+ auto* parent = widget->GetRootView()->AddChildView(std::make_unique<View>());
AXVirtualView* virtual_label = new AXVirtualView;
virtual_label->GetCustomData().role = ax::mojom::Role::kStaticText;
virtual_label->GetCustomData().SetName("Label");
diff --git a/chromium/ui/views/accessibility/ax_tree_source_views_unittest.cc b/chromium/ui/views/accessibility/ax_tree_source_views_unittest.cc
index b5a696370ac..f640535e2a6 100644
--- a/chromium/ui/views/accessibility/ax_tree_source_views_unittest.cc
+++ b/chromium/ui/views/accessibility/ax_tree_source_views_unittest.cc
@@ -22,6 +22,8 @@
#include "ui/views/controls/label.h"
#include "ui/views/controls/textfield/textfield.h"
#include "ui/views/test/views_test_base.h"
+#include "ui/views/test/widget_test.h"
+#include "ui/views/widget/unique_widget_ptr.h"
#include "ui/views/widget/widget.h"
namespace views {
@@ -49,7 +51,6 @@ class AXTreeSourceViewsTest : public ViewsTestBase {
ViewsTestBase::SetUp();
widget_ = std::make_unique<Widget>();
Widget::InitParams params(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(11, 22, 333, 444);
params.context = GetContext();
widget_->Init(std::move(params));
@@ -73,7 +74,7 @@ class AXTreeSourceViewsTest : public ViewsTestBase {
ViewsTestBase::TearDown();
}
- std::unique_ptr<Widget> widget_;
+ UniqueWidgetPtr widget_;
raw_ptr<Label> label1_ = nullptr; // Owned by views hierarchy.
raw_ptr<Label> label2_ = nullptr; // Owned by views hierarchy.
raw_ptr<Textfield> textfield_ = nullptr; // Owned by views hierarchy.
@@ -198,9 +199,14 @@ TEST_F(AXTreeSourceViewsDesktopWidgetTest, FocusedChildWindowDestroyed) {
// GetFocus() reflects the focused child window.
EXPECT_NE(nullptr, cache.GetFocus());
+ test::WidgetDestroyedWaiter waiter(widget_.get());
+
// Close the widget to destroy the child.
widget_.reset();
+ // Wait for the async widget close.
+ waiter.Wait();
+
// GetFocus() should return null and no use-after-free to call it.
EXPECT_EQ(nullptr, cache.GetFocus());
}
diff --git a/chromium/ui/views/accessibility/ax_virtual_view.cc b/chromium/ui/views/accessibility/ax_virtual_view.cc
index a15c64bf712..26173b80758 100644
--- a/chromium/ui/views/accessibility/ax_virtual_view.cc
+++ b/chromium/ui/views/accessibility/ax_virtual_view.cc
@@ -93,7 +93,8 @@ void AXVirtualView::AddChildViewAt(std::unique_ptr<AXVirtualView> view,
DCHECK_LE(index, children_.size());
view->virtual_parent_view_ = this;
- children_.insert(children_.begin() + index, std::move(view));
+ children_.insert(children_.begin() + static_cast<ptrdiff_t>(index),
+ std::move(view));
if (GetOwnerView()) {
GetOwnerView()->NotifyAccessibilityEvent(ax::mojom::Event::kChildrenChanged,
true);
@@ -114,8 +115,10 @@ void AXVirtualView::ReorderChildView(AXVirtualView* view, size_t index) {
std::unique_ptr<AXVirtualView> child =
std::move(children_[cur_index.value()]);
- children_.erase(children_.begin() + cur_index.value());
- children_.insert(children_.begin() + index, std::move(child));
+ children_.erase(children_.begin() +
+ static_cast<ptrdiff_t>(cur_index.value()));
+ children_.insert(children_.begin() + static_cast<ptrdiff_t>(index),
+ std::move(child));
GetOwnerView()->NotifyAccessibilityEvent(ax::mojom::Event::kChildrenChanged,
true);
@@ -152,7 +155,8 @@ std::unique_ptr<AXVirtualView> AXVirtualView::RemoveChildView(
std::unique_ptr<AXVirtualView> child =
std::move(children_[cur_index.value()]);
- children_.erase(children_.begin() + cur_index.value());
+ children_.erase(children_.begin() +
+ static_cast<ptrdiff_t>(cur_index.value()));
child->virtual_parent_view_ = nullptr;
child->populate_data_callback_.Reset();
diff --git a/chromium/ui/views/accessibility/view_accessibility.cc b/chromium/ui/views/accessibility/view_accessibility.cc
index f3bfa4831f4..0a65c308fdc 100644
--- a/chromium/ui/views/accessibility/view_accessibility.cc
+++ b/chromium/ui/views/accessibility/view_accessibility.cc
@@ -13,7 +13,6 @@
#include "build/chromeos_buildflags.h"
#include "ui/accessibility/accessibility_features.h"
#include "ui/accessibility/ax_enums.mojom.h"
-#include "ui/accessibility/ax_tree_manager_map.h"
#include "ui/accessibility/platform/ax_platform_node.h"
#include "ui/accessibility/platform/ax_platform_node_delegate.h"
#include "ui/base/buildflags.h"
@@ -100,7 +99,8 @@ void ViewAccessibility::AddVirtualChildViewAt(
"AXVirtualView parent. Call "
"RemoveChildView first.";
virtual_view->set_parent_view(this);
- auto insert_iterator = virtual_children_.begin() + index;
+ auto insert_iterator =
+ virtual_children_.begin() + static_cast<ptrdiff_t>(index);
virtual_children_.insert(insert_iterator, std::move(virtual_view));
}
@@ -113,7 +113,8 @@ std::unique_ptr<AXVirtualView> ViewAccessibility::RemoveVirtualChildView(
std::unique_ptr<AXVirtualView> child =
std::move(virtual_children_[cur_index.value()]);
- virtual_children_.erase(virtual_children_.begin() + cur_index.value());
+ virtual_children_.erase(virtual_children_.begin() +
+ static_cast<ptrdiff_t>(cur_index.value()));
child->set_parent_view(nullptr);
child->UnsetPopulateDataCallback();
if (focused_virtual_child_ && child->Contains(focused_virtual_child_))
@@ -163,6 +164,11 @@ void ViewAccessibility::GetAccessibleNodeData(ui::AXNodeData* data) const {
data->role = ax::mojom::Role::kUnknown;
data->SetRestriction(ax::mojom::Restriction::kDisabled);
+ // TODO(accessibility): Returning early means that any custom data which
+ // had been set via the Override functions is not included. Preserving
+ // and exposing these properties might be worth doing, even in the case
+ // of object destruction.
+
// Ordinarily, a view cannot be focusable if its widget has already closed.
// So, it would have been appropriate to set the focusable state to false in
// this particular case. However, the `FocusManager` may sometimes try to
@@ -193,9 +199,13 @@ void ViewAccessibility::GetAccessibleNodeData(ui::AXNodeData* data) const {
data->AddStringAttribute(ax::mojom::StringAttribute::kRole, "alertdialog");
}
- if (custom_data_.HasStringAttribute(ax::mojom::StringAttribute::kName)) {
- data->SetName(
- custom_data_.GetStringAttribute(ax::mojom::StringAttribute::kName));
+ std::string name;
+ if (custom_data_.GetStringAttribute(ax::mojom::StringAttribute::kName,
+ &name)) {
+ if (!name.empty())
+ data->SetName(name);
+ else
+ data->SetNameExplicitlyEmpty();
}
if (custom_data_.HasStringAttribute(
@@ -208,6 +218,8 @@ void ViewAccessibility::GetAccessibleNodeData(ui::AXNodeData* data) const {
data->SetHasPopup(custom_data_.GetHasPopup());
static constexpr ax::mojom::IntAttribute kOverridableIntAttributes[]{
+ ax::mojom::IntAttribute::kDescriptionFrom,
+ ax::mojom::IntAttribute::kNameFrom,
ax::mojom::IntAttribute::kPosInSet,
ax::mojom::IntAttribute::kSetSize,
};
@@ -346,20 +358,120 @@ void ViewAccessibility::OverrideRole(const ax::mojom::Role role) {
custom_data_.role = role;
}
-void ViewAccessibility::OverrideName(const std::string& name) {
- custom_data_.SetName(name);
-}
+void ViewAccessibility::OverrideName(const std::string& name,
+ const ax::mojom::NameFrom name_from) {
+ DCHECK_EQ(name.empty(),
+ name_from == ax::mojom::NameFrom::kAttributeExplicitlyEmpty)
+ << "If the name is being removed to improve the user experience, "
+ "|name_from| should be set to |kAttributeExplicitlyEmpty|.";
+
+ // |AXNodeData::SetName| expects a valid role. Some Views call |OverrideRole|
+ // prior to overriding the name. For those that don't, see if we can get the
+ // default role from the View.
+ if (custom_data_.role == ax::mojom::Role::kUnknown) {
+ ui::AXNodeData data;
+ view_->GetAccessibleNodeData(&data);
+ custom_data_.role = data.role;
+ }
-void ViewAccessibility::OverrideName(const std::u16string& name) {
+ custom_data_.SetNameFrom(name_from);
custom_data_.SetName(name);
}
-void ViewAccessibility::OverrideDescription(const std::string& description) {
- custom_data_.SetDescription(description);
+void ViewAccessibility::OverrideName(const std::u16string& name,
+ const ax::mojom::NameFrom name_from) {
+ OverrideName(base::UTF16ToUTF8(name), name_from);
+}
+
+void ViewAccessibility::OverrideLabelledBy(
+ const View* labelled_by_view,
+ const ax::mojom::NameFrom name_from) {
+ DCHECK_NE(labelled_by_view, view_);
+ // |OverrideName| might have been used before |OverrideLabelledBy|.
+ // We don't want to keep an old/incorrect name. In addition, some ATs might
+ // expect the name to be provided by us from the label. So try to get the
+ // name from the labelling View and use the result.
+ //
+ // |ViewAccessibility::GetAccessibleNodeData| gets properties from: 1) The
+ // View's implementation of |View::GetAccessibleNodeData| and 2) the
+ // custom_data_ set via ViewAccessibility's various Override functions.
+ // HOWEVER, it returns early prior to checking either of those sources if the
+ // Widget does not exist or is closed. Thus given a View whose Widget is about
+ // to be created, we cannot use |ViewAccessibility::GetAccessibleNodeData| to
+ // obtain the name. If |OverrideLabelledBy| is being called, presumably the
+ // labelling View is not in the process of being destroyed. So manually check
+ // the two sources.
+ ui::AXNodeData label_data;
+ const_cast<View*>(labelled_by_view)->GetAccessibleNodeData(&label_data);
+ const std::string& label =
+ label_data.GetStringAttribute(ax::mojom::StringAttribute::kName).empty()
+ ? labelled_by_view->GetViewAccessibility()
+ .custom_data_.GetStringAttribute(
+ ax::mojom::StringAttribute::kName)
+ : label_data.GetStringAttribute(ax::mojom::StringAttribute::kName);
+
+ // |OverrideName| includes logic to populate custom_data_.role with the
+ // View's default role in cases where |OverrideRole| was not called (yet).
+ // This ensures |AXNodeData::SetName| is not called with |Role::kUnknown|.
+ OverrideName(label, name_from);
+
+ int32_t labelled_by_id =
+ labelled_by_view->GetViewAccessibility().GetUniqueId().Get();
+ custom_data_.AddIntListAttribute(ax::mojom::IntListAttribute::kLabelledbyIds,
+ {labelled_by_id});
}
-void ViewAccessibility::OverrideDescription(const std::u16string& description) {
+void ViewAccessibility::OverrideDescription(
+ const std::string& description,
+ const ax::mojom::DescriptionFrom description_from) {
+ DCHECK_EQ(
+ description.empty(),
+ description_from == ax::mojom::DescriptionFrom::kAttributeExplicitlyEmpty)
+ << "If the description is being removed to improve the user experience, "
+ "|description_from| should be set to |kAttributeExplicitlyEmpty|.";
custom_data_.SetDescription(description);
+ custom_data_.SetDescriptionFrom(description_from);
+}
+
+void ViewAccessibility::OverrideDescription(
+ const std::u16string& description,
+ const ax::mojom::DescriptionFrom description_from) {
+ OverrideDescription(base::UTF16ToUTF8(description), description_from);
+}
+
+void ViewAccessibility::OverrideDescribedBy(
+ const View* described_by_view,
+ const ax::mojom::DescriptionFrom description_from) {
+ DCHECK_NE(described_by_view, view_);
+ // |OverrideDescription| might have been used before |OverrideDescribedBy|.
+ // We don't want to keep an old/incorrect description. In addition, some ATs
+ // might expect the description to be provided by us from the describing View.
+ // So try to get the name from the describing View and use the result as the
+ // description string.
+ //
+ // |ViewAccessibility::GetAccessibleNodeData| gets properties from: 1) The
+ // View's implementation of |View::GetAccessibleNodeData| and 2) the
+ // custom_data_ set via ViewAccessibility's various Override functions.
+ // HOWEVER, it returns early prior to checking either of those sources if the
+ // Widget does not exist or is closed. Thus given a View whose Widget is about
+ // to be created, we cannot use |ViewAccessibility::GetAccessibleNodeData| to
+ // obtain the name. If |OverrideDescribedBy| is being called, presumably the
+ // labelling View is not in the process of being destroyed. So manually check
+ // the two sources.
+ ui::AXNodeData data;
+ const_cast<View*>(described_by_view)->GetAccessibleNodeData(&data);
+ custom_data_.SetDescription(
+ data.GetStringAttribute(ax::mojom::StringAttribute::kName).empty()
+ ? described_by_view->GetViewAccessibility()
+ .custom_data_.GetStringAttribute(
+ ax::mojom::StringAttribute::kName)
+ : data.GetStringAttribute(ax::mojom::StringAttribute::kName));
+
+ int32_t described_by_id =
+ described_by_view->GetViewAccessibility().GetUniqueId().Get();
+ custom_data_.AddIntListAttribute(ax::mojom::IntListAttribute::kDescribedbyIds,
+ {described_by_id});
+ custom_data_.SetDescriptionFrom(description_from);
}
void ViewAccessibility::OverrideNativeWindowTitle(const std::string& title) {
@@ -426,20 +538,6 @@ void ViewAccessibility::OverrideBounds(const gfx::RectF& bounds) {
custom_data_.relative_bounds.bounds = bounds;
}
-void ViewAccessibility::OverrideLabelledBy(View* labelled_by_view) {
- int32_t labelled_by_id =
- labelled_by_view->GetViewAccessibility().GetUniqueId().Get();
- custom_data_.AddIntListAttribute(ax::mojom::IntListAttribute::kLabelledbyIds,
- {labelled_by_id});
-}
-
-void ViewAccessibility::OverrideDescribedBy(View* described_by_view) {
- int32_t described_by_id =
- described_by_view->GetViewAccessibility().GetUniqueId().Get();
- custom_data_.AddIntListAttribute(ax::mojom::IntListAttribute::kDescribedbyIds,
- {described_by_id});
-}
-
void ViewAccessibility::OverrideHasPopup(const ax::mojom::HasPopup has_popup) {
custom_data_.SetHasPopup(has_popup);
}
@@ -525,7 +623,7 @@ ViewsAXTreeManager* ViewAccessibility::AXTreeManager() const {
WidgetAXTreeIDMap::GetInstance().GetWidgetTreeID(widget);
DCHECK_NE(tree_id, ui::AXTreeIDUnknown());
manager = static_cast<views::ViewsAXTreeManager*>(
- ui::AXTreeManagerMap::GetInstance().GetManager(tree_id));
+ ui::AXTreeManager::FromID(tree_id));
}
#endif
return manager;
diff --git a/chromium/ui/views/accessibility/view_accessibility.h b/chromium/ui/views/accessibility/view_accessibility.h
index a41f431089f..9bd83627c2f 100644
--- a/chromium/ui/views/accessibility/view_accessibility.h
+++ b/chromium/ui/views/accessibility/view_accessibility.h
@@ -99,10 +99,71 @@ class VIEWS_EXPORT ViewAccessibility {
virtual void FireFocusAfterMenuClose();
void OverrideRole(const ax::mojom::Role role);
- void OverrideName(const std::string& name);
- void OverrideName(const std::u16string& name);
- void OverrideDescription(const std::string& description);
- void OverrideDescription(const std::u16string& description);
+
+ // Sets the accessible name to the specified string value.
+ // By default the source type of the name is attribute. This source is
+ // appropriate for most use cases where a View is providing a non-empty flat
+ // string as the accessible name. If a View has a need to remove the
+ // accessible name, the string should be empty and the source of the name
+ // should instead be kAttributeExplicitlyEmpty. Note that the name source
+ // types were created based on needs associated with web content
+ // accessibility, and assistive technologies may make decisions based on that
+ // supposition. For instance, kTitle implies that the source of the name will
+ // be presented as a tooltip, such as would result from the HTML 'title'
+ // attribute or the SVG <title> element.
+ void OverrideName(
+ const std::string& name,
+ const ax::mojom::NameFrom name_from = ax::mojom::NameFrom::kAttribute);
+ void OverrideName(
+ const std::u16string& name,
+ const ax::mojom::NameFrom name_from = ax::mojom::NameFrom::kAttribute);
+
+ // Sets the accessible label source by establishing a relationship between
+ // this View and another view, such as a Label. By default the source type of
+ // the name is "related element." This default should cover most, if not all,
+ // of the use cases for Views. Note that the name source types were created
+ // based on needs associated with web content accessibility, and assistive
+ // technologies may make decisions based on that supposition. For instance,
+ // kTitle implies that the source of the name will be presented as a tooltip,
+ // such as would result from the HTML 'title' attribute or the SVG <title>
+ // element.
+ void OverrideLabelledBy(const View* labelled_by_view,
+ const ax::mojom::NameFrom name_from =
+ ax::mojom::NameFrom::kRelatedElement);
+
+ // Sets the accessible description to the specified string value.
+ // By default the source type of the description is aria-description. While
+ // Views technically don't support ARIA, aria-description is the closest
+ // existing DescriptionFrom source for Views providing a flat string
+ // description. And assistive technologies already know how to recognize this
+ // source type. Therefore, Views are encouraged to go with this default unless
+ // they have a specific reason not to. If a View has a need to remove the
+ // accessible description, the string should be empty and the source of the
+ // description should instead be kAttributeExplicitlyEmpty. If a View never
+ // had an accessible description, there is no need to override it with an
+ // empty string.
+ void OverrideDescription(const std::string& description,
+ const ax::mojom::DescriptionFrom description_from =
+ ax::mojom::DescriptionFrom::kAriaDescription);
+ void OverrideDescription(const std::u16string& description,
+ const ax::mojom::DescriptionFrom description_from =
+ ax::mojom::DescriptionFrom::kAriaDescription);
+
+ // Sets the accessible description source by establishing a relationship
+ // between this View and another view, such as a Label. By default the source
+ // type of the description is "related element." This default should cover
+ // most, if not all, of the use cases for Views. Note that the description
+ // source types were created based on needs associated with web content
+ // accessibility, and assistive technologies may make decisions based on that
+ // supposition. For instance, kTitle implies that the source of the
+ // description will be presented as a tooltip, such as would result from the
+ // HTML 'title' attribute or the SVG <title> element. See also
+ // OverrideDescription, which allows a View to provide a flat string
+ // description which is appropriate in cases where there is not one single
+ // Label/View containing the entire description.
+ void OverrideDescribedBy(const View* described_by_view,
+ const ax::mojom::DescriptionFrom description_from =
+ ax::mojom::DescriptionFrom::kRelatedElement);
// Sets the platform-specific accessible name/title property of the
// NativeViewAccessible window. This is needed on platforms where the name
@@ -147,8 +208,6 @@ class VIEWS_EXPORT ViewAccessibility {
virtual bool IsAccessibilityEnabled() const;
void OverrideBounds(const gfx::RectF& bounds);
- void OverrideLabelledBy(View* labelled_by_view);
- void OverrideDescribedBy(View* described_by_view);
void OverrideHasPopup(const ax::mojom::HasPopup has_popup);
// Override information provided to users by screen readers when describing
diff --git a/chromium/ui/views/accessibility/view_ax_platform_node_delegate.cc b/chromium/ui/views/accessibility/view_ax_platform_node_delegate.cc
index 512bbaee4a8..a3cca9d749d 100644
--- a/chromium/ui/views/accessibility/view_ax_platform_node_delegate.cc
+++ b/chromium/ui/views/accessibility/view_ax_platform_node_delegate.cc
@@ -154,7 +154,9 @@ ViewAXPlatformNodeDelegate::~ViewAXPlatformNodeDelegate() {
ax_platform_node_->GetNativeViewAccessible()) {
ui::AXPlatformNode::SetPopupFocusOverride(nullptr);
}
- ax_platform_node_->Destroy();
+ // Call ExtractAsDangling() first to clear the underlying pointer and return
+ // another raw_ptr instance that is allowed to dangle.
+ ax_platform_node_.ExtractAsDangling()->Destroy();
}
bool ViewAXPlatformNodeDelegate::IsAccessibilityFocusable() const {
@@ -735,10 +737,10 @@ std::vector<int32_t> ViewAXPlatformNodeDelegate::GetColHeaderNodeIds() const {
std::vector<int32_t> ViewAXPlatformNodeDelegate::GetColHeaderNodeIds(
int col_index) const {
std::vector<int32_t> columns = GetColHeaderNodeIds();
- if (columns.size() <= static_cast<size_t>(col_index)) {
+ if (static_cast<size_t>(col_index) >= columns.size()) {
return {};
}
- return {columns[col_index]};
+ return {columns[static_cast<size_t>(col_index)]};
}
absl::optional<int32_t> ViewAXPlatformNodeDelegate::GetCellId(
@@ -747,8 +749,8 @@ absl::optional<int32_t> ViewAXPlatformNodeDelegate::GetCellId(
if (virtual_children().empty() || !GetAncestorTableView())
return absl::nullopt;
- AXVirtualView* ax_cell =
- GetAncestorTableView()->GetVirtualAccessibilityCell(row_index, col_index);
+ AXVirtualView* ax_cell = GetAncestorTableView()->GetVirtualAccessibilityCell(
+ static_cast<size_t>(row_index), static_cast<size_t>(col_index));
if (!ax_cell)
return absl::nullopt;
@@ -819,7 +821,7 @@ absl::optional<int> ViewAXPlatformNodeDelegate::GetSetSize() const {
if (found_view == views_in_group.end())
return absl::nullopt;
- return views_in_group.size();
+ return base::checked_cast<int>(views_in_group.size());
}
void ViewAXPlatformNodeDelegate::GetViewsInGroupForSet(
diff --git a/chromium/ui/views/accessibility/view_ax_platform_node_delegate_auralinux.cc b/chromium/ui/views/accessibility/view_ax_platform_node_delegate_auralinux.cc
index 0f2a66a22b8..c97c1184789 100644
--- a/chromium/ui/views/accessibility/view_ax_platform_node_delegate_auralinux.cc
+++ b/chromium/ui/views/accessibility/view_ax_platform_node_delegate_auralinux.cc
@@ -9,6 +9,7 @@
#include <vector>
#include "base/containers/contains.h"
+#include "base/memory/raw_ptr.h"
#include "base/no_destructor.h"
#include "base/scoped_multi_source_observation.h"
#include "ui/accessibility/ax_action_data.h"
@@ -183,7 +184,7 @@ class AuraLinuxApplication : public ui::AXPlatformNodeDelegateBase,
// TODO(nektar): Make this into a const pointer so that it can't be set
// outside the class's constructor.
- ui::AXPlatformNode* ax_platform_node_;
+ raw_ptr<ui::AXPlatformNode> ax_platform_node_;
ui::AXUniqueId unique_id_;
mutable ui::AXNodeData data_;
std::vector<Widget*> widgets_;
diff --git a/chromium/ui/views/accessibility/view_ax_platform_node_delegate_auralinux_unittest.cc b/chromium/ui/views/accessibility/view_ax_platform_node_delegate_auralinux_unittest.cc
index 44470366b0a..e2882f88b0f 100644
--- a/chromium/ui/views/accessibility/view_ax_platform_node_delegate_auralinux_unittest.cc
+++ b/chromium/ui/views/accessibility/view_ax_platform_node_delegate_auralinux_unittest.cc
@@ -10,6 +10,7 @@
#include "ui/accessibility/platform/ax_platform_node.h"
#include "ui/views/controls/textfield/textfield.h"
#include "ui/views/test/views_test_base.h"
+#include "ui/views/widget/unique_widget_ptr.h"
namespace views {
namespace test {
@@ -25,12 +26,11 @@ class ViewAXPlatformNodeDelegateAuraLinuxTest : public ViewsTestBase {
};
TEST_F(ViewAXPlatformNodeDelegateAuraLinuxTest, TextfieldAccessibility) {
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- widget.Init(std::move(init_params));
+ widget->Init(std::move(init_params));
- View* content = widget.SetContentsView(std::make_unique<View>());
+ View* content = widget->SetContentsView(std::make_unique<View>());
Textfield* textfield = new Textfield;
textfield->SetAccessibleName(u"Name");
@@ -101,30 +101,28 @@ TEST_F(ViewAXPlatformNodeDelegateAuraLinuxTest, TextfieldAccessibility) {
}
TEST_F(ViewAXPlatformNodeDelegateAuraLinuxTest, AuraChildWidgets) {
- // Create the parent widget.
- Widget widget;
+ // Create the parent widget->
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams init_params =
CreateParams(Widget::InitParams::TYPE_WINDOW);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
init_params.bounds = gfx::Rect(0, 0, 400, 200);
- widget.Init(std::move(init_params));
- widget.Show();
+ widget->Init(std::move(init_params));
+ widget->Show();
// Initially it has 1 child.
AtkObject* root_view_accessible =
- widget.GetRootView()->GetNativeViewAccessible();
+ widget->GetRootView()->GetNativeViewAccessible();
ASSERT_EQ(1, atk_object_get_n_accessible_children(root_view_accessible));
// Create the child widget, one of two ways (see below).
- Widget child_widget;
+ UniqueWidgetPtr child_widget = std::make_unique<Widget>();
Widget::InitParams child_init_params =
CreateParams(Widget::InitParams::TYPE_BUBBLE);
- child_init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- child_init_params.parent = widget.GetNativeView();
+ child_init_params.parent = widget->GetNativeView();
child_init_params.bounds = gfx::Rect(30, 40, 100, 50);
child_init_params.child = false;
- child_widget.Init(std::move(child_init_params));
- child_widget.Show();
+ child_widget->Init(std::move(child_init_params));
+ child_widget->Show();
// Now the AtkObject for the parent widget should have 2 children.
ASSERT_EQ(2, atk_object_get_n_accessible_children(root_view_accessible));
@@ -132,7 +130,7 @@ TEST_F(ViewAXPlatformNodeDelegateAuraLinuxTest, AuraChildWidgets) {
// Make sure that querying the parent of the child gets us back to
// the original parent.
AtkObject* child_widget_accessible =
- child_widget.GetRootView()->GetNativeViewAccessible();
+ child_widget->GetRootView()->GetNativeViewAccessible();
ASSERT_EQ(atk_object_get_parent(child_widget_accessible),
root_view_accessible);
@@ -145,22 +143,20 @@ TEST_F(ViewAXPlatformNodeDelegateAuraLinuxTest, AuraChildWidgets) {
}
// Tests if atk_object_get_index_in_parent doesn't DCHECK after the
-// corresponding View is removed from a Widget.
+// corresponding View is removed from a widget->
TEST_F(ViewAXPlatformNodeDelegateAuraLinuxTest, IndexInParent) {
// Create the Widget that will represent the application
- Widget parent_widget;
+ UniqueWidgetPtr parent_widget = std::make_unique<Widget>();
Widget::InitParams init_params =
CreateParams(Widget::InitParams::TYPE_WINDOW);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- parent_widget.Init(std::move(init_params));
- parent_widget.Show();
+ parent_widget->Init(std::move(init_params));
+ parent_widget->Show();
// |widget| will be destroyed later.
- std::unique_ptr<Widget> widget = std::make_unique<Widget>();
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams child_init_params =
CreateParams(Widget::InitParams::TYPE_POPUP);
- child_init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- child_init_params.parent = parent_widget.GetNativeView();
+ child_init_params.parent = parent_widget->GetNativeView();
widget->Init(std::move(child_init_params));
widget->Show();
diff --git a/chromium/ui/views/accessibility/view_ax_platform_node_delegate_mac_unittest.cc b/chromium/ui/views/accessibility/view_ax_platform_node_delegate_mac_unittest.cc
new file mode 100644
index 00000000000..04de0a847b9
--- /dev/null
+++ b/chromium/ui/views/accessibility/view_ax_platform_node_delegate_mac_unittest.cc
@@ -0,0 +1,127 @@
+// 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/views/accessibility/view_ax_platform_node_delegate.h"
+
+#include <memory>
+#include <string>
+
+#include "base/memory/raw_ptr.h"
+#include "base/strings/utf_string_conversions.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+#include "ui/accessibility/ax_node_data.h"
+#include "ui/views/test/views_test_base.h"
+#include "ui/views/widget/widget_delegate.h"
+
+namespace views::test {
+
+namespace {
+
+static const char* kDialogName = "DialogName";
+static const char* kDifferentNodeName = "DifferentNodeName";
+static const char* kDescription = "SomeDescription";
+
+class AccessibleView : public View {
+ public:
+ void GetAccessibleNodeData(ui::AXNodeData* node_data) override {
+ node_data->role = role_;
+ node_data->SetName(name_);
+ if (description_) {
+ node_data->SetDescription(*description_);
+ }
+ }
+
+ ViewAXPlatformNodeDelegate* GetPlatformNodeDelegate() {
+ return static_cast<ViewAXPlatformNodeDelegate*>(&GetViewAccessibility());
+ }
+
+ void SetDescription(const absl::optional<std::string>& descritpion) {
+ description_ = descritpion;
+ }
+ const absl::optional<std::string>& GetDescription() const {
+ return description_;
+ }
+
+ void SetName(const std::string& name) { name_ = name; }
+ const std::string& GetName() const { return name_; }
+
+ void SetRole(ax::mojom::Role role) { role_ = role; }
+ ax::mojom::Role GetRole() const { return role_; }
+
+ private:
+ absl::optional<std::string> description_ = kDescription;
+ std::string name_ = kDialogName;
+ ax::mojom::Role role_ = ax::mojom::Role::kDialog;
+};
+
+} // namespace
+
+class ViewAXPlatformNodeDelegateMacTest : public ViewsTestBase {
+ public:
+ ViewAXPlatformNodeDelegateMacTest() = default;
+ ~ViewAXPlatformNodeDelegateMacTest() override = default;
+
+ void SetUp() override {
+ ViewsTestBase::SetUp();
+ widget_ = CreateTestWidget();
+ widget_->widget_delegate()->SetTitle(base::ASCIIToUTF16(kDialogName));
+ view_ = widget_->SetContentsView(std::make_unique<AccessibleView>());
+ }
+
+ void TearDown() override {
+ widget_.reset();
+ ViewsTestBase::TearDown();
+ }
+
+ protected:
+ std::unique_ptr<Widget> widget_;
+ raw_ptr<AccessibleView> view_;
+};
+
+TEST_F(ViewAXPlatformNodeDelegateMacTest,
+ GetNameReturnsNodeNameWhenNameAndTitleAreEqual) {
+ EXPECT_NE(view_->GetPlatformNodeDelegate()->GetName(),
+ *view_->GetDescription());
+}
+
+TEST_F(ViewAXPlatformNodeDelegateMacTest,
+ GetNameReturnsNodeNameWhenNameAndTitleAreDifferent) {
+ EXPECT_NE(view_->GetPlatformNodeDelegate()->GetName(),
+ *view_->GetDescription());
+
+ view_->SetName(kDifferentNodeName);
+
+ EXPECT_EQ(view_->GetPlatformNodeDelegate()->GetName(), kDifferentNodeName);
+}
+
+TEST_F(ViewAXPlatformNodeDelegateMacTest, GetNameReturnsNodeNameForNonDialog) {
+ EXPECT_NE(view_->GetPlatformNodeDelegate()->GetName(),
+ *view_->GetDescription());
+
+ view_->SetRole(ax::mojom::Role::kDesktop);
+
+ EXPECT_EQ(view_->GetPlatformNodeDelegate()->GetName(), kDialogName);
+}
+
+TEST_F(ViewAXPlatformNodeDelegateMacTest,
+ GetNameReturnsNodeNameWhenDescriptionIsNotSet) {
+ EXPECT_NE(view_->GetPlatformNodeDelegate()->GetName(),
+ *view_->GetDescription());
+
+ view_->SetDescription(absl::nullopt);
+
+ EXPECT_EQ(view_->GetPlatformNodeDelegate()->GetName(), kDialogName);
+}
+
+TEST_F(ViewAXPlatformNodeDelegateMacTest,
+ GetNameReturnsNodeNameWhenDescriptionIsAnEmptyString) {
+ EXPECT_NE(view_->GetPlatformNodeDelegate()->GetName(),
+ *view_->GetDescription());
+
+ view_->SetDescription("");
+
+ EXPECT_EQ(view_->GetPlatformNodeDelegate()->GetName(), kDialogName);
+}
+
+} // namespace views::test
diff --git a/chromium/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc b/chromium/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc
index f28fe7bbb83..3c6255e8fb2 100644
--- a/chromium/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc
+++ b/chromium/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc
@@ -35,6 +35,7 @@
#include "ui/views/controls/table/table_view.h"
#include "ui/views/test/menu_test_utils.h"
#include "ui/views/test/views_test_base.h"
+#include "ui/views/widget/unique_widget_ptr.h"
#include "ui/views/widget/widget.h"
namespace views {
@@ -82,12 +83,9 @@ class TestTableModel : public ui::TableModel {
TestTableModel& operator=(const TestTableModel&) = delete;
// ui::TableModel:
- int RowCount() override { return 10; }
-
- std::u16string GetText(int row, int column_id) override {
- if (row == -1)
- return std::u16string();
+ size_t RowCount() override { return 10; }
+ std::u16string GetText(size_t row, int column_id) override {
const char* const cells[5][4] = {
{"Orange", "Orange", "South america", "$5"},
{"Apple", "Green", "Canada", "$3"},
@@ -254,7 +252,6 @@ class ViewAXPlatformNodeDelegateMenuTest
owner_ = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
owner_->Init(std::move(params));
owner_->Show();
@@ -306,7 +303,7 @@ class ViewAXPlatformNodeDelegateMenuTest
raw_ptr<SubmenuView> submenu_ = nullptr;
std::unique_ptr<TestMenuDelegate> menu_delegate_;
std::unique_ptr<MenuRunner> runner_;
- std::unique_ptr<Widget> owner_;
+ UniqueWidgetPtr owner_;
};
TEST_F(ViewAXPlatformNodeDelegateTest, FocusBehaviorShouldAffectIgnoredState) {
@@ -410,6 +407,109 @@ TEST_F(ViewAXPlatformNodeDelegateTest, GetAuthorUniqueIdNonDefault) {
ASSERT_EQ(u"view_1", button_accessibility()->GetAuthorUniqueId());
}
+TEST_F(ViewAXPlatformNodeDelegateTest, OverrideNameAndDescription) {
+ // Initially the button has no name and no description.
+ // TODO(accessibility): If nothing has set the name, should the NameFrom
+ // be kNone or kUninitialized instead of kAttribute?
+ EXPECT_EQ(button_accessibility()->GetName(), "");
+ EXPECT_EQ(button_accessibility()->GetNameFrom(),
+ ax::mojom::NameFrom::kAttribute);
+ EXPECT_EQ(button_accessibility()->GetDescription(), "");
+ EXPECT_EQ(button_accessibility()->GetDescriptionFrom(),
+ ax::mojom::DescriptionFrom::kNone);
+
+ // Setting the name to the empty string without explicitly setting the
+ // source to reflect that should trigger a DCHECK in OverrideName.
+ EXPECT_DCHECK_DEATH_WITH(button_accessibility()->OverrideName(""),
+ "Check failed: name.empty\\(\\) == name_from == "
+ "ax::mojom::NameFrom::kAttributeExplicitlyEmpty");
+
+ // Setting the name to a non-empty string with a NameFrom of
+ // kAttributeExplicitlyEmpty should trigger a DCHECK in OverrideName.
+ EXPECT_DCHECK_DEATH_WITH(
+ button_accessibility()->OverrideName(
+ "foo", ax::mojom::NameFrom::kAttributeExplicitlyEmpty),
+ "Check failed: name.empty\\(\\) == name_from == "
+ "ax::mojom::NameFrom::kAttributeExplicitlyEmpty");
+
+ button_accessibility()->OverrideName(
+ "", ax::mojom::NameFrom::kAttributeExplicitlyEmpty);
+ EXPECT_EQ(button_accessibility()->GetName(), "");
+ EXPECT_EQ(button_accessibility()->GetNameFrom(),
+ ax::mojom::NameFrom::kAttributeExplicitlyEmpty);
+
+ // Setting the description to the empty string without explicitly setting
+ // the source to reflect that should trigger a DCHECK in OverrideDescription.
+ EXPECT_DCHECK_DEATH_WITH(
+ button_accessibility()->OverrideDescription(""),
+ "Check failed: description.empty\\(\\) == description_from == "
+ "ax::mojom::DescriptionFrom::kAttributeExplicitlyEmpty");
+
+ // Setting the description to a non-empty string with a DescriptionFrom of
+ // kAttributeExplicitlyEmpty should trigger a DCHECK in OverrideDescription.
+ EXPECT_DCHECK_DEATH_WITH(
+ button_accessibility()->OverrideDescription(
+ "foo", ax::mojom::DescriptionFrom::kAttributeExplicitlyEmpty),
+ "Check failed: description.empty\\(\\) == description_from == "
+ "ax::mojom::DescriptionFrom::kAttributeExplicitlyEmpty");
+
+ button_accessibility()->OverrideDescription(
+ "", ax::mojom::DescriptionFrom::kAttributeExplicitlyEmpty);
+ EXPECT_EQ(button_accessibility()->GetDescription(), "");
+ EXPECT_EQ(button_accessibility()->GetDescriptionFrom(),
+ ax::mojom::DescriptionFrom::kAttributeExplicitlyEmpty);
+
+ // Overriding the name and description without specifying the sources
+ // should set the sources to kAttribute and kAriaDescription respectively.
+ button_accessibility()->OverrideName("Button's Name");
+ EXPECT_EQ(button_accessibility()->GetName(), "Button's Name");
+ EXPECT_EQ(button_accessibility()->GetNameFrom(),
+ ax::mojom::NameFrom::kAttribute);
+
+ button_accessibility()->OverrideDescription("Button's description");
+ EXPECT_EQ(button_accessibility()->GetDescription(), "Button's description");
+ EXPECT_EQ(button_accessibility()->GetDescriptionFrom(),
+ ax::mojom::DescriptionFrom::kAriaDescription);
+
+ // Initially the label has no name and no description.
+ EXPECT_EQ(label_accessibility()->GetName(), "");
+ EXPECT_EQ(label_accessibility()->GetDescription(), "");
+
+ // Set the name and description of the label using other source types
+ // for greater test coverage (i.e. rather than those types being the
+ // most appropriate choice.)
+ label_accessibility()->OverrideName("Label's Name",
+ ax::mojom::NameFrom::kContents);
+ EXPECT_EQ(label_accessibility()->GetName(), "Label's Name");
+ EXPECT_EQ(label_accessibility()->GetNameFrom(),
+ ax::mojom::NameFrom::kContents);
+
+ label_accessibility()->OverrideDescription(
+ "Label's description", ax::mojom::DescriptionFrom::kTitle);
+ EXPECT_EQ(label_accessibility()->GetDescription(), "Label's description");
+ EXPECT_EQ(label_accessibility()->GetDescriptionFrom(),
+ ax::mojom::DescriptionFrom::kTitle);
+
+ // Set the label's View as the name source of the accessible button.
+ // This should cause the previously-set name to be replaced with the
+ // accessible name of the label.
+ button_accessibility()->OverrideLabelledBy(label_);
+ EXPECT_EQ(button_accessibility()->GetName(), "Label's Name");
+ EXPECT_EQ(button_accessibility()->GetNameFrom(),
+ ax::mojom::NameFrom::kRelatedElement);
+
+ // Set the label's View as the description source of the accessible button.
+ // This should also remove the previously-set description.
+ button_accessibility()->OverrideDescribedBy(label_);
+ EXPECT_EQ(button_accessibility()->GetDescription(), "Label's Name");
+ EXPECT_EQ(button_accessibility()->GetDescriptionFrom(),
+ ax::mojom::DescriptionFrom::kRelatedElement);
+
+ // Setting the labelledby View to itself should trigger a DCHECK.
+ EXPECT_DCHECK_DEATH_WITH(button_accessibility()->OverrideLabelledBy(button_),
+ "Check failed: labelled_by_view != view_");
+}
+
TEST_F(ViewAXPlatformNodeDelegateTest, IsOrderedSet) {
View::Views group_ids = SetUpExtraViews();
SetUpExtraViewsGroups(group_ids);
@@ -1016,9 +1116,8 @@ TEST_F(AXViewTest, LayoutCalledInvalidateRootView) {
// this observer to simulate it.
AXAuraObjCache cache;
TestAXEventObserver observer(&cache);
- std::unique_ptr<Widget> widget(new Widget);
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget->Init(std::move(params));
widget->Show();
diff --git a/chromium/ui/views/accessibility/view_ax_platform_node_delegate_win_unittest.cc b/chromium/ui/views/accessibility/view_ax_platform_node_delegate_win_unittest.cc
index 36c6ea98f92..94b960d4351 100644
--- a/chromium/ui/views/accessibility/view_ax_platform_node_delegate_win_unittest.cc
+++ b/chromium/ui/views/accessibility/view_ax_platform_node_delegate_win_unittest.cc
@@ -23,6 +23,7 @@
#include "ui/views/controls/scroll_view.h"
#include "ui/views/controls/textfield/textfield.h"
#include "ui/views/test/views_test_base.h"
+#include "ui/views/widget/unique_widget_ptr.h"
using base::win::ScopedBstr;
using base::win::ScopedVariant;
@@ -95,12 +96,11 @@ class ViewAXPlatformNodeDelegateWinTest : public ViewsTestBase {
};
TEST_F(ViewAXPlatformNodeDelegateWinTest, TextfieldAccessibility) {
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- widget.Init(std::move(init_params));
+ widget->Init(std::move(init_params));
- View* content = widget.SetContentsView(std::make_unique<View>());
+ View* content = widget->SetContentsView(std::make_unique<View>());
Textfield* textfield = new Textfield;
textfield->SetAccessibleName(u"Name");
@@ -142,12 +142,11 @@ TEST_F(ViewAXPlatformNodeDelegateWinTest, TextfieldAccessibility) {
}
TEST_F(ViewAXPlatformNodeDelegateWinTest, TextfieldAssociatedLabel) {
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- widget.Init(std::move(init_params));
+ widget->Init(std::move(init_params));
- View* content = widget.SetContentsView(std::make_unique<View>());
+ View* content = widget->SetContentsView(std::make_unique<View>());
Label* label = new Label(u"Label");
content->AddChildView(label);
@@ -210,37 +209,35 @@ INSTANTIATE_TEST_SUITE_P(All,
TEST_P(ViewAXPlatformNodeDelegateWinTestWithBoolChildFlag, AuraChildWidgets) {
// Create the parent widget.
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams init_params =
CreateParams(Widget::InitParams::TYPE_WINDOW);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
init_params.bounds = gfx::Rect(0, 0, 400, 200);
- widget.Init(std::move(init_params));
- widget.Show();
+ widget->Init(std::move(init_params));
+ widget->Show();
// Initially it has 1 child.
ComPtr<IAccessible> root_view_accessible(
- widget.GetRootView()->GetNativeViewAccessible());
+ widget->GetRootView()->GetNativeViewAccessible());
LONG child_count = 0;
ASSERT_EQ(S_OK, root_view_accessible->get_accChildCount(&child_count));
ASSERT_EQ(1L, child_count);
// Create the child widget, one of two ways (see below).
- Widget child_widget;
+ UniqueWidgetPtr child_widget = std::make_unique<Widget>();
Widget::InitParams child_init_params =
CreateParams(Widget::InitParams::TYPE_BUBBLE);
- child_init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- child_init_params.parent = widget.GetNativeView();
+ child_init_params.parent = widget->GetNativeView();
child_init_params.bounds = gfx::Rect(30, 40, 100, 50);
// NOTE: this test is run two times, GetParam() returns a different
// value each time. The first time we test with child = false,
// making this an owned widget (a transient child). The second time
- // we test with child = true, making it a child widget.
+ // we test with child = true, making it a child widget->
child_init_params.child = GetParam();
- child_widget.Init(std::move(child_init_params));
- child_widget.Show();
+ child_widget->Init(std::move(child_init_params));
+ child_widget->Show();
// Now the IAccessible for the parent widget should have 2 children.
ASSERT_EQ(S_OK, root_view_accessible->get_accChildCount(&child_count));
@@ -257,7 +254,7 @@ TEST_P(ViewAXPlatformNodeDelegateWinTestWithBoolChildFlag, AuraChildWidgets) {
EXPECT_EQ(200, height);
// Get the IAccessible for the second child of the parent widget,
- // which should be the one for our child widget.
+ // which should be the one for our child widget->
ComPtr<IDispatch> child_widget_dispatch;
ComPtr<IAccessible> child_widget_accessible;
ScopedVariant child_index_2(2);
@@ -265,7 +262,7 @@ TEST_P(ViewAXPlatformNodeDelegateWinTestWithBoolChildFlag, AuraChildWidgets) {
&child_widget_dispatch));
ASSERT_EQ(S_OK, child_widget_dispatch.As(&child_widget_accessible));
- // Check the bounds of the IAccessible for the child widget.
+ // Check the bounds of the IAccessible for the child widget->
// This is a sanity check to make sure we have the right object
// and not some other view.
ASSERT_EQ(S_OK, child_widget_accessible->accLocation(&x, &y, &width, &height,
@@ -288,12 +285,11 @@ TEST_P(ViewAXPlatformNodeDelegateWinTestWithBoolChildFlag, AuraChildWidgets) {
// Flaky on Windows: https://crbug.com/461837.
TEST_F(ViewAXPlatformNodeDelegateWinTest, DISABLED_RetrieveAllAlerts) {
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- widget.Init(std::move(init_params));
+ widget->Init(std::move(init_params));
- View* content = widget.SetContentsView(std::make_unique<View>());
+ View* content = widget->SetContentsView(std::make_unique<View>());
View* infobar = new View;
content->AddChildView(infobar);
@@ -350,6 +346,7 @@ TEST_F(ViewAXPlatformNodeDelegateWinTest, DISABLED_RetrieveAllAlerts) {
}
// Test trying to retrieve child widgets during window close does not crash.
+// TODO(crbug.com/1218885): Remove this after WIDGET_OWNS_NATIVE_WIDGET is gone.
TEST_F(ViewAXPlatformNodeDelegateWinTest, GetAllOwnedWidgetsCrash) {
Widget widget;
Widget::InitParams init_params =
@@ -368,14 +365,14 @@ TEST_F(ViewAXPlatformNodeDelegateWinTest, GetAllOwnedWidgetsCrash) {
TEST_F(ViewAXPlatformNodeDelegateWinTest, WindowHasRoleApplication) {
// We expect that our internal window object does not expose
// ROLE_SYSTEM_WINDOW, but ROLE_SYSTEM_PANE instead.
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams init_params =
CreateParams(Widget::InitParams::TYPE_WINDOW);
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- widget.Init(std::move(init_params));
+ widget->Init(std::move(init_params));
ComPtr<IAccessible> accessible(
- widget.GetRootView()->GetNativeViewAccessible());
+ widget->GetRootView()->GetNativeViewAccessible());
ScopedVariant childid_self(CHILDID_SELF);
ScopedVariant role;
EXPECT_EQ(S_OK, accessible->get_accRole(childid_self, role.Receive()));
@@ -386,12 +383,11 @@ TEST_F(ViewAXPlatformNodeDelegateWinTest, WindowHasRoleApplication) {
TEST_F(ViewAXPlatformNodeDelegateWinTest, Overrides) {
// We expect that our internal window object does not expose
// ROLE_SYSTEM_WINDOW, but ROLE_SYSTEM_PANE instead.
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- widget.Init(std::move(init_params));
+ widget->Init(std::move(init_params));
- View* contents_view = widget.SetContentsView(std::make_unique<View>());
+ View* contents_view = widget->SetContentsView(std::make_unique<View>());
View* alert_view = new ScrollView;
alert_view->GetViewAccessibility().OverrideRole(ax::mojom::Role::kAlert);
@@ -444,12 +440,11 @@ TEST_F(ViewAXPlatformNodeDelegateWinTest, Overrides) {
}
TEST_F(ViewAXPlatformNodeDelegateWinTest, GridRowColumnCount) {
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- widget.Init(std::move(init_params));
+ widget->Init(std::move(init_params));
- View* content = widget.SetContentsView(std::make_unique<View>());
+ View* content = widget->SetContentsView(std::make_unique<View>());
TestListGridView* grid = new TestListGridView();
content->AddChildView(grid);
@@ -528,12 +523,11 @@ TEST_F(ViewAXPlatformNodeDelegateWinTest, IsUIAControlIsTrueEvenWhenReadonly) {
// Since we can't test IsUIAControl directly, we go through the
// UIA_IsControlElementPropertyId, which is computed using IsUIAControl.
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- widget.Init(std::move(init_params));
+ widget->Init(std::move(init_params));
- View* content = widget.SetContentsView(std::make_unique<View>());
+ View* content = widget->SetContentsView(std::make_unique<View>());
Textfield* text_field = new Textfield();
text_field->SetReadOnly(true);
@@ -557,12 +551,9 @@ class TestTableModel : public ui::TableModel {
TestTableModel& operator=(const TestTableModel&) = delete;
// ui::TableModel:
- int RowCount() override { return 3; }
-
- std::u16string GetText(int row, int column_id) override {
- if (row == -1)
- return std::u16string();
+ size_t RowCount() override { return 3; }
+ std::u16string GetText(size_t row, int column_id) override {
const char* const cells[5][3] = {
{"Australia", "24,584,620", "1,323,421,072,479"},
{"Spain", "46,647,428", "1,314,314,164,402"},
@@ -591,7 +582,7 @@ class ViewAXPlatformNodeDelegateWinTableTest
std::make_unique<TableView>(model_.get(), columns, TEXT_ONLY, true);
table_ = table.get();
- widget_ = new Widget;
+ widget_ = std::make_unique<Widget>();
Widget::InitParams init_params =
CreateParams(Widget::InitParams::TYPE_POPUP);
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
@@ -620,7 +611,7 @@ class ViewAXPlatformNodeDelegateWinTableTest
protected:
std::unique_ptr<TestTableModel> model_;
- raw_ptr<Widget> widget_ = nullptr;
+ UniqueWidgetPtr widget_;
raw_ptr<TableView> table_ = nullptr; // Owned by parent.
};
diff --git a/chromium/ui/views/accessibility/views_ax_tree_manager.cc b/chromium/ui/views/accessibility/views_ax_tree_manager.cc
index ac2e04c2d70..8e3d657c224 100644
--- a/chromium/ui/views/accessibility/views_ax_tree_manager.cc
+++ b/chromium/ui/views/accessibility/views_ax_tree_manager.cc
@@ -13,7 +13,6 @@
#include "ui/accessibility/accessibility_features.h"
#include "ui/accessibility/ax_action_data.h"
#include "ui/accessibility/ax_enums.mojom.h"
-#include "ui/accessibility/ax_tree_manager_map.h"
#include "ui/accessibility/ax_tree_source_checker.h"
#include "ui/accessibility/ax_tree_update.h"
#include "ui/views/accessibility/ax_aura_obj_wrapper.h"
@@ -24,14 +23,13 @@
namespace views {
ViewsAXTreeManager::ViewsAXTreeManager(Widget* widget)
- : widget_(widget),
- tree_id_(ui::AXTreeID::CreateNewAXTreeID()),
- tree_source_(cache_.GetOrCreate(widget), tree_id_, &cache_),
- tree_serializer_(&tree_source_),
- event_generator_(&ax_tree_) {
+ : ui::AXTreeManager(ui::AXTreeID::CreateNewAXTreeID(),
+ std::make_unique<ui::AXTree>()),
+ widget_(widget),
+ tree_source_(cache_.GetOrCreate(widget), ax_tree_id_, &cache_),
+ tree_serializer_(&tree_source_) {
DCHECK(widget);
- ui::AXTreeManagerMap::GetInstance().AddTreeManager(tree_id_, this);
- views::WidgetAXTreeIDMap::GetInstance().AddWidget(tree_id_, widget);
+ views::WidgetAXTreeIDMap::GetInstance().AddWidget(ax_tree_id_, widget);
views_event_observer_.Observe(AXEventManager::Get());
widget_observer_.Observe(widget);
@@ -46,10 +44,8 @@ ViewsAXTreeManager::ViewsAXTreeManager(Widget* widget)
}
ViewsAXTreeManager::~ViewsAXTreeManager() {
- event_generator_.ReleaseTree();
views_event_observer_.Reset();
widget_observer_.Reset();
- ui::AXTreeManagerMap::GetInstance().RemoveTreeManager(tree_id_);
}
void ViewsAXTreeManager::SetGeneratedEventCallbackForTesting(
@@ -67,21 +63,16 @@ ui::AXNode* ViewsAXTreeManager::GetNodeFromTree(
if (!widget_ || !widget_->GetRootView())
return nullptr;
- const ui::AXTreeManager* manager =
- ui::AXTreeManagerMap::GetInstance().GetManager(tree_id);
+ const ui::AXTreeManager* manager = ui::AXTreeManager::FromID(tree_id);
return manager ? manager->GetNodeFromTree(node_id) : nullptr;
}
ui::AXNode* ViewsAXTreeManager::GetNodeFromTree(
const ui::AXNodeID node_id) const {
- if (!widget_ || !widget_->GetRootView())
+ if (!widget_ || !widget_->GetRootView() || !ax_tree_)
return nullptr;
- return ax_tree_.GetFromId(node_id);
-}
-
-ui::AXTreeID ViewsAXTreeManager::GetTreeID() const {
- return tree_id_;
+ return ax_tree_->GetFromId(node_id);
}
ui::AXTreeID ViewsAXTreeManager::GetParentTreeID() const {
@@ -90,23 +81,12 @@ ui::AXTreeID ViewsAXTreeManager::GetParentTreeID() const {
return ui::AXTreeIDUnknown();
}
-ui::AXNode* ViewsAXTreeManager::GetRootAsAXNode() const {
- if (!widget_ || !widget_->GetRootView())
- return nullptr;
-
- return ax_tree_.root();
-}
-
ui::AXNode* ViewsAXTreeManager::GetParentNodeFromParentTreeAsAXNode() const {
// TODO(nektar): Implement stiching of AXTrees, e.g. a dialog to the main
// window.
return nullptr;
}
-std::string ViewsAXTreeManager::ToString() const {
- return "<ViewsAXTreeManager>";
-}
-
void ViewsAXTreeManager::OnViewEvent(View* view, ax::mojom::Event event) {
DCHECK(view);
AXAuraObjWrapper* wrapper = cache_.GetOrCreate(view);
@@ -174,12 +154,12 @@ void ViewsAXTreeManager::SerializeTreeUpdates() {
void ViewsAXTreeManager::UnserializeTreeUpdates(
const std::vector<ui::AXTreeUpdate>& updates) {
- if (!widget_ || !widget_->GetRootView())
+ if (!widget_ || !widget_->GetRootView() || !ax_tree_)
return;
for (const ui::AXTreeUpdate& update : updates) {
- if (!ax_tree_.Unserialize(update)) {
- NOTREACHED() << ax_tree_.error();
+ if (!ax_tree_->Unserialize(update)) {
+ NOTREACHED() << ax_tree_->error();
return;
}
}
@@ -188,7 +168,7 @@ void ViewsAXTreeManager::UnserializeTreeUpdates(
// AXEventGenerator to generate events based on the updates.
for (const ui::AXEventGenerator::TargetedEvent& targeted_event :
event_generator_) {
- if (ui::AXNode* node = ax_tree().GetFromId(targeted_event.node_id))
+ if (ui::AXNode* node = ax_tree_->GetFromId(targeted_event.node_id))
FireGeneratedEvent(targeted_event.event_params.event, *node);
}
event_generator_.ClearEvents();
diff --git a/chromium/ui/views/accessibility/views_ax_tree_manager.h b/chromium/ui/views/accessibility/views_ax_tree_manager.h
index 0dd8e07ffa6..651c013cf37 100644
--- a/chromium/ui/views/accessibility/views_ax_tree_manager.h
+++ b/chromium/ui/views/accessibility/views_ax_tree_manager.h
@@ -16,7 +16,6 @@
#include "base/scoped_observation.h"
#include "ui/accessibility/ax_action_handler.h"
#include "ui/accessibility/ax_enums.mojom-forward.h"
-#include "ui/accessibility/ax_event_generator.h"
#include "ui/accessibility/ax_node.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/accessibility/ax_tree.h"
@@ -70,9 +69,6 @@ class VIEWS_EXPORT ViewsAXTreeManager : public ui::AXTreeManager,
ViewsAXTreeManager(const ViewsAXTreeManager& manager) = delete;
ViewsAXTreeManager& operator=(const ViewsAXTreeManager& manager) = delete;
- // Returns a reference to the managed AXTree.
- const ui::AXTree& ax_tree() const { return ax_tree_; }
-
// For testing only, register a function to be called when a generated event
// is fired from this ViewsAXTreeManager.
void SetGeneratedEventCallbackForTesting(
@@ -86,11 +82,8 @@ class VIEWS_EXPORT ViewsAXTreeManager : public ui::AXTreeManager,
ui::AXNode* GetNodeFromTree(const ui::AXTreeID tree_id,
const ui::AXNodeID node_id) const override;
ui::AXNode* GetNodeFromTree(const ui::AXNodeID node_id) const override;
- ui::AXTreeID GetTreeID() const override;
ui::AXTreeID GetParentTreeID() const override;
- ui::AXNode* GetRootAsAXNode() const override;
ui::AXNode* GetParentNodeFromParentTreeAsAXNode() const override;
- std::string ToString() const override;
// AXActionHandlerBase implementation.
void PerformAction(const ui::AXActionData& data) override;
@@ -132,13 +125,6 @@ class VIEWS_EXPORT ViewsAXTreeManager : public ui::AXTreeManager,
// that are used to serialize the Views tree.
AXAuraObjCache cache_;
- // The ID for this AXTree.
- ui::AXTreeID tree_id_;
-
- // The AXTree that mirrors the Views tree and which is created by
- // deserializing the updates from |tree_source_|.
- ui::AXTree ax_tree_;
-
// The tree source that enables us to serialize the Views tree.
AXTreeSourceViews tree_source_;
@@ -146,9 +132,6 @@ class VIEWS_EXPORT ViewsAXTreeManager : public ui::AXTreeManager,
// AXTreeUpdate.
ViewsAXTreeSerializer tree_serializer_;
- // For automatically generating events based on changes to |tree_|.
- ui::AXEventGenerator event_generator_;
-
// For testing only: A function to call when a generated event is fired.
GeneratedEventCallbackForTesting generated_event_callback_for_testing_;
diff --git a/chromium/ui/views/accessibility/views_ax_tree_manager_unittest.cc b/chromium/ui/views/accessibility/views_ax_tree_manager_unittest.cc
index d4a7261ba36..6d4f5c9d01b 100644
--- a/chromium/ui/views/accessibility/views_ax_tree_manager_unittest.cc
+++ b/chromium/ui/views/accessibility/views_ax_tree_manager_unittest.cc
@@ -29,6 +29,7 @@
#include "ui/views/controls/label.h"
#include "ui/views/test/views_test_base.h"
#include "ui/views/view.h"
+#include "ui/views/widget/unique_widget_ptr.h"
#include "ui/views/widget/widget.h"
namespace views {
@@ -48,7 +49,6 @@ class ViewsAXTreeManagerTest : public ViewsTestBase,
public ::testing::WithParamInterface<bool> {
public:
ViewsAXTreeManagerTest() = default;
- ~ViewsAXTreeManagerTest() override = default;
ViewsAXTreeManagerTest(const ViewsAXTreeManagerTest&) = delete;
ViewsAXTreeManagerTest& operator=(const ViewsAXTreeManagerTest&) = delete;
@@ -60,12 +60,19 @@ class ViewsAXTreeManagerTest : public ViewsTestBase,
const std::string& name_or_value) const;
void WaitFor(const ui::AXEventGenerator::Event event);
- Widget* widget() const { return widget_; }
+ Widget* widget() const { return widget_.get(); }
Button* button() const { return button_; }
Label* label() const { return label_; }
- ViewsAXTreeManager* manager() const { return manager_.get(); }
+ ViewsAXTreeManager* manager() const {
+ return features::IsAccessibilityTreeForViewsEnabled()
+ ? absl::get<raw_ptr<ViewsAXTreeManager>>(manager_).get()
+ : absl::get<std::unique_ptr<ViewsAXTreeManager>>(manager_).get();
+ }
private:
+ using TestOwnedManager = std::unique_ptr<ViewsAXTreeManager>;
+ using WidgetOwnedManager = raw_ptr<ViewsAXTreeManager>;
+
ui::AXNode* FindNodeInSubtree(ui::AXNode* root,
const ax::mojom::Role role,
const std::string& name_or_value) const;
@@ -73,10 +80,10 @@ class ViewsAXTreeManagerTest : public ViewsTestBase,
ui::AXEventGenerator::Event event,
ui::AXNodeID node_id);
- raw_ptr<Widget> widget_ = nullptr;
+ UniqueWidgetPtr widget_;
raw_ptr<Button> button_ = nullptr;
raw_ptr<Label> label_ = nullptr;
- std::unique_ptr<ViewsAXTreeManager> manager_;
+ absl::variant<TestOwnedManager, WidgetOwnedManager> manager_;
ui::AXEventGenerator::Event event_to_wait_for_;
std::unique_ptr<base::RunLoop> loop_runner_;
base::test::ScopedFeatureList scoped_feature_list_;
@@ -90,9 +97,8 @@ void ViewsAXTreeManagerTest::SetUp() {
{features::kEnableAccessibilityTreeForViews}, {});
}
- widget_ = new Widget;
+ widget_ = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(0, 0, 200, 200);
widget_->Init(std::move(params));
@@ -108,22 +114,25 @@ void ViewsAXTreeManagerTest::SetUp() {
// AccessibilityTreeForViewsEnabled will create and manage its own
// ViewsAXTreeManager, so we don't need to create one for testing.
if (features::IsAccessibilityTreeForViewsEnabled()) {
- manager_.reset(
- widget_->GetRootView()->GetViewAccessibility().AXTreeManager());
+ manager_ = widget_->GetRootView()->GetViewAccessibility().AXTreeManager();
} else {
- manager_ = std::make_unique<ViewsAXTreeManager>(widget_);
+ manager_ = std::make_unique<ViewsAXTreeManager>(widget_.get());
}
- ASSERT_NE(nullptr, manager_);
+ ASSERT_NE(nullptr, manager());
manager()->SetGeneratedEventCallbackForTesting(base::BindRepeating(
&ViewsAXTreeManagerTest::OnGeneratedEvent, base::Unretained(this)));
- WaitFor(ui::AXEventGenerator::Event::LOAD_COMPLETE);
+ WaitFor(ui::AXEventGenerator::Event::SUBTREE_CREATED);
}
void ViewsAXTreeManagerTest::TearDown() {
if (manager())
manager()->UnsetGeneratedEventCallbackForTesting();
- manager_.reset();
+ if (features::IsAccessibilityTreeForViewsEnabled())
+ manager_.emplace<WidgetOwnedManager>(nullptr);
+ else
+ manager_.emplace<TestOwnedManager>(nullptr);
+
CloseWidget();
ViewsTestBase::TearDown();
}
@@ -215,23 +224,6 @@ TEST_P(ViewsAXTreeManagerTest, PerformAction) {
WaitFor(ui::AXEventGenerator::Event::CHECKED_STATE_CHANGED);
}
-TEST_P(ViewsAXTreeManagerTest, CloseWidget) {
- // This test is only relevant when IsAccessibilityTreeForViewsEnabled is set,
- // as it tests the lifetime management of ViewsAXTreeManager when a Widget is
- // closed.
- if (!features::IsAccessibilityTreeForViewsEnabled())
- return;
-
- ui::AXNode* ax_button = FindNode(ax::mojom::Role::kButton, "");
- ASSERT_NE(nullptr, ax_button);
-
- CloseWidget();
-
- // Looking up a node after its Widget has been closed should return nullptr.
- ax_button = FindNode(ax::mojom::Role::kButton, "");
- EXPECT_EQ(nullptr, ax_button);
-}
-
TEST_P(ViewsAXTreeManagerTest, MultipleTopLevelWidgets) {
// This test is only relevant when IsAccessibilityTreeForViewsEnabled is set,
// as it tests the lifetime management of ViewsAXTreeManager when a Widget is
@@ -239,9 +231,8 @@ TEST_P(ViewsAXTreeManagerTest, MultipleTopLevelWidgets) {
if (!features::IsAccessibilityTreeForViewsEnabled())
return;
- std::unique_ptr<Widget> second_widget = std::make_unique<Widget>();
+ UniqueWidgetPtr second_widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(0, 0, 200, 200);
second_widget->Init(std::move(params));
diff --git a/chromium/ui/views/accessible_pane_view_unittest.cc b/chromium/ui/views/accessible_pane_view_unittest.cc
index 5109474a47a..f9ba7f1db98 100644
--- a/chromium/ui/views/accessible_pane_view_unittest.cc
+++ b/chromium/ui/views/accessible_pane_view_unittest.cc
@@ -42,7 +42,8 @@ class TestBarView : public AccessiblePaneView {
void Init();
raw_ptr<LabelButton> child_button_;
- raw_ptr<LabelButton> second_child_button_;
+ // TODO(crbug.com/1298696): Breaks views_unittests.
+ raw_ptr<LabelButton, DegradeToNoOpWhenMTE> second_child_button_;
raw_ptr<LabelButton> third_child_button_;
std::unique_ptr<LabelButton> not_child_button_;
};
diff --git a/chromium/ui/views/animation/animation_builder.h b/chromium/ui/views/animation/animation_builder.h
index fcf10bf7057..4649d70d999 100644
--- a/chromium/ui/views/animation/animation_builder.h
+++ b/chromium/ui/views/animation/animation_builder.h
@@ -30,6 +30,22 @@ namespace views {
class AnimationAbortHandle;
// Provides an unfinalized animation sequence block if any to build animations.
+
+// Usage notes for callbacks set on AnimationBuilder:
+// When setting callbacks for the animations note that the AnimationBuilder’s
+// observer that calls these callbacks may outlive the callback's parameters.
+
+// The OnEnded callback runs when all animations created on the AnimationBuilder
+// have finished. The OnAborted callback runs when any one animation created on
+// the AnimationBuilder has been aborted. Therefore, these callbacks and every
+// object the callback accesses needs to outlive all the Layers/LayerOwners
+// being animated on since the Layers ultimately own the objects that run the
+// animation. Otherwise, developers may need to use weak pointers or force
+// animations to be cancelled in the object’s destructor to prevent accessing
+// destroyed objects. Note that aborted notifications can be sent during the
+// destruction process. Therefore subclasses that own the Layers may actually be
+// destroyed before the OnAborted callback is run.
+
class VIEWS_EXPORT AnimationBuilder {
public:
class Observer : public ui::LayerAnimationObserver {
diff --git a/chromium/ui/views/animation/animation_delegate_views.cc b/chromium/ui/views/animation/animation_delegate_views.cc
index 98ee17f8c14..541f94f5463 100644
--- a/chromium/ui/views/animation/animation_delegate_views.cc
+++ b/chromium/ui/views/animation/animation_delegate_views.cc
@@ -81,11 +81,14 @@ void AnimationDelegateViews::UpdateAnimationRunner(
}
void AnimationDelegateViews::ClearAnimationRunner() {
+ // `compositor_animation_runner_` holds a pointer owned by `container_`, so
+ // we need to release it before `container_` actually releases the memory it
+ // points to.
+ compositor_animation_runner_ = nullptr;
// TODO(https://crbug.com/960621): make sure the container has a correct
// compositor-assisted runner.
if (container_)
container_->SetAnimationRunner(nullptr);
- compositor_animation_runner_ = nullptr;
}
} // namespace views
diff --git a/chromium/ui/views/animation/animation_delegate_views.h b/chromium/ui/views/animation/animation_delegate_views.h
index 2c6cfbd65d7..da01fe11f4f 100644
--- a/chromium/ui/views/animation/animation_delegate_views.h
+++ b/chromium/ui/views/animation/animation_delegate_views.h
@@ -59,7 +59,8 @@ class VIEWS_EXPORT AnimationDelegateViews
void ClearAnimationRunner();
raw_ptr<View> view_;
- raw_ptr<gfx::AnimationContainer> container_ = nullptr;
+ // TODO(crbug.com/1298696): Breaks views_unittests.
+ raw_ptr<gfx::AnimationContainer, DegradeToNoOpWhenMTE> container_ = nullptr;
// The animation runner that |container_| uses.
raw_ptr<CompositorAnimationRunner> compositor_animation_runner_ = nullptr;
diff --git a/chromium/ui/views/animation/bounds_animator.cc b/chromium/ui/views/animation/bounds_animator.cc
index 312efee14d3..34585848a0d 100644
--- a/chromium/ui/views/animation/bounds_animator.cc
+++ b/chromium/ui/views/animation/bounds_animator.cc
@@ -52,8 +52,13 @@ void BoundsAnimator::AnimateViewTo(
// Return early if the existing animation on |view| has the same target
// bounds.
- if (is_animating && target == data_[view].target_bounds)
+ if (is_animating && target == data_[view].target_bounds) {
+ // If this animation specifies a different delegate, swap them out.
+ if (delegate && delegate != data_[view].delegate)
+ SetAnimationDelegate(view, std::move(delegate));
+
return;
+ }
Data existing_data;
if (is_animating) {
@@ -156,6 +161,17 @@ bool BoundsAnimator::IsAnimating() const {
return !data_.empty();
}
+void BoundsAnimator::Complete() {
+ if (data_.empty())
+ return;
+
+ while (!data_.empty())
+ data_.begin()->second.animation->End();
+
+ // Invoke AnimationContainerProgressed to force a repaint and notify delegate.
+ AnimationContainerProgressed(container_.get());
+}
+
void BoundsAnimator::Cancel() {
if (data_.empty())
return;
@@ -237,6 +253,13 @@ void BoundsAnimator::AnimationEndedOrCanceled(const gfx::Animation* animation,
View* view = animation_to_view_[animation];
DCHECK(view);
+ // Notify the delegate so it has a chance to paint the final state of a
+ // completed animation.
+ if (type == AnimationEndType::kEnded) {
+ DCHECK_EQ(animation->GetCurrentValue(), 1.0);
+ AnimationProgressed(animation);
+ }
+
// Save the data for later clean up.
Data data = RemoveFromMaps(view);
diff --git a/chromium/ui/views/animation/bounds_animator.h b/chromium/ui/views/animation/bounds_animator.h
index 87364f55e41..20a08706596 100644
--- a/chromium/ui/views/animation/bounds_animator.h
+++ b/chromium/ui/views/animation/bounds_animator.h
@@ -87,6 +87,10 @@ class VIEWS_EXPORT BoundsAnimator : public AnimationDelegateViews {
// Returns true if BoundsAnimator is animating any view.
bool IsAnimating() const;
+ // Finishes all animations, teleporting the views to their target bounds. Any
+ // views marked for deletion are deleted.
+ void Complete();
+
// Cancels all animations, leaving the views at their current location and
// size. Any views marked for deletion are deleted.
void Cancel();
diff --git a/chromium/ui/views/animation/bounds_animator_unittest.cc b/chromium/ui/views/animation/bounds_animator_unittest.cc
index 303b6c952ac..1e0165ea649 100644
--- a/chromium/ui/views/animation/bounds_animator_unittest.cc
+++ b/chromium/ui/views/animation/bounds_animator_unittest.cc
@@ -200,7 +200,9 @@ class BoundsAnimatorTest : public testing::Test {
private:
TestView parent_;
- raw_ptr<TestView> child_; // Owned by |parent_|.
+ // TODO(crbug.com/1298696): views_unittests breaks with MTECheckedPtr
+ // enabled. Triage.
+ raw_ptr<TestView, DegradeToNoOpWhenMTE> child_; // Owned by |parent_|.
std::unique_ptr<BoundsAnimator> animator_;
};
@@ -295,6 +297,25 @@ TEST_F(BoundsAnimatorTest, HandleDuplicateAnimation) {
EXPECT_FALSE(OwnedDelegate::GetAndClearCanceled());
}
+// Make sure that a duplicate animation request that specifies a different
+// delegate swaps out that delegate.
+TEST_F(BoundsAnimatorTest, DuplicateAnimationsCanReplaceDelegate) {
+ const gfx::Rect target_bounds(0, 0, 10, 10);
+
+ animator()->AnimateViewTo(child(), target_bounds);
+ animator()->SetAnimationDelegate(child(), std::make_unique<OwnedDelegate>());
+
+ // Request the animation with the same view/target bounds but a different
+ // delegate.
+ animator()->AnimateViewTo(child(), target_bounds,
+ std::make_unique<OwnedDelegate>());
+
+ // Verify that the delegate was replaced.
+ EXPECT_TRUE(OwnedDelegate::GetAndClearDeleted());
+ // The animation still should not have been canceled.
+ EXPECT_FALSE(OwnedDelegate::GetAndClearCanceled());
+}
+
// Makes sure StopAnimating works.
TEST_F(BoundsAnimatorTest, StopAnimating) {
std::unique_ptr<OwnedDelegate> delegate(std::make_unique<OwnedDelegate>());
@@ -313,6 +334,28 @@ TEST_F(BoundsAnimatorTest, StopAnimating) {
EXPECT_TRUE(OwnedDelegate::GetAndClearCanceled());
}
+// Make sure Complete completes in-progress animations.
+TEST_F(BoundsAnimatorTest, CompleteAnimation) {
+ std::unique_ptr<OwnedDelegate> delegate(std::make_unique<OwnedDelegate>());
+ const gfx::Rect target_bounds = gfx::Rect(0, 0, 10, 10);
+
+ animator()->AnimateViewTo(child(), target_bounds);
+ animator()->SetAnimationDelegate(child(), std::make_unique<OwnedDelegate>());
+
+ animator()->Complete();
+
+ // Shouldn't be animating now.
+ EXPECT_FALSE(animator()->IsAnimating());
+ EXPECT_FALSE(animator()->IsAnimating(child()));
+
+ // Child should have been moved to the animation's target.
+ EXPECT_EQ(target_bounds, child()->bounds());
+
+ // Completing should delete the delegate.
+ EXPECT_TRUE(OwnedDelegate::GetAndClearDeleted());
+ EXPECT_FALSE(OwnedDelegate::GetAndClearCanceled());
+}
+
// Verify that transform is used when the animation target bounds have the
// same size with the current bounds' meanwhile having the transform option
// enabled.
diff --git a/chromium/ui/views/animation/ink_drop_event_handler.cc b/chromium/ui/views/animation/ink_drop_event_handler.cc
index af6b440cc68..086b37419a8 100644
--- a/chromium/ui/views/animation/ink_drop_event_handler.cc
+++ b/chromium/ui/views/animation/ink_drop_event_handler.cc
@@ -48,7 +48,7 @@ void InkDropEventHandler::AnimateToState(InkDropState state,
}
#endif
last_ripple_triggering_event_.reset(
- event ? ui::Event::Clone(*event).release()->AsLocatedEvent() : nullptr);
+ event ? event->Clone().release()->AsLocatedEvent() : nullptr);
// If no ink drop exists and we are not transitioning to a visible ink drop
// state the transition have no visual effect. The call to GetInkDrop() will
diff --git a/chromium/ui/views/bubble/bubble_border.cc b/chromium/ui/views/bubble/bubble_border.cc
index 531b894f37b..1bbb0074dd4 100644
--- a/chromium/ui/views/bubble/bubble_border.cc
+++ b/chromium/ui/views/bubble/bubble_border.cc
@@ -41,9 +41,9 @@ namespace views {
namespace {
// GetShadowValues and GetBorderAndShadowFlags cache their results. The shadow
-// values depend on both the shadow elevation and color, so we create a tuple to
-// key the cache.
-using ShadowCacheKey = std::tuple<int, SkColor>;
+// values depend on the shadow elevation, color and shadow type, so we create a
+// tuple to key the cache.
+using ShadowCacheKey = std::tuple<int, SkColor, BubbleBorder::Shadow>;
SkColor GetKeyShadowColor(int elevation,
const ui::ColorProvider* color_provider) {
@@ -143,7 +143,7 @@ const gfx::ShadowValues& GetShadowValues(
// construct them once and cache.
static base::NoDestructor<std::map<ShadowCacheKey, gfx::ShadowValues>>
shadow_map;
- ShadowCacheKey key(elevation.value_or(-1), color);
+ ShadowCacheKey key(elevation.value_or(-1), color, shadow_type);
if (shadow_map->find(key) != shadow_map->end())
return shadow_map->find(key)->second;
@@ -200,7 +200,8 @@ const cc::PaintFlags& GetBorderAndShadowFlags(
// construct them once and cache.
static base::NoDestructor<std::map<ShadowCacheKey, cc::PaintFlags>> flag_map;
ShadowCacheKey key(elevation.value_or(-1),
- color_provider->GetColor(ui::kColorShadowBase));
+ color_provider->GetColor(ui::kColorShadowBase),
+ shadow_type);
if (flag_map->find(key) != flag_map->end())
return flag_map->find(key)->second;
@@ -666,7 +667,7 @@ void BubbleBorder::PaintNoShadow(const View& view, gfx::Canvas* canvas) {
gfx::ScopedCanvas scoped(canvas);
canvas->sk_canvas()->clipRRect(GetClientRect(view), SkClipOp::kDifference,
true /*doAntiAlias*/);
- canvas->sk_canvas()->drawColor(SK_ColorTRANSPARENT, SkBlendMode::kSrc);
+ canvas->sk_canvas()->drawColor(SkColors::kTransparent, SkBlendMode::kSrc);
}
void BubbleBorder::PaintNoShadowLegacy(const View& view, gfx::Canvas* canvas) {
diff --git a/chromium/ui/views/bubble/bubble_dialog_delegate_view.cc b/chromium/ui/views/bubble/bubble_dialog_delegate_view.cc
index b6792b3bd09..7d3f9f75de6 100644
--- a/chromium/ui/views/bubble/bubble_dialog_delegate_view.cc
+++ b/chromium/ui/views/bubble/bubble_dialog_delegate_view.cc
@@ -621,6 +621,17 @@ View* BubbleDialogDelegate::GetAnchorView() const {
return anchor_view_observer_->anchor_view();
}
+void BubbleDialogDelegate::SetMainImage(ui::ImageModel main_image) {
+ // Adding a main image while the bubble is showing is not supported (but
+ // changing it is). Adding an image while it's showing would require a jarring
+ // re-layout.
+ if (main_image_.IsEmpty())
+ DCHECK(!GetBubbleFrameView());
+ main_image_ = std::move(main_image);
+ if (GetBubbleFrameView())
+ GetBubbleFrameView()->UpdateMainImage();
+}
+
bool BubbleDialogDelegate::ShouldCloseOnDeactivate() const {
return close_on_deactivate_ && !close_on_deactivate_pins_->is_pinned();
}
@@ -679,10 +690,13 @@ gfx::Rect BubbleDialogDelegate::GetAnchorRect() const {
// TODO(sammiequon): Investigate if we can remove |anchor_widget_| and just
// replace its calls with GetAnchorView()->GetWidget().
DCHECK_EQ(anchor_widget_, GetAnchorView()->GetWidget());
- gfx::Transform transform =
- anchor_widget_->GetNativeWindow()->layer()->GetTargetTransform();
- if (!transform.IsIdentity())
- anchor_rect_->Offset(-gfx::ToRoundedVector2d(transform.To2dTranslation()));
+ if (anchor_widget_) {
+ gfx::Transform transform =
+ anchor_widget_->GetNativeWindow()->layer()->GetTargetTransform();
+ if (!transform.IsIdentity())
+ anchor_rect_->Offset(
+ -gfx::ToRoundedVector2d(transform.To2dTranslation()));
+ }
#endif
return anchor_rect_.value();
diff --git a/chromium/ui/views/bubble/bubble_dialog_delegate_view.h b/chromium/ui/views/bubble/bubble_dialog_delegate_view.h
index aa2cf0f7e27..3eb7ecae6ec 100644
--- a/chromium/ui/views/bubble/bubble_dialog_delegate_view.h
+++ b/chromium/ui/views/bubble/bubble_dialog_delegate_view.h
@@ -68,6 +68,9 @@ class VIEWS_EXPORT BubbleDialogDelegate : public DialogDelegate {
void SetAnchorView(View* view);
View* GetAnchorView() const;
+ void SetMainImage(ui::ImageModel main_image);
+ const ui::ImageModel& GetMainImage() const { return main_image_; }
+
// GetAnchorRect() takes into account the presence of an anchor view, while
// anchor_rect() always returns the configured anchor rect, regardless of
// whether there is also an anchor view. While it is possible to override
@@ -376,7 +379,7 @@ class VIEWS_EXPORT BubbleDialogDelegate : public DialogDelegate {
BubbleBorder::Shadow shadow_;
SkColor color_ = gfx::kPlaceholderColor;
bool color_explicitly_set_ = false;
- raw_ptr<Widget> anchor_widget_ = nullptr;
+ raw_ptr<Widget, DanglingUntriaged> anchor_widget_ = nullptr;
std::unique_ptr<AnchorViewObserver> anchor_view_observer_;
std::unique_ptr<AnchorWidgetObserver> anchor_widget_observer_;
std::unique_ptr<BubbleWidgetObserver> bubble_widget_observer_;
@@ -384,6 +387,7 @@ class VIEWS_EXPORT BubbleDialogDelegate : public DialogDelegate {
bool adjust_if_offscreen_ = true;
bool focus_traversable_from_anchor_view_ = true;
ViewTracker highlighted_button_tracker_;
+ ui::ImageModel main_image_;
// A flag controlling bubble closure on deactivation.
bool close_on_deactivate_ = true;
@@ -486,6 +490,7 @@ VIEW_BUILDER_VIEW_TYPE_PROPERTY(views::View, FootnoteView)
VIEW_BUILDER_PROPERTY(bool, FocusTraversesOut)
VIEW_BUILDER_PROPERTY(bool, EnableArrowKeyTraversal)
VIEW_BUILDER_PROPERTY(gfx::ImageSkia, Icon)
+VIEW_BUILDER_PROPERTY(gfx::ImageSkia, MainImage)
VIEW_BUILDER_PROPERTY(gfx::ImageSkia, AppIcon)
VIEW_BUILDER_PROPERTY(ui::ModalType, ModalType)
VIEW_BUILDER_PROPERTY(bool, OwnedByWidget)
diff --git a/chromium/ui/views/bubble/bubble_dialog_model_host.cc b/chromium/ui/views/bubble/bubble_dialog_model_host.cc
index dfd8156bb00..5007366cbd4 100644
--- a/chromium/ui/views/bubble/bubble_dialog_model_host.cc
+++ b/chromium/ui/views/bubble/bubble_dialog_model_host.cc
@@ -64,6 +64,25 @@ BubbleDialogModelHost::FieldType GetFieldTypeForField(
}
}
+int GetFieldTopMargin(LayoutProvider* layout_provider,
+ const BubbleDialogModelHost::FieldType& field_type,
+ const BubbleDialogModelHost::FieldType& last_field_type) {
+ DCHECK(layout_provider);
+ // Menu item preceded by non-menu item should have margin
+ if (field_type == BubbleDialogModelHost::FieldType::kMenuItem &&
+ last_field_type == BubbleDialogModelHost::FieldType::kMenuItem) {
+ return 0;
+ }
+ if (field_type == BubbleDialogModelHost::FieldType::kControl &&
+ last_field_type == BubbleDialogModelHost::FieldType::kControl) {
+ // TODO(pbos): Move DISTANCE_CONTROL_LIST_VERTICAL to views::LayoutProvider
+ // and replace "12" here.
+ return 12;
+ }
+ return layout_provider->GetDistanceMetric(
+ DISTANCE_UNRELATED_CONTROL_VERTICAL);
+}
+
int GetDialogTopMargins(LayoutProvider* layout_provider,
ui::DialogModelField* first_field,
base::PassKey<ui::DialogModelHost> pass_key) {
@@ -353,6 +372,9 @@ BubbleDialogModelHost::BubbleDialogModelHost(
SetTitle(model_->title(GetPassKey()));
+ if (!model_->main_image(GetPassKey()).IsEmpty())
+ SetMainImage(model_->main_image(GetPassKey()));
+
if (model_->override_show_close_button(GetPassKey())) {
SetShowCloseButton(*model_->override_show_close_button(GetPassKey()));
} else {
@@ -556,19 +578,12 @@ void BubbleDialogModelHost::UpdateSpacingAndMargins() {
first_field = field;
view->SetProperty(kMarginsKey, side_insets);
} else {
- int padding_margin = field_type == FieldType::kMenuItem
- ? 0
- : layout_provider->GetDistanceMetric(
- DISTANCE_UNRELATED_CONTROL_VERTICAL);
- if (last_field &&
- GetFieldTypeForField(last_field, GetPassKey()) ==
- FieldType::kControl &&
- field_type == FieldType::kControl) {
- // TODO(pbos): Move DISTANCE_CONTROL_LIST_VERTICAL to
- // views::LayoutProvider and replace "12" here.
- padding_margin = 12;
- }
- side_insets.set_top(padding_margin);
+ DCHECK(last_field);
+
+ FieldType last_field_type =
+ GetFieldTypeForField(last_field, GetPassKey());
+ side_insets.set_top(
+ GetFieldTopMargin(layout_provider, field_type, last_field_type));
view->SetProperty(kMarginsKey, side_insets);
}
last_field = field;
@@ -649,8 +664,8 @@ void BubbleDialogModelHost::AddOrUpdateCombobox(
combobox->AddSelectedIndexChangedCallback(base::BindRepeating(
[](ui::DialogModelCombobox* model_field,
base::PassKey<DialogModelHost> pass_key, Combobox* combobox) {
- model_field->OnSelectedIndexChanged(pass_key,
- combobox->GetSelectedIndex());
+ model_field->OnSelectedIndexChanged(
+ pass_key, combobox->GetSelectedIndex().value());
},
model_field, GetPassKey(), combobox.get())));
const gfx::FontList& font_list = combobox->GetFontList();
diff --git a/chromium/ui/views/bubble/bubble_frame_view.cc b/chromium/ui/views/bubble/bubble_frame_view.cc
index 97bb6ec9359..0f35eebca9a 100644
--- a/chromium/ui/views/bubble/bubble_frame_view.cc
+++ b/chromium/ui/views/bubble/bubble_frame_view.cc
@@ -25,9 +25,11 @@
#include "ui/gfx/geometry/rounded_corners_f.h"
#include "ui/gfx/geometry/skia_conversions.h"
#include "ui/gfx/geometry/vector2d.h"
+#include "ui/gfx/image/image_skia_operations.h"
#include "ui/resources/grit/ui_resources.h"
#include "ui/strings/grit/ui_strings.h"
#include "ui/views/accessibility/view_accessibility.h"
+#include "ui/views/border.h"
#include "ui/views/bubble/bubble_dialog_delegate_view.h"
#include "ui/views/bubble/footnote_container_view.h"
#include "ui/views/controls/button/image_button.h"
@@ -49,6 +51,25 @@ namespace views {
namespace {
+// Returns an image of |size| that contains as much of |image| as possible
+// without distorting the |image|. Unused areas are cropped away.
+gfx::ImageSkia ScaleAspectRatioAndCropCenter(const gfx::Size& size,
+ const gfx::ImageSkia& image) {
+ // TODO(pbos): Crop out the corners or repaint them in the main_image_ border.
+ // This may submit before that is done to allow the API to be used while being
+ // polished.
+ float scale = std::min(static_cast<float>(image.width()) / size.width(),
+ static_cast<float>(image.height()) / size.height());
+ gfx::Size scaled_size = {base::ClampFloor(scale * size.width()),
+ base::ClampFloor(scale * size.height())};
+ gfx::Rect bounds{{0, 0}, image.size()};
+ bounds.ClampToCenteredSize(scaled_size);
+ auto scaled_and_cropped_image = gfx::ImageSkiaOperations::CreateTiledImage(
+ image, bounds.x(), bounds.y(), bounds.width(), bounds.height());
+ return gfx::ImageSkiaOperations::CreateResizedImage(
+ scaled_and_cropped_image, skia::ImageOperations::RESIZE_LANCZOS3, size);
+}
+
// Get the |vertical| or horizontal amount that |available_bounds| overflows
// |window_bounds|.
int GetOverflowLength(const gfx::Rect& available_bounds,
@@ -83,12 +104,12 @@ BubbleFrameView::BubbleFrameView(const gfx::Insets& title_margins,
: title_margins_(title_margins),
content_margins_(content_margins),
footnote_margins_(content_margins_),
- title_icon_(new views::ImageView()),
+ title_icon_(AddChildView(std::make_unique<ImageView>())),
+ main_image_(AddChildView(std::make_unique<ImageView>())),
default_title_(CreateDefaultTitleLabel(std::u16string()).release()) {
- AddChildView(title_icon_.get());
-
default_title_->SetVisible(false);
AddChildView(default_title_.get());
+ main_image_->SetVisible(false);
auto close = CreateCloseButton(base::BindRepeating(
[](BubbleFrameView* view, const ui::Event& event) {
@@ -324,7 +345,7 @@ void BubbleFrameView::SizeConstraintsChanged() {}
void BubbleFrameView::InsertClientView(ClientView* client_view) {
// Place the client view before any footnote view for focus order.
footnote_container_
- ? AddChildViewAt(client_view, GetIndexOf(footnote_container_))
+ ? AddChildViewAt(client_view, GetIndexOf(footnote_container_).value())
: AddChildView(client_view);
}
@@ -335,7 +356,47 @@ void BubbleFrameView::SetTitleView(std::unique_ptr<View> title_view) {
delete custom_title_;
custom_title_ = title_view.get();
// Keep the title after the icon for focus order.
- AddChildViewAt(title_view.release(), GetIndexOf(title_icon_) + 1);
+ AddChildViewAt(title_view.release(), GetIndexOf(title_icon_).value() + 1);
+}
+
+void BubbleFrameView::UpdateMainImage() {
+ views::BubbleDialogDelegate* const bubble_delegate =
+ GetWidget()->widget_delegate()->AsBubbleDialogDelegate();
+ if (!bubble_delegate)
+ return;
+ const ui::ImageModel& model = bubble_delegate->GetMainImage();
+ if (model.IsEmpty()) {
+ main_image_->SetVisible(false);
+ } else {
+ // This max increase is the difference between the 448 and 320 snapping
+ // points in ChromeLayoutProvider, but they are not publicly visible in that
+ // API. We set the size of the main image so that the dialog increases in
+ // size exactly one snapping point. At the point of writing this means that
+ // we are using a 112x112px image.
+ // Ideally this would be handled inside the ImageView, but we do cropping
+ // and scaling outside (through ScaleAspectRatioAndCropCenter). We should
+ // consider moving that functionality into ImageView or ImageModel without
+ // having to specify an external size before painting.
+ constexpr int kMainImageDialogWidthIncrease = 128;
+ constexpr int kBorderInsets = 16;
+ constexpr int kMainImageDimension =
+ kMainImageDialogWidthIncrease - kBorderInsets;
+ constexpr int kBorderStrokeThickness = 1;
+
+ main_image_->SetImage(ScaleAspectRatioAndCropCenter(
+ gfx::Size(kMainImageDimension, kMainImageDimension),
+ model.GetImage().AsImageSkia()));
+ main_image_->SetBorder(views::CreateRoundedRectBorder(
+ kBorderStrokeThickness,
+ LayoutProvider::Get()->GetCornerRadiusMetric(Emphasis::kHigh,
+ gfx::Size()),
+ gfx::Insets(kBorderInsets - kBorderStrokeThickness),
+ GetColorProvider()
+ ? GetColorProvider()->GetColor(ui::kColorBubbleBorder)
+ : gfx::kPlaceholderColor));
+
+ main_image_->SetVisible(true);
+ }
}
void BubbleFrameView::SetProgress(absl::optional<double> progress) {
@@ -451,8 +512,8 @@ void BubbleFrameView::Layout() {
gfx::Size title_icon_pref_size(title_icon_->GetPreferredSize());
const int title_icon_padding =
title_icon_pref_size.width() > 0 ? title_margins_.left() : 0;
- const int title_label_x =
- bounds.x() + title_icon_pref_size.width() + title_icon_padding;
+ const int title_label_x = bounds.x() + title_icon_pref_size.width() +
+ title_icon_padding + GetMainImageLeftInsets();
// TODO(tapted): Layout() should skip more surrounding code when !HasTitle().
// Currently DCHECKs fail since title_insets is 0 when there is no title.
@@ -475,6 +536,9 @@ void BubbleFrameView::Layout() {
title_icon_->SetBounds(bounds.x(), bounds.y(), title_icon_pref_size.width(),
title_height);
+
+ main_image_->SetBounds(0, 0, main_image_->GetPreferredSize().width(),
+ main_image_->GetPreferredSize().height());
}
void BubbleFrameView::OnThemeChanged() {
@@ -482,6 +546,7 @@ void BubbleFrameView::OnThemeChanged() {
UpdateWindowTitle();
ResetWindowControls();
UpdateWindowIcon();
+ UpdateMainImage();
UpdateClientViewBackground();
SchedulePaint();
}
@@ -847,8 +912,10 @@ int BubbleFrameView::GetFrameWidthForClientWidth(int client_width) const {
const int title_bar_width = title()->GetMinimumSize().width() +
GetTitleLabelInsetsFromFrame().width();
const int client_area_width = client_width + content_margins_.width();
- const int frame_width = std::max(title_bar_width, client_area_width);
- DialogDelegate* dialog_delegate =
+ const int frame_width =
+ std::max(title_bar_width, client_area_width) + GetMainImageLeftInsets();
+
+ DialogDelegate* const dialog_delegate =
GetWidget()->widget_delegate()->AsDialogDelegate();
bool snapping = dialog_delegate &&
dialog_delegate->GetDialogButtons() != ui::DIALOG_BUTTON_NONE;
@@ -868,6 +935,11 @@ gfx::Size BubbleFrameView::GetFrameSizeForClientSize(
if (footnote_container_ && footnote_container_->GetVisible())
size.Enlarge(0, footnote_container_->GetHeightForWidth(size.width()));
+ if (main_image_->GetVisible()) {
+ size.set_height(
+ std::max(size.height(), main_image_->GetPreferredSize().height()));
+ }
+
return size;
}
@@ -899,8 +971,8 @@ gfx::Insets BubbleFrameView::GetTitleLabelInsetsFromFrame() const {
const gfx::Size title_icon_pref_size = title_icon_->GetPreferredSize();
const int title_icon_padding =
title_icon_pref_size.width() > 0 ? title_margins_.left() : 0;
- const int insets_left =
- title_margins_.left() + title_icon_pref_size.width() + title_icon_padding;
+ const int insets_left = GetMainImageLeftInsets() + title_margins_.left() +
+ title_icon_pref_size.width() + title_icon_padding;
return gfx::Insets::TLBR(header_height + title_margins_.top(), insets_left,
title_margins_.bottom(), insets_right);
}
@@ -919,7 +991,8 @@ gfx::Insets BubbleFrameView::GetClientInsetsForFrameWidth(
if (!HasTitle()) {
return content_margins_ +
- gfx::Insets::TLBR(std::max(header_height, close_height), 0, 0, 0);
+ gfx::Insets::TLBR(std::max(header_height, close_height),
+ GetMainImageLeftInsets(), 0, 0);
}
const int icon_height = title_icon_->GetPreferredSize().height();
@@ -929,7 +1002,7 @@ gfx::Insets BubbleFrameView::GetClientInsetsForFrameWidth(
std::max(icon_height, label_height) + title_margins_.height();
return content_margins_ +
gfx::Insets::TLBR(std::max(title_height + header_height, close_height),
- 0, 0, 0);
+ GetMainImageLeftInsets(), 0, 0);
}
int BubbleFrameView::GetHeaderHeightForFrameWidth(int frame_width) const {
@@ -948,6 +1021,13 @@ void BubbleFrameView::UpdateClientLayerCornerRadius() {
}
}
+int BubbleFrameView::GetMainImageLeftInsets() const {
+ if (!main_image_->GetVisible())
+ return 0;
+ return main_image_->GetPreferredSize().width() -
+ main_image_->GetBorder()->GetInsets().right();
+}
+
BEGIN_METADATA(BubbleFrameView, NonClientFrameView)
ADD_PROPERTY_METADATA(absl::optional<double>, Progress)
ADD_PROPERTY_METADATA(gfx::Insets, ContentMargins)
diff --git a/chromium/ui/views/bubble/bubble_frame_view.h b/chromium/ui/views/bubble/bubble_frame_view.h
index c72327c6cfd..7310a9a437b 100644
--- a/chromium/ui/views/bubble/bubble_frame_view.h
+++ b/chromium/ui/views/bubble/bubble_frame_view.h
@@ -69,6 +69,9 @@ class VIEWS_EXPORT BubbleFrameView : public NonClientFrameView {
// label. If there is an existing title view it will be deleted.
void SetTitleView(std::unique_ptr<View> title_view);
+ // Signals that the main image may have changed and needs to be fetched again.
+ void UpdateMainImage();
+
// Updates the current progress value of |progress_indicator_|. If progress is
// absent, hides |the progress_indicator|.
void SetProgress(absl::optional<double> progress);
@@ -250,11 +253,13 @@ class VIEWS_EXPORT BubbleFrameView : public NonClientFrameView {
// client views to the bubble border's bounds.
void UpdateClientLayerCornerRadius();
+ int GetMainImageLeftInsets() const;
+
// The bubble border.
raw_ptr<BubbleBorder> bubble_border_ = nullptr;
// Margins around the title label.
- gfx::Insets title_margins_;
+ const gfx::Insets title_margins_;
// Margins between the content and the inside of the border, in pixels.
gfx::Insets content_margins_;
@@ -265,6 +270,9 @@ class VIEWS_EXPORT BubbleFrameView : public NonClientFrameView {
// The optional title icon.
raw_ptr<ImageView> title_icon_ = nullptr;
+ // The optional main image.
+ raw_ptr<ImageView> main_image_ = nullptr;
+
// One of these fields is used as the dialog title. If SetTitleView is called
// the custom title view is stored in |custom_title_| and this class assumes
// ownership. Otherwise |default_title_| is used.
diff --git a/chromium/ui/views/cascading_property.cc b/chromium/ui/views/cascading_property.cc
index 65135110277..be6b46e9ce7 100644
--- a/chromium/ui/views/cascading_property.cc
+++ b/chromium/ui/views/cascading_property.cc
@@ -13,20 +13,7 @@ DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(VIEWS_EXPORT,
views::CascadingProperty<SkColor>*)
namespace views {
-
namespace {
-class CascadingThemeProviderColor final : public CascadingProperty<SkColor> {
- public:
- explicit CascadingThemeProviderColor(int color_id) : color_id_(color_id) {}
-
- // CascadingProperty<SkColor>:
- SkColor GetValue(const View* view) const override {
- return view->GetThemeProvider()->GetColor(color_id_);
- }
-
- private:
- const int color_id_;
-};
class CascadingColorProviderColor final : public CascadingProperty<SkColor> {
public:
@@ -41,21 +28,13 @@ class CascadingColorProviderColor final : public CascadingProperty<SkColor> {
private:
const ui::ColorId color_id_;
};
+
} // namespace
DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(CascadingProperty<SkColor>,
kCascadingBackgroundColor,
nullptr)
-void SetCascadingThemeProviderColor(
- views::View* view,
- const ui::ClassProperty<CascadingProperty<SkColor>*>* property_key,
- int color_id) {
- SetCascadingProperty(
- view, property_key,
- std::make_unique<views::CascadingThemeProviderColor>(color_id));
-}
-
void SetCascadingColorProviderColor(
views::View* view,
const ui::ClassProperty<CascadingProperty<SkColor>*>* property_key,
diff --git a/chromium/ui/views/cascading_property.h b/chromium/ui/views/cascading_property.h
index b6c1712e4d5..ddcdc3d3b47 100644
--- a/chromium/ui/views/cascading_property.h
+++ b/chromium/ui/views/cascading_property.h
@@ -61,11 +61,6 @@ void SetCascadingProperty(
static_cast<CascadingProperty<T>*>(property.release()));
}
-VIEWS_EXPORT void SetCascadingThemeProviderColor(
- View* view,
- const ui::ClassProperty<CascadingProperty<SkColor>*>* property_key,
- int color_id);
-
VIEWS_EXPORT void SetCascadingColorProviderColor(
View* view,
const ui::ClassProperty<CascadingProperty<SkColor>*>* property_key,
diff --git a/chromium/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm b/chromium/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm
index 57c47721b3a..9b57ed860e0 100644
--- a/chromium/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm
+++ b/chromium/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm
@@ -8,8 +8,8 @@
#import "base/mac/mac_util.h"
#include "base/run_loop.h"
+#import "ui/base/cocoa/nswindow_test_util.h"
#include "ui/base/hit_test.h"
-#import "ui/base/test/nswindow_fullscreen_notification_waiter.h"
#include "ui/base/test/ui_controls.h"
#import "ui/base/test/windowed_nsnotification_observer.h"
#import "ui/events/test/cocoa_test_event_utils.h"
@@ -75,9 +75,7 @@ TEST_F(BridgedNativeWidgetUITest, FullscreenSynchronousState) {
setCollectionBehavior:[test_window() collectionBehavior] |
NSWindowCollectionBehaviorFullScreenPrimary];
- base::scoped_nsobject<NSWindowFullscreenNotificationWaiter> waiter(
- [[NSWindowFullscreenNotificationWaiter alloc]
- initWithWindow:test_window()]);
+ ui::NSWindowFullscreenNotificationWaiter waiter(widget_->GetNativeWindow());
const gfx::Rect restored_bounds = widget_->GetRestoredBounds();
// First show the widget. A user shouldn't be able to initiate fullscreen
@@ -115,17 +113,17 @@ TEST_F(BridgedNativeWidgetUITest, FullscreenSynchronousState) {
// the NSWindowDelegate is removed, and the pending request to take out of
// fullscreen is lost. Since a message loop has not yet spun up in this test
// we can reliably say there will be one enter and one exit, despite all the
- // toggling above.
- [waiter waitForEnterCount:1 exitCount:1];
+ // toggling above. Wait only for the exit notification (the enter
+ // notification will be swallowed, because the exit will have been requested
+ // before the enter completes).
+ waiter.WaitForEnterAndExitCount(0, 1);
EXPECT_EQ(restored_bounds, widget_->GetRestoredBounds());
}
// Test fullscreen without overlapping calls and without changing collection
// behavior on the test window.
TEST_F(BridgedNativeWidgetUITest, FullscreenEnterAndExit) {
- base::scoped_nsobject<NSWindowFullscreenNotificationWaiter> waiter(
- [[NSWindowFullscreenNotificationWaiter alloc]
- initWithWindow:test_window()]);
+ ui::NSWindowFullscreenNotificationWaiter waiter(widget_->GetNativeWindow());
EXPECT_FALSE(widget_->IsFullscreen());
const gfx::Rect restored_bounds = widget_->GetRestoredBounds();
@@ -141,12 +139,12 @@ TEST_F(BridgedNativeWidgetUITest, FullscreenEnterAndExit) {
EXPECT_EQ(restored_bounds, widget_->GetRestoredBounds());
// Should be zero until the runloop spins.
- EXPECT_EQ(0, [waiter enterCount]);
- [waiter waitForEnterCount:1 exitCount:0];
+ EXPECT_EQ(0, waiter.enter_count());
+ waiter.WaitForEnterAndExitCount(1, 0);
// Verify it hasn't exceeded.
- EXPECT_EQ(1, [waiter enterCount]);
- EXPECT_EQ(0, [waiter exitCount]);
+ EXPECT_EQ(1, waiter.enter_count());
+ EXPECT_EQ(0, waiter.exit_count());
EXPECT_TRUE(widget_->IsFullscreen());
EXPECT_EQ(restored_bounds, widget_->GetRestoredBounds());
@@ -154,17 +152,15 @@ TEST_F(BridgedNativeWidgetUITest, FullscreenEnterAndExit) {
EXPECT_FALSE(widget_->IsFullscreen());
EXPECT_EQ(restored_bounds, widget_->GetRestoredBounds());
- [waiter waitForEnterCount:1 exitCount:1];
- EXPECT_EQ(1, [waiter enterCount]);
- EXPECT_EQ(1, [waiter exitCount]);
+ waiter.WaitForEnterAndExitCount(1, 1);
+ EXPECT_EQ(1, waiter.enter_count());
+ EXPECT_EQ(1, waiter.exit_count());
EXPECT_EQ(restored_bounds, widget_->GetRestoredBounds());
}
// Test that Widget::Restore exits fullscreen.
TEST_F(BridgedNativeWidgetUITest, FullscreenRestore) {
- base::scoped_nsobject<NSWindowFullscreenNotificationWaiter> waiter(
- [[NSWindowFullscreenNotificationWaiter alloc]
- initWithWindow:test_window()]);
+ ui::NSWindowFullscreenNotificationWaiter waiter(widget_->GetNativeWindow());
EXPECT_FALSE(widget_->IsFullscreen());
const gfx::Rect restored_bounds = widget_->GetRestoredBounds();
@@ -172,11 +168,11 @@ TEST_F(BridgedNativeWidgetUITest, FullscreenRestore) {
widget_->SetFullscreen(true);
EXPECT_TRUE(widget_->IsFullscreen());
- [waiter waitForEnterCount:1 exitCount:0];
+ waiter.WaitForEnterAndExitCount(1, 0);
widget_->Restore();
EXPECT_FALSE(widget_->IsFullscreen());
- [waiter waitForEnterCount:1 exitCount:1];
+ waiter.WaitForEnterAndExitCount(1, 1);
EXPECT_EQ(restored_bounds, widget_->GetRestoredBounds());
}
diff --git a/chromium/ui/views/cocoa/bridged_native_widget_unittest.mm b/chromium/ui/views/cocoa/bridged_native_widget_unittest.mm
index 34b4af78ea0..c132e6454f3 100644
--- a/chromium/ui/views/cocoa/bridged_native_widget_unittest.mm
+++ b/chromium/ui/views/cocoa/bridged_native_widget_unittest.mm
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/memory/raw_ptr.h"
+
#import "components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h"
#import <Cocoa/Cocoa.h>
@@ -21,6 +23,7 @@
#import "components/remote_cocoa/app_shim/native_widget_mac_nswindow.h"
#import "components/remote_cocoa/app_shim/views_nswindow_delegate.h"
#import "testing/gtest_mac.h"
+#include "ui/base/cocoa/find_pasteboard.h"
#import "ui/base/cocoa/window_size_constants.h"
#include "ui/base/ime/input_method.h"
#import "ui/base/test/cocoa_helper.h"
@@ -251,6 +254,43 @@ NSTextInputContext* g_fake_current_input_context = nullptr;
@end
+// Let's not mess with the machine's actual find pasteboard!
+@interface MockFindPasteboard : FindPasteboard
+@end
+
+@implementation MockFindPasteboard {
+ base::scoped_nsobject<NSString> _text;
+}
+
++ (FindPasteboard*)sharedInstance {
+ static MockFindPasteboard* instance = nil;
+ if (!instance) {
+ instance = [[MockFindPasteboard alloc] init];
+ }
+ return instance;
+}
+
+- (instancetype)init {
+ self = [super init];
+ if (self) {
+ _text.reset([[NSString alloc] init]);
+ }
+ return self;
+}
+
+- (void)loadTextFromPasteboard:(NSNotification*)notification {
+ // No-op
+}
+
+- (void)setFindText:(NSString*)newText {
+ _text.reset([newText copy]);
+}
+
+- (NSString*)findText {
+ return _text;
+}
+@end
+
namespace views {
namespace test {
@@ -341,7 +381,7 @@ class BridgedNativeWidgetTestBase : public ui::CocoaTest {
ui::CocoaTest::SetUp();
Widget::InitParams init_params;
- init_params.native_widget = native_widget_mac_;
+ init_params.native_widget = native_widget_mac_.get();
init_params.type = type_;
init_params.ownership = ownership_;
init_params.opacity = opacity_;
@@ -368,7 +408,7 @@ class BridgedNativeWidgetTestBase : public ui::CocoaTest {
protected:
std::unique_ptr<Widget> widget_;
- MockNativeWidgetMac* native_widget_mac_; // Weak. Owned by |widget_|.
+ raw_ptr<MockNativeWidgetMac> native_widget_mac_; // Weak. Owned by |widget_|.
// Use a frameless window, otherwise Widget will try to center the window
// before the tests covering the Init() flow are ready to do that.
@@ -534,7 +574,7 @@ Textfield* BridgedNativeWidgetTest::InstallTextField(const std::string& text) {
}
NSString* BridgedNativeWidgetTest::GetActualText() {
- return GetViewStringForRange(ns_view_, NSMakeRange(0, NSUIntegerMax));
+ return GetViewStringForRange(ns_view_, EmptyRange());
}
NSString* BridgedNativeWidgetTest::GetActualSelectedText() {
@@ -542,7 +582,7 @@ NSString* BridgedNativeWidgetTest::GetActualSelectedText() {
}
NSString* BridgedNativeWidgetTest::GetExpectedText() {
- return GetViewStringForRange(dummy_text_view_, NSMakeRange(0, NSUIntegerMax));
+ return GetViewStringForRange(dummy_text_view_, EmptyRange());
}
NSString* BridgedNativeWidgetTest::GetExpectedSelectedText() {
@@ -839,7 +879,7 @@ class BridgedNativeWidgetInitTest : public BridgedNativeWidgetTestBase {
void PerformInit() {
Widget::InitParams init_params;
- init_params.native_widget = native_widget_mac_;
+ init_params.native_widget = native_widget_mac_.get();
init_params.type = type_;
init_params.ownership = ownership_;
init_params.opacity = opacity_;
@@ -1924,5 +1964,24 @@ TEST_F(BridgedNativeWidgetTest, TextInput_WriteToPasteboard) {
}
}
+TEST_F(BridgedNativeWidgetTest, WriteToFindPasteboard) {
+ base::mac::ScopedObjCClassSwizzler swizzler([FindPasteboard class],
+ [MockFindPasteboard class],
+ @selector(sharedInstance));
+ EXPECT_NSEQ(@"", [[FindPasteboard sharedInstance] findText]);
+
+ const std::string test_string = "foo bar baz";
+ InstallTextField(test_string);
+
+ SetSelectionRange(NSMakeRange(4, 7));
+ [ns_view_ copyToFindPboard:nil];
+ EXPECT_NSEQ(@"bar baz", [[FindPasteboard sharedInstance] findText]);
+
+ // Don't overwrite with empty selection
+ SetSelectionRange(NSMakeRange(0, 0));
+ [ns_view_ copyToFindPboard:nil];
+ EXPECT_NSEQ(@"bar baz", [[FindPasteboard sharedInstance] findText]);
+}
+
} // namespace test
} // namespace views
diff --git a/chromium/ui/views/cocoa/drag_drop_client_mac.h b/chromium/ui/views/cocoa/drag_drop_client_mac.h
index dfc24aa246d..a859a903c6d 100644
--- a/chromium/ui/views/cocoa/drag_drop_client_mac.h
+++ b/chromium/ui/views/cocoa/drag_drop_client_mac.h
@@ -10,6 +10,7 @@
#include <memory>
#include "base/callback.h"
+#include "base/memory/raw_ptr.h"
#include "components/remote_cocoa/app_shim/drag_drop_client.h"
#include "ui/base/dragdrop/mojom/drag_drop_types.mojom-forward.h"
#include "ui/base/dragdrop/os_exchange_data.h"
@@ -76,7 +77,8 @@ class VIEWS_EXPORT DragDropClientMac : public remote_cocoa::DragDropClient {
int last_operation_ = 0;
// The bridge between the content view and the drag drop client.
- remote_cocoa::NativeWidgetNSWindowBridge* bridge_; // Weak. Owns |this|.
+ raw_ptr<remote_cocoa::NativeWidgetNSWindowBridge>
+ bridge_; // Weak. Owns |this|.
// The closure for the drag and drop's run loop.
base::OnceClosure quit_closure_;
diff --git a/chromium/ui/views/cocoa/drag_drop_client_mac_unittest.mm b/chromium/ui/views/cocoa/drag_drop_client_mac_unittest.mm
index c2007da6543..3f84bda077e 100644
--- a/chromium/ui/views/cocoa/drag_drop_client_mac_unittest.mm
+++ b/chromium/ui/views/cocoa/drag_drop_client_mac_unittest.mm
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/memory/raw_ptr.h"
+
#import "ui/views/cocoa/drag_drop_client_mac.h"
#import <Cocoa/Cocoa.h>
@@ -203,7 +205,7 @@ class DragDropClientMacTest : public WidgetTest {
widget_->Show();
target_ = new DragDropView();
- widget_->non_client_view()->frame_view()->AddChildView(target_);
+ widget_->non_client_view()->frame_view()->AddChildView(target_.get());
target_->SetBoundsRect(bounds);
drag_drop_client()->source_operation_ = ui::DragDropTypes::DRAG_COPY;
@@ -216,10 +218,10 @@ class DragDropClientMacTest : public WidgetTest {
}
protected:
- Widget* widget_ = nullptr;
- remote_cocoa::NativeWidgetNSWindowBridge* bridge_ = nullptr;
- NativeWidgetMacNSWindowHost* ns_window_host_ = nullptr;
- DragDropView* target_ = nullptr;
+ raw_ptr<Widget> widget_ = nullptr;
+ raw_ptr<remote_cocoa::NativeWidgetNSWindowBridge> bridge_ = nullptr;
+ raw_ptr<NativeWidgetMacNSWindowHost> ns_window_host_ = nullptr;
+ raw_ptr<DragDropView> target_ = nullptr;
base::scoped_nsobject<MockDraggingInfo> dragging_info_;
};
@@ -343,7 +345,7 @@ TEST_F(DragDropClientMacTest, CloseWidgetOnDrop) {
SetData(data);
target_ = new DragDropCloseView();
- widget_->non_client_view()->frame_view()->AddChildView(target_);
+ widget_->non_client_view()->frame_view()->AddChildView(target_.get());
target_->SetBoundsRect(gfx::Rect(0, 0, 100, 100));
target_->set_formats(ui::OSExchangeData::STRING | ui::OSExchangeData::URL);
diff --git a/chromium/ui/views/cocoa/immersive_mode_delegate_mac.h b/chromium/ui/views/cocoa/immersive_mode_delegate_mac.h
new file mode 100644
index 00000000000..1b1d0125573
--- /dev/null
+++ b/chromium/ui/views/cocoa/immersive_mode_delegate_mac.h
@@ -0,0 +1,14 @@
+// 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_VIEWS_COCOA_IMMERSIVE_MODE_DELEGATE_MAC_H_
+#define UI_VIEWS_COCOA_IMMERSIVE_MODE_DELEGATE_MAC_H_
+
+#include <AppKit/AppKit.h>
+
+@protocol ImmersiveModeDelegate <NSWindowDelegate>
+@property(readonly) NSWindow* originalHostingWindow;
+@end
+
+#endif // UI_VIEWS_COCOA_IMMERSIVE_MODE_DELEGATE_MAC_H_
diff --git a/chromium/ui/views/cocoa/native_widget_mac_event_monitor.h b/chromium/ui/views/cocoa/native_widget_mac_event_monitor.h
index 1b31a8bd6e4..0b03544684d 100644
--- a/chromium/ui/views/cocoa/native_widget_mac_event_monitor.h
+++ b/chromium/ui/views/cocoa/native_widget_mac_event_monitor.h
@@ -6,6 +6,7 @@
#define UI_VIEWS_COCOA_NATIVE_WIDGET_MAC_EVENT_MONITOR_H_
#include "base/callback_helpers.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "ui/views/views_export.h"
@@ -36,7 +37,7 @@ class VIEWS_EXPORT NativeWidgetMacEventMonitor {
friend class NativeWidgetMacNSWindowHost;
explicit NativeWidgetMacEventMonitor(Client* client);
- Client* const client_;
+ const raw_ptr<Client> client_;
// Scoped closure runner that will unregister `this` from its
// NativeWidgetMacNSWindowHost when `this` is destroyed.
diff --git a/chromium/ui/views/cocoa/native_widget_mac_ns_window_host.h b/chromium/ui/views/cocoa/native_widget_mac_ns_window_host.h
index 1ca8dab6cec..5a09100094d 100644
--- a/chromium/ui/views/cocoa/native_widget_mac_ns_window_host.h
+++ b/chromium/ui/views/cocoa/native_widget_mac_ns_window_host.h
@@ -12,6 +12,7 @@
#include <vector>
#include "base/mac/scoped_nsobject.h"
+#include "base/memory/raw_ptr.h"
#include "components/remote_cocoa/app_shim/native_widget_ns_window_host_helper.h"
#include "components/remote_cocoa/app_shim/ns_view_ids.h"
#include "components/remote_cocoa/browser/application_host.h"
@@ -68,6 +69,10 @@ class VIEWS_EXPORT NativeWidgetMacNSWindowHost
gfx::NativeWindow window);
static NativeWidgetMacNSWindowHost* GetFromNativeView(gfx::NativeView view);
+ // Key used to bind the content NSView to the overlay widget in immersive
+ // mode.
+ static const char kImmersiveContentNSView[];
+
// Unique integer id handles are used to bridge between the
// NativeWidgetMacNSWindowHost in one process and the NativeWidgetNSWindowHost
// potentially in another.
@@ -188,9 +193,7 @@ class VIEWS_EXPORT NativeWidgetMacNSWindowHost
// Geometry of the content area of the window, in DIPs. Note that this is not
// necessarily the same as the views::View's size.
- const gfx::Rect& GetContentBoundsInScreen() const {
- return content_bounds_in_screen_;
- }
+ gfx::Rect GetContentBoundsInScreen() const;
// The display that the window is currently on (or best guess thereof).
const display::Display& GetCurrentDisplay() const { return display_; }
@@ -415,7 +418,8 @@ class VIEWS_EXPORT NativeWidgetMacNSWindowHost
// The id that this bridge may be looked up from.
const uint64_t widget_id_;
- views::NativeWidgetMac* const native_widget_mac_; // Weak. Owns |this_|.
+ const raw_ptr<views::NativeWidgetMac>
+ native_widget_mac_; // Weak. Owns |this_|.
// Structure used to look up this structure's interfaces from its
// gfx::NativeWindow.
@@ -423,12 +427,12 @@ class VIEWS_EXPORT NativeWidgetMacNSWindowHost
native_window_mapping_;
// Parent and child widgets.
- NativeWidgetMacNSWindowHost* parent_ = nullptr;
+ raw_ptr<NativeWidgetMacNSWindowHost> parent_ = nullptr;
std::vector<NativeWidgetMacNSWindowHost*> children_;
// The factory that was used to create |remote_ns_window_remote_|. This must
// be the same as |parent_->application_host_|.
- remote_cocoa::ApplicationHost* application_host_ = nullptr;
+ raw_ptr<remote_cocoa::ApplicationHost> application_host_ = nullptr;
Widget::InitParams::Type widget_type_ = Widget::InitParams::TYPE_WINDOW;
@@ -436,7 +440,7 @@ class VIEWS_EXPORT NativeWidgetMacNSWindowHost
const uint64_t root_view_id_;
// Weak. Owned by |native_widget_mac_|.
- views::View* root_view_ = nullptr;
+ raw_ptr<views::View> root_view_ = nullptr;
std::unique_ptr<DragDropClientMac> drag_drop_client_;
diff --git a/chromium/ui/views/cocoa/native_widget_mac_ns_window_host.mm b/chromium/ui/views/cocoa/native_widget_mac_ns_window_host.mm
index e0a33764757..cdaf472a020 100644
--- a/chromium/ui/views/cocoa/native_widget_mac_ns_window_host.mm
+++ b/chromium/ui/views/cocoa/native_widget_mac_ns_window_host.mm
@@ -11,6 +11,7 @@
#include "base/containers/contains.h"
#include "base/mac/foundation_util.h"
#include "base/no_destructor.h"
+#include "base/numerics/safe_conversions.h"
#include "base/strings/sys_string_conversions.h"
#include "base/time/time.h"
#include "components/remote_cocoa/app_shim/mouse_capture.h"
@@ -21,6 +22,7 @@
#include "mojo/public/cpp/bindings/self_owned_associated_receiver.h"
#include "ui/accelerated_widget_mac/window_resize_helper_mac.h"
#include "ui/base/cocoa/animation_utils.h"
+#include "ui/base/cocoa/nswindow_test_util.h"
#include "ui/base/cocoa/remote_accessibility_api.h"
#include "ui/base/cocoa/remote_layer_api.h"
#include "ui/base/hit_test.h"
@@ -33,6 +35,7 @@
#include "ui/gfx/geometry/size_conversions.h"
#include "ui/gfx/mac/coordinate_conversion.h"
#include "ui/native_theme/native_theme_mac.h"
+#include "ui/views/cocoa/immersive_mode_delegate_mac.h"
#include "ui/views/cocoa/text_input_host.h"
#include "ui/views/cocoa/tooltip_manager_mac.h"
#include "ui/views/controls/label.h"
@@ -41,6 +44,7 @@
#include "ui/views/views_delegate.h"
#include "ui/views/widget/native_widget_mac.h"
#include "ui/views/widget/widget_delegate.h"
+#include "ui/views/widget/widget_utils_mac.h"
#include "ui/views/window/dialog_delegate.h"
#include "ui/views/word_lookup_client.h"
@@ -212,16 +216,39 @@ std::map<uint64_t, NativeWidgetMacNSWindowHost*>& GetIdToWidgetHostImplMap() {
uint64_t g_last_bridged_native_widget_id = 0;
+NSWindow* OriginalHostingWindowFromFullScreenWindow(
+ NSWindow* full_screen_window) {
+ if ([full_screen_window.delegate
+ conformsToProtocol:@protocol(ImmersiveModeDelegate)]) {
+ return base::mac::ObjCCastStrict<NSObject<ImmersiveModeDelegate>>(
+ full_screen_window.delegate)
+ .originalHostingWindow;
+ }
+ return nullptr;
+}
+
} // namespace
// static
NativeWidgetMacNSWindowHost* NativeWidgetMacNSWindowHost::GetFromNativeWindow(
gfx::NativeWindow native_window) {
NSWindow* window = native_window.GetNativeNSWindow();
+
if (NativeWidgetMacNSWindow* widget_window =
base::mac::ObjCCast<NativeWidgetMacNSWindow>(window)) {
return GetFromId([widget_window bridgedNativeWidgetId]);
}
+
+ // If the window is a system created NSToolbarFullScreenWindow we need to do
+ // some additional work to find the original window.
+ if (views::IsNSToolbarFullScreenWindow(window)) {
+ NSWindow* original = OriginalHostingWindowFromFullScreenWindow(window);
+ if (NativeWidgetMacNSWindow* widget_window =
+ base::mac::ObjCCast<NativeWidgetMacNSWindow>(original)) {
+ return GetFromId([widget_window bridgedNativeWidgetId]);
+ }
+ }
+
return nullptr; // Not created by NativeWidgetMac.
}
@@ -232,6 +259,10 @@ NativeWidgetMacNSWindowHost* NativeWidgetMacNSWindowHost::GetFromNativeView(
}
// static
+const char NativeWidgetMacNSWindowHost::kImmersiveContentNSView[] =
+ "kImmersiveContentNSView";
+
+// static
NativeWidgetMacNSWindowHost* NativeWidgetMacNSWindowHost::GetFromId(
uint64_t bridged_native_widget_id) {
auto found = GetIdToWidgetHostImplMap().find(bridged_native_widget_id);
@@ -372,11 +403,10 @@ void NativeWidgetMacNSWindowHost::InitWindow(
in_process_ns_window_bridge_.get(), GetNSWindowMojo());
Widget* widget = native_widget_mac_->GetWidget();
- // Tooltip Widgets shouldn't have their own tooltip manager, but tooltips are
- // native on Mac, so nothing should ever want one in Widget form.
- DCHECK_NE(params.type, Widget::InitParams::TYPE_TOOLTIP);
widget_type_ = params.type;
- tooltip_manager_ = std::make_unique<TooltipManagerMac>(GetNSWindowMojo());
+ bool is_tooltip = params.type == Widget::InitParams::TYPE_TOOLTIP;
+ if (!is_tooltip)
+ tooltip_manager_ = std::make_unique<TooltipManagerMac>(GetNSWindowMojo());
if (params.workspace.length()) {
std::string restoration_data;
@@ -395,6 +425,7 @@ void NativeWidgetMacNSWindowHost::InitWindow(
window_params->is_translucent =
params.opacity == Widget::InitParams::WindowOpacity::kTranslucent;
window_params->is_headless_mode_window = params.headless_mode;
+ window_params->is_tooltip = is_tooltip;
is_headless_mode_window_ = params.headless_mode;
// OSX likes to put shadows on most things. However, frameless windows (with
@@ -524,8 +555,7 @@ void NativeWidgetMacNSWindowHost::CreateCompositor(
ui::ContextFactory* context_factory =
ViewsDelegate::GetInstance()->GetContextFactory();
DCHECK(context_factory);
- compositor_ = ui::RecyclableCompositorMacFactory::Get()->CreateCompositor(
- context_factory);
+ compositor_ = std::make_unique<ui::RecyclableCompositorMac>(context_factory);
compositor_->widget()->SetNSView(this);
compositor_->compositor()->SetBackgroundColor(
translucent ? SK_ColorTRANSPARENT : SK_ColorWHITE);
@@ -582,8 +612,7 @@ void NativeWidgetMacNSWindowHost::DestroyCompositor() {
return;
compositor_->widget()->ResetNSView();
compositor_->compositor()->SetRootLayer(nullptr);
- ui::RecyclableCompositorMacFactory::Get()->RecycleCompositor(
- std::move(compositor_));
+ compositor_.reset();
}
bool NativeWidgetMacNSWindowHost::SetWindowTitle(const std::u16string& title) {
@@ -612,6 +641,20 @@ bool NativeWidgetMacNSWindowHost::RedispatchKeyEvent(NSEvent* event) {
return true;
}
+gfx::Rect NativeWidgetMacNSWindowHost::GetContentBoundsInScreen() const {
+ NSView* contentView =
+ (NSView*)GetNativeWindowProperty(kImmersiveContentNSView);
+ if (!contentView)
+ return content_bounds_in_screen_;
+
+ // In immersive fullscreen, the content view is hosted in another NSWindow.
+ NSRect boundsInWindow = [contentView convertRect:contentView.bounds
+ toView:nil];
+ NSRect boundsInScreen =
+ [contentView.window convertRectToScreen:boundsInWindow];
+ return gfx::ScreenRectFromNSRect(boundsInScreen);
+}
+
gfx::Rect NativeWidgetMacNSWindowHost::GetRestoredBounds() const {
if (target_fullscreen_state_ || in_fullscreen_transition_)
return window_bounds_before_fullscreen_;
@@ -657,7 +700,7 @@ void NativeWidgetMacNSWindowHost::SetParent(
// close the Widget.
// https://crbug.com/957927
remote_cocoa::ApplicationHost* new_application_host =
- new_parent ? new_parent->application_host() : application_host_;
+ new_parent ? new_parent->application_host() : application_host_.get();
if (new_application_host != application_host_) {
DLOG(ERROR) << "Cannot migrate views::NativeWidget to another process, "
"closing it instead.";
@@ -1101,6 +1144,9 @@ void NativeWidgetMacNSWindowHost::OnWindowFullscreenTransitionComplete(
// Ensure constraints are re-applied when completing a transition.
native_widget_mac_->OnSizeConstraintsChanged();
+
+ ui::NSWindowFullscreenNotificationWaiter::NotifyFullscreenTransitionComplete(
+ native_widget_mac_->GetNativeWindow(), actual_fullscreen_state);
}
void NativeWidgetMacNSWindowHost::OnWindowMiniaturizedChanged(
@@ -1125,7 +1171,8 @@ void NativeWidgetMacNSWindowHost::OnWindowDisplayChanged(
display_.color_spaces());
}
if (display_id_changed) {
- display_link_ = ui::DisplayLinkMac::GetForDisplay(display_.id());
+ display_link_ = ui::DisplayLinkMac::GetForDisplay(
+ base::checked_cast<CGDirectDisplayID>(display_.id()));
if (!display_link_) {
// Note that on some headless systems, the display link will fail to be
// created, so this should not be a fatal error.
diff --git a/chromium/ui/views/cocoa/text_input_host.h b/chromium/ui/views/cocoa/text_input_host.h
index 02c1024fb1f..fd6eedfaf77 100644
--- a/chromium/ui/views/cocoa/text_input_host.h
+++ b/chromium/ui/views/cocoa/text_input_host.h
@@ -5,6 +5,7 @@
#ifndef UI_VIEWS_COCOA_TEXT_INPUT_HOST_H_
#define UI_VIEWS_COCOA_TEXT_INPUT_HOST_H_
+#include "base/memory/raw_ptr.h"
#include "components/remote_cocoa/common/text_input_host.mojom.h"
#include "mojo/public/cpp/bindings/associated_receiver.h"
#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
@@ -77,14 +78,14 @@ class VIEWS_EXPORT TextInputHost : public remote_cocoa::mojom::TextInputHost {
// Weak. If non-null the TextInputClient of the currently focused views::View
// in the hierarchy rooted at the root view of |host_impl_|. Owned by the
// focused views::View.
- ui::TextInputClient* text_input_client_ = nullptr;
+ raw_ptr<ui::TextInputClient> text_input_client_ = nullptr;
// The TextInputClient about to be set. Requests for a new -inputContext will
// use this, but while the input is changing the NSView still needs to service
// IME requests using the old |text_input_client_|.
- ui::TextInputClient* pending_text_input_client_ = nullptr;
+ raw_ptr<ui::TextInputClient> pending_text_input_client_ = nullptr;
- NativeWidgetMacNSWindowHost* const host_impl_;
+ const raw_ptr<NativeWidgetMacNSWindowHost> host_impl_;
mojo::AssociatedReceiver<remote_cocoa::mojom::TextInputHost> mojo_receiver_{
this};
diff --git a/chromium/ui/views/cocoa/text_input_host.mm b/chromium/ui/views/cocoa/text_input_host.mm
index 6af6423fe19..28839cc4fd4 100644
--- a/chromium/ui/views/cocoa/text_input_host.mm
+++ b/chromium/ui/views/cocoa/text_input_host.mm
@@ -379,7 +379,7 @@ void TextInputHost::GetSelectionText(GetSelectionTextCallback callback) {
void TextInputHost::HasCompositionText(HasCompositionTextCallback callback) {
bool has_composition_text = false;
- IsRTL(&has_composition_text);
+ HasCompositionText(&has_composition_text);
std::move(callback).Run(has_composition_text);
}
diff --git a/chromium/ui/views/cocoa/tooltip_manager_mac.h b/chromium/ui/views/cocoa/tooltip_manager_mac.h
index 8fa2b50065a..446cb6eea70 100644
--- a/chromium/ui/views/cocoa/tooltip_manager_mac.h
+++ b/chromium/ui/views/cocoa/tooltip_manager_mac.h
@@ -5,6 +5,7 @@
#ifndef UI_VIEWS_COCOA_TOOLTIP_MANAGER_MAC_H_
#define UI_VIEWS_COCOA_TOOLTIP_MANAGER_MAC_H_
+#include "base/memory/raw_ptr.h"
#include "ui/views/widget/tooltip_manager.h"
namespace remote_cocoa {
@@ -32,7 +33,7 @@ class TooltipManagerMac : public TooltipManager {
void TooltipTextChanged(View* view) override;
private:
- remote_cocoa::mojom::NativeWidgetNSWindow*
+ raw_ptr<remote_cocoa::mojom::NativeWidgetNSWindow>
bridge_; // Weak. Owned by the owner of this.
};
diff --git a/chromium/ui/views/color_chooser/color_chooser_view.cc b/chromium/ui/views/color_chooser/color_chooser_view.cc
index 51af8d029b4..30fe5864a2c 100644
--- a/chromium/ui/views/color_chooser/color_chooser_view.cc
+++ b/chromium/ui/views/color_chooser/color_chooser_view.cc
@@ -115,7 +115,9 @@ void DrawGradientRect(const gfx::Rect& rect,
SkColor end_color,
bool is_horizontal,
gfx::Canvas* canvas) {
- SkColor colors[2] = {start_color, end_color};
+ // TODO(crbug/1308932): Remove FromColor and make all SkColor4f.
+ SkColor4f colors[2] = {SkColor4f::FromColor(start_color),
+ SkColor4f::FromColor(end_color)};
SkPoint points[2];
points[0].iset(0, 0);
if (is_horizontal)
diff --git a/chromium/ui/views/color_chooser/color_chooser_view.h b/chromium/ui/views/color_chooser/color_chooser_view.h
index 1858d93809a..3faeff810a9 100644
--- a/chromium/ui/views/color_chooser/color_chooser_view.h
+++ b/chromium/ui/views/color_chooser/color_chooser_view.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "third_party/skia/include/core/SkColor.h"
#include "third_party/skia/include/core/SkScalar.h"
@@ -82,21 +83,21 @@ class VIEWS_EXPORT ColorChooser : public TextfieldController,
// The current color in HSV coordinate.
SkScalar hsv_[3];
- ColorChooserListener* listener_;
+ raw_ptr<ColorChooserListener> listener_;
ViewTracker tracker_;
// Child views. These are owned as part of the normal views hierarchy.
// The view of hue chooser.
- HueView* hue_ = nullptr;
+ raw_ptr<HueView> hue_ = nullptr;
// The view of saturation/value choosing area.
- SaturationValueView* saturation_value_ = nullptr;
+ raw_ptr<SaturationValueView> saturation_value_ = nullptr;
// The rectangle to denote the selected color.
- SelectedColorPatchView* selected_color_patch_ = nullptr;
+ raw_ptr<SelectedColorPatchView> selected_color_patch_ = nullptr;
// The textfield to write the color explicitly.
- Textfield* textfield_ = nullptr;
+ raw_ptr<Textfield> textfield_ = nullptr;
SkColor initial_color_;
};
diff --git a/chromium/ui/views/controls/animated_image_view.cc b/chromium/ui/views/controls/animated_image_view.cc
index 6bc5217e38f..ba605157123 100644
--- a/chromium/ui/views/controls/animated_image_view.cc
+++ b/chromium/ui/views/controls/animated_image_view.cc
@@ -7,6 +7,7 @@
#include <utility>
#include "base/check.h"
+#include "base/trace_event/trace_event.h"
#include "cc/paint/skottie_wrapper.h"
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/compositor/compositor.h"
@@ -48,25 +49,24 @@ void AnimatedImageView::SetAnimatedImage(
SchedulePaint();
}
-void AnimatedImageView::Play(lottie::Animation::Style style) {
- DCHECK(animated_image_);
- Play(base::TimeDelta(), animated_image_->GetAnimationDuration(), style);
-}
-
-void AnimatedImageView::Play(base::TimeDelta start_offset,
- base::TimeDelta duration,
- lottie::Animation::Style style) {
+void AnimatedImageView::Play(
+ absl::optional<lottie::Animation::PlaybackConfig> playback_config) {
DCHECK(animated_image_);
if (state_ == State::kPlaying)
return;
state_ = State::kPlaying;
- set_check_active_duration(style != lottie::Animation::Style::kLoop);
+ if (!playback_config) {
+ playback_config =
+ lottie::Animation::PlaybackConfig::CreateDefault(*animated_image_);
+ }
+ set_check_active_duration(playback_config->style !=
+ lottie::Animation::Style::kLoop);
SetCompositorFromWidget();
- animated_image_->StartSubsection(start_offset, duration, style);
+ animated_image_->Start(std::move(playback_config));
}
void AnimatedImageView::Stop() {
@@ -126,6 +126,8 @@ void AnimatedImageView::RemovedFromWidget() {
}
void AnimatedImageView::OnAnimationStep(base::TimeTicks timestamp) {
+ TRACE_EVENT1("views", "AnimatedImageView::OnAnimationStep", "timestamp",
+ timestamp);
previous_timestamp_ = timestamp;
SchedulePaint();
}
diff --git a/chromium/ui/views/controls/animated_image_view.h b/chromium/ui/views/controls/animated_image_view.h
index 04d6dea759c..4c880b7b0d2 100644
--- a/chromium/ui/views/controls/animated_image_view.h
+++ b/chromium/ui/views/controls/animated_image_view.h
@@ -10,6 +10,7 @@
#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/compositor/compositor_animation_observer.h"
#include "ui/gfx/geometry/vector2d.h"
@@ -22,10 +23,6 @@ namespace gfx {
class Canvas;
}
-namespace lottie {
-class Animation;
-}
-
namespace ui {
class Compositor;
}
@@ -61,13 +58,12 @@ class VIEWS_EXPORT AnimatedImageView : public ImageViewBase,
// will result in stopping the current animation.
void SetAnimatedImage(std::unique_ptr<lottie::Animation> animated_image);
- // Plays the animation in loop and must only be called when this view has
+ // Plays the animation and must only be called when this view has
// access to a widget.
- void Play(lottie::Animation::Style style = lottie::Animation::Style::kLoop);
- // Version of the above that mirrors lottie::Animation::StartSubsection().
- void Play(base::TimeDelta start_offset,
- base::TimeDelta duration,
- lottie::Animation::Style style = lottie::Animation::Style::kLoop);
+ //
+ // If a null |playback_config| is provided, the default one is used.
+ void Play(absl::optional<lottie::Animation::PlaybackConfig> playback_config =
+ absl::nullopt);
// Stops any animation and resets it to the start frame.
void Stop();
diff --git a/chromium/ui/views/controls/animated_image_view_unittest.cc b/chromium/ui/views/controls/animated_image_view_unittest.cc
index 6659862015d..fa41cc67d1f 100644
--- a/chromium/ui/views/controls/animated_image_view_unittest.cc
+++ b/chromium/ui/views/controls/animated_image_view_unittest.cc
@@ -58,10 +58,8 @@ class AnimatedImageViewTest : public ViewsTestBase {
params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget_.Init(std::move(params));
- auto view = std::make_unique<AnimatedImageView>();
- view->SetUseDefaultFillLayout(true);
- view_ = view.get();
- widget_.SetContentsView(std::move(view));
+ view_ = widget_.SetContentsView(std::make_unique<AnimatedImageView>());
+ view_->SetUseDefaultFillLayout(true);
widget_.Show();
}
@@ -97,7 +95,7 @@ TEST_F(AnimatedImageViewTest, PaintsWithAdditionalTranslation) {
view_->SetAnimatedImage(CreateAnimationWithSize(gfx::Size(80, 80)));
view_->SetVerticalAlignment(ImageViewBase::Alignment::kCenter);
view_->SetHorizontalAlignment(ImageViewBase::Alignment::kCenter);
- widget_.GetContentsView()->Layout();
+ RunScheduledLayout(view_);
view_->Play();
static constexpr float kExpectedDefaultOrigin =
diff --git a/chromium/ui/views/controls/button/label_button_unittest.cc b/chromium/ui/views/controls/button/label_button_unittest.cc
index 0524fca9e01..97dedf98af5 100644
--- a/chromium/ui/views/controls/button/label_button_unittest.cc
+++ b/chromium/ui/views/controls/button/label_button_unittest.cc
@@ -90,8 +90,12 @@ class LabelButtonTest : public test::WidgetTest {
// Windows is platform-dependent.
test_widget_->Show();
- button_ = test_widget_->GetContentsView()->AddChildView(
- std::make_unique<TestLabelButton>());
+ // Place the button into a separate container view which itself does no
+ // layouts. This will isolate the button from the client view which does
+ // a fill layout by default.
+ auto* container =
+ test_widget_->client_view()->AddChildView(std::make_unique<View>());
+ button_ = container->AddChildView(std::make_unique<TestLabelButton>());
// Establish the expected text colors for testing changes due to state.
themed_normal_text_color_ =
@@ -425,12 +429,12 @@ TEST_F(LabelButtonTest, ImageAlignmentWithMultilineLabel) {
button_->SetImage(Button::STATE_NORMAL, image);
button_->SetBoundsRect(gfx::Rect(button_->GetPreferredSize()));
- button_->Layout();
+ RunScheduledLayout(button_);
int y_origin_centered = button_->image()->origin().y();
button_->SetBoundsRect(gfx::Rect(button_->GetPreferredSize()));
button_->SetImageCentered(false);
- button_->Layout();
+ RunScheduledLayout(button_);
int y_origin_not_centered = button_->image()->origin().y();
EXPECT_LT(y_origin_not_centered, y_origin_centered);
@@ -463,17 +467,17 @@ TEST_F(LabelButtonTest, LabelAndImage) {
gfx::Size button_size = button_->GetPreferredSize();
button_size.Enlarge(50, 0);
button_->SetSize(button_size);
- button_->Layout();
+ RunScheduledLayout(button_);
EXPECT_LT(button_->image()->bounds().right(), button_->label()->bounds().x());
int left_align_label_midpoint = button_->label()->bounds().CenterPoint().x();
button_->SetHorizontalAlignment(gfx::ALIGN_CENTER);
- button_->Layout();
+ RunScheduledLayout(button_);
EXPECT_LT(button_->image()->bounds().right(), button_->label()->bounds().x());
int center_align_label_midpoint =
button_->label()->bounds().CenterPoint().x();
EXPECT_LT(left_align_label_midpoint, center_align_label_midpoint);
button_->SetHorizontalAlignment(gfx::ALIGN_RIGHT);
- button_->Layout();
+ RunScheduledLayout(button_);
EXPECT_LT(button_->label()->bounds().right(), button_->image()->bounds().x());
button_->SetText(std::u16string());
@@ -521,7 +525,7 @@ TEST_F(LabelButtonTest, LabelWrapAndImageAlignment) {
gfx::Size preferred_size = button_->GetPreferredSize();
preferred_size.set_height(button_->GetHeightForWidth(preferred_size.width()));
button_->SetSize(preferred_size);
- button_->Layout();
+ RunScheduledLayout(button_);
EXPECT_EQ(preferred_size.width(),
image.width() + image_spacing + text_wrap_width);
@@ -631,7 +635,7 @@ TEST_F(LabelButtonTest, ChangeTextSize) {
// is increased.
button_->SetText(longer_text);
EXPECT_TRUE(ViewTestApi(button_).needs_layout());
- button_->Layout();
+ RunScheduledLayout(button_);
EXPECT_GT(button_->label()->bounds().width(), original_label_width * 2);
EXPECT_GT(button_->GetPreferredSize().width(), original_width * 2);
@@ -639,7 +643,7 @@ TEST_F(LabelButtonTest, ChangeTextSize) {
// text is restored.
button_->SetText(text);
EXPECT_TRUE(ViewTestApi(button_).needs_layout());
- button_->Layout();
+ RunScheduledLayout(button_);
EXPECT_EQ(original_label_width, button_->label()->bounds().width());
EXPECT_EQ(original_width, button_->GetPreferredSize().width());
}
@@ -723,7 +727,7 @@ TEST_F(LabelButtonTest, ImageOrLabelGetClipped) {
// The border size + the content height is more than button's preferred size.
button_->SetBorder(CreateEmptyBorder(
gfx::Insets::TLBR(image_size / 2, 0, image_size / 2, 0)));
- button_->Layout();
+ RunScheduledLayout(button_);
// Ensure that content (image and label) doesn't get clipped by the border.
EXPECT_GE(button_->image()->height(), image_size);
diff --git a/chromium/ui/views/controls/combobox/combobox.cc b/chromium/ui/views/controls/combobox/combobox.cc
index b8d41cfeb67..8f521332e66 100644
--- a/chromium/ui/views/controls/combobox/combobox.cc
+++ b/chromium/ui/views/controls/combobox/combobox.cc
@@ -18,7 +18,6 @@
#include "ui/base/ime/input_method.h"
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/base/models/image_model.h"
-#include "ui/base/models/menu_model.h"
#include "ui/base/ui_base_types.h"
#include "ui/color/color_id.h"
#include "ui/color/color_provider.h"
@@ -33,6 +32,7 @@
#include "ui/views/background.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/controls/button/button_controller.h"
+#include "ui/views/controls/combobox/combobox_menu_model.h"
#include "ui/views/controls/combobox/combobox_util.h"
#include "ui/views/controls/combobox/empty_combobox_model.h"
#include "ui/views/controls/focus_ring.h"
@@ -44,15 +44,13 @@
#include "ui/views/mouse_constants.h"
#include "ui/views/style/platform_style.h"
#include "ui/views/style/typography.h"
+#include "ui/views/view_utils.h"
#include "ui/views/widget/widget.h"
namespace views {
namespace {
-// Used to indicate that no item is currently selected by the user.
-constexpr int kNoSelection = -1;
-
SkColor GetTextColorForEnableState(const Combobox& combobox, bool enabled) {
const int style = enabled ? style::STYLE_PRIMARY : style::STYLE_DISABLED;
return style::GetColor(combobox, style::CONTEXT_TEXTFIELD, style);
@@ -71,6 +69,15 @@ class TransparentButton : public Button {
SetHasInkDropActionOnClick(true);
InkDrop::UseInkDropForSquareRipple(InkDrop::Get(this),
/*highlight_on_hover=*/false);
+ views::InkDrop::Get(this)->SetBaseColorCallback(base::BindRepeating(
+ [](Button* host) {
+ // This button will be used like a LabelButton, so use the same
+ // foreground base color as a label button.
+ return color_utils::DeriveDefaultIconColor(
+ views::style::GetColor(*host, views::style::CONTEXT_BUTTON,
+ views::style::STYLE_PRIMARY));
+ },
+ this));
InkDrop::Get(this)->SetCreateRippleCallback(base::BindRepeating(
[](Button* host) -> std::unique_ptr<views::InkDropRipple> {
return std::make_unique<views::FloodFillInkDropRipple>(
@@ -97,124 +104,23 @@ class TransparentButton : public Button {
double GetAnimationValue() const {
return hover_animation().GetCurrentValue();
}
-};
-
-#if !BUILDFLAG(IS_MAC)
-// Returns the next or previous valid index (depending on |increment|'s value).
-// Skips separator or disabled indices. Returns -1 if there is no valid adjacent
-// index.
-int GetAdjacentIndex(ui::ComboboxModel* model, int increment, int index) {
- DCHECK(increment == -1 || increment == 1);
-
- index += increment;
- while (index >= 0 && index < model->GetItemCount()) {
- if (!model->IsItemSeparatorAt(index) || !model->IsItemEnabledAt(index))
- return index;
- index += increment;
- }
- return kNoSelection;
-}
-#endif
-
-} // namespace
-
-// Adapts a ui::ComboboxModel to a ui::MenuModel.
-class Combobox::ComboboxMenuModel : public ui::MenuModel {
- public:
- ComboboxMenuModel(Combobox* owner, ui::ComboboxModel* model)
- : owner_(owner), model_(model) {}
- ComboboxMenuModel(const ComboboxMenuModel&) = delete;
- ComboboxMenuModel& operator&(const ComboboxMenuModel&) = delete;
- ~ComboboxMenuModel() override = default;
-
- private:
- bool UseCheckmarks() const {
- return MenuConfig::instance().check_selected_combobox_item;
- }
- // Overridden from MenuModel:
- bool HasIcons() const override {
- for (int i = 0; i < GetItemCount(); ++i) {
- if (!GetIconAt(i).IsEmpty())
- return true;
+ void UpdateInkDrop(bool show_on_press_and_hover) {
+ if (show_on_press_and_hover) {
+ // We must use UseInkDropForFloodFillRipple here because
+ // UseInkDropForSquareRipple hides the InkDrop when the ripple effect is
+ // active instead of layering underneath it causing flashing.
+ InkDrop::UseInkDropForFloodFillRipple(InkDrop::Get(this),
+ /*highlight_on_hover=*/true);
+ } else {
+ InkDrop::UseInkDropForSquareRipple(InkDrop::Get(this),
+ /*highlight_on_hover=*/false);
}
- return false;
- }
-
- int GetItemCount() const override { return model_->GetItemCount(); }
-
- ItemType GetTypeAt(int index) const override {
- if (model_->IsItemSeparatorAt(index))
- return TYPE_SEPARATOR;
- return UseCheckmarks() ? TYPE_CHECK : TYPE_COMMAND;
- }
-
- ui::MenuSeparatorType GetSeparatorTypeAt(int index) const override {
- return ui::NORMAL_SEPARATOR;
- }
-
- int GetCommandIdAt(int index) const override {
- // Define the id of the first item in the menu (since it needs to be > 0)
- constexpr int kFirstMenuItemId = 1000;
- return index + kFirstMenuItemId;
- }
-
- std::u16string GetLabelAt(int index) const override {
- // Inserting the Unicode formatting characters if necessary so that the
- // text is displayed correctly in right-to-left UIs.
- std::u16string text = model_->GetDropDownTextAt(index);
- base::i18n::AdjustStringForLocaleDirection(&text);
- return text;
- }
-
- std::u16string GetSecondaryLabelAt(int index) const override {
- std::u16string text = model_->GetDropDownSecondaryTextAt(index);
- base::i18n::AdjustStringForLocaleDirection(&text);
- return text;
}
-
- bool IsItemDynamicAt(int index) const override { return true; }
-
- const gfx::FontList* GetLabelFontListAt(int index) const override {
- return &owner_->GetFontList();
- }
-
- bool GetAcceleratorAt(int index,
- ui::Accelerator* accelerator) const override {
- return false;
- }
-
- bool IsItemCheckedAt(int index) const override {
- return UseCheckmarks() && index == owner_->selected_index_;
- }
-
- int GetGroupIdAt(int index) const override { return -1; }
-
- ui::ImageModel GetIconAt(int index) const override {
- return model_->GetDropDownIconAt(index);
- }
-
- ui::ButtonMenuItemModel* GetButtonMenuItemAt(int index) const override {
- return nullptr;
- }
-
- bool IsEnabledAt(int index) const override {
- return model_->IsItemEnabledAt(index);
- }
-
- void ActivatedAt(int index) override {
- owner_->SetSelectedIndex(index);
- owner_->OnPerformAction();
- }
-
- void ActivatedAt(int index, int event_flags) override { ActivatedAt(index); }
-
- MenuModel* GetSubmenuModelAt(int index) const override { return nullptr; }
-
- raw_ptr<Combobox> owner_; // Weak. Owns this.
- raw_ptr<ui::ComboboxModel> model_; // Weak.
};
+} // namespace
+
////////////////////////////////////////////////////////////////////////////////
// Combobox, public:
@@ -241,9 +147,10 @@ Combobox::Combobox(ui::ComboboxModel* model, int text_context, int text_style)
SetFocusBehavior(FocusBehavior::ALWAYS);
#endif
+ SetBackgroundColorId(ui::kColorTextfieldBackground);
UpdateBorder();
- arrow_button_->SetVisible(true);
+ arrow_button_->SetVisible(should_show_arrow_);
AddChildView(arrow_button_.get());
// A layer is applied to make sure that canvas bounds are snapped to pixel
@@ -265,7 +172,7 @@ const gfx::FontList& Combobox::GetFontList() const {
return style::GetFont(text_context_, text_style_);
}
-void Combobox::SetSelectedIndex(int index) {
+void Combobox::SetSelectedIndex(absl::optional<size_t> index) {
if (selected_index_ == index)
return;
// TODO(pbos): Add (D)CHECKs to validate the selected index.
@@ -284,7 +191,7 @@ base::CallbackListSubscription Combobox::AddSelectedIndexChangedCallback(
}
bool Combobox::SelectValue(const std::u16string& value) {
- for (int i = 0; i < GetModel()->GetItemCount(); ++i) {
+ for (size_t i = 0; i < GetModel()->GetItemCount(); ++i) {
if (value == GetModel()->GetItemAt(i)) {
SetSelectedIndex(i);
return true;
@@ -353,6 +260,22 @@ void Combobox::SetInvalid(bool invalid) {
OnPropertyChanged(&selected_index_, kPropertyEffectsPaint);
}
+void Combobox::SetBorderColorId(ui::ColorId color_id) {
+ border_color_id_ = color_id;
+ UpdateBorder();
+}
+
+void Combobox::SetBackgroundColorId(ui::ColorId color_id) {
+ SetBackground(CreateThemedRoundedRectBackground(
+ color_id, FocusableBorder::kCornerRadiusDp));
+}
+
+void Combobox::SetEventHighlighting(bool should_highlight) {
+ should_highlight_ = should_highlight;
+ AsViewClass<TransparentButton>(arrow_button_)
+ ->UpdateInkDrop(should_highlight);
+}
+
void Combobox::SetSizeToLargestLabel(bool size_to_largest_label) {
if (size_to_largest_label_ == size_to_largest_label)
return;
@@ -368,29 +291,25 @@ bool Combobox::IsMenuRunning() const {
void Combobox::OnThemeChanged() {
View::OnThemeChanged();
- SetBackground(
- CreateBackgroundFromPainter(Painter::CreateSolidRoundRectPainter(
- GetColorProvider()->GetColor(ui::kColorTextfieldBackground),
- FocusableBorder::kCornerRadiusDp)));
OnContentSizeMaybeChanged();
}
-int Combobox::GetRowCount() {
+size_t Combobox::GetRowCount() {
return GetModel()->GetItemCount();
}
-int Combobox::GetSelectedRow() {
+absl::optional<size_t> Combobox::GetSelectedRow() {
return selected_index_;
}
-void Combobox::SetSelectedRow(int row) {
- int prev_index = selected_index_;
+void Combobox::SetSelectedRow(absl::optional<size_t> row) {
+ absl::optional<size_t> prev_index = selected_index_;
SetSelectedIndex(row);
if (selected_index_ != prev_index)
OnPerformAction();
}
-std::u16string Combobox::GetTextForRow(int row) {
+std::u16string Combobox::GetTextForRow(size_t row) {
return GetModel()->IsItemSeparatorAt(row) ? std::u16string()
: GetModel()->GetItemAt(row);
}
@@ -404,11 +323,17 @@ gfx::Size Combobox::CalculatePreferredSize() const {
// The preferred size will drive the local bounds which in turn is used to set
// the minimum width for the dropdown list.
- const int width = std::max(kMinComboboxWidth, content_size_.width()) +
- LayoutProvider::Get()->GetDistanceMetric(
- DISTANCE_TEXTFIELD_HORIZONTAL_TEXT_PADDING) *
- 2 +
- kComboboxArrowContainerWidth + GetInsets().width();
+ int width = std::max(kMinComboboxWidth, content_size_.width()) +
+ LayoutProvider::Get()->GetDistanceMetric(
+ DISTANCE_TEXTFIELD_HORIZONTAL_TEXT_PADDING) *
+ 2 +
+ GetInsets().width();
+
+ // If an arrow is being shown, add extra width to include that arrow.
+ if (should_show_arrow_) {
+ width += kComboboxArrowContainerWidth;
+ }
+
const int height = LayoutProvider::GetControlHeightForFont(
text_context_, text_style_, GetFontList());
return gfx::Size(width, height);
@@ -431,76 +356,86 @@ bool Combobox::OnKeyPressed(const ui::KeyEvent& e) {
// TODO(oshima): handle IME.
DCHECK_EQ(e.type(), ui::ET_KEY_PRESSED);
- // TODO(pbos): Do we need to handle selected_index_ == -1 for unselected here?
- // Ditto on handling an empty model?
- DCHECK_GE(selected_index_, 0);
- DCHECK_LT(selected_index_, GetModel()->GetItemCount());
- if (selected_index_ < 0 || selected_index_ >= GetModel()->GetItemCount())
- SetSelectedIndex(0);
+ DCHECK(selected_index_.has_value());
+ DCHECK_LT(selected_index_.value(), GetModel()->GetItemCount());
- bool show_menu = false;
- int new_index = kNoSelection;
- switch (e.key_code()) {
#if BUILDFLAG(IS_MAC)
- case ui::VKEY_DOWN:
- case ui::VKEY_UP:
- case ui::VKEY_SPACE:
- case ui::VKEY_HOME:
- case ui::VKEY_END:
- // On Mac, navigation keys should always just show the menu first.
- show_menu = true;
- break;
+ if (e.key_code() != ui::VKEY_DOWN && e.key_code() != ui::VKEY_UP &&
+ e.key_code() != ui::VKEY_SPACE && e.key_code() != ui::VKEY_HOME &&
+ e.key_code() != ui::VKEY_END) {
+ return false;
+ }
+ ShowDropDownMenu(ui::MENU_SOURCE_KEYBOARD);
+ return true;
#else
+ const auto index_at_or_after = [](ui::ComboboxModel* model,
+ size_t index) -> absl::optional<size_t> {
+ for (; index < model->GetItemCount(); ++index) {
+ if (!model->IsItemSeparatorAt(index) && model->IsItemEnabledAt(index))
+ return index;
+ }
+ return absl::nullopt;
+ };
+ const auto index_before = [](ui::ComboboxModel* model,
+ size_t index) -> absl::optional<size_t> {
+ for (; index > 0; --index) {
+ const auto prev = index - 1;
+ if (!model->IsItemSeparatorAt(prev) && model->IsItemEnabledAt(prev))
+ return prev;
+ }
+ return absl::nullopt;
+ };
+
+ absl::optional<size_t> new_index;
+ switch (e.key_code()) {
// Show the menu on F4 without modifiers.
case ui::VKEY_F4:
if (e.IsAltDown() || e.IsAltGrDown() || e.IsControlDown())
return false;
- show_menu = true;
- break;
+ ShowDropDownMenu(ui::MENU_SOURCE_KEYBOARD);
+ return true;
// Move to the next item if any, or show the menu on Alt+Down like Windows.
case ui::VKEY_DOWN:
- if (e.IsAltDown())
- show_menu = true;
- else
- new_index = GetAdjacentIndex(GetModel(), 1, selected_index_);
+ if (e.IsAltDown()) {
+ ShowDropDownMenu(ui::MENU_SOURCE_KEYBOARD);
+ return true;
+ }
+ new_index = index_at_or_after(GetModel(), selected_index_.value() + 1);
break;
// Move to the end of the list.
case ui::VKEY_END:
case ui::VKEY_NEXT: // Page down.
- new_index = GetAdjacentIndex(GetModel(), -1, GetModel()->GetItemCount());
+ new_index = index_before(GetModel(), GetModel()->GetItemCount());
break;
// Move to the beginning of the list.
case ui::VKEY_HOME:
case ui::VKEY_PRIOR: // Page up.
- new_index = GetAdjacentIndex(GetModel(), 1, -1);
+ new_index = index_at_or_after(GetModel(), 0);
break;
// Move to the previous item if any.
case ui::VKEY_UP:
- new_index = GetAdjacentIndex(GetModel(), -1, selected_index_);
+ new_index = index_before(GetModel(), selected_index_.value());
break;
case ui::VKEY_RETURN:
case ui::VKEY_SPACE:
- show_menu = true;
- break;
-#endif // BUILDFLAG(IS_MAC)
+ ShowDropDownMenu(ui::MENU_SOURCE_KEYBOARD);
+ return true;
+
default:
return false;
}
- if (show_menu) {
- ShowDropDownMenu(ui::MENU_SOURCE_KEYBOARD);
- } else if (new_index != selected_index_ && new_index != kNoSelection) {
- DCHECK(!GetModel()->IsItemSeparatorAt(new_index));
+ if (new_index.has_value()) {
SetSelectedIndex(new_index);
OnPerformAction();
}
-
return true;
+#endif // BUILDFLAG(IS_MAC)
}
void Combobox::OnPaint(gfx::Canvas* canvas) {
@@ -540,14 +475,14 @@ void Combobox::GetAccessibleNodeData(ui::AXNodeData* node_data) {
}
node_data->SetName(accessible_name_);
- node_data->SetValue(model_->GetItemAt(selected_index_));
+ node_data->SetValue(model_->GetItemAt(selected_index_.value()));
if (GetEnabled()) {
node_data->SetDefaultActionVerb(ax::mojom::DefaultActionVerb::kOpen);
}
node_data->AddIntAttribute(ax::mojom::IntAttribute::kPosInSet,
- selected_index_);
+ base::checked_cast<int>(selected_index_.value()));
node_data->AddIntAttribute(ax::mojom::IntAttribute::kSetSize,
- model_->GetItemCount());
+ base::checked_cast<int>(model_->GetItemCount()));
}
bool Combobox::HandleAccessibleAction(const ui::AXActionData& action_data) {
@@ -571,7 +506,7 @@ void Combobox::OnComboboxModelChanged(ui::ComboboxModel* model) {
// default index.
if (selected_index_ >= model_->GetItemCount() ||
model_->GetItemCount() == 0 ||
- model_->IsItemSeparatorAt(selected_index_)) {
+ model_->IsItemSeparatorAt(selected_index_.value())) {
SetSelectedIndex(model_->GetDefaultIndex());
}
@@ -592,6 +527,8 @@ const std::unique_ptr<ui::ComboboxModel>& Combobox::GetOwnedModel() const {
void Combobox::UpdateBorder() {
std::unique_ptr<FocusableBorder> border(new FocusableBorder());
+ if (border_color_id_.has_value())
+ border->SetColorId(border_color_id_.value());
if (invalid_)
border->SetColorId(ui::kColorAlertHighSeverity);
SetBorder(std::move(border));
@@ -613,46 +550,53 @@ void Combobox::PaintIconAndText(gfx::Canvas* canvas) {
int y = insets.top();
int contents_height = height() - insets.height();
+ DCHECK(selected_index_.has_value());
+ DCHECK_LT(selected_index_.value(), GetModel()->GetItemCount());
+
// Draw the icon.
- ui::ImageModel icon = GetModel()->GetIconAt(selected_index_);
+ ui::ImageModel icon = GetModel()->GetIconAt(selected_index_.value());
if (!icon.IsEmpty()) {
gfx::ImageSkia icon_skia = icon.Rasterize(GetColorProvider());
int icon_y = y + (contents_height - icon_skia.height()) / 2;
gfx::Rect icon_bounds(x, icon_y, icon_skia.width(), icon_skia.height());
AdjustBoundsForRTLUI(&icon_bounds);
canvas->DrawImageInt(icon_skia, icon_bounds.x(), icon_bounds.y());
- x += icon_skia.width() + LayoutProvider::Get()->GetDistanceMetric(
- DISTANCE_RELATED_LABEL_HORIZONTAL);
+ x += icon_skia.width();
}
// Draw the text.
SkColor text_color = GetTextColorForEnableState(*this, GetEnabled());
- // TODO(pbos): Do we need to handle selected_index_ == -1 for unselected here?
- // Ditto on handling an empty model?
- DCHECK_GE(selected_index_, 0);
- DCHECK_LT(selected_index_, GetModel()->GetItemCount());
- if (selected_index_ < 0 || selected_index_ >= GetModel()->GetItemCount())
- SetSelectedIndex(0);
-
- std::u16string text = GetModel()->GetItemAt(selected_index_);
+ std::u16string text = GetModel()->GetItemAt(selected_index_.value());
+ const gfx::FontList& font_list = GetFontList();
- int disclosure_arrow_offset = width() - kComboboxArrowContainerWidth;
+ // If the text is not empty, add padding between it and the icon. If there
+ // was an empty icon, this padding is not necessary.
+ if (!text.empty() && !icon.IsEmpty()) {
+ x += LayoutProvider::Get()->GetDistanceMetric(
+ DISTANCE_RELATED_LABEL_HORIZONTAL);
+ }
- const gfx::FontList& font_list = GetFontList();
+ // The total width of the text is the minimum of either the string width,
+ // or the available space, accounting for optional arrow.
int text_width = gfx::GetStringWidth(text, font_list);
- text_width =
- std::min(text_width, disclosure_arrow_offset - insets.right() - x);
+ int available_width = width() - x - insets.right();
+ if (should_show_arrow_) {
+ available_width -= kComboboxArrowContainerWidth;
+ }
+ text_width = std::min(text_width, available_width);
gfx::Rect text_bounds(x, y, text_width, contents_height);
AdjustBoundsForRTLUI(&text_bounds);
canvas->DrawStringRect(text, font_list, text_color, text_bounds);
- gfx::Rect arrow_bounds(disclosure_arrow_offset, 0,
- kComboboxArrowContainerWidth, height());
- arrow_bounds.ClampToCenteredSize(ComboboxArrowSize());
- AdjustBoundsForRTLUI(&arrow_bounds);
-
- PaintComboboxArrow(text_color, arrow_bounds, canvas);
+ // Draw the arrow.
+ if (should_show_arrow_) {
+ gfx::Rect arrow_bounds(width() - kComboboxArrowContainerWidth, 0,
+ kComboboxArrowContainerWidth, height());
+ arrow_bounds.ClampToCenteredSize(ComboboxArrowSize());
+ AdjustBoundsForRTLUI(&arrow_bounds);
+ PaintComboboxArrow(text_color, arrow_bounds, canvas);
+ }
}
void Combobox::ArrowButtonPressed(const ui::Event& event) {
@@ -678,6 +622,10 @@ void Combobox::ShowDropDownMenu(ui::MenuSourceType source_type) {
View::ConvertPointToScreen(this, &menu_position);
gfx::Rect bounds(menu_position, lb.size());
+ // If check marks exist in the combobox, adjust with bounds width to account
+ // for them.
+ if (!size_to_largest_label_)
+ bounds.set_width(MaybeAdjustWidthForCheckmarks(bounds.width()));
Button::ButtonState original_state = arrow_button_->GetState();
arrow_button_->SetState(Button::STATE_PRESSED);
@@ -690,18 +638,34 @@ void Combobox::ShowDropDownMenu(ui::MenuSourceType source_type) {
base::BindRepeating(&Combobox::OnMenuClosed, base::Unretained(this),
original_state));
}
+ if (should_highlight_) {
+ InkDrop::Get(arrow_button_)
+ ->AnimateToState(InkDropState::ACTIVATED, nullptr);
+ }
menu_runner_->RunMenuAt(GetWidget(), nullptr, bounds,
MenuAnchorPosition::kTopLeft, source_type);
NotifyAccessibilityEvent(ax::mojom::Event::kExpandedChanged, true);
}
void Combobox::OnMenuClosed(Button::ButtonState original_button_state) {
+ if (should_highlight_) {
+ InkDrop::Get(arrow_button_)
+ ->AnimateToState(InkDropState::DEACTIVATED, nullptr);
+ InkDrop::Get(arrow_button_)->GetInkDrop()->SetHovered(IsMouseHovered());
+ }
menu_runner_.reset();
arrow_button_->SetState(original_button_state);
closed_time_ = base::TimeTicks::Now();
NotifyAccessibilityEvent(ax::mojom::Event::kExpandedChanged, true);
}
+void Combobox::MenuSelectionAt(size_t index) {
+ if (!menu_selection_at_callback_ || !menu_selection_at_callback_.Run(index)) {
+ SetSelectedIndex(index);
+ OnPerformAction();
+ }
+}
+
void Combobox::OnPerformAction() {
NotifyAccessibilityEvent(ax::mojom::Event::kValueChanged, true);
SchedulePaint();
@@ -716,33 +680,50 @@ gfx::Size Combobox::GetContentSize() const {
const gfx::FontList& font_list = GetFontList();
int height = font_list.GetHeight();
int width = 0;
- for (int i = 0; i < GetModel()->GetItemCount(); ++i) {
+ for (size_t i = 0; i < GetModel()->GetItemCount(); ++i) {
if (model_->IsItemSeparatorAt(i))
continue;
if (size_to_largest_label_ || i == selected_index_) {
- int item_width = gfx::GetStringWidth(GetModel()->GetItemAt(i), font_list);
+ int item_width = 0;
ui::ImageModel icon = GetModel()->GetIconAt(i);
+ std::u16string text = GetModel()->GetItemAt(i);
if (!icon.IsEmpty()) {
gfx::ImageSkia icon_skia;
if (GetWidget())
icon_skia = icon.Rasterize(GetColorProvider());
- item_width +=
- icon_skia.width() + LayoutProvider::Get()->GetDistanceMetric(
- DISTANCE_RELATED_LABEL_HORIZONTAL);
- if (MenuConfig::instance().check_selected_combobox_item) {
- item_width +=
- kMenuCheckSize + LayoutProvider::Get()->GetDistanceMetric(
- DISTANCE_RELATED_BUTTON_HORIZONTAL);
- }
+ item_width += icon_skia.width();
height = std::max(height, icon_skia.height());
+
+ // If both the text and icon are not empty, include padding between.
+ // We do not include this padding if there is no icon present.
+ if (!text.empty()) {
+ item_width += LayoutProvider::Get()->GetDistanceMetric(
+ DISTANCE_RELATED_LABEL_HORIZONTAL);
+ }
+ }
+
+ // If text is not empty, the content size needs to include the text width
+ if (!text.empty()) {
+ item_width += gfx::GetStringWidth(GetModel()->GetItemAt(i), font_list);
}
+
+ if (size_to_largest_label_)
+ item_width = MaybeAdjustWidthForCheckmarks(item_width);
width = std::max(width, item_width);
}
}
return gfx::Size(width, height);
}
+int Combobox::MaybeAdjustWidthForCheckmarks(int original_width) const {
+ return MenuConfig::instance().check_selected_combobox_item
+ ? original_width + kMenuCheckSize +
+ LayoutProvider::Get()->GetDistanceMetric(
+ DISTANCE_RELATED_BUTTON_HORIZONTAL)
+ : original_width;
+}
+
void Combobox::OnContentSizeMaybeChanged() {
content_size_ = GetContentSize();
PreferredSizeChanged();
@@ -758,7 +739,7 @@ BEGIN_METADATA(Combobox, View)
ADD_PROPERTY_METADATA(base::RepeatingClosure, Callback)
ADD_PROPERTY_METADATA(std::unique_ptr<ui::ComboboxModel>, OwnedModel)
ADD_PROPERTY_METADATA(ui::ComboboxModel*, Model)
-ADD_PROPERTY_METADATA(int, SelectedIndex)
+ADD_PROPERTY_METADATA(absl::optional<size_t>, SelectedIndex)
ADD_PROPERTY_METADATA(bool, Invalid)
ADD_PROPERTY_METADATA(bool, SizeToLargestLabel)
ADD_PROPERTY_METADATA(std::u16string, AccessibleName)
diff --git a/chromium/ui/views/controls/combobox/combobox.h b/chromium/ui/views/controls/combobox/combobox.h
index 1a3f533256e..cebf64d887f 100644
--- a/chromium/ui/views/controls/combobox/combobox.h
+++ b/chromium/ui/views/controls/combobox/combobox.h
@@ -14,6 +14,8 @@
#include "base/time/time.h"
#include "ui/base/models/combobox_model.h"
#include "ui/base/models/combobox_model_observer.h"
+#include "ui/base/models/menu_model.h"
+#include "ui/color/color_id.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/controls/prefix_delegate.h"
#include "ui/views/metadata/view_factory.h"
@@ -43,6 +45,8 @@ class VIEWS_EXPORT Combobox : public View,
public:
METADATA_HEADER(Combobox);
+ using MenuSelectionAtCallback = base::RepeatingCallback<bool(size_t index)>;
+
static constexpr int kDefaultComboboxTextContext = style::CONTEXT_BUTTON;
static constexpr int kDefaultComboboxTextStyle = style::STYLE_PRIMARY;
@@ -69,12 +73,20 @@ class VIEWS_EXPORT Combobox : public View,
callback_ = std::move(callback);
}
+ // Set menu model.
+ void SetMenuModel(std::unique_ptr<ui::MenuModel> menu_model) {
+ menu_model_ = std::move(menu_model);
+ }
+
// Gets/Sets the selected index.
- int GetSelectedIndex() const { return selected_index_; }
- void SetSelectedIndex(int index);
+ absl::optional<size_t> GetSelectedIndex() const { return selected_index_; }
+ void SetSelectedIndex(absl::optional<size_t> index);
[[nodiscard]] base::CallbackListSubscription AddSelectedIndexChangedCallback(
views::PropertyChangedCallback callback);
+ // Called when there has been a selection from the menu.
+ void MenuSelectionAt(size_t index);
+
// Looks for the first occurrence of |value| in |model()|. If found, selects
// the found index and returns true. Otherwise simply noops and returns false.
bool SelectValue(const std::u16string& value);
@@ -99,10 +111,25 @@ class VIEWS_EXPORT Combobox : public View,
void SetInvalid(bool invalid);
bool GetInvalid() const { return invalid_; }
+ void SetBorderColorId(ui::ColorId color_id);
+ void SetBackgroundColorId(ui::ColorId color_id);
+
+ // Sets whether there should be ink drop highlighting on hover/press.
+ void SetEventHighlighting(bool should_highlight);
+
// Whether the combobox should use the largest label as the content size.
void SetSizeToLargestLabel(bool size_to_largest_label);
bool GetSizeToLargestLabel() const { return size_to_largest_label_; }
+ void SetMenuSelectionAtCallback(MenuSelectionAtCallback callback) {
+ menu_selection_at_callback_ = std::move(callback);
+ }
+
+ // Set whether the arrow should be shown to the user.
+ void SetShouldShowArrow(bool should_show_arrow) {
+ should_show_arrow_ = should_show_arrow;
+ }
+
// Use the time when combobox was closed in order for parent view to not
// treat a user event already treated by the combobox.
base::TimeTicks GetClosedTime() { return closed_time_; }
@@ -123,10 +150,10 @@ class VIEWS_EXPORT Combobox : public View,
void OnThemeChanged() override;
// Overridden from PrefixDelegate:
- int GetRowCount() override;
- int GetSelectedRow() override;
- void SetSelectedRow(int row) override;
- std::u16string GetTextForRow(int row) override;
+ size_t GetRowCount() override;
+ absl::optional<size_t> GetSelectedRow() override;
+ void SetSelectedRow(absl::optional<size_t> row) override;
+ std::u16string GetTextForRow(size_t row) override;
protected:
// Overridden from ComboboxModelObserver:
@@ -140,8 +167,6 @@ class VIEWS_EXPORT Combobox : public View,
private:
friend class test::ComboboxTestApi;
- class ComboboxMenuModel;
-
// Updates the border according to the current node_data.
void UpdateBorder();
@@ -166,6 +191,10 @@ class VIEWS_EXPORT Combobox : public View,
// Finds the size of the largest menu label.
gfx::Size GetContentSize() const;
+ // Returns the width needed to accommodate the provided width and checkmarks
+ // and padding if checkmarks should be shown.
+ int MaybeAdjustWidthForCheckmarks(int original_width) const;
+
void OnContentSizeMaybeChanged();
// Handles the clicking event.
@@ -191,12 +220,27 @@ class VIEWS_EXPORT Combobox : public View,
// Callback notified when the selected index changes.
base::RepeatingClosure callback_;
- // The current selected index; -1 and means no selection.
- int selected_index_ = -1;
+ // Callback notified when the selected index is triggered to change. If set,
+ // when a selection is made in the combobox this callback is called. If it
+ // returns true no other action is taken, if it returns false then the model
+ // will updated based on the selection.
+ MenuSelectionAtCallback menu_selection_at_callback_;
+
+ // The current selected index; nullopt means no selection.
+ absl::optional<size_t> selected_index_ = absl::nullopt;
// True when the selection is visually denoted as invalid.
bool invalid_ = false;
+ // True when there should be ink drop highlighting on hover and press.
+ bool should_highlight_ = false;
+
+ // True when the combobox should display the arrow during paint.
+ bool should_show_arrow_ = true;
+
+ // Overriding ColorId for the combobox border.
+ absl::optional<ui::ColorId> border_color_id_;
+
// The accessible name of this combobox.
std::u16string accessible_name_;
@@ -226,9 +270,10 @@ class VIEWS_EXPORT Combobox : public View,
// destroyed.
std::unique_ptr<MenuRunner> menu_runner_;
- // When true, the size of contents is defined by the selected label.
- // Otherwise, it's defined by the widest label in the menu. If this is set to
- // true, the parent view must relayout in ChildPreferredSizeChanged().
+ // When true, the size of contents is defined by the widest label in the menu.
+ // If this is set to true, the parent view must relayout in
+ // ChildPreferredSizeChanged(). When false, the size of contents is defined by
+ // the selected label
bool size_to_largest_label_ = true;
base::ScopedObservation<ui::ComboboxModel, ui::ComboboxModelObserver>
@@ -239,7 +284,7 @@ BEGIN_VIEW_BUILDER(VIEWS_EXPORT, Combobox, View)
VIEW_BUILDER_PROPERTY(base::RepeatingClosure, Callback)
VIEW_BUILDER_PROPERTY(std::unique_ptr<ui::ComboboxModel>, OwnedModel)
VIEW_BUILDER_PROPERTY(ui::ComboboxModel*, Model)
-VIEW_BUILDER_PROPERTY(int, SelectedIndex)
+VIEW_BUILDER_PROPERTY(absl::optional<size_t>, SelectedIndex)
VIEW_BUILDER_PROPERTY(bool, Invalid)
VIEW_BUILDER_PROPERTY(bool, SizeToLargestLabel)
VIEW_BUILDER_PROPERTY(std::u16string, AccessibleName)
diff --git a/chromium/ui/views/controls/combobox/combobox_menu_model.cc b/chromium/ui/views/controls/combobox/combobox_menu_model.cc
new file mode 100644
index 00000000000..156c1784882
--- /dev/null
+++ b/chromium/ui/views/controls/combobox/combobox_menu_model.cc
@@ -0,0 +1,105 @@
+// 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/views/controls/combobox/combobox_menu_model.h"
+
+ComboboxMenuModel::ComboboxMenuModel(views::Combobox* owner,
+ ui::ComboboxModel* model)
+ : owner_(owner), model_(model) {}
+
+ComboboxMenuModel::~ComboboxMenuModel() = default;
+
+bool ComboboxMenuModel::UseCheckmarks() const {
+ return views::MenuConfig::instance().check_selected_combobox_item;
+}
+
+// Overridden from MenuModel:
+bool ComboboxMenuModel::HasIcons() const {
+ for (size_t i = 0; i < GetItemCount(); ++i) {
+ if (!GetIconAt(i).IsEmpty())
+ return true;
+ }
+ return false;
+}
+
+size_t ComboboxMenuModel::GetItemCount() const {
+ return model_->GetItemCount();
+}
+
+ui::MenuModel::ItemType ComboboxMenuModel::GetTypeAt(size_t index) const {
+ if (model_->IsItemSeparatorAt(index))
+ return TYPE_SEPARATOR;
+ return UseCheckmarks() ? TYPE_CHECK : TYPE_COMMAND;
+}
+
+ui::MenuSeparatorType ComboboxMenuModel::GetSeparatorTypeAt(
+ size_t index) const {
+ return ui::NORMAL_SEPARATOR;
+}
+
+int ComboboxMenuModel::GetCommandIdAt(size_t index) const {
+ // Define the id of the first item in the menu (since it needs to be > 0)
+ constexpr int kFirstMenuItemId = 1000;
+ return static_cast<int>(index) + kFirstMenuItemId;
+}
+
+std::u16string ComboboxMenuModel::GetLabelAt(size_t index) const {
+ // Inserting the Unicode formatting characters if necessary so that the
+ // text is displayed correctly in right-to-left UIs.
+ std::u16string text = model_->GetDropDownTextAt(index);
+ base::i18n::AdjustStringForLocaleDirection(&text);
+ return text;
+}
+
+std::u16string ComboboxMenuModel::GetSecondaryLabelAt(size_t index) const {
+ std::u16string text = model_->GetDropDownSecondaryTextAt(index);
+ base::i18n::AdjustStringForLocaleDirection(&text);
+ return text;
+}
+
+bool ComboboxMenuModel::IsItemDynamicAt(size_t index) const {
+ return true;
+}
+
+const gfx::FontList* ComboboxMenuModel::GetLabelFontListAt(size_t index) const {
+ return &owner_->GetFontList();
+}
+
+bool ComboboxMenuModel::GetAcceleratorAt(size_t index,
+ ui::Accelerator* accelerator) const {
+ return false;
+}
+
+bool ComboboxMenuModel::IsItemCheckedAt(size_t index) const {
+ return UseCheckmarks() && index == owner_->GetSelectedIndex();
+}
+
+int ComboboxMenuModel::GetGroupIdAt(size_t index) const {
+ return -1;
+}
+
+ui::ImageModel ComboboxMenuModel::GetIconAt(size_t index) const {
+ return model_->GetDropDownIconAt(index);
+}
+
+ui::ButtonMenuItemModel* ComboboxMenuModel::GetButtonMenuItemAt(
+ size_t index) const {
+ return nullptr;
+}
+
+bool ComboboxMenuModel::IsEnabledAt(size_t index) const {
+ return model_->IsItemEnabledAt(index);
+}
+
+void ComboboxMenuModel::ActivatedAt(size_t index) {
+ owner_->MenuSelectionAt(index);
+}
+
+void ComboboxMenuModel::ActivatedAt(size_t index, int event_flags) {
+ ActivatedAt(index);
+}
+
+ui::MenuModel* ComboboxMenuModel::GetSubmenuModelAt(size_t index) const {
+ return nullptr;
+}
diff --git a/chromium/ui/views/controls/combobox/combobox_menu_model.h b/chromium/ui/views/controls/combobox/combobox_menu_model.h
new file mode 100644
index 00000000000..0656b735a3a
--- /dev/null
+++ b/chromium/ui/views/controls/combobox/combobox_menu_model.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 UI_VIEWS_CONTROLS_COMBOBOX_COMBOBOX_MENU_MODEL_H_
+#define UI_VIEWS_CONTROLS_COMBOBOX_COMBOBOX_MENU_MODEL_H_
+
+#include "base/i18n/rtl.h"
+#include "ui/base/models/combobox_model.h"
+#include "ui/base/models/image_model.h"
+#include "ui/base/models/menu_model.h"
+#include "ui/views/controls/combobox/combobox.h"
+#include "ui/views/controls/menu/menu_config.h"
+
+// Adapts a ui::ComboboxModel to a ui::MenuModel.
+class VIEWS_EXPORT ComboboxMenuModel : public ui::MenuModel {
+ public:
+ ComboboxMenuModel(views::Combobox* owner, ui::ComboboxModel* model);
+ ComboboxMenuModel(const ComboboxMenuModel&) = delete;
+ ComboboxMenuModel& operator&(const ComboboxMenuModel&) = delete;
+ ~ComboboxMenuModel() override;
+
+ protected:
+ ui::ComboboxModel* GetModel() const { return model_; }
+
+ private:
+ bool UseCheckmarks() const;
+
+ // Overridden from MenuModel:
+ bool HasIcons() const override;
+ size_t GetItemCount() const override;
+ ui::MenuModel::ItemType GetTypeAt(size_t index) const override;
+ ui::MenuSeparatorType GetSeparatorTypeAt(size_t index) const override;
+ int GetCommandIdAt(size_t index) const override;
+ std::u16string GetLabelAt(size_t index) const override;
+ std::u16string GetSecondaryLabelAt(size_t index) const override;
+ bool IsItemDynamicAt(size_t index) const override;
+ const gfx::FontList* GetLabelFontListAt(size_t index) const override;
+ bool GetAcceleratorAt(size_t index,
+ ui::Accelerator* accelerator) const override;
+ bool IsItemCheckedAt(size_t index) const override;
+ int GetGroupIdAt(size_t index) const override;
+ ui::ImageModel GetIconAt(size_t index) const override;
+ ui::ButtonMenuItemModel* GetButtonMenuItemAt(size_t index) const override;
+ bool IsEnabledAt(size_t index) const override;
+ void ActivatedAt(size_t index) override;
+ void ActivatedAt(size_t index, int event_flags) override;
+ ui::MenuModel* GetSubmenuModelAt(size_t index) const override;
+
+ raw_ptr<views::Combobox> owner_; // Weak. Owns this.
+ raw_ptr<ui::ComboboxModel> model_; // Weak.
+};
+
+#endif // UI_VIEWS_CONTROLS_COMBOBOX_COMBOBOX_MENU_MODEL_H_
diff --git a/chromium/ui/views/controls/combobox/combobox_unittest.cc b/chromium/ui/views/controls/combobox/combobox_unittest.cc
index 91661f33074..43be08d5b9c 100644
--- a/chromium/ui/views/controls/combobox/combobox_unittest.cc
+++ b/chromium/ui/views/controls/combobox/combobox_unittest.cc
@@ -59,24 +59,21 @@ class TestComboboxModel : public ui::ComboboxModel {
~TestComboboxModel() override = default;
- enum { kItemCount = 10 };
+ static constexpr size_t kItemCount = 10;
// ui::ComboboxModel:
- int GetItemCount() const override { return item_count_; }
- std::u16string GetItemAt(int index) const override {
- if (IsItemSeparatorAt(index)) {
- NOTREACHED();
- return u"SEPARATOR";
- }
+ size_t GetItemCount() const override { return item_count_; }
+ std::u16string GetItemAt(size_t index) const override {
+ DCHECK(!IsItemSeparatorAt(index));
return ASCIIToUTF16(index % 2 == 0 ? "PEANUT BUTTER" : "JELLY");
}
- bool IsItemSeparatorAt(int index) const override {
+ bool IsItemSeparatorAt(size_t index) const override {
return separators_.find(index) != separators_.end();
}
- int GetDefaultIndex() const override {
+ absl::optional<size_t> GetDefaultIndex() const override {
// Return the first index that is not a separator.
- for (int index = 0; index < kItemCount; ++index) {
+ for (size_t index = 0; index < kItemCount; ++index) {
if (separators_.find(index) == separators_.end())
return index;
}
@@ -84,12 +81,12 @@ class TestComboboxModel : public ui::ComboboxModel {
return 0;
}
- void SetSeparators(const std::set<int>& separators) {
+ void SetSeparators(const std::set<size_t>& separators) {
separators_ = separators;
OnModelChanged();
}
- void set_item_count(int item_count) {
+ void set_item_count(size_t item_count) {
item_count_ = item_count;
OnModelChanged();
}
@@ -100,8 +97,8 @@ class TestComboboxModel : public ui::ComboboxModel {
observer.OnComboboxModelChanged(this);
}
- std::set<int> separators_;
- int item_count_ = kItemCount;
+ std::set<size_t> separators_;
+ size_t item_count_ = kItemCount;
};
// A combobox model which refers to a vector.
@@ -115,17 +112,19 @@ class VectorComboboxModel : public ui::ComboboxModel {
~VectorComboboxModel() override = default;
- void set_default_index(int default_index) { default_index_ = default_index; }
+ void set_default_index(size_t default_index) {
+ default_index_ = default_index;
+ }
// ui::ComboboxModel:
- int GetItemCount() const override {
- return static_cast<int>(values_->size());
+ size_t GetItemCount() const override { return values_->size(); }
+ std::u16string GetItemAt(size_t index) const override {
+ return ASCIIToUTF16((*values_)[index]);
}
- std::u16string GetItemAt(int index) const override {
- return ASCIIToUTF16(values_->at(index));
+ bool IsItemSeparatorAt(size_t index) const override { return false; }
+ absl::optional<size_t> GetDefaultIndex() const override {
+ return default_index_;
}
- bool IsItemSeparatorAt(int index) const override { return false; }
- int GetDefaultIndex() const override { return default_index_; }
void ValuesChanged() {
for (auto& observer : observers())
@@ -133,7 +132,7 @@ class VectorComboboxModel : public ui::ComboboxModel {
}
private:
- int default_index_ = 0;
+ size_t default_index_ = 0;
const raw_ptr<std::vector<std::string>> values_;
};
@@ -173,7 +172,9 @@ class TestComboboxListener {
actions_performed_++;
}
- int perform_action_index() const { return perform_action_index_; }
+ absl::optional<size_t> perform_action_index() const {
+ return perform_action_index_;
+ }
bool on_perform_action_called() const { return actions_performed_ > 0; }
@@ -181,7 +182,7 @@ class TestComboboxListener {
private:
raw_ptr<Combobox> combobox_;
- int perform_action_index_ = -1;
+ absl::optional<size_t> perform_action_index_ = absl::nullopt;
int actions_performed_ = 0;
};
@@ -199,7 +200,7 @@ class ComboboxTest : public ViewsTestBase {
ViewsTestBase::TearDown();
}
- void InitCombobox(const std::set<int>* separators) {
+ void InitCombobox(const std::set<size_t>* separators) {
model_ = std::make_unique<TestComboboxModel>();
if (separators)
@@ -283,43 +284,43 @@ class ComboboxTest : public ViewsTestBase {
TEST_F(ComboboxTest, KeyTestMac) {
InitCombobox(nullptr);
PressKey(ui::VKEY_END);
- EXPECT_EQ(0, combobox_->GetSelectedIndex());
+ EXPECT_EQ(0u, combobox_->GetSelectedIndex());
EXPECT_EQ(1, menu_show_count_);
PressKey(ui::VKEY_HOME);
- EXPECT_EQ(0, combobox_->GetSelectedIndex());
+ EXPECT_EQ(0u, combobox_->GetSelectedIndex());
EXPECT_EQ(2, menu_show_count_);
PressKey(ui::VKEY_UP, ui::EF_COMMAND_DOWN);
- EXPECT_EQ(0, combobox_->GetSelectedIndex());
+ EXPECT_EQ(0u, combobox_->GetSelectedIndex());
EXPECT_EQ(3, menu_show_count_);
PressKey(ui::VKEY_DOWN, ui::EF_COMMAND_DOWN);
- EXPECT_EQ(0, combobox_->GetSelectedIndex());
+ EXPECT_EQ(0u, combobox_->GetSelectedIndex());
EXPECT_EQ(4, menu_show_count_);
PressKey(ui::VKEY_DOWN);
- EXPECT_EQ(0, combobox_->GetSelectedIndex());
+ EXPECT_EQ(0u, combobox_->GetSelectedIndex());
EXPECT_EQ(5, menu_show_count_);
PressKey(ui::VKEY_RIGHT);
- EXPECT_EQ(0, combobox_->GetSelectedIndex());
+ EXPECT_EQ(0u, combobox_->GetSelectedIndex());
EXPECT_EQ(5, menu_show_count_);
PressKey(ui::VKEY_LEFT);
- EXPECT_EQ(0, combobox_->GetSelectedIndex());
+ EXPECT_EQ(0u, combobox_->GetSelectedIndex());
EXPECT_EQ(5, menu_show_count_);
PressKey(ui::VKEY_UP);
- EXPECT_EQ(0, combobox_->GetSelectedIndex());
+ EXPECT_EQ(0u, combobox_->GetSelectedIndex());
EXPECT_EQ(6, menu_show_count_);
PressKey(ui::VKEY_PRIOR);
- EXPECT_EQ(0, combobox_->GetSelectedIndex());
+ EXPECT_EQ(0u, combobox_->GetSelectedIndex());
EXPECT_EQ(6, menu_show_count_);
PressKey(ui::VKEY_NEXT);
- EXPECT_EQ(0, combobox_->GetSelectedIndex());
+ EXPECT_EQ(0u, combobox_->GetSelectedIndex());
EXPECT_EQ(6, menu_show_count_);
}
#endif
@@ -358,153 +359,153 @@ TEST_F(ComboboxTest, DisabilityTest) {
TEST_F(ComboboxTest, KeyTest) {
InitCombobox(nullptr);
PressKey(ui::VKEY_END);
- EXPECT_EQ(model_->GetItemCount(), combobox_->GetSelectedIndex() + 1);
+ EXPECT_EQ(model_->GetItemCount() - 1, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_HOME);
- EXPECT_EQ(0, combobox_->GetSelectedIndex());
+ EXPECT_EQ(0u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_DOWN);
PressKey(ui::VKEY_DOWN);
- EXPECT_EQ(2, combobox_->GetSelectedIndex());
+ EXPECT_EQ(2u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_RIGHT);
- EXPECT_EQ(2, combobox_->GetSelectedIndex());
+ EXPECT_EQ(2u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_LEFT);
- EXPECT_EQ(2, combobox_->GetSelectedIndex());
+ EXPECT_EQ(2u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_UP);
- EXPECT_EQ(1, combobox_->GetSelectedIndex());
+ EXPECT_EQ(1u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_PRIOR);
- EXPECT_EQ(0, combobox_->GetSelectedIndex());
+ EXPECT_EQ(0u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_NEXT);
- EXPECT_EQ(model_->GetItemCount(), combobox_->GetSelectedIndex() + 1);
+ EXPECT_EQ(model_->GetItemCount() - 1, combobox_->GetSelectedIndex());
}
// Verifies that we don't select a separator line in combobox when navigating
// through keyboard.
TEST_F(ComboboxTest, SkipSeparatorSimple) {
- std::set<int> separators;
+ std::set<size_t> separators;
separators.insert(2);
InitCombobox(&separators);
- EXPECT_EQ(0, combobox_->GetSelectedIndex());
+ EXPECT_EQ(0u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_DOWN);
- EXPECT_EQ(1, combobox_->GetSelectedIndex());
+ EXPECT_EQ(1u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_DOWN);
- EXPECT_EQ(3, combobox_->GetSelectedIndex());
+ EXPECT_EQ(3u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_UP);
- EXPECT_EQ(1, combobox_->GetSelectedIndex());
+ EXPECT_EQ(1u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_HOME);
- EXPECT_EQ(0, combobox_->GetSelectedIndex());
+ EXPECT_EQ(0u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_PRIOR);
- EXPECT_EQ(0, combobox_->GetSelectedIndex());
+ EXPECT_EQ(0u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_END);
- EXPECT_EQ(9, combobox_->GetSelectedIndex());
+ EXPECT_EQ(9u, combobox_->GetSelectedIndex());
}
// Verifies that we never select the separator that is in the beginning of the
// combobox list when navigating through keyboard.
TEST_F(ComboboxTest, SkipSeparatorBeginning) {
- std::set<int> separators;
+ std::set<size_t> separators;
separators.insert(0);
InitCombobox(&separators);
- EXPECT_EQ(1, combobox_->GetSelectedIndex());
+ EXPECT_EQ(1u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_DOWN);
- EXPECT_EQ(2, combobox_->GetSelectedIndex());
+ EXPECT_EQ(2u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_DOWN);
- EXPECT_EQ(3, combobox_->GetSelectedIndex());
+ EXPECT_EQ(3u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_UP);
- EXPECT_EQ(2, combobox_->GetSelectedIndex());
+ EXPECT_EQ(2u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_HOME);
- EXPECT_EQ(1, combobox_->GetSelectedIndex());
+ EXPECT_EQ(1u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_PRIOR);
- EXPECT_EQ(1, combobox_->GetSelectedIndex());
+ EXPECT_EQ(1u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_END);
- EXPECT_EQ(9, combobox_->GetSelectedIndex());
+ EXPECT_EQ(9u, combobox_->GetSelectedIndex());
}
// Verifies that we never select the separator that is in the end of the
// combobox list when navigating through keyboard.
TEST_F(ComboboxTest, SkipSeparatorEnd) {
- std::set<int> separators;
+ std::set<size_t> separators;
separators.insert(TestComboboxModel::kItemCount - 1);
InitCombobox(&separators);
combobox_->SetSelectedIndex(8);
PressKey(ui::VKEY_DOWN);
- EXPECT_EQ(8, combobox_->GetSelectedIndex());
+ EXPECT_EQ(8u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_UP);
- EXPECT_EQ(7, combobox_->GetSelectedIndex());
+ EXPECT_EQ(7u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_END);
- EXPECT_EQ(8, combobox_->GetSelectedIndex());
+ EXPECT_EQ(8u, combobox_->GetSelectedIndex());
}
// Verifies that we never select any of the adjacent separators (multiple
// consecutive) that appear in the beginning of the combobox list when
// navigating through keyboard.
TEST_F(ComboboxTest, SkipMultipleSeparatorsAtBeginning) {
- std::set<int> separators;
+ std::set<size_t> separators;
separators.insert(0);
separators.insert(1);
separators.insert(2);
InitCombobox(&separators);
- EXPECT_EQ(3, combobox_->GetSelectedIndex());
+ EXPECT_EQ(3u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_DOWN);
- EXPECT_EQ(4, combobox_->GetSelectedIndex());
+ EXPECT_EQ(4u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_UP);
- EXPECT_EQ(3, combobox_->GetSelectedIndex());
+ EXPECT_EQ(3u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_NEXT);
- EXPECT_EQ(9, combobox_->GetSelectedIndex());
+ EXPECT_EQ(9u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_HOME);
- EXPECT_EQ(3, combobox_->GetSelectedIndex());
+ EXPECT_EQ(3u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_END);
- EXPECT_EQ(9, combobox_->GetSelectedIndex());
+ EXPECT_EQ(9u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_PRIOR);
- EXPECT_EQ(3, combobox_->GetSelectedIndex());
+ EXPECT_EQ(3u, combobox_->GetSelectedIndex());
}
// Verifies that we never select any of the adjacent separators (multiple
// consecutive) that appear in the middle of the combobox list when navigating
// through keyboard.
TEST_F(ComboboxTest, SkipMultipleAdjacentSeparatorsAtMiddle) {
- std::set<int> separators;
+ std::set<size_t> separators;
separators.insert(4);
separators.insert(5);
separators.insert(6);
InitCombobox(&separators);
combobox_->SetSelectedIndex(3);
PressKey(ui::VKEY_DOWN);
- EXPECT_EQ(7, combobox_->GetSelectedIndex());
+ EXPECT_EQ(7u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_UP);
- EXPECT_EQ(3, combobox_->GetSelectedIndex());
+ EXPECT_EQ(3u, combobox_->GetSelectedIndex());
}
// Verifies that we never select any of the adjacent separators (multiple
// consecutive) that appear in the end of the combobox list when navigating
// through keyboard.
TEST_F(ComboboxTest, SkipMultipleSeparatorsAtEnd) {
- std::set<int> separators;
+ std::set<size_t> separators;
separators.insert(7);
separators.insert(8);
separators.insert(9);
InitCombobox(&separators);
combobox_->SetSelectedIndex(6);
PressKey(ui::VKEY_DOWN);
- EXPECT_EQ(6, combobox_->GetSelectedIndex());
+ EXPECT_EQ(6u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_UP);
- EXPECT_EQ(5, combobox_->GetSelectedIndex());
+ EXPECT_EQ(5u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_HOME);
- EXPECT_EQ(0, combobox_->GetSelectedIndex());
+ EXPECT_EQ(0u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_NEXT);
- EXPECT_EQ(6, combobox_->GetSelectedIndex());
+ EXPECT_EQ(6u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_PRIOR);
- EXPECT_EQ(0, combobox_->GetSelectedIndex());
+ EXPECT_EQ(0u, combobox_->GetSelectedIndex());
PressKey(ui::VKEY_END);
- EXPECT_EQ(6, combobox_->GetSelectedIndex());
+ EXPECT_EQ(6u, combobox_->GetSelectedIndex());
}
#endif // !BUILDFLAG(IS_MAC)
TEST_F(ComboboxTest, GetTextForRowTest) {
- std::set<int> separators;
+ std::set<size_t> separators;
separators.insert(0);
separators.insert(1);
separators.insert(9);
InitCombobox(&separators);
- for (int i = 0; i < combobox_->GetRowCount(); ++i) {
+ for (size_t i = 0; i < combobox_->GetRowCount(); ++i) {
if (separators.count(i) != 0) {
EXPECT_TRUE(combobox_->GetTextForRow(i).empty()) << i;
} else {
@@ -520,11 +521,11 @@ TEST_F(ComboboxTest, SelectValue) {
InitCombobox(nullptr);
ASSERT_EQ(model_->GetDefaultIndex(), combobox_->GetSelectedIndex());
EXPECT_TRUE(combobox_->SelectValue(u"PEANUT BUTTER"));
- EXPECT_EQ(0, combobox_->GetSelectedIndex());
+ EXPECT_EQ(0u, combobox_->GetSelectedIndex());
EXPECT_TRUE(combobox_->SelectValue(u"JELLY"));
- EXPECT_EQ(1, combobox_->GetSelectedIndex());
+ EXPECT_EQ(1u, combobox_->GetSelectedIndex());
EXPECT_FALSE(combobox_->SelectValue(u"BANANAS"));
- EXPECT_EQ(1, combobox_->GetSelectedIndex());
+ EXPECT_EQ(1u, combobox_->GetSelectedIndex());
}
TEST_F(ComboboxTest, ListenerHandlesDelete) {
@@ -541,7 +542,7 @@ TEST_F(ComboboxTest, Click) {
TestComboboxListener listener(combobox_);
combobox_->SetCallback(base::BindRepeating(
&TestComboboxListener::OnPerformAction, base::Unretained(&listener)));
- combobox_->Layout();
+ RunScheduledLayout(combobox_);
// Click the left side. The menu is shown.
EXPECT_EQ(0, menu_show_count_);
@@ -558,7 +559,7 @@ TEST_F(ComboboxTest, ClickButDisabled) {
combobox_->SetCallback(base::BindRepeating(
&TestComboboxListener::OnPerformAction, base::Unretained(&listener)));
- combobox_->Layout();
+ RunScheduledLayout(combobox_);
combobox_->SetEnabled(false);
// Click the left side, but nothing happens since the combobox is disabled.
@@ -636,7 +637,7 @@ TEST_F(ComboboxTest, NotifyOnClickWithMouse) {
combobox_->SetCallback(base::BindRepeating(
&TestComboboxListener::OnPerformAction, base::Unretained(&listener)));
- combobox_->Layout();
+ RunScheduledLayout(combobox_);
// Click the right side (arrow button). The menu is shown.
const gfx::Point right_point(combobox_->x() + combobox_->width() - 1,
@@ -659,7 +660,7 @@ TEST_F(ComboboxTest, NotifyOnClickWithMouse) {
// Both the text and the arrow may toggle the menu.
EXPECT_EQ(2, menu_show_count_);
- EXPECT_EQ(-1, listener.perform_action_index()); // Nothing selected.
+ EXPECT_FALSE(listener.perform_action_index().has_value());
}
TEST_F(ComboboxTest, ConsumingPressKeyEvents) {
@@ -743,39 +744,39 @@ TEST_F(ComboboxTest, ContentWidth) {
TEST_F(ComboboxTest, ModelChanged) {
InitCombobox(nullptr);
- EXPECT_EQ(0, combobox_->GetSelectedRow());
- EXPECT_EQ(10, combobox_->GetRowCount());
+ EXPECT_EQ(0u, combobox_->GetSelectedRow());
+ EXPECT_EQ(10u, combobox_->GetRowCount());
combobox_->SetSelectedIndex(4);
- EXPECT_EQ(4, combobox_->GetSelectedRow());
+ EXPECT_EQ(4u, combobox_->GetSelectedRow());
model_->set_item_count(5);
- EXPECT_EQ(5, combobox_->GetRowCount());
- EXPECT_EQ(4, combobox_->GetSelectedRow()); // Unchanged.
+ EXPECT_EQ(5u, combobox_->GetRowCount());
+ EXPECT_EQ(4u, combobox_->GetSelectedRow()); // Unchanged.
model_->set_item_count(4);
- EXPECT_EQ(4, combobox_->GetRowCount());
- EXPECT_EQ(0, combobox_->GetSelectedRow()); // Resets.
+ EXPECT_EQ(4u, combobox_->GetRowCount());
+ EXPECT_EQ(0u, combobox_->GetSelectedRow()); // Resets.
// Restore a non-zero selection.
combobox_->SetSelectedIndex(2);
- EXPECT_EQ(2, combobox_->GetSelectedRow());
+ EXPECT_EQ(2u, combobox_->GetSelectedRow());
// Make the selected index a separator.
- std::set<int> separators;
+ std::set<size_t> separators;
separators.insert(2);
model_->SetSeparators(separators);
- EXPECT_EQ(4, combobox_->GetRowCount());
- EXPECT_EQ(0, combobox_->GetSelectedRow()); // Resets.
+ EXPECT_EQ(4u, combobox_->GetRowCount());
+ EXPECT_EQ(0u, combobox_->GetSelectedRow()); // Resets.
// Restore a non-zero selection.
combobox_->SetSelectedIndex(1);
- EXPECT_EQ(1, combobox_->GetSelectedRow());
+ EXPECT_EQ(1u, combobox_->GetSelectedRow());
// Test an empty model.
model_->set_item_count(0);
- EXPECT_EQ(0, combobox_->GetRowCount());
- EXPECT_EQ(0, combobox_->GetSelectedRow()); // Resets.
+ EXPECT_EQ(0u, combobox_->GetRowCount());
+ EXPECT_EQ(0u, combobox_->GetSelectedRow()); // Resets.
}
TEST_F(ComboboxTest, TypingPrefixNotifiesListener) {
@@ -793,7 +794,7 @@ TEST_F(ComboboxTest, TypingPrefixNotifiesListener) {
input_client->InsertChar(key_event);
EXPECT_EQ(1, listener.actions_performed());
- EXPECT_EQ(1, listener.perform_action_index());
+ EXPECT_EQ(1u, listener.perform_action_index());
// Type the second character of "JELLY", item shouldn't change and
// OnPerformAction() shouldn't be re-called.
@@ -802,7 +803,7 @@ TEST_F(ComboboxTest, TypingPrefixNotifiesListener) {
ui::DomKey::FromCharacter('E'), ui::EventTimeForNow());
input_client->InsertChar(key_event);
EXPECT_EQ(1, listener.actions_performed());
- EXPECT_EQ(1, listener.perform_action_index());
+ EXPECT_EQ(1u, listener.perform_action_index());
// Clears the typed text.
combobox_->OnBlur();
@@ -815,13 +816,13 @@ TEST_F(ComboboxTest, TypingPrefixNotifiesListener) {
ui::DomKey::FromCharacter('P'), ui::EventTimeForNow());
input_client->InsertChar(key_event);
EXPECT_EQ(2, listener.actions_performed());
- EXPECT_EQ(2, listener.perform_action_index());
+ EXPECT_EQ(2u, listener.perform_action_index());
}
// Test properties on the Combobox menu model.
TEST_F(ComboboxTest, MenuModel) {
const int kSeparatorIndex = 3;
- std::set<int> separators;
+ std::set<size_t> separators;
separators.insert(kSeparatorIndex);
InitCombobox(&separators);
@@ -898,29 +899,31 @@ class ConfigurableComboboxModel final : public ui::ComboboxModel {
}
// ui::ComboboxModel:
- int GetItemCount() const override { return item_count_; }
- std::u16string GetItemAt(int index) const override {
+ size_t GetItemCount() const override { return item_count_; }
+ std::u16string GetItemAt(size_t index) const override {
DCHECK_LT(index, item_count_);
return base::NumberToString16(index);
}
- int GetDefaultIndex() const override { return default_index_; }
+ absl::optional<size_t> GetDefaultIndex() const override {
+ return default_index_;
+ }
- void SetItemCount(int item_count) { item_count_ = item_count; }
+ void SetItemCount(size_t item_count) { item_count_ = item_count; }
- void SetDefaultIndex(int default_index) { default_index_ = default_index; }
+ void SetDefaultIndex(size_t default_index) { default_index_ = default_index; }
private:
const raw_ptr<bool> destroyed_;
- int item_count_ = 0;
- int default_index_ = -1;
+ size_t item_count_ = 0;
+ absl::optional<size_t> default_index_;
};
} // namespace
TEST_F(ComboboxDefaultTest, Default) {
auto combobox = std::make_unique<Combobox>();
- EXPECT_EQ(0, combobox->GetRowCount());
- EXPECT_EQ(-1, combobox->GetSelectedRow());
+ EXPECT_EQ(0u, combobox->GetRowCount());
+ EXPECT_FALSE(combobox->GetSelectedRow().has_value());
}
TEST_F(ComboboxDefaultTest, SetModel) {
@@ -932,8 +935,8 @@ TEST_F(ComboboxDefaultTest, SetModel) {
{
auto combobox = std::make_unique<Combobox>();
combobox->SetModel(model.get());
- EXPECT_EQ(42, combobox->GetRowCount());
- EXPECT_EQ(27, combobox->GetSelectedRow());
+ EXPECT_EQ(42u, combobox->GetRowCount());
+ EXPECT_EQ(27u, combobox->GetSelectedRow());
}
EXPECT_FALSE(destroyed);
}
@@ -947,8 +950,8 @@ TEST_F(ComboboxDefaultTest, SetOwnedModel) {
{
auto combobox = std::make_unique<Combobox>();
combobox->SetOwnedModel(std::move(model));
- EXPECT_EQ(42, combobox->GetRowCount());
- EXPECT_EQ(27, combobox->GetSelectedRow());
+ EXPECT_EQ(42u, combobox->GetRowCount());
+ EXPECT_EQ(27u, combobox->GetSelectedRow());
}
EXPECT_TRUE(destroyed);
}
diff --git a/chromium/ui/views/controls/combobox/empty_combobox_model.cc b/chromium/ui/views/controls/combobox/empty_combobox_model.cc
index becec4d176b..9c1c3edfd1e 100644
--- a/chromium/ui/views/controls/combobox/empty_combobox_model.cc
+++ b/chromium/ui/views/controls/combobox/empty_combobox_model.cc
@@ -14,17 +14,17 @@ namespace internal {
EmptyComboboxModel::EmptyComboboxModel() = default;
EmptyComboboxModel::~EmptyComboboxModel() = default;
-int EmptyComboboxModel::GetItemCount() const {
+size_t EmptyComboboxModel::GetItemCount() const {
return 0;
}
-std::u16string EmptyComboboxModel::GetItemAt(int index) const {
+std::u16string EmptyComboboxModel::GetItemAt(size_t index) const {
NOTREACHED();
return std::u16string();
}
-int EmptyComboboxModel::GetDefaultIndex() const {
- return -1;
+absl::optional<size_t> EmptyComboboxModel::GetDefaultIndex() const {
+ return absl::nullopt;
}
} // namespace internal
diff --git a/chromium/ui/views/controls/combobox/empty_combobox_model.h b/chromium/ui/views/controls/combobox/empty_combobox_model.h
index d7f5ca6d768..ec1a57db70a 100644
--- a/chromium/ui/views/controls/combobox/empty_combobox_model.h
+++ b/chromium/ui/views/controls/combobox/empty_combobox_model.h
@@ -19,9 +19,9 @@ class EmptyComboboxModel final : public ui::ComboboxModel {
~EmptyComboboxModel() override;
// ui::ComboboxModel:
- int GetItemCount() const override;
- std::u16string GetItemAt(int index) const override;
- int GetDefaultIndex() const override;
+ size_t GetItemCount() const override;
+ std::u16string GetItemAt(size_t index) const override;
+ absl::optional<size_t> GetDefaultIndex() const override;
};
} // namespace internal
diff --git a/chromium/ui/views/controls/editable_combobox/editable_combobox.cc b/chromium/ui/views/controls/editable_combobox/editable_combobox.cc
index faac607fefc..2acc0d9f511 100644
--- a/chromium/ui/views/controls/editable_combobox/editable_combobox.cc
+++ b/chromium/ui/views/controls/editable_combobox/editable_combobox.cc
@@ -156,12 +156,11 @@ class EditableCombobox::EditableComboboxMenuModel
return;
items_shown_.clear();
if (show_on_empty_ || !owner_->GetText().empty()) {
- for (int i = 0; i < combobox_model_->GetItemCount(); ++i) {
+ for (size_t i = 0; i < combobox_model_->GetItemCount(); ++i) {
if (!filter_on_edit_ ||
base::StartsWith(combobox_model_->GetItemAt(i), owner_->GetText(),
base::CompareCase::INSENSITIVE_ASCII)) {
- items_shown_.push_back(
- {static_cast<size_t>(i), combobox_model_->IsItemEnabledAt(i)});
+ items_shown_.push_back({i, combobox_model_->IsItemEnabledAt(i)});
}
}
}
@@ -177,8 +176,8 @@ class EditableCombobox::EditableComboboxMenuModel
return MenuConfig::instance().check_selected_combobox_item;
}
- std::u16string GetItemTextAt(int index, bool showing_password_text) const {
- int index_in_model = items_shown_[index].index;
+ std::u16string GetItemTextAt(size_t index, bool showing_password_text) const {
+ size_t index_in_model = items_shown_[index].index;
std::u16string text = combobox_model_->GetItemAt(index_in_model);
return showing_password_text
? text
@@ -186,7 +185,7 @@ class EditableCombobox::EditableComboboxMenuModel
gfx::RenderText::kPasswordReplacementChar);
}
- ui::ImageModel GetIconAt(int index) const override {
+ ui::ImageModel GetIconAt(size_t index) const override {
return combobox_model_->GetDropDownIconAt(items_shown_[index].index);
}
@@ -199,7 +198,7 @@ class EditableCombobox::EditableComboboxMenuModel
observation_.Reset();
}
- int GetItemCount() const override { return items_shown_.size(); }
+ size_t GetItemCount() const override { return items_shown_.size(); }
private:
struct ShownItem {
@@ -207,62 +206,62 @@ class EditableCombobox::EditableComboboxMenuModel
bool enabled;
};
bool HasIcons() const override {
- for (int i = 0; i < GetItemCount(); ++i) {
+ for (size_t i = 0; i < GetItemCount(); ++i) {
if (!GetIconAt(i).IsEmpty())
return true;
}
return false;
}
- ItemType GetTypeAt(int index) const override {
+ ItemType GetTypeAt(size_t index) const override {
return UseCheckmarks() ? TYPE_CHECK : TYPE_COMMAND;
}
- ui::MenuSeparatorType GetSeparatorTypeAt(int index) const override {
+ ui::MenuSeparatorType GetSeparatorTypeAt(size_t index) const override {
return ui::NORMAL_SEPARATOR;
}
- int GetCommandIdAt(int index) const override {
+ int GetCommandIdAt(size_t index) const override {
constexpr int kFirstMenuItemId = 1000;
- return index + kFirstMenuItemId;
+ return static_cast<int>(index) + kFirstMenuItemId;
}
- std::u16string GetLabelAt(int index) const override {
+ std::u16string GetLabelAt(size_t index) const override {
std::u16string text = GetItemTextAt(index, owner_->showing_password_text_);
base::i18n::AdjustStringForLocaleDirection(&text);
return text;
}
- bool IsItemDynamicAt(int index) const override { return false; }
+ bool IsItemDynamicAt(size_t index) const override { return false; }
- const gfx::FontList* GetLabelFontListAt(int index) const override {
+ const gfx::FontList* GetLabelFontListAt(size_t index) const override {
return &owner_->GetFontList();
}
- bool GetAcceleratorAt(int index,
+ bool GetAcceleratorAt(size_t index,
ui::Accelerator* accelerator) const override {
return false;
}
- bool IsItemCheckedAt(int index) const override {
+ bool IsItemCheckedAt(size_t index) const override {
return UseCheckmarks() &&
combobox_model_->GetItemAt(items_shown_[index].index) ==
owner_->GetText();
}
- int GetGroupIdAt(int index) const override { return -1; }
+ int GetGroupIdAt(size_t index) const override { return -1; }
- ui::ButtonMenuItemModel* GetButtonMenuItemAt(int index) const override {
+ ui::ButtonMenuItemModel* GetButtonMenuItemAt(size_t index) const override {
return nullptr;
}
- bool IsEnabledAt(int index) const override {
+ bool IsEnabledAt(size_t index) const override {
return items_shown_[index].enabled;
}
- void ActivatedAt(int index) override { owner_->OnItemSelected(index); }
+ void ActivatedAt(size_t index) override { owner_->OnItemSelected(index); }
- MenuModel* GetSubmenuModelAt(int index) const override { return nullptr; }
+ MenuModel* GetSubmenuModelAt(size_t index) const override { return nullptr; }
raw_ptr<EditableCombobox> owner_; // Weak. Owns |this|.
raw_ptr<ui::ComboboxModel> combobox_model_; // Weak.
@@ -419,15 +418,15 @@ void EditableCombobox::RevealPasswords(bool revealed) {
menu_model_->UpdateItemsShown();
}
-int EditableCombobox::GetItemCountForTest() {
+size_t EditableCombobox::GetItemCountForTest() {
return menu_model_->GetItemCount();
}
-std::u16string EditableCombobox::GetItemForTest(int index) {
+std::u16string EditableCombobox::GetItemForTest(size_t index) {
return menu_model_->GetItemTextAt(index, showing_password_text_);
}
-ui::ImageModel EditableCombobox::GetIconForTest(int index) {
+ui::ImageModel EditableCombobox::GetIconForTest(size_t index) {
return menu_model_->GetIconAt(index);
}
@@ -493,7 +492,7 @@ void EditableCombobox::CloseMenu() {
pre_target_handler_.reset();
}
-void EditableCombobox::OnItemSelected(int index) {
+void EditableCombobox::OnItemSelected(size_t index) {
// |textfield_| can hide the characters on its own so we read the actual
// characters instead of gfx::RenderText::kPasswordReplacementChar characters.
std::u16string selected_item_text =
diff --git a/chromium/ui/views/controls/editable_combobox/editable_combobox.h b/chromium/ui/views/controls/editable_combobox/editable_combobox.h
index df5143b72df..ef96793b1bf 100644
--- a/chromium/ui/views/controls/editable_combobox/editable_combobox.h
+++ b/chromium/ui/views/controls/editable_combobox/editable_combobox.h
@@ -110,9 +110,9 @@ class VIEWS_EXPORT EditableCombobox
// Accessors of private members for tests.
ui::ComboboxModel* GetComboboxModelForTest() { return combobox_model_.get(); }
- int GetItemCountForTest();
- std::u16string GetItemForTest(int index);
- ui::ImageModel GetIconForTest(int index);
+ size_t GetItemCountForTest();
+ std::u16string GetItemForTest(size_t index);
+ ui::ImageModel GetIconForTest(size_t index);
MenuRunner* GetMenuRunnerForTest() { return menu_runner_.get(); }
Textfield* GetTextfieldForTest() { return textfield_; }
@@ -123,7 +123,7 @@ class VIEWS_EXPORT EditableCombobox
void CloseMenu();
// Called when an item is selected from the menu.
- void OnItemSelected(int index);
+ void OnItemSelected(size_t index);
// Notifies listener of new content and updates the menu items to show.
void HandleNewContent(const std::u16string& new_content);
diff --git a/chromium/ui/views/controls/editable_combobox/editable_combobox_unittest.cc b/chromium/ui/views/controls/editable_combobox/editable_combobox_unittest.cc
index 2a69777a01c..7fe52c54585 100644
--- a/chromium/ui/views/controls/editable_combobox/editable_combobox_unittest.cc
+++ b/chromium/ui/views/controls/editable_combobox/editable_combobox_unittest.cc
@@ -655,7 +655,7 @@ TEST_F(EditableComboboxTest, MAYBE_RefocusingReopensMenuBasedOnLatestContent) {
combobox_->GetTextfieldForTest()->RequestFocus();
SendKeyEvent(ui::VKEY_B);
- ASSERT_EQ(3, combobox_->GetItemCountForTest());
+ ASSERT_EQ(3u, combobox_->GetItemCountForTest());
SendKeyEvent(ui::VKEY_DOWN);
SendKeyEvent(ui::VKEY_RETURN);
@@ -669,7 +669,7 @@ TEST_F(EditableComboboxTest, MAYBE_RefocusingReopensMenuBasedOnLatestContent) {
dummy_focusable_view_->RequestFocus();
ClickArrow();
EXPECT_TRUE(IsMenuOpen());
- ASSERT_EQ(2, combobox_->GetItemCountForTest());
+ ASSERT_EQ(2u, combobox_->GetItemCountForTest());
}
TEST_F(EditableComboboxTest, GetItemsWithoutFiltering) {
@@ -677,7 +677,7 @@ TEST_F(EditableComboboxTest, GetItemsWithoutFiltering) {
InitEditableCombobox(items, /*filter_on_edit=*/false, /*show_on_empty=*/true);
combobox_->SetText(u"z");
- ASSERT_EQ(2, combobox_->GetItemCountForTest());
+ ASSERT_EQ(2u, combobox_->GetItemCountForTest());
ASSERT_EQ(u"item0", combobox_->GetItemForTest(0));
ASSERT_EQ(u"item1", combobox_->GetItemForTest(1));
}
@@ -686,22 +686,22 @@ TEST_F(EditableComboboxTest, FilteringEffectOnGetItems) {
std::vector<std::u16string> items = {u"abc", u"abd", u"bac", u"bad"};
InitEditableCombobox(items, /*filter_on_edit=*/true, /*show_on_empty=*/true);
- ASSERT_EQ(4, combobox_->GetItemCountForTest());
+ ASSERT_EQ(4u, combobox_->GetItemCountForTest());
ASSERT_EQ(u"abc", combobox_->GetItemForTest(0));
ASSERT_EQ(u"abd", combobox_->GetItemForTest(1));
ASSERT_EQ(u"bac", combobox_->GetItemForTest(2));
ASSERT_EQ(u"bad", combobox_->GetItemForTest(3));
combobox_->SetText(u"b");
- ASSERT_EQ(2, combobox_->GetItemCountForTest());
+ ASSERT_EQ(2u, combobox_->GetItemCountForTest());
ASSERT_EQ(u"bac", combobox_->GetItemForTest(0));
ASSERT_EQ(u"bad", combobox_->GetItemForTest(1));
combobox_->SetText(u"bc");
- ASSERT_EQ(0, combobox_->GetItemCountForTest());
+ ASSERT_EQ(0u, combobox_->GetItemCountForTest());
combobox_->SetText(std::u16string());
- ASSERT_EQ(4, combobox_->GetItemCountForTest());
+ ASSERT_EQ(4u, combobox_->GetItemCountForTest());
ASSERT_EQ(u"abc", combobox_->GetItemForTest(0));
ASSERT_EQ(u"abd", combobox_->GetItemForTest(1));
ASSERT_EQ(u"bac", combobox_->GetItemForTest(2));
@@ -721,18 +721,18 @@ TEST_F(EditableComboboxTest, FilteringEffectOnIcons) {
/*filter_on_edit=*/true,
/*show_on_empty=*/true);
- ASSERT_EQ(2, combobox_->GetItemCountForTest());
+ ASSERT_EQ(2u, combobox_->GetItemCountForTest());
EXPECT_EQ(16,
combobox_->GetComboboxModelForTest()->GetIconAt(0).Size().width());
EXPECT_EQ(20,
combobox_->GetComboboxModelForTest()->GetIconAt(1).Size().width());
combobox_->SetText(u"a");
- ASSERT_EQ(1, combobox_->GetItemCountForTest());
+ ASSERT_EQ(1u, combobox_->GetItemCountForTest());
EXPECT_EQ(16, combobox_->GetIconForTest(0).Size().width());
combobox_->SetText(u"d");
- ASSERT_EQ(1, combobox_->GetItemCountForTest());
+ ASSERT_EQ(1u, combobox_->GetItemCountForTest());
EXPECT_EQ(20, combobox_->GetIconForTest(0).Size().width());
}
@@ -740,18 +740,18 @@ TEST_F(EditableComboboxTest, FilteringWithMismatchedCase) {
std::vector<std::u16string> items = {u"AbCd", u"aBcD", u"xyz"};
InitEditableCombobox(items, /*filter_on_edit=*/true, /*show_on_empty=*/true);
- ASSERT_EQ(3, combobox_->GetItemCountForTest());
+ ASSERT_EQ(3u, combobox_->GetItemCountForTest());
ASSERT_EQ(u"AbCd", combobox_->GetItemForTest(0));
ASSERT_EQ(u"aBcD", combobox_->GetItemForTest(1));
ASSERT_EQ(u"xyz", combobox_->GetItemForTest(2));
combobox_->SetText(u"abcd");
- ASSERT_EQ(2, combobox_->GetItemCountForTest());
+ ASSERT_EQ(2u, combobox_->GetItemCountForTest());
ASSERT_EQ(u"AbCd", combobox_->GetItemForTest(0));
ASSERT_EQ(u"aBcD", combobox_->GetItemForTest(1));
combobox_->SetText(u"ABCD");
- ASSERT_EQ(2, combobox_->GetItemCountForTest());
+ ASSERT_EQ(2u, combobox_->GetItemCountForTest());
ASSERT_EQ(u"AbCd", combobox_->GetItemForTest(0));
ASSERT_EQ(u"aBcD", combobox_->GetItemForTest(1));
}
@@ -761,9 +761,9 @@ TEST_F(EditableComboboxTest, DontShowOnEmpty) {
InitEditableCombobox(items, /*filter_on_edit=*/false,
/*show_on_empty=*/false);
- ASSERT_EQ(0, combobox_->GetItemCountForTest());
+ ASSERT_EQ(0u, combobox_->GetItemCountForTest());
combobox_->SetText(u"a");
- ASSERT_EQ(2, combobox_->GetItemCountForTest());
+ ASSERT_EQ(2u, combobox_->GetItemCountForTest());
ASSERT_EQ(u"item0", combobox_->GetItemForTest(0));
ASSERT_EQ(u"item1", combobox_->GetItemForTest(1));
}
@@ -797,7 +797,7 @@ TEST_F(EditableComboboxTest, PasswordCanBeHiddenAndRevealed) {
InitEditableCombobox(items, /*filter_on_edit=*/false, /*show_on_empty=*/true,
EditableCombobox::Type::kPassword);
- ASSERT_EQ(2, combobox_->GetItemCountForTest());
+ ASSERT_EQ(2u, combobox_->GetItemCountForTest());
ASSERT_EQ(std::u16string(5, gfx::RenderText::kPasswordReplacementChar),
combobox_->GetItemForTest(0));
ASSERT_EQ(std::u16string(5, gfx::RenderText::kPasswordReplacementChar),
@@ -909,24 +909,24 @@ class ConfigurableComboboxModel final : public ui::ComboboxModel {
}
// ui::ComboboxModel:
- int GetItemCount() const override { return item_count_; }
- std::u16string GetItemAt(int index) const override {
+ size_t GetItemCount() const override { return item_count_; }
+ std::u16string GetItemAt(size_t index) const override {
DCHECK_LT(index, item_count_);
return base::NumberToString16(index);
}
- void SetItemCount(int item_count) { item_count_ = item_count; }
+ void SetItemCount(size_t item_count) { item_count_ = item_count; }
private:
const raw_ptr<bool> destroyed_;
- int item_count_ = 0;
+ size_t item_count_ = 0;
};
} // namespace
TEST_F(EditableComboboxDefaultTest, Default) {
auto combobox = std::make_unique<EditableCombobox>();
- EXPECT_EQ(0, combobox->GetItemCountForTest());
+ EXPECT_EQ(0u, combobox->GetItemCountForTest());
}
TEST_F(EditableComboboxDefaultTest, SetModel) {
@@ -935,7 +935,7 @@ TEST_F(EditableComboboxDefaultTest, SetModel) {
model->SetItemCount(42);
auto combobox = std::make_unique<EditableCombobox>();
combobox->SetModel(std::move(model));
- EXPECT_EQ(42, combobox->GetItemCountForTest());
+ EXPECT_EQ(42u, combobox->GetItemCountForTest());
}
TEST_F(EditableComboboxDefaultTest, SetModelOverwrite) {
diff --git a/chromium/ui/views/controls/focus_ring.cc b/chromium/ui/views/controls/focus_ring.cc
index eb9373cef02..be0388f8f88 100644
--- a/chromium/ui/views/controls/focus_ring.cc
+++ b/chromium/ui/views/controls/focus_ring.cc
@@ -47,11 +47,12 @@ bool IsPathUsable(const SkPath& path) {
path.isRRect(nullptr));
}
-SkColor GetColor(View* focus_ring, bool valid) {
- if (!valid) {
- return focus_ring->GetColorProvider()->GetColor(
- ui::kColorAlertHighSeverity);
- }
+SkColor GetPaintColor(FocusRing* focus_ring, bool valid) {
+ const auto* cp = focus_ring->GetColorProvider();
+ if (!valid)
+ return cp->GetColor(ui::kColorAlertHighSeverity);
+ if (auto color_id = focus_ring->GetColorId(); color_id.has_value())
+ return cp->GetColor(color_id.value());
return GetCascadingAccentColor(focus_ring);
}
@@ -137,19 +138,37 @@ void FocusRing::SetHasFocusPredicate(const ViewPredicate& predicate) {
RefreshLayer();
}
-void FocusRing::SetColor(absl::optional<SkColor> color) {
- color_ = color;
- SchedulePaint();
+absl::optional<ui::ColorId> FocusRing::GetColorId() const {
+ return color_id_;
+}
+
+void FocusRing::SetColorId(absl::optional<ui::ColorId> color_id) {
+ if (color_id_ == color_id)
+ return;
+ color_id_ = color_id;
+ OnPropertyChanged(&color_id_, PropertyEffects::kPropertyEffectsPaint);
+}
+
+float FocusRing::GetHaloThickness() const {
+ return halo_thickness_;
+}
+
+float FocusRing::GetHaloInset() const {
+ return halo_inset_;
}
void FocusRing::SetHaloThickness(float halo_thickness) {
+ if (halo_thickness_ == halo_thickness)
+ return;
halo_thickness_ = halo_thickness;
- SchedulePaint();
+ OnPropertyChanged(&halo_thickness_, PropertyEffects::kPropertyEffectsPaint);
}
void FocusRing::SetHaloInset(float halo_inset) {
+ if (halo_inset_ == halo_inset)
+ return;
halo_inset_ = halo_inset;
- SchedulePaint();
+ OnPropertyChanged(&halo_inset_, PropertyEffects::kPropertyEffectsPaint);
}
void FocusRing::Layout() {
@@ -232,7 +251,7 @@ void FocusRing::OnPaint(gfx::Canvas* canvas) {
canvas->sk_canvas()->drawRRect(ring_rect, paint);
}
- paint.setColor(color_.value_or(GetColor(this, !invalid_)));
+ paint.setColor(GetPaintColor(this, !invalid_));
paint.setStrokeWidth(halo_thickness_);
canvas->sk_canvas()->drawRRect(ring_rect, paint);
}
@@ -273,6 +292,12 @@ void FocusRing::GetAccessibleNodeData(ui::AXNodeData* node_data) {
node_data->AddState(ax::mojom::State::kIgnored);
}
+void FocusRing::OnThemeChanged() {
+ View::OnThemeChanged();
+ if (invalid_ || color_id_.has_value())
+ SchedulePaint();
+}
+
void FocusRing::OnViewFocused(View* view) {
RefreshLayer();
}
@@ -354,6 +379,9 @@ SkPath GetHighlightPath(const View* view, float halo_thickness) {
}
BEGIN_METADATA(FocusRing, View)
+ADD_PROPERTY_METADATA(absl::optional<ui::ColorId>, ColorId)
+ADD_PROPERTY_METADATA(float, HaloInset)
+ADD_PROPERTY_METADATA(float, HaloThickness)
END_METADATA
} // namespace views
diff --git a/chromium/ui/views/controls/focus_ring.h b/chromium/ui/views/controls/focus_ring.h
index 37ad485bc85..e35f2eb8b06 100644
--- a/chromium/ui/views/controls/focus_ring.h
+++ b/chromium/ui/views/controls/focus_ring.h
@@ -9,6 +9,7 @@
#include "base/scoped_observation.h"
#include "ui/base/class_property.h"
+#include "ui/color/color_id.h"
#include "ui/native_theme/native_theme.h"
#include "ui/views/controls/focusable_border.h"
#include "ui/views/view.h"
@@ -77,11 +78,11 @@ class VIEWS_EXPORT FocusRing : public View, public ViewObserver {
// focus, but the FocusRing sits on the parent instead of the inner view.
void SetHasFocusPredicate(const ViewPredicate& predicate);
- absl::optional<SkColor> color() const { return color_; }
- void SetColor(absl::optional<SkColor> color);
+ absl::optional<ui::ColorId> GetColorId() const;
+ void SetColorId(absl::optional<ui::ColorId> color_id);
- float halo_thickness() const { return halo_thickness_; }
- float halo_inset() const { return halo_inset_; }
+ float GetHaloThickness() const;
+ float GetHaloInset() const;
void SetHaloThickness(float halo_thickness);
void SetHaloInset(float halo_inset);
@@ -91,6 +92,7 @@ class VIEWS_EXPORT FocusRing : public View, public ViewObserver {
const ViewHierarchyChangedDetails& details) override;
void OnPaint(gfx::Canvas* canvas) override;
void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
+ void OnThemeChanged() override;
// ViewObserver:
void OnViewFocused(View* view) override;
@@ -119,8 +121,8 @@ class VIEWS_EXPORT FocusRing : public View, public ViewObserver {
// the focus ring shows an invalid appearance (usually a different color).
bool invalid_ = false;
- // Overriding color for the focus ring.
- absl::optional<SkColor> color_;
+ // Overriding color_id for the focus ring.
+ absl::optional<ui::ColorId> color_id_;
// The predicate used to determine whether the parent has focus.
absl::optional<ViewPredicate> has_focus_predicate_;
diff --git a/chromium/ui/views/controls/image_view.cc b/chromium/ui/views/controls/image_view.cc
index 1cbd6988ac6..f9a6b527e45 100644
--- a/chromium/ui/views/controls/image_view.cc
+++ b/chromium/ui/views/controls/image_view.cc
@@ -9,6 +9,7 @@
#include "base/check_op.h"
#include "base/i18n/rtl.h"
#include "base/numerics/safe_conversions.h"
+#include "base/trace_event/trace_event.h"
#include "cc/paint/paint_flags.h"
#include "skia/ext/image_operations.h"
#include "ui/base/metadata/metadata_impl_macros.h"
@@ -85,8 +86,13 @@ gfx::Size ImageView::GetImageSize() const {
}
void ImageView::OnPaint(gfx::Canvas* canvas) {
- View::OnPaint(canvas);
+ // This inlines View::OnPaint in order to OnPaintBorder() after OnPaintImage
+ // so the border can paint over content (for rounded corners that overlap
+ // content).
+ TRACE_EVENT1("views", "ImageView::OnPaint", "class", GetClassName());
+ OnPaintBackground(canvas);
OnPaintImage(canvas);
+ OnPaintBorder(canvas);
}
void ImageView::OnThemeChanged() {
diff --git a/chromium/ui/views/controls/image_view_unittest.cc b/chromium/ui/views/controls/image_view_unittest.cc
index 5efb0842dbd..60ea497767b 100644
--- a/chromium/ui/views/controls/image_view_unittest.cc
+++ b/chromium/ui/views/controls/image_view_unittest.cc
@@ -102,7 +102,7 @@ TEST_P(ImageViewTest, CenterAlignment) {
bitmap.allocN32Pixels(kImageSkiaSize, kImageSkiaSize);
gfx::ImageSkia image_skia = gfx::ImageSkia::CreateFrom1xBitmap(bitmap);
image_view()->SetImage(image_skia);
- widget()->GetContentsView()->Layout();
+ RunScheduledLayout(image_view());
EXPECT_NE(gfx::Size(), image_skia.size());
// With no changes to the size / padding of |image_view|, the origin of
@@ -112,11 +112,11 @@ TEST_P(ImageViewTest, CenterAlignment) {
// Test insets are always respected in LTR and RTL.
constexpr int kInset = 5;
image_view()->SetBorder(CreateEmptyBorder(kInset));
- widget()->GetContentsView()->Layout();
+ RunScheduledLayout(image_view());
EXPECT_EQ(kInset, CurrentImageOriginForParam());
SetRTL(true);
- widget()->GetContentsView()->Layout();
+ RunScheduledLayout(image_view());
EXPECT_EQ(kInset, CurrentImageOriginForParam());
// Check this still holds true when the insets are asymmetrical.
@@ -124,11 +124,11 @@ TEST_P(ImageViewTest, CenterAlignment) {
constexpr int kTrailingInset = 6;
image_view()->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(
kLeadingInset, kLeadingInset, kTrailingInset, kTrailingInset)));
- widget()->GetContentsView()->Layout();
+ RunScheduledLayout(image_view());
EXPECT_EQ(kLeadingInset, CurrentImageOriginForParam());
SetRTL(false);
- widget()->GetContentsView()->Layout();
+ RunScheduledLayout(image_view());
EXPECT_EQ(kLeadingInset, CurrentImageOriginForParam());
}
diff --git a/chromium/ui/views/controls/label.cc b/chromium/ui/views/controls/label.cc
index c748b7ed1a9..dacb2199b93 100644
--- a/chromium/ui/views/controls/label.cc
+++ b/chromium/ui/views/controls/label.cc
@@ -350,11 +350,11 @@ void Label::SetMultiLine(bool multi_line) {
OnPropertyChanged(&multi_line_, kPropertyEffectsPreferredSizeChanged);
}
-int Label::GetMaxLines() const {
+size_t Label::GetMaxLines() const {
return max_lines_;
}
-void Label::SetMaxLines(int max_lines) {
+void Label::SetMaxLines(size_t max_lines) {
if (max_lines_ == max_lines)
return;
max_lines_ = max_lines;
@@ -576,6 +576,11 @@ int Label::GetBaseline() const {
}
gfx::Size Label::CalculatePreferredSize() const {
+ return CalculatePreferredSize({width(), {}});
+}
+
+gfx::Size Label::CalculatePreferredSize(
+ const SizeBounds& available_size) const {
// Return a size of (0, 0) if the label is not visible and if the
// |collapse_when_hidden_| flag is set.
// TODO(munjal): This logic probably belongs to the View class. But for now,
@@ -587,7 +592,7 @@ gfx::Size Label::CalculatePreferredSize() const {
if (GetMultiLine() && fixed_width_ != 0 && !GetText().empty())
return gfx::Size(fixed_width_, GetHeightForWidth(fixed_width_));
- gfx::Size size(GetTextSize());
+ gfx::Size size(GetBoundedTextSize(available_size));
const gfx::Insets insets = GetInsets();
size.Enlarge(insets.width(), insets.height());
@@ -638,7 +643,8 @@ int Label::GetHeightForWidth(int w) const {
if (!GetMultiLine() || GetText().empty() || w < 0) {
height = base_line_height;
} else if (w == 0) {
- height = std::max(GetMaxLines(), 1) * base_line_height;
+ height =
+ std::max(base::checked_cast<int>(GetMaxLines()), 1) * base_line_height;
} else {
// SetDisplayRect() has a side effect for later calls of GetStringSize().
// Be careful to invoke full_text_->SetDisplayRect(gfx::Rect()) to
@@ -650,7 +656,9 @@ int Label::GetHeightForWidth(int w) const {
int string_height = full_text_->GetStringSize().height();
// Cap the number of lines to GetMaxLines() if that's set.
height = GetMaxLines() > 0
- ? std::min(GetMaxLines() * base_line_height, string_height)
+ ? std::min(base::checked_cast<int>(GetMaxLines()) *
+ base_line_height,
+ string_height)
: string_height;
}
height -= gfx::ShadowValue::GetMargin(full_text_->shadows()).height();
@@ -711,7 +719,7 @@ std::unique_ptr<gfx::RenderText> Label::CreateRenderText() const {
render_text->set_shadows(GetShadows());
const bool multiline = GetMultiLine();
render_text->SetMultiline(multiline);
- render_text->SetMaxLines(multiline ? GetMaxLines() : 0);
+ render_text->SetMaxLines(multiline ? GetMaxLines() : size_t{0});
render_text->SetWordWrapBehavior(full_text_->word_wrap_behavior());
// Setup render text for selection controller.
@@ -1131,6 +1139,10 @@ void Label::MaybeBuildDisplayText() const {
}
gfx::Size Label::GetTextSize() const {
+ return GetBoundedTextSize({width(), {}});
+}
+
+gfx::Size Label::GetBoundedTextSize(const SizeBounds& available_size) const {
gfx::Size size;
if (GetText().empty()) {
size = gfx::Size(0, GetLineHeight());
@@ -1140,17 +1152,20 @@ gfx::Size Label::GetTextSize() const {
// to report an accurate width given the constraints and how it determines
// to elide the text. If we simply clamp the width to the max after the
// fact, then there may be some empty space left over *after* an ellipsis.
+ // TODO(kerenzhu): `available_size` should be respected, but doing so will
+ // break tests. Fix that.
full_text_->SetDisplayRect(
gfx::Rect(0, 0, max_width_single_line_ - GetInsets().width(), 0));
size = full_text_->GetStringSize();
} else {
- // Cancel the display rect of |full_text_|. The display rect may be
- // specified in GetHeightForWidth(), and specifying empty Rect cancels
- // its effect. See also the comment in GetHeightForWidth().
- // TODO(mukai): use gfx::Rect() to compute the ideal size rather than
- // the current width(). See crbug.com/468494, crbug.com/467526, and
- // the comment for MultilinePreferredSizeTest in label_unittest.cc.
- full_text_->SetDisplayRect(gfx::Rect(0, 0, width(), 0));
+ const int width = available_size.width().is_bounded()
+ ? available_size.width().value()
+ : 0;
+ // SetDisplayRect() has side-effect. The text height will change to respect
+ // width.
+ // TODO(crbug.com/1347330): `width` should respect insets, but doing so
+ // will break LabelTest.MultiLineSizing. Fix that.
+ full_text_->SetDisplayRect(gfx::Rect(0, 0, width, 0));
size = full_text_->GetStringSize();
}
const gfx::Insets shadow_margin = -gfx::ShadowValue::GetMargin(GetShadows());
@@ -1286,7 +1301,7 @@ ADD_PROPERTY_METADATA(gfx::HorizontalAlignment, HorizontalAlignment)
ADD_PROPERTY_METADATA(gfx::VerticalAlignment, VerticalAlignment)
ADD_PROPERTY_METADATA(int, LineHeight)
ADD_PROPERTY_METADATA(bool, MultiLine)
-ADD_PROPERTY_METADATA(int, MaxLines)
+ADD_PROPERTY_METADATA(size_t, MaxLines)
ADD_PROPERTY_METADATA(bool, Obscured)
ADD_PROPERTY_METADATA(bool, AllowCharacterBreak)
ADD_PROPERTY_METADATA(std::u16string, TooltipText)
diff --git a/chromium/ui/views/controls/label.h b/chromium/ui/views/controls/label.h
index 912c7d20eb0..28c9b4fc484 100644
--- a/chromium/ui/views/controls/label.h
+++ b/chromium/ui/views/controls/label.h
@@ -193,8 +193,8 @@ class VIEWS_EXPORT Label : public View,
// If multi-line, a non-zero value will cap the number of lines rendered, and
// elide the rest (currently only ELIDE_TAIL supported). See gfx::RenderText.
- int GetMaxLines() const;
- void SetMaxLines(int max_lines);
+ size_t GetMaxLines() const;
+ void SetMaxLines(size_t max_lines);
// If single-line, a non-zero value will help determine the amount of space
// needed *after* elision, which may be less than the passed |max_width|.
@@ -309,6 +309,8 @@ class VIEWS_EXPORT Label : public View,
// View:
int GetBaseline() const override;
gfx::Size CalculatePreferredSize() const override;
+ gfx::Size CalculatePreferredSize(
+ const SizeBounds& available_size) const override;
gfx::Size GetMinimumSize() const override;
int GetHeightForWidth(int w) const override;
View* GetTooltipHandlerForPoint(const gfx::Point& point) override;
@@ -407,6 +409,10 @@ class VIEWS_EXPORT Label : public View,
// Get the text size for the current layout.
gfx::Size GetTextSize() const;
+ // Get the text size that ignores the current layout and respects
+ // `available_size`.
+ gfx::Size GetBoundedTextSize(const SizeBounds& available_size) const;
+
// Returns the appropriate foreground color to use given the proposed
// |foreground| and |background| colors.
SkColor GetForegroundColor(SkColor foreground, SkColor background) const;
@@ -475,7 +481,7 @@ class VIEWS_EXPORT Label : public View,
bool auto_color_readability_enabled_ = true;
// TODO(mukai): remove |multi_line_| when all RenderText can render multiline.
bool multi_line_ = false;
- int max_lines_ = 0;
+ size_t max_lines_ = 0;
std::u16string tooltip_text_;
bool handles_tooltips_ = true;
// Whether to collapse the label when it's not visible.
diff --git a/chromium/ui/views/controls/label_unittest.cc b/chromium/ui/views/controls/label_unittest.cc
index bc26014c209..b8f0524c2a6 100644
--- a/chromium/ui/views/controls/label_unittest.cc
+++ b/chromium/ui/views/controls/label_unittest.cc
@@ -36,6 +36,7 @@
#include "ui/views/border.h"
#include "ui/views/controls/base_control_test_widget.h"
#include "ui/views/controls/link.h"
+#include "ui/views/layout/layout_types.h"
#include "ui/views/style/typography.h"
#include "ui/views/test/ax_event_counter.h"
#include "ui/views/test/focus_manager_test.h"
@@ -474,8 +475,8 @@ TEST_F(LabelTest, ObscuredSurrogatePair) {
// this behavior, therefore this behavior will have to be kept until the code
// with this assumption is fixed. See http://crbug.com/468494 and
// http://crbug.com/467526.
-// TODO(mukai): fix the code assuming this behavior and then fix Label
-// implementation, and remove this test case.
+// TODO(crbug.com/1346889): convert all callsites of GetPreferredSize() to
+// call GetPreferredSize(SizeBounds) instead.
TEST_F(LabelTest, MultilinePreferredSizeTest) {
label()->SetText(u"This is an example.");
@@ -492,6 +493,37 @@ TEST_F(LabelTest, MultilinePreferredSizeTest) {
EXPECT_LT(multi_line_size.height(), new_size.height());
}
+TEST_F(LabelTest, MultilinePreferredSizeWithConstraintTest) {
+ label()->SetText(u"This is an example.");
+
+ const gfx::Size single_line_size =
+ label()->GetPreferredSize({/* Unbounded */});
+
+ // Test the preferred size when the label is not yet laid out.
+ label()->SetMultiLine(true);
+ const gfx::Size multi_line_size_unbounded =
+ label()->GetPreferredSize({/* Unbounded */});
+ EXPECT_EQ(single_line_size, multi_line_size_unbounded);
+
+ const gfx::Size multi_line_size_bounded = label()->GetPreferredSize(
+ {single_line_size.width() / 2, {/* Unbounded */}});
+ EXPECT_GT(multi_line_size_unbounded.width(), multi_line_size_bounded.width());
+ EXPECT_LT(multi_line_size_unbounded.height(),
+ multi_line_size_bounded.height());
+
+ // Test the preferred size after the label is laid out.
+ // GetPreferredSize(SizeBounds) should ignore the existing bounds.
+ const int layout_width = multi_line_size_unbounded.width() / 3;
+ label()->SetBounds(0, 0, layout_width,
+ label()->GetHeightForWidth(layout_width));
+ const gfx::Size multi_line_size_unbounded2 =
+ label()->GetPreferredSize({/* Unbounded */});
+ const gfx::Size multi_line_size_bounded2 = label()->GetPreferredSize(
+ {single_line_size.width() / 2, {/* Unbounded */}});
+ EXPECT_EQ(multi_line_size_unbounded, multi_line_size_unbounded2);
+ EXPECT_EQ(multi_line_size_bounded, multi_line_size_bounded2);
+}
+
TEST_F(LabelTest, SingleLineGetHeightForWidth) {
// Even an empty label should take one line worth of height.
const int line_height = label()->GetLineHeight();
diff --git a/chromium/ui/views/controls/link.cc b/chromium/ui/views/controls/link.cc
index b8d70208bd8..522d723a454 100644
--- a/chromium/ui/views/controls/link.cc
+++ b/chromium/ui/views/controls/link.cc
@@ -59,6 +59,10 @@ void Link::SetForceUnderline(bool force_underline) {
RecalculateFont();
}
+bool Link::GetForceUnderline() const {
+ return force_underline_;
+}
+
ui::Cursor Link::GetCursor(const ui::MouseEvent& event) {
if (!GetEnabled())
return ui::Cursor();
@@ -231,6 +235,7 @@ void Link::ConfigureFocus() {
BEGIN_METADATA(Link, Label)
ADD_READONLY_PROPERTY_METADATA(SkColor, Color, ui::metadata::SkColorConverter)
+ADD_PROPERTY_METADATA(bool, ForceUnderline)
END_METADATA
} // namespace views
diff --git a/chromium/ui/views/controls/link.h b/chromium/ui/views/controls/link.h
index 405b605e539..115976c55b5 100644
--- a/chromium/ui/views/controls/link.h
+++ b/chromium/ui/views/controls/link.h
@@ -61,6 +61,7 @@ class VIEWS_EXPORT Link : public Label {
SkColor GetColor() const;
void SetForceUnderline(bool force_underline);
+ bool GetForceUnderline() const;
// Label:
ui::Cursor GetCursor(const ui::MouseEvent& event) override;
@@ -84,12 +85,12 @@ class VIEWS_EXPORT Link : public Label {
bool IsSelectionSupported() const override;
private:
+ virtual void RecalculateFont();
+
void SetPressed(bool pressed);
void OnClick(const ui::Event& event);
- void RecalculateFont();
-
void ConfigureFocus();
ClickedCallback callback_;
diff --git a/chromium/ui/views/controls/link_fragment.cc b/chromium/ui/views/controls/link_fragment.cc
new file mode 100644
index 00000000000..9f44db50d9e
--- /dev/null
+++ b/chromium/ui/views/controls/link_fragment.cc
@@ -0,0 +1,88 @@
+// 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/views/controls/link_fragment.h"
+
+#include <string>
+
+#include "ui/base/metadata/metadata_impl_macros.h"
+#include "ui/views/controls/link.h"
+#include "ui/views/style/typography.h"
+
+namespace views {
+
+LinkFragment::LinkFragment(const std::u16string& title,
+ int text_context,
+ int text_style,
+ LinkFragment* other_fragment)
+ : Link(title, text_context, text_style),
+ prev_fragment_(this),
+ next_fragment_(this) {
+ // Connect to the previous fragment if it exists.
+ if (other_fragment)
+ Connect(other_fragment);
+}
+
+LinkFragment::~LinkFragment() {
+ Disconnect();
+}
+
+void LinkFragment::Connect(LinkFragment* other_fragment) {
+ DCHECK(prev_fragment_ == this);
+ DCHECK(next_fragment_ == this);
+ DCHECK(other_fragment);
+
+ next_fragment_ = other_fragment->next_fragment_;
+ other_fragment->next_fragment_->prev_fragment_ = this;
+ prev_fragment_ = other_fragment;
+ other_fragment->next_fragment_ = this;
+}
+
+void LinkFragment::Disconnect() {
+ DCHECK((prev_fragment_ != this) == (next_fragment_ != this));
+ if (prev_fragment_ != this) {
+ prev_fragment_->next_fragment_ = next_fragment_;
+ next_fragment_->prev_fragment_ = prev_fragment_;
+ }
+}
+
+bool LinkFragment::IsUnderlined() const {
+ return GetEnabled() &&
+ (HasFocus() || IsMouseHovered() || GetForceUnderline());
+}
+
+void LinkFragment::RecalculateFont() {
+ // Check whether any link fragment should be underlined.
+ bool should_be_underlined = IsUnderlined();
+ for (LinkFragment* current_fragment = next_fragment_;
+ !should_be_underlined && current_fragment != this;
+ current_fragment = current_fragment->next_fragment_) {
+ should_be_underlined = current_fragment->IsUnderlined();
+ }
+
+ // If the style differs from the current one, update.
+ if ((font_list().GetFontStyle() & gfx::Font::UNDERLINE) !=
+ should_be_underlined) {
+ auto MaybeUpdateStyle = [should_be_underlined](LinkFragment* fragment) {
+ const int style = fragment->font_list().GetFontStyle();
+ const int intended_style = should_be_underlined
+ ? (style | gfx::Font::UNDERLINE)
+ : (style & ~gfx::Font::UNDERLINE);
+ fragment->Label::SetFontList(
+ fragment->font_list().DeriveWithStyle(intended_style));
+ fragment->SchedulePaint();
+ };
+ MaybeUpdateStyle(this);
+ for (LinkFragment* current_fragment = next_fragment_;
+ current_fragment != this;
+ current_fragment = current_fragment->next_fragment_) {
+ MaybeUpdateStyle(current_fragment);
+ }
+ }
+}
+
+BEGIN_METADATA(LinkFragment, Link)
+END_METADATA
+
+} // namespace views
diff --git a/chromium/ui/views/controls/link_fragment.h b/chromium/ui/views/controls/link_fragment.h
new file mode 100644
index 00000000000..20a7b87d534
--- /dev/null
+++ b/chromium/ui/views/controls/link_fragment.h
@@ -0,0 +1,57 @@
+// 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_VIEWS_CONTROLS_LINK_FRAGMENT_H_
+#define UI_VIEWS_CONTROLS_LINK_FRAGMENT_H_
+
+#include "base/memory/raw_ptr.h"
+#include "ui/views/controls/link.h"
+#include "ui/views/metadata/view_factory.h"
+#include "ui/views/style/typography.h"
+
+namespace views {
+
+// A `LinkFragment` can be used to represent a logical link that spans across
+// multiple lines. Connected `LinkFragment`s adjust their style if any single
+// one of them is hovered over of focused.
+class VIEWS_EXPORT LinkFragment : public Link {
+ public:
+ METADATA_HEADER(LinkFragment);
+
+ explicit LinkFragment(const std::u16string& title = std::u16string(),
+ int text_context = style::CONTEXT_LABEL,
+ int text_style = style::STYLE_LINK,
+ LinkFragment* other_fragment = nullptr);
+ ~LinkFragment() override;
+
+ LinkFragment(const LinkFragment&) = delete;
+ LinkFragment& operator=(const LinkFragment&) = delete;
+
+ private:
+ // Returns whether this fragment indicates that the entire link represented
+ // by it should be underlined.
+ bool IsUnderlined() const;
+
+ // Connects `this` to the `other_fragment`.
+ void Connect(LinkFragment* other_fragment);
+
+ // Disconnects `this` from any other fragments that it may be connected to.
+ void Disconnect();
+
+ // Recalculates the font style for this link fragment and, if it is changed,
+ // updates both this fragment and all other that are connected to it.
+ void RecalculateFont() override;
+
+ // Pointers to the previous and the next `LinkFragment` if the logical link
+ // represented by `this` consists of multiple such fragments (e.g. due to
+ // line breaks).
+ // If the logical link is just a single `LinkFragment` component, then these
+ // pointers point to `this`.
+ raw_ptr<LinkFragment> prev_fragment_;
+ raw_ptr<LinkFragment> next_fragment_;
+};
+
+} // namespace views
+
+#endif // UI_VIEWS_CONTROLS_LINK_FRAGMENT_H_
diff --git a/chromium/ui/views/controls/link_fragment_unittest.cc b/chromium/ui/views/controls/link_fragment_unittest.cc
new file mode 100644
index 00000000000..99ee66231ad
--- /dev/null
+++ b/chromium/ui/views/controls/link_fragment_unittest.cc
@@ -0,0 +1,140 @@
+// 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/views/controls/link_fragment.h"
+
+#include <array>
+#include <memory>
+
+#include "base/memory/raw_ptr.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/events/test/event_generator.h"
+#include "ui/views/controls/base_control_test_widget.h"
+#include "ui/views/test/view_metadata_test_utils.h"
+#include "ui/views/widget/widget.h"
+
+namespace views {
+
+namespace {
+
+constexpr char16_t kLinkLabel[] = u"Test label";
+
+class LinkFragmentTest : public test::BaseControlTestWidget {
+ public:
+ LinkFragmentTest() {
+ for (auto& fragment : fragments_) {
+ fragment = nullptr;
+ }
+ }
+ ~LinkFragmentTest() override = default;
+
+ void SetUp() override {
+ test::BaseControlTestWidget::SetUp();
+
+ event_generator_ = std::make_unique<ui::test::EventGenerator>(
+ GetContext(), widget()->GetNativeWindow());
+ }
+
+ protected:
+ void CreateWidgetContent(View* container) override {
+ // Fragment 0 is stand-alone.
+ fragments_[0] =
+ container->AddChildView(std::make_unique<LinkFragment>(kLinkLabel));
+ gfx::Rect current_rect =
+ gfx::ScaleToEnclosedRect(container->GetLocalBounds(), 0.3f);
+ fragments_[0]->SetBoundsRect(current_rect);
+ int width = current_rect.width();
+
+ // Fragments 1 and 2 are connected.
+ current_rect.Offset(width, 0);
+ fragments_[1] =
+ container->AddChildView(std::make_unique<LinkFragment>(kLinkLabel));
+ fragments_[1]->SetBoundsRect(current_rect);
+
+ current_rect.Offset(width, 0);
+ fragments_[2] = container->AddChildView(std::make_unique<LinkFragment>(
+ kLinkLabel, style::CONTEXT_LABEL, style::STYLE_LINK, fragment(1)));
+ fragments_[2]->SetBoundsRect(current_rect);
+ }
+
+ LinkFragment* fragment(size_t index) {
+ DCHECK_LT(index, 3u);
+ return fragments_[index];
+ }
+ ui::test::EventGenerator* event_generator() { return event_generator_.get(); }
+
+ // Returns bounds of the fragment.
+ gfx::Rect GetBoundsForFragment(size_t index) {
+ return fragment(index)->GetBoundsInScreen();
+ }
+
+ private:
+ std::array<raw_ptr<LinkFragment>, 3> fragments_;
+ std::unique_ptr<ui::test::EventGenerator> event_generator_;
+};
+
+} // namespace
+
+TEST_F(LinkFragmentTest, Metadata) {
+ for (size_t index = 0; index < 3; ++index) {
+ // Needed to avoid failing DCHECK when setting maximum width.
+ fragment(index)->SetMultiLine(true);
+ test::TestViewMetadata(fragment(index));
+ }
+}
+
+// Tests that hovering and unhovering a link adds and removes an underline
+// under all connected fragments.
+TEST_F(LinkFragmentTest, TestUnderlineOnHover) {
+ // A non-hovered link fragment should not be underlined.
+ const gfx::Point point_outside =
+ GetBoundsForFragment(2).bottom_right() + gfx::Vector2d(1, 1);
+ event_generator()->MoveMouseTo(point_outside);
+ EXPECT_FALSE(fragment(0)->IsMouseHovered());
+
+ const auto is_underlined = [this](size_t index) {
+ return !!(fragment(index)->font_list().GetFontStyle() &
+ gfx::Font::UNDERLINE);
+ };
+ EXPECT_FALSE(is_underlined(0));
+
+ // Hovering the first link fragment underlines it.
+ event_generator()->MoveMouseTo(GetBoundsForFragment(0).CenterPoint());
+ EXPECT_TRUE(fragment(0)->IsMouseHovered());
+ EXPECT_TRUE(is_underlined(0));
+ // The other link fragments stay non-hovered.
+ EXPECT_FALSE(is_underlined(1));
+ EXPECT_FALSE(is_underlined(2));
+
+ // Un-hovering the link removes the underline again.
+ event_generator()->MoveMouseTo(point_outside);
+ EXPECT_FALSE(fragment(0)->IsMouseHovered());
+ EXPECT_FALSE(is_underlined(0));
+ EXPECT_FALSE(is_underlined(1));
+ EXPECT_FALSE(is_underlined(2));
+
+ // Hovering the second link fragment underlines both the second and the
+ // third fragment.
+ event_generator()->MoveMouseTo(GetBoundsForFragment(1).CenterPoint());
+ EXPECT_TRUE(fragment(1)->IsMouseHovered());
+ EXPECT_FALSE(fragment(2)->IsMouseHovered());
+ EXPECT_FALSE(is_underlined(0));
+ EXPECT_TRUE(is_underlined(1));
+ EXPECT_TRUE(is_underlined(2));
+
+ // The same is true for hovering the third fragment.
+ event_generator()->MoveMouseTo(GetBoundsForFragment(2).CenterPoint());
+ EXPECT_TRUE(fragment(2)->IsMouseHovered());
+ EXPECT_FALSE(is_underlined(0));
+ EXPECT_TRUE(is_underlined(1));
+ EXPECT_TRUE(is_underlined(2));
+
+ // Moving outside removes the underline again.
+ event_generator()->MoveMouseTo(point_outside);
+ EXPECT_FALSE(is_underlined(0));
+ EXPECT_FALSE(is_underlined(1));
+ EXPECT_FALSE(is_underlined(2));
+}
+
+} // namespace views
diff --git a/chromium/ui/views/controls/menu/menu_closure_animation_mac.h b/chromium/ui/views/controls/menu/menu_closure_animation_mac.h
index dc5c283b86d..7d6d1f5fd03 100644
--- a/chromium/ui/views/controls/menu/menu_closure_animation_mac.h
+++ b/chromium/ui/views/controls/menu/menu_closure_animation_mac.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/timer/timer.h"
#include "ui/gfx/animation/animation.h"
@@ -83,8 +84,8 @@ class VIEWS_EXPORT MenuClosureAnimationMac
base::OnceClosure callback_;
base::OneShotTimer timer_;
std::unique_ptr<gfx::Animation> fade_animation_;
- MenuItemView* item_;
- SubmenuView* menu_;
+ raw_ptr<MenuItemView> item_;
+ raw_ptr<SubmenuView> menu_;
AnimationStep step_;
};
diff --git a/chromium/ui/views/controls/menu/menu_controller.cc b/chromium/ui/views/controls/menu/menu_controller.cc
index 1f1ea9ec4b5..b46a42d9ee9 100644
--- a/chromium/ui/views/controls/menu/menu_controller.cc
+++ b/chromium/ui/views/controls/menu/menu_controller.cc
@@ -317,7 +317,8 @@ static void RepostEventImpl(const ui::LocatedEvent* event,
window_y = pt.y;
}
- WPARAM target = client_area ? event->native_event().wParam : nc_hit_result;
+ WPARAM target = client_area ? event->native_event().wParam
+ : static_cast<WPARAM>(nc_hit_result);
LPARAM window_coords = MAKELPARAM(window_x, window_y);
PostMessage(target_window, event_type, target, window_coords);
return;
@@ -335,7 +336,7 @@ static void RepostEventImpl(const ui::LocatedEvent* event,
gfx::Point root_loc(screen_loc);
spc->ConvertPointFromScreen(root, &root_loc);
- std::unique_ptr<ui::Event> clone = ui::Event::Clone(*event);
+ std::unique_ptr<ui::Event> clone = event->Clone();
std::unique_ptr<ui::LocatedEvent> located_event(
static_cast<ui::LocatedEvent*>(clone.release()));
located_event->set_location(root_loc);
@@ -434,18 +435,18 @@ struct MenuController::SelectByCharDetails {
SelectByCharDetails() = default;
// Index of the first menu with the specified mnemonic.
- int first_match = -1;
+ absl::optional<size_t> first_match;
// If true there are multiple menu items with the same mnemonic.
bool has_multiple = false;
- // Index of the selected item; may remain -1.
- int index_of_item = -1;
+ // Index of the selected item; may remain nullopt.
+ absl::optional<size_t> index_of_item;
// If there are multiple matches this is the index of the item after the
- // currently selected item whose mnemonic matches. This may remain -1 even
- // though there are matches.
- int next_match = -1;
+ // currently selected item whose mnemonic matches. This may remain nullopt
+ // even though there are matches.
+ absl::optional<size_t> next_match;
};
// MenuController:State ------------------------------------------------------
@@ -937,7 +938,13 @@ void MenuController::OnGestureEvent(SubmenuView* source,
} else if (event->type() == ui::ET_GESTURE_TAP) {
if (!part.is_scroll() && part.menu &&
!(part.should_submenu_show && part.menu->HasSubmenu())) {
- if (part.menu->GetDelegate()->IsTriggerableEvent(part.menu, *event)) {
+ const int command = part.menu->GetCommand();
+ if (part.menu->GetDelegate()->ShouldExecuteCommandWithoutClosingMenu(
+ command, *event)) {
+ item_selected_by_touch_ = true;
+ part.menu->GetDelegate()->ExecuteCommand(command, 0);
+ } else if (part.menu->GetDelegate()->IsTriggerableEvent(part.menu,
+ *event)) {
item_selected_by_touch_ = true;
Accept(part.menu, event->flags());
}
@@ -1605,7 +1612,13 @@ bool MenuController::OnKeyPressed(const ui::KeyEvent& event) {
handled_key_code = true;
if (!SendAcceleratorToHotTrackedView(event.flags()) &&
pending_state_.item->GetEnabled()) {
- Accept(pending_state_.item, event.flags());
+ const int command = pending_state_.item->GetCommand();
+ if (pending_state_.item->GetDelegate()
+ ->ShouldExecuteCommandWithoutClosingMenu(command, event)) {
+ pending_state_.item->GetDelegate()->ExecuteCommand(command, 0);
+ } else {
+ Accept(pending_state_.item, event.flags());
+ }
}
}
}
@@ -2059,14 +2072,14 @@ void MenuController::CommitPendingSelection() {
state_ = pending_state_;
state_.open_leading.swap(pending_open_direction);
- int menu_depth = MenuDepth(state_.item);
+ size_t menu_depth = MenuDepth(state_.item);
if (menu_depth == 0) {
state_.open_leading.clear();
} else {
- int cached_size = static_cast<int>(state_.open_leading.size());
- DCHECK_GE(menu_depth, 0);
- while (cached_size-- >= menu_depth)
+ for (size_t cached_size = state_.open_leading.size();
+ cached_size >= menu_depth; --cached_size) {
state_.open_leading.pop_back();
+ }
}
if (!state_.item) {
@@ -2256,10 +2269,10 @@ void MenuController::BuildPathsAndCalculateDiff(
BuildMenuItemPath(old_item, old_path);
BuildMenuItemPath(new_item, new_path);
- *first_diff_at = std::distance(
+ *first_diff_at = static_cast<size_t>(std::distance(
old_path->cbegin(), std::mismatch(old_path->cbegin(), old_path->cend(),
new_path->cbegin(), new_path->cend())
- .first);
+ .first));
}
void MenuController::BuildMenuItemPath(MenuItemView* item,
@@ -2752,8 +2765,8 @@ gfx::Rect MenuController::CalculateBubbleMenuBounds(
}
// static
-int MenuController::MenuDepth(MenuItemView* item) {
- return item ? (MenuDepth(item->GetParentMenuItem()) + 1) : 0;
+size_t MenuController::MenuDepth(MenuItemView* item) {
+ return item ? (MenuDepth(item->GetParentMenuItem()) + 1) : size_t{0};
}
void MenuController::IncrementSelection(
@@ -2813,9 +2826,11 @@ void MenuController::SetSelectionIndices(MenuItemView* parent) {
if (ordering.empty())
return;
- const int set_size = ordering.size();
- for (int i = 0; i < set_size; ++i)
- ordering[i]->GetViewAccessibility().OverridePosInSet(i + 1, set_size);
+ const size_t set_size = ordering.size();
+ for (size_t i = 0; i < set_size; ++i) {
+ ordering[i]->GetViewAccessibility().OverridePosInSet(
+ static_cast<int>(i + 1), static_cast<int>(set_size));
+ }
}
void MenuController::MoveSelectionToFirstOrLastItem(
@@ -2842,38 +2857,20 @@ void MenuController::MoveSelectionToFirstOrLastItem(
MenuItemView* MenuController::FindInitialSelectableMenuItem(
MenuItemView* parent,
SelectionIncrementDirectionType direction) {
- return FindNextSelectableMenuItem(
- parent, direction == INCREMENT_SELECTION_DOWN ? -1 : 0, direction, true);
-}
-
-MenuItemView* MenuController::FindNextSelectableMenuItem(
- MenuItemView* parent,
- int index,
- SelectionIncrementDirectionType direction,
- bool is_initial) {
- int parent_count =
- static_cast<int>(parent->GetSubmenu()->GetMenuItems().size());
- int stop_index = (index + parent_count) % parent_count;
- bool include_all_items =
- (index == -1 && direction == INCREMENT_SELECTION_DOWN) ||
- (index == 0 && direction == INCREMENT_SELECTION_UP);
- int delta = direction == INCREMENT_SELECTION_UP ? -1 : 1;
- // Loop through the menu items skipping any invisible menus. The loop stops
- // when we wrap or find a visible and enabled child.
- do {
- if (!MenuConfig::instance().arrow_key_selection_wraps && !is_initial) {
- if (index == 0 && direction == INCREMENT_SELECTION_UP)
- return nullptr;
- if (index == parent_count - 1 && direction == INCREMENT_SELECTION_DOWN)
- return nullptr;
- }
- index = (index + delta + parent_count) % parent_count;
- if (index == stop_index && !include_all_items)
- return nullptr;
- MenuItemView* child = parent->GetSubmenu()->GetMenuItemAt(index);
- if (child->IsTraversableByKeyboard())
- return child;
- } while (index != stop_index);
+ const size_t parent_count = parent->GetSubmenu()->GetMenuItems().size();
+ if (direction == INCREMENT_SELECTION_DOWN) {
+ for (size_t index = 0; index < parent_count; ++index) {
+ MenuItemView* child = parent->GetSubmenu()->GetMenuItemAt(index);
+ if (child->IsTraversableByKeyboard())
+ return child;
+ }
+ } else {
+ for (size_t index = parent_count; index > 0; --index) {
+ MenuItemView* child = parent->GetSubmenu()->GetMenuItemAt(index - 1);
+ if (child->IsTraversableByKeyboard())
+ return child;
+ }
+ }
return nullptr;
}
@@ -2920,15 +2917,16 @@ MenuController::SelectByCharDetails MenuController::FindChildForMnemonic(
MenuItemView* child = menu_items[i];
if (child->GetEnabled() && child->GetVisible()) {
if (child == pending_state_.item)
- details.index_of_item = static_cast<int>(i);
+ details.index_of_item = i;
if (match_function(child, key)) {
- if (details.first_match == -1)
- details.first_match = static_cast<int>(i);
- else
+ if (!details.first_match.has_value()) {
+ details.first_match = i;
+ } else {
details.has_multiple = true;
- if (details.next_match == -1 && details.index_of_item != -1 &&
- static_cast<int>(i) > details.index_of_item)
- details.next_match = static_cast<int>(i);
+ }
+ if (!details.next_match.has_value() &&
+ details.index_of_item.has_value() && i > details.index_of_item)
+ details.next_match = i;
}
}
}
@@ -2938,23 +2936,25 @@ MenuController::SelectByCharDetails MenuController::FindChildForMnemonic(
void MenuController::AcceptOrSelect(MenuItemView* parent,
const SelectByCharDetails& details) {
// This should only be invoked if there is a match.
- DCHECK_NE(details.first_match, -1);
+ DCHECK(details.first_match.has_value());
DCHECK(parent->HasSubmenu());
SubmenuView* submenu = parent->GetSubmenu();
DCHECK(submenu);
if (!details.has_multiple) {
// There's only one match, activate it (or open if it has a submenu).
- if (submenu->GetMenuItemAt(details.first_match)->HasSubmenu()) {
- SetSelection(submenu->GetMenuItemAt(details.first_match),
+ if (submenu->GetMenuItemAt(details.first_match.value())->HasSubmenu()) {
+ SetSelection(submenu->GetMenuItemAt(details.first_match.value()),
SELECTION_OPEN_SUBMENU | SELECTION_UPDATE_IMMEDIATELY);
} else {
- Accept(submenu->GetMenuItemAt(details.first_match), 0);
+ Accept(submenu->GetMenuItemAt(details.first_match.value()), 0);
}
- } else if (details.index_of_item == -1 || details.next_match == -1) {
- SetSelection(submenu->GetMenuItemAt(details.first_match),
+ } else if (!details.index_of_item.has_value() ||
+ !details.next_match.has_value()) {
+ SetSelection(submenu->GetMenuItemAt(details.first_match.value()),
SELECTION_DEFAULT);
} else {
- SetSelection(submenu->GetMenuItemAt(details.next_match), SELECTION_DEFAULT);
+ SetSelection(submenu->GetMenuItemAt(details.next_match.value()),
+ SELECTION_DEFAULT);
}
}
@@ -2979,7 +2979,7 @@ void MenuController::SelectByChar(char16_t character) {
// Look for matches based on mnemonic first.
SelectByCharDetails details =
FindChildForMnemonic(item, key, &MatchesMnemonic);
- if (details.first_match != -1) {
+ if (details.first_match.has_value()) {
AcceptOrSelect(item, details);
return;
}
@@ -2992,7 +2992,7 @@ void MenuController::SelectByChar(char16_t character) {
} else {
// If no mnemonics found, look at first character of titles.
details = FindChildForMnemonic(item, key, &TitleMatchesMnemonic);
- if (details.first_match != -1)
+ if (details.first_match.has_value())
AcceptOrSelect(item, details);
}
}
@@ -3317,13 +3317,33 @@ void MenuController::SetNextHotTrackedView(
if (!parent)
return;
const auto menu_items = parent->GetSubmenu()->GetMenuItems();
- if (menu_items.size() <= 1)
+ const size_t num_menu_items = menu_items.size();
+ if (num_menu_items <= 1)
return;
const auto i = std::find(menu_items.cbegin(), menu_items.cend(), item);
DCHECK(i != menu_items.cend());
- MenuItemView* to_select = FindNextSelectableMenuItem(
- parent, std::distance(menu_items.cbegin(), i), direction, false);
- SetInitialHotTrackedView(to_select, direction);
+ auto index = static_cast<size_t>(std::distance(menu_items.cbegin(), i));
+
+ // Loop through the menu items in the desired direction. Assume we can wrap
+ // all the way back to this item.
+ size_t stop_index = index;
+ if (!MenuConfig::instance().arrow_key_selection_wraps) {
+ // Don't want to allow wrapping, so stop as soon as it happens.
+ stop_index = direction == INCREMENT_SELECTION_UP ? (num_menu_items - 1) : 0;
+ }
+ const size_t delta =
+ direction == INCREMENT_SELECTION_UP ? (num_menu_items - 1) : 1;
+ while (true) {
+ index = (index + delta) % num_menu_items;
+ if (index == stop_index)
+ return;
+ // Stop on the next keyboard-traversable item.
+ MenuItemView* child = parent->GetSubmenu()->GetMenuItemAt(index);
+ if (child->IsTraversableByKeyboard()) {
+ SetInitialHotTrackedView(child, direction);
+ return;
+ }
+ }
}
void MenuController::SetHotTrackedButton(Button* new_hot_button) {
@@ -3403,7 +3423,6 @@ void MenuController::SetAnchorParametersForItem(MenuItemView* item,
anchor->anchor_gravity = ui::OwnedWindowAnchorGravity::kBottomRight;
anchor->constraint_adjustment =
ui::OwnedWindowConstraintAdjustment::kAdjustmentSlideX |
- ui::OwnedWindowConstraintAdjustment::kAdjustmentSlideY |
ui::OwnedWindowConstraintAdjustment::kAdjustmentFlipY |
ui::OwnedWindowConstraintAdjustment::kAdjustmentRezizeY;
} else {
diff --git a/chromium/ui/views/controls/menu/menu_controller.h b/chromium/ui/views/controls/menu/menu_controller.h
index a4958eb4244..ed374eab8e4 100644
--- a/chromium/ui/views/controls/menu/menu_controller.h
+++ b/chromium/ui/views/controls/menu/menu_controller.h
@@ -521,7 +521,7 @@ class VIEWS_EXPORT MenuController
ui::OwnedWindowAnchor* anchor);
// Returns the depth of the menu.
- static int MenuDepth(MenuItemView* item);
+ static size_t MenuDepth(MenuItemView* item);
// Selects the next or previous (depending on |direction|) menu item.
void IncrementSelection(SelectionIncrementDirectionType direction);
@@ -545,15 +545,6 @@ class VIEWS_EXPORT MenuController
MenuItemView* parent,
SelectionIncrementDirectionType direction);
- // Returns the next or previous selectable child menu item of |parent|
- // starting at |index| and incrementing or decrementing index by 1 depending
- // on |direction|. If there are no more selectable items NULL is returned.
- MenuItemView* FindNextSelectableMenuItem(
- MenuItemView* parent,
- int index,
- SelectionIncrementDirectionType direction,
- bool is_initial);
-
// If the selected item has a submenu and it isn't currently open, the
// the selection is changed such that the menu opens immediately.
void OpenSubmenuChangeSelectionIfCan();
diff --git a/chromium/ui/views/controls/menu/menu_controller_unittest.cc b/chromium/ui/views/controls/menu/menu_controller_unittest.cc
index 0b68148ce1e..298f2fe71ac 100644
--- a/chromium/ui/views/controls/menu/menu_controller_unittest.cc
+++ b/chromium/ui/views/controls/menu/menu_controller_unittest.cc
@@ -721,17 +721,6 @@ class MenuControllerTest : public ViewsTestBase,
parent, MenuController::INCREMENT_SELECTION_UP);
}
- MenuItemView* FindNextSelectableMenuItem(MenuItemView* parent, int index) {
- return menu_controller_->FindNextSelectableMenuItem(
- parent, index, MenuController::INCREMENT_SELECTION_DOWN, false);
- }
-
- MenuItemView* FindPreviousSelectableMenuItem(MenuItemView* parent,
- int index) {
- return menu_controller_->FindNextSelectableMenuItem(
- parent, index, MenuController::INCREMENT_SELECTION_UP, false);
- }
-
internal::MenuControllerDelegate* GetCurrentDelegate() {
return menu_controller_->delegate_;
}
@@ -768,6 +757,10 @@ class MenuControllerTest : public ViewsTestBase,
// Note that coordinates of events passed to MenuController must be in that of
// the MenuScrollViewContainer.
+ void ProcessGestureEvent(SubmenuView* source, ui::GestureEvent& event) {
+ menu_controller_->OnGestureEvent(source, &event);
+ }
+
void ProcessMousePressed(SubmenuView* source, const ui::MouseEvent& event) {
menu_controller_->OnMousePressed(source, event);
}
@@ -1065,11 +1058,6 @@ TEST_F(MenuControllerTest, InitialSelectedItem) {
ASSERT_NE(nullptr, last_selectable);
EXPECT_EQ(2, last_selectable->GetCommand());
- // There should be no next or previous selectable item since there is only a
- // single enabled item in the menu.
- EXPECT_EQ(nullptr, FindNextSelectableMenuItem(menu_item(), 1));
- EXPECT_EQ(nullptr, FindPreviousSelectableMenuItem(menu_item(), 1));
-
// Clear references in menu controller to the menu item that is going away.
ResetSelection();
}
@@ -2839,7 +2827,6 @@ TEST_F(MenuControllerTest, ContextMenuInitializesAuraWindowWhenShown) {
anchor->anchor_position);
EXPECT_EQ(ui::OwnedWindowAnchorGravity::kBottomRight, anchor->anchor_gravity);
EXPECT_EQ((ui::OwnedWindowConstraintAdjustment::kAdjustmentSlideX |
- ui::OwnedWindowConstraintAdjustment::kAdjustmentSlideY |
ui::OwnedWindowConstraintAdjustment::kAdjustmentFlipY |
ui::OwnedWindowConstraintAdjustment::kAdjustmentRezizeY),
anchor->constraint_adjustment);
@@ -3256,5 +3243,75 @@ TEST_F(MenuControllerTest, BrowserHotkeysCancelMenusAndAreRedispatched) {
}
#endif
+class ExecuteCommandWithoutClosingMenuTest : public MenuControllerTest {
+ public:
+ void SetUp() override {
+ MenuControllerTest::SetUp();
+
+ views::test::DisableMenuClosureAnimations();
+ menu_controller()->Run(owner(), nullptr, menu_item(), gfx::Rect(),
+ MenuAnchorPosition::kTopLeft, false, false);
+
+ MenuHost::InitParams params;
+ params.parent = owner();
+ params.bounds = gfx::Rect(0, 0, 100, 100);
+ params.do_capture = false;
+ menu_item()->GetSubmenu()->ShowAt(params);
+
+ menu_delegate()->set_should_execute_command_without_closing_menu(true);
+ }
+};
+
+TEST_F(ExecuteCommandWithoutClosingMenuTest, OnClick) {
+ TestMenuControllerDelegate* delegate = menu_controller_delegate();
+ EXPECT_EQ(0, delegate->on_menu_closed_called());
+
+ MenuItemView* menu_item_view = menu_item()->GetSubmenu()->GetMenuItemAt(0);
+ gfx::Point press_location(menu_item_view->bounds().CenterPoint());
+ ui::MouseEvent press_event(ui::ET_MOUSE_PRESSED, press_location,
+ press_location, ui::EventTimeForNow(),
+ ui::EF_LEFT_MOUSE_BUTTON, 0);
+ ui::MouseEvent release_event(ui::ET_MOUSE_RELEASED, press_location,
+ press_location, ui::EventTimeForNow(),
+ ui::EF_LEFT_MOUSE_BUTTON, 0);
+ ProcessMousePressed(menu_item()->GetSubmenu(), press_event);
+ ProcessMouseReleased(menu_item()->GetSubmenu(), release_event);
+
+ EXPECT_EQ(0, delegate->on_menu_closed_called());
+ EXPECT_TRUE(IsShowing());
+ EXPECT_EQ(menu_delegate()->execute_command_id(),
+ menu_item_view->GetCommand());
+}
+
+TEST_F(ExecuteCommandWithoutClosingMenuTest, OnTap) {
+ TestMenuControllerDelegate* delegate = menu_controller_delegate();
+ EXPECT_EQ(0, delegate->on_menu_closed_called());
+
+ MenuItemView* menu_item_view = menu_item()->GetSubmenu()->GetMenuItemAt(0);
+ gfx::Point tap_location(menu_item_view->bounds().CenterPoint());
+ ui::GestureEvent event(tap_location.x(), tap_location.y(), 0,
+ ui::EventTimeForNow(),
+ ui::GestureEventDetails(ui::ET_GESTURE_TAP));
+ ProcessGestureEvent(menu_item()->GetSubmenu(), event);
+
+ EXPECT_EQ(0, delegate->on_menu_closed_called());
+ EXPECT_TRUE(IsShowing());
+ EXPECT_EQ(menu_delegate()->execute_command_id(),
+ menu_item_view->GetCommand());
+}
+
+TEST_F(ExecuteCommandWithoutClosingMenuTest, OnReturnKey) {
+ TestMenuControllerDelegate* delegate = menu_controller_delegate();
+ EXPECT_EQ(0, delegate->on_menu_closed_called());
+
+ DispatchKey(ui::VKEY_DOWN);
+ DispatchKey(ui::VKEY_RETURN);
+
+ EXPECT_EQ(0, delegate->on_menu_closed_called());
+ EXPECT_TRUE(IsShowing());
+ EXPECT_EQ(menu_delegate()->execute_command_id(),
+ menu_item()->GetSubmenu()->GetMenuItemAt(0)->GetCommand());
+}
+
} // namespace test
} // namespace views
diff --git a/chromium/ui/views/controls/menu/menu_insertion_delegate_win.h b/chromium/ui/views/controls/menu/menu_insertion_delegate_win.h
index 461620c55e4..235c34e7eee 100644
--- a/chromium/ui/views/controls/menu/menu_insertion_delegate_win.h
+++ b/chromium/ui/views/controls/menu/menu_insertion_delegate_win.h
@@ -12,7 +12,7 @@ namespace views {
class MenuInsertionDelegateWin {
public:
// Returns the index to insert items into the menu at.
- virtual int GetInsertionIndex(HMENU native_menu) = 0;
+ virtual size_t GetInsertionIndex(HMENU native_menu) = 0;
protected:
virtual ~MenuInsertionDelegateWin() = default;
diff --git a/chromium/ui/views/controls/menu/menu_item_view.cc b/chromium/ui/views/controls/menu/menu_item_view.cc
index 6da48e9716b..854398921a3 100644
--- a/chromium/ui/views/controls/menu/menu_item_view.cc
+++ b/chromium/ui/views/controls/menu/menu_item_view.cc
@@ -12,6 +12,7 @@
#include <numeric>
#include <utility>
+#include "base/auto_reset.h"
#include "base/containers/adapters.h"
#include "base/containers/contains.h"
#include "base/i18n/case_conversion.h"
@@ -97,9 +98,6 @@ class VerticalSeparator : public Separator {
VerticalSeparator(const VerticalSeparator&) = delete;
VerticalSeparator& operator=(const VerticalSeparator&) = delete;
~VerticalSeparator() override = default;
-
- // Separator:
- void OnThemeChanged() override;
};
VerticalSeparator::VerticalSeparator() {
@@ -109,15 +107,11 @@ VerticalSeparator::VerticalSeparator() {
gfx::Size(config.actionable_submenu_vertical_separator_width,
config.actionable_submenu_vertical_separator_height));
SetCanProcessEventsWithinSubtree(false);
-}
-
-void VerticalSeparator::OnThemeChanged() {
- Separator::OnThemeChanged();
ui::ColorId id = ui::kColorMenuSeparator;
#if BUILDFLAG(IS_CHROMEOS_ASH)
id = ui::kColorAshSystemUIMenuSeparator;
#endif
- SetColor(GetColorProvider()->GetColor(id));
+ SetColorId(id);
}
BEGIN_METADATA(VerticalSeparator, Separator)
@@ -171,8 +165,10 @@ void MenuItemView::ViewHierarchyChanged(
const ViewHierarchyChangedDetails& details) {
// Whether the selection is painted may change based on the number of
// children.
- if (details.parent == this)
+ if (details.parent == this &&
+ update_selection_based_state_in_view_herarchy_changed_) {
UpdateSelectionBasedStateIfChanged(PaintMode::kNormal);
+ }
}
std::u16string MenuItemView::GetTooltipText(const gfx::Point& p) const {
@@ -356,7 +352,7 @@ void MenuItemView::Cancel() {
}
MenuItemView* MenuItemView::AddMenuItemAt(
- int index,
+ size_t index,
int item_id,
const std::u16string& label,
const std::u16string& secondary_label,
@@ -366,10 +362,9 @@ MenuItemView* MenuItemView::AddMenuItemAt(
Type type,
ui::MenuSeparatorType separator_style) {
DCHECK_NE(type, Type::kEmpty);
- DCHECK_GE(index, 0);
if (!submenu_)
CreateSubmenu();
- DCHECK_LE(static_cast<size_t>(index), submenu_->children().size());
+ DCHECK_LE(index, submenu_->children().size());
if (type == Type::kSeparator) {
submenu_->AddChildViewAt(std::make_unique<MenuSeparator>(separator_style),
index);
@@ -429,7 +424,7 @@ void MenuItemView::AppendSeparator() {
AppendMenuItemImpl(0, std::u16string(), ui::ImageModel(), Type::kSeparator);
}
-void MenuItemView::AddSeparatorAt(int index) {
+void MenuItemView::AddSeparatorAt(size_t index) {
AddMenuItemAt(index, /*item_id=*/0, /*label=*/std::u16string(),
/*secondary_label=*/std::u16string(),
/*minor_text=*/std::u16string(),
@@ -443,8 +438,7 @@ MenuItemView* MenuItemView::AppendMenuItemImpl(int item_id,
const std::u16string& label,
const ui::ImageModel& icon,
Type type) {
- const int index =
- submenu_ ? static_cast<int>(submenu_->children().size()) : 0;
+ const size_t index = submenu_ ? submenu_->children().size() : size_t{0};
return AddMenuItemAt(index, item_id, label, std::u16string(),
std::u16string(), ui::ImageModel(), icon, type,
ui::NORMAL_SEPARATOR);
@@ -559,13 +553,22 @@ void MenuItemView::SetIcon(const ui::ImageModel& icon) {
}
void MenuItemView::SetIconView(std::unique_ptr<ImageView> icon_view) {
- if (icon_view_) {
- RemoveChildViewT(icon_view_.get());
- icon_view_ = nullptr;
+ {
+ // See comment in `update_selection_based_state_in_view_herarchy_changed_`
+ // as to why setting the field and explicitly calling
+ // UpdateSelectionBasedStateIfChanged() is necessary.
+ base::AutoReset setter(
+ &update_selection_based_state_in_view_herarchy_changed_, false);
+ if (icon_view_) {
+ RemoveChildViewT(icon_view_.get());
+ icon_view_ = nullptr;
+ }
+
+ if (icon_view)
+ icon_view_ = AddChildView(std::move(icon_view));
}
- if (icon_view)
- icon_view_ = AddChildView(std::move(icon_view));
+ UpdateSelectionBasedStateIfChanged(PaintMode::kNormal);
InvalidateLayout();
SchedulePaint();
@@ -1433,6 +1436,11 @@ gfx::Insets MenuItemView::GetContainerMargins() const {
}
int MenuItemView::NonIconChildViewsCount() const {
+ // WARNING: if adding a new field that is checked here you may need to
+ // set `update_selection_based_state_in_view_herarchy_changed_` to false
+ // when setting the field and explicitly call
+ // UpdateSelectionBasedStateIfChanged(). See comment in header
+ // for details.
return static_cast<int>(children().size()) - (icon_view_ ? 1 : 0) -
(radio_check_image_view_ ? 1 : 0) -
(submenu_arrow_image_view_ ? 1 : 0) - (vertical_separator_ ? 1 : 0);
diff --git a/chromium/ui/views/controls/menu/menu_item_view.h b/chromium/ui/views/controls/menu/menu_item_view.h
index 4fb6b50dd06..d531717529e 100644
--- a/chromium/ui/views/controls/menu/menu_item_view.h
+++ b/chromium/ui/views/controls/menu/menu_item_view.h
@@ -154,7 +154,7 @@ class VIEWS_EXPORT MenuItemView : public View {
// Add an item to the menu at a specified index. ChildrenChanged() should
// called after adding menu items if the menu may be active.
- MenuItemView* AddMenuItemAt(int index,
+ MenuItemView* AddMenuItemAt(size_t index,
int item_id,
const std::u16string& label,
const std::u16string& secondary_label,
@@ -194,7 +194,7 @@ class VIEWS_EXPORT MenuItemView : public View {
void AppendSeparator();
// Adds a separator to this menu at the specified position.
- void AddSeparatorAt(int index);
+ void AddSeparatorAt(size_t index);
// All the AppendXXX methods funnel into this.
MenuItemView* AppendMenuItemImpl(int item_id,
@@ -369,7 +369,6 @@ class VIEWS_EXPORT MenuItemView : public View {
bool is_alerted() const { return is_alerted_; }
// Returns whether or not a "new" badge should be shown on this menu item.
- // Takes into account whether the badging feature is enabled.
bool ShouldShowNewBadge() const;
// Returns whether keyboard navigation through the menu should stop on this
@@ -580,8 +579,8 @@ class VIEWS_EXPORT MenuItemView : public View {
// Command id.
int command_ = 0;
- // Whether the menu item should be badged as "New" (if badging is enabled) as
- // a way to highlight a new feature for users.
+ // Whether the menu item should be badged as "New" as a way to highlight a new
+ // feature for users.
bool is_new_ = false;
// Whether the menu item contains user-created text.
@@ -663,6 +662,19 @@ class VIEWS_EXPORT MenuItemView : public View {
// Whether this menu item is rendered differently to draw attention to it.
bool is_alerted_ = false;
+
+ // If true, ViewHierarchyChanged() will call
+ // UpdateSelectionBasedStateIfChanged().
+ // UpdateSelectionBasedStateIfChanged() calls to NonIconChildViewsCount().
+ // NonIconChildViewsCount() accesses fields of type View as part of the
+ // implementation. A common pattern for assigning a field is:
+ // icon_view_ = AddChildView(icon_view);
+ // The problem is ViewHierarchyChanged() is called during AddChildView() and
+ // before `icon_view_` is set. This means NonIconChildViewsCount() may return
+ // the wrong thing. In this case
+ // `update_selection_based_state_in_view_herarchy_changed_` is set to false
+ // and SetIconView() explicitly calls UpdateSelectionBasedStateIfChanged().
+ bool update_selection_based_state_in_view_herarchy_changed_ = true;
};
} // namespace views
diff --git a/chromium/ui/views/controls/menu/menu_item_view_unittest.cc b/chromium/ui/views/controls/menu/menu_item_view_unittest.cc
index e963380320d..419ff6d08d1 100644
--- a/chromium/ui/views/controls/menu/menu_item_view_unittest.cc
+++ b/chromium/ui/views/controls/menu/menu_item_view_unittest.cc
@@ -541,6 +541,24 @@ TEST_F(MenuItemViewPaintUnitTest,
EXPECT_FALSE(submenu_child->last_paint_as_selected_for_testing());
}
+TEST_F(MenuItemViewPaintUnitTest, SelectionBasedStateUpdatedWhenIconChanges) {
+ MenuItemView* child_menu_item =
+ menu_item_view()->AppendMenuItem(1, u"menu item");
+
+ menu_runner()->RunMenuAt(widget(), nullptr, gfx::Rect(),
+ MenuAnchorPosition::kTopLeft,
+ ui::MENU_SOURCE_KEYBOARD);
+
+ EXPECT_FALSE(child_menu_item->last_paint_as_selected_for_testing());
+ child_menu_item->SetSelected(true);
+ EXPECT_TRUE(child_menu_item->IsSelected());
+ EXPECT_TRUE(child_menu_item->last_paint_as_selected_for_testing());
+
+ child_menu_item->SetIconView(std::make_unique<ImageView>());
+ EXPECT_TRUE(child_menu_item->IsSelected());
+ EXPECT_TRUE(child_menu_item->last_paint_as_selected_for_testing());
+}
+
// Sets up a custom MenuDelegate that expects functions aren't called. See
// DontAskForFontsWhenAddingSubmenu.
class MenuItemViewAccessTest : public MenuItemViewPaintUnitTest {
diff --git a/chromium/ui/views/controls/menu/menu_model_adapter.cc b/chromium/ui/views/controls/menu/menu_model_adapter.cc
index fb5d5e6a79a..285e4a829ed 100644
--- a/chromium/ui/views/controls/menu/menu_model_adapter.cc
+++ b/chromium/ui/views/controls/menu/menu_model_adapter.cc
@@ -68,9 +68,9 @@ MenuItemView* MenuModelAdapter::CreateMenu() {
// Static.
MenuItemView* MenuModelAdapter::AddMenuItemFromModelAt(ui::MenuModel* model,
- int model_index,
+ size_t model_index,
MenuItemView* menu,
- int menu_index,
+ size_t menu_index,
int item_id) {
absl::optional<MenuItemView::Type> type;
ui::MenuModel::ItemType menu_type = model->GetTypeAt(model_index);
@@ -133,19 +133,17 @@ MenuItemView* MenuModelAdapter::AddMenuItemFromModelAt(ui::MenuModel* model,
// Static.
MenuItemView* MenuModelAdapter::AppendMenuItemFromModel(ui::MenuModel* model,
- int model_index,
+ size_t model_index,
MenuItemView* menu,
int item_id) {
- const int menu_index =
- menu->HasSubmenu()
- ? static_cast<int>(menu->GetSubmenu()->children().size())
- : 0;
+ const size_t menu_index =
+ menu->HasSubmenu() ? menu->GetSubmenu()->children().size() : size_t{0};
return AddMenuItemFromModelAt(model, model_index, menu, menu_index, item_id);
}
MenuItemView* MenuModelAdapter::AppendMenuItem(MenuItemView* menu,
ui::MenuModel* model,
- int index) {
+ size_t index) {
return AppendMenuItemFromModel(model, index, menu,
model->GetCommandIdAt(index));
}
@@ -154,7 +152,7 @@ MenuItemView* MenuModelAdapter::AppendMenuItem(MenuItemView* menu,
void MenuModelAdapter::ExecuteCommand(int id) {
ui::MenuModel* model = menu_model_;
- int index = 0;
+ size_t index = 0;
if (ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index)) {
model->ActivatedAt(index);
return;
@@ -165,7 +163,7 @@ void MenuModelAdapter::ExecuteCommand(int id) {
void MenuModelAdapter::ExecuteCommand(int id, int mouse_event_flags) {
ui::MenuModel* model = menu_model_;
- int index = 0;
+ size_t index = 0;
if (ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index)) {
model->ActivatedAt(index, mouse_event_flags);
return;
@@ -184,7 +182,7 @@ bool MenuModelAdapter::IsTriggerableEvent(MenuItemView* source,
bool MenuModelAdapter::GetAccelerator(int id,
ui::Accelerator* accelerator) const {
ui::MenuModel* model = menu_model_;
- int index = 0;
+ size_t index = 0;
if (ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index))
return model->GetAcceleratorAt(index, accelerator);
@@ -194,7 +192,7 @@ bool MenuModelAdapter::GetAccelerator(int id,
std::u16string MenuModelAdapter::GetLabel(int id) const {
ui::MenuModel* model = menu_model_;
- int index = 0;
+ size_t index = 0;
if (ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index))
return model->GetLabelAt(index);
@@ -204,7 +202,7 @@ std::u16string MenuModelAdapter::GetLabel(int id) const {
const gfx::FontList* MenuModelAdapter::GetLabelFontList(int id) const {
ui::MenuModel* model = menu_model_;
- int index = 0;
+ size_t index = 0;
if (ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index)) {
const gfx::FontList* font_list = model->GetLabelFontListAt(index);
if (font_list)
@@ -217,7 +215,7 @@ const gfx::FontList* MenuModelAdapter::GetLabelFontList(int id) const {
bool MenuModelAdapter::IsCommandEnabled(int id) const {
ui::MenuModel* model = menu_model_;
- int index = 0;
+ size_t index = 0;
if (ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index))
return model->IsEnabledAt(index);
@@ -227,7 +225,7 @@ bool MenuModelAdapter::IsCommandEnabled(int id) const {
bool MenuModelAdapter::IsCommandVisible(int id) const {
ui::MenuModel* model = menu_model_;
- int index = 0;
+ size_t index = 0;
if (ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index))
return model->IsVisibleAt(index);
@@ -237,7 +235,7 @@ bool MenuModelAdapter::IsCommandVisible(int id) const {
bool MenuModelAdapter::IsItemChecked(int id) const {
ui::MenuModel* model = menu_model_;
- int index = 0;
+ size_t index = 0;
if (ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index))
return model->IsItemCheckedAt(index);
@@ -290,8 +288,8 @@ void MenuModelAdapter::BuildMenuImpl(MenuItemView* menu, ui::MenuModel* model) {
DCHECK(menu);
DCHECK(model);
bool has_icons = model->HasIcons();
- const int item_count = model->GetItemCount();
- for (int i = 0; i < item_count; ++i) {
+ const size_t item_count = model->GetItemCount();
+ for (size_t i = 0; i < item_count; ++i) {
MenuItemView* item = AppendMenuItem(menu, model, i);
if (item) {
// Enabled state should be ignored for titles as they are non-interactive.
diff --git a/chromium/ui/views/controls/menu/menu_model_adapter.h b/chromium/ui/views/controls/menu/menu_model_adapter.h
index b7c7474fb59..ebbc36a305a 100644
--- a/chromium/ui/views/controls/menu/menu_model_adapter.h
+++ b/chromium/ui/views/controls/menu/menu_model_adapter.h
@@ -53,15 +53,15 @@ class VIEWS_EXPORT MenuModelAdapter : public MenuDelegate,
// Creates a menu item for the specified entry in the model and adds it as
// a child to |menu| at the specified |menu_index|.
static MenuItemView* AddMenuItemFromModelAt(ui::MenuModel* model,
- int model_index,
+ size_t model_index,
MenuItemView* menu,
- int menu_index,
+ size_t menu_index,
int item_id);
// Creates a menu item for the specified entry in the model and appends it as
// a child to |menu|.
static MenuItemView* AppendMenuItemFromModel(ui::MenuModel* model,
- int model_index,
+ size_t model_index,
MenuItemView* menu,
int item_id);
@@ -76,7 +76,7 @@ class VIEWS_EXPORT MenuModelAdapter : public MenuDelegate,
// menu.
virtual MenuItemView* AppendMenuItem(MenuItemView* menu,
ui::MenuModel* model,
- int index);
+ size_t index);
// views::MenuDelegate implementation.
void ExecuteCommand(int id) override;
diff --git a/chromium/ui/views/controls/menu/menu_model_adapter_unittest.cc b/chromium/ui/views/controls/menu/menu_model_adapter_unittest.cc
index e193f357398..3b2dc294c55 100644
--- a/chromium/ui/views/controls/menu/menu_model_adapter_unittest.cc
+++ b/chromium/ui/views/controls/menu/menu_model_adapter_unittest.cc
@@ -27,7 +27,7 @@ constexpr int kActionableSubmenuIdBase = 300;
class MenuModelBase : public ui::MenuModel {
public:
explicit MenuModelBase(int command_id_base)
- : command_id_base_(command_id_base), last_activation_(-1) {}
+ : command_id_base_(command_id_base) {}
MenuModelBase(const MenuModelBase&) = delete;
MenuModelBase& operator=(const MenuModelBase&) = delete;
@@ -38,62 +38,70 @@ class MenuModelBase : public ui::MenuModel {
bool HasIcons() const override { return false; }
- int GetItemCount() const override { return static_cast<int>(items_.size()); }
+ size_t GetItemCount() const override { return items_.size(); }
- ItemType GetTypeAt(int index) const override { return items_[index].type; }
+ ItemType GetTypeAt(size_t index) const override { return items_[index].type; }
- ui::MenuSeparatorType GetSeparatorTypeAt(int index) const override {
+ ui::MenuSeparatorType GetSeparatorTypeAt(size_t index) const override {
return ui::NORMAL_SEPARATOR;
}
- int GetCommandIdAt(int index) const override {
- return index + command_id_base_;
+ int GetCommandIdAt(size_t index) const override {
+ return static_cast<int>(index) + command_id_base_;
}
- std::u16string GetLabelAt(int index) const override {
+ std::u16string GetLabelAt(size_t index) const override {
return items_[index].label;
}
- bool IsItemDynamicAt(int index) const override { return false; }
+ bool IsItemDynamicAt(size_t index) const override { return false; }
- const gfx::FontList* GetLabelFontListAt(int index) const override {
+ const gfx::FontList* GetLabelFontListAt(size_t index) const override {
return nullptr;
}
- bool GetAcceleratorAt(int index,
+ bool GetAcceleratorAt(size_t index,
ui::Accelerator* accelerator) const override {
return false;
}
- bool IsItemCheckedAt(int index) const override { return false; }
+ bool IsItemCheckedAt(size_t index) const override { return false; }
- int GetGroupIdAt(int index) const override { return 0; }
+ int GetGroupIdAt(size_t index) const override { return 0; }
- ui::ImageModel GetIconAt(int index) const override {
+ ui::ImageModel GetIconAt(size_t index) const override {
return ui::ImageModel();
}
- ui::ButtonMenuItemModel* GetButtonMenuItemAt(int index) const override {
+ ui::ButtonMenuItemModel* GetButtonMenuItemAt(size_t index) const override {
return nullptr;
}
- bool IsEnabledAt(int index) const override { return items_[index].enabled; }
+ bool IsEnabledAt(size_t index) const override {
+ return items_[index].enabled;
+ }
- bool IsVisibleAt(int index) const override { return items_[index].visible; }
+ bool IsVisibleAt(size_t index) const override {
+ return items_[index].visible;
+ }
- bool IsAlertedAt(int index) const override { return items_[index].alerted; }
+ bool IsAlertedAt(size_t index) const override {
+ return items_[index].alerted;
+ }
- bool IsNewFeatureAt(int index) const override {
+ bool IsNewFeatureAt(size_t index) const override {
return items_[index].new_feature;
}
- MenuModel* GetSubmenuModelAt(int index) const override {
+ MenuModel* GetSubmenuModelAt(size_t index) const override {
return items_[index].submenu;
}
- void ActivatedAt(int index) override { set_last_activation(index); }
+ void ActivatedAt(size_t index) override { set_last_activation(index); }
- void ActivatedAt(int index, int event_flags) override { ActivatedAt(index); }
+ void ActivatedAt(size_t index, int event_flags) override {
+ ActivatedAt(index);
+ }
void MenuWillShow() override {}
@@ -133,8 +141,8 @@ class MenuModelBase : public ui::MenuModel {
const Item& GetItemDefinition(size_t index) { return items_[index]; }
// Access index argument to ActivatedAt().
- int last_activation() const { return last_activation_; }
- void set_last_activation(int last_activation) {
+ absl::optional<size_t> last_activation() const { return last_activation_; }
+ void set_last_activation(absl::optional<size_t> last_activation) {
last_activation_ = last_activation;
}
@@ -143,7 +151,7 @@ class MenuModelBase : public ui::MenuModel {
private:
int command_id_base_;
- int last_activation_;
+ absl::optional<size_t> last_activation_;
};
class SubmenuModel : public MenuModelBase {
@@ -204,7 +212,7 @@ void CheckSubmenu(const RootModel& model,
views::MenuModelAdapter* delegate,
int submenu_id,
size_t expected_children,
- int submenu_model_index,
+ size_t submenu_model_index,
int id) {
views::MenuItemView* submenu = menu->GetMenuItemByID(submenu_id);
views::SubmenuView* subitem_container = submenu->GetSubmenu();
@@ -222,7 +230,7 @@ void CheckSubmenu(const RootModel& model,
continue;
}
// Check placement.
- EXPECT_EQ(i, static_cast<size_t>(submenu->GetSubmenu()->GetIndexOf(item)));
+ EXPECT_EQ(i, submenu->GetSubmenu()->GetIndexOf(item));
// Check type.
switch (model_item.type) {
@@ -267,8 +275,8 @@ void CheckSubmenu(const RootModel& model,
// Check activation.
static_cast<views::MenuDelegate*>(delegate)->ExecuteCommand(id);
- EXPECT_EQ(i, static_cast<size_t>(submodel->last_activation()));
- submodel->set_last_activation(-1);
+ EXPECT_EQ(i, submodel->last_activation());
+ submodel->set_last_activation(absl::nullopt);
}
}
@@ -306,7 +314,7 @@ TEST_F(MenuModelAdapterTest, BasicTest) {
}
// Check placement.
- EXPECT_EQ(i, static_cast<size_t>(menu->GetSubmenu()->GetIndexOf(item)));
+ EXPECT_EQ(i, menu->GetSubmenu()->GetIndexOf(item));
// Check type.
switch (model_item.type) {
@@ -351,8 +359,8 @@ TEST_F(MenuModelAdapterTest, BasicTest) {
// Check activation.
static_cast<views::MenuDelegate*>(&delegate)->ExecuteCommand(id);
- EXPECT_EQ(i, static_cast<size_t>(model.last_activation()));
- model.set_last_activation(-1);
+ EXPECT_EQ(i, model.last_activation());
+ model.set_last_activation(absl::nullopt);
}
// Check the submenu.
diff --git a/chromium/ui/views/controls/menu/menu_pre_target_handler_mac.h b/chromium/ui/views/controls/menu/menu_pre_target_handler_mac.h
index a4eedef51d7..bd63b29c5f7 100644
--- a/chromium/ui/views/controls/menu/menu_pre_target_handler_mac.h
+++ b/chromium/ui/views/controls/menu/menu_pre_target_handler_mac.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/memory/raw_ptr.h"
#include "ui/views/cocoa/native_widget_mac_ns_window_host.h"
#include "ui/views/controls/menu/menu_pre_target_handler.h"
@@ -34,7 +35,7 @@ class MenuPreTargetHandlerMac : public MenuPreTargetHandler,
bool* was_handled) final;
std::unique_ptr<NativeWidgetMacEventMonitor> monitor_;
- MenuController* const controller_; // Weak. Owns |this|.
+ const raw_ptr<MenuController> controller_; // Weak. Owns |this|.
};
} // namespace views
diff --git a/chromium/ui/views/controls/menu/menu_runner_cocoa_unittest.mm b/chromium/ui/views/controls/menu/menu_runner_cocoa_unittest.mm
index 06022dd6404..95b0d17154a 100644
--- a/chromium/ui/views/controls/menu/menu_runner_cocoa_unittest.mm
+++ b/chromium/ui/views/controls/menu/menu_runner_cocoa_unittest.mm
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/memory/raw_ptr.h"
+
#import "ui/views/controls/menu/menu_runner_impl_cocoa.h"
#import <Cocoa/Cocoa.h>
@@ -69,7 +71,7 @@ class TestModel : public ui::SimpleMenuModel {
}
private:
- TestModel* model_;
+ raw_ptr<TestModel> model_;
};
private:
@@ -130,7 +132,7 @@ class MenuRunnerCocoaTest : public ViewsTestBase,
if (runner_) {
runner_->Release();
- runner_ = NULL;
+ runner_ = nullptr;
}
parent_->CloseNow();
@@ -247,8 +249,8 @@ class MenuRunnerCocoaTest : public ViewsTestBase,
protected:
std::unique_ptr<TestModel> menu_;
- internal::MenuRunnerImplInterface* runner_ = nullptr;
- views::Widget* parent_ = nullptr;
+ raw_ptr<internal::MenuRunnerImplInterface> runner_ = nullptr;
+ raw_ptr<views::Widget> parent_ = nullptr;
NSRect last_anchor_frame_ = NSZeroRect;
NSUInteger native_view_subview_count_ = 0;
int menu_close_count_ = 0;
@@ -384,7 +386,7 @@ TEST_P(MenuRunnerCocoaTest, CancelWithoutRunning) {
TEST_P(MenuRunnerCocoaTest, DeleteWithoutRunning) {
runner_->Release();
- runner_ = NULL;
+ runner_ = nullptr;
EXPECT_EQ(0, menu_close_count_);
}
diff --git a/chromium/ui/views/controls/menu/menu_runner_impl_cocoa.mm b/chromium/ui/views/controls/menu/menu_runner_impl_cocoa.mm
index 6f92eb0c4f6..a6dec3b24f5 100644
--- a/chromium/ui/views/controls/menu/menu_runner_impl_cocoa.mm
+++ b/chromium/ui/views/controls/menu/menu_runner_impl_cocoa.mm
@@ -9,6 +9,7 @@
#include "base/i18n/rtl.h"
#include "base/mac/mac_util.h"
#import "base/message_loop/message_pump_mac.h"
+#include "base/numerics/safe_conversions.h"
#import "skia/ext/skia_utils_mac.h"
#import "ui/base/cocoa/cocoa_base_utils.h"
#import "ui/base/cocoa/menu_controller.h"
@@ -212,7 +213,7 @@ NSImage* IPHDotImage(const ui::ColorProvider* color_provider) {
- (void)controllerWillAddItem:(NSMenuItem*)menuItem
fromModel:(ui::MenuModel*)model
- atIndex:(NSInteger)index
+ atIndex:(size_t)index
withColorProvider:(const ui::ColorProvider*)colorProvider {
if (model->IsNewFeatureAt(index)) {
NSMutableAttributedString* attrTitle = [[[NSMutableAttributedString alloc]
@@ -242,12 +243,12 @@ NSImage* IPHDotImage(const ui::ColorProvider* color_provider) {
}
- (void)controllerWillAddMenu:(NSMenu*)menu fromModel:(ui::MenuModel*)model {
- int alerted_index = -1;
+ absl::optional<size_t> alerted_index;
IdentifierContainer* const element_ids =
[[[IdentifierContainer alloc] init] autorelease];
- for (int i = 0; i < model->GetItemCount(); ++i) {
+ for (size_t i = 0; i < model->GetItemCount(); ++i) {
if (model->IsAlertedAt(i)) {
- DCHECK_LT(alerted_index, 0);
+ DCHECK(!alerted_index.has_value());
alerted_index = i;
}
const ui::ElementIdentifier identifier = model->GetElementIdentifierAt(i);
@@ -255,14 +256,16 @@ NSImage* IPHDotImage(const ui::ColorProvider* color_provider) {
[element_ids ids].push_back(identifier);
}
- if (alerted_index >= 0 || ![element_ids ids].empty()) {
+ if (alerted_index.has_value() || ![element_ids ids].empty()) {
auto shown_callback = ^(NSNotification* note) {
NSMenu* const menu_obj = note.object;
- if (alerted_index >= 0) {
+ if (alerted_index.has_value()) {
if ([menu respondsToSelector:@selector(_menuImpl)]) {
NSCarbonMenuImpl* menuImpl = [menu_obj _menuImpl];
if ([menuImpl respondsToSelector:@selector(highlightItemAtIndex:)]) {
- [menuImpl highlightItemAtIndex:alerted_index];
+ const auto index =
+ base::checked_cast<NSInteger>(alerted_index.value());
+ [menuImpl highlightItemAtIndex:index];
}
}
}
@@ -366,8 +369,10 @@ namespace {
// Returns the first item in |menu_controller|'s menu that will be checked.
NSMenuItem* FirstCheckedItem(MenuControllerCocoa* menu_controller) {
for (NSMenuItem* item in [[menu_controller menu] itemArray]) {
- if ([menu_controller model]->IsItemCheckedAt([item tag]))
+ if ([menu_controller model]->IsItemCheckedAt(
+ base::checked_cast<size_t>([item tag]))) {
return item;
+ }
}
return nil;
}
diff --git a/chromium/ui/views/controls/menu/native_menu_win.cc b/chromium/ui/views/controls/menu/native_menu_win.cc
index 3a62f75fdbf..3a5fdbab314 100644
--- a/chromium/ui/views/controls/menu/native_menu_win.cc
+++ b/chromium/ui/views/controls/menu/native_menu_win.cc
@@ -31,7 +31,7 @@ struct NativeMenuWin::ItemData {
raw_ptr<NativeMenuWin> native_menu_win;
// The index of the item within the menu's model.
- int model_index;
+ size_t model_index;
};
// Returns the NativeMenuWin for a particular HMENU.
@@ -68,10 +68,10 @@ void NativeMenuWin::Rebuild(MenuInsertionDelegateWin* delegate) {
items_.clear();
owner_draw_ = model_->HasIcons() || owner_draw_;
- first_item_index_ = delegate ? delegate->GetInsertionIndex(menu_) : 0;
- for (int model_index = 0; model_index < model_->GetItemCount();
+ first_item_index_ = delegate ? delegate->GetInsertionIndex(menu_) : size_t{0};
+ for (size_t model_index = 0; model_index < model_->GetItemCount();
++model_index) {
- int menu_index = model_index + first_item_index_;
+ size_t menu_index = model_index + first_item_index_;
if (model_->GetTypeAt(model_index) == ui::MenuModel::TYPE_SEPARATOR)
AddSeparatorItemAt(menu_index, model_index);
else
@@ -81,9 +81,9 @@ void NativeMenuWin::Rebuild(MenuInsertionDelegateWin* delegate) {
void NativeMenuWin::UpdateStates() {
// A depth-first walk of the menu items, updating states.
- int model_index = 0;
+ size_t model_index = 0;
for (const auto& item : items_) {
- int menu_index = model_index + first_item_index_;
+ size_t menu_index = model_index + first_item_index_;
SetMenuItemState(menu_index, model_->IsEnabledAt(model_index),
model_->IsItemCheckedAt(model_index), false);
if (model_->IsItemDynamicAt(model_index)) {
@@ -101,7 +101,7 @@ void NativeMenuWin::UpdateStates() {
////////////////////////////////////////////////////////////////////////////////
// NativeMenuWin, private:
-bool NativeMenuWin::IsSeparatorItemAt(int menu_index) const {
+bool NativeMenuWin::IsSeparatorItemAt(size_t menu_index) const {
MENUITEMINFO mii = {0};
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_FTYPE;
@@ -109,7 +109,7 @@ bool NativeMenuWin::IsSeparatorItemAt(int menu_index) const {
return !!(mii.fType & MF_SEPARATOR);
}
-void NativeMenuWin::AddMenuItemAt(int menu_index, int model_index) {
+void NativeMenuWin::AddMenuItemAt(size_t menu_index, size_t model_index) {
MENUITEMINFO mii = {0};
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_FTYPE | MIIM_ID | MIIM_DATA;
@@ -131,29 +131,31 @@ void NativeMenuWin::AddMenuItemAt(int menu_index, int model_index) {
} else {
if (type == ui::MenuModel::TYPE_RADIO)
mii.fType |= MFT_RADIOCHECK;
- mii.wID = model_->GetCommandIdAt(model_index);
+ mii.wID = static_cast<UINT>(model_->GetCommandIdAt(model_index));
}
item_data->native_menu_win = this;
item_data->model_index = model_index;
mii.dwItemData = reinterpret_cast<ULONG_PTR>(item_data.get());
- items_.insert(items_.begin() + model_index, std::move(item_data));
+ items_.insert(items_.begin() + static_cast<ptrdiff_t>(model_index),
+ std::move(item_data));
UpdateMenuItemInfoForString(&mii, model_index,
model_->GetLabelAt(model_index));
InsertMenuItem(menu_, menu_index, TRUE, &mii);
}
-void NativeMenuWin::AddSeparatorItemAt(int menu_index, int model_index) {
+void NativeMenuWin::AddSeparatorItemAt(size_t menu_index, size_t model_index) {
MENUITEMINFO mii = {0};
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_FTYPE;
mii.fType = MFT_SEPARATOR;
// Insert a dummy entry into our label list so we can index directly into it
// using item indices if need be.
- items_.insert(items_.begin() + model_index, std::make_unique<ItemData>());
- InsertMenuItem(menu_, menu_index, TRUE, &mii);
+ items_.insert(items_.begin() + static_cast<ptrdiff_t>(model_index),
+ std::make_unique<ItemData>());
+ InsertMenuItem(menu_, static_cast<UINT>(menu_index), TRUE, &mii);
}
-void NativeMenuWin::SetMenuItemState(int menu_index,
+void NativeMenuWin::SetMenuItemState(size_t menu_index,
bool enabled,
bool checked,
bool is_default) {
@@ -170,11 +172,11 @@ void NativeMenuWin::SetMenuItemState(int menu_index,
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_STATE;
mii.fState = state;
- SetMenuItemInfo(menu_, menu_index, MF_BYPOSITION, &mii);
+ SetMenuItemInfo(menu_, static_cast<UINT>(menu_index), MF_BYPOSITION, &mii);
}
-void NativeMenuWin::SetMenuItemLabel(int menu_index,
- int model_index,
+void NativeMenuWin::SetMenuItemLabel(size_t menu_index,
+ size_t model_index,
const std::u16string& label) {
if (IsSeparatorItemAt(menu_index))
return;
@@ -182,11 +184,11 @@ void NativeMenuWin::SetMenuItemLabel(int menu_index,
MENUITEMINFO mii = {0};
mii.cbSize = sizeof(mii);
UpdateMenuItemInfoForString(&mii, model_index, label);
- SetMenuItemInfo(menu_, menu_index, MF_BYPOSITION, &mii);
+ SetMenuItemInfo(menu_, static_cast<UINT>(menu_index), MF_BYPOSITION, &mii);
}
void NativeMenuWin::UpdateMenuItemInfoForString(MENUITEMINFO* mii,
- int model_index,
+ size_t model_index,
const std::u16string& label) {
std::u16string formatted = label;
ui::MenuModel::ItemType type = model_->GetTypeAt(model_index);
diff --git a/chromium/ui/views/controls/menu/native_menu_win.h b/chromium/ui/views/controls/menu/native_menu_win.h
index c4c8341d3ff..89f78b8f3a6 100644
--- a/chromium/ui/views/controls/menu/native_menu_win.h
+++ b/chromium/ui/views/controls/menu/native_menu_win.h
@@ -51,21 +51,21 @@ class VIEWS_EXPORT NativeMenuWin {
// code in the functions in this class.
// Returns true if the item at the specified index is a separator.
- bool IsSeparatorItemAt(int menu_index) const;
+ bool IsSeparatorItemAt(size_t menu_index) const;
// Add items. See note above about indices.
- void AddMenuItemAt(int menu_index, int model_index);
- void AddSeparatorItemAt(int menu_index, int model_index);
+ void AddMenuItemAt(size_t menu_index, size_t model_index);
+ void AddSeparatorItemAt(size_t menu_index, size_t model_index);
// Sets the state of the item at the specified index.
- void SetMenuItemState(int menu_index,
+ void SetMenuItemState(size_t menu_index,
bool enabled,
bool checked,
bool is_default);
// Sets the label of the item at the specified index.
- void SetMenuItemLabel(int menu_index,
- int model_index,
+ void SetMenuItemLabel(size_t menu_index,
+ size_t model_index,
const std::u16string& label);
// Updates the local data structure with the correctly formatted version of
@@ -73,7 +73,7 @@ class VIEWS_EXPORT NativeMenuWin {
// the menu is not owner-draw. That's a mouthful. This function exists because
// of the peculiarities of the Windows menu API.
void UpdateMenuItemInfoForString(MENUITEMINFO* mii,
- int model_index,
+ size_t model_index,
const std::u16string& label);
// Resets the native menu stored in |menu_| by destroying any old menu then
@@ -99,7 +99,7 @@ class VIEWS_EXPORT NativeMenuWin {
HWND system_menu_for_;
// The index of the first item in the model in the menu.
- int first_item_index_;
+ size_t first_item_index_;
// If we're a submenu, this is our parent.
raw_ptr<NativeMenuWin> parent_;
diff --git a/chromium/ui/views/controls/menu/submenu_view.cc b/chromium/ui/views/controls/menu/submenu_view.cc
index 680a66049fa..ccff3c17e0a 100644
--- a/chromium/ui/views/controls/menu/submenu_view.cc
+++ b/chromium/ui/views/controls/menu/submenu_view.cc
@@ -87,10 +87,9 @@ SubmenuView::MenuItems SubmenuView::GetMenuItems() const {
return menu_items;
}
-MenuItemView* SubmenuView::GetMenuItemAt(int index) {
+MenuItemView* SubmenuView::GetMenuItemAt(size_t index) {
const MenuItems menu_items = GetMenuItems();
- DCHECK_GE(index, 0);
- DCHECK_LT(static_cast<size_t>(index), menu_items.size());
+ DCHECK_LT(index, menu_items.size());
return menu_items[index];
}
@@ -363,24 +362,26 @@ void SubmenuView::OnGestureEvent(ui::GestureEvent* event) {
event->SetHandled();
}
-int SubmenuView::GetRowCount() {
- return static_cast<int>(GetMenuItems().size());
+size_t SubmenuView::GetRowCount() {
+ return GetMenuItems().size();
}
-int SubmenuView::GetSelectedRow() {
+absl::optional<size_t> SubmenuView::GetSelectedRow() {
const auto menu_items = GetMenuItems();
const auto i =
std::find_if(menu_items.cbegin(), menu_items.cend(),
[](const MenuItemView* item) { return item->IsSelected(); });
- return (i == menu_items.cend()) ? -1 : std::distance(menu_items.cbegin(), i);
+ return (i == menu_items.cend()) ? absl::nullopt
+ : absl::make_optional(static_cast<size_t>(
+ std::distance(menu_items.cbegin(), i)));
}
-void SubmenuView::SetSelectedRow(int row) {
+void SubmenuView::SetSelectedRow(absl::optional<size_t> row) {
parent_menu_item_->GetMenuController()->SetSelection(
- GetMenuItemAt(row), MenuController::SELECTION_DEFAULT);
+ GetMenuItemAt(row.value()), MenuController::SELECTION_DEFAULT);
}
-std::u16string SubmenuView::GetTextForRow(int row) {
+std::u16string SubmenuView::GetTextForRow(size_t row) {
return MenuItemView::GetAccessibleNameForMenuItem(
GetMenuItemAt(row)->title(), std::u16string(),
GetMenuItemAt(row)->ShouldShowNewBadge());
diff --git a/chromium/ui/views/controls/menu/submenu_view.h b/chromium/ui/views/controls/menu/submenu_view.h
index cfbf5771ae8..2ee2a6ccbf2 100644
--- a/chromium/ui/views/controls/menu/submenu_view.h
+++ b/chromium/ui/views/controls/menu/submenu_view.h
@@ -72,7 +72,7 @@ class VIEWS_EXPORT SubmenuView : public View,
MenuItems GetMenuItems() const;
// Returns the MenuItemView at the specified index.
- MenuItemView* GetMenuItemAt(int index);
+ MenuItemView* GetMenuItemAt(size_t index);
PrefixSelector* GetPrefixSelector();
@@ -106,10 +106,10 @@ class VIEWS_EXPORT SubmenuView : public View,
void OnGestureEvent(ui::GestureEvent* event) override;
// Overridden from PrefixDelegate.
- int GetRowCount() override;
- int GetSelectedRow() override;
- void SetSelectedRow(int row) override;
- std::u16string GetTextForRow(int row) override;
+ size_t GetRowCount() override;
+ absl::optional<size_t> GetSelectedRow() override;
+ void SetSelectedRow(absl::optional<size_t> row) override;
+ std::u16string GetTextForRow(size_t row) override;
// Returns true if the menu is showing.
virtual bool IsShowing() const;
diff --git a/chromium/ui/views/controls/native/native_view_host_mac.h b/chromium/ui/views/controls/native/native_view_host_mac.h
index 5ec9cfc0d81..32a529b53b5 100644
--- a/chromium/ui/views/controls/native/native_view_host_mac.h
+++ b/chromium/ui/views/controls/native/native_view_host_mac.h
@@ -8,6 +8,7 @@
#include <memory>
#include "base/mac/scoped_nsobject.h"
+#include "base/memory/raw_ptr.h"
#include "ui/base/cocoa/views_hostable.h"
#include "ui/views/controls/native/native_view_host_wrapper.h"
#include "ui/views/views_export.h"
@@ -71,7 +72,7 @@ class NativeViewHostMac : public NativeViewHostWrapper,
NativeWidgetMacNSWindowHost* GetNSWindowHost() const;
// Our associated NativeViewHost. Owns this.
- NativeViewHost* host_;
+ raw_ptr<NativeViewHost> host_;
// Retain the native view as it may be destroyed at an unpredictable time.
base::scoped_nsobject<NSView> native_view_;
@@ -79,7 +80,7 @@ class NativeViewHostMac : public NativeViewHostWrapper,
// If |native_view| supports the ViewsHostable protocol, then this is the
// the corresponding ViewsHostableView interface (which is implemeted only
// by WebContents and tests).
- ui::ViewsHostableView* native_view_hostable_ = nullptr;
+ raw_ptr<ui::ViewsHostableView> native_view_hostable_ = nullptr;
};
} // namespace views
diff --git a/chromium/ui/views/controls/prefix_delegate.h b/chromium/ui/views/controls/prefix_delegate.h
index dc37a068b7c..5995386d410 100644
--- a/chromium/ui/views/controls/prefix_delegate.h
+++ b/chromium/ui/views/controls/prefix_delegate.h
@@ -5,6 +5,7 @@
#ifndef UI_VIEWS_CONTROLS_PREFIX_DELEGATE_H_
#define UI_VIEWS_CONTROLS_PREFIX_DELEGATE_H_
+#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/views/view.h"
#include "ui/views/views_export.h"
@@ -14,17 +15,17 @@ namespace views {
class VIEWS_EXPORT PrefixDelegate {
public:
// Returns the total number of selectable items.
- virtual int GetRowCount() = 0;
+ virtual size_t GetRowCount() = 0;
// Returns the row of the currently selected item, or -1 if no item is
// selected.
- virtual int GetSelectedRow() = 0;
+ virtual absl::optional<size_t> GetSelectedRow() = 0;
// Sets the selection to the specified row.
- virtual void SetSelectedRow(int row) = 0;
+ virtual void SetSelectedRow(absl::optional<size_t> row) = 0;
// Returns the item at the specified row.
- virtual std::u16string GetTextForRow(int row) = 0;
+ virtual std::u16string GetTextForRow(size_t row) = 0;
};
} // namespace views
diff --git a/chromium/ui/views/controls/prefix_selector.cc b/chromium/ui/views/controls/prefix_selector.cc
index 67c49f30b95..a65c9e24918 100644
--- a/chromium/ui/views/controls/prefix_selector.cc
+++ b/chromium/ui/views/controls/prefix_selector.cc
@@ -5,6 +5,7 @@
#include "ui/views/controls/prefix_selector.h"
#include <algorithm>
+#include <limits>
#include "base/i18n/case_conversion.h"
#include "base/time/default_tick_clock.h"
@@ -43,8 +44,8 @@ bool PrefixSelector::ShouldContinueSelection() const {
void PrefixSelector::SetCompositionText(
const ui::CompositionText& composition) {}
-uint32_t PrefixSelector::ConfirmCompositionText(bool keep_selection) {
- return UINT32_MAX;
+size_t PrefixSelector::ConfirmCompositionText(bool keep_selection) {
+ return std::numeric_limits<size_t>::max();
}
void PrefixSelector::ClearCompositionText() {}
@@ -92,7 +93,7 @@ gfx::Rect PrefixSelector::GetSelectionBoundingBox() const {
return gfx::Rect();
}
-bool PrefixSelector::GetCompositionCharacterBounds(uint32_t index,
+bool PrefixSelector::GetCompositionCharacterBounds(size_t index,
gfx::Rect* rect) const {
// TextInputClient::GetCompositionCharacterBounds is expected to fill |rect|
// in screen coordinates and GetCaretBounds returns screen coordinates.
@@ -129,9 +130,11 @@ bool PrefixSelector::SetEditableSelectionRange(const gfx::Range& range) {
return false;
}
+#if BUILDFLAG(IS_MAC)
bool PrefixSelector::DeleteRange(const gfx::Range& range) {
return false;
}
+#endif
bool PrefixSelector::GetTextFromRange(const gfx::Range& range,
std::u16string* text) const {
@@ -220,7 +223,7 @@ void PrefixSelector::OnTextInput(const std::u16string& text) {
(text[0] == L'\t' || text[0] == L'\r' || text[0] == L'\n'))
return;
- const int row_count = prefix_delegate_->GetRowCount();
+ const size_t row_count = prefix_delegate_->GetRowCount();
if (row_count == 0)
return;
@@ -228,17 +231,17 @@ void PrefixSelector::OnTextInput(const std::u16string& text) {
// append |text| to |current_text_| and search for that. If it has been a
// while search after the current row, otherwise search starting from the
// current row.
- int row = std::max(0, prefix_delegate_->GetSelectedRow());
+ size_t row = prefix_delegate_->GetSelectedRow().value_or(0);
if (ShouldContinueSelection()) {
current_text_ += text;
} else {
current_text_ = text;
- if (prefix_delegate_->GetSelectedRow() >= 0)
+ if (prefix_delegate_->GetSelectedRow().has_value())
row = (row + 1) % row_count;
}
time_of_last_key_ = tick_clock_->NowTicks();
- const int start_row = row;
+ const size_t start_row = row;
const std::u16string lower_text(base::i18n::ToLower(current_text_));
do {
if (TextAtRowMatchesText(row, lower_text)) {
@@ -249,7 +252,7 @@ void PrefixSelector::OnTextInput(const std::u16string& text) {
} while (row != start_row);
}
-bool PrefixSelector::TextAtRowMatchesText(int row,
+bool PrefixSelector::TextAtRowMatchesText(size_t row,
const std::u16string& lower_text) {
const std::u16string model_text(
base::i18n::ToLower(prefix_delegate_->GetTextForRow(row)));
diff --git a/chromium/ui/views/controls/prefix_selector.h b/chromium/ui/views/controls/prefix_selector.h
index f132b73ea4c..ce19d4d8d1c 100644
--- a/chromium/ui/views/controls/prefix_selector.h
+++ b/chromium/ui/views/controls/prefix_selector.h
@@ -47,7 +47,7 @@ class VIEWS_EXPORT PrefixSelector : public ui::TextInputClient {
// ui::TextInputClient:
void SetCompositionText(const ui::CompositionText& composition) override;
- uint32_t ConfirmCompositionText(bool keep_selection) override;
+ size_t ConfirmCompositionText(bool keep_selection) override;
void ClearCompositionText() override;
void InsertText(const std::u16string& text,
InsertTextCursorBehavior cursor_behavior) override;
@@ -59,7 +59,7 @@ class VIEWS_EXPORT PrefixSelector : public ui::TextInputClient {
bool CanComposeInline() const override;
gfx::Rect GetCaretBounds() const override;
gfx::Rect GetSelectionBoundingBox() const override;
- bool GetCompositionCharacterBounds(uint32_t index,
+ bool GetCompositionCharacterBounds(size_t index,
gfx::Rect* rect) const override;
bool HasCompositionText() const override;
FocusReason GetFocusReason() const override;
@@ -67,7 +67,9 @@ class VIEWS_EXPORT PrefixSelector : public ui::TextInputClient {
bool GetCompositionTextRange(gfx::Range* range) const override;
bool GetEditableSelectionRange(gfx::Range* range) const override;
bool SetEditableSelectionRange(const gfx::Range& range) override;
+#if BUILDFLAG(IS_MAC)
bool DeleteRange(const gfx::Range& range) override;
+#endif
bool GetTextFromRange(const gfx::Range& range,
std::u16string* text) const override;
void OnInputMethodChanged() override;
@@ -115,7 +117,7 @@ class VIEWS_EXPORT PrefixSelector : public ui::TextInputClient {
void OnTextInput(const std::u16string& text);
// Returns true if the text of the node at |row| starts with |lower_text|.
- bool TextAtRowMatchesText(int row, const std::u16string& lower_text);
+ bool TextAtRowMatchesText(size_t row, const std::u16string& lower_text);
// Clears |current_text_| and resets |time_of_last_key_|.
void ClearText();
diff --git a/chromium/ui/views/controls/prefix_selector_unittest.cc b/chromium/ui/views/controls/prefix_selector_unittest.cc
index 1bccca752b8..caa514bf5a1 100644
--- a/chromium/ui/views/controls/prefix_selector_unittest.cc
+++ b/chromium/ui/views/controls/prefix_selector_unittest.cc
@@ -30,17 +30,19 @@ class TestPrefixDelegate : public View, public PrefixDelegate {
~TestPrefixDelegate() override = default;
- int GetRowCount() override { return static_cast<int>(rows_.size()); }
+ size_t GetRowCount() override { return rows_.size(); }
- int GetSelectedRow() override { return selected_row_; }
+ absl::optional<size_t> GetSelectedRow() override { return selected_row_; }
- void SetSelectedRow(int row) override { selected_row_ = row; }
+ void SetSelectedRow(absl::optional<size_t> row) override {
+ selected_row_ = row;
+ }
- std::u16string GetTextForRow(int row) override { return rows_[row]; }
+ std::u16string GetTextForRow(size_t row) override { return rows_[row]; }
private:
std::vector<std::u16string> rows_;
- int selected_row_ = 0;
+ absl::optional<size_t> selected_row_ = 0;
};
class PrefixSelectorTest : public ViewsTestBase {
@@ -67,20 +69,20 @@ TEST_F(PrefixSelectorTest, PrefixSelect) {
selector_->InsertText(
u"an",
ui::TextInputClient::InsertTextCursorBehavior::kMoveCursorAfterText);
- EXPECT_EQ(1, delegate_.GetSelectedRow());
+ EXPECT_EQ(1u, delegate_.GetSelectedRow());
// Invoke OnViewBlur() to reset time.
selector_->OnViewBlur();
selector_->InsertText(
u"a",
ui::TextInputClient::InsertTextCursorBehavior::kMoveCursorAfterText);
- EXPECT_EQ(0, delegate_.GetSelectedRow());
+ EXPECT_EQ(0u, delegate_.GetSelectedRow());
selector_->OnViewBlur();
selector_->InsertText(
u"g",
ui::TextInputClient::InsertTextCursorBehavior::kMoveCursorAfterText);
- EXPECT_EQ(3, delegate_.GetSelectedRow());
+ EXPECT_EQ(3u, delegate_.GetSelectedRow());
selector_->OnViewBlur();
selector_->InsertText(
@@ -89,7 +91,7 @@ TEST_F(PrefixSelectorTest, PrefixSelect) {
selector_->InsertText(
u"a",
ui::TextInputClient::InsertTextCursorBehavior::kMoveCursorAfterText);
- EXPECT_EQ(2, delegate_.GetSelectedRow());
+ EXPECT_EQ(2u, delegate_.GetSelectedRow());
selector_->OnViewBlur();
selector_->InsertText(
@@ -101,7 +103,7 @@ TEST_F(PrefixSelectorTest, PrefixSelect) {
selector_->InsertText(
u"a",
ui::TextInputClient::InsertTextCursorBehavior::kMoveCursorAfterText);
- EXPECT_EQ(2, delegate_.GetSelectedRow());
+ EXPECT_EQ(2u, delegate_.GetSelectedRow());
}
} // namespace views
diff --git a/chromium/ui/views/controls/progress_bar.cc b/chromium/ui/views/controls/progress_bar.cc
index ff59dd87df6..56c9fd01a74 100644
--- a/chromium/ui/views/controls/progress_bar.cc
+++ b/chromium/ui/views/controls/progress_bar.cc
@@ -147,11 +147,20 @@ void ProgressBar::SetValue(double value) {
MaybeNotifyAccessibilityValueChanged();
}
+void ProgressBar::SetPaused(bool is_paused) {
+ if (is_paused_ == is_paused)
+ return;
+
+ is_paused_ = is_paused;
+ OnPropertyChanged(&is_paused_, kPropertyEffectsPaint);
+}
+
SkColor ProgressBar::GetForegroundColor() const {
if (foreground_color_)
return foreground_color_.value();
- return GetColorProvider()->GetColor(ui::kColorProgressBar);
+ return GetColorProvider()->GetColor(GetPaused() ? ui::kColorProgressBarPaused
+ : ui::kColorProgressBar);
}
void ProgressBar::SetForegroundColor(SkColor color) {
@@ -266,6 +275,7 @@ void ProgressBar::MaybeNotifyAccessibilityValueChanged() {
BEGIN_METADATA(ProgressBar, View)
ADD_PROPERTY_METADATA(SkColor, ForegroundColor, ui::metadata::SkColorConverter)
ADD_PROPERTY_METADATA(SkColor, BackgroundColor, ui::metadata::SkColorConverter)
+ADD_PROPERTY_METADATA(bool, Paused)
END_METADATA
} // namespace views
diff --git a/chromium/ui/views/controls/progress_bar.h b/chromium/ui/views/controls/progress_bar.h
index 05b5b708858..2c95b733bf7 100644
--- a/chromium/ui/views/controls/progress_bar.h
+++ b/chromium/ui/views/controls/progress_bar.h
@@ -44,6 +44,9 @@ class VIEWS_EXPORT ProgressBar : public View, public gfx::AnimationDelegate {
// be displayed with an infinite loading animation.
void SetValue(double value);
+ // Sets whether the progress bar is paused.
+ void SetPaused(bool is_paused);
+
// The color of the progress portion.
SkColor GetForegroundColor() const;
void SetForegroundColor(SkColor color);
@@ -61,6 +64,7 @@ class VIEWS_EXPORT ProgressBar : public View, public gfx::AnimationDelegate {
void AnimationEnded(const gfx::Animation* animation) override;
bool IsIndeterminate();
+ bool GetPaused() const { return is_paused_; }
void OnPaintIndeterminate(gfx::Canvas* canvas);
// Fire an accessibility event if visible and the progress has changed.
@@ -69,6 +73,9 @@ class VIEWS_EXPORT ProgressBar : public View, public gfx::AnimationDelegate {
// Current progress to display, should be in the range 0.0 to 1.0.
double current_value_ = 0.0;
+ // Is the progress bar paused.
+ bool is_paused_ = false;
+
// In DP, the preferred height of this progress bar.
const int preferred_height_;
diff --git a/chromium/ui/views/controls/scroll_view.cc b/chromium/ui/views/controls/scroll_view.cc
index e594c891e0a..e9fc96a1262 100644
--- a/chromium/ui/views/controls/scroll_view.cc
+++ b/chromium/ui/views/controls/scroll_view.cc
@@ -904,6 +904,7 @@ void ScrollView::GetAccessibleNodeData(ui::AXNodeData* node_data) {
if (!contents_)
return;
+ node_data->role = ax::mojom::Role::kScrollView;
node_data->AddIntAttribute(ax::mojom::IntAttribute::kScrollX,
CurrentOffset().x());
node_data->AddIntAttribute(ax::mojom::IntAttribute::kScrollXMin,
diff --git a/chromium/ui/views/controls/scroll_view_unittest.cc b/chromium/ui/views/controls/scroll_view_unittest.cc
index 47334b0d0c1..dd0d3386efb 100644
--- a/chromium/ui/views/controls/scroll_view_unittest.cc
+++ b/chromium/ui/views/controls/scroll_view_unittest.cc
@@ -113,7 +113,9 @@ class ObserveViewDeletion : public ViewObserver {
private:
base::ScopedObservation<View, ViewObserver> observer_{this};
- raw_ptr<View> deleted_view_ = nullptr;
+ // TODO(crbug.com/1298696): views_unittests breaks with MTECheckedPtr
+ // enabled. Triage.
+ raw_ptr<View, DegradeToNoOpWhenMTE> deleted_view_ = nullptr;
};
} // namespace test
@@ -343,7 +345,7 @@ class WidgetScrollViewTest : public test::WidgetTest,
ScrollView* scroll_view =
widget_->SetContentsView(std::make_unique<ScrollView>());
scroll_view->SetContents(std::move(contents));
- scroll_view->Layout();
+ RunScheduledLayout(scroll_view);
widget_->GetCompositor()->AddObserver(this);
@@ -486,7 +488,7 @@ std::string UiConfigToString(const testing::TestParamInfo<UiConfig>& info) {
// Verifies the viewport is sized to fit the available space.
TEST_F(ScrollViewTest, ViewportSizedToFit) {
View* contents = InstallContents();
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ("0,0 100x100", contents->parent()->bounds().ToString());
}
@@ -496,7 +498,7 @@ TEST_F(ScrollViewTest, BoundedViewportSizedToFit) {
View* contents = InstallContents();
scroll_view_->ClipHeightTo(100, 200);
scroll_view_->SetBorder(CreateSolidBorder(2, 0));
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ("2,2 96x96", contents->parent()->bounds().ToString());
// Make sure the width of |contents| is set properly not to overflow the
@@ -510,7 +512,7 @@ TEST_F(ScrollViewTest, VerticalScrollbarDoesNotAppearUnnecessarily) {
const gfx::Rect default_outer_bounds(0, 0, 100, 100);
scroll_view_->SetContents(std::make_unique<VerticalResizingView>());
scroll_view_->SetBoundsRect(default_outer_bounds);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_FALSE(scroll_view_->vertical_scroll_bar()->GetVisible());
EXPECT_TRUE(scroll_view_->horizontal_scroll_bar()->GetVisible());
}
@@ -522,7 +524,7 @@ TEST_F(ScrollViewTest, HorizontalScrollbarDoesNotAppearIfHidden) {
ScrollView::ScrollBarMode::kHiddenButEnabled);
scroll_view_->SetContents(std::make_unique<VerticalResizingView>());
scroll_view_->SetBoundsRect(default_outer_bounds);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_FALSE(scroll_view_->vertical_scroll_bar()->GetVisible());
EXPECT_FALSE(scroll_view_->horizontal_scroll_bar()->GetVisible());
}
@@ -534,7 +536,7 @@ TEST_F(ScrollViewTest, VerticalScrollbarDoesNotAppearIfHidden) {
ScrollView::ScrollBarMode::kHiddenButEnabled);
scroll_view_->SetContents(std::make_unique<HorizontalResizingView>());
scroll_view_->SetBoundsRect(default_outer_bounds);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_FALSE(scroll_view_->vertical_scroll_bar()->GetVisible());
EXPECT_FALSE(scroll_view_->horizontal_scroll_bar()->GetVisible());
}
@@ -546,7 +548,7 @@ TEST_F(ScrollViewTest, HorizontalScrollbarDoesNotAppearIfDisabled) {
ScrollView::ScrollBarMode::kDisabled);
scroll_view_->SetContents(std::make_unique<VerticalResizingView>());
scroll_view_->SetBoundsRect(default_outer_bounds);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_FALSE(scroll_view_->vertical_scroll_bar()->GetVisible());
EXPECT_FALSE(scroll_view_->horizontal_scroll_bar()->GetVisible());
}
@@ -557,7 +559,7 @@ TEST_F(ScrollViewTest, VerticallScrollbarDoesNotAppearIfDisabled) {
scroll_view_->SetVerticalScrollBarMode(ScrollView::ScrollBarMode::kDisabled);
scroll_view_->SetContents(std::make_unique<HorizontalResizingView>());
scroll_view_->SetBoundsRect(default_outer_bounds);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_FALSE(scroll_view_->vertical_scroll_bar()->GetVisible());
EXPECT_FALSE(scroll_view_->horizontal_scroll_bar()->GetVisible());
}
@@ -569,7 +571,7 @@ TEST_F(ScrollViewTest, ScrollBars) {
// Size the contents such that vertical scrollbar is needed.
contents->SetBounds(0, 0, 50, 400);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutWidth(),
contents->parent()->width());
EXPECT_EQ(100, contents->parent()->height());
@@ -582,7 +584,7 @@ TEST_F(ScrollViewTest, ScrollBars) {
// Size the contents such that horizontal scrollbar is needed.
contents->SetBounds(0, 0, 400, 50);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(100, contents->parent()->width());
EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutHeight(),
contents->parent()->height());
@@ -591,7 +593,7 @@ TEST_F(ScrollViewTest, ScrollBars) {
// Both horizontal and vertical.
contents->SetBounds(0, 0, 300, 400);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutWidth(),
contents->parent()->width());
EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutHeight(),
@@ -607,7 +609,7 @@ TEST_F(ScrollViewTest, ScrollBars) {
scroll_view_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(
kTopPadding, kLeftPadding, kBottomPadding, kRightPadding)));
contents->SetBounds(0, 0, 50, 400);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutWidth() - kLeftPadding -
kRightPadding,
contents->parent()->width());
@@ -624,7 +626,7 @@ TEST_F(ScrollViewTest, ScrollBars) {
// Horizontal with border.
contents->SetBounds(0, 0, 400, 50);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(100 - kLeftPadding - kRightPadding, contents->parent()->width());
EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutHeight() - kTopPadding -
kBottomPadding,
@@ -641,7 +643,7 @@ TEST_F(ScrollViewTest, ScrollBars) {
// Both horizontal and vertical with border.
contents->SetBounds(0, 0, 300, 400);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutWidth() - kLeftPadding -
kRightPadding,
contents->parent()->width());
@@ -722,7 +724,7 @@ TEST_F(ScrollViewTest, ScrollBarsWithHeader) {
// Size the contents such that vertical scrollbar is needed.
contents->SetBounds(0, 0, 50, 400);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(0, contents->parent()->x());
EXPECT_EQ(20, contents->parent()->y());
EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutWidth(),
@@ -748,7 +750,7 @@ TEST_F(ScrollViewTest, ScrollBarsWithHeader) {
// Size the contents such that horizontal scrollbar is needed.
contents->SetBounds(0, 0, 400, 50);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(0, contents->parent()->x());
EXPECT_EQ(20, contents->parent()->y());
EXPECT_EQ(100, contents->parent()->width());
@@ -765,7 +767,7 @@ TEST_F(ScrollViewTest, ScrollBarsWithHeader) {
// Both horizontal and vertical.
contents->SetBounds(0, 0, 300, 400);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(0, contents->parent()->x());
EXPECT_EQ(20, contents->parent()->y());
EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutWidth(),
@@ -819,7 +821,7 @@ TEST_F(ScrollViewTest, ScrollToPositionUpdatesScrollBar) {
// Scroll the horizontal scrollbar, after which, the scroll bar thumb position
// should be updated (i.e. it should be non-zero).
contents->SetBounds(0, 0, 400, 50);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
auto* scroll_bar = test_api.GetScrollBar(HORIZONTAL);
ASSERT_TRUE(scroll_bar);
EXPECT_TRUE(scroll_bar->GetVisible());
@@ -829,7 +831,7 @@ TEST_F(ScrollViewTest, ScrollToPositionUpdatesScrollBar) {
// Scroll the vertical scrollbar.
contents->SetBounds(0, 0, 50, 400);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
scroll_bar = test_api.GetScrollBar(VERTICAL);
ASSERT_TRUE(scroll_bar);
EXPECT_TRUE(scroll_bar->GetVisible());
@@ -847,7 +849,7 @@ TEST_F(ScrollViewTest, ScrollToPositionUpdatesWithHiddenHorizontalScrollBar) {
View* contents = InstallContents();
contents->SetBounds(0, 0, 400, 50);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
auto* scroll_bar = test_api.GetScrollBar(HORIZONTAL);
ASSERT_TRUE(scroll_bar);
EXPECT_FALSE(scroll_bar->GetVisible());
@@ -867,7 +869,7 @@ TEST_F(ScrollViewTest, ScrollToPositionUpdatesWithHiddenVerticalScrollBar) {
View* contents = InstallContents();
contents->SetBounds(0, 0, 50, 400);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
auto* scroll_bar = test_api.GetScrollBar(VERTICAL);
ASSERT_TRUE(scroll_bar);
EXPECT_FALSE(scroll_bar->GetVisible());
@@ -886,7 +888,7 @@ TEST_F(ScrollViewTest, ScrollRectToVisible) {
auto* contents_ptr = scroll_view_->SetContents(std::move(contents));
scroll_view_->SetBoundsRect(gfx::Rect(0, 0, 100, 100));
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(gfx::Vector2d(0, 0), test_api.IntegralViewOffset());
// Scroll to y=405 height=10, this should make the y position of the content
@@ -916,7 +918,7 @@ TEST_F(ScrollViewTest, ScrollRectToVisibleWithHiddenHorizontalScrollbar) {
auto* contents_ptr = scroll_view_->SetContents(std::move(contents));
scroll_view_->SetBoundsRect(gfx::Rect(0, 0, 100, 100));
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(gfx::Vector2d(0, 0), test_api.IntegralViewOffset());
// Scroll to x=305 width=10, this should make the x position of the content
@@ -946,7 +948,7 @@ TEST_F(ScrollViewTest, ScrollRectToVisibleWithHiddenVerticalScrollbar) {
auto* contents_ptr = scroll_view_->SetContents(std::move(contents));
scroll_view_->SetBoundsRect(gfx::Rect(0, 0, 100, 100));
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(gfx::Vector2d(0, 0), test_api.IntegralViewOffset());
// Scroll to y=305 height=10, this should make the y position of the content
@@ -977,7 +979,7 @@ TEST_F(ScrollViewTest, ScrollChildToVisibleOnFocus) {
auto* child_ptr = contents_ptr->AddChildView(std::move(child));
scroll_view_->SetBoundsRect(gfx::Rect(0, 0, 100, 100));
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(gfx::Vector2d(), test_api.IntegralViewOffset());
// Set focus to the child control. This should cause the control to scroll to
@@ -1012,11 +1014,11 @@ TEST_F(ScrollViewTest, ScrollViewToVisibleOnContentsRootFocus) {
inner_scroll_view_ptr->SetContents(std::move(inner_contents));
inner_scroll_view_ptr->SetBoundsRect(gfx::Rect(0, 510, 100, 100));
- inner_scroll_view_ptr->Layout();
+ RunScheduledLayout(inner_scroll_view_ptr);
EXPECT_EQ(gfx::Vector2d(), inner_test_api.IntegralViewOffset());
scroll_view_->SetBoundsRect(gfx::Rect(0, 0, 200, 200));
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(gfx::Vector2d(), outer_test_api.IntegralViewOffset());
// Scroll the inner scroll view to y=405 height=10. This should make the y
@@ -1056,7 +1058,7 @@ TEST_F(ScrollViewTest, ClipHeightToNormalContentHeight) {
scroll_view_->GetPreferredSize());
scroll_view_->SizeToPreferredSize();
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(gfx::Size(kWidth, kNormalContentHeight),
scroll_view_->contents()->size());
@@ -1076,7 +1078,7 @@ TEST_F(ScrollViewTest, ClipHeightToShortContentHeight) {
EXPECT_EQ(gfx::Size(kWidth, kMinHeight), scroll_view_->GetPreferredSize());
scroll_view_->SizeToPreferredSize();
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
// Layered scrolling requires the contents to fill the viewport.
if (contents->layer()) {
@@ -1100,7 +1102,7 @@ TEST_F(ScrollViewTest, ClipHeightToTallContentHeight) {
EXPECT_EQ(gfx::Size(kWidth, kMaxHeight), scroll_view_->GetPreferredSize());
scroll_view_->SizeToPreferredSize();
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
// The width may be less than kWidth if the scroll bar takes up some width.
EXPECT_GE(kWidth, scroll_view_->contents()->width());
@@ -1123,7 +1125,7 @@ TEST_F(ScrollViewTest, ClipHeightToScrollbarUsesWidth) {
gfx::Size new_size(kWidth, scroll_view_->GetHeightForWidth(kWidth));
scroll_view_->SetSize(new_size);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
int expected_width = kWidth - scroll_view_->GetScrollBarLayoutWidth();
EXPECT_EQ(scroll_view_->contents()->size().width(), expected_width);
@@ -1155,7 +1157,7 @@ TEST_F(ScrollViewTest, CornerViewVisibility) {
View* corner_view = ScrollViewTestApi(scroll_view_.get()).corner_view();
contents->SetBounds(0, 0, 200, 200);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
// Corner view should not exist if using overlay scrollbars.
if (scroll_view_->vertical_scroll_bar()->OverlapsContent()) {
@@ -1175,22 +1177,22 @@ TEST_F(ScrollViewTest, CornerViewVisibility) {
// Corner view should be removed when only the vertical scrollbar is visible.
contents->SetBounds(0, 0, 50, 200);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_FALSE(corner_view->parent());
// ... or when only the horizontal scrollbar is visible.
contents->SetBounds(0, 0, 200, 50);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_FALSE(corner_view->parent());
// ... or when no scrollbar is visible.
contents->SetBounds(0, 0, 50, 50);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_FALSE(corner_view->parent());
// Corner view should reappear when both scrollbars reappear.
contents->SetBounds(0, 0, 200, 200);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(scroll_view_.get(), corner_view->parent());
EXPECT_TRUE(corner_view->GetVisible());
}
@@ -1392,7 +1394,7 @@ TEST_F(ScrollViewTest, CocoaOverlayScrollBars) {
// Size the contents such that vertical scrollbar is needed.
// Since it is overlaid, the ViewPort size should match the ScrollView.
contents->SetBounds(0, 0, 50, 400);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(100, contents->parent()->width());
EXPECT_EQ(100, contents->parent()->height());
EXPECT_EQ(0, scroll_view_->GetScrollBarLayoutWidth());
@@ -1401,7 +1403,7 @@ TEST_F(ScrollViewTest, CocoaOverlayScrollBars) {
// Size the contents such that horizontal scrollbar is needed.
contents->SetBounds(0, 0, 400, 50);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(100, contents->parent()->width());
EXPECT_EQ(100, contents->parent()->height());
EXPECT_EQ(0, scroll_view_->GetScrollBarLayoutHeight());
@@ -1410,7 +1412,7 @@ TEST_F(ScrollViewTest, CocoaOverlayScrollBars) {
// Both horizontal and vertical scrollbars.
contents->SetBounds(0, 0, 300, 400);
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(100, contents->parent()->width());
EXPECT_EQ(100, contents->parent()->height());
EXPECT_EQ(0, scroll_view_->GetScrollBarLayoutWidth());
@@ -1428,7 +1430,7 @@ TEST_F(ScrollViewTest, CocoaOverlayScrollBars) {
// to be smaller, and ScrollbarWidth and ScrollbarHeight are non-zero.
SetOverlayScrollersEnabled(false);
EXPECT_TRUE(ViewTestApi(scroll_view_.get()).needs_layout());
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(100 - VerticalScrollBarWidth(), contents->parent()->width());
EXPECT_EQ(100 - HorizontalScrollBarHeight(), contents->parent()->height());
EXPECT_NE(0, VerticalScrollBarWidth());
@@ -1557,7 +1559,7 @@ TEST_F(ScrollViewTest, ConstrainScrollToBounds) {
View* contents = InstallContents();
contents->SetBoundsRect(gfx::Rect(0, 0, 300, 300));
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(gfx::PointF(), test_api.CurrentOffset());
@@ -1568,14 +1570,14 @@ TEST_F(ScrollViewTest, ConstrainScrollToBounds) {
// Making the viewport 55 pixels taller should scroll up the same amount.
scroll_view_->SetBoundsRect(gfx::Rect(0, 0, 100, 155));
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(fully_scrolled.y() - 55, test_api.CurrentOffset().y());
EXPECT_EQ(fully_scrolled.x(), test_api.CurrentOffset().x());
// And 77 pixels wider should scroll left. Also make it short again: the y-
// offset from the last change should remain.
scroll_view_->SetBoundsRect(gfx::Rect(0, 0, 177, 100));
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(fully_scrolled.y() - 55, test_api.CurrentOffset().y());
EXPECT_EQ(fully_scrolled.x() - 77, test_api.CurrentOffset().x());
}
@@ -1597,19 +1599,19 @@ TEST_F(ScrollViewTest, ContentScrollNotResetOnLayout) {
scroll_view_->ScrollToPosition(test_api.GetScrollBar(VERTICAL), 25);
EXPECT_EQ(25, test_api.CurrentOffset().y());
// Call Layout; no change to scroll position.
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(25, test_api.CurrentOffset().y());
// Change contents of |contents|, call Layout; still no change to scroll
// position.
contents->SetPreferredSize(gfx::Size(300, 500));
contents->InvalidateLayout();
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(25, test_api.CurrentOffset().y());
// Change |contents| to be shorter than the ScrollView's clipped height.
// This /will/ change the scroll location due to ConstrainScrollToBounds.
contents->SetPreferredSize(gfx::Size(300, 50));
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ(0, test_api.CurrentOffset().y());
}
@@ -2058,7 +2060,7 @@ TEST_F(ScrollViewTest, IgnoreOverlapWithDisabledHorizontalScroll) {
View* contents = InstallContents();
contents->SetBoundsRect(gfx::Rect(0, 0, 300, 300));
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
gfx::Size expected_size = scroll_view_->size();
expected_size.Enlarge(-kThickness, 0);
@@ -2084,7 +2086,7 @@ TEST_F(ScrollViewTest, IgnoreOverlapWithHiddenHorizontalScroll) {
View* contents = InstallContents();
contents->SetBoundsRect(gfx::Rect(0, 0, 300, 300));
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
gfx::Size expected_size = scroll_view_->size();
expected_size.Enlarge(-kThickness, 0);
@@ -2109,7 +2111,7 @@ TEST_F(ScrollViewTest, IgnoreOverlapWithDisabledVerticalScroll) {
View* contents = InstallContents();
contents->SetBoundsRect(gfx::Rect(0, 0, 300, 300));
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
gfx::Size expected_size = scroll_view_->size();
expected_size.Enlarge(0, -kThickness);
@@ -2135,7 +2137,7 @@ TEST_F(ScrollViewTest, IgnoreOverlapWithHiddenVerticalScroll) {
View* contents = InstallContents();
contents->SetBoundsRect(gfx::Rect(0, 0, 300, 300));
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
gfx::Size expected_size = scroll_view_->size();
expected_size.Enlarge(0, -kThickness);
@@ -2147,7 +2149,7 @@ TEST_F(ScrollViewTest, TestSettingContentsToNull) {
test::ObserveViewDeletion view_deletion{contents};
// Make sure the content is installed and working.
- scroll_view_->Layout();
+ RunScheduledLayout(scroll_view_.get());
EXPECT_EQ("0,0 100x100", contents->parent()->bounds().ToString());
// This should be legal and not DCHECK.
diff --git a/chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.mm b/chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.mm
index bab1c941dda..ac6c8ac1166 100644
--- a/chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.mm
+++ b/chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.mm
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/memory/raw_ptr.h"
+
#import "ui/views/controls/scrollbar/cocoa_scroll_bar.h"
#include "base/bind.h"
@@ -61,7 +63,7 @@ class CocoaScrollBarThumb : public BaseScrollBarThumb {
private:
// The CocoaScrollBar that owns us.
- CocoaScrollBar* cocoa_scroll_bar_; // weak.
+ raw_ptr<CocoaScrollBar> cocoa_scroll_bar_; // weak.
};
CocoaScrollBarThumb::CocoaScrollBarThumb(CocoaScrollBar* scroll_bar)
diff --git a/chromium/ui/views/controls/separator.cc b/chromium/ui/views/controls/separator.cc
index 4051d9ea810..c11ec64da75 100644
--- a/chromium/ui/views/controls/separator.cc
+++ b/chromium/ui/views/controls/separator.cc
@@ -20,16 +20,16 @@ Separator::Separator() = default;
Separator::~Separator() = default;
-SkColor Separator::GetColor() const {
- return overridden_color_.value_or(0);
+ui::ColorId Separator::GetColorId() const {
+ return color_id_;
}
-void Separator::SetColor(SkColor color) {
- if (overridden_color_ == color)
+void Separator::SetColorId(ui::ColorId color_id) {
+ if (color_id_ == color_id)
return;
- overridden_color_ = color;
- OnPropertyChanged(&overridden_color_, kPropertyEffectsPaint);
+ color_id_ = color_id;
+ OnPropertyChanged(&color_id_, kPropertyEffectsPaint);
}
int Separator::GetPreferredLength() const {
@@ -66,9 +66,7 @@ gfx::Size Separator::CalculatePreferredSize() const {
}
void Separator::OnPaint(gfx::Canvas* canvas) {
- const SkColor color = overridden_color_
- ? *overridden_color_
- : GetColorProvider()->GetColor(ui::kColorSeparator);
+ const SkColor color = GetColorProvider()->GetColor(color_id_);
// Paint background and border, if any.
View::OnPaint(canvas);
@@ -106,7 +104,7 @@ void Separator::OnPaint(gfx::Canvas* canvas) {
}
BEGIN_METADATA(Separator, View)
-ADD_PROPERTY_METADATA(SkColor, Color, ui::metadata::SkColorConverter)
+ADD_PROPERTY_METADATA(ui::ColorId, ColorId)
ADD_PROPERTY_METADATA(int, PreferredLength)
ADD_PROPERTY_METADATA(Separator::Orientation, Orientation)
END_METADATA
diff --git a/chromium/ui/views/controls/separator.h b/chromium/ui/views/controls/separator.h
index 60f415ae5b5..bdc341d1884 100644
--- a/chromium/ui/views/controls/separator.h
+++ b/chromium/ui/views/controls/separator.h
@@ -6,6 +6,7 @@
#define UI_VIEWS_CONTROLS_SEPARATOR_H_
#include "third_party/abseil-cpp/absl/types/optional.h"
+#include "ui/color/color_id.h"
#include "ui/views/metadata/view_factory.h"
#include "ui/views/view.h"
@@ -30,8 +31,8 @@ class VIEWS_EXPORT Separator : public View {
~Separator() override;
- SkColor GetColor() const;
- void SetColor(SkColor color);
+ ui::ColorId GetColorId() const;
+ void SetColorId(ui::ColorId color_id);
// Vertical or horizontal extension depending on the orientation. Set to
// `kThickness` by default.
@@ -47,12 +48,12 @@ class VIEWS_EXPORT Separator : public View {
private:
int preferred_length_ = kThickness;
- absl::optional<SkColor> overridden_color_;
+ ui::ColorId color_id_ = ui::kColorSeparator;
Orientation orientation_ = Orientation::kVertical;
};
BEGIN_VIEW_BUILDER(VIEWS_EXPORT, Separator, View)
-VIEW_BUILDER_PROPERTY(SkColor, Color)
+VIEW_BUILDER_PROPERTY(ui::ColorId, ColorId)
VIEW_BUILDER_PROPERTY(int, PreferredLength)
VIEW_BUILDER_PROPERTY(Separator::Orientation, Orientation)
END_VIEW_BUILDER
diff --git a/chromium/ui/views/controls/separator_unittest.cc b/chromium/ui/views/controls/separator_unittest.cc
index a9f608cfcf6..bf34bb52478 100644
--- a/chromium/ui/views/controls/separator_unittest.cc
+++ b/chromium/ui/views/controls/separator_unittest.cc
@@ -7,7 +7,9 @@
#include <memory>
#include "base/memory/raw_ptr.h"
+#include "ui/color/color_id.h"
#include "ui/gfx/canvas.h"
+#include "ui/gfx/color_palette.h"
#include "ui/gfx/image/image_unittest_util.h"
#include "ui/views/border.h"
#include "ui/views/test/views_test_base.h"
@@ -35,19 +37,23 @@ class SeparatorTest : public ViewsTestBase {
std::unique_ptr<Widget> widget_;
raw_ptr<Separator> separator_;
+ SkColor expected_foreground_color_ = gfx::kPlaceholderColor;
+
static const SkColor kBackgroundColor;
- static const SkColor kForegroundColor;
+ static const ui::ColorId kForegroundColorId;
static const gfx::Size kTestImageSize;
};
const SkColor SeparatorTest::kBackgroundColor = SK_ColorRED;
-const SkColor SeparatorTest::kForegroundColor = SK_ColorGRAY;
+const ui::ColorId SeparatorTest::kForegroundColorId = ui::kColorSeparator;
const gfx::Size SeparatorTest::kTestImageSize{24, 24};
void SeparatorTest::SetUp() {
ViewsTestBase::SetUp();
widget_ = CreateTestWidget();
separator_ = widget_->SetContentsView(std::make_unique<Separator>());
+ expected_foreground_color_ =
+ widget_->GetColorProvider()->GetColor(kForegroundColorId);
}
void SeparatorTest::TearDown() {
@@ -102,201 +108,201 @@ TEST_F(SeparatorTest, ImageScaleBelowOne_HorizontalLine) {
TEST_F(SeparatorTest, Paint_NoInsets_FillsCanvas_Scale100) {
separator_->SetSize({10, 10});
- separator_->SetColor(kForegroundColor);
+ separator_->SetColorId(kForegroundColorId);
SkBitmap painted = PaintToCanvas(1.0f);
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 0));
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 9));
- EXPECT_EQ(kForegroundColor, painted.getColor(9, 9));
- EXPECT_EQ(kForegroundColor, painted.getColor(9, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 9));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(9, 9));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(9, 0));
}
TEST_F(SeparatorTest, Paint_NoInsets_FillsCanvas_Scale125) {
separator_->SetSize({10, 10});
- separator_->SetColor(kForegroundColor);
+ separator_->SetColorId(kForegroundColorId);
SkBitmap painted = PaintToCanvas(1.25f);
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 0));
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 12));
- EXPECT_EQ(kForegroundColor, painted.getColor(12, 12));
- EXPECT_EQ(kForegroundColor, painted.getColor(12, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 12));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(12, 12));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(12, 0));
}
TEST_F(SeparatorTest, Paint_NoInsets_FillsCanvas_Scale150) {
separator_->SetSize({10, 10});
- separator_->SetColor(kForegroundColor);
+ separator_->SetColorId(kForegroundColorId);
SkBitmap painted = PaintToCanvas(1.5f);
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 0));
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 14));
- EXPECT_EQ(kForegroundColor, painted.getColor(14, 14));
- EXPECT_EQ(kForegroundColor, painted.getColor(14, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 14));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(14, 14));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(14, 0));
}
TEST_F(SeparatorTest, Paint_TopInset_Scale100) {
separator_->SetSize({10, 10});
- separator_->SetColor(kForegroundColor);
+ separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(1, 0, 0, 0)));
SkBitmap painted = PaintToCanvas(1.0f);
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 0));
EXPECT_EQ(kBackgroundColor, painted.getColor(9, 0));
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 1));
- EXPECT_EQ(kForegroundColor, painted.getColor(9, 1));
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 9));
- EXPECT_EQ(kForegroundColor, painted.getColor(9, 9));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 1));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(9, 1));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 9));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(9, 9));
}
TEST_F(SeparatorTest, Paint_TopInset_Scale125) {
separator_->SetSize({10, 10});
- separator_->SetColor(kForegroundColor);
+ separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(1, 0, 0, 0)));
SkBitmap painted = PaintToCanvas(1.25f);
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 1));
EXPECT_EQ(kBackgroundColor, painted.getColor(12, 1));
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 2));
- EXPECT_EQ(kForegroundColor, painted.getColor(12, 2));
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 12));
- EXPECT_EQ(kForegroundColor, painted.getColor(12, 12));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 2));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(12, 2));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 12));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(12, 12));
}
TEST_F(SeparatorTest, Paint_LeftInset_Scale100) {
separator_->SetSize({10, 10});
- separator_->SetColor(kForegroundColor);
+ separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(0, 1, 0, 0)));
SkBitmap painted = PaintToCanvas(1.0f);
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 0));
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 9));
- EXPECT_EQ(kForegroundColor, painted.getColor(1, 0));
- EXPECT_EQ(kForegroundColor, painted.getColor(1, 9));
- EXPECT_EQ(kForegroundColor, painted.getColor(9, 0));
- EXPECT_EQ(kForegroundColor, painted.getColor(9, 9));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(1, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(1, 9));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(9, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(9, 9));
}
TEST_F(SeparatorTest, Paint_LeftInset_Scale125) {
separator_->SetSize({10, 10});
- separator_->SetColor(kForegroundColor);
+ separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(0, 1, 0, 0)));
SkBitmap painted = PaintToCanvas(1.25f);
EXPECT_EQ(kBackgroundColor, painted.getColor(1, 0));
EXPECT_EQ(kBackgroundColor, painted.getColor(1, 12));
- EXPECT_EQ(kForegroundColor, painted.getColor(2, 0));
- EXPECT_EQ(kForegroundColor, painted.getColor(2, 12));
- EXPECT_EQ(kForegroundColor, painted.getColor(12, 0));
- EXPECT_EQ(kForegroundColor, painted.getColor(12, 12));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(2, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(2, 12));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(12, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(12, 12));
}
TEST_F(SeparatorTest, Paint_BottomInset_Scale100) {
separator_->SetSize({10, 10});
- separator_->SetColor(kForegroundColor);
+ separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(0, 0, 1, 0)));
SkBitmap painted = PaintToCanvas(1.0f);
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 0));
- EXPECT_EQ(kForegroundColor, painted.getColor(9, 0));
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 8));
- EXPECT_EQ(kForegroundColor, painted.getColor(9, 8));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(9, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 8));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(9, 8));
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 9));
EXPECT_EQ(kBackgroundColor, painted.getColor(9, 9));
}
TEST_F(SeparatorTest, Paint_BottomInset_Scale125) {
separator_->SetSize({10, 10});
- separator_->SetColor(kForegroundColor);
+ separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(0, 0, 1, 0)));
SkBitmap painted = PaintToCanvas(1.25f);
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 0));
- EXPECT_EQ(kForegroundColor, painted.getColor(12, 0));
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 10));
- EXPECT_EQ(kForegroundColor, painted.getColor(12, 10));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(12, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 10));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(12, 10));
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 11));
EXPECT_EQ(kBackgroundColor, painted.getColor(12, 11));
}
TEST_F(SeparatorTest, Paint_RightInset_Scale100) {
separator_->SetSize({10, 10});
- separator_->SetColor(kForegroundColor);
+ separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(0, 0, 0, 1)));
SkBitmap painted = PaintToCanvas(1.0f);
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 0));
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 9));
- EXPECT_EQ(kForegroundColor, painted.getColor(8, 0));
- EXPECT_EQ(kForegroundColor, painted.getColor(8, 9));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 9));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(8, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(8, 9));
EXPECT_EQ(kBackgroundColor, painted.getColor(9, 0));
EXPECT_EQ(kBackgroundColor, painted.getColor(9, 9));
}
TEST_F(SeparatorTest, Paint_RightInset_Scale125) {
separator_->SetSize({10, 10});
- separator_->SetColor(kForegroundColor);
+ separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(0, 0, 0, 1)));
SkBitmap painted = PaintToCanvas(1.25f);
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 0));
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 12));
- EXPECT_EQ(kForegroundColor, painted.getColor(10, 0));
- EXPECT_EQ(kForegroundColor, painted.getColor(10, 12));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 12));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(10, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(10, 12));
EXPECT_EQ(kBackgroundColor, painted.getColor(11, 0));
EXPECT_EQ(kBackgroundColor, painted.getColor(11, 12));
}
TEST_F(SeparatorTest, Paint_Vertical_Scale100) {
separator_->SetSize({10, 10});
- separator_->SetColor(kForegroundColor);
+ separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(0, 4, 0, 5)));
SkBitmap painted = PaintToCanvas(1.0f);
EXPECT_EQ(kBackgroundColor, painted.getColor(3, 0));
EXPECT_EQ(kBackgroundColor, painted.getColor(3, 9));
- EXPECT_EQ(kForegroundColor, painted.getColor(4, 0));
- EXPECT_EQ(kForegroundColor, painted.getColor(4, 9));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(4, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(4, 9));
EXPECT_EQ(kBackgroundColor, painted.getColor(5, 0));
EXPECT_EQ(kBackgroundColor, painted.getColor(5, 9));
}
TEST_F(SeparatorTest, Paint_Vertical_Scale125) {
separator_->SetSize({10, 10});
- separator_->SetColor(kForegroundColor);
+ separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(0, 4, 0, 5)));
SkBitmap painted = PaintToCanvas(1.25f);
EXPECT_EQ(kBackgroundColor, painted.getColor(4, 0));
EXPECT_EQ(kBackgroundColor, painted.getColor(4, 12));
- EXPECT_EQ(kForegroundColor, painted.getColor(5, 0));
- EXPECT_EQ(kForegroundColor, painted.getColor(5, 12));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(5, 0));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(5, 12));
EXPECT_EQ(kBackgroundColor, painted.getColor(6, 0));
EXPECT_EQ(kBackgroundColor, painted.getColor(6, 12));
}
TEST_F(SeparatorTest, Paint_Horizontal_Scale100) {
separator_->SetSize({10, 10});
- separator_->SetColor(kForegroundColor);
+ separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(4, 0, 5, 0)));
SkBitmap painted = PaintToCanvas(1.0f);
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 3));
EXPECT_EQ(kBackgroundColor, painted.getColor(9, 3));
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 4));
- EXPECT_EQ(kForegroundColor, painted.getColor(9, 4));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 4));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(9, 4));
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 5));
EXPECT_EQ(kBackgroundColor, painted.getColor(9, 5));
}
TEST_F(SeparatorTest, Paint_Horizontal_Scale125) {
separator_->SetSize({10, 10});
- separator_->SetColor(kForegroundColor);
+ separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(4, 0, 5, 0)));
SkBitmap painted = PaintToCanvas(1.25f);
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 4));
EXPECT_EQ(kBackgroundColor, painted.getColor(12, 4));
- EXPECT_EQ(kForegroundColor, painted.getColor(0, 5));
- EXPECT_EQ(kForegroundColor, painted.getColor(12, 5));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 5));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(12, 5));
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 6));
EXPECT_EQ(kBackgroundColor, painted.getColor(12, 6));
}
@@ -305,11 +311,11 @@ TEST_F(SeparatorTest, Paint_Horizontal_Scale125) {
// it to zero.
TEST_F(SeparatorTest, Paint_MinimumSize_Scale100) {
separator_->SetSize({10, 10});
- separator_->SetColor(kForegroundColor);
+ separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(5, 5, 5, 5)));
SkBitmap painted = PaintToCanvas(1.0f);
- EXPECT_EQ(kForegroundColor, painted.getColor(5, 5));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(5, 5));
EXPECT_EQ(kBackgroundColor, painted.getColor(4, 5));
EXPECT_EQ(kBackgroundColor, painted.getColor(5, 4));
EXPECT_EQ(kBackgroundColor, painted.getColor(5, 6));
@@ -320,11 +326,11 @@ TEST_F(SeparatorTest, Paint_MinimumSize_Scale100) {
// it to zero (with scale factor > 1).
TEST_F(SeparatorTest, Paint_MinimumSize_Scale125) {
separator_->SetSize({10, 10});
- separator_->SetColor(kForegroundColor);
+ separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(5, 5, 5, 5)));
SkBitmap painted = PaintToCanvas(1.25f);
- EXPECT_EQ(kForegroundColor, painted.getColor(7, 7));
+ EXPECT_EQ(expected_foreground_color_, painted.getColor(7, 7));
EXPECT_EQ(kBackgroundColor, painted.getColor(6, 7));
EXPECT_EQ(kBackgroundColor, painted.getColor(7, 6));
EXPECT_EQ(kBackgroundColor, painted.getColor(7, 8));
diff --git a/chromium/ui/views/controls/styled_label.cc b/chromium/ui/views/controls/styled_label.cc
index 8f25251d32f..283c51fae60 100644
--- a/chromium/ui/views/controls/styled_label.cc
+++ b/chromium/ui/views/controls/styled_label.cc
@@ -22,6 +22,8 @@
#include "ui/gfx/text_elider.h"
#include "ui/gfx/text_utils.h"
#include "ui/views/controls/label.h"
+#include "ui/views/controls/link.h"
+#include "ui/views/controls/link_fragment.h"
#include "ui/views/view_class_properties.h"
namespace views {
@@ -326,14 +328,18 @@ void StyledLabel::ClearStyleRanges() {
PreferredSizeChanged();
}
-void StyledLabel::ClickLinkForTesting() {
- const auto it =
- base::ranges::find(children(), Link::kViewClassName, &View::GetClassName);
- DCHECK(it != children().cend());
- (*it)->OnKeyPressed(
+void StyledLabel::ClickFirstLinkForTesting() {
+ GetFirstLinkForTesting()->OnKeyPressed( // IN-TEST
ui::KeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_SPACE, ui::EF_NONE));
}
+views::Link* StyledLabel::GetFirstLinkForTesting() {
+ const auto it = base::ranges::find(children(), LinkFragment::kViewClassName,
+ &View::GetClassName);
+ DCHECK(it != children().cend());
+ return static_cast<views::Link*>(*it);
+}
+
int StyledLabel::StartX(int excess_space) const {
int x = GetInsets().left();
if (horizontal_alignment_ == gfx::ALIGN_LEFT)
@@ -361,6 +367,11 @@ void StyledLabel::CalculateLayout(int width) const {
// Try to preserve leading whitespace on the first line.
bool can_trim_leading_whitespace = false;
StyleRanges::const_iterator current_range = style_ranges_.begin();
+
+ // A pointer to the previous link fragment if a logical link consists of
+ // multiple `LinkFragment` elements.
+ LinkFragment* previous_link_fragment = nullptr;
+
for (std::u16string remaining_string = text_;
content_width > 0 && !remaining_string.empty();) {
layout_size_info_.line_sizes.emplace_back(0, line_height);
@@ -471,18 +482,26 @@ void StyledLabel::CalculateLayout(int width) const {
if (chunk.size() > range.end() - position)
chunk = chunk.substr(0, range.end() - position);
- if (!custom_view)
- label = CreateLabel(chunk, style_info, range);
+ if (!custom_view) {
+ label =
+ CreateLabel(chunk, style_info, range, &previous_link_fragment);
+ } else {
+ previous_link_fragment = nullptr;
+ }
- if (position + chunk.size() >= range.end())
+ if (position + chunk.size() >= range.end()) {
++current_range;
+ // Links do not connect across separate style ranges.
+ previous_link_fragment = nullptr;
+ }
} else {
chunk = substrings[0];
if (position + chunk.size() > range.start())
chunk = chunk.substr(0, range.start() - position);
// This chunk is normal text.
- label = CreateLabel(chunk, default_style, range);
+ label =
+ CreateLabel(chunk, default_style, range, &previous_link_fragment);
}
View* child_view = custom_view ? custom_view : label.get();
@@ -529,14 +548,17 @@ void StyledLabel::CalculateLayout(int width) const {
std::unique_ptr<Label> StyledLabel::CreateLabel(
const std::u16string& text,
const RangeStyleInfo& style_info,
- const gfx::Range& range) const {
+ const gfx::Range& range,
+ LinkFragment** previous_link_fragment) const {
std::unique_ptr<Label> result;
if (style_info.text_style == style::STYLE_LINK) {
// Nothing should (and nothing does) use a custom font for links.
DCHECK(!style_info.custom_font);
- // Note this ignores |default_text_style_|, in favor of style::STYLE_LINK.
- auto link = std::make_unique<Link>(text, text_context_);
+ // Note this ignores |default_text_style_|, in favor of `style::STYLE_LINK`.
+ auto link = std::make_unique<LinkFragment>(
+ text, text_context_, style::STYLE_LINK, *previous_link_fragment);
+ *previous_link_fragment = link.get();
link->SetCallback(style_info.callback);
if (!style_info.accessible_name.empty())
link->SetAccessibleName(style_info.accessible_name);
@@ -572,7 +594,7 @@ void StyledLabel::UpdateLabelBackgroundColor() {
// TODO(kylixrd): Should updating the label background color even be
// allowed if there are custom views?
DCHECK((child->GetClassName() == Label::kViewClassName) ||
- (child->GetClassName() == Link::kViewClassName));
+ (child->GetClassName() == LinkFragment::kViewClassName));
static_cast<Label*>(child)->SetBackgroundColor(new_color);
}
}
diff --git a/chromium/ui/views/controls/styled_label.h b/chromium/ui/views/controls/styled_label.h
index bff92d26c7e..3b2bd6670f7 100644
--- a/chromium/ui/views/controls/styled_label.h
+++ b/chromium/ui/views/controls/styled_label.h
@@ -30,6 +30,7 @@ namespace views {
class Label;
class Link;
+class LinkFragment;
// A class which can apply mixed styles to a block of text. Currently, text is
// always multiline. Trailing whitespace in the styled label text is not
@@ -181,7 +182,10 @@ class VIEWS_EXPORT StyledLabel : public View {
// Sends a space keypress to the first child that is a link. Assumes at least
// one such child exists.
- void ClickLinkForTesting();
+ void ClickFirstLinkForTesting();
+
+ // Get the first child that is a link.
+ views::Link* GetFirstLinkForTesting();
private:
struct StyleRange {
@@ -212,9 +216,11 @@ class VIEWS_EXPORT StyledLabel : public View {
void CalculateLayout(int width) const;
// Creates a Label for a given |text|, |style_info|, and |range|.
- std::unique_ptr<Label> CreateLabel(const std::u16string& text,
- const RangeStyleInfo& style_info,
- const gfx::Range& range) const;
+ std::unique_ptr<Label> CreateLabel(
+ const std::u16string& text,
+ const RangeStyleInfo& style_info,
+ const gfx::Range& range,
+ LinkFragment** previous_link_component) const;
// Update the label background color from the theme or
// |displayed_on_background_color_| if set.
diff --git a/chromium/ui/views/controls/styled_label_unittest.cc b/chromium/ui/views/controls/styled_label_unittest.cc
index 2c4bdb0d3a5..dd67683cbcc 100644
--- a/chromium/ui/views/controls/styled_label_unittest.cc
+++ b/chromium/ui/views/controls/styled_label_unittest.cc
@@ -23,6 +23,7 @@
#include "ui/gfx/font_list.h"
#include "ui/views/border.h"
#include "ui/views/controls/link.h"
+#include "ui/views/controls/link_fragment.h"
#include "ui/views/style/typography.h"
#include "ui/views/test/test_layout_provider.h"
#include "ui/views/test/test_views.h"
@@ -117,7 +118,7 @@ TEST_F(StyledLabelTest, TrailingWhitespaceiIgnored) {
InitStyledLabel(text);
styled()->SetBounds(0, 0, 1000, 1000);
- styled()->Layout();
+ RunScheduledLayout(styled());
ASSERT_EQ(1u, styled()->children().size());
EXPECT_EQ(u"This is a test block of text", LabelAt(styled(), 0)->GetText());
@@ -128,7 +129,7 @@ TEST_F(StyledLabelTest, RespectLeadingWhitespace) {
InitStyledLabel(text);
styled()->SetBounds(0, 0, 1000, 1000);
- styled()->Layout();
+ RunScheduledLayout(styled());
ASSERT_EQ(1u, styled()->children().size());
EXPECT_EQ(u" This is a test block of text",
@@ -140,7 +141,7 @@ TEST_F(StyledLabelTest, RespectLeadingSpacesInNonFirstLine) {
const std::string text(std::string("First line\n") + indented_line);
InitStyledLabel(text);
styled()->SetBounds(0, 0, 1000, 1000);
- styled()->Layout();
+ RunScheduledLayout(styled());
ASSERT_EQ(2u, styled()->children().size());
EXPECT_EQ(ASCIIToUTF16(indented_line), LabelAt(styled(), 1)->GetText());
}
@@ -154,7 +155,7 @@ TEST_F(StyledLabelTest, CorrectWrapAtNewline) {
gfx::Size label_preferred_size = label.GetPreferredSize();
// Correct handling of \n and label width limit encountered at the same place
styled()->SetBounds(0, 0, label_preferred_size.width(), 1000);
- styled()->Layout();
+ RunScheduledLayout(styled());
ASSERT_EQ(2u, styled()->children().size());
EXPECT_EQ(ASCIIToUTF16(first_line), LabelAt(styled(), 0)->GetText());
const auto* label_1 = LabelAt(styled(), 1);
@@ -170,7 +171,7 @@ TEST_F(StyledLabelTest, FirstLineNotEmptyWhenLeadingWhitespaceTooLong) {
gfx::Size label_preferred_size = label.GetPreferredSize();
styled()->SetBounds(0, 0, label_preferred_size.width() / 2, 1000);
- styled()->Layout();
+ RunScheduledLayout(styled());
ASSERT_EQ(1u, styled()->children().size());
EXPECT_EQ(u"a", LabelAt(styled(), 0)->GetText());
@@ -192,7 +193,7 @@ TEST_F(StyledLabelTest, BasicWrapping) {
styled()->SetBounds(
0, 0, styled()->GetInsets().width() + label_preferred_size.width(),
styled()->GetInsets().height() + 2 * label_preferred_size.height());
- styled()->Layout();
+ RunScheduledLayout(styled());
ASSERT_EQ(2u, styled()->children().size());
EXPECT_EQ(3, styled()->children()[0]->x());
EXPECT_EQ(3, styled()->children()[0]->y());
@@ -206,7 +207,7 @@ TEST_F(StyledLabelTest, AllowEmptyLines) {
const std::string multiline_text("one\n\nthree");
InitStyledLabel(multiline_text);
styled()->SetBounds(0, 0, 1000, 1000);
- styled()->Layout();
+ RunScheduledLayout(styled());
EXPECT_EQ(3 * default_height, styled()->GetHeightForWidth(1000));
ASSERT_EQ(2u, styled()->children().size());
EXPECT_EQ(styled()->GetHeightForWidth(1000),
@@ -225,7 +226,7 @@ TEST_F(StyledLabelTest, WrapLongWords) {
styled()->SetBounds(
0, 0, styled()->GetInsets().width() + label_preferred_size.width(),
styled()->GetInsets().height() + 2 * label_preferred_size.height());
- styled()->Layout();
+ RunScheduledLayout(styled());
ASSERT_EQ(2u, styled()->children().size());
ASSERT_EQ(gfx::Point(), styled()->origin());
@@ -266,7 +267,7 @@ TEST_F(StyledLabelTest, CreateLinks) {
// Verify layout creates the right number of children.
styled()->SetBounds(0, 0, 1000, 1000);
- styled()->Layout();
+ RunScheduledLayout(styled());
EXPECT_EQ(7u, styled()->children().size());
}
@@ -283,7 +284,7 @@ TEST_F(StyledLabelTest, StyledRangeCustomFontUnderlined) {
style_info);
styled()->SetBounds(0, 0, 1000, 1000);
- styled()->Layout();
+ RunScheduledLayout(styled());
ASSERT_EQ(2u, styled()->children().size());
EXPECT_EQ(gfx::Font::UNDERLINE,
@@ -328,11 +329,11 @@ TEST_F(StyledLabelTest, StyledRangeTextStyleBold) {
StyledLabel unstyled;
unstyled.SetText(ASCIIToUTF16(bold_text));
unstyled.SetBounds(0, 0, styled_width, pref_height);
- unstyled.Layout();
+ RunScheduledLayout(&unstyled);
EXPECT_EQ(1u, unstyled.children().size());
styled()->SetBounds(0, 0, styled_width, pref_height);
- styled()->Layout();
+ RunScheduledLayout(styled());
ASSERT_EQ(3u, styled()->children().size());
@@ -367,10 +368,12 @@ TEST_F(StyledLabelInWidgetTest, Color) {
style_info_link);
styled()->SetBounds(0, 0, 1000, 1000);
- styled()->Layout();
+ RunScheduledLayout(styled());
// The code below is not prepared to deal with dark mode.
- widget()->GetNativeTheme()->set_use_dark_colors(false);
+ auto* const native_theme = widget()->GetNativeTheme();
+ native_theme->set_use_dark_colors(false);
+ native_theme->NotifyOnNativeThemeUpdated();
auto* container = widget()->GetContentsView();
// Obtain the default text color for a label.
@@ -385,13 +388,14 @@ TEST_F(StyledLabelInWidgetTest, Color) {
ASSERT_EQ(3u, styled()->children().size());
EXPECT_EQ(SK_ColorBLUE, LabelAt(styled(), 0)->GetEnabledColor());
- EXPECT_EQ(kDefaultLinkColor,
- LabelAt(styled(), 1, Link::kViewClassName)->GetEnabledColor());
+ EXPECT_EQ(
+ kDefaultLinkColor,
+ LabelAt(styled(), 1, LinkFragment::kViewClassName)->GetEnabledColor());
EXPECT_EQ(kDefaultTextColor, LabelAt(styled(), 2)->GetEnabledColor());
// Test adjusted color readability.
styled()->SetDisplayedOnBackgroundColor(SK_ColorBLACK);
- styled()->Layout();
+ RunScheduledLayout(styled());
label->SetBackgroundColor(SK_ColorBLACK);
const SkColor kAdjustedTextColor = label->GetEnabledColor();
@@ -428,7 +432,7 @@ TEST_F(StyledLabelTest, StyledRangeWithTooltip) {
pref_height - styled()->GetInsets().height());
styled()->SetBounds(0, 0, label_preferred_size.width(), pref_height);
- styled()->Layout();
+ RunScheduledLayout(styled());
EXPECT_EQ(label_preferred_size.width(), styled()->width());
@@ -465,7 +469,7 @@ TEST_F(StyledLabelTest, SetTextContextAndDefaultStyle) {
EXPECT_EQ(label.GetPreferredSize().height(), styled()->height());
EXPECT_EQ(label.GetPreferredSize().width(), styled()->width());
- styled()->Layout();
+ RunScheduledLayout(styled());
ASSERT_EQ(1u, styled()->children().size());
Label* sublabel = LabelAt(styled(), 0);
EXPECT_EQ(style::CONTEXT_DIALOG_TITLE, sublabel->GetTextContext());
@@ -509,7 +513,7 @@ TEST_F(StyledLabelTest, LineHeightWithLink) {
TEST_F(StyledLabelTest, HandleEmptyLayout) {
const std::string text("This is a test block of text.");
InitStyledLabel(text);
- styled()->Layout();
+ RunScheduledLayout(styled());
EXPECT_EQ(0u, styled()->children().size());
}
@@ -529,7 +533,7 @@ TEST_F(StyledLabelTest, CacheSize) {
EXPECT_EQ(0u, styled()->children().size());
styled()->SetBounds(0, 0, preferred_width, preferred_height);
- styled()->Layout();
+ RunScheduledLayout(styled());
// controls should be created after layout
// height should be the same as precalculated
@@ -541,7 +545,7 @@ TEST_F(StyledLabelTest, CacheSize) {
EXPECT_EQ(real_height, precalculated_height);
// another call to Layout should not kill and recreate all controls
- styled()->Layout();
+ RunScheduledLayout(styled());
View* first_child_after_second_layout =
styled()->children().empty() ? nullptr : styled()->children().front();
EXPECT_EQ(first_child_after_layout, first_child_after_second_layout);
@@ -564,7 +568,7 @@ TEST_F(StyledLabelTest, Border) {
gfx::Size label_preferred_size = label.GetPreferredSize();
styled()->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(5, 10, 6, 20)));
styled()->SetBounds(0, 0, 1000, 0);
- styled()->Layout();
+ RunScheduledLayout(styled());
EXPECT_EQ(
label_preferred_size.height() + 5 /*top border*/ + 6 /*bottom border*/,
styled()->GetPreferredSize().height());
@@ -637,7 +641,7 @@ TEST_F(StyledLabelTest, AlignmentInLTR) {
const std::string text("text");
InitStyledLabel(text);
styled()->SetBounds(0, 0, 1000, 1000);
- styled()->Layout();
+ RunScheduledLayout(styled());
const auto& children = styled()->children();
ASSERT_EQ(1u, children.size());
@@ -645,15 +649,15 @@ TEST_F(StyledLabelTest, AlignmentInLTR) {
EXPECT_EQ(0, children.front()->bounds().x());
styled()->SetHorizontalAlignment(gfx::ALIGN_RIGHT);
- styled()->Layout();
+ RunScheduledLayout(styled());
EXPECT_EQ(1000, children.front()->bounds().right());
styled()->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- styled()->Layout();
+ RunScheduledLayout(styled());
EXPECT_EQ(0, children.front()->bounds().x());
styled()->SetHorizontalAlignment(gfx::ALIGN_CENTER);
- styled()->Layout();
+ RunScheduledLayout(styled());
Label label(ASCIIToUTF16(text));
EXPECT_EQ((1000 - label.GetPreferredSize().width()) / 2,
children.front()->bounds().x());
@@ -670,7 +674,7 @@ TEST_F(StyledLabelTest, AlignmentInRTL) {
const std::string text("text");
InitStyledLabel(text);
styled()->SetBounds(0, 0, 1000, 1000);
- styled()->Layout();
+ RunScheduledLayout(styled());
const auto& children = styled()->children();
ASSERT_EQ(1u, children.size());
@@ -680,16 +684,16 @@ TEST_F(StyledLabelTest, AlignmentInRTL) {
// Setting |ALIGN_LEFT| should be flipped to |ALIGN_RIGHT|.
styled()->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- styled()->Layout();
+ RunScheduledLayout(styled());
EXPECT_EQ(1000, children.front()->bounds().right());
// Setting |ALIGN_RIGHT| should be flipped to |ALIGN_LEFT|.
styled()->SetHorizontalAlignment(gfx::ALIGN_RIGHT);
- styled()->Layout();
+ RunScheduledLayout(styled());
EXPECT_EQ(0, children.front()->bounds().x());
styled()->SetHorizontalAlignment(gfx::ALIGN_CENTER);
- styled()->Layout();
+ RunScheduledLayout(styled());
Label label(ASCIIToUTF16(text));
EXPECT_EQ((1000 - label.GetPreferredSize().width()) / 2,
children.front()->bounds().x());
@@ -716,7 +720,7 @@ TEST_F(StyledLabelTest, ViewsCenteredWithLinkAndCustomView) {
styled()->AddCustomView(std::move(custom_view));
styled()->SetBounds(0, 0, 1000, 500);
- styled()->Layout();
+ RunScheduledLayout(styled());
const int height = styled()->GetPreferredSize().height();
for (const auto* child : styled()->children())
EXPECT_EQ(height / 2, child->bounds().CenterPoint().y());
@@ -738,7 +742,7 @@ TEST_F(StyledLabelTest, ViewsCenteredForEvenAndOddSizes) {
}
styled()->SetBounds(0, 0, kViewWidth * 3, height);
- styled()->Layout();
+ RunScheduledLayout(styled());
for (const auto* child : styled()->children())
EXPECT_EQ(height / 2, child->bounds().CenterPoint().y());
@@ -750,13 +754,13 @@ TEST_F(StyledLabelTest, CacheSizeWithAlignment) {
InitStyledLabel(text);
styled()->SetHorizontalAlignment(gfx::ALIGN_RIGHT);
styled()->SetBounds(0, 0, 1000, 1000);
- styled()->Layout();
+ RunScheduledLayout(styled());
ASSERT_EQ(1u, styled()->children().size());
const View* child = styled()->children().front();
EXPECT_EQ(1000, child->bounds().right());
styled()->SetSize({800, 1000});
- styled()->Layout();
+ RunScheduledLayout(styled());
ASSERT_EQ(1u, styled()->children().size());
const View* new_child = styled()->children().front();
EXPECT_EQ(child, new_child);
@@ -770,7 +774,7 @@ TEST_F(StyledLabelTest, SizeToFit) {
InitStyledLabel(text);
styled()->SetHorizontalAlignment(gfx::ALIGN_RIGHT);
styled()->SizeToFit(1000);
- styled()->Layout();
+ RunScheduledLayout(styled());
ASSERT_EQ(1u, styled()->children().size());
EXPECT_EQ(1000, styled()->children().front()->bounds().right());
}
@@ -790,7 +794,7 @@ TEST_F(StyledLabelTest, PreferredSizeRespectsWrapping) {
size.set_width(size.width() / 2);
size.set_height(styled()->GetHeightForWidth(size.width()));
styled()->SetSize(size);
- styled()->Layout();
+ RunScheduledLayout(styled());
const gfx::Size new_size = styled()->GetPreferredSize();
EXPECT_LE(new_size.width(), size.width());
EXPECT_EQ(new_size.height(), size.height());
diff --git a/chromium/ui/views/controls/tabbed_pane/tabbed_pane.cc b/chromium/ui/views/controls/tabbed_pane/tabbed_pane.cc
index b7f190f87b2..6e91a7918d8 100644
--- a/chromium/ui/views/controls/tabbed_pane/tabbed_pane.cc
+++ b/chromium/ui/views/controls/tabbed_pane/tabbed_pane.cc
@@ -331,15 +331,15 @@ void TabStrip::OnSelectedTabChanged(Tab* from_tab, Tab* to_tab, bool animate) {
return;
if (GetOrientation() == TabbedPane::Orientation::kHorizontal) {
- animating_from_ = gfx::Range(from_tab->GetMirroredX(),
- from_tab->GetMirroredX() + from_tab->width());
- animating_to_ = gfx::Range(to_tab->GetMirroredX(),
- to_tab->GetMirroredX() + to_tab->width());
+ animating_from_ = {from_tab->GetMirroredX(),
+ from_tab->GetMirroredX() + from_tab->width()};
+ animating_to_ = {to_tab->GetMirroredX(),
+ to_tab->GetMirroredX() + to_tab->width()};
} else {
- animating_from_ = gfx::Range(from_tab->bounds().y(),
- from_tab->bounds().y() + from_tab->height());
- animating_to_ = gfx::Range(to_tab->bounds().y(),
- to_tab->bounds().y() + to_tab->height());
+ animating_from_ = {from_tab->bounds().y(),
+ from_tab->bounds().y() + from_tab->height()};
+ animating_to_ = {to_tab->bounds().y(),
+ to_tab->bounds().y() + to_tab->height()};
}
contract_animation_->Stop();
@@ -355,10 +355,11 @@ Tab* TabStrip::GetTabAtDeltaFromSelected(int delta) const {
const size_t selected_tab_index = GetSelectedTabIndex();
DCHECK_NE(kNoSelectedTab, selected_tab_index);
const size_t num_children = children().size();
- // Clamping |delta| here ensures that even a large negative |delta| will not
- // cause the addition in the next statement to wrap below 0.
- delta %= static_cast<int>(num_children);
- return GetTabAtIndex((selected_tab_index + num_children + delta) %
+ // Clamping |delta| here ensures that even a large negative |delta| will be
+ // positive after the addition in the next statement.
+ delta %= base::checked_cast<int>(num_children);
+ delta += static_cast<int>(num_children);
+ return GetTabAtIndex((selected_tab_index + static_cast<size_t>(delta)) %
num_children);
}
@@ -438,30 +439,30 @@ void TabStrip::OnPaintBorder(gfx::Canvas* canvas) {
int min_main_axis = 0;
int max_main_axis = 0;
if (expand_animation_->is_animating()) {
- bool animating_leading = animating_to_.start() < animating_from_.start();
+ bool animating_leading = animating_to_.start < animating_from_.start;
double anim_value = gfx::Tween::CalculateValue(
gfx::Tween::FAST_OUT_LINEAR_IN, expand_animation_->GetCurrentValue());
if (animating_leading) {
min_main_axis = gfx::Tween::IntValueBetween(
- anim_value, animating_from_.start(), animating_to_.start());
- max_main_axis = animating_from_.end();
+ anim_value, animating_from_.start, animating_to_.start);
+ max_main_axis = animating_from_.end;
} else {
- min_main_axis = animating_from_.start();
+ min_main_axis = animating_from_.start;
max_main_axis = gfx::Tween::IntValueBetween(
- anim_value, animating_from_.end(), animating_to_.end());
+ anim_value, animating_from_.end, animating_to_.end);
}
} else if (contract_animation_->is_animating()) {
- bool animating_leading = animating_to_.start() < animating_from_.start();
+ bool animating_leading = animating_to_.start < animating_from_.start;
double anim_value = gfx::Tween::CalculateValue(
gfx::Tween::LINEAR_OUT_SLOW_IN, contract_animation_->GetCurrentValue());
if (animating_leading) {
- min_main_axis = animating_to_.start();
+ min_main_axis = animating_to_.start;
max_main_axis = gfx::Tween::IntValueBetween(
- anim_value, animating_from_.end(), animating_to_.end());
+ anim_value, animating_from_.end, animating_to_.end);
} else {
min_main_axis = gfx::Tween::IntValueBetween(
- anim_value, animating_from_.start(), animating_to_.start());
- max_main_axis = animating_to_.end();
+ anim_value, animating_from_.start, animating_to_.start);
+ max_main_axis = animating_to_.end;
}
} else if (is_horizontal) {
min_main_axis = tab->GetMirroredX();
@@ -483,7 +484,7 @@ void TabStrip::OnPaintBorder(gfx::Canvas* canvas) {
}
BEGIN_METADATA(TabStrip, View)
-ADD_READONLY_PROPERTY_METADATA(int, SelectedTabIndex)
+ADD_READONLY_PROPERTY_METADATA(size_t, SelectedTabIndex)
ADD_READONLY_PROPERTY_METADATA(TabbedPane::Orientation, Orientation)
ADD_READONLY_PROPERTY_METADATA(TabbedPane::TabStripStyle, Style)
END_METADATA
@@ -525,12 +526,13 @@ void TabbedPane::AddTabInternal(size_t index,
std::unique_ptr<View> contents) {
DCHECK_LE(index, GetTabCount());
contents->SetVisible(false);
- contents->GetViewAccessibility().OverrideName(title);
contents->GetViewAccessibility().OverrideRole(ax::mojom::Role::kTabPanel);
+ if (!title.empty())
+ contents->GetViewAccessibility().OverrideName(title);
tab_strip_->AddChildViewAt(std::make_unique<Tab>(this, title, contents.get()),
- static_cast<int>(index));
- contents_->AddChildViewAt(std::move(contents), static_cast<int>(index));
+ index);
+ contents_->AddChildViewAt(std::move(contents), index);
if (!GetSelectedTab())
SelectTabAt(index);
@@ -564,8 +566,10 @@ void TabbedPane::SelectTab(Tab* new_selected_tab, bool animate) {
focus_manager->SetFocusedView(new_selected_tab->contents());
}
- if (listener())
- listener()->TabSelectedAt(tab_strip_->GetIndexOf(new_selected_tab));
+ if (listener()) {
+ listener()->TabSelectedAt(base::checked_cast<int>(
+ tab_strip_->GetIndexOf(new_selected_tab).value()));
+ }
}
void TabbedPane::SelectTabAt(size_t index, bool animate) {
diff --git a/chromium/ui/views/controls/tabbed_pane/tabbed_pane.h b/chromium/ui/views/controls/tabbed_pane/tabbed_pane.h
index cc9622c0659..d8bfb3cdec3 100644
--- a/chromium/ui/views/controls/tabbed_pane/tabbed_pane.h
+++ b/chromium/ui/views/controls/tabbed_pane/tabbed_pane.h
@@ -237,6 +237,10 @@ class TabStrip : public View, public gfx::AnimationDelegate {
void OnPaintBorder(gfx::Canvas* canvas) override;
private:
+ struct Coordinates {
+ int start, end;
+ };
+
// The orientation of the tab alignment.
const TabbedPane::Orientation orientation_;
@@ -254,8 +258,8 @@ class TabStrip : public View, public gfx::AnimationDelegate {
std::make_unique<gfx::LinearAnimation>(this);
// The x-coordinate ranges of the old selection and the new selection.
- gfx::Range animating_from_;
- gfx::Range animating_to_;
+ Coordinates animating_from_;
+ Coordinates animating_to_;
};
} // namespace views
diff --git a/chromium/ui/views/controls/tabbed_pane/tabbed_pane_accessibility_mac_unittest.mm b/chromium/ui/views/controls/tabbed_pane/tabbed_pane_accessibility_mac_unittest.mm
index 690b68cee63..24b3e1a320b 100644
--- a/chromium/ui/views/controls/tabbed_pane/tabbed_pane_accessibility_mac_unittest.mm
+++ b/chromium/ui/views/controls/tabbed_pane/tabbed_pane_accessibility_mac_unittest.mm
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/memory/raw_ptr.h"
+
#import <Cocoa/Cocoa.h>
#import "base/mac/foundation_util.h"
@@ -89,8 +91,8 @@ class TabbedPaneAccessibilityMacTest : public WidgetTest {
}
protected:
- Widget* widget_ = nullptr;
- TabbedPane* tabbed_pane_ = nullptr;
+ raw_ptr<Widget> widget_ = nullptr;
+ raw_ptr<TabbedPane> tabbed_pane_ = nullptr;
};
// Test the Tab's a11y information compared to a Cocoa NSTabViewItem.
diff --git a/chromium/ui/views/controls/table/table_grouper.h b/chromium/ui/views/controls/table/table_grouper.h
index af2fc0f272f..73e233a95d3 100644
--- a/chromium/ui/views/controls/table/table_grouper.h
+++ b/chromium/ui/views/controls/table/table_grouper.h
@@ -10,8 +10,8 @@
namespace views {
struct VIEWS_EXPORT GroupRange {
- int start;
- int length;
+ size_t start;
+ size_t length;
};
// TableGrouper is used by TableView to group a set of rows and treat them
@@ -19,7 +19,7 @@ struct VIEWS_EXPORT GroupRange {
// together.
class VIEWS_EXPORT TableGrouper {
public:
- virtual void GetGroupRange(int model_index, GroupRange* range) = 0;
+ virtual void GetGroupRange(size_t model_index, GroupRange* range) = 0;
protected:
virtual ~TableGrouper() = default;
diff --git a/chromium/ui/views/controls/table/table_header.cc b/chromium/ui/views/controls/table/table_header.cc
index d0e89665257..14183ea4f11 100644
--- a/chromium/ui/views/controls/table/table_header.cc
+++ b/chromium/ui/views/controls/table/table_header.cc
@@ -54,6 +54,7 @@ constexpr int kSortIndicatorSize = 8;
// static
const int TableHeader::kHorizontalPadding = 7;
+
// static
const int TableHeader::kSortIndicatorWidth =
kSortIndicatorSize + TableHeader::kHorizontalPadding * 2;
@@ -139,16 +140,15 @@ void TableHeader::OnPaint(gfx::Canvas* canvas) {
(column.column.id == sorted_column_id &&
title_width + kSortIndicatorWidth <= width);
- if (paint_sort_indicator &&
- column.column.alignment == ui::TableColumn::RIGHT) {
+ if (paint_sort_indicator)
width -= kSortIndicatorWidth;
- }
canvas->DrawStringRectWithFlags(
column.column.title, font_list_, text_color,
gfx::Rect(GetMirroredXWithWidthInView(x, width), kVerticalPadding,
width, height() - kVerticalPadding * 2),
- TableColumnAlignmentToCanvasAlignment(column.column.alignment));
+ TableColumnAlignmentToCanvasAlignment(
+ GetMirroredTableColumnAlignment(column.column.alignment)));
if (paint_sort_indicator) {
cc::PaintFlags flags;
@@ -157,19 +157,12 @@ void TableHeader::OnPaint(gfx::Canvas* canvas) {
flags.setAntiAlias(true);
int indicator_x = 0;
- ui::TableColumn::Alignment alignment = column.column.alignment;
- if (base::i18n::IsRTL()) {
- if (alignment == ui::TableColumn::LEFT)
- alignment = ui::TableColumn::RIGHT;
- else if (alignment == ui::TableColumn::RIGHT)
- alignment = ui::TableColumn::LEFT;
- }
- switch (alignment) {
+ switch (column.column.alignment) {
case ui::TableColumn::LEFT:
indicator_x = x + title_width;
break;
case ui::TableColumn::CENTER:
- indicator_x = x + width / 2;
+ indicator_x = x + width / 2 + title_width / 2;
break;
case ui::TableColumn::RIGHT:
indicator_x = x + width;
@@ -227,7 +220,7 @@ void TableHeader::AddedToWidget() {
}
ui::Cursor TableHeader::GetCursor(const ui::MouseEvent& event) {
- return GetResizeColumn(GetMirroredXInView(event.x())) != -1
+ return GetResizeColumn(GetMirroredXInView(event.x())).has_value()
? ui::mojom::CursorType::kColumnResize
: View::GetCursor(event);
}
@@ -290,9 +283,8 @@ void TableHeader::OnThemeChanged() {
}
void TableHeader::ResizeColumnViaKeyboard(
- int index,
+ size_t index,
TableView::AdvanceDirection direction) {
- DCHECK_GE(index, 0);
const TableView::VisibleColumn& column = table_->GetVisibleColumn(index);
const int needed_for_title =
gfx::GetStringWidth(column.column.title, font_list_) +
@@ -317,30 +309,32 @@ bool TableHeader::GetHeaderRowHasFocus() const {
}
gfx::Rect TableHeader::GetActiveHeaderCellBounds() const {
- const int active_index = table_->GetActiveVisibleColumnIndex();
- DCHECK_NE(ui::ListSelectionModel::kUnselectedIndex, active_index);
+ const absl::optional<size_t> active_index =
+ table_->GetActiveVisibleColumnIndex();
+ DCHECK(active_index.has_value());
const TableView::VisibleColumn& column =
- table_->GetVisibleColumn(active_index);
+ table_->GetVisibleColumn(active_index.value());
return gfx::Rect(column.x, 0, column.width, height());
}
bool TableHeader::HasFocusIndicator() const {
- return table_->GetActiveVisibleColumnIndex() !=
- ui::ListSelectionModel::kUnselectedIndex;
+ return table_->GetActiveVisibleColumnIndex().has_value();
}
bool TableHeader::StartResize(const ui::LocatedEvent& event) {
if (is_resizing())
return false;
- const int index = GetResizeColumn(GetMirroredXInView(event.x()));
- if (index == -1)
+ const absl::optional<size_t> index =
+ GetResizeColumn(GetMirroredXInView(event.x()));
+ if (!index.has_value())
return false;
resize_details_ = std::make_unique<ColumnResizeDetails>();
- resize_details_->column_index = index;
+ resize_details_->column_index = index.value();
resize_details_->initial_x = event.root_location().x();
- resize_details_->initial_width = table_->GetVisibleColumn(index).width;
+ resize_details_->initial_width =
+ table_->GetVisibleColumn(index.value()).width;
return true;
}
@@ -367,28 +361,34 @@ void TableHeader::ToggleSortOrder(const ui::LocatedEvent& event) {
return;
const int x = GetMirroredXInView(event.x());
- const int index = GetClosestVisibleColumnIndex(table_, x);
- const TableView::VisibleColumn& column(table_->GetVisibleColumn(index));
+ const absl::optional<size_t> index = GetClosestVisibleColumnIndex(table_, x);
+ if (!index.has_value())
+ return;
+ const TableView::VisibleColumn& column(
+ table_->GetVisibleColumn(index.value()));
if (x >= column.x && x < column.x + column.width && event.y() >= 0 &&
- event.y() < height())
- table_->ToggleSortOrder(index);
+ event.y() < height()) {
+ table_->ToggleSortOrder(index.value());
+ }
}
-int TableHeader::GetResizeColumn(int x) const {
+absl::optional<size_t> TableHeader::GetResizeColumn(int x) const {
const Columns& columns(table_->visible_columns());
if (columns.empty())
- return -1;
+ return absl::nullopt;
- const int index = GetClosestVisibleColumnIndex(table_, x);
- DCHECK_NE(-1, index);
- const TableView::VisibleColumn& column(table_->GetVisibleColumn(index));
- if (index > 0 && x >= column.x - kResizePadding &&
+ const absl::optional<size_t> index = GetClosestVisibleColumnIndex(table_, x);
+ DCHECK(index.has_value());
+ const TableView::VisibleColumn& column(
+ table_->GetVisibleColumn(index.value()));
+ if (index.value() > 0 && x >= column.x - kResizePadding &&
x <= column.x + kResizePadding) {
- return index - 1;
+ return index.value() - 1;
}
const int max_x = column.x + column.width;
- return (x >= max_x - kResizePadding && x <= max_x + kResizePadding) ? index
- : -1;
+ return (x >= max_x - kResizePadding && x <= max_x + kResizePadding)
+ ? absl::make_optional(index.value())
+ : absl::nullopt;
}
BEGIN_METADATA(TableHeader, View)
END_METADATA
diff --git a/chromium/ui/views/controls/table/table_header.h b/chromium/ui/views/controls/table/table_header.h
index a435e5d3f3f..60693a4442d 100644
--- a/chromium/ui/views/controls/table/table_header.h
+++ b/chromium/ui/views/controls/table/table_header.h
@@ -34,7 +34,7 @@ class VIEWS_EXPORT TableHeader : public views::View {
const gfx::FontList& font_list() const { return font_list_; }
- void ResizeColumnViaKeyboard(int index,
+ void ResizeColumnViaKeyboard(size_t index,
TableView::AdvanceDirection direction);
// Call to update TableHeader objects that rely on the focus state of its
@@ -63,7 +63,7 @@ class VIEWS_EXPORT TableHeader : public views::View {
ColumnResizeDetails() = default;
// Index into table_->visible_columns() that is being resized.
- int column_index = 0;
+ size_t column_index = 0;
// X-coordinate of the mouse at the time the resize started.
int initial_x = 0;
@@ -92,9 +92,9 @@ class VIEWS_EXPORT TableHeader : public views::View {
// Toggles the sort order of the column at the location in |event|.
void ToggleSortOrder(const ui::LocatedEvent& event);
- // Returns the column to resize given the specified x-coordinate, or -1 if |x|
- // is not in the resize range of any columns.
- int GetResizeColumn(int x) const;
+ // Returns the column to resize given the specified x-coordinate, or nullopt
+ // if |x| is not in the resize range of any columns.
+ absl::optional<size_t> GetResizeColumn(int x) const;
bool is_resizing() const { return resize_details_.get() != nullptr; }
diff --git a/chromium/ui/views/controls/table/table_utils.cc b/chromium/ui/views/controls/table/table_utils.cc
index d6ac523212e..7681fecf6ce 100644
--- a/chromium/ui/views/controls/table/table_utils.cc
+++ b/chromium/ui/views/controls/table/table_utils.cc
@@ -8,7 +8,9 @@
#include <algorithm>
+#include "base/i18n/rtl.h"
#include "base/notreached.h"
+#include "ui/base/models/table_model.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/font_list.h"
#include "ui/gfx/text_utils.h"
@@ -29,7 +31,7 @@ int WidthForContent(const gfx::FontList& header_font_list,
width =
gfx::GetStringWidth(column.title, header_font_list) + header_padding;
- for (int i = 0, row_count = model->RowCount(); i < row_count; ++i) {
+ for (size_t i = 0, row_count = model->RowCount(); i < row_count; ++i) {
const int cell_width =
gfx::GetStringWidth(model->GetText(i, column.id), content_font_list);
width = std::max(width, cell_width);
@@ -109,14 +111,32 @@ int TableColumnAlignmentToCanvasAlignment(
return gfx::Canvas::TEXT_ALIGN_LEFT;
}
-int GetClosestVisibleColumnIndex(const TableView* table, int x) {
+absl::optional<size_t> GetClosestVisibleColumnIndex(const TableView* table,
+ int x) {
const std::vector<TableView::VisibleColumn>& columns(
table->visible_columns());
+ if (columns.empty())
+ return absl::nullopt;
for (size_t i = 0; i < columns.size(); ++i) {
if (x <= columns[i].x + columns[i].width)
- return static_cast<int>(i);
+ return i;
+ }
+ return columns.size() - 1;
+}
+
+ui::TableColumn::Alignment GetMirroredTableColumnAlignment(
+ ui::TableColumn::Alignment alignment) {
+ if (!base::i18n::IsRTL())
+ return alignment;
+
+ switch (alignment) {
+ case ui::TableColumn::LEFT:
+ return ui::TableColumn::RIGHT;
+ case ui::TableColumn::RIGHT:
+ return ui::TableColumn::LEFT;
+ case ui::TableColumn::CENTER:
+ return ui::TableColumn::CENTER;
}
- return static_cast<int>(columns.size()) - 1;
}
} // namespace views
diff --git a/chromium/ui/views/controls/table/table_utils.h b/chromium/ui/views/controls/table/table_utils.h
index ec387102e69..08a342fd284 100644
--- a/chromium/ui/views/controls/table/table_utils.h
+++ b/chromium/ui/views/controls/table/table_utils.h
@@ -7,6 +7,7 @@
#include <vector>
+#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/base/models/table_model.h"
#include "ui/views/views_export.h"
@@ -49,8 +50,16 @@ VIEWS_EXPORT std::vector<int> CalculateTableColumnSizes(
int TableColumnAlignmentToCanvasAlignment(ui::TableColumn::Alignment alignment);
// Returns the index of the closest visible column index to |x|. Return value is
-// in terms of table->visible_columns().
-int GetClosestVisibleColumnIndex(const TableView* table, int x);
+// in terms of table->visible_columns(). Returns nullopt if there are no visible
+// columns.
+absl::optional<size_t> GetClosestVisibleColumnIndex(const TableView* table,
+ int x);
+
+// Returns the mirror of the table column alignment if the layout is
+// right-to-left. If the layout is left-to-right, the same alignment is
+// returned.
+ui::TableColumn::Alignment GetMirroredTableColumnAlignment(
+ ui::TableColumn::Alignment alignment);
} // namespace views
diff --git a/chromium/ui/views/controls/table/table_view.cc b/chromium/ui/views/controls/table/table_view.cc
index 266c7a98fcd..b1da527d0b5 100644
--- a/chromium/ui/views/controls/table/table_view.cc
+++ b/chromium/ui/views/controls/table/table_view.cc
@@ -31,6 +31,7 @@
#include "ui/color/color_provider.h"
#include "ui/events/event.h"
#include "ui/gfx/canvas.h"
+#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/geometry/rect_conversions.h"
#include "ui/gfx/geometry/rect_f.h"
#include "ui/gfx/geometry/skia_conversions.h"
@@ -63,14 +64,15 @@ int SwapCompareResult(int result, bool ascending) {
}
// Populates |model_index_to_range_start| based on the |grouper|.
-void GetModelIndexToRangeStart(TableGrouper* grouper,
- int row_count,
- std::map<int, int>* model_index_to_range_start) {
- for (int model_index = 0; model_index < row_count;) {
+void GetModelIndexToRangeStart(
+ TableGrouper* grouper,
+ size_t row_count,
+ std::map<size_t, size_t>* model_index_to_range_start) {
+ for (size_t model_index = 0; model_index < row_count;) {
GroupRange range;
grouper->GetGroupRange(model_index, &range);
- DCHECK_GT(range.length, 0);
- for (int i = model_index; i < model_index + range.length; ++i)
+ DCHECK_GT(range.length, 0u);
+ for (size_t i = model_index; i < model_index + range.length; ++i)
(*model_index_to_range_start)[i] = model_index;
model_index += range.length;
}
@@ -104,7 +106,7 @@ bool IsCmdOrCtrl(const ui::Event& event) {
struct TableView::SortHelper {
explicit SortHelper(TableView* table) : table(table) {}
- bool operator()(int model_index1, int model_index2) {
+ bool operator()(size_t model_index1, size_t model_index2) {
return table->CompareRows(model_index1, model_index2) < 0;
}
@@ -117,9 +119,9 @@ struct TableView::SortHelper {
struct TableView::GroupSortHelper {
explicit GroupSortHelper(TableView* table) : table(table) {}
- bool operator()(int model_index1, int model_index2) {
- const int range1 = model_index_to_range_start[model_index1];
- const int range2 = model_index_to_range_start[model_index2];
+ bool operator()(size_t model_index1, size_t model_index2) {
+ const size_t range1 = model_index_to_range_start[model_index1];
+ const size_t range2 = model_index_to_range_start[model_index2];
if (range1 == range2) {
// The two rows are in the same group, sort so that items in the same
// group always appear in the same order.
@@ -129,7 +131,7 @@ struct TableView::GroupSortHelper {
}
raw_ptr<TableView> table;
- std::map<int, int> model_index_to_range_start;
+ std::map<size_t, size_t> model_index_to_range_start;
};
TableView::VisibleColumn::VisibleColumn() = default;
@@ -287,15 +289,17 @@ void TableView::SetGrouper(TableGrouper* grouper) {
SortItemsAndUpdateMapping(/*schedule_paint=*/true);
}
-int TableView::GetRowCount() const {
+size_t TableView::GetRowCount() const {
return model_ ? model_->RowCount() : 0;
}
-void TableView::Select(int model_row) {
+void TableView::Select(absl::optional<size_t> model_row) {
if (!model_)
return;
- SelectByViewIndex(model_row == -1 ? -1 : ModelToView(model_row));
+ SelectByViewIndex(model_row.has_value()
+ ? absl::make_optional(ModelToView(model_row.value()))
+ : absl::nullopt);
}
void TableView::SetSelectionAll(bool select) {
@@ -313,10 +317,11 @@ void TableView::SetSelectionAll(bool select) {
SetSelectionModel(std::move(selection_model));
}
-int TableView::GetFirstSelectedRow() const {
+absl::optional<size_t> TableView::GetFirstSelectedRow() const {
return selection_model_.empty()
- ? -1
- : *selection_model_.selected_indices().begin();
+ ? absl::nullopt
+ : absl::make_optional(
+ *selection_model_.selected_indices().begin());
}
// TODO(dpenning) : Prevent the last column from being closed. See
@@ -335,10 +340,12 @@ void TableView::SetColumnVisibility(int id, bool is_visible) {
[id](const auto& column) { return column.column.id == id; });
if (i != visible_columns_.end()) {
visible_columns_.erase(i);
- if (active_visible_column_index_ >=
- static_cast<int>(visible_columns_.size()))
- SetActiveVisibleColumnIndex(static_cast<int>(visible_columns_.size()) -
- 1);
+ if (active_visible_column_index_.has_value() &&
+ active_visible_column_index_.value() >= visible_columns_.size())
+ SetActiveVisibleColumnIndex(
+ visible_columns_.empty()
+ ? absl::nullopt
+ : absl::make_optional(visible_columns_.size() - 1));
}
}
@@ -354,9 +361,8 @@ void TableView::SetColumnVisibility(int id, bool is_visible) {
RebuildVirtualAccessibilityChildren();
}
-void TableView::ToggleSortOrder(int visible_column_index) {
- DCHECK(visible_column_index >= 0 &&
- visible_column_index < static_cast<int>(visible_columns_.size()));
+void TableView::ToggleSortOrder(size_t visible_column_index) {
+ DCHECK(visible_column_index < visible_columns_.size());
const ui::TableColumn& column = visible_columns_[visible_column_index].column;
if (!column.sortable)
return;
@@ -411,10 +417,8 @@ bool TableView::HasColumn(int id) const {
}
bool TableView::GetHasFocusIndicator() const {
- int active_row = selection_model_.active();
- return active_row != ui::ListSelectionModel::kUnselectedIndex &&
- active_visible_column_index_ !=
- ui::ListSelectionModel::kUnselectedIndex;
+ return selection_model_.active().has_value() &&
+ active_visible_column_index_.has_value();
}
void TableView::SetObserver(TableViewObserver* observer) {
@@ -428,13 +432,13 @@ TableViewObserver* TableView::GetObserver() const {
return observer_;
}
-const TableView::VisibleColumn& TableView::GetVisibleColumn(int index) {
- DCHECK(index >= 0 && index < static_cast<int>(visible_columns_.size()));
+const TableView::VisibleColumn& TableView::GetVisibleColumn(size_t index) {
+ DCHECK(index < visible_columns_.size());
return visible_columns_[index];
}
-void TableView::SetVisibleColumnWidth(int index, int width) {
- DCHECK(index >= 0 && index < static_cast<int>(visible_columns_.size()));
+void TableView::SetVisibleColumnWidth(size_t index, int width) {
+ DCHECK(index < visible_columns_.size());
if (visible_columns_[index].width == width)
return;
base::AutoReset<bool> reseter(&in_set_visible_column_width_, true);
@@ -448,21 +452,19 @@ void TableView::SetVisibleColumnWidth(int index, int width) {
UpdateVirtualAccessibilityChildrenBounds();
}
-int TableView::ModelToView(int model_index) const {
- DCHECK_GE(model_index, 0) << " negative model_index " << model_index;
+size_t TableView::ModelToView(size_t model_index) const {
if (!GetIsSorted())
return model_index;
- DCHECK_LT(model_index, static_cast<int>(model_to_view_.size()))
+ DCHECK_LT(model_index, model_to_view_.size())
<< " out of bounds model_index " << model_index;
return model_to_view_[model_index];
}
-int TableView::ViewToModel(int view_index) const {
- DCHECK_GE(view_index, 0) << " negative view_index " << view_index;
+size_t TableView::ViewToModel(size_t view_index) const {
DCHECK_LT(view_index, GetRowCount());
if (!GetIsSorted())
return view_index;
- DCHECK_LT(view_index, static_cast<int>(view_to_model_.size()))
+ DCHECK_LT(view_index, view_to_model_.size())
<< " out of bounds view_index " << view_index;
return view_to_model_[view_index];
}
@@ -535,7 +537,7 @@ gfx::Size TableView::CalculatePreferredSize() const {
int width = 50;
if (header_ && !visible_columns_.empty())
width = visible_columns_.back().x + visible_columns_.back().width;
- return gfx::Size(width, GetRowCount() * row_height_);
+ return gfx::Size(width, static_cast<int>(GetRowCount()) * row_height_);
}
bool TableView::GetNeedsNotificationWhenVisibleBoundsChange() const {
@@ -565,7 +567,7 @@ bool TableView::OnKeyPressed(const ui::KeyEvent& event) {
if (header_row_is_active_)
break;
if (GetRowCount())
- SelectByViewIndex(0);
+ SelectByViewIndex(size_t{0});
return true;
case ui::VKEY_END:
@@ -579,7 +581,7 @@ bool TableView::OnKeyPressed(const ui::KeyEvent& event) {
#if BUILDFLAG(IS_MAC)
if (event.IsAltDown()) {
if (GetRowCount())
- SelectByViewIndex(0);
+ SelectByViewIndex(size_t{0});
} else {
AdvanceSelection(AdvanceDirection::kDecrement);
}
@@ -607,9 +609,9 @@ bool TableView::OnKeyPressed(const ui::KeyEvent& event) {
? AdvanceDirection::kIncrement
: AdvanceDirection::kDecrement;
if (IsCmdOrCtrl(event)) {
- if (active_visible_column_index_ != -1 && header_) {
- header_->ResizeColumnViaKeyboard(active_visible_column_index_,
- direction);
+ if (active_visible_column_index_.has_value() && header_) {
+ header_->ResizeColumnViaKeyboard(
+ active_visible_column_index_.value(), direction);
UpdateFocusRings();
}
} else {
@@ -628,9 +630,9 @@ bool TableView::OnKeyPressed(const ui::KeyEvent& event) {
? AdvanceDirection::kDecrement
: AdvanceDirection::kIncrement;
if (IsCmdOrCtrl(event)) {
- if (active_visible_column_index_ != -1 && header_) {
- header_->ResizeColumnViaKeyboard(active_visible_column_index_,
- direction);
+ if (active_visible_column_index_.has_value() && header_) {
+ header_->ResizeColumnViaKeyboard(
+ active_visible_column_index_.value(), direction);
UpdateFocusRings();
}
} else {
@@ -646,16 +648,16 @@ bool TableView::OnKeyPressed(const ui::KeyEvent& event) {
// when the table header is active.
case ui::VKEY_RETURN:
if (PlatformStyle::kTableViewSupportsKeyboardNavigationByCell &&
- active_visible_column_index_ != -1 && header_row_is_active_) {
- ToggleSortOrder(active_visible_column_index_);
+ active_visible_column_index_.has_value() && header_row_is_active_) {
+ ToggleSortOrder(active_visible_column_index_.value());
return true;
}
break;
case ui::VKEY_SPACE:
if (PlatformStyle::kTableViewSupportsKeyboardNavigationByCell &&
- active_visible_column_index_ != -1) {
- ToggleSortOrder(active_visible_column_index_);
+ active_visible_column_index_.has_value()) {
+ ToggleSortOrder(active_visible_column_index_.value());
return true;
}
break;
@@ -675,11 +677,11 @@ bool TableView::OnMousePressed(const ui::MouseEvent& event) {
return true;
const int row = event.y() / row_height_;
- if (row < 0 || row >= GetRowCount())
+ if (row < 0 || static_cast<size_t>(row) >= GetRowCount())
return true;
if (event.GetClickCount() == 2) {
- SelectByViewIndex(row);
+ SelectByViewIndex(static_cast<size_t>(row));
if (observer_)
observer_->OnDoubleClick();
} else if (event.GetClickCount() == 1) {
@@ -698,7 +700,7 @@ void TableView::OnGestureEvent(ui::GestureEvent* event) {
RequestFocus();
const int row = event->y() / row_height_;
- if (row < 0 || row >= GetRowCount())
+ if (row < 0 || static_cast<size_t>(row) >= GetRowCount())
return;
event->StopPropagation();
@@ -709,19 +711,23 @@ void TableView::OnGestureEvent(ui::GestureEvent* event) {
std::u16string TableView::GetTooltipText(const gfx::Point& p) const {
const int row = p.y() / row_height_;
- if (row < 0 || row >= GetRowCount() || visible_columns_.empty())
+ if (row < 0 || static_cast<size_t>(row) >= GetRowCount() ||
+ visible_columns_.empty()) {
return std::u16string();
+ }
const int x = GetMirroredXInView(p.x());
- const int column = GetClosestVisibleColumnIndex(this, x);
- if (x < visible_columns_[column].x ||
- x > (visible_columns_[column].x + visible_columns_[column].width))
+ const absl::optional<size_t> column = GetClosestVisibleColumnIndex(this, x);
+ if (!column.has_value() || x < visible_columns_[column.value()].x ||
+ x > (visible_columns_[column.value()].x +
+ visible_columns_[column.value()].width)) {
return std::u16string();
+ }
- const int model_row = ViewToModel(row);
- if (column == 0 && !model_->GetTooltip(model_row).empty())
+ const size_t model_row = ViewToModel(static_cast<size_t>(row));
+ if (column.value() == 0 && !model_->GetTooltip(model_row).empty())
return model_->GetTooltip(model_row);
- return model_->GetText(model_row, visible_columns_[column].column.id);
+ return model_->GetText(model_row, visible_columns_[column.value()].column.id);
}
void TableView::GetAccessibleNodeData(ui::AXNodeData* node_data) {
@@ -740,7 +746,7 @@ void TableView::GetAccessibleNodeData(ui::AXNodeData* node_data) {
}
bool TableView::HandleAccessibleAction(const ui::AXActionData& action_data) {
- const int row_count = GetRowCount();
+ const size_t row_count = GetRowCount();
if (!row_count)
return false;
@@ -750,9 +756,7 @@ bool TableView::HandleAccessibleAction(const ui::AXActionData& action_data) {
bool focus_on_row =
ax_view ? ax_view->GetData().role == ax::mojom::Role::kRow : false;
- int active_row = selection_model_.active();
- if (active_row == ui::ListSelectionModel::kUnselectedIndex)
- active_row = ModelToView(0);
+ size_t active_row = selection_model_.active().value_or(ModelToView(0));
switch (action_data.action) {
case ax::mojom::Action::kDoDefault:
@@ -760,8 +764,9 @@ bool TableView::HandleAccessibleAction(const ui::AXActionData& action_data) {
if (focus_on_row) {
// If the ax focus is on a row, select this row.
DCHECK(ax_view);
- int row_index = ax_view->GetData().GetIntAttribute(
- ax::mojom::IntAttribute::kTableRowIndex);
+ size_t row_index =
+ base::checked_cast<size_t>(ax_view->GetData().GetIntAttribute(
+ ax::mojom::IntAttribute::kTableRowIndex));
SelectByViewIndex(row_index);
GetViewAccessibility().AnnounceText(l10n_util::GetStringFUTF16(
IDS_TABLE_VIEW_AX_ANNOUNCE_ROW_SELECTED,
@@ -780,7 +785,7 @@ bool TableView::HandleAccessibleAction(const ui::AXActionData& action_data) {
RequestFocus();
// Setting focus should not affect the current selection.
if (selection_model_.empty())
- SelectByViewIndex(0);
+ SelectByViewIndex(size_t{0});
break;
case ax::mojom::Action::kScrollRight: {
@@ -827,23 +832,21 @@ void TableView::OnModelChanged() {
PreferredSizeChanged();
}
-void TableView::OnItemsChanged(int start, int length) {
+void TableView::OnItemsChanged(size_t start, size_t length) {
SortItemsAndUpdateMapping(/*schedule_paint=*/true);
}
-void TableView::OnItemsAdded(int start, int length) {
- DCHECK_GE(start, 0);
- DCHECK_GE(length, 0);
+void TableView::OnItemsAdded(size_t start, size_t length) {
DCHECK_LE(start + length, GetRowCount());
- for (int i = 0; i < length; ++i) {
+ for (size_t i = 0; i < length; ++i) {
// Increment selection model counter at start.
selection_model_.IncrementFrom(start);
// Append new virtual row to accessibility view.
- const int virtual_children_count =
+ const size_t virtual_children_count =
GetViewAccessibility().virtual_children().size();
- const int next_index =
+ const size_t next_index =
header_ ? virtual_children_count - 1 : virtual_children_count;
GetViewAccessibility().AddVirtualChildView(
CreateRowAccessibilityView(next_index));
@@ -854,24 +857,25 @@ void TableView::OnItemsAdded(int start, int length) {
NotifyAccessibilityEvent(ax::mojom::Event::kChildrenChanged, true);
}
-void TableView::OnItemsMoved(int old_start, int length, int new_start) {
+void TableView::OnItemsMoved(size_t old_start,
+ size_t length,
+ size_t new_start) {
selection_model_.Move(old_start, new_start, length);
SortItemsAndUpdateMapping(/*schedule_paint=*/true);
}
-void TableView::OnItemsRemoved(int start, int length) {
- DCHECK_GE(start, 0);
- DCHECK_GE(length, 0);
-
+void TableView::OnItemsRemoved(size_t start, size_t length) {
// Determine the currently selected index in terms of the view. We inline the
// implementation here since ViewToModel() has DCHECKs that fail since the
// model has changed but |model_to_view_| has not been updated yet.
- const int previously_selected_model_index = GetFirstSelectedRow();
- int previously_selected_view_index = previously_selected_model_index;
- if (previously_selected_model_index != -1 && GetIsSorted())
+ const absl::optional<size_t> previously_selected_model_index =
+ GetFirstSelectedRow();
+ absl::optional<size_t> previously_selected_view_index =
+ previously_selected_model_index;
+ if (previously_selected_model_index.has_value() && GetIsSorted())
previously_selected_view_index =
- model_to_view_[previously_selected_model_index];
- for (int i = 0; i < length; ++i)
+ model_to_view_[previously_selected_model_index.value()];
+ for (size_t i = 0; i < length; ++i)
selection_model_.DecrementFrom(start);
// Update the `view_to_model_` and `model_to_view_` mappings prior to updating
@@ -883,25 +887,29 @@ void TableView::OnItemsRemoved(int start, int length) {
// See (https://crbug.com/1173373).
SortItemsAndUpdateMapping(/*schedule_paint=*/true);
if (GetIsSorted()) {
- DCHECK_EQ(GetRowCount(), static_cast<int>(view_to_model_.size()));
- DCHECK_EQ(GetRowCount(), static_cast<int>(model_to_view_.size()));
+ DCHECK_EQ(GetRowCount(), view_to_model_.size());
+ DCHECK_EQ(GetRowCount(), model_to_view_.size());
}
// If the selection was empty and is no longer empty select the same visual
// index.
- if (selection_model_.empty() && previously_selected_view_index != -1 &&
+ if (selection_model_.empty() && previously_selected_view_index.has_value() &&
GetRowCount() && select_on_remove_) {
selection_model_.SetSelectedIndex(ViewToModel(
- std::min(GetRowCount() - 1, previously_selected_view_index)));
+ std::min(GetRowCount() - 1, previously_selected_view_index.value())));
+ }
+ if (!selection_model_.empty()) {
+ const size_t selected_model_index =
+ *selection_model_.selected_indices().begin();
+ if (!selection_model_.active().has_value())
+ selection_model_.set_active(selected_model_index);
+ if (!selection_model_.anchor().has_value())
+ selection_model_.set_anchor(selected_model_index);
}
- if (!selection_model_.empty() && selection_model_.active() == -1)
- selection_model_.set_active(GetFirstSelectedRow());
- if (!selection_model_.empty() && selection_model_.anchor() == -1)
- selection_model_.set_anchor(GetFirstSelectedRow());
// Remove the virtual views that are no longer needed.
auto& virtual_children = GetViewAccessibility().virtual_children();
- for (int i = start; !virtual_children.empty() && i < start + length; i++)
+ for (size_t i = start; !virtual_children.empty() && i < start + length; i++)
virtual_children[virtual_children.size() - 1]->RemoveFromParentView();
UpdateVirtualAccessibilityChildrenBounds();
@@ -912,11 +920,11 @@ void TableView::OnItemsRemoved(int start, int length) {
}
gfx::Point TableView::GetKeyboardContextMenuLocation() {
- int first_selected = GetFirstSelectedRow();
+ absl::optional<size_t> first_selected = GetFirstSelectedRow();
gfx::Rect vis_bounds(GetVisibleBounds());
int y = vis_bounds.height() / 2;
- if (first_selected != -1) {
- gfx::Rect cell_bounds(GetRowBounds(first_selected));
+ if (first_selected.has_value()) {
+ gfx::Rect cell_bounds(GetRowBounds(first_selected.value()));
if (cell_bounds.bottom() >= vis_bounds.y() &&
cell_bounds.bottom() < vis_bounds.bottom()) {
y = cell_bounds.bottom();
@@ -960,7 +968,7 @@ void TableView::OnPaintImpl(gfx::Canvas* canvas) {
return;
const PaintRegion region(GetPaintRegion(GetPaintBounds(canvas)));
- if (region.min_column == -1)
+ if (region.min_column == visible_columns_.size())
return; // No need to paint anything.
const SkColor selected_bg_color =
@@ -972,46 +980,50 @@ void TableView::OnPaintImpl(gfx::Canvas* canvas) {
color_provider->GetColor(ui::kColorTableBackgroundAlternate);
const int cell_margin = GetCellMargin();
const int cell_element_spacing = GetCellElementSpacing();
- for (int i = region.min_row; i < region.max_row; ++i) {
- const int model_index = ViewToModel(i);
+ for (size_t i = region.min_row; i < region.max_row; ++i) {
+ const size_t model_index = ViewToModel(i);
const bool is_selected = selection_model_.IsSelected(model_index);
if (is_selected)
canvas->FillRect(GetRowBounds(i), selected_bg_color);
else if (alternate_bg_color != default_bg_color && (i % 2))
canvas->FillRect(GetRowBounds(i), alternate_bg_color);
- for (int j = region.min_column; j < region.max_column; ++j) {
- const gfx::Rect cell_bounds(GetCellBounds(i, j));
- int text_x = cell_margin + cell_bounds.x();
+ for (size_t j = region.min_column; j < region.max_column; ++j) {
+ const gfx::Rect cell_bounds = GetCellBounds(i, j);
+ gfx::Rect text_bounds = cell_bounds;
+ text_bounds.Inset(gfx::Insets::VH(0, cell_margin));
// Provide space for the grouping indicator, but draw it separately.
- if (j == 0 && grouper_)
- text_x += kGroupingIndicatorSize + cell_element_spacing;
+ if (j == 0 && grouper_) {
+ text_bounds.Inset(gfx::Insets().set_left(kGroupingIndicatorSize +
+ cell_element_spacing));
+ }
// Always paint the icon in the first visible column.
if (j == 0 && table_type_ == ICON_AND_TEXT) {
gfx::ImageSkia image =
model_->GetIcon(model_index).Rasterize(GetColorProvider());
if (!image.isNull()) {
- int image_x =
- GetMirroredXWithWidthInView(text_x, ui::TableModel::kIconSize);
+ int image_x = GetMirroredXWithWidthInView(text_bounds.x(),
+ ui::TableModel::kIconSize);
canvas->DrawImageInt(
image, 0, 0, image.width(), image.height(), image_x,
cell_bounds.y() +
(cell_bounds.height() - ui::TableModel::kIconSize) / 2,
ui::TableModel::kIconSize, ui::TableModel::kIconSize, true);
}
- text_x += ui::TableModel::kIconSize + cell_element_spacing;
+ text_bounds.Inset(gfx::Insets().set_left(ui::TableModel::kIconSize +
+ cell_element_spacing));
}
- if (text_x < cell_bounds.right() - cell_margin) {
+
+ // Paint text if there is still room for it after all that insetting.
+ if (!text_bounds.IsEmpty()) {
canvas->DrawStringRectWithFlags(
model_->GetText(model_index, visible_columns_[j].column.id),
font_list_, is_selected ? selected_fg_color : fg_color,
- gfx::Rect(GetMirroredXWithWidthInView(
- text_x, cell_bounds.right() - text_x - cell_margin),
- cell_bounds.y(), cell_bounds.right() - text_x,
- row_height_),
+ GetMirroredRect(text_bounds),
TableColumnAlignmentToCanvasAlignment(
- visible_columns_[j].column.alignment));
+ GetMirroredTableColumnAlignment(
+ visible_columns_[j].column.alignment)));
}
}
}
@@ -1029,15 +1041,15 @@ void TableView::OnPaintImpl(gfx::Canvas* canvas) {
grouping_flags.setAntiAlias(true);
const int group_indicator_x = GetMirroredXInView(
GetCellBounds(0, 0).x() + cell_margin + kGroupingIndicatorSize / 2);
- for (int i = region.min_row; i < region.max_row;) {
- const int model_index = ViewToModel(i);
+ for (size_t i = region.min_row; i < region.max_row;) {
+ const size_t model_index = ViewToModel(i);
GroupRange range;
grouper_->GetGroupRange(model_index, &range);
- DCHECK_GT(range.length, 0);
+ DCHECK_GT(range.length, 0u);
// The order of rows in a group is consistent regardless of sort, so it's ok
// to do this calculation.
- const int start = i - (model_index - range.start);
- const int last = start + range.length - 1;
+ const size_t start = i - (model_index - range.start);
+ const size_t last = start + range.length - 1;
const gfx::RectF start_cell_bounds(GetCellBounds(start, 0));
const gfx::RectF last_cell_bounds(GetCellBounds(last, 0));
canvas->DrawLine(
@@ -1060,7 +1072,7 @@ int TableView::GetCellElementSpacing() const {
void TableView::SortItemsAndUpdateMapping(bool schedule_paint) {
- const int row_count = GetRowCount();
+ const size_t row_count = GetRowCount();
if (!GetIsSorted()) {
view_to_model_.clear();
@@ -1070,7 +1082,7 @@ void TableView::SortItemsAndUpdateMapping(bool schedule_paint) {
model_to_view_.resize(row_count);
// Resets the mapping so it can be sorted again.
- for (int view_index = 0; view_index < row_count; ++view_index)
+ for (size_t view_index = 0; view_index < row_count; ++view_index)
view_to_model_[view_index] = view_index;
if (grouper_) {
@@ -1084,7 +1096,7 @@ void TableView::SortItemsAndUpdateMapping(bool schedule_paint) {
SortHelper(this));
}
- for (int view_index = 0; view_index < row_count; ++view_index)
+ for (size_t view_index = 0; view_index < row_count; ++view_index)
model_to_view_[view_to_model_[view_index]] = view_index;
model_->ClearCollator();
@@ -1096,7 +1108,7 @@ void TableView::SortItemsAndUpdateMapping(bool schedule_paint) {
SchedulePaint();
}
-int TableView::CompareRows(int model_row1, int model_row2) {
+int TableView::CompareRows(size_t model_row1, size_t model_row2) {
const int sort_result = model_->CompareValues(model_row1, model_row2,
sort_descriptors_[0].column_id);
if (sort_result == 0 && sort_descriptors_.size() > 1) {
@@ -1109,25 +1121,28 @@ int TableView::CompareRows(int model_row1, int model_row2) {
return SwapCompareResult(sort_result, sort_descriptors_[0].ascending);
}
-gfx::Rect TableView::GetRowBounds(int row) const {
- return gfx::Rect(0, row * row_height_, width(), row_height_);
+gfx::Rect TableView::GetRowBounds(size_t row) const {
+ return gfx::Rect(0, static_cast<int>(row) * row_height_, width(),
+ row_height_);
}
-gfx::Rect TableView::GetCellBounds(int row, int visible_column_index) const {
+gfx::Rect TableView::GetCellBounds(size_t row,
+ size_t visible_column_index) const {
if (!header_)
return GetRowBounds(row);
const VisibleColumn& vis_col(visible_columns_[visible_column_index]);
- return gfx::Rect(vis_col.x, row * row_height_, vis_col.width, row_height_);
+ return gfx::Rect(vis_col.x, static_cast<int>(row) * row_height_,
+ vis_col.width, row_height_);
}
gfx::Rect TableView::GetActiveCellBounds() const {
- if (selection_model_.active() == ui::ListSelectionModel::kUnselectedIndex)
+ if (!selection_model_.active().has_value())
return gfx::Rect();
- return GetCellBounds(ModelToView(selection_model_.active()),
- active_visible_column_index_);
+ return GetCellBounds(ModelToView(selection_model_.active().value()),
+ active_visible_column_index_.value());
}
-void TableView::AdjustCellBoundsForText(int visible_column_index,
+void TableView::AdjustCellBoundsForText(size_t visible_column_index,
gfx::Rect* bounds) const {
const int cell_margin = GetCellMargin();
const int cell_element_spacing = GetCellElementSpacing();
@@ -1191,8 +1206,10 @@ TableView::PaintRegion TableView::GetPaintRegion(
DCHECK(GetRowCount());
PaintRegion region;
- region.min_row = base::clamp(bounds.y() / row_height_, 0, GetRowCount() - 1);
- region.max_row = bounds.bottom() / row_height_;
+ region.min_row = static_cast<size_t>(
+ base::clamp(bounds.y() / row_height_, 0,
+ base::saturated_cast<int>(GetRowCount() - 1)));
+ region.max_row = static_cast<size_t>(bounds.bottom() / row_height_);
if (bounds.bottom() % row_height_ != 0)
region.max_row++;
region.max_row = std::min(region.max_row, GetRowCount());
@@ -1204,13 +1221,13 @@ TableView::PaintRegion TableView::GetPaintRegion(
const int paint_x = GetMirroredXForRect(bounds);
const int paint_max_x = paint_x + bounds.width();
- region.min_column = -1;
- region.max_column = visible_columns_.size();
+ region.min_column = region.max_column = visible_columns_.size();
for (size_t i = 0; i < visible_columns_.size(); ++i) {
int max_x = visible_columns_[i].x + visible_columns_[i].width;
- if (region.min_column == -1 && max_x >= paint_x)
- region.min_column = static_cast<int>(i);
- if (region.min_column != -1 && visible_columns_[i].x >= paint_max_x) {
+ if (region.min_column == visible_columns_.size() && max_x >= paint_x)
+ region.min_column = i;
+ if (region.min_column != visible_columns_.size() &&
+ visible_columns_[i].x >= paint_max_x) {
region.max_column = i;
break;
}
@@ -1227,12 +1244,14 @@ gfx::Rect TableView::GetPaintBounds(gfx::Canvas* canvas) const {
void TableView::SchedulePaintForSelection() {
if (selection_model_.size() == 1) {
- const int first_model_row = GetFirstSelectedRow();
- SchedulePaintInRect(GetRowBounds(ModelToView(first_model_row)));
+ const absl::optional<size_t> first_model_row = GetFirstSelectedRow();
+ SchedulePaintInRect(GetRowBounds(ModelToView(first_model_row.value())));
- const int active_row = selection_model_.active();
- if (active_row >= 0 && first_model_row != active_row)
- SchedulePaintInRect(GetRowBounds(ModelToView(active_row)));
+ if (selection_model_.active().has_value() &&
+ first_model_row != selection_model_.active().value()) {
+ SchedulePaintInRect(
+ GetRowBounds(ModelToView(selection_model_.active().value())));
+ }
} else if (selection_model_.size() > 1) {
SchedulePaint();
}
@@ -1247,39 +1266,40 @@ ui::TableColumn TableView::FindColumnByID(int id) const {
void TableView::AdvanceActiveVisibleColumn(AdvanceDirection direction) {
if (visible_columns_.empty()) {
- SetActiveVisibleColumnIndex(-1);
+ SetActiveVisibleColumnIndex(absl::nullopt);
return;
}
- if (active_visible_column_index_ == -1) {
- if (selection_model_.active() == -1 && !header_row_is_active_)
- SelectByViewIndex(0);
- SetActiveVisibleColumnIndex(0);
+ if (!active_visible_column_index_.has_value()) {
+ if (!selection_model_.active().has_value() && !header_row_is_active_)
+ SelectByViewIndex(size_t{0});
+ SetActiveVisibleColumnIndex(size_t{0});
return;
}
if (direction == AdvanceDirection::kDecrement) {
- SetActiveVisibleColumnIndex(std::max(0, active_visible_column_index_ - 1));
- } else {
SetActiveVisibleColumnIndex(
- std::min(static_cast<int>(visible_columns_.size()) - 1,
- active_visible_column_index_ + 1));
+ std::max(size_t{1}, active_visible_column_index_.value()) - 1);
+ } else {
+ SetActiveVisibleColumnIndex(std::min(
+ visible_columns_.size() - 1, active_visible_column_index_.value() + 1));
}
}
-int TableView::GetActiveVisibleColumnIndex() const {
+absl::optional<size_t> TableView::GetActiveVisibleColumnIndex() const {
return active_visible_column_index_;
}
-void TableView::SetActiveVisibleColumnIndex(int index) {
+void TableView::SetActiveVisibleColumnIndex(absl::optional<size_t> index) {
if (active_visible_column_index_ == index)
return;
active_visible_column_index_ = index;
- if (selection_model_.active() != ui::ListSelectionModel::kUnselectedIndex &&
- active_visible_column_index_ != -1) {
- ScrollRectToVisible(GetCellBounds(ModelToView(selection_model_.active()),
- active_visible_column_index_));
+ if (selection_model_.active().has_value() &&
+ active_visible_column_index_.has_value()) {
+ ScrollRectToVisible(
+ GetCellBounds(ModelToView(selection_model_.active().value()),
+ active_visible_column_index_.value()));
}
UpdateFocusRings();
@@ -1287,12 +1307,12 @@ void TableView::SetActiveVisibleColumnIndex(int index) {
OnPropertyChanged(&active_visible_column_index_, kPropertyEffectsNone);
}
-void TableView::SelectByViewIndex(int view_index) {
+void TableView::SelectByViewIndex(absl::optional<size_t> view_index) {
ui::ListSelectionModel new_selection;
- if (view_index != -1) {
- SelectRowsInRangeFrom(view_index, true, &new_selection);
- new_selection.set_anchor(ViewToModel(view_index));
- new_selection.set_active(ViewToModel(view_index));
+ if (view_index.has_value()) {
+ SelectRowsInRangeFrom(view_index.value(), true, &new_selection);
+ new_selection.set_anchor(ViewToModel(view_index.value()));
+ new_selection.set_active(ViewToModel(view_index.value()));
}
SetSelectionModel(std::move(new_selection));
@@ -1307,9 +1327,9 @@ void TableView::SetSelectionModel(ui::ListSelectionModel new_selection) {
SchedulePaintForSelection();
// Scroll the group for the active item to visible.
- if (selection_model_.active() != -1) {
+ if (selection_model_.active().has_value()) {
gfx::Rect vis_rect(GetVisibleBounds());
- const GroupRange range(GetGroupRange(selection_model_.active()));
+ const GroupRange range(GetGroupRange(selection_model_.active().value()));
const int start_y = GetRowBounds(ModelToView(range.start)).y();
const int end_y =
GetRowBounds(ModelToView(range.start + range.length - 1)).bottom();
@@ -1317,10 +1337,10 @@ void TableView::SetSelectionModel(ui::ListSelectionModel new_selection) {
vis_rect.set_height(end_y - start_y);
ScrollRectToVisible(vis_rect);
- if (active_visible_column_index_ == -1)
- SetActiveVisibleColumnIndex(0);
+ if (!active_visible_column_index_.has_value())
+ SetActiveVisibleColumnIndex(size_t{0});
} else if (!header_row_is_active_) {
- SetActiveVisibleColumnIndex(-1);
+ SetActiveVisibleColumnIndex(absl::nullopt);
}
UpdateFocusRings();
@@ -1330,34 +1350,39 @@ void TableView::SetSelectionModel(ui::ListSelectionModel new_selection) {
}
void TableView::AdvanceSelection(AdvanceDirection direction) {
- if (selection_model_.active() == -1) {
+ if (!selection_model_.active().has_value()) {
bool make_header_active =
header_ && direction == AdvanceDirection::kDecrement;
header_row_is_active_ = make_header_active;
- SelectByViewIndex(make_header_active ? -1 : 0);
+ SelectByViewIndex(make_header_active ? absl::nullopt
+ : absl::make_optional(size_t{0}));
UpdateFocusRings();
ScheduleUpdateAccessibilityFocusIfNeeded();
return;
}
- int view_index = ModelToView(selection_model_.active());
+ size_t view_index = ModelToView(selection_model_.active().value());
if (direction == AdvanceDirection::kDecrement) {
bool make_header_active = header_ && view_index == 0;
header_row_is_active_ = make_header_active;
- view_index = make_header_active ? -1 : std::max(0, view_index - 1);
+ SelectByViewIndex(
+ make_header_active
+ ? absl::nullopt
+ : absl::make_optional(std::max(size_t{1}, view_index) - 1));
} else {
header_row_is_active_ = false;
- view_index = std::min(GetRowCount() - 1, view_index + 1);
+ SelectByViewIndex(std::min(GetRowCount() - 1, view_index + 1));
}
- SelectByViewIndex(view_index);
}
void TableView::ConfigureSelectionModelForEvent(
const ui::LocatedEvent& event,
ui::ListSelectionModel* model) const {
- const int view_index = event.y() / row_height_;
- DCHECK(view_index >= 0 && view_index < GetRowCount());
+ const int view_index_int = event.y() / row_height_;
+ DCHECK_GE(view_index_int, 0);
+ const size_t view_index = static_cast<size_t>(view_index_int);
+ DCHECK_LT(view_index, GetRowCount());
- if (selection_model_.anchor() == -1 || single_selection_ ||
+ if (!selection_model_.anchor().has_value() || single_selection_ ||
(!IsCmdOrCtrl(event) && !event.IsShiftDown())) {
SelectRowsInRangeFrom(view_index, true, model);
model->set_anchor(ViewToModel(view_index));
@@ -1373,11 +1398,11 @@ void TableView::ConfigureSelectionModelForEvent(
*model = selection_model_;
else
model->set_anchor(selection_model_.anchor());
- for (int i = std::min(view_index, ModelToView(model->anchor())),
- end = std::max(view_index, ModelToView(model->anchor()));
- i <= end; ++i) {
+ DCHECK(model->anchor().has_value());
+ const size_t anchor_index = ModelToView(model->anchor().value());
+ const auto [min, max] = std::minmax(view_index, anchor_index);
+ for (size_t i = min; i <= max; ++i)
SelectRowsInRangeFrom(i, true, model);
- }
model->set_active(ViewToModel(view_index));
} else {
DCHECK(IsCmdOrCtrl(event));
@@ -1391,11 +1416,11 @@ void TableView::ConfigureSelectionModelForEvent(
}
}
-void TableView::SelectRowsInRangeFrom(int view_index,
+void TableView::SelectRowsInRangeFrom(size_t view_index,
bool select,
ui::ListSelectionModel* model) const {
const GroupRange range(GetGroupRange(ViewToModel(view_index)));
- for (int i = 0; i < range.length; ++i) {
+ for (size_t i = 0; i < range.length; ++i) {
if (select)
model->AddIndexToSelection(range.start + i);
else
@@ -1403,7 +1428,7 @@ void TableView::SelectRowsInRangeFrom(int view_index,
}
}
-GroupRange TableView::GetGroupRange(int model_index) const {
+GroupRange TableView::GetGroupRange(size_t model_index) const {
GroupRange range;
if (grouper_) {
grouper_->GetGroupRange(model_index, &range);
@@ -1426,7 +1451,7 @@ void TableView::RebuildVirtualAccessibilityChildren() {
// Create a virtual accessibility view for each row. At this point on, the
// table has no sort behavior, hence the view index is the same as the model
// index, the sorting will happen at the end.
- for (int index = 0; index < GetRowCount(); ++index)
+ for (size_t index = 0; index < GetRowCount(); ++index)
GetViewAccessibility().AddVirtualChildView(
CreateRowAccessibilityView(index));
@@ -1439,7 +1464,7 @@ void TableView::ClearVirtualAccessibilityChildren() {
}
std::unique_ptr<AXVirtualView> TableView::CreateRowAccessibilityView(
- int row_index) {
+ size_t row_index) {
auto ax_row = std::make_unique<AXVirtualView>();
ui::AXNodeData& row_data = ax_row->GetCustomData();
@@ -1475,7 +1500,7 @@ std::unique_ptr<AXVirtualView> TableView::CreateRowAccessibilityView(
}
std::unique_ptr<AXVirtualView> TableView::CreateCellAccessibilityView(
- int row_index,
+ size_t row_index,
size_t column_index) {
const VisibleColumn& visible_column = visible_columns_[column_index];
const ui::TableColumn column = visible_column.column;
@@ -1530,8 +1555,7 @@ void TableView::PopulateAccessibilityRowData(AXVirtualView* ax_row,
DCHECK(ax_index.has_value());
size_t row_index = ax_index.value() - (header_ ? 1 : 0);
- int model_index = ViewToModel(static_cast<int>(row_index));
- DCHECK_GE(model_index, 0);
+ size_t model_index = ViewToModel(row_index);
// When navigating using up / down cursor keys on the Mac, we read the
// contents of the first cell. If the user needs to explore additional cell's,
@@ -1560,8 +1584,7 @@ void TableView::PopulateAccessibilityCellData(AXVirtualView* ax_cell,
auto column_index = ax_row->GetIndexOf(ax_cell);
DCHECK(column_index.has_value());
- int model_index = ViewToModel(static_cast<int>(row_index));
- DCHECK_GE(model_index, 0);
+ size_t model_index = ViewToModel(row_index);
gfx::Rect cell_bounds = GetCellBounds(row_index, column_index.value());
@@ -1569,7 +1592,7 @@ void TableView::PopulateAccessibilityCellData(AXVirtualView* ax_cell,
data->AddState(ax::mojom::State::kInvisible);
if (PlatformStyle::kTableViewSupportsKeyboardNavigationByCell &&
- static_cast<int>(column_index.value()) == GetActiveVisibleColumnIndex()) {
+ column_index.value() == GetActiveVisibleColumnIndex()) {
if (selection_model().IsSelected(model_index))
data->AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, true);
}
@@ -1695,7 +1718,7 @@ void TableView::UpdateVirtualAccessibilityChildrenBounds() {
}
// Update the bounds for the table's content rows.
- for (int row_index = 0; row_index < GetRowCount(); row_index++) {
+ for (size_t row_index = 0; row_index < GetRowCount(); row_index++) {
const size_t ax_row_index = header_ ? row_index + 1 : row_index;
if (ax_row_index >= virtual_children.size())
break;
@@ -1734,7 +1757,7 @@ gfx::Rect TableView::CalculateHeaderRowAccessibilityBounds() const {
}
gfx::Rect TableView::CalculateHeaderCellAccessibilityBounds(
- const int visible_column_index) const {
+ const size_t visible_column_index) const {
const gfx::Rect& header_bounds = CalculateHeaderRowAccessibilityBounds();
const VisibleColumn& visible_column = visible_columns_[visible_column_index];
gfx::Rect header_cell_bounds(visible_column.x, header_bounds.y(),
@@ -1743,14 +1766,14 @@ gfx::Rect TableView::CalculateHeaderCellAccessibilityBounds(
}
gfx::Rect TableView::CalculateTableRowAccessibilityBounds(
- const int row_index) const {
+ const size_t row_index) const {
gfx::Rect row_bounds = GetRowBounds(row_index);
return row_bounds;
}
gfx::Rect TableView::CalculateTableCellAccessibilityBounds(
- const int row_index,
- const int visible_column_index) const {
+ const size_t row_index,
+ const size_t visible_column_index) const {
gfx::Rect cell_bounds = GetCellBounds(row_index, visible_column_index);
return cell_bounds;
}
@@ -1777,14 +1800,14 @@ void TableView::UpdateAccessibilityFocus(
if (header_ && header_row_is_active_) {
AXVirtualView* ax_header_row = GetVirtualAccessibilityHeaderRow();
if (!PlatformStyle::kTableViewSupportsKeyboardNavigationByCell ||
- active_visible_column_index_ == -1) {
+ !active_visible_column_index_.has_value()) {
if (ax_header_row) {
ax_header_row->NotifyAccessibilityEvent(ax::mojom::Event::kSelection);
GetViewAccessibility().OverrideFocus(ax_header_row);
}
} else {
AXVirtualView* ax_header_cell = GetVirtualAccessibilityCellImpl(
- ax_header_row, active_visible_column_index_);
+ ax_header_row, active_visible_column_index_.value());
if (ax_header_cell) {
ax_header_cell->NotifyAccessibilityEvent(ax::mojom::Event::kSelection);
GetViewAccessibility().OverrideFocus(ax_header_cell);
@@ -1793,13 +1816,13 @@ void TableView::UpdateAccessibilityFocus(
return;
}
- if (selection_model_.active() == ui::ListSelectionModel::kUnselectedIndex ||
- active_visible_column_index_ == -1) {
+ if (!selection_model_.active().has_value() ||
+ !active_visible_column_index_.has_value()) {
GetViewAccessibility().OverrideFocus(nullptr);
return;
}
- int active_row = ModelToView(selection_model_.active());
+ size_t active_row = ModelToView(selection_model_.active().value());
AXVirtualView* ax_row = GetVirtualAccessibilityBodyRow(active_row);
if (!PlatformStyle::kTableViewSupportsKeyboardNavigationByCell) {
if (ax_row) {
@@ -1807,8 +1830,8 @@ void TableView::UpdateAccessibilityFocus(
GetViewAccessibility().OverrideFocus(ax_row);
}
} else {
- AXVirtualView* ax_cell =
- GetVirtualAccessibilityCellImpl(ax_row, active_visible_column_index_);
+ AXVirtualView* ax_cell = GetVirtualAccessibilityCellImpl(
+ ax_row, active_visible_column_index_.value());
if (ax_cell) {
ax_cell->NotifyAccessibilityEvent(ax::mojom::Event::kSelection);
GetViewAccessibility().OverrideFocus(ax_cell);
@@ -1816,13 +1839,11 @@ void TableView::UpdateAccessibilityFocus(
}
}
-AXVirtualView* TableView::GetVirtualAccessibilityBodyRow(int row) {
- DCHECK_GE(row, 0);
+AXVirtualView* TableView::GetVirtualAccessibilityBodyRow(size_t row) {
DCHECK_LT(row, GetRowCount());
if (header_)
++row;
- if (static_cast<size_t>(row) <
- GetViewAccessibility().virtual_children().size()) {
+ if (row < GetViewAccessibility().virtual_children().size()) {
const auto& ax_row = GetViewAccessibility().virtual_children()[row];
DCHECK(ax_row);
DCHECK_EQ(ax_row->GetData().role, ax::mojom::Role::kRow);
@@ -1847,23 +1868,23 @@ AXVirtualView* TableView::GetVirtualAccessibilityHeaderRow() {
}
AXVirtualView* TableView::GetVirtualAccessibilityCell(
- int row,
- int visible_column_index) {
+ size_t row,
+ size_t visible_column_index) {
return GetVirtualAccessibilityCellImpl(GetVirtualAccessibilityBodyRow(row),
visible_column_index);
}
AXVirtualView* TableView::GetVirtualAccessibilityCellImpl(
AXVirtualView* ax_row,
- int visible_column_index) {
+ size_t visible_column_index) {
DCHECK(ax_row) << "|row| not found. Did you forget to call "
"RebuildVirtualAccessibilityChildren()?";
const auto matches_index = [visible_column_index](const auto& ax_cell) {
DCHECK(ax_cell);
DCHECK(ax_cell->GetData().role == ax::mojom::Role::kColumnHeader ||
ax_cell->GetData().role == ax::mojom::Role::kCell);
- return ax_cell->GetData().GetIntAttribute(
- ax::mojom::IntAttribute::kTableCellColumnIndex) ==
+ return base::checked_cast<size_t>(ax_cell->GetData().GetIntAttribute(
+ ax::mojom::IntAttribute::kTableCellColumnIndex)) ==
visible_column_index;
};
const auto i = std::find_if(ax_row->children().cbegin(),
@@ -1875,10 +1896,10 @@ AXVirtualView* TableView::GetVirtualAccessibilityCellImpl(
}
BEGIN_METADATA(TableView, View)
-ADD_READONLY_PROPERTY_METADATA(int, RowCount)
-ADD_READONLY_PROPERTY_METADATA(int, FirstSelectedRow)
+ADD_READONLY_PROPERTY_METADATA(size_t, RowCount)
+ADD_READONLY_PROPERTY_METADATA(absl::optional<size_t>, FirstSelectedRow)
ADD_READONLY_PROPERTY_METADATA(bool, HasFocusIndicator)
-ADD_PROPERTY_METADATA(int, ActiveVisibleColumnIndex)
+ADD_PROPERTY_METADATA(absl::optional<size_t>, ActiveVisibleColumnIndex)
ADD_READONLY_PROPERTY_METADATA(bool, IsSorted)
ADD_PROPERTY_METADATA(TableViewObserver*, Observer)
ADD_READONLY_PROPERTY_METADATA(int, RowHeight)
diff --git a/chromium/ui/views/controls/table/table_view.h b/chromium/ui/views/controls/table/table_view.h
index 726353c5e4b..aafba0fd39e 100644
--- a/chromium/ui/views/controls/table/table_view.h
+++ b/chromium/ui/views/controls/table/table_view.h
@@ -151,16 +151,16 @@ class VIEWS_EXPORT TableView : public views::View,
void SetGrouper(TableGrouper* grouper);
// Returns the number of rows in the TableView.
- int GetRowCount() const;
+ size_t GetRowCount() const;
// Selects the specified item, making sure it's visible.
- void Select(int model_row);
+ void Select(absl::optional<size_t> model_row);
// Selects all items.
void SetSelectionAll(bool select);
// Returns the first selected row in terms of the model.
- int GetFirstSelectedRow() const;
+ absl::optional<size_t> GetFirstSelectedRow() const;
const ui::ListSelectionModel& selection_model() const {
return selection_model_;
@@ -187,18 +187,18 @@ class VIEWS_EXPORT TableView : public views::View,
void SetObserver(TableViewObserver* observer);
TableViewObserver* GetObserver() const;
- int GetActiveVisibleColumnIndex() const;
+ absl::optional<size_t> GetActiveVisibleColumnIndex() const;
- void SetActiveVisibleColumnIndex(int index);
+ void SetActiveVisibleColumnIndex(absl::optional<size_t> index);
const std::vector<VisibleColumn>& visible_columns() const {
return visible_columns_;
}
- const VisibleColumn& GetVisibleColumn(int index);
+ const VisibleColumn& GetVisibleColumn(size_t index);
// Sets the width of the column. |index| is in terms of |visible_columns_|.
- void SetVisibleColumnWidth(int index, int width);
+ void SetVisibleColumnWidth(size_t index, int width);
// Modify the table sort order, depending on a clicked column and the previous
// table sort order. Does nothing if this column is not sortable.
@@ -207,17 +207,17 @@ class VIEWS_EXPORT TableView : public views::View,
// cycle through three states in order: sorted -> reverse-sorted -> unsorted.
// When switching from one sort column to another, the previous sort column
// will be remembered and used as a secondary sort key.
- void ToggleSortOrder(int visible_column_index);
+ void ToggleSortOrder(size_t visible_column_index);
const SortDescriptors& sort_descriptors() const { return sort_descriptors_; }
void SetSortDescriptors(const SortDescriptors& descriptors);
bool GetIsSorted() const { return !sort_descriptors_.empty(); }
// Maps from the index in terms of the model to that of the view.
- int ModelToView(int model_index) const;
+ size_t ModelToView(size_t model_index) const;
// Maps from the index in terms of the view to that of the model.
- int ViewToModel(int view_index) const;
+ size_t ViewToModel(size_t view_index) const;
int GetRowHeight() const { return row_height_; }
@@ -247,7 +247,8 @@ class VIEWS_EXPORT TableView : public views::View,
// Returns the virtual accessibility view corresponding to the specified cell.
// |row| should be a view index, not a model index.
// |visible_column_index| indexes into |visible_columns_|.
- AXVirtualView* GetVirtualAccessibilityCell(int row, int visible_column_index);
+ AXVirtualView* GetVirtualAccessibilityCell(size_t row,
+ size_t visible_column_index);
bool header_row_is_active() const { return header_row_is_active_; }
@@ -265,10 +266,10 @@ class VIEWS_EXPORT TableView : public views::View,
// ui::TableModelObserver overrides:
void OnModelChanged() override;
- void OnItemsChanged(int start, int length) override;
- void OnItemsAdded(int start, int length) override;
- void OnItemsRemoved(int start, int length) override;
- void OnItemsMoved(int old_start, int length, int new_start) override;
+ void OnItemsChanged(size_t start, size_t length) override;
+ void OnItemsAdded(size_t start, size_t length) override;
+ void OnItemsRemoved(size_t start, size_t length) override;
+ void OnItemsMoved(size_t old_start, size_t length, size_t new_start) override;
protected:
// View overrides:
@@ -292,10 +293,10 @@ class VIEWS_EXPORT TableView : public views::View,
PaintRegion();
~PaintRegion();
- int min_row = 0;
- int max_row = 0;
- int min_column = 0;
- int max_column = 0;
+ size_t min_row = 0;
+ size_t max_row = 0;
+ size_t min_column = 0;
+ size_t max_column = 0;
};
void OnPaintImpl(gfx::Canvas* canvas);
@@ -317,14 +318,14 @@ class VIEWS_EXPORT TableView : public views::View,
// Used to sort the two rows. Returns a value < 0, == 0 or > 0 indicating
// whether the row2 comes before row1, row2 is the same as row1 or row1 comes
// after row2. This invokes CompareValues on the model with the sorted column.
- int CompareRows(int model_row1, int model_row2);
+ int CompareRows(size_t model_row1, size_t model_row2);
// Returns the bounds of the specified row.
- gfx::Rect GetRowBounds(int row) const;
+ gfx::Rect GetRowBounds(size_t row) const;
// Returns the bounds of the specified cell. |visible_column_index| indexes
// into |visible_columns_|.
- gfx::Rect GetCellBounds(int row, int visible_column_index) const;
+ gfx::Rect GetCellBounds(size_t row, size_t visible_column_index) const;
// Returns the bounds of the active cell.
gfx::Rect GetActiveCellBounds() const;
@@ -332,7 +333,7 @@ class VIEWS_EXPORT TableView : public views::View,
// Adjusts |bounds| based on where the text should be painted. |bounds| comes
// from GetCellBounds() and |visible_column_index| is the corresponding column
// (in terms of |visible_columns_|).
- void AdjustCellBoundsForText(int visible_column_index,
+ void AdjustCellBoundsForText(size_t visible_column_index,
gfx::Rect* bounds) const;
// Creates |header_| if necessary.
@@ -360,7 +361,7 @@ class VIEWS_EXPORT TableView : public views::View,
void AdvanceActiveVisibleColumn(AdvanceDirection direction);
// Sets the selection to the specified index (in terms of the view).
- void SelectByViewIndex(int view_index);
+ void SelectByViewIndex(absl::optional<size_t> view_index);
// Sets the selection model to |new_selection|.
void SetSelectionModel(ui::ListSelectionModel new_selection);
@@ -375,14 +376,14 @@ class VIEWS_EXPORT TableView : public views::View,
// Set the selection state of row at |view_index| to |select|, additionally
// any other rows in the GroupRange containing |view_index| are updated as
// well. This does not change the anchor or active index of |model|.
- void SelectRowsInRangeFrom(int view_index,
+ void SelectRowsInRangeFrom(size_t view_index,
bool select,
ui::ListSelectionModel* model) const;
// Returns the range of the specified model index. If a TableGrouper has not
// been set this returns a group with a start of |model_index| and length of
// 1.
- GroupRange GetGroupRange(int model_index) const;
+ GroupRange GetGroupRange(size_t model_index) const;
// Updates a set of accessibility views that expose the visible table contents
// to assistive software.
@@ -399,11 +400,11 @@ class VIEWS_EXPORT TableView : public views::View,
// cell's.
gfx::Rect CalculateHeaderRowAccessibilityBounds() const;
gfx::Rect CalculateHeaderCellAccessibilityBounds(
- const int visible_column_index) const;
- gfx::Rect CalculateTableRowAccessibilityBounds(const int row_index) const;
+ const size_t visible_column_index) const;
+ gfx::Rect CalculateTableRowAccessibilityBounds(const size_t row_index) const;
gfx::Rect CalculateTableCellAccessibilityBounds(
- const int row_index,
- const int visible_column_index) const;
+ const size_t row_index,
+ const size_t visible_column_index) const;
// Schedule a future call UpdateAccessibilityFocus if not already pending.
void ScheduleUpdateAccessibilityFocusIfNeeded();
@@ -431,7 +432,7 @@ class VIEWS_EXPORT TableView : public views::View,
// Returns the virtual accessibility view corresponding to the specified row.
// |row| should be a view index into the TableView's body elements, not a
// model index.
- AXVirtualView* GetVirtualAccessibilityBodyRow(int row);
+ AXVirtualView* GetVirtualAccessibilityBodyRow(size_t row);
// Returns the virtual accessibility view corresponding to the header row, if
// it exists.
@@ -442,17 +443,17 @@ class VIEWS_EXPORT TableView : public views::View,
// `ax_row` should be the virtual view of either a header or body row.
// `visible_column_index` indexes into `visible_columns_`.
AXVirtualView* GetVirtualAccessibilityCellImpl(AXVirtualView* ax_row,
- int visible_column_index);
+ size_t visible_column_index);
// Creates a virtual accessibility view that is used to expose information
// about the row at |view_index| to assistive software.
- std::unique_ptr<AXVirtualView> CreateRowAccessibilityView(int view_index);
+ std::unique_ptr<AXVirtualView> CreateRowAccessibilityView(size_t view_index);
// Creates a virtual accessibility view that is used to expose information
// about the cell at the provided coordinates |row_index| and |column_index|
// to assistive software.
std::unique_ptr<AXVirtualView> CreateCellAccessibilityView(
- int row_index,
+ size_t row_index,
size_t column_index);
// Creates a virtual accessibility view that is used to expose information
@@ -487,8 +488,8 @@ class VIEWS_EXPORT TableView : public views::View,
std::vector<VisibleColumn> visible_columns_;
// The active visible column. Used for keyboard access to functionality such
- // as sorting and resizing. -1 if no visible column is active.
- int active_visible_column_index_ = -1;
+ // as sorting and resizing. nullopt if no visible column is active.
+ absl::optional<size_t> active_visible_column_index_ = absl::nullopt;
// The header. This is only created if more than one column is specified or
// the first column has a non-empty title.
@@ -532,8 +533,8 @@ class VIEWS_EXPORT TableView : public views::View,
SortDescriptors sort_descriptors_;
// Mappings used when sorted.
- std::vector<int> view_to_model_;
- std::vector<int> model_to_view_;
+ std::vector<size_t> view_to_model_;
+ std::vector<size_t> model_to_view_;
raw_ptr<TableGrouper> grouper_ = nullptr;
@@ -549,7 +550,7 @@ class VIEWS_EXPORT TableView : public views::View,
};
BEGIN_VIEW_BUILDER(VIEWS_EXPORT, TableView, View)
-VIEW_BUILDER_PROPERTY(int, ActiveVisibleColumnIndex)
+VIEW_BUILDER_PROPERTY(absl::optional<size_t>, ActiveVisibleColumnIndex)
VIEW_BUILDER_PROPERTY(const std::vector<ui::TableColumn>&,
Columns,
std::vector<ui::TableColumn>)
diff --git a/chromium/ui/views/controls/table/table_view_unittest.cc b/chromium/ui/views/controls/table/table_view_unittest.cc
index 348de27e81c..a2ddafb5f08 100644
--- a/chromium/ui/views/controls/table/table_view_unittest.cc
+++ b/chromium/ui/views/controls/table/table_view_unittest.cc
@@ -30,6 +30,7 @@
#include "ui/views/style/platform_style.h"
#include "ui/views/test/focus_manager_test.h"
#include "ui/views/test/views_test_base.h"
+#include "ui/views/widget/unique_widget_ptr.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_delegate.h"
#include "ui/views/widget/widget_utils.h"
@@ -55,7 +56,7 @@ class TableViewTestHelper {
size_t visible_col_count() { return table_->visible_columns().size(); }
- int GetActiveVisibleColumnIndex() {
+ absl::optional<size_t> GetActiveVisibleColumnIndex() {
return table_->GetActiveVisibleColumnIndex();
}
@@ -67,7 +68,7 @@ class TableViewTestHelper {
const gfx::FontList& font_list() { return table_->font_list_; }
- AXVirtualView* GetVirtualAccessibilityBodyRow(int row) {
+ AXVirtualView* GetVirtualAccessibilityBodyRow(size_t row) {
return table_->GetVirtualAccessibilityBodyRow(row);
}
@@ -75,17 +76,18 @@ class TableViewTestHelper {
return table_->GetVirtualAccessibilityHeaderRow();
}
- AXVirtualView* GetVirtualAccessibilityHeaderCell(int visible_column_index) {
+ AXVirtualView* GetVirtualAccessibilityHeaderCell(
+ size_t visible_column_index) {
return table_->GetVirtualAccessibilityCellImpl(
GetVirtualAccessibilityHeaderRow(), visible_column_index);
}
- AXVirtualView* GetVirtualAccessibilityCell(int row,
- int visible_column_index) {
+ AXVirtualView* GetVirtualAccessibilityCell(size_t row,
+ size_t visible_column_index) {
return table_->GetVirtualAccessibilityCell(row, visible_column_index);
}
- gfx::Rect GetCellBounds(int row, int visible_column_index) const {
+ gfx::Rect GetCellBounds(size_t row, size_t visible_column_index) const {
return table_->GetCellBounds(row, visible_column_index);
}
@@ -116,7 +118,7 @@ class TableViewTestHelper {
expected_bounds.push_back(header_row);
// Generate the bounds for the table rows and cells.
- for (int row_index = 0; row_index < table_->GetRowCount(); row_index++) {
+ for (size_t row_index = 0; row_index < table_->GetRowCount(); row_index++) {
auto table_row = std::vector<gfx::Rect>();
gfx::Rect table_row_bounds =
table_->CalculateTableRowAccessibilityBounds(row_index);
@@ -137,7 +139,9 @@ class TableViewTestHelper {
}
private:
- raw_ptr<TableView> table_;
+ // TODO(crbug.com/1298696): views_unittests breaks with MTECheckedPtr
+ // enabled. Triage.
+ raw_ptr<TableView, DegradeToNoOpWhenMTE> table_;
};
namespace {
@@ -167,34 +171,34 @@ class TestTableModel2 : public ui::TableModel {
TestTableModel2& operator=(const TestTableModel2&) = delete;
// Adds a new row at index |row| with values |c1_value| and |c2_value|.
- void AddRow(int row, int c1_value, int c2_value);
+ void AddRow(size_t row, int c1_value, int c2_value);
// Adds new rows starting from |row| to |row| + |length| with the value
// of |row| times the |value_multiplier|. The |value_multiplier| can be used
// to distinguish these rows from the rest.
- void AddRows(int row, int length, int value_multiplier);
+ void AddRows(size_t row, size_t length, int value_multiplier);
// Removes the row at index |row|.
- void RemoveRow(int row);
+ void RemoveRow(size_t row);
// Removes all the rows starting from |row| to |row| + |length|.
- void RemoveRows(int row, int length);
+ void RemoveRows(size_t row, size_t length);
// Changes the values of the row at |row|.
- void ChangeRow(int row, int c1_value, int c2_value);
+ void ChangeRow(size_t row, int c1_value, int c2_value);
// Reorders rows in the model.
- void MoveRows(int row_from, int length, int row_to);
+ void MoveRows(size_t row_from, size_t length, size_t row_to);
// Allows overriding the tooltip for testing.
void SetTooltip(const std::u16string& tooltip);
// ui::TableModel:
- int RowCount() override;
- std::u16string GetText(int row, int column_id) override;
- std::u16string GetTooltip(int row) override;
+ size_t RowCount() override;
+ std::u16string GetText(size_t row, int column_id) override;
+ std::u16string GetTooltip(size_t row) override;
void SetObserver(ui::TableModelObserver* observer) override;
- int CompareValues(int row1, int row2, int column_id) override;
+ int CompareValues(size_t row1, size_t row2, int column_id) override;
private:
raw_ptr<ui::TableModelObserver> observer_ = nullptr;
@@ -212,8 +216,8 @@ TestTableModel2::TestTableModel2() {
AddRow(3, 3, 0);
}
-void TestTableModel2::AddRow(int row, int c1_value, int c2_value) {
- DCHECK(row >= 0 && row <= static_cast<int>(rows_.size()));
+void TestTableModel2::AddRow(size_t row, int c1_value, int c2_value) {
+ DCHECK(row <= rows_.size());
std::vector<int> new_row;
new_row.push_back(c1_value);
new_row.push_back(c2_value);
@@ -222,14 +226,13 @@ void TestTableModel2::AddRow(int row, int c1_value, int c2_value) {
observer_->OnItemsAdded(row, 1);
}
-void TestTableModel2::AddRows(int row, int length, int value_multiplier) {
- DCHECK(row >= 0 && length >= 0);
+void TestTableModel2::AddRows(size_t row, size_t length, int value_multiplier) {
// Do not DCHECK here since we are testing the OnItemsAdded callback.
- if (row >= 0 && row <= static_cast<int>(rows_.size())) {
- for (int i = row; i < row + length; i++) {
+ if (row <= rows_.size()) {
+ for (size_t i = row; i < row + length; i++) {
std::vector<int> new_row;
- new_row.push_back(i + value_multiplier);
- new_row.push_back(i + value_multiplier);
+ new_row.push_back(static_cast<int>(i) + value_multiplier);
+ new_row.push_back(static_cast<int>(i) + value_multiplier);
rows_.insert(rows_.begin() + i, new_row);
}
}
@@ -238,39 +241,36 @@ void TestTableModel2::AddRows(int row, int length, int value_multiplier) {
observer_->OnItemsAdded(row, length);
}
-void TestTableModel2::RemoveRow(int row) {
- DCHECK(row >= 0 && row < static_cast<int>(rows_.size()));
+void TestTableModel2::RemoveRow(size_t row) {
+ DCHECK(row < rows_.size());
rows_.erase(rows_.begin() + row);
if (observer_)
observer_->OnItemsRemoved(row, 1);
}
-void TestTableModel2::RemoveRows(int row, int length) {
- DCHECK(row >= 0 && length >= 0);
- if (row >= 0 && row <= static_cast<int>(rows_.size())) {
- rows_.erase(rows_.begin() + row,
- rows_.begin() + base::clamp(row + length, 0,
- static_cast<int>(rows_.size())));
+void TestTableModel2::RemoveRows(size_t row, size_t length) {
+ if (row <= rows_.size()) {
+ rows_.erase(
+ rows_.begin() + row,
+ rows_.begin() + base::clamp(row + length, size_t{0}, rows_.size()));
}
if (observer_ && length > 0)
observer_->OnItemsRemoved(row, length);
}
-void TestTableModel2::ChangeRow(int row, int c1_value, int c2_value) {
- DCHECK(row >= 0 && row < static_cast<int>(rows_.size()));
+void TestTableModel2::ChangeRow(size_t row, int c1_value, int c2_value) {
+ DCHECK(row < rows_.size());
rows_[row][0] = c1_value;
rows_[row][1] = c2_value;
if (observer_)
observer_->OnItemsChanged(row, 1);
}
-void TestTableModel2::MoveRows(int row_from, int length, int row_to) {
- DCHECK_GT(length, 0);
- DCHECK_GE(row_from, 0);
- DCHECK_LE(row_from + length, static_cast<int>(rows_.size()));
- DCHECK_GE(row_to, 0);
- DCHECK_LE(row_to + length, static_cast<int>(rows_.size()));
+void TestTableModel2::MoveRows(size_t row_from, size_t length, size_t row_to) {
+ DCHECK_GT(length, 0u);
+ DCHECK_LE(row_from + length, rows_.size());
+ DCHECK_LE(row_to + length, rows_.size());
auto old_start = rows_.begin() + row_from;
std::vector<std::vector<int>> temp(old_start, old_start + length);
@@ -284,15 +284,15 @@ void TestTableModel2::SetTooltip(const std::u16string& tooltip) {
tooltip_ = tooltip;
}
-int TestTableModel2::RowCount() {
- return static_cast<int>(rows_.size());
+size_t TestTableModel2::RowCount() {
+ return rows_.size();
}
-std::u16string TestTableModel2::GetText(int row, int column_id) {
+std::u16string TestTableModel2::GetText(size_t row, int column_id) {
return base::NumberToString16(rows_[row][column_id]);
}
-std::u16string TestTableModel2::GetTooltip(int row) {
+std::u16string TestTableModel2::GetTooltip(size_t row) {
return tooltip_ ? *tooltip_ : u"Tooltip" + base::NumberToString16(row);
}
@@ -300,14 +300,14 @@ void TestTableModel2::SetObserver(ui::TableModelObserver* observer) {
observer_ = observer;
}
-int TestTableModel2::CompareValues(int row1, int row2, int column_id) {
+int TestTableModel2::CompareValues(size_t row1, size_t row2, int column_id) {
return rows_[row1][column_id] - rows_[row2][column_id];
}
// Returns the view to model mapping as a string.
std::string GetViewToModelAsString(TableView* table) {
std::string result;
- for (int i = 0; i < table->GetRowCount(); ++i) {
+ for (size_t i = 0; i < table->GetRowCount(); ++i) {
if (i != 0)
result += " ";
result += base::NumberToString(table->ViewToModel(i));
@@ -318,7 +318,7 @@ std::string GetViewToModelAsString(TableView* table) {
// Returns the model to view mapping as a string.
std::string GetModelToViewAsString(TableView* table) {
std::string result;
- for (int i = 0; i < table->GetRowCount(); ++i) {
+ for (size_t i = 0; i < table->GetRowCount(); ++i) {
if (i != 0)
result += " ";
result += base::NumberToString(table->ModelToView(i));
@@ -330,7 +330,7 @@ std::string GetModelToViewAsString(TableView* table) {
// scrolled out of view are included; hidden columns are excluded.
std::string GetRowsInViewOrderAsString(TableView* table) {
std::string result;
- for (int i = 0; i < table->GetRowCount(); ++i) {
+ for (size_t i = 0; i < table->GetRowCount(); ++i) {
if (i != 0)
result += ", "; // Comma between each row.
@@ -454,17 +454,16 @@ class TableViewTest : public ViewsTestBase,
table_ = table.get();
auto scroll_view = TableView::CreateScrollViewWithTable(std::move(table));
scroll_view->SetBounds(0, 0, 10000, 10000);
- scroll_view->Layout();
helper_ = std::make_unique<TableViewTestHelper>(table_);
widget_ = std::make_unique<Widget>();
Widget::InitParams params =
CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(0, 0, 650, 650);
params.delegate = GetWidgetDelegate(widget_.get());
widget_->Init(std::move(params));
- widget_->GetRootView()->AddChildView(std::move(scroll_view));
+ RunScheduledLayout(
+ widget_->GetRootView()->AddChildView(std::move(scroll_view)));
widget_->Show();
}
@@ -485,25 +484,8 @@ class TableViewTest : public ViewsTestBase,
generator.GestureTapAt(GetPointForRow(row));
}
- // Returns the state of the selection model as a string. The format is:
- // 'active=X anchor=X selection=X X X...'.
std::string SelectionStateAsString() const {
- const ui::ListSelectionModel& model(table_->selection_model());
- std::string result = "active=" + base::NumberToString(model.active()) +
- " anchor=" + base::NumberToString(model.anchor()) +
- " selection=";
- const ui::ListSelectionModel::SelectedIndices& selection(
- model.selected_indices());
- bool first = true;
- for (int index : selection) {
- if (first) {
- first = false;
- } else {
- result += " ";
- }
- result += base::NumberToString(index);
- }
- return result;
+ return table_->selection_model().ToString();
}
void PressKey(ui::KeyboardCode code) { PressKey(code, ui::EF_NONE); }
@@ -608,11 +590,14 @@ class TableViewTest : public ViewsTestBase,
std::unique_ptr<TestTableModel2> model_;
// Owned by |parent_|.
- raw_ptr<TableView> table_ = nullptr;
+ //
+ // TODO(crbug.com/1298696): views_unittests breaks with MTECheckedPtr
+ // enabled. Triage.
+ raw_ptr<TableView, DegradeToNoOpWhenMTE> table_ = nullptr;
std::unique_ptr<TableViewTestHelper> helper_;
- std::unique_ptr<Widget> widget_;
+ UniqueWidgetPtr widget_;
private:
gfx::Point GetPointForRow(int row) {
@@ -641,7 +626,7 @@ TEST_P(TableViewTest, RebuildVirtualAccessibilityChildren) {
EXPECT_TRUE(data.HasState(ax::mojom::State::kFocusable));
EXPECT_EQ(ax::mojom::Restriction::kReadOnly, data.GetRestriction());
EXPECT_EQ(table_->GetRowCount(),
- static_cast<int>(
+ static_cast<size_t>(
data.GetIntAttribute(ax::mojom::IntAttribute::kTableRowCount)));
EXPECT_EQ(helper_->visible_col_count(),
static_cast<size_t>(data.GetIntAttribute(
@@ -664,15 +649,15 @@ TEST_P(TableViewTest, RebuildVirtualAccessibilityChildren) {
ax::mojom::IntAttribute::kTableCellColumnIndex));
}
- int i = 0;
+ size_t i = 0;
for (auto child_iter = view_accessibility.virtual_children().begin() + 1;
i < table_->GetRowCount(); ++child_iter, ++i) {
const auto& row = *child_iter;
ASSERT_TRUE(row);
const ui::AXNodeData& row_data = row->GetData();
EXPECT_EQ(ax::mojom::Role::kRow, row_data.role);
- EXPECT_EQ(
- i, row_data.GetIntAttribute(ax::mojom::IntAttribute::kTableRowIndex));
+ EXPECT_EQ(i, static_cast<size_t>(row_data.GetIntAttribute(
+ ax::mojom::IntAttribute::kTableRowIndex)));
ASSERT_FALSE(row_data.HasState(ax::mojom::State::kInvisible));
ASSERT_EQ(helper_->visible_col_count(), row->children().size());
@@ -681,8 +666,8 @@ TEST_P(TableViewTest, RebuildVirtualAccessibilityChildren) {
ASSERT_TRUE(cell);
const ui::AXNodeData& cell_data = cell->GetData();
EXPECT_EQ(ax::mojom::Role::kCell, cell_data.role);
- EXPECT_EQ(i, cell_data.GetIntAttribute(
- ax::mojom::IntAttribute::kTableCellRowIndex));
+ EXPECT_EQ(i, static_cast<size_t>(cell_data.GetIntAttribute(
+ ax::mojom::IntAttribute::kTableCellRowIndex)));
EXPECT_EQ(j++, cell_data.GetIntAttribute(
ax::mojom::IntAttribute::kTableCellColumnIndex));
ASSERT_FALSE(cell_data.HasState(ax::mojom::State::kInvisible));
@@ -723,26 +708,26 @@ TEST_P(TableViewTest, UpdateVirtualAccessibilityChildrenBoundsHideColumn) {
}
TEST_P(TableViewTest, GetVirtualAccessibilityBodyRow) {
- for (int i = 0; i < table_->GetRowCount(); ++i) {
+ for (size_t i = 0; i < table_->GetRowCount(); ++i) {
const AXVirtualView* row = helper_->GetVirtualAccessibilityBodyRow(i);
ASSERT_TRUE(row);
const ui::AXNodeData& row_data = row->GetData();
EXPECT_EQ(ax::mojom::Role::kRow, row_data.role);
- EXPECT_EQ(i, static_cast<int>(row_data.GetIntAttribute(
+ EXPECT_EQ(i, static_cast<size_t>(row_data.GetIntAttribute(
ax::mojom::IntAttribute::kTableRowIndex)));
}
}
TEST_P(TableViewTest, GetVirtualAccessibilityCell) {
- for (int i = 0; i < table_->GetRowCount(); ++i) {
- for (int j = 0; j < static_cast<int>(helper_->visible_col_count()); ++j) {
+ for (size_t i = 0; i < table_->GetRowCount(); ++i) {
+ for (size_t j = 0; j < helper_->visible_col_count(); ++j) {
const AXVirtualView* cell = helper_->GetVirtualAccessibilityCell(i, j);
ASSERT_TRUE(cell);
const ui::AXNodeData& cell_data = cell->GetData();
EXPECT_EQ(ax::mojom::Role::kCell, cell_data.role);
- EXPECT_EQ(i, static_cast<int>(cell_data.GetIntAttribute(
+ EXPECT_EQ(i, static_cast<size_t>(cell_data.GetIntAttribute(
ax::mojom::IntAttribute::kTableCellRowIndex)));
- EXPECT_EQ(j, static_cast<int>(cell_data.GetIntAttribute(
+ EXPECT_EQ(j, static_cast<size_t>(cell_data.GetIntAttribute(
ax::mojom::IntAttribute::kTableCellColumnIndex)));
}
}
@@ -860,12 +845,12 @@ TEST_P(TableViewTest, ResizeViaKeyboard) {
EXPECT_NE(0, x);
// Table starts off with no visible column being active.
- ASSERT_EQ(-1, helper_->GetActiveVisibleColumnIndex());
+ ASSERT_FALSE(helper_->GetActiveVisibleColumnIndex().has_value());
ui::ListSelectionModel new_selection;
new_selection.SetSelectedIndex(1);
helper_->SetSelectionModel(new_selection);
- ASSERT_EQ(0, helper_->GetActiveVisibleColumnIndex());
+ ASSERT_EQ(0u, helper_->GetActiveVisibleColumnIndex());
PressKey(ui::VKEY_LEFT, ui::EF_CONTROL_DOWN);
// This should shrink the first column and pull the second column in.
@@ -1062,12 +1047,12 @@ TEST_P(TableViewTest, SortOnSpaceBar) {
table_->RequestFocus();
ASSERT_TRUE(table_->sort_descriptors().empty());
// Table starts off with no visible column being active.
- ASSERT_EQ(-1, helper_->GetActiveVisibleColumnIndex());
+ ASSERT_FALSE(helper_->GetActiveVisibleColumnIndex().has_value());
ui::ListSelectionModel new_selection;
new_selection.SetSelectedIndex(1);
helper_->SetSelectionModel(new_selection);
- ASSERT_EQ(0, helper_->GetActiveVisibleColumnIndex());
+ ASSERT_EQ(0u, helper_->GetActiveVisibleColumnIndex());
PressKey(ui::VKEY_SPACE);
ASSERT_EQ(1u, table_->sort_descriptors().size());
@@ -1080,7 +1065,7 @@ TEST_P(TableViewTest, SortOnSpaceBar) {
EXPECT_FALSE(table_->sort_descriptors()[0].ascending);
PressKey(ui::VKEY_RIGHT);
- ASSERT_EQ(1, helper_->GetActiveVisibleColumnIndex());
+ ASSERT_EQ(1u, helper_->GetActiveVisibleColumnIndex());
PressKey(ui::VKEY_SPACE);
ASSERT_EQ(2u, table_->sort_descriptors().size());
@@ -1102,15 +1087,15 @@ TEST_P(TableViewTest, ActiveCellBoundsFollowColumnSorting) {
table_->ToggleSortOrder(0);
ClickOnRow(0, 0);
EXPECT_EQ(helper_->GetCellBounds(0, 0), helper_->GetActiveCellBounds());
- EXPECT_EQ(0, table_->ViewToModel(0));
+ EXPECT_EQ(0u, table_->ViewToModel(0));
ClickOnRow(1, 0);
EXPECT_EQ(helper_->GetCellBounds(1, 0), helper_->GetActiveCellBounds());
- EXPECT_EQ(1, table_->ViewToModel(1));
+ EXPECT_EQ(1u, table_->ViewToModel(1));
ClickOnRow(2, 0);
EXPECT_EQ(helper_->GetCellBounds(2, 0), helper_->GetActiveCellBounds());
- EXPECT_EQ(2, table_->ViewToModel(2));
+ EXPECT_EQ(2u, table_->ViewToModel(2));
// Toggle the sort order of the second column. The active row will stay in
// sync with the view index, meanwhile the model's change which shows that
@@ -1118,15 +1103,15 @@ TEST_P(TableViewTest, ActiveCellBoundsFollowColumnSorting) {
table_->ToggleSortOrder(1);
ClickOnRow(0, 0);
EXPECT_EQ(helper_->GetCellBounds(0, 0), helper_->GetActiveCellBounds());
- EXPECT_EQ(3, table_->ViewToModel(0));
+ EXPECT_EQ(3u, table_->ViewToModel(0));
ClickOnRow(1, 0);
EXPECT_EQ(helper_->GetCellBounds(1, 0), helper_->GetActiveCellBounds());
- EXPECT_EQ(0, table_->ViewToModel(1));
+ EXPECT_EQ(0u, table_->ViewToModel(1));
ClickOnRow(2, 0);
EXPECT_EQ(helper_->GetCellBounds(2, 0), helper_->GetActiveCellBounds());
- EXPECT_EQ(1, table_->ViewToModel(2));
+ EXPECT_EQ(1u, table_->ViewToModel(2));
// Verifying invalid active indexes return an empty rect.
new_selection.Clear();
@@ -1161,11 +1146,11 @@ class TableGrouperImpl : public TableGrouper {
TableGrouperImpl(const TableGrouperImpl&) = delete;
TableGrouperImpl& operator=(const TableGrouperImpl&) = delete;
- void SetRanges(const std::vector<int>& ranges) { ranges_ = ranges; }
+ void SetRanges(const std::vector<size_t>& ranges) { ranges_ = ranges; }
// TableGrouper overrides:
- void GetGroupRange(int model_index, GroupRange* range) override {
- int offset = 0;
+ void GetGroupRange(size_t model_index, GroupRange* range) override {
+ size_t offset = 0;
size_t range_index = 0;
for (; range_index < ranges_.size() && offset < model_index; ++range_index)
offset += ranges_[range_index];
@@ -1180,7 +1165,7 @@ class TableGrouperImpl : public TableGrouper {
}
private:
- std::vector<int> ranges_;
+ std::vector<size_t> ranges_;
};
} // namespace
@@ -1193,10 +1178,7 @@ TEST_P(TableViewTest, Grouping) {
// B 2
// 3
TableGrouperImpl grouper;
- std::vector<int> ranges;
- ranges.push_back(2);
- ranges.push_back(2);
- grouper.SetRanges(ranges);
+ grouper.SetRanges({2, 2});
table_->SetGrouper(&grouper);
// Toggle the sort order of the first column, shouldn't change anything.
@@ -1289,7 +1271,7 @@ TEST_P(TableViewTest, Selection) {
table_->set_observer(&observer);
// Initially no selection.
- EXPECT_EQ("active=-1 anchor=-1 selection=", SelectionStateAsString());
+ EXPECT_EQ("active=<none> anchor=<none> selection=", SelectionStateAsString());
// Select the last row.
table_->Select(3);
@@ -1385,11 +1367,12 @@ TEST_P(TableViewTest, SelectAll) {
table_->set_observer(&observer);
// Initially no selection.
- EXPECT_EQ("active=-1 anchor=-1 selection=", SelectionStateAsString());
+ EXPECT_EQ("active=<none> anchor=<none> selection=", SelectionStateAsString());
table_->SetSelectionAll(/*select=*/true);
EXPECT_EQ(1, observer.GetChangedCountAndClear());
- EXPECT_EQ("active=-1 anchor=-1 selection=0 1 2 3", SelectionStateAsString());
+ EXPECT_EQ("active=<none> anchor=<none> selection=0 1 2 3",
+ SelectionStateAsString());
table_->Select(2);
EXPECT_EQ(1, observer.GetChangedCountAndClear());
@@ -1452,7 +1435,7 @@ TEST_P(TableViewTest, SelectionNoSelectOnRemove) {
table_->SetSelectOnRemove(false);
// Initially no selection.
- EXPECT_EQ("active=-1 anchor=-1 selection=", SelectionStateAsString());
+ EXPECT_EQ("active=<none> anchor=<none> selection=", SelectionStateAsString());
// Select row 3.
table_->Select(3);
@@ -1464,7 +1447,7 @@ TEST_P(TableViewTest, SelectionNoSelectOnRemove) {
// selected item, so no item is selected.
model_->RemoveRow(3);
EXPECT_EQ(1, observer.GetChangedCountAndClear());
- EXPECT_EQ("active=-1 anchor=-1 selection=", SelectionStateAsString());
+ EXPECT_EQ("active=<none> anchor=<none> selection=", SelectionStateAsString());
// Select row 1.
table_->Select(1);
@@ -1474,7 +1457,7 @@ TEST_P(TableViewTest, SelectionNoSelectOnRemove) {
// Remove the selected row.
model_->RemoveRow(1);
EXPECT_EQ(1, observer.GetChangedCountAndClear());
- EXPECT_EQ("active=-1 anchor=-1 selection=", SelectionStateAsString());
+ EXPECT_EQ("active=<none> anchor=<none> selection=", SelectionStateAsString());
// Select row 0.
table_->Select(0);
@@ -1484,7 +1467,7 @@ TEST_P(TableViewTest, SelectionNoSelectOnRemove) {
// Remove the selected row.
model_->RemoveRow(0);
EXPECT_EQ(1, observer.GetChangedCountAndClear());
- EXPECT_EQ("active=-1 anchor=-1 selection=", SelectionStateAsString());
+ EXPECT_EQ("active=<none> anchor=<none> selection=", SelectionStateAsString());
table_->set_observer(nullptr);
}
@@ -1494,7 +1477,7 @@ TEST_P(TableViewTest, SelectionNoSelectOnRemove) {
// Verifies selection works by way of a gesture.
TEST_P(TableViewTest, SelectOnTap) {
// Initially no selection.
- EXPECT_EQ("active=-1 anchor=-1 selection=", SelectionStateAsString());
+ EXPECT_EQ("active=<none> anchor=<none> selection=", SelectionStateAsString());
TableViewObserverImpl observer;
table_->set_observer(&observer);
@@ -1520,11 +1503,7 @@ TEST_P(TableViewTest, KeyUpDown) {
// 3
model_->AddRow(2, 5, 0);
TableGrouperImpl grouper;
- std::vector<int> ranges;
- ranges.push_back(2);
- ranges.push_back(1);
- ranges.push_back(2);
- grouper.SetRanges(ranges);
+ grouper.SetRanges({2, 1, 2});
table_->SetGrouper(&grouper);
TableViewObserverImpl observer;
@@ -1532,7 +1511,7 @@ TEST_P(TableViewTest, KeyUpDown) {
table_->RequestFocus();
// Initially no selection.
- EXPECT_EQ("active=-1 anchor=-1 selection=", SelectionStateAsString());
+ EXPECT_EQ("active=<none> anchor=<none> selection=", SelectionStateAsString());
PressKey(ui::VKEY_DOWN);
EXPECT_EQ(1, observer.GetChangedCountAndClear());
@@ -1579,7 +1558,7 @@ TEST_P(TableViewTest, KeyUpDown) {
PressKey(ui::VKEY_UP);
EXPECT_TRUE(table_->header_row_is_active());
EXPECT_EQ(1, observer.GetChangedCountAndClear());
- EXPECT_EQ("active=-1 anchor=-1 selection=", SelectionStateAsString());
+ EXPECT_EQ("active=<none> anchor=<none> selection=", SelectionStateAsString());
PressKey(ui::VKEY_DOWN);
EXPECT_EQ(1, observer.GetChangedCountAndClear());
@@ -1596,8 +1575,8 @@ TEST_P(TableViewTest, KeyUpDown) {
EXPECT_EQ("2 3 4 0 1", GetViewToModelAsString(table_));
- table_->Select(-1);
- EXPECT_EQ("active=-1 anchor=-1 selection=", SelectionStateAsString());
+ table_->Select(absl::nullopt);
+ EXPECT_EQ("active=<none> anchor=<none> selection=", SelectionStateAsString());
observer.GetChangedCountAndClear();
@@ -1606,7 +1585,7 @@ TEST_P(TableViewTest, KeyUpDown) {
PressKey(ui::VKEY_UP);
EXPECT_TRUE(table_->header_row_is_active());
EXPECT_EQ(0, observer.GetChangedCountAndClear());
- EXPECT_EQ("active=-1 anchor=-1 selection=", SelectionStateAsString());
+ EXPECT_EQ("active=<none> anchor=<none> selection=", SelectionStateAsString());
PressKey(ui::VKEY_DOWN);
EXPECT_EQ(1, observer.GetChangedCountAndClear());
@@ -1653,7 +1632,7 @@ TEST_P(TableViewTest, KeyUpDown) {
PressKey(ui::VKEY_UP);
EXPECT_TRUE(table_->header_row_is_active());
EXPECT_EQ(1, observer.GetChangedCountAndClear());
- EXPECT_EQ("active=-1 anchor=-1 selection=", SelectionStateAsString());
+ EXPECT_EQ("active=<none> anchor=<none> selection=", SelectionStateAsString());
table_->set_observer(nullptr);
}
@@ -1668,89 +1647,89 @@ TEST_P(TableViewTest, KeyLeftRight) {
table_->RequestFocus();
// Initially no active visible column.
- EXPECT_EQ(-1, helper_->GetActiveVisibleColumnIndex());
+ EXPECT_FALSE(helper_->GetActiveVisibleColumnIndex().has_value());
PressKey(ui::VKEY_RIGHT);
- EXPECT_EQ(0, helper_->GetActiveVisibleColumnIndex());
+ EXPECT_EQ(0u, helper_->GetActiveVisibleColumnIndex());
EXPECT_EQ(1, observer.GetChangedCountAndClear());
EXPECT_EQ("active=0 anchor=0 selection=0", SelectionStateAsString());
helper_->SetSelectionModel(ui::ListSelectionModel());
- EXPECT_EQ(-1, helper_->GetActiveVisibleColumnIndex());
+ EXPECT_FALSE(helper_->GetActiveVisibleColumnIndex().has_value());
EXPECT_EQ(1, observer.GetChangedCountAndClear());
PressKey(ui::VKEY_LEFT);
- EXPECT_EQ(0, helper_->GetActiveVisibleColumnIndex());
+ EXPECT_EQ(0u, helper_->GetActiveVisibleColumnIndex());
EXPECT_EQ(1, observer.GetChangedCountAndClear());
EXPECT_EQ("active=0 anchor=0 selection=0", SelectionStateAsString());
PressKey(ui::VKEY_RIGHT);
- EXPECT_EQ(1, helper_->GetActiveVisibleColumnIndex());
+ EXPECT_EQ(1u, helper_->GetActiveVisibleColumnIndex());
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=0 anchor=0 selection=0", SelectionStateAsString());
PressKey(ui::VKEY_RIGHT);
- EXPECT_EQ(1, helper_->GetActiveVisibleColumnIndex());
+ EXPECT_EQ(1u, helper_->GetActiveVisibleColumnIndex());
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=0 anchor=0 selection=0", SelectionStateAsString());
ui::ListSelectionModel new_selection;
new_selection.SetSelectedIndex(1);
helper_->SetSelectionModel(new_selection);
- EXPECT_EQ(1, helper_->GetActiveVisibleColumnIndex());
+ EXPECT_EQ(1u, helper_->GetActiveVisibleColumnIndex());
EXPECT_EQ(1, observer.GetChangedCountAndClear());
EXPECT_EQ("active=1 anchor=1 selection=1", SelectionStateAsString());
PressKey(ui::VKEY_LEFT);
- EXPECT_EQ(0, helper_->GetActiveVisibleColumnIndex());
+ EXPECT_EQ(0u, helper_->GetActiveVisibleColumnIndex());
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=1 anchor=1 selection=1", SelectionStateAsString());
PressKey(ui::VKEY_LEFT);
- EXPECT_EQ(0, helper_->GetActiveVisibleColumnIndex());
+ EXPECT_EQ(0u, helper_->GetActiveVisibleColumnIndex());
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=1 anchor=1 selection=1", SelectionStateAsString());
table_->SetColumnVisibility(0, false);
- EXPECT_EQ(0, helper_->GetActiveVisibleColumnIndex());
+ EXPECT_EQ(0u, helper_->GetActiveVisibleColumnIndex());
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=1 anchor=1 selection=1", SelectionStateAsString());
// Since the first column was hidden, the active visible column should not
// advance.
PressKey(ui::VKEY_RIGHT);
- EXPECT_EQ(0, helper_->GetActiveVisibleColumnIndex());
+ EXPECT_EQ(0u, helper_->GetActiveVisibleColumnIndex());
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=1 anchor=1 selection=1", SelectionStateAsString());
// If visibility to the first column is restored, the active visible column
// should be unchanged because columns are always added to the end.
table_->SetColumnVisibility(0, true);
- EXPECT_EQ(0, helper_->GetActiveVisibleColumnIndex());
+ EXPECT_EQ(0u, helper_->GetActiveVisibleColumnIndex());
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=1 anchor=1 selection=1", SelectionStateAsString());
PressKey(ui::VKEY_RIGHT);
- EXPECT_EQ(1, helper_->GetActiveVisibleColumnIndex());
+ EXPECT_EQ(1u, helper_->GetActiveVisibleColumnIndex());
// If visibility to the first column is removed, the active visible column
// should be decreased by one.
table_->SetColumnVisibility(0, false);
- EXPECT_EQ(0, helper_->GetActiveVisibleColumnIndex());
+ EXPECT_EQ(0u, helper_->GetActiveVisibleColumnIndex());
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=1 anchor=1 selection=1", SelectionStateAsString());
PressKey(ui::VKEY_LEFT);
- EXPECT_EQ(0, helper_->GetActiveVisibleColumnIndex());
+ EXPECT_EQ(0u, helper_->GetActiveVisibleColumnIndex());
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=1 anchor=1 selection=1", SelectionStateAsString());
table_->SetColumnVisibility(0, true);
- EXPECT_EQ(0, helper_->GetActiveVisibleColumnIndex());
+ EXPECT_EQ(0u, helper_->GetActiveVisibleColumnIndex());
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=1 anchor=1 selection=1", SelectionStateAsString());
PressKey(ui::VKEY_RIGHT);
- EXPECT_EQ(1, helper_->GetActiveVisibleColumnIndex());
+ EXPECT_EQ(1u, helper_->GetActiveVisibleColumnIndex());
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=1 anchor=1 selection=1", SelectionStateAsString());
@@ -1767,8 +1746,7 @@ TEST_P(TableViewTest, HomeEnd) {
// 3
model_->AddRow(2, 5, 0);
TableGrouperImpl grouper;
- std::vector<int> ranges{2, 1, 2};
- grouper.SetRanges(ranges);
+ grouper.SetRanges({2, 1, 2});
table_->SetGrouper(&grouper);
TableViewObserverImpl observer;
@@ -1776,7 +1754,7 @@ TEST_P(TableViewTest, HomeEnd) {
table_->RequestFocus();
// Initially no selection.
- EXPECT_EQ("active=-1 anchor=-1 selection=", SelectionStateAsString());
+ EXPECT_EQ("active=<none> anchor=<none> selection=", SelectionStateAsString());
PressKey(ui::VKEY_HOME);
EXPECT_EQ(1, observer.GetChangedCountAndClear());
@@ -1803,15 +1781,11 @@ TEST_P(TableViewTest, Multiselection) {
// 3
model_->AddRow(2, 5, 0);
TableGrouperImpl grouper;
- std::vector<int> ranges;
- ranges.push_back(2);
- ranges.push_back(1);
- ranges.push_back(2);
- grouper.SetRanges(ranges);
+ grouper.SetRanges({2, 1, 2});
table_->SetGrouper(&grouper);
// Initially no selection.
- EXPECT_EQ("active=-1 anchor=-1 selection=", SelectionStateAsString());
+ EXPECT_EQ("active=<none> anchor=<none> selection=", SelectionStateAsString());
TableViewObserverImpl observer;
table_->set_observer(&observer);
@@ -1859,11 +1833,7 @@ TEST_P(TableViewTest, MultiselectionWithSort) {
// 3
model_->AddRow(2, 5, 0);
TableGrouperImpl grouper;
- std::vector<int> ranges;
- ranges.push_back(2);
- ranges.push_back(1);
- ranges.push_back(2);
- grouper.SetRanges(ranges);
+ grouper.SetRanges({2, 1, 2});
table_->SetGrouper(&grouper);
// Sort the table descending by column 1, view now looks like:
@@ -1876,7 +1846,7 @@ TEST_P(TableViewTest, MultiselectionWithSort) {
table_->ToggleSortOrder(0);
// Initially no selection.
- EXPECT_EQ("active=-1 anchor=-1 selection=", SelectionStateAsString());
+ EXPECT_EQ("active=<none> anchor=<none> selection=", SelectionStateAsString());
TableViewObserverImpl observer;
table_->set_observer(&observer);
@@ -2103,19 +2073,19 @@ TEST_P(TableViewTest, TableHeaderColumnAccessibleViewsFocusable) {
// columns.
PressKey(ui::VKEY_RIGHT);
RunPendingMessages();
- ASSERT_EQ(0, helper_->GetActiveVisibleColumnIndex());
+ ASSERT_EQ(0u, helper_->GetActiveVisibleColumnIndex());
EXPECT_EQ(helper_->GetVirtualAccessibilityHeaderCell(0),
view_accessibility.FocusedVirtualChild());
PressKey(ui::VKEY_RIGHT);
RunPendingMessages();
- ASSERT_EQ(1, helper_->GetActiveVisibleColumnIndex());
+ ASSERT_EQ(1u, helper_->GetActiveVisibleColumnIndex());
EXPECT_EQ(helper_->GetVirtualAccessibilityHeaderCell(1),
view_accessibility.FocusedVirtualChild());
PressKey(ui::VKEY_LEFT);
RunPendingMessages();
- ASSERT_EQ(0, helper_->GetActiveVisibleColumnIndex());
+ ASSERT_EQ(0u, helper_->GetActiveVisibleColumnIndex());
EXPECT_EQ(helper_->GetVirtualAccessibilityHeaderCell(0),
view_accessibility.FocusedVirtualChild());
}
@@ -2213,7 +2183,6 @@ class TableViewDefaultConstructabilityTest : public ViewsTestBase {
ViewsTestBase::SetUp();
widget_ = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(0, 0, 650, 650);
widget_->Init(std::move(params));
widget_->Show();
@@ -2227,14 +2196,13 @@ class TableViewDefaultConstructabilityTest : public ViewsTestBase {
Widget* widget() { return widget_.get(); }
private:
- std::unique_ptr<Widget> widget_;
+ UniqueWidgetPtr widget_;
};
TEST_F(TableViewDefaultConstructabilityTest, TestFunctionalWithoutModel) {
auto scroll_view =
TableView::CreateScrollViewWithTable(std::make_unique<TableView>());
scroll_view->SetBounds(0, 0, 10000, 10000);
- scroll_view->Layout();
- widget()->GetContentsView()->AddChildView(std::move(scroll_view));
+ widget()->client_view()->AddChildView(std::move(scroll_view));
}
} // namespace views
diff --git a/chromium/ui/views/controls/table/test_table_model.cc b/chromium/ui/views/controls/table/test_table_model.cc
index 99642e30e0a..d9b9e186c9b 100644
--- a/chromium/ui/views/controls/table/test_table_model.cc
+++ b/chromium/ui/views/controls/table/test_table_model.cc
@@ -11,21 +11,21 @@
#include "ui/base/models/table_model_observer.h"
#include "ui/gfx/image/image_skia.h"
-TestTableModel::TestTableModel(int row_count)
+TestTableModel::TestTableModel(size_t row_count)
: row_count_(row_count), observer_(nullptr) {}
TestTableModel::~TestTableModel() = default;
-int TestTableModel::RowCount() {
+size_t TestTableModel::RowCount() {
return row_count_;
}
-std::u16string TestTableModel::GetText(int row, int column_id) {
+std::u16string TestTableModel::GetText(size_t row, int column_id) {
return base::ASCIIToUTF16(base::NumberToString(row) + "x" +
base::NumberToString(column_id));
}
-ui::ImageModel TestTableModel::GetIcon(int row) {
+ui::ImageModel TestTableModel::GetIcon(size_t row) {
SkBitmap bitmap;
bitmap.setInfo(SkImageInfo::MakeN32Premul(16, 16));
return ui::ImageModel::FromImageSkia(
diff --git a/chromium/ui/views/controls/table/test_table_model.h b/chromium/ui/views/controls/table/test_table_model.h
index 614489801ef..a3883aa3f79 100644
--- a/chromium/ui/views/controls/table/test_table_model.h
+++ b/chromium/ui/views/controls/table/test_table_model.h
@@ -10,7 +10,7 @@
class TestTableModel : public ui::TableModel {
public:
- explicit TestTableModel(int row_count);
+ explicit TestTableModel(size_t row_count);
TestTableModel(const TestTableModel&) = delete;
TestTableModel& operator=(const TestTableModel&) = delete;
@@ -18,13 +18,13 @@ class TestTableModel : public ui::TableModel {
~TestTableModel() override;
// ui::TableModel overrides:
- int RowCount() override;
- std::u16string GetText(int row, int column_id) override;
- ui::ImageModel GetIcon(int row) override;
+ size_t RowCount() override;
+ std::u16string GetText(size_t row, int column_id) override;
+ ui::ImageModel GetIcon(size_t row) override;
void SetObserver(ui::TableModelObserver* observer) override;
private:
- int row_count_;
+ size_t row_count_;
raw_ptr<ui::TableModelObserver> observer_;
};
diff --git a/chromium/ui/views/controls/textfield/textfield.cc b/chromium/ui/views/controls/textfield/textfield.cc
index 4699148d8f8..a0a5dd7f469 100644
--- a/chromium/ui/views/controls/textfield/textfield.cc
+++ b/chromium/ui/views/controls/textfield/textfield.cc
@@ -70,11 +70,9 @@
#include "base/win/win_util.h"
#endif
-// TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
-// of lacros-chrome is complete.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_LINUX)
#include "ui/base/ime/linux/text_edit_command_auralinux.h"
-#include "ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h"
+#include "ui/linux/linux_ui.h"
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -270,15 +268,6 @@ Textfield::~Textfield() {
void Textfield::SetAssociatedLabel(View* labelling_view) {
DCHECK(labelling_view);
GetViewAccessibility().OverrideLabelledBy(labelling_view);
- ui::AXNodeData node_data;
- labelling_view->GetAccessibleNodeData(&node_data);
- // Labelled-by relations are not common practice in native UI, so we also
- // set the accessible name for ATs which don't support that.
- // TODO(aleventhal) automatically handle setting the name from the related
- // label in ViewAccessibility and have it update the name if the text of the
- // associated label changes.
- SetAccessibleName(
- node_data.GetString16Attribute(ax::mojom::StringAttribute::kName));
}
void Textfield::SetController(TextfieldController* controller) {
@@ -717,13 +706,11 @@ bool Textfield::OnKeyPressed(const ui::KeyEvent& event) {
if (!textfield)
return handled;
-// TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
-// of lacros-chrome is complete.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
- ui::TextEditKeyBindingsDelegateAuraLinux* delegate =
- ui::GetTextEditKeyBindingsDelegate();
+#if BUILDFLAG(IS_LINUX)
+ auto* linux_ui = ui::LinuxUi::instance();
std::vector<ui::TextEditCommandAuraLinux> commands;
- if (!handled && delegate && delegate->MatchEvent(event, &commands)) {
+ if (!handled && linux_ui &&
+ linux_ui->GetTextEditCommandsForEvent(event, &commands)) {
for (const auto& command : commands) {
if (IsTextEditCommandEnabled(command.command())) {
ExecuteTextEditCommand(command.command());
@@ -863,14 +850,11 @@ void Textfield::AboutToRequestFocusFromTabTraversal(bool reverse) {
}
bool Textfield::SkipDefaultKeyEventProcessing(const ui::KeyEvent& event) {
-// TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
-// of lacros-chrome is complete.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_LINUX)
// Skip any accelerator handling that conflicts with custom keybindings.
- ui::TextEditKeyBindingsDelegateAuraLinux* delegate =
- ui::GetTextEditKeyBindingsDelegate();
+ auto* linux_ui = ui::LinuxUi::instance();
std::vector<ui::TextEditCommandAuraLinux> commands;
- if (delegate && delegate->MatchEvent(event, &commands)) {
+ if (linux_ui && linux_ui->GetTextEditCommandsForEvent(event, &commands)) {
const auto is_enabled = [this](const auto& command) {
return IsTextEditCommandEnabled(command.command());
};
@@ -987,14 +971,16 @@ void Textfield::GetAccessibleNodeData(ui::AXNodeData* node_data) {
const gfx::Range range = GetSelectedRange();
node_data->AddIntAttribute(ax::mojom::IntAttribute::kTextSelStart,
- range.start());
- node_data->AddIntAttribute(ax::mojom::IntAttribute::kTextSelEnd, range.end());
+ base::checked_cast<int32_t>(range.start()));
+ node_data->AddIntAttribute(ax::mojom::IntAttribute::kTextSelEnd,
+ base::checked_cast<int32_t>(range.end()));
}
bool Textfield::HandleAccessibleAction(const ui::AXActionData& action_data) {
if (action_data.action == ax::mojom::Action::kSetSelection) {
DCHECK_EQ(action_data.anchor_node_id, action_data.focus_node_id);
- const gfx::Range range(action_data.anchor_offset, action_data.focus_offset);
+ const gfx::Range range(static_cast<size_t>(action_data.anchor_offset),
+ static_cast<size_t>(action_data.focus_offset));
return SetEditableSelectionRange(range);
}
@@ -1358,7 +1344,7 @@ void Textfield::SetCompositionText(const ui::CompositionText& composition) {
OnAfterUserAction();
}
-uint32_t Textfield::ConfirmCompositionText(bool keep_selection) {
+size_t Textfield::ConfirmCompositionText(bool keep_selection) {
// TODO(b/134473433) Modify this function so that when keep_selection is
// true, the selection is not changed when text committed
if (keep_selection) {
@@ -1368,7 +1354,7 @@ uint32_t Textfield::ConfirmCompositionText(bool keep_selection) {
return 0;
OnBeforeUserAction();
skip_input_method_cancel_composition_ = true;
- const uint32_t confirmed_text_length = model_->ConfirmCompositionText();
+ const size_t confirmed_text_length = model_->ConfirmCompositionText();
skip_input_method_cancel_composition_ = false;
UpdateAfterChange(TextChangeType::kUserTriggered, true);
OnAfterUserAction();
@@ -1426,7 +1412,7 @@ void Textfield::InsertChar(const ui::KeyEvent& event) {
DoInsertChar(ch);
if (text_input_type_ == ui::TEXT_INPUT_TYPE_PASSWORD) {
- password_char_reveal_index_ = -1;
+ password_char_reveal_index_ = absl::nullopt;
base::TimeDelta duration = GetPasswordRevealDuration(event);
if (!duration.is_zero()) {
const size_t change_offset = model_->GetCursorPosition();
@@ -1473,7 +1459,7 @@ gfx::Rect Textfield::GetSelectionBoundingBox() const {
return gfx::Rect();
}
-bool Textfield::GetCompositionCharacterBounds(uint32_t index,
+bool Textfield::GetCompositionCharacterBounds(size_t index,
gfx::Rect* rect) const {
DCHECK(rect);
if (!HasCompositionText())
@@ -1593,7 +1579,14 @@ bool Textfield::ChangeTextDirectionAndLayoutAlignment(
void Textfield::ExtendSelectionAndDelete(size_t before, size_t after) {
gfx::Range range = GetRenderText()->selection();
- DCHECK_GE(range.start(), before);
+ // Discard out-of-bound operations.
+ // TODO(crbug.com/1344096): this is a temporary fix to prevent the
+ // checked_cast failure in gfx::Range. There does not seem to be any
+ // observable bad behaviors before checked_cast was added. However, range
+ // clipping or dropping should be the last resort because a checkfail
+ // indicates that we run into bad states somewhere earlier on the stack.
+ if (range.start() < before)
+ return;
range.set_start(range.start() - before);
range.set_end(range.end() + after);
@@ -2060,7 +2053,7 @@ Textfield::EditCommandResult Textfield::DoExecuteTextEditCommand(
return {changed, cursor_changed};
}
-void Textfield::OffsetDoubleClickWord(int offset) {
+void Textfield::OffsetDoubleClickWord(size_t offset) {
selection_controller_.OffsetDoubleClickWord(offset);
}
@@ -2562,17 +2555,18 @@ bool Textfield::ImeEditingAllowed() const {
return (t != ui::TEXT_INPUT_TYPE_NONE && t != ui::TEXT_INPUT_TYPE_PASSWORD);
}
-void Textfield::RevealPasswordChar(int index, base::TimeDelta duration) {
+void Textfield::RevealPasswordChar(absl::optional<size_t> index,
+ base::TimeDelta duration) {
GetRenderText()->SetObscuredRevealIndex(index);
SchedulePaint();
password_char_reveal_index_ = index;
UpdateCursorViewPosition();
- if (index != -1) {
- password_reveal_timer_.Start(
- FROM_HERE, duration,
- base::BindOnce(&Textfield::RevealPasswordChar,
- weak_ptr_factory_.GetWeakPtr(), -1, duration));
+ if (index.has_value()) {
+ password_reveal_timer_.Start(FROM_HERE, duration,
+ base::BindOnce(&Textfield::RevealPasswordChar,
+ weak_ptr_factory_.GetWeakPtr(),
+ absl::nullopt, duration));
}
}
diff --git a/chromium/ui/views/controls/textfield/textfield.h b/chromium/ui/views/controls/textfield/textfield.h
index ea29dbdf334..9768a28f0e9 100644
--- a/chromium/ui/views/controls/textfield/textfield.h
+++ b/chromium/ui/views/controls/textfield/textfield.h
@@ -313,7 +313,9 @@ class VIEWS_EXPORT Textfield : public View,
// Set extra spacing placed between glyphs; used for obscured text styling.
void SetObscuredGlyphSpacing(int spacing);
- int GetPasswordCharRevealIndex() const { return password_char_reveal_index_; }
+ absl::optional<size_t> GetPasswordCharRevealIndex() const {
+ return password_char_reveal_index_;
+ }
void SetExtraInsets(const gfx::Insets& insets);
@@ -407,7 +409,7 @@ class VIEWS_EXPORT Textfield : public View,
// ui::TextInputClient overrides:
void SetCompositionText(const ui::CompositionText& composition) override;
- uint32_t ConfirmCompositionText(bool keep_selection) override;
+ size_t ConfirmCompositionText(bool keep_selection) override;
void ClearCompositionText() override;
void InsertText(const std::u16string& text,
InsertTextCursorBehavior cursor_behavior) override;
@@ -419,7 +421,7 @@ class VIEWS_EXPORT Textfield : public View,
bool CanComposeInline() const override;
gfx::Rect GetCaretBounds() const override;
gfx::Rect GetSelectionBoundingBox() const override;
- bool GetCompositionCharacterBounds(uint32_t index,
+ bool GetCompositionCharacterBounds(size_t index,
gfx::Rect* rect) const override;
bool HasCompositionText() const override;
FocusReason GetFocusReason() const override;
@@ -427,7 +429,11 @@ class VIEWS_EXPORT Textfield : public View,
bool GetCompositionTextRange(gfx::Range* range) const override;
bool GetEditableSelectionRange(gfx::Range* range) const override;
bool SetEditableSelectionRange(const gfx::Range& range) override;
+#if BUILDFLAG(IS_MAC)
bool DeleteRange(const gfx::Range& range) override;
+#else
+ bool DeleteRange(const gfx::Range& range);
+#endif
bool GetTextFromRange(const gfx::Range& range,
std::u16string* text) const override;
void OnInputMethodChanged() override;
@@ -492,7 +498,7 @@ class VIEWS_EXPORT Textfield : public View,
// Offsets the double-clicked word's range. This is only used in the unusual
// case where the text changes on the second mousedown of a double-click.
// This is harmless if there is not a currently double-clicked word.
- void OffsetDoubleClickWord(int offset);
+ void OffsetDoubleClickWord(size_t offset);
// Returns true if the drop cursor is for insertion at a target text location,
// the standard behavior/style. Returns false when drop will do something
@@ -615,9 +621,10 @@ class VIEWS_EXPORT Textfield : public View,
bool ImeEditingAllowed() const;
// Reveals the password character at |index| for a set duration.
- // If |index| is -1, the existing revealed character will be reset.
+ // If |index| is nullopt, the existing revealed character will be reset.
// |duration| is the time to remain the password char to be visible.
- void RevealPasswordChar(int index, base::TimeDelta duration);
+ void RevealPasswordChar(absl::optional<size_t> index,
+ base::TimeDelta duration);
void CreateTouchSelectionControllerAndNotifyIt();
@@ -772,7 +779,7 @@ class VIEWS_EXPORT Textfield : public View,
ui::TextInputClient::FOCUS_REASON_NONE;
// The password char reveal index, for testing only.
- int password_char_reveal_index_ = -1;
+ absl::optional<size_t> password_char_reveal_index_;
// Extra insets, useful to make room for a button for example.
gfx::Insets extra_insets_ = gfx::Insets();
diff --git a/chromium/ui/views/controls/textfield/textfield_model.cc b/chromium/ui/views/controls/textfield/textfield_model.cc
index b3202c3e087..8c67d53d205 100644
--- a/chromium/ui/views/controls/textfield/textfield_model.cc
+++ b/chromium/ui/views/controls/textfield/textfield_model.cc
@@ -364,8 +364,8 @@ void SelectRangeInCompositionText(gfx::RenderText* render_text,
const gfx::Range& range) {
DCHECK(render_text);
DCHECK(range.IsValid());
- uint32_t start = range.GetMin();
- uint32_t end = range.GetMax();
+ size_t start = range.GetMin();
+ size_t end = range.GetMax();
#if BUILDFLAG(IS_CHROMEOS_ASH)
// Swap |start| and |end| so that GetCaretBounds() can always return the same
// value during conversion.
@@ -783,11 +783,11 @@ void TextfieldModel::SetCompositionFromExistingText(const gfx::Range& range) {
render_text_->SetCompositionRange(range);
}
-uint32_t TextfieldModel::ConfirmCompositionText() {
+size_t TextfieldModel::ConfirmCompositionText() {
DCHECK(HasCompositionText());
std::u16string composition =
text().substr(composition_range_.start(), composition_range_.length());
- uint32_t composition_length = composition_range_.length();
+ size_t composition_length = composition_range_.length();
// TODO(oshima): current behavior on ChromeOS is a bit weird and not
// sure exactly how this should work. Find out and fix if necessary.
AddOrMergeEditHistory(std::make_unique<internal::InsertEdit>(
diff --git a/chromium/ui/views/controls/textfield/textfield_model.h b/chromium/ui/views/controls/textfield/textfield_model.h
index 01452147fbb..614cb0b121c 100644
--- a/chromium/ui/views/controls/textfield/textfield_model.h
+++ b/chromium/ui/views/controls/textfield/textfield_model.h
@@ -257,7 +257,7 @@ class VIEWS_EXPORT TextfieldModel {
// Converts current composition text into final content and returns the
// length of the text committed.
- uint32_t ConfirmCompositionText();
+ size_t ConfirmCompositionText();
// Removes current composition text.
void CancelCompositionText();
diff --git a/chromium/ui/views/controls/textfield/textfield_model_unittest.cc b/chromium/ui/views/controls/textfield/textfield_model_unittest.cc
index b87b93f5146..809201cd843 100644
--- a/chromium/ui/views/controls/textfield/textfield_model_unittest.cc
+++ b/chromium/ui/views/controls/textfield/textfield_model_unittest.cc
@@ -1947,8 +1947,8 @@ TEST_F(TextfieldModelTest, UndoRedo_CompositionText) {
EXPECT_EQ(u"ABCDEabc", model.text());
// Confirm the composition.
- uint32_t composition_text_length = model.ConfirmCompositionText();
- EXPECT_EQ(composition_text_length, static_cast<uint32_t>(3));
+ size_t composition_text_length = model.ConfirmCompositionText();
+ EXPECT_EQ(composition_text_length, 3u);
EXPECT_EQ(u"ABCDEabc", model.text());
EXPECT_TRUE(model.Undo());
EXPECT_EQ(u"ABCDE", model.text());
diff --git a/chromium/ui/views/controls/textfield/textfield_unittest.cc b/chromium/ui/views/controls/textfield/textfield_unittest.cc
index 81d16dcdfd8..3f77efc92df 100644
--- a/chromium/ui/views/controls/textfield/textfield_unittest.cc
+++ b/chromium/ui/views/controls/textfield/textfield_unittest.cc
@@ -28,9 +28,9 @@
#include "ui/base/dragdrop/mojom/drag_drop_types.mojom.h"
#include "ui/base/emoji/emoji_panel_helper.h"
#include "ui/base/ime/constants.h"
+#include "ui/base/ime/ime_key_event_dispatcher.h"
#include "ui/base/ime/init/input_method_factory.h"
#include "ui/base/ime/input_method_base.h"
-#include "ui/base/ime/input_method_delegate.h"
#include "ui/base/ime/text_edit_commands.h"
#include "ui/base/ime/text_input_client.h"
#include "ui/base/l10n/l10n_util.h"
@@ -62,10 +62,9 @@
#include "base/win/windows_version.h"
#endif
-// TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
-// of lacros-chrome is complete.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h"
+#if BUILDFLAG(IS_LINUX)
+#include "ui/linux/fake_linux_ui.h"
+#include "ui/linux/linux_ui.h"
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -88,14 +87,10 @@ namespace test {
const char16_t kHebrewLetterSamekh = 0x05E1;
// Convenience to make constructing a GestureEvent simpler.
-class GestureEventForTest : public ui::GestureEvent {
- public:
- GestureEventForTest(int x, int y, ui::GestureEventDetails details)
- : GestureEvent(x, y, ui::EF_NONE, base::TimeTicks(), details) {}
-
- GestureEventForTest(const GestureEventForTest&) = delete;
- GestureEventForTest& operator=(const GestureEventForTest&) = delete;
-};
+ui::GestureEvent
+CreateTestGestureEvent(int x, int y, const ui::GestureEventDetails& details) {
+ return ui::GestureEvent(x, y, ui::EF_NONE, base::TimeTicks(), details);
+}
// This controller will happily destroy the target field passed on
// construction when a key event is triggered.
@@ -167,6 +162,16 @@ class MockInputMethod : public ui::InputMethodBase {
count_show_virtual_keyboard_++;
}
+#if BUILDFLAG(IS_WIN)
+ bool OnUntranslatedIMEMessage(
+ const CHROME_MSG event,
+ InputMethod::NativeEventResult* result) override {
+ return false;
+ }
+ void OnInputLocaleChanged() override {}
+ bool IsInputLocaleCJK() const override { return false; }
+#endif
+
bool untranslated_ime_message_called() const {
return untranslated_ime_message_called_;
}
@@ -473,8 +478,8 @@ void TextfieldTest::PrepareTextfieldsInternal(int count,
Textfield* textfield,
View* container,
gfx::Rect bounds) {
- input_method_->SetDelegate(
- test::WidgetTest::GetInputMethodDelegateForWidget(widget_.get()));
+ input_method_->SetImeKeyEventDispatcher(
+ test::WidgetTest::GetImeKeyEventDispatcherForWidget(widget_.get()));
textfield->set_controller(this);
textfield->SetBoundsRect(bounds);
@@ -806,12 +811,14 @@ void TextfieldTest::MoveMouseTo(const gfx::Point& where) {
void TextfieldTest::TapAtCursor(ui::EventPointerType pointer_type) {
ui::GestureEventDetails tap_down_details(ui::ET_GESTURE_TAP_DOWN);
tap_down_details.set_primary_pointer_type(pointer_type);
- GestureEventForTest tap_down(GetCursorPositionX(0), 0, tap_down_details);
+ ui::GestureEvent tap_down =
+ CreateTestGestureEvent(GetCursorPositionX(0), 0, tap_down_details);
textfield_->OnGestureEvent(&tap_down);
ui::GestureEventDetails tap_up_details(ui::ET_GESTURE_TAP);
tap_up_details.set_primary_pointer_type(pointer_type);
- GestureEventForTest tap_up(GetCursorPositionX(0), 0, tap_up_details);
+ ui::GestureEvent tap_up =
+ CreateTestGestureEvent(GetCursorPositionX(0), 0, tap_up_details);
textfield_->OnGestureEvent(&tap_up);
}
@@ -1473,15 +1480,15 @@ TEST_F(TextfieldTest, TextInputType_InsertionTest) {
EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, textfield_->GetTextInputType());
SendKeyEvent(ui::VKEY_A);
- EXPECT_EQ(-1, textfield_->GetPasswordCharRevealIndex());
+ EXPECT_FALSE(textfield_->GetPasswordCharRevealIndex().has_value());
SendKeyEvent(kHebrewLetterSamekh, ui::EF_NONE, true /* from_vk */);
#if !BUILDFLAG(IS_MAC)
// Don't verifies the password character reveal on MacOS, because on MacOS,
// the text insertion is not done through TextInputClient::InsertChar().
- EXPECT_EQ(1, textfield_->GetPasswordCharRevealIndex());
+ EXPECT_EQ(1u, textfield_->GetPasswordCharRevealIndex());
#endif
SendKeyEvent(ui::VKEY_B);
- EXPECT_EQ(-1, textfield_->GetPasswordCharRevealIndex());
+ EXPECT_FALSE(textfield_->GetPasswordCharRevealIndex().has_value());
EXPECT_EQ(
u"a\x05E1"
@@ -1579,11 +1586,9 @@ TEST_F(TextfieldTest, OnKeyPress) {
TEST_F(TextfieldTest, OnKeyPressBinding) {
InitTextfield();
-// TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
-// of lacros-chrome is complete.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_LINUX)
// Install a TextEditKeyBindingsDelegateAuraLinux that does nothing.
- class TestDelegate : public ui::TextEditKeyBindingsDelegateAuraLinux {
+ class TestDelegate : public ui::FakeLinuxUi {
public:
TestDelegate() = default;
@@ -1592,15 +1597,14 @@ TEST_F(TextfieldTest, OnKeyPressBinding) {
~TestDelegate() override = default;
- bool MatchEvent(
+ bool GetTextEditCommandsForEvent(
const ui::Event& event,
std::vector<ui::TextEditCommandAuraLinux>* commands) override {
return false;
}
};
- TestDelegate delegate;
- ui::SetTextEditKeyBindingsDelegate(&delegate);
+ ui::LinuxUi::SetInstance(std::make_unique<TestDelegate>());
#endif
SendKeyEvent(ui::VKEY_A, false, false);
@@ -1620,10 +1624,8 @@ TEST_F(TextfieldTest, OnKeyPressBinding) {
EXPECT_EQ(u"a", textfield_->GetText());
textfield_->clear();
-// TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
-// of lacros-chrome is complete.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
- ui::SetTextEditKeyBindingsDelegate(nullptr);
+#if BUILDFLAG(IS_LINUX)
+ ui::LinuxUi::SetInstance(nullptr);
#endif
}
@@ -2321,8 +2323,10 @@ TEST_F(TextfieldTest, TextInputClientTest) {
EXPECT_TRUE(client->GetTextFromRange(range, &substring));
EXPECT_EQ(u"123", substring);
+#if BUILDFLAG(IS_MAC)
EXPECT_TRUE(client->DeleteRange(range));
EXPECT_EQ(u"0456789", textfield_->GetText());
+#endif
ui::CompositionText composition;
composition.text = u"321";
@@ -3062,10 +3066,10 @@ TEST_F(TextfieldTest, CommitComposingTextTest) {
ui::CompositionText composition;
composition.text = u"abc123";
textfield_->SetCompositionText(composition);
- uint32_t composed_text_length =
+ size_t composed_text_length =
textfield_->ConfirmCompositionText(/* keep_selection */ false);
- EXPECT_EQ(composed_text_length, static_cast<uint32_t>(6));
+ EXPECT_EQ(composed_text_length, 6u);
}
TEST_F(TextfieldTest, CommitEmptyComposingTextTest) {
@@ -3073,10 +3077,10 @@ TEST_F(TextfieldTest, CommitEmptyComposingTextTest) {
ui::CompositionText composition;
composition.text = u"";
textfield_->SetCompositionText(composition);
- uint32_t composed_text_length =
+ size_t composed_text_length =
textfield_->ConfirmCompositionText(/* keep_selection */ false);
- EXPECT_EQ(composed_text_length, static_cast<uint32_t>(0));
+ EXPECT_EQ(composed_text_length, 0u);
}
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
@@ -3206,8 +3210,7 @@ TEST_F(TextfieldTest, GetAutocorrectCharacterBoundsTest) {
gfx::Rect rect_for_long_text = textfield_->GetAutocorrectCharacterBounds();
- // Clear the text
- textfield_->DeleteRange(gfx::Range(0, 99));
+ textfield_->clear();
textfield_->InsertText(
u"hello placeholder text",
@@ -3457,7 +3460,7 @@ TEST_F(TextfieldTest, TestLongPressInitiatesDragDrop) {
switches::kEnableTouchDragDrop);
// Create a long press event in the selected region should start a drag.
- GestureEventForTest long_press(
+ ui::GestureEvent long_press = CreateTestGestureEvent(
kStringPoint.x(), kStringPoint.y(),
ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS));
textfield_->OnGestureEvent(&long_press);
@@ -3541,7 +3544,7 @@ TEST_F(TextfieldTest, VirtualKeyboardFocusEnsureCaretNotInRect) {
EXPECT_EQ(widget_->GetNativeView()->bounds(), orig_widget_bounds);
// Simulate virtual keyboard.
- input_method_->SetOnScreenKeyboardBounds(keyboard_view_bounds);
+ input_method_->SetVirtualKeyboardBounds(keyboard_view_bounds);
// Window should be shifted.
EXPECT_EQ(widget_->GetNativeView()->bounds(), shifted_widget_bounds);
@@ -3560,26 +3563,27 @@ class TextfieldTouchSelectionTest : public TextfieldTest {
protected:
// Simulates a complete tap.
void Tap(const gfx::Point& point) {
- GestureEventForTest begin(point.x(), point.y(),
- ui::GestureEventDetails(ui::ET_GESTURE_BEGIN));
+ ui::GestureEvent begin = CreateTestGestureEvent(
+ point.x(), point.y(), ui::GestureEventDetails(ui::ET_GESTURE_BEGIN));
textfield_->OnGestureEvent(&begin);
- GestureEventForTest tap_down(
+ ui::GestureEvent tap_down = CreateTestGestureEvent(
point.x(), point.y(), ui::GestureEventDetails(ui::ET_GESTURE_TAP_DOWN));
textfield_->OnGestureEvent(&tap_down);
- GestureEventForTest show_press(
+ ui::GestureEvent show_press = CreateTestGestureEvent(
point.x(), point.y(),
ui::GestureEventDetails(ui::ET_GESTURE_SHOW_PRESS));
textfield_->OnGestureEvent(&show_press);
ui::GestureEventDetails tap_details(ui::ET_GESTURE_TAP);
tap_details.set_tap_count(1);
- GestureEventForTest tap(point.x(), point.y(), tap_details);
+ ui::GestureEvent tap =
+ CreateTestGestureEvent(point.x(), point.y(), tap_details);
textfield_->OnGestureEvent(&tap);
- GestureEventForTest end(point.x(), point.y(),
- ui::GestureEventDetails(ui::ET_GESTURE_END));
+ ui::GestureEvent end = CreateTestGestureEvent(
+ point.x(), point.y(), ui::GestureEventDetails(ui::ET_GESTURE_END));
textfield_->OnGestureEvent(&end);
}
};
@@ -3595,7 +3599,7 @@ TEST_F(TextfieldTouchSelectionTest, TouchSelectionAndDraggingTest) {
// Tapping on the textfield should turn on the TouchSelectionController.
ui::GestureEventDetails tap_details(ui::ET_GESTURE_TAP);
tap_details.set_tap_count(1);
- GestureEventForTest tap(x, 0, tap_details);
+ ui::GestureEvent tap = CreateTestGestureEvent(x, 0, tap_details);
textfield_->OnGestureEvent(&tap);
EXPECT_TRUE(test_api_->touch_selection_controller());
@@ -3606,7 +3610,7 @@ TEST_F(TextfieldTouchSelectionTest, TouchSelectionAndDraggingTest) {
// With touch editing enabled, long press should not show context menu.
// Instead, select word and invoke TouchSelectionController.
- GestureEventForTest long_press_1(
+ ui::GestureEvent long_press_1 = CreateTestGestureEvent(
x, 0, ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS));
textfield_->OnGestureEvent(&long_press_1);
EXPECT_EQ(u"hello", textfield_->GetSelectedText());
@@ -3616,7 +3620,7 @@ TEST_F(TextfieldTouchSelectionTest, TouchSelectionAndDraggingTest) {
// With touch drag drop enabled, long pressing in the selected region should
// start a drag and remove TouchSelectionController.
ASSERT_TRUE(switches::IsTouchDragDropEnabled());
- GestureEventForTest long_press_2(
+ ui::GestureEvent long_press_2 = CreateTestGestureEvent(
x, 0, ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS));
textfield_->OnGestureEvent(&long_press_2);
EXPECT_EQ(u"hello", textfield_->GetSelectedText());
@@ -3628,7 +3632,7 @@ TEST_F(TextfieldTouchSelectionTest, TouchSelectionAndDraggingTest) {
base::CommandLine::ForCurrentProcess()->AppendSwitch(
switches::kDisableTouchDragDrop);
ASSERT_FALSE(switches::IsTouchDragDropEnabled());
- GestureEventForTest long_press_3(
+ ui::GestureEvent long_press_3 = CreateTestGestureEvent(
x, 0, ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS));
textfield_->OnGestureEvent(&long_press_3);
EXPECT_EQ(u"hello", textfield_->GetSelectedText());
@@ -3878,7 +3882,7 @@ TEST_F(TextfieldTest, EmojiItem_EmptyField) {
// A normal empty field may show the Emoji option (if supported).
ui::MenuModel* context_menu = GetContextMenuModel();
EXPECT_TRUE(context_menu);
- EXPECT_GT(context_menu->GetItemCount(), 0);
+ EXPECT_GT(context_menu->GetItemCount(), 0u);
// Not all OS/versions support the emoji menu.
EXPECT_EQ(ui::IsEmojiPanelSupported(),
context_menu->GetLabelAt(0) ==
@@ -3893,7 +3897,7 @@ TEST_F(TextfieldTest, EmojiItem_ReadonlyField) {
// In no case is the emoji option showing on a read-only field.
ui::MenuModel* context_menu = GetContextMenuModel();
EXPECT_TRUE(context_menu);
- EXPECT_GT(context_menu->GetItemCount(), 0);
+ EXPECT_GT(context_menu->GetItemCount(), 0u);
EXPECT_NE(context_menu->GetLabelAt(0),
l10n_util::GetStringUTF16(IDS_CONTENT_CONTEXT_EMOJI));
}
@@ -3915,7 +3919,7 @@ TEST_F(TextfieldTest, EmojiItem_FieldWithText) {
textfield_->SelectAll(false);
ui::MenuModel* context_menu = GetContextMenuModel();
EXPECT_TRUE(context_menu);
- EXPECT_GT(context_menu->GetItemCount(), 0);
+ EXPECT_GT(context_menu->GetItemCount(), 0u);
// Not all OS/versions support the emoji menu.
EXPECT_EQ(ui::IsEmojiPanelSupported(),
context_menu->GetLabelAt(kExpectedEmojiIndex) ==
@@ -3966,7 +3970,7 @@ TEST_F(TextfieldTest, LookUpPassword) {
ui::MenuModel* context_menu = GetContextMenuModel();
EXPECT_TRUE(context_menu);
- EXPECT_GT(context_menu->GetItemCount(), 0);
+ EXPECT_GT(context_menu->GetItemCount(), 0u);
EXPECT_NE(context_menu->GetCommandIdAt(0), IDS_CONTENT_CONTEXT_LOOK_UP);
EXPECT_NE(context_menu->GetLabelAt(0),
l10n_util::GetStringFUTF16(IDS_CONTENT_CONTEXT_LOOK_UP, kText));
diff --git a/chromium/ui/views/controls/tree/tree_view.cc b/chromium/ui/views/controls/tree/tree_view.cc
index 27011fc5fdd..e9bbeed02f4 100644
--- a/chromium/ui/views/controls/tree/tree_view.cc
+++ b/chromium/ui/views/controls/tree/tree_view.cc
@@ -204,6 +204,10 @@ void TreeView::StartEditing(TreeModelNode* node) {
editor_->set_controller(this);
}
editor_->SetText(selected_node_->model_node()->GetTitle());
+ // TODO(crbug.com/1345828): Investigate whether accessible name should stay in
+ // sync during editing.
+ editor_->SetAccessibleName(
+ selected_node_->model_node()->GetAccessibleTitle());
LayoutEditor();
editor_->SetVisible(true);
SchedulePaintForNode(selected_node_);
@@ -245,6 +249,7 @@ void TreeView::CommitEdit() {
DCHECK(selected_node_);
const bool editor_has_focus = editor_->HasFocus();
model_->SetTitle(GetSelectedNode(), editor_->GetText());
+ editor_->SetAccessibleName(GetSelectedNode()->GetAccessibleTitle());
CancelEdit();
if (editor_has_focus)
RequestFocus();
@@ -646,30 +651,35 @@ void TreeView::OnDidChangeFocus(View* focused_before, View* focused_now) {
CommitEdit();
}
-int TreeView::GetRowCount() {
- int row_count = root_.NumExpandedNodes();
+size_t TreeView::GetRowCount() {
+ size_t row_count = root_.NumExpandedNodes();
if (!root_shown_)
row_count--;
return row_count;
}
-int TreeView::GetSelectedRow() {
+absl::optional<size_t> TreeView::GetSelectedRow() {
// Type-ahead searches should be relative to the active node, so return the
// row of the active node for |PrefixSelector|.
ui::TreeModelNode* model_node = GetActiveNode();
- return model_node ? GetRowForNode(model_node) : -1;
+ if (!model_node)
+ return absl::nullopt;
+ const int row = GetRowForNode(model_node);
+ return (row == -1) ? absl::nullopt
+ : absl::make_optional(static_cast<size_t>(row));
}
-void TreeView::SetSelectedRow(int row) {
+void TreeView::SetSelectedRow(absl::optional<size_t> row) {
// Type-ahead manipulates selection because active node is synced to selected
// node, so call SetSelectedNode() instead of SetActiveNode().
// TODO(crbug.com/1080944): Decouple active node from selected node by adding
// new keyboard affordances.
- SetSelectedNode(GetNodeForRow(row));
+ SetSelectedNode(
+ GetNodeForRow(row.has_value() ? static_cast<int>(row.value()) : -1));
}
-std::u16string TreeView::GetTextForRow(int row) {
- return GetNodeForRow(row)->GetTitle();
+std::u16string TreeView::GetTextForRow(size_t row) {
+ return GetNodeForRow(static_cast<int>(row))->GetTitle();
}
gfx::Point TreeView::GetKeyboardContextMenuLocation() {
@@ -966,12 +976,12 @@ void TreeView::PopulateAccessibilityData(InternalNode* node,
// Per the ARIA Spec, aria-posinset and aria-setsize are 1-based
// not 0-based.
- int pos_in_parent = node->parent()->GetIndexOf(node) + 1;
- int sibling_size = static_cast<int>(node->parent()->children().size());
+ size_t pos_in_parent = node->parent()->GetIndexOf(node).value() + 1;
+ size_t sibling_size = node->parent()->children().size();
data->AddIntAttribute(ax::mojom::IntAttribute::kPosInSet,
- int32_t{pos_in_parent});
+ static_cast<int32_t>(pos_in_parent));
data->AddIntAttribute(ax::mojom::IntAttribute::kSetSize,
- int32_t{sibling_size});
+ static_cast<int32_t>(sibling_size));
}
int ignored_depth;
@@ -1003,7 +1013,7 @@ void TreeView::UpdatePreferredSize() {
preferred_size_.SetSize(
root_.GetMaxWidth(this, text_offset_, root_shown_ ? 1 : 0) +
kTextHorizontalPadding * 2,
- row_height_ * GetRowCount());
+ row_height_ * base::checked_cast<int>(GetRowCount()));
// When the editor is visible, more space is needed beyond the regular row,
// such as for drawing the focus ring.
@@ -1173,9 +1183,9 @@ void TreeView::PaintExpandControl(gfx::Canvas* canvas,
void TreeView::PaintNodeIcon(gfx::Canvas* canvas,
InternalNode* node,
const gfx::Rect& bounds) {
- int icon_index = model_->GetIconIndex(node->model_node());
+ absl::optional<size_t> icon_index = model_->GetIconIndex(node->model_node());
int icon_x = kArrowRegionSize + kImagePadding;
- if (icon_index == -1) {
+ if (!icon_index.has_value()) {
// Flip just the |bounds| region of |canvas|.
gfx::ScopedCanvas scoped_canvas(canvas);
canvas->Translate(gfx::Vector2d(bounds.x(), 0));
@@ -1188,7 +1198,7 @@ void TreeView::PaintNodeIcon(gfx::Canvas* canvas,
gfx::Rect(0, bounds.y(), bounds.width(), bounds.height()));
} else {
const gfx::ImageSkia& icon =
- icons_[icon_index].Rasterize(GetColorProvider());
+ icons_[icon_index.value()].Rasterize(GetColorProvider());
icon_x += (open_icon_.Size().width() - icon.width()) / 2;
if (base::i18n::IsRTL())
icon_x = bounds.width() - icon_x - icon.width();
@@ -1211,7 +1221,8 @@ TreeView::InternalNode* TreeView::GetInternalNodeForModelNode(
LoadChildren(parent_internal_node);
}
size_t index =
- model_->GetIndexOf(parent_internal_node->model_node(), model_node);
+ model_->GetIndexOf(parent_internal_node->model_node(), model_node)
+ .value();
return parent_internal_node->children()[index].get();
}
@@ -1297,11 +1308,13 @@ int TreeView::GetRowForInternalNode(InternalNode* node, int* depth) {
int row = -1;
const InternalNode* tmp_node = node;
while (tmp_node->parent()) {
- size_t index_in_parent = tmp_node->parent()->GetIndexOf(tmp_node);
+ size_t index_in_parent = tmp_node->parent()->GetIndexOf(tmp_node).value();
(*depth)++;
row++; // For node.
- for (size_t i = 0; i < index_in_parent; ++i)
- row += tmp_node->parent()->children()[i]->NumExpandedNodes();
+ for (size_t i = 0; i < index_in_parent; ++i) {
+ row += static_cast<int>(
+ tmp_node->parent()->children()[i]->NumExpandedNodes());
+ }
tmp_node = tmp_node->parent();
}
if (root_shown_) {
@@ -1363,10 +1376,11 @@ void TreeView::IncrementSelection(IncrementType type) {
if (root_.children().empty())
return;
if (type == IncrementType::kPrevious) {
- int row_count = GetRowCount();
+ size_t row_count = GetRowCount();
int depth = 0;
DCHECK(row_count);
- InternalNode* node = GetNodeByRow(row_count - 1, &depth);
+ InternalNode* node =
+ GetNodeByRow(static_cast<int>(row_count - 1), &depth);
SetSelectedNode(node->model_node());
} else if (root_shown_) {
SetSelectedNode(root_.model_node());
@@ -1379,7 +1393,8 @@ void TreeView::IncrementSelection(IncrementType type) {
int depth = 0;
int delta = type == IncrementType::kPrevious ? -1 : 1;
int row = GetRowForInternalNode(active_node_, &depth);
- int new_row = base::clamp(row + delta, 0, GetRowCount() - 1);
+ int new_row =
+ base::clamp(row + delta, 0, base::checked_cast<int>(GetRowCount()) - 1);
if (new_row == row)
return; // At the end/beginning.
SetSelectedNode(GetNodeByRow(new_row, &depth)->model_node());
@@ -1472,8 +1487,8 @@ void TreeView::InternalNode::Reset(ui::TreeModelNode* node) {
accessibility_view_ = nullptr;
}
-int TreeView::InternalNode::NumExpandedNodes() const {
- int result = 1; // For this.
+size_t TreeView::InternalNode::NumExpandedNodes() const {
+ size_t result = 1; // For this.
if (!is_expanded_)
return result;
for (const auto& child : children())
diff --git a/chromium/ui/views/controls/tree/tree_view.h b/chromium/ui/views/controls/tree/tree_view.h
index f7ab0945b19..03678965087 100644
--- a/chromium/ui/views/controls/tree/tree_view.h
+++ b/chromium/ui/views/controls/tree/tree_view.h
@@ -202,10 +202,10 @@ class VIEWS_EXPORT TreeView : public View,
void OnDidChangeFocus(View* focused_before, View* focused_now) override;
// PrefixDelegate overrides:
- int GetRowCount() override;
- int GetSelectedRow() override;
- void SetSelectedRow(int row) override;
- std::u16string GetTextForRow(int row) override;
+ size_t GetRowCount() override;
+ absl::optional<size_t> GetSelectedRow() override;
+ void SetSelectedRow(absl::optional<size_t> row) override;
+ std::u16string GetTextForRow(size_t row) override;
protected:
// View overrides:
@@ -276,7 +276,7 @@ class VIEWS_EXPORT TreeView : public View,
int text_width() const { return text_width_; }
// Returns the total number of descendants (including this node).
- int NumExpandedNodes() const;
+ size_t NumExpandedNodes() const;
// Returns the max width of all descendants (including this node). |indent|
// is how many pixels each child is indented and |depth| is the depth of
diff --git a/chromium/ui/views/controls/tree/tree_view_unittest.cc b/chromium/ui/views/controls/tree/tree_view_unittest.cc
index 20ff974e567..2582f594198 100644
--- a/chromium/ui/views/controls/tree/tree_view_unittest.cc
+++ b/chromium/ui/views/controls/tree/tree_view_unittest.cc
@@ -145,7 +145,7 @@ class TreeViewTest : public ViewsTestBase {
void IncrementSelection(bool next);
void CollapseOrSelectParent();
void ExpandOrSelectChild();
- int GetRowCount();
+ size_t GetRowCount();
PrefixSelector* selector() { return tree_->GetPrefixSelector(); }
ui::TreeNodeModel<TestNode> model_;
@@ -343,7 +343,7 @@ void TreeViewTest::ExpandOrSelectChild() {
tree_->ExpandOrSelectChild();
}
-int TreeViewTest::GetRowCount() {
+size_t TreeViewTest::GetRowCount() {
return tree_->GetRowCount();
}
@@ -396,7 +396,7 @@ TEST_F(TreeViewTest, SetModel) {
EXPECT_EQ("root [a b c]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("root", GetSelectedNodeTitle());
EXPECT_EQ("root", GetSelectedAccessibilityViewName());
- EXPECT_EQ(4, GetRowCount());
+ EXPECT_EQ(4u, GetRowCount());
EXPECT_EQ(
(AccessibilityEventsVector{
@@ -468,7 +468,7 @@ TEST_F(TreeViewTest, HideRoot) {
EXPECT_EQ("root [a b c]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("a", GetSelectedNodeTitle());
EXPECT_EQ("a", GetSelectedAccessibilityViewName());
- EXPECT_EQ(3, GetRowCount());
+ EXPECT_EQ(3u, GetRowCount());
EXPECT_EQ((AccessibilityEventsVector{
std::make_pair(GetAccessibilityViewByName("a"),
@@ -489,7 +489,7 @@ TEST_F(TreeViewTest, Expand) {
EXPECT_EQ("root [a b [b1] c]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("root", GetSelectedNodeTitle());
EXPECT_EQ("root", GetSelectedAccessibilityViewName());
- EXPECT_EQ(5, GetRowCount());
+ EXPECT_EQ(5u, GetRowCount());
EXPECT_EQ((AccessibilityEventsVector{
std::make_pair(GetTreeAccessibilityView(),
@@ -509,7 +509,7 @@ TEST_F(TreeViewTest, Collapse) {
tree_->Expand(GetNodeByTitle("b1"));
EXPECT_EQ("root [a b [b1] c]", TreeViewContentsAsString());
EXPECT_EQ("root [a b [b1] c]", TreeViewAccessibilityContentsAsString());
- EXPECT_EQ(5, GetRowCount());
+ EXPECT_EQ(5u, GetRowCount());
tree_->SetSelectedNode(GetNodeByTitle("b1"));
EXPECT_EQ("b1", GetSelectedNodeTitle());
EXPECT_EQ("b1", GetSelectedAccessibilityViewName());
@@ -521,7 +521,7 @@ TEST_F(TreeViewTest, Collapse) {
// Selected node should have moved to 'b'
EXPECT_EQ("b", GetSelectedNodeTitle());
EXPECT_EQ("b", GetSelectedAccessibilityViewName());
- EXPECT_EQ(4, GetRowCount());
+ EXPECT_EQ(4u, GetRowCount());
EXPECT_EQ((AccessibilityEventsVector{
std::make_pair(GetAccessibilityViewByName("b"),
@@ -550,7 +550,7 @@ TEST_F(TreeViewTest, TreeNodesAdded) {
EXPECT_EQ("root [a b B c]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("root", GetSelectedNodeTitle());
EXPECT_EQ("root", GetSelectedAccessibilityViewName());
- EXPECT_EQ(5, GetRowCount());
+ EXPECT_EQ(5u, GetRowCount());
EXPECT_EQ((AccessibilityEventsVector{
std::make_pair(GetTreeAccessibilityView(),
ax::mojom::Event::kChildrenChanged),
@@ -565,7 +565,7 @@ TEST_F(TreeViewTest, TreeNodesAdded) {
EXPECT_EQ("root [a b B c]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("root", GetSelectedNodeTitle());
EXPECT_EQ("root", GetSelectedAccessibilityViewName());
- EXPECT_EQ(5, GetRowCount());
+ EXPECT_EQ(5u, GetRowCount());
// Added node is not visible, hence no accessibility event needed.
EXPECT_EQ(AccessibilityEventsVector(), accessibility_events());
@@ -577,7 +577,7 @@ TEST_F(TreeViewTest, TreeNodesAdded) {
EXPECT_EQ("root [a b B c]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("root", GetSelectedNodeTitle());
EXPECT_EQ("root", GetSelectedAccessibilityViewName());
- EXPECT_EQ(5, GetRowCount());
+ EXPECT_EQ(5u, GetRowCount());
// Added node is not visible, hence no accessibility event needed.
EXPECT_EQ(AccessibilityEventsVector(), accessibility_events());
@@ -588,7 +588,7 @@ TEST_F(TreeViewTest, TreeNodesAdded) {
EXPECT_EQ("root [a b [b1 b2] B c]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("root", GetSelectedNodeTitle());
EXPECT_EQ("root", GetSelectedAccessibilityViewName());
- EXPECT_EQ(7, GetRowCount());
+ EXPECT_EQ(7u, GetRowCount());
// Since the added node was not visible when it was added, no extra events
// other than the ones for expanding a node are needed.
EXPECT_EQ((AccessibilityEventsVector{
@@ -616,7 +616,7 @@ TEST_F(TreeViewTest, TreeNodesRemoved) {
EXPECT_EQ("root [a b c]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("root", GetSelectedNodeTitle());
EXPECT_EQ("root", GetSelectedAccessibilityViewName());
- EXPECT_EQ(4, GetRowCount());
+ EXPECT_EQ(4u, GetRowCount());
// Expand b1, then collapse it and remove its only child, b1. This shouldn't
// effect the tree.
@@ -628,7 +628,7 @@ TEST_F(TreeViewTest, TreeNodesRemoved) {
EXPECT_EQ("root [a b c]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("root", GetSelectedNodeTitle());
EXPECT_EQ("root", GetSelectedAccessibilityViewName());
- EXPECT_EQ(4, GetRowCount());
+ EXPECT_EQ(4u, GetRowCount());
EXPECT_EQ(
(AccessibilityEventsVector{std::make_pair(
GetTreeAccessibilityView(), ax::mojom::Event::kChildrenChanged)}),
@@ -641,7 +641,7 @@ TEST_F(TreeViewTest, TreeNodesRemoved) {
EXPECT_EQ("root [a c]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("root", GetSelectedNodeTitle());
EXPECT_EQ("root", GetSelectedAccessibilityViewName());
- EXPECT_EQ(3, GetRowCount());
+ EXPECT_EQ(3u, GetRowCount());
EXPECT_EQ(
(AccessibilityEventsVector{
std::make_pair(GetTreeAccessibilityView(), ax::mojom::Event::kFocus),
@@ -658,7 +658,7 @@ TEST_F(TreeViewTest, TreeNodesRemoved) {
EXPECT_EQ("root [a c]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("root", GetSelectedNodeTitle());
EXPECT_EQ("root", GetSelectedAccessibilityViewName());
- EXPECT_EQ(3, GetRowCount());
+ EXPECT_EQ(3u, GetRowCount());
// Node "c11" is not visible, hence no accessibility event needed.
EXPECT_EQ(AccessibilityEventsVector(), accessibility_events());
@@ -672,7 +672,7 @@ TEST_F(TreeViewTest, TreeNodesRemoved) {
EXPECT_EQ("root [a]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("a", GetSelectedNodeTitle());
EXPECT_EQ("a", GetSelectedAccessibilityViewName());
- EXPECT_EQ(2, GetRowCount());
+ EXPECT_EQ(2u, GetRowCount());
EXPECT_EQ(
(AccessibilityEventsVector{
std::make_pair(GetTreeAccessibilityView(), ax::mojom::Event::kFocus),
@@ -696,7 +696,7 @@ TEST_F(TreeViewTest, TreeNodesRemoved) {
EXPECT_EQ("root [a [c1 c3]]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("c3", GetSelectedNodeTitle());
EXPECT_EQ("c3", GetSelectedAccessibilityViewName());
- EXPECT_EQ(4, GetRowCount());
+ EXPECT_EQ(4u, GetRowCount());
// Now delete 'c3' and then 'c1' should be selected.
ClearAccessibilityEvents();
@@ -705,7 +705,7 @@ TEST_F(TreeViewTest, TreeNodesRemoved) {
EXPECT_EQ("root [a [c1]]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("c1", GetSelectedNodeTitle());
EXPECT_EQ("c1", GetSelectedAccessibilityViewName());
- EXPECT_EQ(3, GetRowCount());
+ EXPECT_EQ(3u, GetRowCount());
EXPECT_EQ(
(AccessibilityEventsVector{
std::make_pair(GetTreeAccessibilityView(), ax::mojom::Event::kFocus),
@@ -726,7 +726,7 @@ TEST_F(TreeViewTest, TreeNodesRemoved) {
EXPECT_EQ("root [a]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("a", GetSelectedNodeTitle());
EXPECT_EQ("a", GetSelectedAccessibilityViewName());
- EXPECT_EQ(2, GetRowCount());
+ EXPECT_EQ(2u, GetRowCount());
EXPECT_EQ(
(AccessibilityEventsVector{
std::make_pair(GetTreeAccessibilityView(), ax::mojom::Event::kFocus),
@@ -750,7 +750,7 @@ TEST_F(TreeViewTest, TreeNodesRemoved) {
EXPECT_EQ("root [a c]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("c", GetSelectedNodeTitle());
EXPECT_EQ("c", GetSelectedAccessibilityViewName());
- EXPECT_EQ(2, GetRowCount());
+ EXPECT_EQ(2u, GetRowCount());
}
class TestController : public TreeViewController {
@@ -802,7 +802,7 @@ TEST_F(TreeViewTest, TreeNodeChanged) {
EXPECT_EQ("root [a b c]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("root", GetSelectedNodeTitle());
EXPECT_EQ("root", GetSelectedAccessibilityViewName());
- EXPECT_EQ(4, GetRowCount());
+ EXPECT_EQ(4u, GetRowCount());
EXPECT_EQ(AccessibilityEventsVector(), accessibility_events());
// Change 'b1', shouldn't do anything.
@@ -812,7 +812,7 @@ TEST_F(TreeViewTest, TreeNodeChanged) {
EXPECT_EQ("root [a b c]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("root", GetSelectedNodeTitle());
EXPECT_EQ("root", GetSelectedAccessibilityViewName());
- EXPECT_EQ(4, GetRowCount());
+ EXPECT_EQ(4u, GetRowCount());
EXPECT_EQ(AccessibilityEventsVector(), accessibility_events());
// Change 'b'.
@@ -822,7 +822,7 @@ TEST_F(TreeViewTest, TreeNodeChanged) {
EXPECT_EQ("root [a b.new c]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("root", GetSelectedNodeTitle());
EXPECT_EQ("root", GetSelectedAccessibilityViewName());
- EXPECT_EQ(4, GetRowCount());
+ EXPECT_EQ(4u, GetRowCount());
EXPECT_EQ((AccessibilityEventsVector{
std::make_pair(GetAccessibilityViewByName("b.new"),
ax::mojom::Event::kLocationChanged)}),
@@ -997,7 +997,7 @@ TEST_F(TreeViewTest, VirtualAccessibleAction) {
tree_->Expand(GetNodeByTitle("b1"));
EXPECT_EQ("root [a b [b1] c]", TreeViewContentsAsString());
EXPECT_EQ("root [a b [b1] c]", TreeViewAccessibilityContentsAsString());
- EXPECT_EQ(5, GetRowCount());
+ EXPECT_EQ(5u, GetRowCount());
// Set to nullptr should clear the selection.
tree_->SetSelectedNode(nullptr);
@@ -1062,7 +1062,7 @@ TEST_F(TreeViewTest, OnFocusAccessibilityEvents) {
EXPECT_EQ("root [a b c]", TreeViewAccessibilityContentsAsString());
EXPECT_EQ("root", GetSelectedNodeTitle());
EXPECT_EQ("root", GetSelectedAccessibilityViewName());
- EXPECT_EQ(4, GetRowCount());
+ EXPECT_EQ(4u, GetRowCount());
EXPECT_EQ((AccessibilityEventsVector{
std::make_pair(GetTreeAccessibilityView(),
ax::mojom::Event::kChildrenChanged),
diff --git a/chromium/ui/views/controls/webview/webview_unittest.cc b/chromium/ui/views/controls/webview/webview_unittest.cc
index edf636df419..ea25270ff23 100644
--- a/chromium/ui/views/controls/webview/webview_unittest.cc
+++ b/chromium/ui/views/controls/webview/webview_unittest.cc
@@ -173,9 +173,9 @@ class WebViewUnitTest : public views::test::WidgetTest {
top_level_widget_->SetBounds(gfx::Rect(0, 10, 100, 100));
View* const contents_view =
top_level_widget_->SetContentsView(std::make_unique<View>());
- web_view_ = new WebView(browser_context_.get());
- web_view_->SetBoundsRect(gfx::Rect(contents_view->size()));
- contents_view->AddChildView(web_view_.get());
+ auto web_view = std::make_unique<WebView>(browser_context_.get());
+ web_view->SetBoundsRect(gfx::Rect(contents_view->size()));
+ web_view_ = contents_view->AddChildView(std::move(web_view));
top_level_widget_->Show();
ASSERT_EQ(gfx::Rect(0, 0, 100, 100), web_view_->bounds());
}
@@ -231,8 +231,8 @@ TEST_F(WebViewUnitTest, TestWebViewAttachDetachWebContents) {
EXPECT_FALSE(observer1.was_shown());
web_view()->SetWebContents(web_contents1.get());
- // Layout() is normally async, call it now to ensure visibility is updated.
- web_view()->Layout();
+ // Layout is normally async, ensure it runs now so visibility is updated.
+ RunScheduledLayout(web_view());
EXPECT_TRUE(observer1.was_shown());
#if defined(USE_AURA)
EXPECT_TRUE(web_contents1->GetNativeView()->IsVisible());
@@ -251,8 +251,8 @@ TEST_F(WebViewUnitTest, TestWebViewAttachDetachWebContents) {
// Setting the new WebContents should hide the existing one.
web_view()->SetWebContents(web_contents2.get());
- // Layout() is normally async, call it now to ensure visibility is updated.
- web_view()->Layout();
+ // Layout is normally async, ensure it runs now so visibility is updated.
+ RunScheduledLayout(web_view());
EXPECT_FALSE(observer1.was_shown());
EXPECT_TRUE(observer2.was_shown());
EXPECT_TRUE(observer2.valid_root_while_shown());
@@ -270,8 +270,8 @@ TEST_F(WebViewUnitTest, TestWebViewAttachDetachWebContents) {
EXPECT_EQ(1, observer1.shown_count());
web_view()->SetWebContents(web_contents1.get());
- // Layout() is normally async, call it now to ensure visibility is updated.
- web_view()->Layout();
+ // Layout is normally async, ensure it runs now so visibility is updated.
+ RunScheduledLayout(web_view());
EXPECT_EQ(1, observer1.shown_count());
// Nothing else should change.
diff --git a/chromium/ui/views/corewm/cursor_height_provider_win.cc b/chromium/ui/views/corewm/cursor_height_provider_win.cc
index 461d2253ab1..49f337f4972 100644
--- a/chromium/ui/views/corewm/cursor_height_provider_win.cc
+++ b/chromium/ui/views/corewm/cursor_height_provider_win.cc
@@ -12,6 +12,7 @@
#include <map>
#include <memory>
+#include "base/numerics/safe_conversions.h"
#include "base/win/scoped_hdc.h"
namespace {
@@ -46,9 +47,9 @@ PixelData GetBitmapData(HBITMAP handle, const BITMAPINFO& info, HDC hdc) {
data = std::make_unique<uint32_t[]>(info.bmiHeader.biSizeImage /
sizeof(uint32_t));
- int result =
- GetDIBits(hdc, handle, 0, info.bmiHeader.biHeight, data.get(),
- reinterpret_cast<BITMAPINFO*>(header.get()), DIB_RGB_COLORS);
+ int result = GetDIBits(
+ hdc, handle, 0, static_cast<UINT>(info.bmiHeader.biHeight), data.get(),
+ reinterpret_cast<BITMAPINFO*>(header.get()), DIB_RGB_COLORS);
if (result == 0)
data.reset();
@@ -70,10 +71,10 @@ bool IsRowTransparent(const PixelData& data,
return true;
}
-// Gets the vertical offset between specified cursor's hotpoint and it's bottom.
+// Gets the vertical offset between specified cursor's hotpoint and its bottom.
//
// Gets the cursor image data and extract cursor's visible height.
-// Based on that get's what should be the vertical offset between cursor's
+// Based on that gets what should be the vertical offset between cursor's
// hot point and the tooltip.
int CalculateCursorHeight(HCURSOR cursor_handle) {
base::win::ScopedGetDC hdc(nullptr);
@@ -90,16 +91,15 @@ int CalculateCursorHeight(HCURSOR cursor_handle) {
// Rows are padded to full DWORDs. OR with this mask will set them to 1
// to simplify matching with |transparent_mask|.
uint32_t last_byte_mask = 0xFFFFFFFF;
+ const auto width = static_cast<uint32_t>(bitmap_info.bmiHeader.biWidth);
const unsigned char bits_to_shift =
- sizeof(last_byte_mask) * 8 -
- (bitmap_info.bmiHeader.biWidth % kBitsPeruint32);
+ sizeof(last_byte_mask) * 8 - (width % kBitsPeruint32);
if (bits_to_shift != kBitsPeruint32)
last_byte_mask = (last_byte_mask << bits_to_shift);
else
last_byte_mask = 0;
- const uint32_t row_size =
- (bitmap_info.bmiHeader.biWidth + kBitsPeruint32 - 1) / kBitsPeruint32;
+ const uint32_t row_size = (width + kBitsPeruint32 - 1) / kBitsPeruint32;
PixelData data(GetBitmapData(icon.hbmMask, bitmap_info, hdc));
if (data == nullptr)
return kDefaultHeight;
@@ -111,10 +111,9 @@ int CalculateCursorHeight(HCURSOR cursor_handle) {
// of each other (xor mask and and mask).
const bool has_xor_mask =
bitmap_info.bmiHeader.biHeight == 2 * bitmap_info.bmiHeader.biWidth;
- const int cursor_height =
- has_xor_mask ? static_cast<int>(bitmap_info.bmiHeader.biHeight / 2)
- : static_cast<int>(bitmap_info.bmiHeader.biHeight);
- int xor_offset;
+ const auto height = static_cast<uint32_t>(bitmap_info.bmiHeader.biHeight);
+ const uint32_t cursor_height = has_xor_mask ? height / 2 : height;
+ uint32_t xor_offset;
if (has_xor_mask) {
for (xor_offset = 0; xor_offset < cursor_height; ++xor_offset) {
const uint32_t row_start = row_size * xor_offset;
@@ -129,10 +128,10 @@ int CalculateCursorHeight(HCURSOR cursor_handle) {
xor_offset = cursor_height;
}
- int and_offset;
+ uint32_t and_offset;
- for (and_offset = has_xor_mask ? cursor_height : 0;
- and_offset < bitmap_info.bmiHeader.biHeight; ++and_offset) {
+ for (and_offset = has_xor_mask ? cursor_height : 0; and_offset < height;
+ ++and_offset) {
if (!IsRowTransparent(data, row_size, last_byte_mask, and_offset)) {
break;
}
@@ -140,12 +139,15 @@ int CalculateCursorHeight(HCURSOR cursor_handle) {
if (has_xor_mask) {
and_offset -= cursor_height;
}
- const int offset = std::min(xor_offset, and_offset);
+ const uint32_t offset = std::min(xor_offset, and_offset);
DeleteObject(icon.hbmColor);
DeleteObject(icon.hbmMask);
- return cursor_height - offset - icon.yHotspot + 1;
+ // Apparently it's possible for the calculation here to underflow, and thus
+ // result in a negative value, maybe if the hotspot is below any visible
+ // portion of the cursor. Not sure if this case should return 0 instead.
+ return static_cast<int>(cursor_height - offset - icon.yHotspot + 1);
}
} // namespace
diff --git a/chromium/ui/views/corewm/tooltip_aura.cc b/chromium/ui/views/corewm/tooltip_aura.cc
index 52db6b52f80..7ce956dc756 100644
--- a/chromium/ui/views/corewm/tooltip_aura.cc
+++ b/chromium/ui/views/corewm/tooltip_aura.cc
@@ -141,8 +141,8 @@ class TooltipView : public views::View {
gfx::RenderText* render_text_for_test() { return render_text_.get(); }
void GetAccessibleNodeData(ui::AXNodeData* node_data) override {
- node_data->SetName(render_text_->GetDisplayText());
node_data->role = ax::mojom::Role::kTooltip;
+ node_data->SetName(render_text_->GetDisplayText());
}
private:
diff --git a/chromium/ui/views/corewm/tooltip_controller.cc b/chromium/ui/views/corewm/tooltip_controller.cc
index dc3b6f759a6..dc9825eed96 100644
--- a/chromium/ui/views/corewm/tooltip_controller.cc
+++ b/chromium/ui/views/corewm/tooltip_controller.cc
@@ -222,6 +222,10 @@ void TooltipController::OnMouseEvent(ui::MouseEvent* event) {
case ui::ET_MOUSE_CAPTURE_CHANGED:
case ui::ET_MOUSE_MOVED:
case ui::ET_MOUSE_DRAGGED: {
+ // Synthesized mouse moves shouldn't cause us to show a tooltip. See
+ // https://crbug.com/1146981.
+ if (event->IsSynthesized())
+ break;
last_mouse_loc_ = event->location();
aura::Window* target = nullptr;
// Avoid a call to display::Screen::GetWindowAtScreenPoint() since it can
diff --git a/chromium/ui/views/corewm/tooltip_controller.h b/chromium/ui/views/corewm/tooltip_controller.h
index b6074b8bdd8..9e37ec338d5 100644
--- a/chromium/ui/views/corewm/tooltip_controller.h
+++ b/chromium/ui/views/corewm/tooltip_controller.h
@@ -150,7 +150,8 @@ class VIEWS_EXPORT TooltipController
// The tooltip should stay hidden after a mouse press event on the view until
// the cursor moves to another view.
std::u16string tooltip_text_at_mouse_press_;
- raw_ptr<aura::Window> tooltip_window_at_mouse_press_ = nullptr;
+ raw_ptr<aura::Window, DanglingUntriaged> tooltip_window_at_mouse_press_ =
+ nullptr;
// Location of the last events in |tooltip_window_|'s coordinates.
gfx::Point last_mouse_loc_;
diff --git a/chromium/ui/views/corewm/tooltip_win.cc b/chromium/ui/views/corewm/tooltip_win.cc
index 5eb4caea0b4..3f8045d76bb 100644
--- a/chromium/ui/views/corewm/tooltip_win.cc
+++ b/chromium/ui/views/corewm/tooltip_win.cc
@@ -81,8 +81,8 @@ void TooltipWin::PositionTooltip() {
const int cursoroffset = GetCurrentCursorVisibleHeight();
screen_point.Offset(0, cursoroffset);
- DWORD tooltip_size = SendMessage(tooltip_hwnd_, TTM_GETBUBBLESIZE, 0,
- reinterpret_cast<LPARAM>(&toolinfo_));
+ LRESULT tooltip_size = SendMessage(tooltip_hwnd_, TTM_GETBUBBLESIZE, 0,
+ reinterpret_cast<LPARAM>(&toolinfo_));
const gfx::Size size(LOWORD(tooltip_size), HIWORD(tooltip_size));
const display::Display display(
diff --git a/chromium/ui/views/debug_utils.cc b/chromium/ui/views/debug_utils.cc
index 7e4c8660494..293c656b79b 100644
--- a/chromium/ui/views/debug_utils.cc
+++ b/chromium/ui/views/debug_utils.cc
@@ -9,6 +9,7 @@
#include "base/logging.h"
#include "ui/compositor/layer.h"
#include "ui/views/view.h"
+#include "ui/views/widget/widget.h"
#if !defined(NDEBUG)
#include "ui/gfx/geometry/angle_conversions.h"
@@ -143,6 +144,41 @@ std::string PrintViewGraphImpl(const View* view) {
} // namespace
+void PrintWidgetInformation(const Widget& widget,
+ bool detailed,
+ std::ostringstream* out) {
+ *out << " name=" << widget.GetName();
+ *out << " (" << &widget << ")";
+
+ if (widget.parent())
+ *out << " parent=" << widget.parent();
+ else
+ *out << " parent=none";
+
+ const ui::Layer* layer = widget.GetLayer();
+ if (layer)
+ *out << " layer=" << layer;
+ else
+ *out << " layer=none";
+
+ *out << (widget.is_top_level() ? " [top_level]" : " [!top_level]");
+
+ if (detailed) {
+ *out << (widget.IsActive() ? " [active]" : " [!active]");
+ *out << (widget.IsVisible() ? " [visible]" : " [!visible]");
+ }
+
+ *out << (widget.IsClosed() ? " [closed]" : "");
+ *out << (widget.IsMaximized() ? " [maximized]" : "");
+ *out << (widget.IsMinimized() ? " [minimized]" : "");
+ *out << (widget.IsFullscreen() ? " [fullscreen]" : "");
+
+ if (detailed)
+ *out << " " << widget.GetWindowBoundsInScreen().ToString();
+
+ *out << '\n';
+}
+
void PrintViewHierarchy(const View* view) {
std::ostringstream out;
PrintViewHierarchy(view, &out);
diff --git a/chromium/ui/views/debug_utils.h b/chromium/ui/views/debug_utils.h
index 6d0d9cd0d54..e86c6c7b0ba 100644
--- a/chromium/ui/views/debug_utils.h
+++ b/chromium/ui/views/debug_utils.h
@@ -5,6 +5,7 @@
#ifndef UI_VIEWS_DEBUG_UTILS_H_
#define UI_VIEWS_DEBUG_UTILS_H_
+#include <sstream>
#include <string>
#include "ui/views/views_export.h"
@@ -12,6 +13,7 @@
namespace views {
class View;
+class Widget;
// Log the view hierarchy.
VIEWS_EXPORT void PrintViewHierarchy(const View* view);
@@ -22,6 +24,12 @@ VIEWS_EXPORT void PrintViewHierarchy(const View* view, std::ostringstream* out);
// Log the focus traversal hierarchy.
VIEWS_EXPORT void PrintFocusHierarchy(const View* view);
+// Log the information of the widget to |out|. |detailed| controls the amount of
+// information logged.
+VIEWS_EXPORT void PrintWidgetInformation(const Widget& widget,
+ bool detailed,
+ std::ostringstream* out);
+
#if !defined(NDEBUG)
// Returns string containing a graph of the views hierarchy in graphViz DOT
// language (http://graphviz.org/). Can be called within debugger and saved
diff --git a/chromium/ui/views/examples/BUILD.gn b/chromium/ui/views/examples/BUILD.gn
index 2728e5d9fcd..18932a06271 100644
--- a/chromium/ui/views/examples/BUILD.gn
+++ b/chromium/ui/views/examples/BUILD.gn
@@ -262,6 +262,7 @@ executable("views_examples_with_content") {
"//content",
"//content:sandbox_helper_win",
"//sandbox",
+ "//ui/color:mixers",
"//ui/views_content_client",
]
@@ -334,10 +335,10 @@ test("views_examples_unittests") {
}
if (is_fuchsia) {
- use_cfv2 = false
+ use_cfv1 = false
additional_manifest_fragments = [
- "//build/config/fuchsia/test/font_capabilities.test-cmx",
- "//build/config/fuchsia/test/vulkan_capabilities.test-cmx",
+ "//build/config/fuchsia/test/fonts.shard.test-cml",
+ "//third_party/fuchsia-sdk/sdk/pkg/vulkan/client.shard.cml",
]
}
diff --git a/chromium/ui/views/examples/animation_example.cc b/chromium/ui/views/examples/animation_example.cc
index 25a7db55c4a..c8a83f73ca7 100644
--- a/chromium/ui/views/examples/animation_example.cc
+++ b/chromium/ui/views/examples/animation_example.cc
@@ -72,8 +72,10 @@ AnimatingSquare::AnimatingSquare(size_t index) : index_(index) {
void AnimatingSquare::OnPaint(gfx::Canvas* canvas) {
View::OnPaint(canvas);
const SkColor color = SkColorSetRGB((5 - index_) * 51, 0, index_ * 51);
- const SkColor colors[2] = {color,
- color_utils::HSLShift(color, {-1.0, -1.0, 0.75})};
+ // TODO(crbug/1308932): Remove this FromColor and make all SkColor4f.
+ const SkColor4f colors[2] = {
+ SkColor4f::FromColor(color),
+ SkColor4f::FromColor(color_utils::HSLShift(color, {-1.0, -1.0, 0.75}))};
cc::PaintFlags flags;
gfx::Rect local_bounds = gfx::Rect(layer()->size());
const float dsf = canvas->UndoDeviceScaleFactor();
diff --git a/chromium/ui/views/examples/box_layout_example.cc b/chromium/ui/views/examples/box_layout_example.cc
index b96f4a1ae39..803b150fc28 100644
--- a/chromium/ui/views/examples/box_layout_example.cc
+++ b/chromium/ui/views/examples/box_layout_example.cc
@@ -92,15 +92,15 @@ void BoxLayoutExample::UpdateLayoutManager() {
int child_spacing;
base::StringToInt(between_child_spacing_->GetText(), &child_spacing);
layout_ = panel->SetLayoutManager(std::make_unique<BoxLayout>(
- orientation_->GetSelectedIndex() == 0
+ orientation_->GetSelectedIndex() == 0u
? BoxLayout::Orientation::kHorizontal
: BoxLayout::Orientation::kVertical,
gfx::Insets(), child_spacing, collapse_margins_->GetChecked()));
layout_->set_cross_axis_alignment(static_cast<BoxLayout::CrossAxisAlignment>(
- cross_axis_alignment_->GetSelectedIndex()));
+ cross_axis_alignment_->GetSelectedIndex().value()));
layout_->set_main_axis_alignment(static_cast<BoxLayout::MainAxisAlignment>(
- main_axis_alignment_->GetSelectedIndex()));
+ main_axis_alignment_->GetSelectedIndex().value()));
int default_flex;
base::StringToInt(default_flex_->GetText(), &default_flex);
@@ -127,13 +127,13 @@ void BoxLayoutExample::UpdateBorderInsets() {
void BoxLayoutExample::MainAxisAlignmentChanged() {
layout_->set_main_axis_alignment(static_cast<BoxLayout::MainAxisAlignment>(
- main_axis_alignment_->GetSelectedIndex()));
+ main_axis_alignment_->GetSelectedIndex().value()));
RefreshLayoutPanel(false);
}
void BoxLayoutExample::CrossAxisAlignmentChanged() {
layout_->set_cross_axis_alignment(static_cast<BoxLayout::CrossAxisAlignment>(
- cross_axis_alignment_->GetSelectedIndex()));
+ cross_axis_alignment_->GetSelectedIndex().value()));
RefreshLayoutPanel(false);
}
diff --git a/chromium/ui/views/examples/combobox_example.cc b/chromium/ui/views/examples/combobox_example.cc
index 907e0b4922e..edb63276baf 100644
--- a/chromium/ui/views/examples/combobox_example.cc
+++ b/chromium/ui/views/examples/combobox_example.cc
@@ -32,9 +32,10 @@ class ComboboxModelExample : public ui::ComboboxModel {
private:
// ui::ComboboxModel:
- int GetItemCount() const override { return 10; }
- std::u16string GetItemAt(int index) const override {
- return base::UTF8ToUTF16(base::StringPrintf("%c item", 'A' + index));
+ size_t GetItemCount() const override { return 10; }
+ std::u16string GetItemAt(size_t index) const override {
+ return base::UTF8ToUTF16(
+ base::StringPrintf("%c item", static_cast<char>('A' + index)));
}
};
@@ -79,7 +80,7 @@ void ComboboxExample::CreateExampleView(View* container) {
void ComboboxExample::ValueChanged() {
PrintStatus("Selected: %s",
base::UTF16ToUTF8(combobox_->GetModel()->GetItemAt(
- combobox_->GetSelectedIndex()))
+ combobox_->GetSelectedIndex().value()))
.c_str());
}
diff --git a/chromium/ui/views/examples/designer_example.cc b/chromium/ui/views/examples/designer_example.cc
index 280334f1fb9..ed797717433 100644
--- a/chromium/ui/views/examples/designer_example.cc
+++ b/chromium/ui/views/examples/designer_example.cc
@@ -160,9 +160,9 @@ class ClassRegistration<Combobox> : public BaseClassRegistration,
}
// ui::ComboboxModel
- int GetItemCount() const override { return 1; }
- std::u16string GetItemAt(int index) const override { return u"<empty>"; }
- int GetDefaultIndex() const override { return 0; }
+ size_t GetItemCount() const override { return 1; }
+ std::u16string GetItemAt(size_t index) const override { return u"<empty>"; }
+ absl::optional<size_t> GetDefaultIndex() const override { return 0; }
};
template <>
@@ -300,7 +300,7 @@ void DesignerExample::GrabHandle::UpdatePosition(bool reorder) {
if (GetVisible() && attached_view_) {
PositionOnView();
if (reorder)
- parent()->ReorderChildView(this, -1);
+ parent()->ReorderChildView(this, parent()->children().size());
}
}
@@ -596,7 +596,7 @@ gfx::Vector2d DesignerExample::SnapToGrid(const gfx::Vector2d& distance) {
void DesignerExample::CreateView(const ui::Event& event) {
std::unique_ptr<View> new_view =
- class_registrations_[view_type_->GetSelectedRow()]->CreateView();
+ class_registrations_[view_type_->GetSelectedRow().value()]->CreateView();
new_view->SizeToPreferredSize();
gfx::Rect child_rect = designer_panel_->GetContentsBounds();
child_rect.ClampToCenteredSize(new_view->size());
@@ -606,11 +606,11 @@ void DesignerExample::CreateView(const ui::Event& event) {
designer_panel_->AddChildView(std::move(new_view));
}
-int DesignerExample::RowCount() {
+size_t DesignerExample::RowCount() {
return selected_ ? selected_members_.size() : 0;
}
-std::u16string DesignerExample::GetText(int row, int column_id) {
+std::u16string DesignerExample::GetText(size_t row, int column_id) {
if (selected_) {
ui::metadata::MemberMetaDataBase* member = selected_members_[row];
if (column_id == 0)
@@ -624,15 +624,15 @@ void DesignerExample::SetObserver(ui::TableModelObserver* observer) {
model_observer_ = observer;
}
-int DesignerExample::GetItemCount() const {
+size_t DesignerExample::GetItemCount() const {
return class_registrations_.size();
}
-std::u16string DesignerExample::GetItemAt(int index) const {
+std::u16string DesignerExample::GetItemAt(size_t index) const {
return class_registrations_[index]->GetViewClassName();
}
-int DesignerExample::GetDefaultIndex() const {
+absl::optional<size_t> DesignerExample::GetDefaultIndex() const {
return 0;
}
diff --git a/chromium/ui/views/examples/designer_example.h b/chromium/ui/views/examples/designer_example.h
index f3007b6dc13..ddb2510783b 100644
--- a/chromium/ui/views/examples/designer_example.h
+++ b/chromium/ui/views/examples/designer_example.h
@@ -139,14 +139,14 @@ class VIEWS_EXAMPLES_EXPORT DesignerExample : public ExampleBase,
void CreateView(const ui::Event& event);
// ui::TableModel overrides
- int RowCount() override;
- std::u16string GetText(int row, int column_id) override;
+ size_t RowCount() override;
+ std::u16string GetText(size_t row, int column_id) override;
void SetObserver(ui::TableModelObserver* observer) override;
// ui::ComboboxModel overrides
- int GetItemCount() const override;
- std::u16string GetItemAt(int index) const override;
- int GetDefaultIndex() const override;
+ size_t GetItemCount() const override;
+ std::u16string GetItemAt(size_t index) const override;
+ absl::optional<size_t> GetDefaultIndex() const override;
BoxLayoutView* designer_container_ = nullptr;
DesignerSurface* designer_panel_ = nullptr;
diff --git a/chromium/ui/views/examples/dialog_example.cc b/chromium/ui/views/examples/dialog_example.cc
index 46a5367089b..eb82bfd4205 100644
--- a/chromium/ui/views/examples/dialog_example.cc
+++ b/chromium/ui/views/examples/dialog_example.cc
@@ -31,7 +31,7 @@ namespace views {
namespace examples {
namespace {
-constexpr int kFakeModeless = ui::MODAL_TYPE_SYSTEM + 1;
+constexpr size_t kFakeModeless = ui::MODAL_TYPE_SYSTEM + 1;
} // namespace
@@ -235,7 +235,7 @@ ui::ModalType DialogExample::GetModalType() const {
if (mode_->GetSelectedIndex() == kFakeModeless)
return ui::MODAL_TYPE_WINDOW;
- return static_cast<ui::ModalType>(mode_->GetSelectedIndex());
+ return static_cast<ui::ModalType>(mode_->GetSelectedIndex().value());
}
int DialogExample::GetDialogButtons() const {
diff --git a/chromium/ui/views/examples/example_combobox_model.cc b/chromium/ui/views/examples/example_combobox_model.cc
index aa21ea27cb2..887dc19a982 100644
--- a/chromium/ui/views/examples/example_combobox_model.cc
+++ b/chromium/ui/views/examples/example_combobox_model.cc
@@ -10,16 +10,16 @@ namespace views {
namespace examples {
ExampleComboboxModel::ExampleComboboxModel(const char* const* strings,
- int count)
+ size_t count)
: strings_(strings), count_(count) {}
ExampleComboboxModel::~ExampleComboboxModel() = default;
-int ExampleComboboxModel::GetItemCount() const {
+size_t ExampleComboboxModel::GetItemCount() const {
return count_;
}
-std::u16string ExampleComboboxModel::GetItemAt(int index) const {
+std::u16string ExampleComboboxModel::GetItemAt(size_t index) const {
return base::ASCIIToUTF16(strings_[index]);
}
diff --git a/chromium/ui/views/examples/example_combobox_model.h b/chromium/ui/views/examples/example_combobox_model.h
index 1bf5177b8c2..483af19c8a1 100644
--- a/chromium/ui/views/examples/example_combobox_model.h
+++ b/chromium/ui/views/examples/example_combobox_model.h
@@ -13,7 +13,7 @@ namespace examples {
class ExampleComboboxModel : public ui::ComboboxModel {
public:
- ExampleComboboxModel(const char* const* strings, int count);
+ ExampleComboboxModel(const char* const* strings, size_t count);
ExampleComboboxModel(const ExampleComboboxModel&) = delete;
ExampleComboboxModel& operator=(const ExampleComboboxModel&) = delete;
@@ -21,12 +21,12 @@ class ExampleComboboxModel : public ui::ComboboxModel {
~ExampleComboboxModel() override;
// ui::ComboboxModel:
- int GetItemCount() const override;
- std::u16string GetItemAt(int index) const override;
+ size_t GetItemCount() const override;
+ std::u16string GetItemAt(size_t index) const override;
private:
const raw_ptr<const char* const> strings_;
- const int count_;
+ const size_t count_;
};
} // namespace examples
diff --git a/chromium/ui/views/examples/examples_color_id.h b/chromium/ui/views/examples/examples_color_id.h
index 6b72b51e1ea..e5c4fb98c53 100644
--- a/chromium/ui/views/examples/examples_color_id.h
+++ b/chromium/ui/views/examples/examples_color_id.h
@@ -74,6 +74,8 @@ enum ExamplesColorIds : ui::ColorId {
};
// clang-format on
+// Note that this second include is not redundant. The second inclusion of the
+// .inc file serves to undefine the macros the first inclusion defined.
#include "ui/color/color_id_macros.inc" // NOLINT
} // namespace views::examples
diff --git a/chromium/ui/views/examples/examples_window.cc b/chromium/ui/views/examples/examples_window.cc
index 98db0d2d79c..ff0ab517e77 100644
--- a/chromium/ui/views/examples/examples_window.cc
+++ b/chromium/ui/views/examples/examples_window.cc
@@ -123,12 +123,12 @@ class ComboboxModelExampleList : public ui::ComboboxModel {
}
// ui::ComboboxModel:
- int GetItemCount() const override { return example_list_.size(); }
- std::u16string GetItemAt(int index) const override {
+ size_t GetItemCount() const override { return example_list_.size(); }
+ std::u16string GetItemAt(size_t index) const override {
return base::UTF8ToUTF16(example_list_[index]->example_title());
}
- View* GetItemViewAt(int index) {
+ View* GetItemViewAt(size_t index) {
return example_list_[index]->example_view();
}
@@ -194,7 +194,7 @@ class ExamplesWindowContents : public WidgetDelegateView {
}
gfx::Size CalculatePreferredSize() const override {
gfx::Size size(800, 300);
- for (int i = 0; i < combobox_model_->GetItemCount(); i++) {
+ for (size_t i = 0; i < combobox_model_->GetItemCount(); i++) {
size.set_height(
std::max(size.height(),
combobox_model_->GetItemViewAt(i)->GetHeightForWidth(800)));
@@ -204,7 +204,7 @@ class ExamplesWindowContents : public WidgetDelegateView {
gfx::Size GetMinimumSize() const override { return gfx::Size(50, 50); }
void ComboboxChanged() {
- int index = combobox_->GetSelectedIndex();
+ size_t index = combobox_->GetSelectedIndex().value();
DCHECK_LT(index, combobox_model_->GetItemCount());
example_shown_->RemoveAllChildViewsWithoutDeleting();
example_shown_->AddChildView(combobox_model_->GetItemViewAt(index));
diff --git a/chromium/ui/views/examples/examples_with_content_main.cc b/chromium/ui/views/examples/examples_with_content_main.cc
index 1052d5bf558..b1841883603 100644
--- a/chromium/ui/views/examples/examples_with_content_main.cc
+++ b/chromium/ui/views/examples/examples_with_content_main.cc
@@ -9,12 +9,14 @@
#include "build/build_config.h"
#include "content/public/browser/browser_context.h"
#include "ui/base/resource/resource_bundle.h"
+#include "ui/views/examples/examples_color_mixer.h"
#include "ui/views/examples/examples_window.h"
#include "ui/views/examples/examples_window_with_content.h"
#include "ui/views_content_client/views_content_client.h"
#if BUILDFLAG(IS_MAC)
#include "sandbox/mac/seatbelt_exec.h"
+#include "ui/display/screen.h"
#endif
#if BUILDFLAG(IS_WIN)
@@ -65,6 +67,13 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t*, int) {
#else
int main(int argc, const char** argv) {
base::CommandLine::Init(argc, argv);
+
+#if BUILDFLAG(IS_MAC)
+ display::ScopedNativeScreen desktop_screen;
+#endif
+ ui::ColorProviderManager::Get().AppendColorProviderInitializer(
+ base::BindRepeating(&views::examples::AddExamplesColorMixers));
+
ui::ViewsContentClient views_content_client(argc, argv);
#endif
diff --git a/chromium/ui/views/examples/flex_layout_example.cc b/chromium/ui/views/examples/flex_layout_example.cc
index 9eaaf1b25eb..4b69a4a4c30 100644
--- a/chromium/ui/views/examples/flex_layout_example.cc
+++ b/chromium/ui/views/examples/flex_layout_example.cc
@@ -110,7 +110,8 @@ FlexSpecification FlexLayoutExample::GetFlexSpecification(int weight) const {
void FlexLayoutExample::OrientationChanged() {
constexpr LayoutOrientation kOrientations[2] = {
LayoutOrientation::kHorizontal, LayoutOrientation::kVertical};
- layout_->SetOrientation(kOrientations[orientation_->GetSelectedIndex()]);
+ layout_->SetOrientation(
+ kOrientations[orientation_->GetSelectedIndex().value()]);
RefreshLayoutPanel(false);
}
@@ -118,7 +119,7 @@ void FlexLayoutExample::MainAxisAlignmentChanged() {
constexpr LayoutAlignment kMainAxisAlignments[3] = {
LayoutAlignment::kStart, LayoutAlignment::kCenter, LayoutAlignment::kEnd};
layout_->SetMainAxisAlignment(
- kMainAxisAlignments[main_axis_alignment_->GetSelectedIndex()]);
+ kMainAxisAlignments[main_axis_alignment_->GetSelectedIndex().value()]);
RefreshLayoutPanel(false);
}
@@ -127,7 +128,7 @@ void FlexLayoutExample::CrossAxisAlignmentChanged() {
LayoutAlignment::kStretch, LayoutAlignment::kStart,
LayoutAlignment::kCenter, LayoutAlignment::kEnd};
layout_->SetCrossAxisAlignment(
- kCrossAxisAlignments[cross_axis_alignment_->GetSelectedIndex()]);
+ kCrossAxisAlignments[cross_axis_alignment_->GetSelectedIndex().value()]);
RefreshLayoutPanel(false);
}
diff --git a/chromium/ui/views/examples/label_example.cc b/chromium/ui/views/examples/label_example.cc
index b28d2739951..37a5fce3ee3 100644
--- a/chromium/ui/views/examples/label_example.cc
+++ b/chromium/ui/views/examples/label_example.cc
@@ -240,13 +240,13 @@ Combobox* LabelExample::AddCombobox(View* parent,
}
void LabelExample::AlignmentChanged() {
- custom_label_->SetHorizontalAlignment(
- static_cast<gfx::HorizontalAlignment>(alignment_->GetSelectedIndex()));
+ custom_label_->SetHorizontalAlignment(static_cast<gfx::HorizontalAlignment>(
+ alignment_->GetSelectedIndex().value()));
}
void LabelExample::ElidingChanged() {
- custom_label_->SetElideBehavior(
- static_cast<gfx::ElideBehavior>(elide_behavior_->GetSelectedIndex()));
+ custom_label_->SetElideBehavior(static_cast<gfx::ElideBehavior>(
+ elide_behavior_->GetSelectedIndex().value()));
}
void LabelExample::OnViewThemeChanged(View* observed_view) {
diff --git a/chromium/ui/views/examples/login_bubble_dialog_example.cc b/chromium/ui/views/examples/login_bubble_dialog_example.cc
index 66fa4f68fb0..aee1c777a4a 100644
--- a/chromium/ui/views/examples/login_bubble_dialog_example.cc
+++ b/chromium/ui/views/examples/login_bubble_dialog_example.cc
@@ -22,8 +22,7 @@
using l10n_util::GetStringUTF16;
using l10n_util::GetStringUTF8;
-namespace views {
-namespace examples {
+namespace views::examples {
namespace {
@@ -163,5 +162,4 @@ void LoginBubbleDialogExample::OnSubmit(std::u16string username,
password_input_->SetText(password);
}
-} // namespace examples
-} // namespace views
+} // namespace views::examples
diff --git a/chromium/ui/views/examples/multiline_example.cc b/chromium/ui/views/examples/multiline_example.cc
index 7d60c6c2ebe..9e4e43f3223 100644
--- a/chromium/ui/views/examples/multiline_example.cc
+++ b/chromium/ui/views/examples/multiline_example.cc
@@ -33,7 +33,7 @@ namespace views::examples {
namespace {
-gfx::Range ClampRange(gfx::Range range, uint32_t max) {
+gfx::Range ClampRange(gfx::Range range, size_t max) {
range.set_start(std::min(range.start(), max));
range.set_end(std::min(range.end(), max));
return range;
diff --git a/chromium/ui/views/examples/notification_example.cc b/chromium/ui/views/examples/notification_example.cc
index 8bff2153ba8..35a0b8ae566 100644
--- a/chromium/ui/views/examples/notification_example.cc
+++ b/chromium/ui/views/examples/notification_example.cc
@@ -72,7 +72,7 @@ void NotificationExample::OnViewAddedToWidget(View* observed_view) {
message_center::RichNotificationData data;
data.settings_button_handler = message_center::SettingsButtonHandler::INLINE;
message_center::Notification notification(
- message_center::NOTIFICATION_TYPE_BASE_FORMAT, "id", u"Title", u"Message",
+ message_center::NOTIFICATION_TYPE_SIMPLE, "id", u"Title", u"Message",
ui::ImageModel::FromImage(CreateTestImage(gfx::Size(80, 80), cp)),
std::u16string(), GURL(),
message_center::NotifierId(
diff --git a/chromium/ui/views/examples/table_example.cc b/chromium/ui/views/examples/table_example.cc
index 114d8a4a207..93a87c81f15 100644
--- a/chromium/ui/views/examples/table_example.cc
+++ b/chromium/ui/views/examples/table_example.cc
@@ -111,14 +111,11 @@ void TableExample::CreateExampleView(View* container) {
.BuildChildren();
}
-int TableExample::RowCount() {
+size_t TableExample::RowCount() {
return 10;
}
-std::u16string TableExample::GetText(int row, int column_id) {
- if (row == -1)
- return std::u16string();
-
+std::u16string TableExample::GetText(size_t row, int column_id) {
const char* const cells[5][4] = {
{"Orange", "Orange", "South America", "$5"},
{"Apple", "Green", "Canada", "$3"},
@@ -129,16 +126,13 @@ std::u16string TableExample::GetText(int row, int column_id) {
return ASCIIToUTF16(cells[row % 5][column_id]);
}
-ui::ImageModel TableExample::GetIcon(int row) {
+ui::ImageModel TableExample::GetIcon(size_t row) {
SkBitmap row_icon = row % 2 ? icon1_ : icon2_;
return ui::ImageModel::FromImageSkia(
gfx::ImageSkia::CreateFrom1xBitmap(row_icon));
}
-std::u16string TableExample::GetTooltip(int row) {
- if (row == -1)
- return std::u16string();
-
+std::u16string TableExample::GetTooltip(size_t row) {
const char* const tooltips[5] = {
"Orange - Orange you glad I didn't say banana?",
"Apple - An apple a day keeps the doctor away",
@@ -151,7 +145,7 @@ std::u16string TableExample::GetTooltip(int row) {
void TableExample::SetObserver(ui::TableModelObserver* observer) {}
-void TableExample::GetGroupRange(int model_index, GroupRange* range) {
+void TableExample::GetGroupRange(size_t model_index, GroupRange* range) {
if (model_index < 2) {
range->start = 0;
range->length = 2;
@@ -165,15 +159,11 @@ void TableExample::GetGroupRange(int model_index, GroupRange* range) {
}
void TableExample::OnSelectionChanged() {
- PrintStatus("Selected: %s",
- base::UTF16ToASCII(GetText(table_->selection_model().active(), 0))
- .c_str());
+ PrintStatus("Selected: %s", SelectedColumnName().c_str());
}
void TableExample::OnDoubleClick() {
- PrintStatus("Double Click: %s",
- base::UTF16ToASCII(GetText(table_->selection_model().active(), 0))
- .c_str());
+ PrintStatus("Double Click: %s", SelectedColumnName().c_str());
}
void TableExample::OnMiddleClick() {}
@@ -196,4 +186,11 @@ void TableExample::OnViewIsDeleting(View* observed_view) {
observer_.Reset();
}
+std::string TableExample::SelectedColumnName() {
+ return table_->selection_model().active().has_value()
+ ? base::UTF16ToASCII(
+ GetText(table_->selection_model().active().value(), 0))
+ : std::string("<None>");
+}
+
} // namespace views::examples
diff --git a/chromium/ui/views/examples/table_example.h b/chromium/ui/views/examples/table_example.h
index 231e45e08d0..16e451b5b3f 100644
--- a/chromium/ui/views/examples/table_example.h
+++ b/chromium/ui/views/examples/table_example.h
@@ -41,14 +41,14 @@ class VIEWS_EXAMPLES_EXPORT TableExample : public ExampleBase,
void CreateExampleView(View* container) override;
// ui::TableModel:
- int RowCount() override;
- std::u16string GetText(int row, int column_id) override;
- ui::ImageModel GetIcon(int row) override;
- std::u16string GetTooltip(int row) override;
+ size_t RowCount() override;
+ std::u16string GetText(size_t row, int column_id) override;
+ ui::ImageModel GetIcon(size_t row) override;
+ std::u16string GetTooltip(size_t row) override;
void SetObserver(ui::TableModelObserver* observer) override;
// TableGrouper:
- void GetGroupRange(int model_index, GroupRange* range) override;
+ void GetGroupRange(size_t model_index, GroupRange* range) override;
// TableViewObserver:
void OnSelectionChanged() override;
@@ -61,6 +61,8 @@ class VIEWS_EXAMPLES_EXPORT TableExample : public ExampleBase,
void OnViewIsDeleting(View* observed_view) override;
private:
+ std::string SelectedColumnName();
+
// The table to be tested.
raw_ptr<TableView> table_ = nullptr;
diff --git a/chromium/ui/views/examples/text_example.cc b/chromium/ui/views/examples/text_example.cc
index ba6b44f23dc..2fd82fbd7c4 100644
--- a/chromium/ui/views/examples/text_example.cc
+++ b/chromium/ui/views/examples/text_example.cc
@@ -228,7 +228,7 @@ void TextExample::AlignComboboxChanged() {
int flags = text_view_->GetFlags() &
~(gfx::Canvas::TEXT_ALIGN_LEFT | gfx::Canvas::TEXT_ALIGN_CENTER |
gfx::Canvas::TEXT_ALIGN_RIGHT);
- switch (h_align_cb_->GetSelectedIndex()) {
+ switch (h_align_cb_->GetSelectedIndex().value()) {
case 0:
break;
case 1:
@@ -245,7 +245,7 @@ void TextExample::AlignComboboxChanged() {
}
void TextExample::TextComboboxChanged() {
- switch (text_cb_->GetSelectedIndex()) {
+ switch (text_cb_->GetSelectedIndex().value()) {
case 0:
text_view_->SetText(u"The quick brown fox jumps over the lazy dog.");
break;
@@ -279,7 +279,7 @@ void TextExample::TextComboboxChanged() {
}
void TextExample::ElideComboboxChanged() {
- switch (eliding_cb_->GetSelectedIndex()) {
+ switch (eliding_cb_->GetSelectedIndex().value()) {
case 0:
text_view_->SetElide(gfx::ELIDE_TAIL);
break;
@@ -292,7 +292,7 @@ void TextExample::ElideComboboxChanged() {
void TextExample::PrefixComboboxChanged() {
int flags = text_view_->GetFlags() &
~(gfx::Canvas::SHOW_PREFIX | gfx::Canvas::HIDE_PREFIX);
- switch (prefix_cb_->GetSelectedIndex()) {
+ switch (prefix_cb_->GetSelectedIndex().value()) {
case 0:
break;
case 1:
@@ -313,7 +313,7 @@ void TextExample::WeightComboboxChanged() {
gfx::Font::Weight::BOLD, gfx::Font::Weight::EXTRA_BOLD,
gfx::Font::Weight::BLACK,
};
- text_view_->SetWeight(kFontWeights[weight_cb_->GetSelectedIndex()]);
+ text_view_->SetWeight(kFontWeights[weight_cb_->GetSelectedIndex().value()]);
}
} // namespace examples
diff --git a/chromium/ui/views/focus/focus_manager.cc b/chromium/ui/views/focus/focus_manager.cc
index ed6ed43bace..a4780a93369 100644
--- a/chromium/ui/views/focus/focus_manager.cc
+++ b/chromium/ui/views/focus/focus_manager.cc
@@ -95,13 +95,13 @@ bool FocusManager::OnKeyEvent(const ui::KeyEvent& event) {
View::Views::const_iterator i(
std::find(views.begin(), views.end(), focused_view_));
DCHECK(i != views.end());
- size_t index = i - views.begin();
+ auto index = static_cast<size_t>(i - views.begin());
if (next && index == views.size() - 1)
index = 0;
else if (!next && index == 0)
index = views.size() - 1;
else
- index += next ? 1 : -1;
+ index = next ? (index + 1) : (index - 1);
SetFocusedViewWithReason(views[index],
FocusChangeReason::kFocusTraversal);
return false;
@@ -169,13 +169,13 @@ bool FocusManager::RotatePaneFocus(Direction direction,
// Count the number of panes and set the default index if no pane
// is initially focused.
- if (panes.empty())
+ const size_t count = panes.size();
+ if (!count)
return false;
- int count = static_cast<int>(panes.size());
// Initialize |index| to an appropriate starting index if nothing is
// focused initially.
- int index = direction == Direction::kBackward ? 0 : count - 1;
+ size_t index = (direction == Direction::kBackward) ? 0 : (count - 1);
// Check to see if a pane already has focus and update the index accordingly.
const views::View* focused_view = GetFocusedView();
@@ -185,41 +185,35 @@ bool FocusManager::RotatePaneFocus(Direction direction,
return pane && pane->Contains(focused_view);
});
if (i != panes.cend())
- index = i - panes.cbegin();
+ index = static_cast<size_t>(i - panes.cbegin());
}
// Rotate focus.
- int start_index = index;
- for (;;) {
- if (direction == Direction::kBackward)
- index--;
- else
- index++;
-
- if (wrapping == FocusCycleWrapping::kDisabled &&
- (index >= count || index < 0))
+ for (const size_t start_index = index;;) {
+ index = ((direction == Direction::kBackward) ? (index + count - 1)
+ : (index + 1)) %
+ count;
+
+ if ((wrapping == FocusCycleWrapping::kDisabled) &&
+ (index == ((direction == Direction::kBackward) ? (count - 1) : 0))) {
return false;
- index = (index + count) % count;
+ }
// Ensure that we don't loop more than once.
if (index == start_index)
- break;
+ return false;
views::View* pane = panes[index];
DCHECK(pane);
-
- if (!pane->GetVisible())
- continue;
-
- pane->RequestFocus();
- // |pane| may be in a different widget, so don't assume its focus manager
- // is |this|.
- focused_view = pane->GetWidget()->GetFocusManager()->GetFocusedView();
- if (pane == focused_view || pane->Contains(focused_view))
- return true;
+ if (pane->GetVisible()) {
+ pane->RequestFocus();
+ // |pane| may be in a different widget, so don't assume its focus manager
+ // is |this|.
+ focused_view = pane->GetWidget()->GetFocusManager()->GetFocusedView();
+ if (pane == focused_view || pane->Contains(focused_view))
+ return true;
+ }
}
-
- return false;
}
View* FocusManager::GetNextFocusableView(View* original_starting_view,
@@ -489,31 +483,25 @@ View* FocusManager::FindFocusableView(FocusTraversable* focus_traversable,
bool reverse) {
FocusTraversable* new_focus_traversable = nullptr;
View* new_starting_view = nullptr;
- auto can_go_into_anchored_dialog =
+ const FocusSearch::AnchoredDialogPolicy can_go_into_anchored_dialog =
FocusSearch::AnchoredDialogPolicy::kCanGoIntoAnchoredDialog;
- View* v = focus_traversable->GetFocusSearch()->FindNextFocusableView(
- starting_view,
+ const FocusSearch::SearchDirection search_direction =
reverse ? FocusSearch::SearchDirection::kBackwards
- : FocusSearch::SearchDirection::kForwards,
- FocusSearch::TraversalDirection::kDown,
- FocusSearch::StartingViewPolicy::kSkipStartingView,
- can_go_into_anchored_dialog, &new_focus_traversable, &new_starting_view);
+ : FocusSearch::SearchDirection::kForwards;
+ View* v = nullptr;
// Let's go down the FocusTraversable tree as much as we can.
- while (new_focus_traversable) {
- DCHECK(!v);
- focus_traversable = new_focus_traversable;
- new_focus_traversable = nullptr;
- starting_view = nullptr;
+ do {
v = focus_traversable->GetFocusSearch()->FindNextFocusableView(
- starting_view,
- reverse ? FocusSearch::SearchDirection::kBackwards
- : FocusSearch::SearchDirection::kForwards,
- FocusSearch::TraversalDirection::kDown,
+ starting_view, search_direction, FocusSearch::TraversalDirection::kDown,
FocusSearch::StartingViewPolicy::kSkipStartingView,
can_go_into_anchored_dialog, &new_focus_traversable,
&new_starting_view);
- }
+ DCHECK(!new_focus_traversable || !v);
+ focus_traversable = std::exchange(new_focus_traversable, nullptr);
+ starting_view = nullptr;
+ } while (focus_traversable);
+
return v;
}
diff --git a/chromium/ui/views/focus/focus_manager_unittest.cc b/chromium/ui/views/focus/focus_manager_unittest.cc
index bbea12773fd..de216f089c7 100644
--- a/chromium/ui/views/focus/focus_manager_unittest.cc
+++ b/chromium/ui/views/focus/focus_manager_unittest.cc
@@ -30,6 +30,7 @@
#include "ui/views/test/test_platform_native_widget.h"
#include "ui/views/test/widget_test.h"
#include "ui/views/view_class_properties.h"
+#include "ui/views/widget/unique_widget_ptr.h"
#include "ui/views/widget/widget.h"
#if defined(USE_AURA)
@@ -157,17 +158,18 @@ TEST_F(FocusManagerTest, WidgetFocusChangeListener) {
TestWidgetFocusChangeListener widget_listener;
AddWidgetFocusChangeListener(&widget_listener);
- Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- params.bounds = gfx::Rect(10, 10, 100, 100);
- params.parent = GetWidget()->GetNativeView();
-
- std::unique_ptr<Widget> widget1(new Widget);
- widget1->Init(std::move(params));
+ Widget::InitParams params1 = CreateParams(Widget::InitParams::TYPE_WINDOW);
+ params1.bounds = gfx::Rect(10, 10, 100, 100);
+ params1.parent = GetWidget()->GetNativeView();
+ UniqueWidgetPtr widget1 = std::make_unique<Widget>();
+ widget1->Init(std::move(params1));
widget1->Show();
- std::unique_ptr<Widget> widget2(new Widget);
- widget2->Init(std::move(params));
+ Widget::InitParams params2 = CreateParams(Widget::InitParams::TYPE_WINDOW);
+ params2.bounds = gfx::Rect(10, 10, 100, 100);
+ params2.parent = GetWidget()->GetNativeView();
+ UniqueWidgetPtr widget2 = std::make_unique<Widget>();
+ widget2->Init(std::move(params2));
widget2->Show();
widget_listener.ClearFocusChanges();
@@ -914,25 +916,27 @@ TEST_F(FocusManagerTest, AdvanceFocusStaysInWidget) {
GetContentsView()->AddChildView(widget_view);
// Create a widget with two views, focus the second.
- std::unique_ptr<AdvanceFocusWidgetDelegate> delegate;
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.child = true;
params.bounds = gfx::Rect(10, 10, 100, 100);
params.parent = GetWidget()->GetNativeView();
- Widget child_widget;
- delegate = std::make_unique<AdvanceFocusWidgetDelegate>(&child_widget);
- params.delegate = delegate.get();
- child_widget.Init(std::move(params));
+ UniqueWidgetPtr child_widget = std::make_unique<Widget>();
+ std::unique_ptr<AdvanceFocusWidgetDelegate> delegate_owned =
+ std::make_unique<AdvanceFocusWidgetDelegate>(child_widget.get());
+ AdvanceFocusWidgetDelegate* delegate = delegate_owned.get();
+ params.delegate = delegate_owned.release();
+ delegate->SetOwnedByWidget(true);
+ child_widget->Init(std::move(params));
+
View* view1 = new View;
view1->SetFocusBehavior(View::FocusBehavior::ALWAYS);
view1->SetBounds(0, 0, 20, 20);
View* view2 = new View;
view2->SetFocusBehavior(View::FocusBehavior::ALWAYS);
view2->SetBounds(20, 0, 20, 20);
- child_widget.client_view()->AddChildView(view1);
- child_widget.client_view()->AddChildView(view2);
- child_widget.Show();
+ child_widget->client_view()->AddChildView(view1);
+ child_widget->client_view()->AddChildView(view2);
+ child_widget->Show();
view2->RequestFocus();
EXPECT_EQ(view2, GetFocusManager()->GetFocusedView());
@@ -947,12 +951,6 @@ TEST_F(FocusManagerTest, AdvanceFocusStaysInWidget) {
// And forward again, wrapping back to |view1|.
GetFocusManager()->AdvanceFocus(true);
EXPECT_EQ(view1, GetFocusManager()->GetFocusedView());
-
- // Allow focus to go to the parent, and focus backwards which should now move
- // up |widget_view| (in the parent).
- delegate->SetFocusTraversesOut(true);
- GetFocusManager()->AdvanceFocus(true);
- EXPECT_EQ(widget_view, GetFocusManager()->GetFocusedView());
}
TEST_F(FocusManagerTest, NavigateIntoAnchoredDialog) {
@@ -1123,13 +1121,12 @@ class DesktopWidgetFocusManagerTest : public FocusManagerTest {
};
TEST_F(DesktopWidgetFocusManagerTest, AnchoredDialogInDesktopNativeWidgetAura) {
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(0, 0, 1024, 768);
- widget.Init(std::move(params));
- widget.Show();
- widget.Activate();
+ widget->Init(std::move(params));
+ widget->Show();
+ widget->Activate();
View* parent1 = new View();
View* parent2 = new View();
@@ -1137,8 +1134,8 @@ TEST_F(DesktopWidgetFocusManagerTest, AnchoredDialogInDesktopNativeWidgetAura) {
parent1->SetFocusBehavior(View::FocusBehavior::ALWAYS);
parent2->SetFocusBehavior(View::FocusBehavior::ALWAYS);
- widget.GetRootView()->AddChildView(parent1);
- widget.GetRootView()->AddChildView(parent2);
+ widget->GetRootView()->AddChildView(parent1);
+ widget->GetRootView()->AddChildView(parent2);
TestBubbleDialogDelegateView* bubble_delegate =
TestBubbleDialogDelegateView::CreateAndShowBubble(parent2);
@@ -1156,24 +1153,24 @@ TEST_F(DesktopWidgetFocusManagerTest, AnchoredDialogInDesktopNativeWidgetAura) {
parent2->SetProperty(views::kSkipAccessibilityPaintChecks, true);
child->SetProperty(views::kSkipAccessibilityPaintChecks, true);
- widget.Activate();
+ widget->Activate();
parent1->RequestFocus();
base::RunLoop().RunUntilIdle();
// Initially the outer widget's window is focused.
aura::client::FocusClient* focus_client =
- aura::client::GetFocusClient(widget.GetNativeView());
- ASSERT_EQ(widget.GetNativeView(), focus_client->GetFocusedWindow());
+ aura::client::GetFocusClient(widget->GetNativeView());
+ ASSERT_EQ(widget->GetNativeView(), focus_client->GetFocusedWindow());
// Navigate forwards
- widget.GetFocusManager()->AdvanceFocus(false);
+ widget->GetFocusManager()->AdvanceFocus(false);
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(parent2->HasFocus());
- widget.GetFocusManager()->AdvanceFocus(false);
+ widget->GetFocusManager()->AdvanceFocus(false);
EXPECT_TRUE(child->HasFocus());
// Now the bubble widget's window is focused.
- ASSERT_NE(widget.GetNativeView(), focus_client->GetFocusedWindow());
+ ASSERT_NE(widget->GetNativeView(), focus_client->GetFocusedWindow());
ASSERT_EQ(bubble_widget->GetNativeView(), focus_client->GetFocusedWindow());
// Navigate backwards
@@ -1181,7 +1178,7 @@ TEST_F(DesktopWidgetFocusManagerTest, AnchoredDialogInDesktopNativeWidgetAura) {
EXPECT_TRUE(parent2->HasFocus());
// Finally, the outer widget's window should be focused again.
- ASSERT_EQ(widget.GetNativeView(), focus_client->GetFocusedWindow());
+ ASSERT_EQ(widget->GetNativeView(), focus_client->GetFocusedWindow());
}
#endif
diff --git a/chromium/ui/views/focus/focus_traversal_unittest.cc b/chromium/ui/views/focus/focus_traversal_unittest.cc
index b062402f066..0bd3edd50b0 100644
--- a/chromium/ui/views/focus/focus_traversal_unittest.cc
+++ b/chromium/ui/views/focus/focus_traversal_unittest.cc
@@ -93,8 +93,8 @@ enum {
class DummyComboboxModel : public ui::ComboboxModel {
public:
// Overridden from ui::ComboboxModel:
- int GetItemCount() const override { return 10; }
- std::u16string GetItemAt(int index) const override {
+ size_t GetItemCount() const override { return 10; }
+ std::u16string GetItemAt(size_t index) const override {
return u"Item " + base::NumberToString16(index);
}
};
@@ -155,11 +155,12 @@ class BorderView : public NativeViewHost {
if (details.child == this && details.is_add) {
if (!widget_) {
- widget_ = std::make_unique<Widget>();
+ auto widget = std::make_unique<Widget>();
+ widget_ = widget.get();
Widget::InitParams params(Widget::InitParams::TYPE_CONTROL);
params.parent = details.parent->GetWidget()->GetNativeView();
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget_->Init(std::move(params));
+ widget.release(); // Widget now owned by widget hierarchy.
widget_->SetFocusTraversableParentView(this);
widget_->SetContentsView(std::move(child_));
}
@@ -174,7 +175,7 @@ class BorderView : public NativeViewHost {
private:
std::unique_ptr<View> child_;
- std::unique_ptr<Widget> widget_;
+ Widget* widget_ = nullptr;
};
} // namespace
diff --git a/chromium/ui/views/highlight_border.cc b/chromium/ui/views/highlight_border.cc
index cd9845cc3ab..96fd3dd4710 100644
--- a/chromium/ui/views/highlight_border.cc
+++ b/chromium/ui/views/highlight_border.cc
@@ -4,7 +4,7 @@
#include "ui/views/highlight_border.h"
-#include "ash/constants/ash_features.h"
+#include "chromeos/constants/chromeos_features.h"
#include "ui/color/color_id.h"
#include "ui/color/color_provider.h"
#include "ui/gfx/canvas.h"
@@ -19,17 +19,15 @@ namespace views {
// static
void HighlightBorder::PaintBorderToCanvas(
gfx::Canvas* canvas,
- const views::View& view,
+ SkColor highlight_color,
+ SkColor border_color,
const gfx::Rect& bounds,
const gfx::RoundedCornersF& corner_radii,
Type type,
bool use_light_colors) {
- SkColor inner_color = GetHighlightColor(view, type, use_light_colors);
- SkColor outer_color = GetBorderColor(view, type, use_light_colors);
-
cc::PaintFlags flags;
flags.setStrokeWidth(kHighlightBorderThickness);
- flags.setColor(outer_color);
+ flags.setColor(border_color);
flags.setStyle(cc::PaintFlags::kStroke_Style);
flags.setAntiAlias(true);
@@ -56,13 +54,26 @@ void HighlightBorder::PaintBorderToCanvas(
gfx::RectF inner_border_bounds(pixel_bounds);
inner_border_bounds.Inset(kHighlightBorderThickness);
inner_border_bounds.Inset(half_thickness);
- flags.setColor(inner_color);
+ flags.setColor(highlight_color);
SkPath inner_path;
inner_path.addRoundRect(gfx::RectFToSkRect(inner_border_bounds), radii);
canvas->DrawPath(inner_path, flags);
}
// static
+void HighlightBorder::PaintBorderToCanvas(
+ gfx::Canvas* canvas,
+ const views::View& view,
+ const gfx::Rect& bounds,
+ const gfx::RoundedCornersF& corner_radii,
+ Type type,
+ bool use_light_colors) {
+ PaintBorderToCanvas(canvas, GetHighlightColor(view, type, use_light_colors),
+ GetBorderColor(view, type, use_light_colors), bounds,
+ corner_radii, type, use_light_colors);
+}
+
+// static
SkColor HighlightBorder::GetHighlightColor(const views::View& view,
HighlightBorder::Type type,
bool use_light_colors) {
@@ -71,14 +82,24 @@ SkColor HighlightBorder::GetHighlightColor(const views::View& view,
// TODO(crbug/1319917): These light color values are used here since we want
// to use light colors when dark/light mode feature is not enabled. This
// should be removed after dark light mode is launched.
- DCHECK(!ash::features::IsDarkLightModeEnabled());
+ DCHECK(!chromeos::features::IsDarkLightModeEnabled());
+ // `kHighlightBorder3` can only be used when the dark light mode is enabled.
+ DCHECK(type != HighlightBorder::Type::kHighlightBorder3);
highlight_color_id = type == HighlightBorder::Type::kHighlightBorder1
? ui::kColorAshSystemUILightHighlightColor1
: ui::kColorAshSystemUILightHighlightColor2;
} else {
- highlight_color_id = type == HighlightBorder::Type::kHighlightBorder1
- ? ui::kColorAshSystemUIHighlightColor1
- : ui::kColorAshSystemUIHighlightColor2;
+ switch (type) {
+ case HighlightBorder::Type::kHighlightBorder1:
+ highlight_color_id = ui::kColorHighlightBorderHighlight1;
+ break;
+ case HighlightBorder::Type::kHighlightBorder2:
+ highlight_color_id = ui::kColorHighlightBorderHighlight2;
+ break;
+ case HighlightBorder::Type::kHighlightBorder3:
+ highlight_color_id = ui::kColorHighlightBorderHighlight3;
+ break;
+ }
}
// `view` should be embedded in a Widget to use color provider.
@@ -95,14 +116,24 @@ SkColor HighlightBorder::GetBorderColor(const views::View& view,
// TODO(crbug/1319917): These light color values are used here since we want
// to use light colors when dark/light mode feature is not enabled. This
// should be removed after dark light mode is launched.
- DCHECK(!ash::features::IsDarkLightModeEnabled());
+ DCHECK(!chromeos::features::IsDarkLightModeEnabled());
+ // `kHighlightBorder3` can only be used when the dark light mode is enabled.
+ DCHECK(type != HighlightBorder::Type::kHighlightBorder3);
border_color_id = type == HighlightBorder::Type::kHighlightBorder1
? ui::kColorAshSystemUILightBorderColor1
: ui::kColorAshSystemUILightBorderColor2;
} else {
- border_color_id = type == HighlightBorder::Type::kHighlightBorder1
- ? ui::kColorAshSystemUIBorderColor1
- : ui::kColorAshSystemUIBorderColor2;
+ switch (type) {
+ case HighlightBorder::Type::kHighlightBorder1:
+ border_color_id = ui::kColorHighlightBorderBorder1;
+ break;
+ case HighlightBorder::Type::kHighlightBorder2:
+ border_color_id = ui::kColorHighlightBorderBorder2;
+ break;
+ case HighlightBorder::Type::kHighlightBorder3:
+ border_color_id = ui::kColorHighlightBorderBorder3;
+ break;
+ }
}
// `view` should be embedded in a Widget to use color provider.
diff --git a/chromium/ui/views/highlight_border.h b/chromium/ui/views/highlight_border.h
index a8a2ff9ca48..1f452349868 100644
--- a/chromium/ui/views/highlight_border.h
+++ b/chromium/ui/views/highlight_border.h
@@ -29,6 +29,12 @@ class VIEWS_EXPORT HighlightBorder : public views::Border {
// A less contrast highlight border for components that float above a
// shield.
kHighlightBorder2,
+ // Has same inner border color as `kHighlightBorder1`. The outer color is
+ // same in dark and light mode with low opacity. This type is mainly used
+ // with `HighlightBorderLayerOverlay` whose outer border is outside the
+ // window contents. For more information, refer to the comment of
+ // `HighlightBorderOverlay`.
+ kHighlightBorder3,
};
// The type of insets created by this highlight border. The insets shrink the
@@ -47,6 +53,18 @@ class VIEWS_EXPORT HighlightBorder : public views::Border {
kFullInsets,
};
+ // Paints the highlight border onto `canvas` with given highlight and border
+ // border color. Note that directly using this function won't set the insets
+ // on any view so it acts like setting kNoInsets when using HighlightBorder
+ // class.
+ static void PaintBorderToCanvas(gfx::Canvas* canvas,
+ SkColor highlight_color,
+ SkColor border_color,
+ const gfx::Rect& bounds,
+ const gfx::RoundedCornersF& corner_radii,
+ Type type,
+ bool use_light_colors);
+
// Paints the highlight border onto `canvas` for the specified `view`. The
// color of the border will be determined using `view`'s color provider. Note
// that directly using this function won't set the insets on any view so it
diff --git a/chromium/ui/views/interaction/element_tracker_views_unittest.cc b/chromium/ui/views/interaction/element_tracker_views_unittest.cc
index 00ffc1cdd24..1bcf1aa31be 100644
--- a/chromium/ui/views/interaction/element_tracker_views_unittest.cc
+++ b/chromium/ui/views/interaction/element_tracker_views_unittest.cc
@@ -106,7 +106,9 @@ class ElementEventWatcher {
const ElementEventType event_type_;
ui::ElementTracker::Subscription subscription_;
int event_count_ = 0;
- raw_ptr<View> last_view_ = nullptr;
+ // TODO(crbug.com/1298696): views_unittests breaks with MTECheckedPtr
+ // enabled. Triage.
+ raw_ptr<View, DegradeToNoOpWhenMTE> last_view_ = nullptr;
};
ElementTrackerViews::ViewList ElementsToViews(
diff --git a/chromium/ui/views/interaction/interaction_sequence_views_unittest.cc b/chromium/ui/views/interaction/interaction_sequence_views_unittest.cc
index 3936e915979..4ff6c40cd87 100644
--- a/chromium/ui/views/interaction/interaction_sequence_views_unittest.cc
+++ b/chromium/ui/views/interaction/interaction_sequence_views_unittest.cc
@@ -166,7 +166,7 @@ class InteractionSequenceViewsTest : public ViewsTestBase {
menu_model_->AddItem(kMenuID1, kMenuItem1);
menu_model_->AddItem(kMenuID2, kMenuItem2);
menu_model_->SetElementIdentifierAt(
- menu_model_->GetIndexOfCommandId(kMenuID2), id);
+ menu_model_->GetIndexOfCommandId(kMenuID2).value(), id);
menu_runner_ =
std::make_unique<MenuRunner>(menu_model_.get(), MenuRunner::NO_FLAGS);
diff --git a/chromium/ui/views/layout/animating_layout_manager.cc b/chromium/ui/views/layout/animating_layout_manager.cc
index f3dbee0e7ad..8b242824ee4 100644
--- a/chromium/ui/views/layout/animating_layout_manager.cc
+++ b/chromium/ui/views/layout/animating_layout_manager.cc
@@ -735,7 +735,7 @@ void AnimatingLayoutManager::UpdateCurrentLayout(double percent) {
for (const LayoutFadeInfo& fade_info : fade_infos_) {
// This shouldn't happen but we should ensure that with a check.
- DCHECK_NE(-1, host_view()->GetIndexOf(fade_info.child_view));
+ DCHECK(host_view()->GetIndexOf(fade_info.child_view).has_value());
// Views that were previously fading are animated as normal, so nothing to
// do here.
@@ -947,7 +947,7 @@ void AnimatingLayoutManager::ResolveFades() {
for (const LayoutFadeInfo& fade_info : fade_infos_) {
View* const child = fade_info.child_view;
if (fade_info.fade_type == LayoutFadeType::kFadingOut &&
- host_view()->GetIndexOf(child) >= 0 &&
+ host_view()->GetIndexOf(child).has_value() &&
!IsChildViewIgnoredByLayout(child) && !IsChildIncludedInLayout(child)) {
SetViewVisibility(child, false);
}
diff --git a/chromium/ui/views/layout/box_layout.h b/chromium/ui/views/layout/box_layout.h
index a12c0a60a3a..a84224b5c48 100644
--- a/chromium/ui/views/layout/box_layout.h
+++ b/chromium/ui/views/layout/box_layout.h
@@ -210,7 +210,7 @@ class VIEWS_EXPORT BoxLayout : public LayoutManager {
bool VisibleToLayout() const;
private:
- raw_ptr<View> view_ = nullptr;
+ raw_ptr<View, DanglingUntriaged> view_ = nullptr;
raw_ptr<const BoxLayout> layout_ = nullptr;
gfx::Insets margins_;
};
diff --git a/chromium/ui/views/layout/composite_layout_tests.cc b/chromium/ui/views/layout/composite_layout_tests.cc
index 78e9238d07d..6e5df03dfb3 100644
--- a/chromium/ui/views/layout/composite_layout_tests.cc
+++ b/chromium/ui/views/layout/composite_layout_tests.cc
@@ -199,12 +199,10 @@ class SimulatedExtensionsContainer : public SimulatedToolbarElement {
}
}
- void MoveIcon(int from, int to) {
- DCHECK_GE(from, 0);
- DCHECK_GE(to, 0);
+ void MoveIcon(size_t from, size_t to) {
DCHECK_NE(from, to);
- DCHECK_LT(from, static_cast<int>(children().size()) - 1);
- DCHECK_LT(to, static_cast<int>(children().size()) - 1);
+ DCHECK_LT(from, children().size() - 1);
+ DCHECK_LT(to, children().size() - 1);
ReorderChildView(children()[from], to);
}
diff --git a/chromium/ui/views/layout/flex_layout.cc b/chromium/ui/views/layout/flex_layout.cc
index 2a54df34b71..652bc27398b 100644
--- a/chromium/ui/views/layout/flex_layout.cc
+++ b/chromium/ui/views/layout/flex_layout.cc
@@ -1107,7 +1107,7 @@ void FlexLayout::AllocateZeroWeightFlex(
// this priority order.
auto it = child_list.begin();
while (it != child_list.end()) {
- const int child_index = *it;
+ const size_t child_index = *it;
FlexChildData& flex_child = data.child_data[child_index];
// We don't care about weighted flex in this step.
diff --git a/chromium/ui/views/layout/layout_manager_base.cc b/chromium/ui/views/layout/layout_manager_base.cc
index b380e9cc2fd..101d559e0ee 100644
--- a/chromium/ui/views/layout/layout_manager_base.cc
+++ b/chromium/ui/views/layout/layout_manager_base.cc
@@ -172,7 +172,7 @@ void LayoutManagerBase::ApplyLayout(const ProposedLayout& layout) {
// a non-const reference to the child.
View* const child_view = child_layout.child_view;
// Should not be attempting to modify a child view that has been removed.
- DCHECK_GE(host_view()->GetIndexOf(child_view), 0);
+ DCHECK(host_view()->GetIndexOf(child_view).has_value());
if (child_view->GetVisible() != child_layout.visible)
SetViewVisibility(child_view, child_layout.visible);
diff --git a/chromium/ui/views/layout/table_layout.cc b/chromium/ui/views/layout/table_layout.cc
index 01e1f3744d4..c1c33ae2dd8 100644
--- a/chromium/ui/views/layout/table_layout.cc
+++ b/chromium/ui/views/layout/table_layout.cc
@@ -109,9 +109,9 @@ template <class T>
int TotalSize(size_t start, size_t length, const std::vector<T>& elements) {
DCHECK_GT(length, 0u);
DCHECK_LE(start + length, elements.size());
- const auto begin = elements.cbegin() + start;
+ const auto begin = elements.cbegin() + static_cast<ptrdiff_t>(start);
return std::accumulate(
- begin, begin + length, 0,
+ begin, begin + static_cast<ptrdiff_t>(length), 0,
[](int size, const auto& elem) { return size + elem.size(); });
}
@@ -456,8 +456,8 @@ void TableLayout::SetViewStates() const {
// Construct a ViewState for this `child`.
const gfx::Size* span = child->GetProperty(kTableColAndRowSpanKey);
- const size_t col_span = span ? span->width() : 1;
- const size_t row_span = span ? span->height() : 1;
+ const size_t col_span = span ? static_cast<size_t>(span->width()) : 1;
+ const size_t row_span = span ? static_cast<size_t>(span->height()) : 1;
LayoutAlignment* const child_h_align =
child->GetProperty(kTableHorizAlignKey);
const LayoutAlignment h_align =
@@ -589,8 +589,9 @@ void TableLayout::DistributeRemainingHeight(ViewState& view_state) const {
// Determine the number of resizable rows the view touches.
size_t start_row = view_state.start_row;
size_t max_row = view_state.start_row + view_state.row_span;
- const int resizable_rows =
- std::count_if(rows_.cbegin() + start_row, rows_.cbegin() + max_row,
+ const ptrdiff_t resizable_rows =
+ std::count_if(rows_.cbegin() + static_cast<ptrdiff_t>(start_row),
+ rows_.cbegin() + static_cast<ptrdiff_t>(max_row),
[](const auto& row) { return row.resizable(); });
const auto adjust_row = [&height](Row& row, int delta) {
@@ -603,7 +604,7 @@ void TableLayout::DistributeRemainingHeight(ViewState& view_state) const {
if (resizable_rows > 0) {
// There are resizable rows, give the remaining height to them.
- int row_delta = height / resizable_rows;
+ int row_delta = height / static_cast<int>(resizable_rows);
for (size_t i = start_row; i < max_row; ++i) {
if (rows_[i].resizable())
adjust_row(rows_[i], row_delta);
@@ -611,7 +612,7 @@ void TableLayout::DistributeRemainingHeight(ViewState& view_state) const {
} else {
// None of the rows are resizable, divvy the remaining height up equally
// among all rows the view touches.
- int row_delta = height / view_state.row_span;
+ int row_delta = height / static_cast<int>(view_state.row_span);
for (size_t i = start_row; i < max_row; ++i)
adjust_row(rows_[i], row_delta);
view_state.remaining_height = 0;
@@ -666,7 +667,7 @@ void TableLayout::DistributeRemainingWidth(ViewState& view_state) const {
} else if (pref_size_columns > 0) {
// None of the columns are resizable, distribute the width among those
// that use the preferred size.
- int column_delta = width / pref_size_columns;
+ int column_delta = width / static_cast<int>(pref_size_columns);
for (size_t i = start_col; i < max_col; ++i) {
if (columns_[i].size_type() == ColumnSize::kUsePreferred) {
width -= column_delta;
@@ -701,7 +702,7 @@ void TableLayout::CalculateSize(
if (size.height() > view_state->height)
size.set_height(view_state->height);
} else {
- size = view_state->view->GetPreferredSize();
+ size = view_state->view->GetPreferredSize({/* Unbounded */});
view_state->pref_size = size;
}
view_state->remaining_width = view_state->width = size.width();
@@ -830,7 +831,7 @@ void TableLayout::ResizeUsingMin(int total_delta) const {
if (data.available == 0) {
data.column->set_size(data.column->size() - data.delta);
next_iteration_total_resize -= data.column->resize();
- resize_data.erase(resize_data.begin() + (i - 1));
+ resize_data.erase(resize_data.begin() + static_cast<ptrdiff_t>(i - 1));
}
}
DCHECK_LT(next_iteration_delta, total_delta);
@@ -843,10 +844,13 @@ void TableLayout::ResizeUsingMin(int total_delta) const {
}
bool TableLayout::CanUseMinimum(const ViewState& view_state) const {
- const auto begin = columns_.cbegin() + view_state.start_col;
- return std::all_of(begin, begin + view_state.col_span, [](const auto& col) {
- return col.resizable() && col.size_type() != ColumnSize::kFixed;
- });
+ const auto begin =
+ columns_.cbegin() + static_cast<ptrdiff_t>(view_state.start_col);
+ return std::any_of(begin, begin + static_cast<ptrdiff_t>(view_state.col_span),
+ [](const auto& col) {
+ return col.resizable() &&
+ col.size_type() != ColumnSize::kFixed;
+ });
}
} // namespace views
diff --git a/chromium/ui/views/layout/table_layout.h b/chromium/ui/views/layout/table_layout.h
index 5c97f5a8189..cff3d3ddd08 100644
--- a/chromium/ui/views/layout/table_layout.h
+++ b/chromium/ui/views/layout/table_layout.h
@@ -181,7 +181,8 @@ class VIEWS_EXPORT TableLayout : public LayoutManagerBase {
// target width.
void ResizeUsingMin(int delta) const;
- // Only use the minimum size if all the columns the view is in are resizable.
+ // Only use the minimum size if any of the columns the view is in
+ // is resizable. Fixed columns will retain their fixed width.
bool CanUseMinimum(const ViewState& view_state) const;
// Columns.
diff --git a/chromium/ui/views/layout/table_layout_unittest.cc b/chromium/ui/views/layout/table_layout_unittest.cc
index 53151b52f03..0ec60d4ee81 100644
--- a/chromium/ui/views/layout/table_layout_unittest.cc
+++ b/chromium/ui/views/layout/table_layout_unittest.cc
@@ -572,6 +572,72 @@ TEST_F(TableLayoutTest, ColumnSpanResizing) {
ExpectViewBoundsEquals(4, 40, 8, 40, view2);
}
+// Make sure that for views that span both fixed and resizable columns the
+// underlying resiable column is resized and the fixed sized column is not.
+TEST_F(TableLayoutTest, ColumnSpanResizing2) {
+ layout()
+ .AddColumn(LayoutAlignment::kStretch, LayoutAlignment::kCenter, 1.0f,
+ TableLayout::ColumnSize::kUsePreferred, 0, 0)
+ .AddColumn(LayoutAlignment::kStretch, LayoutAlignment::kCenter,
+ TableLayout::kFixedSize, TableLayout::ColumnSize::kFixed, 10,
+ 0)
+ .AddRows(2, TableLayout::kFixedSize);
+ View* span_view = host()->AddChildView(
+ CreateViewWithMinAndPref(gfx::Size(20, 40), gfx::Size(80, 40)));
+ span_view->SetProperty(kTableColAndRowSpanKey, gfx::Size(2, 1));
+
+ auto* view1 = host()->AddChildView(CreateSizedView(gfx::Size(1, 40)));
+ auto* view2 = host()->AddChildView(CreateSizedView(gfx::Size(1, 40)));
+
+ // Host width is shorter than the preferred width.
+ host()->SetBounds(0, 0, 30, 80);
+ layout().Layout(host());
+
+ // `span_view` should shrink to respect the host bound.
+ ExpectViewBoundsEquals(0, 0, 30, 40, span_view);
+
+ // The first column is host_width - col2_width = 30 - 10 = 20 pixels wide.
+ ExpectViewBoundsEquals(0, 40, 20, 40, view1);
+
+ // The second column is fixed 10 pixels wide.
+ ExpectViewBoundsEquals(20, 40, 10, 40, view2);
+}
+
+// Make sure that for views that span both fixed and resizable columns the
+// underlying resizable column is resized and the fixed sized column is not.
+// The host width in this test is shorter than the minimum size of columns.
+TEST_F(TableLayoutTest, ColumnSpanResizing3) {
+ layout()
+ .AddColumn(LayoutAlignment::kStretch, LayoutAlignment::kCenter, 1.0f,
+ TableLayout::ColumnSize::kUsePreferred, 0, 0)
+ .AddColumn(LayoutAlignment::kStretch, LayoutAlignment::kCenter,
+ TableLayout::kFixedSize, TableLayout::ColumnSize::kFixed, 10,
+ 0)
+ .AddRows(2, TableLayout::kFixedSize);
+ View* span_view = host()->AddChildView(
+ CreateViewWithMinAndPref(gfx::Size(0, 40), gfx::Size(80, 40)));
+ span_view->SetProperty(kTableColAndRowSpanKey, gfx::Size(2, 1));
+
+ auto* view1 = host()->AddChildView(
+ CreateViewWithMinAndPref(gfx::Size(0, 40), gfx::Size(1, 40)));
+ auto* view2 = host()->AddChildView(
+ CreateViewWithMinAndPref(gfx::Size(0, 40), gfx::Size(1, 40)));
+
+ // Host width is shorter than the minimum size of columns
+ // i.e 5 < col1_min_width + col2_min_width = 0 + 10 = 10.
+ host()->SetBounds(0, 0, 5, 80);
+ layout().Layout(host());
+
+ // `span_view` should shrink to the fixed width of col2.
+ ExpectViewBoundsEquals(0, 0, 10, 40, span_view);
+
+ // The first column is 0 pixels wide.
+ ExpectViewBoundsEquals(0, 40, 0, 40, view1);
+
+ // The second width column is fixed 10 pixels wide.
+ ExpectViewBoundsEquals(0, 40, 10, 40, view2);
+}
+
TEST_F(TableLayoutTest, MinimumPreferredSize) {
layout()
.AddColumn(LayoutAlignment::kStretch, LayoutAlignment::kStretch,
diff --git a/chromium/ui/views/linux_ui/BUILD.gn b/chromium/ui/views/linux_ui/BUILD.gn
deleted file mode 100644
index 19593abb231..00000000000
--- a/chromium/ui/views/linux_ui/BUILD.gn
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2022 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/linux/gtk/gtk.gni")
-import("//ui/qt/qt.gni")
-
-source_set("linux_ui_factory") {
- sources = [
- "linux_ui_factory.cc",
- "linux_ui_factory.h",
- ]
-
- deps = [ "//ui/views" ]
- if (use_gtk) {
- # This is the only component that can interact with gtk.
- deps += [ "//ui/gtk" ]
- }
- if (use_qt) {
- deps += [ "//ui/qt" ]
- }
-}
diff --git a/chromium/ui/views/metadata/view_factory.h b/chromium/ui/views/metadata/view_factory.h
index 61a6fdf45f2..1358a14883a 100644
--- a/chromium/ui/views/metadata/view_factory.h
+++ b/chromium/ui/views/metadata/view_factory.h
@@ -46,14 +46,14 @@ class BaseViewBuilderT : public internal::ViewBuilderCore {
return std::move(this->CopyAddressTo(view_address));
}
- template <typename View>
- Builder& CopyAddressTo(raw_ptr<View>* view_address) & {
+ template <typename View, typename Option>
+ Builder& CopyAddressTo(raw_ptr<View, Option>* view_address) & {
*view_address = view_ ? view_.get() : root_view_.get();
return *static_cast<Builder*>(this);
}
- template <typename View>
- Builder&& CopyAddressTo(raw_ptr<View>* view_address) && {
+ template <typename View, typename Option>
+ Builder&& CopyAddressTo(raw_ptr<View, Option>* view_address) && {
return std::move(this->CopyAddressTo(view_address));
}
diff --git a/chromium/ui/views/metrics_aura.cc b/chromium/ui/views/metrics_aura.cc
index 1416330a8d7..8f7846e4468 100644
--- a/chromium/ui/views/metrics_aura.cc
+++ b/chromium/ui/views/metrics_aura.cc
@@ -13,7 +13,7 @@ namespace views {
int GetDoubleClickInterval() {
#if BUILDFLAG(IS_WIN)
- return ::GetDoubleClickTime();
+ return static_cast<int>(::GetDoubleClickTime());
#else
// TODO(jennyz): This value may need to be adjusted on different platforms.
const int kDefaultDoubleClickIntervalMs = 500;
@@ -23,9 +23,12 @@ int GetDoubleClickInterval() {
int GetMenuShowDelay() {
#if BUILDFLAG(IS_WIN)
- static DWORD delay = 0;
- if (!delay && !SystemParametersInfo(SPI_GETMENUSHOWDELAY, 0, &delay, 0))
- delay = kDefaultMenuShowDelay;
+ static int delay = []() {
+ DWORD show_delay;
+ return SystemParametersInfo(SPI_GETMENUSHOWDELAY, 0, &show_delay, 0)
+ ? static_cast<int>(show_delay)
+ : kDefaultMenuShowDelay;
+ }();
return delay;
#else
return 0;
diff --git a/chromium/ui/views/selection_controller.cc b/chromium/ui/views/selection_controller.cc
index 2803044c089..de30c4c8171 100644
--- a/chromium/ui/views/selection_controller.cc
+++ b/chromium/ui/views/selection_controller.cc
@@ -161,7 +161,7 @@ void SelectionController::OnMouseCaptureLost() {
delegate_->UpdateSelectionClipboard();
}
-void SelectionController::OffsetDoubleClickWord(int offset) {
+void SelectionController::OffsetDoubleClickWord(size_t offset) {
double_click_word_.set_start(double_click_word_.start() + offset);
double_click_word_.set_end(double_click_word_.end() + offset);
}
diff --git a/chromium/ui/views/selection_controller.h b/chromium/ui/views/selection_controller.h
index 5a925778508..25bf7597408 100644
--- a/chromium/ui/views/selection_controller.h
+++ b/chromium/ui/views/selection_controller.h
@@ -67,7 +67,7 @@ class VIEWS_EXPORT SelectionController {
// Offsets the double-clicked word's range. This is only used in the unusual
// case where the text changes on the second mousedown of a double-click.
// This is harmless if there is not a currently double-clicked word.
- void OffsetDoubleClickWord(int offset);
+ void OffsetDoubleClickWord(size_t offset);
private:
// Tracks the mouse clicks for single/double/triple clicks.
diff --git a/chromium/ui/views/style/platform_style.cc b/chromium/ui/views/style/platform_style.cc
index 59aa5bf5871..3a6e4df1c47 100644
--- a/chromium/ui/views/style/platform_style.cc
+++ b/chromium/ui/views/style/platform_style.cc
@@ -17,7 +17,7 @@
#include "ui/views/controls/focusable_border.h"
#include "ui/views/controls/scrollbar/scroll_bar_views.h"
-#if BUILDFLAG(IS_CHROMEOS)
+#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
#include "ui/views/controls/scrollbar/overlay_scroll_bar.h"
#endif
@@ -60,7 +60,7 @@ const bool PlatformStyle::kAdjustBubbleIfOffscreen =
// static
std::unique_ptr<ScrollBar> PlatformStyle::CreateScrollBar(bool is_horizontal) {
-#if BUILDFLAG(IS_CHROMEOS)
+#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
return std::make_unique<OverlayScrollBar>(is_horizontal);
#else
return std::make_unique<ScrollBarViews>(is_horizontal);
diff --git a/chromium/ui/views/style/platform_style_mac.mm b/chromium/ui/views/style/platform_style_mac.mm
index 218163cf51d..227be4a88f0 100644
--- a/chromium/ui/views/style/platform_style_mac.mm
+++ b/chromium/ui/views/style/platform_style_mac.mm
@@ -4,6 +4,7 @@
#include "ui/views/style/platform_style.h"
+#include "base/numerics/safe_conversions.h"
#include "base/strings/sys_string_conversions.h"
#include "ui/base/buildflags.h"
#include "ui/gfx/color_utils.h"
@@ -71,16 +72,18 @@ gfx::Range PlatformStyle::RangeToDeleteBackwards(const std::u16string& text,
base::ScopedCFTypeRef<CFStringRef> cf_string(CFStringCreateWithCharacters(
kCFAllocatorDefault, reinterpret_cast<const UniChar*>(text.data()),
- text.size()));
+ base::checked_cast<CFIndex>(text.size())));
CFRange range_to_delete = CFStringGetRangeOfCharacterClusterAtIndex(
- cf_string, cursor_position - 1, kCFStringBackwardDeletionCluster);
+ cf_string, base::checked_cast<CFIndex>(cursor_position - 1),
+ kCFStringBackwardDeletionCluster);
if (range_to_delete.location == NSNotFound)
return gfx::Range();
// The range needs to be reversed to undo correctly.
- return gfx::Range(range_to_delete.location + range_to_delete.length,
- range_to_delete.location);
+ return gfx::Range(base::checked_cast<size_t>(range_to_delete.location +
+ range_to_delete.length),
+ base::checked_cast<size_t>(range_to_delete.location));
}
} // namespace views
diff --git a/chromium/ui/views/style/typography.h b/chromium/ui/views/style/typography.h
index 3a4e86920b6..6bcae3e65ed 100644
--- a/chromium/ui/views/style/typography.h
+++ b/chromium/ui/views/style/typography.h
@@ -93,6 +93,14 @@ enum TextStyle {
// Disabled "greyed out" text.
STYLE_DISABLED,
+ // Used to draw attention to a section of body text such as an extension name
+ // or hostname.
+ STYLE_EMPHASIZED,
+
+ // Emphasized secondary style. Like STYLE_EMPHASIZED but styled to match
+ // surrounding STYLE_SECONDARY text.
+ STYLE_EMPHASIZED_SECONDARY,
+
// The style used for links. Usually a solid shade of blue.
STYLE_LINK,
diff --git a/chromium/ui/views/style/typography_provider.cc b/chromium/ui/views/style/typography_provider.cc
index 492a090e572..9122bd2ae27 100644
--- a/chromium/ui/views/style/typography_provider.cc
+++ b/chromium/ui/views/style/typography_provider.cc
@@ -95,6 +95,9 @@ ui::ColorId GetColorId(int context, int style) {
ui::ResourceBundle::FontDetails TypographyProvider::GetFontDetails(
int context,
int style) const {
+ DCHECK(StyleAllowedForContext(context, style))
+ << "context: " << context << " style: " << style;
+
ui::ResourceBundle::FontDetails details;
switch (context) {
@@ -126,6 +129,10 @@ ui::ResourceBundle::FontDetails TypographyProvider::GetFontDetails(
.GetFontWeight());
}
break;
+ case style::STYLE_EMPHASIZED:
+ case style::STYLE_EMPHASIZED_SECONDARY:
+ details.weight = gfx::Font::Weight::SEMIBOLD;
+ break;
}
return details;
@@ -146,6 +153,13 @@ int TypographyProvider::GetLineHeight(int context, int style) const {
return GetFont(context, style).GetHeight();
}
+bool TypographyProvider::StyleAllowedForContext(int context, int style) const {
+ // TODO(https://crbug.com/1352340): Limit emphasizing text to contexts where
+ // it's obviously correct. chrome_typography_provider.cc implements this
+ // correctly, but that does not cover uses outside of //chrome or //ash.
+ return true;
+}
+
// static
gfx::Font::Weight TypographyProvider::MediumWeightForUI() {
#if BUILDFLAG(IS_MAC)
diff --git a/chromium/ui/views/style/typography_provider.h b/chromium/ui/views/style/typography_provider.h
index 7cff3e1c6bf..f3ec44d4a66 100644
--- a/chromium/ui/views/style/typography_provider.h
+++ b/chromium/ui/views/style/typography_provider.h
@@ -44,6 +44,9 @@ class VIEWS_EXPORT TypographyProvider {
// Gets the line spacing. By default this is the font height.
virtual int GetLineHeight(int context, int style) const;
+ // Returns whether the given style can be used in the given context.
+ virtual bool StyleAllowedForContext(int context, int style) const;
+
// Returns the weight that will result in the ResourceBundle returning an
// appropriate "medium" weight for UI. This caters for systems that are known
// to be unable to provide a system font with weight other than NORMAL or BOLD
diff --git a/chromium/ui/views/test/ui_controls_factory_desktop_aura_ozone.cc b/chromium/ui/views/test/ui_controls_factory_desktop_aura_ozone.cc
index bec549b841b..7afae16e922 100644
--- a/chromium/ui/views/test/ui_controls_factory_desktop_aura_ozone.cc
+++ b/chromium/ui/views/test/ui_controls_factory_desktop_aura_ozone.cc
@@ -104,6 +104,8 @@ class UIControlsDesktopOzone : public UIControlsAura {
DCHECK_EQ(screen, display::Screen::GetScreen());
screen->set_cursor_screen_point(gfx::Point(screen_x, screen_y));
+ bool moved_cursor = false;
+#if !BUILDFLAG(IS_CHROMEOS_LACROS)
if (root_location != root_current_location &&
ozone_ui_controls_test_helper_->ButtonDownMask() == 0 &&
!ozone_ui_controls_test_helper_->MustUseUiControlsForMoveCursorTo()) {
@@ -112,7 +114,11 @@ class UIControlsDesktopOzone : public UIControlsAura {
root_window->MoveCursorTo(root_location);
ozone_ui_controls_test_helper_->RunClosureAfterAllPendingUIEvents(
std::move(closure));
- } else {
+ moved_cursor = true;
+ }
+#endif
+
+ if (!moved_cursor) {
gfx::Point screen_point(root_location);
host->ConvertDIPToScreenInPixels(&screen_point);
ozone_ui_controls_test_helper_->SendMouseMotionNotifyEvent(
@@ -151,6 +157,33 @@ class UIControlsDesktopOzone : public UIControlsAura {
return SendMouseEvents(type, UP | DOWN, ui_controls::kNoAccelerator);
}
+#if BUILDFLAG(IS_CHROMEOS)
+ bool SendTouchEvents(int action, int id, int x, int y) override {
+ return SendTouchEventsNotifyWhenDone(action, id, x, y, base::OnceClosure());
+ }
+ bool SendTouchEventsNotifyWhenDone(int action,
+ int id,
+ int x,
+ int y,
+ base::OnceClosure closure) override {
+ gfx::Point screen_location(x, y);
+ aura::Window* root_window;
+
+ // Touch release events might not have coordinates that match any window, so
+ // just use whichever window is on top.
+ if (action & ui_controls::RELEASE)
+ root_window = TopRootWindow();
+ else
+ root_window = RootWindowForPoint(screen_location);
+
+ ozone_ui_controls_test_helper_->SendTouchEvent(
+ root_window->GetHost()->GetAcceleratedWidget(), action, id,
+ screen_location, std::move(closure));
+
+ return true;
+ }
+#endif
+
private:
aura::Window* RootWindowForPoint(const gfx::Point& point) {
// Most interactive_ui_tests run inside of the aura_test_helper
@@ -170,6 +203,13 @@ class UIControlsDesktopOzone : public UIControlsAura {
return (*i)->GetRootWindow();
}
+ aura::Window* TopRootWindow() {
+ std::vector<aura::Window*> windows =
+ DesktopWindowTreeHostPlatform::GetAllOpenWindows();
+ DCHECK(!windows.empty());
+ return windows[0]->GetRootWindow();
+ }
+
std::unique_ptr<ui::OzoneUIControlsTestHelper> ozone_ui_controls_test_helper_;
};
diff --git a/chromium/ui/views/touchui/OWNERS b/chromium/ui/views/touchui/OWNERS
index 8842bb9529e..c65e542a90b 100644
--- a/chromium/ui/views/touchui/OWNERS
+++ b/chromium/ui/views/touchui/OWNERS
@@ -1,2 +1 @@
mohsen@chromium.org
-sadrul@chromium.org
diff --git a/chromium/ui/views/touchui/touch_selection_menu_views.h b/chromium/ui/views/touchui/touch_selection_menu_views.h
index f0101c4ed4a..71b8424d967 100644
--- a/chromium/ui/views/touchui/touch_selection_menu_views.h
+++ b/chromium/ui/views/touchui/touch_selection_menu_views.h
@@ -66,7 +66,7 @@ class VIEWS_EXPORT TouchSelectionMenuViews : public BubbleDialogDelegateView {
void WindowClosing() override;
raw_ptr<TouchSelectionMenuRunnerViews> owner_;
- const raw_ptr<ui::TouchSelectionMenuClient> client_;
+ const raw_ptr<ui::TouchSelectionMenuClient, DanglingUntriaged> client_;
};
} // namespace views
diff --git a/chromium/ui/views/vector_icons/drag_general_selection.icon b/chromium/ui/views/vector_icons/drag_general_selection.icon
new file mode 100644
index 00000000000..f27a6ae3adc
--- /dev/null
+++ b/chromium/ui/views/vector_icons/drag_general_selection.icon
@@ -0,0 +1,94 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 10, 2,
+H_LINE_TO, 8.67f,
+V_LINE_TO, 0.67f,
+H_LINE_TO, 10,
+V_LINE_TO, 2,
+CLOSE,
+R_MOVE_TO, 1.33f, 2.67f,
+R_H_LINE_TO, 1.33f,
+V_LINE_TO, 3.33f,
+R_H_LINE_TO, -1.33f,
+R_V_LINE_TO, 1.33f,
+CLOSE,
+R_MOVE_TO, 0, 2.67f,
+R_H_LINE_TO, 1.33f,
+V_LINE_TO, 6,
+R_H_LINE_TO, -1.33f,
+R_V_LINE_TO, 1.33f,
+CLOSE,
+MOVE_TO, 6, 12.67f,
+R_H_LINE_TO, 1.33f,
+R_V_LINE_TO, -1.33f,
+H_LINE_TO, 6,
+R_V_LINE_TO, 1.33f,
+CLOSE,
+MOVE_TO, 3.33f, 2,
+R_H_LINE_TO, 1.33f,
+V_LINE_TO, 0.67f,
+H_LINE_TO, 3.33f,
+V_LINE_TO, 2,
+CLOSE,
+MOVE_TO, 0.67f, 10,
+H_LINE_TO, 2,
+V_LINE_TO, 8.67f,
+H_LINE_TO, 0.67f,
+V_LINE_TO, 10,
+CLOSE,
+MOVE_TO, 2, 12.67f,
+R_V_LINE_TO, -1.33f,
+H_LINE_TO, 0.67f,
+R_CUBIC_TO, 0, 0.73f, 0.6f, 1.33f, 1.33f, 1.33f,
+CLOSE,
+R_MOVE_TO, 9.33f, -12,
+V_LINE_TO, 2,
+R_H_LINE_TO, 1.33f,
+R_CUBIC_TO, 0, -0.73f, -0.6f, -1.33f, -1.33f, -1.33f,
+CLOSE,
+MOVE_TO, 6, 2,
+R_H_LINE_TO, 1.33f,
+V_LINE_TO, 0.67f,
+H_LINE_TO, 6,
+V_LINE_TO, 2,
+CLOSE,
+MOVE_TO, 0.67f, 4.67f,
+H_LINE_TO, 2,
+V_LINE_TO, 3.33f,
+H_LINE_TO, 0.67f,
+R_V_LINE_TO, 1.33f,
+CLOSE,
+R_MOVE_TO, 2.67f, 8,
+R_H_LINE_TO, 1.33f,
+R_V_LINE_TO, -1.33f,
+H_LINE_TO, 3.33f,
+R_V_LINE_TO, 1.33f,
+CLOSE,
+MOVE_TO, 0.67f, 7.33f,
+H_LINE_TO, 2,
+V_LINE_TO, 6,
+H_LINE_TO, 0.67f,
+R_V_LINE_TO, 1.33f,
+CLOSE,
+MOVE_TO, 0.67f, 2,
+H_LINE_TO, 2,
+V_LINE_TO, 0.67f,
+CUBIC_TO, 1.27f, 0.67f, 0.67f, 1.27f, 0.67f, 2,
+CLOSE,
+R_MOVE_TO, 8, 9.33f,
+R_V_LINE_TO, 1.33f,
+R_H_LINE_TO, 2.67f,
+R_LINE_TO, -0.01f, 2.67f,
+R_H_LINE_TO, 1.33f,
+R_LINE_TO, 0.01f, -2.66f,
+R_LINE_TO, 2.66f, -0.01f,
+R_V_LINE_TO, -1.34f,
+R_LINE_TO, -2.67f, 0.01f,
+V_LINE_TO, 8.67f,
+R_H_LINE_TO, -1.33f,
+R_V_LINE_TO, 2.67f,
+H_LINE_TO, 8.67f,
+CLOSE
diff --git a/chromium/ui/views/vector_icons/drag_image_selection.icon b/chromium/ui/views/vector_icons/drag_image_selection.icon
new file mode 100644
index 00000000000..3dd7060546a
--- /dev/null
+++ b/chromium/ui/views/vector_icons/drag_image_selection.icon
@@ -0,0 +1,59 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 12, 10.67f,
+V_LINE_TO, 8,
+R_H_LINE_TO, -1.33f,
+R_V_LINE_TO, 2.67f,
+H_LINE_TO, 8,
+V_LINE_TO, 12,
+R_H_LINE_TO, 2.67f,
+R_V_LINE_TO, 2.67f,
+H_LINE_TO, 12,
+R_LINE_TO, 0.01f, -2.66f,
+R_LINE_TO, 2.66f, -0.01f,
+R_V_LINE_TO, -1.34f,
+R_LINE_TO, -2.67f, 0.01f,
+CLOSE,
+MOVE_TO, 10.67f, 0,
+R_V_LINE_TO, 1.33f,
+H_LINE_TO, 12,
+CUBIC_TO, 12, 0.6f, 11.4f, 0, 10.67f, 0,
+CLOSE,
+R_MOVE_TO, -8, 12,
+R_H_LINE_TO, 4,
+R_V_LINE_TO, -1.33f,
+H_LINE_TO, 5.34f,
+V_LINE_TO, 12,
+H_LINE_TO, 4.01f,
+R_V_LINE_TO, -1.33f,
+H_LINE_TO, 2.68f,
+V_LINE_TO, 12,
+MOVE_TO, 1.33f, 6.67f,
+R_H_LINE_TO, 8,
+V_LINE_TO, 0,
+R_H_LINE_TO, -8,
+CUBIC_TO, 0.6f, 0, 0, 0.6f, 0, 1.33f,
+R_V_LINE_TO, 9.34f,
+R_CUBIC_TO, 0, 0.62f, 0.43f, 1.11f, 1, 1.27f,
+R_CUBIC_TO, 0.11f, 0.03f, 0.22f, 0.07f, 0.33f, 0.07f,
+R_MOVE_TO, 0, -6.68f,
+R_LINE_TO, 2.16f, -3.5f,
+R_LINE_TO, 1.29f, 1.5f,
+R_LINE_TO, 1.29f, -2,
+R_LINE_TO, 2.59f, 4,
+H_LINE_TO, 1.33f,
+CLOSE,
+NEW_PATH,
+MOVE_TO, 10.67f, 2.67f,
+H_LINE_TO, 12,
+V_LINE_TO, 4,
+R_H_LINE_TO, -1.33f,
+CLOSE,
+R_MOVE_TO, 0, 2.66f,
+H_LINE_TO, 12,
+R_V_LINE_TO, 1.33f,
+R_H_LINE_TO, -1.33f,
+CLOSE
diff --git a/chromium/ui/views/view.cc b/chromium/ui/views/view.cc
index 88597c0503a..b625d439242 100644
--- a/chromium/ui/views/view.cc
+++ b/chromium/ui/views/view.cc
@@ -18,6 +18,7 @@
#include "base/i18n/rtl.h"
#include "base/logging.h"
#include "base/notreached.h"
+#include "base/numerics/safe_conversions.h"
#include "base/observer_list.h"
#include "base/scoped_observation.h"
#include "base/strings/utf_string_conversions.h"
@@ -244,6 +245,12 @@ View::~View() {
for (auto* child : children_) {
child->parent_ = nullptr;
+ // Remove any references to |child| to avoid holding a dangling ptr.
+ if (child->previous_focusable_view_)
+ child->previous_focusable_view_->next_focusable_view_ = nullptr;
+ if (child->next_focusable_view_)
+ child->next_focusable_view_->previous_focusable_view_ = nullptr;
+
// Since all children are removed here, it is safe to set
// |child|'s focus list pointers to null and expect any references
// to |child| will be removed subsequently.
@@ -286,16 +293,15 @@ Widget* View::GetWidget() {
return const_cast<Widget*>(const_cast<const View*>(this)->GetWidget());
}
-void View::ReorderChildView(View* view, int index) {
+void View::ReorderChildView(View* view, size_t index) {
DCHECK_EQ(view->parent_, this);
const auto i = std::find(children_.begin(), children_.end(), view);
DCHECK(i != children_.end());
// If |view| is already at the desired position, there's nothing to do.
- const bool move_to_end =
- (index < 0) || (static_cast<size_t>(index) >= children_.size());
- const auto pos = move_to_end ? std::prev(children_.end())
- : std::next(children_.begin(), index);
+ const auto pos =
+ std::next(children_.begin(),
+ static_cast<ptrdiff_t>(std::min(index, children_.size() - 1)));
if (i == pos)
return;
@@ -348,11 +354,11 @@ View::Views::const_iterator View::FindChild(const View* view) const {
return std::find(children_.cbegin(), children_.cend(), view);
}
-int View::GetIndexOf(const View* view) const {
+absl::optional<size_t> View::GetIndexOf(const View* view) const {
const auto i = FindChild(view);
- return i == children_.cend()
- ? -1
- : static_cast<int>(std::distance(children_.cbegin(), i));
+ return i == children_.cend() ? absl::nullopt
+ : absl::make_optional(static_cast<size_t>(
+ std::distance(children_.cbegin(), i)));
}
// Size and disposition --------------------------------------------------------
@@ -526,6 +532,12 @@ gfx::Size View::GetPreferredSize() const {
return CalculatePreferredSize();
}
+gfx::Size View::GetPreferredSize(const SizeBounds& available_size) const {
+ if (preferred_size_)
+ return *preferred_size_;
+ return CalculatePreferredSize(available_size);
+}
+
int View::GetBaseline() const {
return -1;
}
@@ -595,6 +607,9 @@ void View::SetVisible(bool visible) {
// Notify all other subscriptions of the change.
OnPropertyChanged(&visible_, kPropertyEffectsPaint);
+
+ if (was_visible)
+ UpdateTooltip();
}
if (parent_) {
@@ -983,7 +998,21 @@ void View::ConvertPointToTarget(const View* source,
return;
const View* root = GetHierarchyRoot(target);
+#if BUILDFLAG(IS_MAC)
+ // If the root views don't match make sure we are in the same widget tree.
+ // Full screen in macOS creates a child widget that hosts top chrome.
+ // TODO(bur): Remove this check when top chrome can be composited into its own
+ // NSView without the need for a new widget.
+ if (GetHierarchyRoot(source) != root) {
+ const Widget* source_top_level_widget =
+ source->GetWidget()->GetTopLevelWidget();
+ const Widget* target_top_level_widget =
+ target->GetWidget()->GetTopLevelWidget();
+ CHECK_EQ(source_top_level_widget, target_top_level_widget);
+ }
+#else // IS_MAC
CHECK_EQ(GetHierarchyRoot(source), root);
+#endif
if (source != root)
source->ConvertPointForAncestor(root, point);
@@ -1575,7 +1604,7 @@ void View::RemoveAccelerator(const ui::Accelerator& accelerator) {
return;
}
- size_t index = i - accelerators_->begin();
+ auto index = static_cast<size_t>(i - accelerators_->begin());
accelerators_->erase(i);
if (index >= registered_accelerator_count_) {
// The accelerator is not registered to FocusManager.
@@ -1947,6 +1976,10 @@ gfx::Size View::CalculatePreferredSize() const {
return gfx::Size();
}
+gfx::Size View::CalculatePreferredSize(const SizeBounds& available_size) const {
+ return CalculatePreferredSize();
+}
+
void View::PreferredSizeChanged() {
if (parent_)
parent_->ChildPreferredSizeChanged(this);
@@ -2366,7 +2399,8 @@ void View::HandlePropertyChangeEffects(PropertyEffects effects) {
void View::AfterPropertyChange(const void* key, int64_t old_value) {
if (key == kElementIdentifierKey) {
const ui::ElementIdentifier old_element_id =
- ui::ElementIdentifier::FromRawValue(old_value);
+ ui::ElementIdentifier::FromRawValue(
+ base::checked_cast<intptr_t>(old_value));
if (old_element_id) {
views::ElementTrackerViews::GetInstance()->UnregisterView(old_element_id,
this);
@@ -2556,10 +2590,9 @@ void View::PaintDebugRects(const PaintInfo& parent_paint_info) {
// Tree operations -------------------------------------------------------------
-void View::AddChildViewAtImpl(View* view, int index) {
+void View::AddChildViewAtImpl(View* view, size_t index) {
CHECK_NE(view, this) << "You cannot add a view as its own child";
- DCHECK_GE(index, 0);
- DCHECK_LE(static_cast<size_t>(index), children_.size());
+ DCHECK_LE(index, children_.size());
// TODO(https://crbug.com/942298): Should just DCHECK(!view->parent_);.
View* parent = view->parent_;
@@ -2578,7 +2611,8 @@ void View::AddChildViewAtImpl(View* view, int index) {
#if DCHECK_IS_ON()
DCHECK(!iterating_);
#endif
- const auto pos = children_.insert(std::next(children_.cbegin(), index), view);
+ const auto pos = children_.insert(
+ std::next(children_.cbegin(), static_cast<ptrdiff_t>(index)), view);
view->RemoveFromFocusList();
SetFocusSiblings(view, pos);
@@ -3142,8 +3176,9 @@ void View::RegisterPendingAccelerators() {
NOTREACHED();
return;
}
- for (std::vector<ui::Accelerator>::const_iterator i(
- accelerators_->begin() + registered_accelerator_count_);
+ for (std::vector<ui::Accelerator>::const_iterator i =
+ accelerators_->begin() +
+ static_cast<ptrdiff_t>(registered_accelerator_count_);
i != accelerators_->end(); ++i) {
accelerator_focus_manager_->RegisterAccelerator(
*i, ui::AcceleratorManager::kNormalPriority, this);
diff --git a/chromium/ui/views/view.h b/chromium/ui/views/view.h
index ef40c571d57..19e8d4180d0 100644
--- a/chromium/ui/views/view.h
+++ b/chromium/ui/views/view.h
@@ -87,6 +87,7 @@ class FocusManager;
class FocusTraversable;
class LayoutProvider;
class ScrollView;
+class SizeBounds;
class ViewAccessibility;
class ViewMaskLayer;
class ViewObserver;
@@ -114,9 +115,9 @@ struct VIEWS_EXPORT ViewHierarchyChangedDetails {
bool is_add = false;
// New parent if |is_add| is true, old parent if |is_add| is false.
- View* parent = nullptr;
+ raw_ptr<View> parent = nullptr;
// The view being added or removed.
- View* child = nullptr;
+ raw_ptr<View> child = nullptr;
// If this is a move (reparent), meaning AddChildViewAt() is invoked with an
// existing parent, then a notification for the remove is sent first,
// followed by one for the add. This case can be distinguished by a
@@ -125,7 +126,7 @@ struct VIEWS_EXPORT ViewHierarchyChangedDetails {
// being removed.
// For the add part of move, |move_view| is the old parent of the View being
// added.
- View* move_view = nullptr;
+ raw_ptr<View> move_view = nullptr;
};
using PropertyChangedCallback = ui::metadata::PropertyChangedCallback;
@@ -413,7 +414,7 @@ class VIEWS_EXPORT View : public ui::LayerDelegate,
return AddChildView<T>(view.release());
}
template <typename T>
- T* AddChildViewAt(std::unique_ptr<T> view, int index) {
+ T* AddChildViewAt(std::unique_ptr<T> view, size_t index) {
DCHECK(!view->owned_by_client())
<< "This should only be called if the client is passing ownership of "
"|view| to the parent View.";
@@ -424,18 +425,18 @@ class VIEWS_EXPORT View : public ui::LayerDelegate,
// for new code.
template <typename T>
T* AddChildView(T* view) {
- AddChildViewAtImpl(view, static_cast<int>(children_.size()));
+ AddChildViewAtImpl(view, children_.size());
return view;
}
template <typename T>
- T* AddChildViewAt(T* view, int index) {
+ T* AddChildViewAt(T* view, size_t index) {
AddChildViewAtImpl(view, index);
return view;
}
- // Moves |view| to the specified |index|. A negative value for |index| moves
- // the view at the end.
- void ReorderChildView(View* view, int index);
+ // Moves |view| to the specified |index|. An |index| at least as large as that
+ // of the last child moves the view to the end.
+ void ReorderChildView(View* view, size_t index);
// Removes |view| from this view. The view's parent will change to null.
void RemoveChildView(View* view);
@@ -484,8 +485,9 @@ class VIEWS_EXPORT View : public ui::LayerDelegate,
// not a child of this view.
Views::const_iterator FindChild(const View* view) const;
- // Returns the index of |view|, or -1 if |view| is not a child of this view.
- int GetIndexOf(const View* view) const;
+ // Returns the index of |view|, or nullopt if |view| is not a child of this
+ // view.
+ absl::optional<size_t> GetIndexOf(const View* view) const;
// Size and disposition ------------------------------------------------------
// Methods for obtaining and modifying the position and size of the view.
@@ -546,10 +548,17 @@ class VIEWS_EXPORT View : public ui::LayerDelegate,
// return value is relative to the preferred height.
virtual int GetBaseline() const;
- // Get the size the View would like to be, if enough space were available.
- // First checks |preferred_size_|, then CalculatePreferredSize().
+ // Get the size the View would like to be under the current bounds.
+ // If the View is never laid out before, assume it to be laid out in an
+ // unbounded space.
+ // TODO(crbug.com/1346889): Don't use this. Use the size-constrained
+ // GetPreferredSize(const SizeBounds&) instead.
gfx::Size GetPreferredSize() const;
+ // Get the size the View would like to be given `available_size`, ignoring the
+ // current bounds.
+ gfx::Size GetPreferredSize(const SizeBounds& available_size) const;
+
// Sets or unsets the size that this View will request during layout. The
// actual size may differ. It should rarely be necessary to set this; usually
// the right approach is controlling the parent's layout via a LayoutManager.
@@ -1456,8 +1465,16 @@ class VIEWS_EXPORT View : public ui::LayerDelegate,
// Calculates the natural size for the View, to be taken into consideration
// when the parent is performing layout.
+ // `preferred_size_` will take precedence over CalculatePreferredSize() if
+ // it exists.
virtual gfx::Size CalculatePreferredSize() const;
+ // Calculates the preferred size for the View given `available_size`.
+ // `preferred_size_` will take precedence over CalculatePreferredSize() if
+ // it exists.
+ virtual gfx::Size CalculatePreferredSize(
+ const SizeBounds& available_size) const;
+
// Override to be notified when the bounds of the view have changed.
virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) {}
@@ -1755,7 +1772,7 @@ class VIEWS_EXPORT View : public ui::LayerDelegate,
// Tree operations -----------------------------------------------------------
// Adds |view| as a child of this view at |index|.
- void AddChildViewAtImpl(View* view, int index);
+ void AddChildViewAtImpl(View* view, size_t index);
// Removes |view| from the hierarchy tree. If |update_tool_tip| is
// true, the tooltip is updated. If |delete_removed_view| is true, the
@@ -2084,12 +2101,13 @@ class VIEWS_EXPORT View : public ui::LayerDelegate,
// Painting ------------------------------------------------------------------
- // Background
- std::unique_ptr<Background> background_;
-
// Border.
std::unique_ptr<Border> border_;
+ // Background may rely on Border, so it must be declared last and destroyed
+ // first.
+ std::unique_ptr<Background> background_;
+
// Cached output of painting to be reused in future frames until invalidated.
ui::PaintCache paint_cache_;
diff --git a/chromium/ui/views/view_model.cc b/chromium/ui/views/view_model.cc
index e3ba79f8cc6..0ec71be1e5d 100644
--- a/chromium/ui/views/view_model.cc
+++ b/chromium/ui/views/view_model.cc
@@ -15,36 +15,32 @@ ViewModelBase::~ViewModelBase() {
// view are owned by their parent, no need to delete them.
}
-void ViewModelBase::Remove(int index) {
- if (index == -1)
- return;
-
+void ViewModelBase::Remove(size_t index) {
check_index(index);
- entries_.erase(entries_.begin() + index);
+ entries_.erase(entries_.begin() + static_cast<ptrdiff_t>(index));
}
-void ViewModelBase::Move(int index, int target_index) {
- DCHECK_LT(index, static_cast<int>(entries_.size()));
- DCHECK_GE(index, 0);
- DCHECK_LT(target_index, static_cast<int>(entries_.size()));
- DCHECK_GE(target_index, 0);
+void ViewModelBase::Move(size_t index, size_t target_index) {
+ check_index(index);
+ check_index(target_index);
if (index == target_index)
return;
Entry entry(entries_[index]);
- entries_.erase(entries_.begin() + index);
- entries_.insert(entries_.begin() + target_index, entry);
+ entries_.erase(entries_.begin() + static_cast<ptrdiff_t>(index));
+ entries_.insert(entries_.begin() + static_cast<ptrdiff_t>(target_index),
+ entry);
}
-void ViewModelBase::MoveViewOnly(int index, int target_index) {
+void ViewModelBase::MoveViewOnly(size_t index, size_t target_index) {
if (target_index < index) {
View* view = entries_[index].view;
- for (int i = index; i > target_index; --i)
+ for (size_t i = index; i > target_index; --i)
entries_[i].view = entries_[i - 1].view;
entries_[target_index].view = view;
} else if (target_index > index) {
View* view = entries_[index].view;
- for (int i = index; i < target_index; ++i)
+ for (size_t i = index; i < target_index; ++i)
entries_[i].view = entries_[i + 1].view;
entries_[target_index].view = view;
}
@@ -57,21 +53,22 @@ void ViewModelBase::Clear() {
delete entry.view;
}
-int ViewModelBase::GetIndexOfView(const View* view) const {
+absl::optional<size_t> ViewModelBase::GetIndexOfView(const View* view) const {
const auto i =
std::find_if(entries_.cbegin(), entries_.cend(),
[view](const auto& entry) { return entry.view == view; });
- return (i == entries_.cend()) ? -1 : (i - entries_.cbegin());
+ return (i == entries_.cend())
+ ? absl::nullopt
+ : absl::make_optional(static_cast<size_t>(i - entries_.cbegin()));
}
ViewModelBase::ViewModelBase() = default;
-void ViewModelBase::AddUnsafe(View* view, int index) {
- DCHECK_LE(index, static_cast<int>(entries_.size()));
- DCHECK_GE(index, 0);
+void ViewModelBase::AddUnsafe(View* view, size_t index) {
+ DCHECK_LE(index, entries_.size());
Entry entry;
entry.view = view;
- entries_.insert(entries_.begin() + index, entry);
+ entries_.insert(entries_.begin() + static_cast<ptrdiff_t>(index), entry);
}
} // namespace views
diff --git a/chromium/ui/views/view_model.h b/chromium/ui/views/view_model.h
index ae64bae65cb..aa8082562b2 100644
--- a/chromium/ui/views/view_model.h
+++ b/chromium/ui/views/view_model.h
@@ -8,6 +8,7 @@
#include <vector>
#include "base/check_op.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/views/views_export.h"
@@ -40,37 +41,37 @@ class VIEWS_EXPORT ViewModelBase {
// Removes the view at the specified index. This does not actually remove the
// view from the view hierarchy.
- void Remove(int index);
+ void Remove(size_t index);
// Moves the view at |index| to |target_index|. |target_index| is in terms
// of the model *after* the view at |index| is removed.
- void Move(int index, int target_index);
+ void Move(size_t index, size_t target_index);
// Variant of Move() that leaves the bounds as is. That is, after invoking
// this the bounds of the view at |target_index| (and all other indices) are
// exactly the same as the bounds of the view at |target_index| before
// invoking this.
- void MoveViewOnly(int index, int target_index);
+ void MoveViewOnly(size_t index, size_t target_index);
// Returns the number of views.
- int view_size() const { return static_cast<int>(entries_.size()); }
+ size_t view_size() const { return entries_.size(); }
// Removes and deletes all the views.
void Clear();
- void set_ideal_bounds(int index, const gfx::Rect& bounds) {
+ void set_ideal_bounds(size_t index, const gfx::Rect& bounds) {
check_index(index);
entries_[index].ideal_bounds = bounds;
}
- const gfx::Rect& ideal_bounds(int index) const {
+ const gfx::Rect& ideal_bounds(size_t index) const {
check_index(index);
return entries_[index].ideal_bounds;
}
- // Returns the index of the specified view, or -1 if the view isn't in the
- // model.
- int GetIndexOfView(const View* view) const;
+ // Returns the index of the specified view, or nullopt if the view isn't in
+ // the model.
+ absl::optional<size_t> GetIndexOfView(const View* view) const;
protected:
ViewModelBase();
@@ -78,27 +79,20 @@ class VIEWS_EXPORT ViewModelBase {
// Returns the view at the specified index. Note: Most users should use
// view_at() in the subclass, to get a view of the correct type. (Do not call
// ViewAtBase then static_cast to the desired type.)
- View* ViewAtBase(int index) const {
+ View* ViewAtBase(size_t index) const {
check_index(index);
return entries_[index].view;
}
// Adds |view| to this model. This does not add |view| to a view hierarchy,
// only to this model.
- void AddUnsafe(View* view, int index);
+ void AddUnsafe(View* view, size_t index);
private:
// For access to ViewAtBase().
friend class ViewModelUtils;
-#if !defined(NDEBUG)
- void check_index(int index) const {
- DCHECK_LT(index, static_cast<int>(entries_.size()));
- DCHECK_GE(index, 0);
- }
-#else
- void check_index(int index) const {}
-#endif
+ void check_index(size_t index) const { DCHECK_LT(index, entries_.size()); }
Entries entries_;
};
@@ -118,10 +112,10 @@ class ViewModelT : public ViewModelBase {
// Adds |view| to this model. This does not add |view| to a view hierarchy,
// only to this model.
- void Add(T* view, int index) { AddUnsafe(view, index); }
+ void Add(T* view, size_t index) { AddUnsafe(view, index); }
// Returns the view at the specified index.
- T* view_at(int index) const { return static_cast<T*>(ViewAtBase(index)); }
+ T* view_at(size_t index) const { return static_cast<T*>(ViewAtBase(index)); }
};
// ViewModel is a collection of views with no specfic type. If all views have
diff --git a/chromium/ui/views/view_model_unittest.cc b/chromium/ui/views/view_model_unittest.cc
index a922bfc467b..169d17b077a 100644
--- a/chromium/ui/views/view_model_unittest.cc
+++ b/chromium/ui/views/view_model_unittest.cc
@@ -17,7 +17,7 @@ namespace {
// Returns a string containing the x-coordinate of each of the views in |model|.
std::string BoundsString(const ViewModel& model) {
std::string result;
- for (int i = 0; i < model.view_size(); ++i) {
+ for (size_t i = 0; i < model.view_size(); ++i) {
if (i != 0)
result += " ";
result += base::NumberToString(model.ideal_bounds(i).x());
@@ -28,7 +28,7 @@ std::string BoundsString(const ViewModel& model) {
// Returns a string containing the id of each of the views in |model|.
std::string ViewIDsString(const ViewModel& model) {
std::string result;
- for (int i = 0; i < model.view_size(); ++i) {
+ for (size_t i = 0; i < model.view_size(); ++i) {
if (i != 0)
result += " ";
result += base::NumberToString(model.view_at(i)->GetID());
@@ -42,12 +42,12 @@ TEST(ViewModel, BasicAssertions) {
View v1;
ViewModel model;
model.Add(&v1, 0);
- EXPECT_EQ(1, model.view_size());
+ EXPECT_EQ(1u, model.view_size());
EXPECT_EQ(&v1, model.view_at(0));
gfx::Rect v1_bounds(1, 2, 3, 4);
model.set_ideal_bounds(0, v1_bounds);
EXPECT_EQ(v1_bounds, model.ideal_bounds(0));
- EXPECT_EQ(0, model.GetIndexOfView(&v1));
+ EXPECT_EQ(0u, model.GetIndexOfView(&v1));
}
TEST(ViewModel, Move) {
diff --git a/chromium/ui/views/view_model_utils.cc b/chromium/ui/views/view_model_utils.cc
index 8788a7be8f2..3e1a71a72cd 100644
--- a/chromium/ui/views/view_model_utils.cc
+++ b/chromium/ui/views/view_model_utils.cc
@@ -35,25 +35,25 @@ bool ViewModelUtils::IsAtIdealBounds(const ViewModelBase& model) {
}
// static
-int ViewModelUtils::DetermineMoveIndex(const ViewModelBase& model,
- View* view,
- bool is_horizontal,
- int x,
- int y) {
+size_t ViewModelUtils::DetermineMoveIndex(const ViewModelBase& model,
+ View* view,
+ bool is_horizontal,
+ int x,
+ int y) {
const auto& entries = model.entries();
const int value = primary_axis_coordinate(is_horizontal, gfx::Point(x, y));
- DCHECK_NE(-1, model.GetIndexOfView(view));
+ DCHECK(model.GetIndexOfView(view).has_value());
auto iter = entries.begin();
for (; iter->view != view; ++iter) {
const int mid_point = primary_axis_coordinate(
is_horizontal, iter->ideal_bounds.CenterPoint());
if (value < mid_point)
- return std::distance(entries.begin(), iter);
+ return static_cast<size_t>(std::distance(entries.begin(), iter));
}
if (std::next(iter) == entries.end())
- return std::distance(entries.begin(), iter);
+ return static_cast<size_t>(std::distance(entries.begin(), iter));
// For indices after the current index ignore the bounds of the view being
// dragged. This keeps the view from bouncing around as moved.
@@ -66,7 +66,7 @@ int ViewModelUtils::DetermineMoveIndex(const ViewModelBase& model,
is_horizontal, iter->ideal_bounds.CenterPoint()) -
delta;
if (value < mid_point)
- return std::distance(entries.begin(), iter) - 1;
+ return static_cast<size_t>(std::distance(entries.begin(), iter)) - 1;
}
return entries.size() - 1;
}
diff --git a/chromium/ui/views/view_model_utils.h b/chromium/ui/views/view_model_utils.h
index af200bcbe78..e33d5ff75f7 100644
--- a/chromium/ui/views/view_model_utils.h
+++ b/chromium/ui/views/view_model_utils.h
@@ -5,6 +5,8 @@
#ifndef UI_VIEWS_VIEW_MODEL_UTILS_H_
#define UI_VIEWS_VIEW_MODEL_UTILS_H_
+#include <stddef.h>
+
#include "ui/views/views_export.h"
namespace views {
@@ -25,11 +27,11 @@ class VIEWS_EXPORT ViewModelUtils {
static bool IsAtIdealBounds(const ViewModelBase& model);
// Returns the index to move |view| to based on a coordinate of |x| and |y|.
- static int DetermineMoveIndex(const ViewModelBase& model,
- View* view,
- bool is_horizontal,
- int x,
- int y);
+ static size_t DetermineMoveIndex(const ViewModelBase& model,
+ View* view,
+ bool is_horizontal,
+ int x,
+ int y);
};
} // namespace views
diff --git a/chromium/ui/views/view_model_utils_unittest.cc b/chromium/ui/views/view_model_utils_unittest.cc
index 5b9349e57ae..2895ac93ffa 100644
--- a/chromium/ui/views/view_model_utils_unittest.cc
+++ b/chromium/ui/views/view_model_utils_unittest.cc
@@ -32,30 +32,30 @@ TEST(ViewModelUtils, DetermineMoveIndex) {
model.set_ideal_bounds(1, gfx::Rect(10, 0, 1000, 10));
model.set_ideal_bounds(2, gfx::Rect(1010, 0, 2, 10));
- EXPECT_EQ(0, ViewModelUtils::DetermineMoveIndex(model, &v1, true, -10, 0));
- EXPECT_EQ(0, ViewModelUtils::DetermineMoveIndex(model, &v1, true, 4, 0));
- EXPECT_EQ(1, ViewModelUtils::DetermineMoveIndex(model, &v1, true, 506, 0));
- EXPECT_EQ(2, ViewModelUtils::DetermineMoveIndex(model, &v1, true, 1010, 0));
- EXPECT_EQ(2, ViewModelUtils::DetermineMoveIndex(model, &v1, true, 2000, 0));
+ EXPECT_EQ(0u, ViewModelUtils::DetermineMoveIndex(model, &v1, true, -10, 0));
+ EXPECT_EQ(0u, ViewModelUtils::DetermineMoveIndex(model, &v1, true, 4, 0));
+ EXPECT_EQ(1u, ViewModelUtils::DetermineMoveIndex(model, &v1, true, 506, 0));
+ EXPECT_EQ(2u, ViewModelUtils::DetermineMoveIndex(model, &v1, true, 1010, 0));
+ EXPECT_EQ(2u, ViewModelUtils::DetermineMoveIndex(model, &v1, true, 2000, 0));
- EXPECT_EQ(0, ViewModelUtils::DetermineMoveIndex(model, &v2, true, -10, 0));
- EXPECT_EQ(0, ViewModelUtils::DetermineMoveIndex(model, &v2, true, 4, 0));
- EXPECT_EQ(2, ViewModelUtils::DetermineMoveIndex(model, &v2, true, 12, 0));
+ EXPECT_EQ(0u, ViewModelUtils::DetermineMoveIndex(model, &v2, true, -10, 0));
+ EXPECT_EQ(0u, ViewModelUtils::DetermineMoveIndex(model, &v2, true, 4, 0));
+ EXPECT_EQ(2u, ViewModelUtils::DetermineMoveIndex(model, &v2, true, 12, 0));
// Try the same when vertical.
model.set_ideal_bounds(0, gfx::Rect(0, 0, 10, 10));
model.set_ideal_bounds(1, gfx::Rect(0, 10, 10, 1000));
model.set_ideal_bounds(2, gfx::Rect(0, 1010, 10, 2));
- EXPECT_EQ(0, ViewModelUtils::DetermineMoveIndex(model, &v1, false, 0, -10));
- EXPECT_EQ(0, ViewModelUtils::DetermineMoveIndex(model, &v1, false, 0, 4));
- EXPECT_EQ(1, ViewModelUtils::DetermineMoveIndex(model, &v1, false, 0, 506));
- EXPECT_EQ(2, ViewModelUtils::DetermineMoveIndex(model, &v1, false, 0, 1010));
- EXPECT_EQ(2, ViewModelUtils::DetermineMoveIndex(model, &v1, false, 0, 2000));
+ EXPECT_EQ(0u, ViewModelUtils::DetermineMoveIndex(model, &v1, false, 0, -10));
+ EXPECT_EQ(0u, ViewModelUtils::DetermineMoveIndex(model, &v1, false, 0, 4));
+ EXPECT_EQ(1u, ViewModelUtils::DetermineMoveIndex(model, &v1, false, 0, 506));
+ EXPECT_EQ(2u, ViewModelUtils::DetermineMoveIndex(model, &v1, false, 0, 1010));
+ EXPECT_EQ(2u, ViewModelUtils::DetermineMoveIndex(model, &v1, false, 0, 2000));
- EXPECT_EQ(0, ViewModelUtils::DetermineMoveIndex(model, &v2, false, 0, -10));
- EXPECT_EQ(0, ViewModelUtils::DetermineMoveIndex(model, &v2, false, 0, 4));
- EXPECT_EQ(2, ViewModelUtils::DetermineMoveIndex(model, &v2, false, 0, 12));
+ EXPECT_EQ(0u, ViewModelUtils::DetermineMoveIndex(model, &v2, false, 0, -10));
+ EXPECT_EQ(0u, ViewModelUtils::DetermineMoveIndex(model, &v2, false, 0, 4));
+ EXPECT_EQ(2u, ViewModelUtils::DetermineMoveIndex(model, &v2, false, 0, 12));
}
} // namespace views
diff --git a/chromium/ui/views/view_targeter_unittest.cc b/chromium/ui/views/view_targeter_unittest.cc
index 6fadf289d1c..169c65436c3 100644
--- a/chromium/ui/views/view_targeter_unittest.cc
+++ b/chromium/ui/views/view_targeter_unittest.cc
@@ -16,6 +16,7 @@
#include "ui/views/test/views_test_base.h"
#include "ui/views/view_targeter_delegate.h"
#include "ui/views/widget/root_view.h"
+#include "ui/views/widget/unique_widget_ptr.h"
namespace views {
@@ -113,25 +114,21 @@ gfx::Rect ConvertRectFromWidgetToView(View* view, const gfx::Rect& r) {
// and ViewTargeter::FindNextBestTarget() are implemented correctly
// for key events.
TEST_F(ViewTargeterTest, ViewTargeterForKeyEvents) {
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams init_params =
CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- widget.Init(std::move(init_params));
- widget.Show();
-
- View* child = new View;
- View* grandchild = new View;
+ widget->Init(std::move(init_params));
+ widget->Show();
- View* content = widget.SetContentsView(std::make_unique<View>());
- content->AddChildView(child);
- child->AddChildView(grandchild);
+ View* content = widget->SetContentsView(std::make_unique<View>());
+ View* child = content->AddChildView(std::make_unique<View>());
+ View* grandchild = child->AddChildView(std::make_unique<View>());
grandchild->SetFocusBehavior(View::FocusBehavior::ALWAYS);
grandchild->RequestFocus();
internal::RootView* root_view =
- static_cast<internal::RootView*>(widget.GetRootView());
+ static_cast<internal::RootView*>(widget->GetRootView());
ui::EventTargeter* targeter = root_view->targeter();
ui::KeyEvent key_event('a', ui::VKEY_A, ui::DomCode::NONE, ui::EF_NONE);
@@ -148,9 +145,9 @@ TEST_F(ViewTargeterTest, ViewTargeterForKeyEvents) {
current_target = targeter->FindNextBestTarget(child, &key_event);
EXPECT_EQ(content, static_cast<View*>(current_target));
current_target = targeter->FindNextBestTarget(content, &key_event);
- EXPECT_EQ(widget.GetRootView(), static_cast<View*>(current_target));
+ EXPECT_EQ(widget->GetRootView(), static_cast<View*>(current_target));
current_target =
- targeter->FindNextBestTarget(widget.GetRootView(), &key_event);
+ targeter->FindNextBestTarget(widget->GetRootView(), &key_event);
EXPECT_EQ(nullptr, static_cast<View*>(current_target));
}
@@ -158,26 +155,24 @@ TEST_F(ViewTargeterTest, ViewTargeterForKeyEvents) {
// and ViewTargeter::FindNextBestTarget() are implemented correctly
// for scroll events.
TEST_F(ViewTargeterTest, ViewTargeterForScrollEvents) {
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
init_params.bounds = gfx::Rect(0, 0, 200, 200);
- widget.Init(std::move(init_params));
+ widget->Init(std::move(init_params));
// The coordinates used for SetBounds() are in the parent coordinate space.
auto owning_content = std::make_unique<View>();
owning_content->SetBounds(0, 0, 100, 100);
- View* child = new View;
+
+ View* content = widget->SetContentsView(std::move(owning_content));
+ View* child = content->AddChildView(std::make_unique<View>());
child->SetBounds(50, 50, 20, 20);
- View* grandchild = new View;
+ View* grandchild = child->AddChildView(std::make_unique<View>());
grandchild->SetBounds(0, 0, 5, 5);
- View* content = widget.SetContentsView(std::move(owning_content));
- content->AddChildView(child);
- child->AddChildView(grandchild);
-
internal::RootView* root_view =
- static_cast<internal::RootView*>(widget.GetRootView());
+ static_cast<internal::RootView*>(widget->GetRootView());
ui::EventTargeter* targeter = root_view->targeter();
// The event falls within the bounds of |child| and |content| but not
@@ -193,8 +188,8 @@ TEST_F(ViewTargeterTest, ViewTargeterForScrollEvents) {
current_target = targeter->FindNextBestTarget(child, &scroll);
EXPECT_EQ(content, static_cast<View*>(current_target));
current_target = targeter->FindNextBestTarget(content, &scroll);
- EXPECT_EQ(widget.GetRootView(), static_cast<View*>(current_target));
- current_target = targeter->FindNextBestTarget(widget.GetRootView(), &scroll);
+ EXPECT_EQ(widget->GetRootView(), static_cast<View*>(current_target));
+ current_target = targeter->FindNextBestTarget(widget->GetRootView(), &scroll);
EXPECT_EQ(nullptr, static_cast<View*>(current_target));
// The event falls outside of the original specified bounds of |content|,
@@ -208,59 +203,45 @@ TEST_F(ViewTargeterTest, ViewTargeterForScrollEvents) {
}
// Convenience to make constructing a GestureEvent simpler.
-class GestureEventForTest : public ui::GestureEvent {
- public:
- GestureEventForTest(ui::EventType type, int x, int y)
- : GestureEvent(x,
- y,
- 0,
- base::TimeTicks(),
- ui::GestureEventDetails(type)) {}
-
- explicit GestureEventForTest(ui::GestureEventDetails details)
- : GestureEvent(details.bounding_box().CenterPoint().x(),
- details.bounding_box().CenterPoint().y(),
- 0,
- base::TimeTicks(),
- details) {}
-};
+ui::GestureEvent CreateTestGestureEvent(
+ const ui::GestureEventDetails& details) {
+ return ui::GestureEvent(details.bounding_box().CenterPoint().x(),
+ details.bounding_box().CenterPoint().y(), 0,
+ base::TimeTicks(), details);
+}
// Verifies that the the functions ViewTargeter::FindTargetForEvent()
// and ViewTargeter::FindNextBestTarget() are implemented correctly
// for gesture events.
TEST_F(ViewTargeterTest, ViewTargeterForGestureEvents) {
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
init_params.bounds = gfx::Rect(0, 0, 200, 200);
- widget.Init(std::move(init_params));
+ widget->Init(std::move(init_params));
+ View* content = widget->SetContentsView(std::make_unique<View>());
+ content->SetBounds(0, 0, 100, 100);
// The coordinates used for SetBounds() are in the parent coordinate space.
- View* child = new View;
+ View* child = content->AddChildView(std::make_unique<View>());
child->SetBounds(50, 50, 20, 20);
- View* grandchild = new View;
+ View* grandchild = child->AddChildView(std::make_unique<View>());
grandchild->SetBounds(0, 0, 5, 5);
- View* content = widget.SetContentsView(std::make_unique<View>());
- content->SetBounds(0, 0, 100, 100);
- content->AddChildView(child);
- child->AddChildView(grandchild);
-
internal::RootView* root_view =
- static_cast<internal::RootView*>(widget.GetRootView());
+ static_cast<internal::RootView*>(widget->GetRootView());
ui::EventTargeter* targeter = root_view->targeter();
// Define some gesture events for testing.
gfx::RectF bounding_box(gfx::PointF(46.f, 46.f), gfx::SizeF(8.f, 8.f));
ui::GestureEventDetails details(ui::ET_GESTURE_TAP);
details.set_bounding_box(bounding_box);
- GestureEventForTest tap(details);
+ ui::GestureEvent tap = CreateTestGestureEvent(details);
details = ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN);
details.set_bounding_box(bounding_box);
- GestureEventForTest scroll_begin(details);
+ ui::GestureEvent scroll_begin = CreateTestGestureEvent(details);
details = ui::GestureEventDetails(ui::ET_GESTURE_END);
details.set_bounding_box(bounding_box);
- GestureEventForTest end(details);
+ ui::GestureEvent end = CreateTestGestureEvent(details);
// Assume that the view currently handling gestures has been set as
// |grandchild| by a previous gesture event. Thus subsequent TAP and
@@ -312,13 +293,13 @@ TEST_F(ViewTargeterTest, ViewTargeterForGestureEvents) {
// space of the returned view).
details = ui::GestureEventDetails(ui::ET_GESTURE_TAP);
details.set_bounding_box(bounding_box);
- tap = GestureEventForTest(details);
+ tap = CreateTestGestureEvent(details);
details = ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN);
details.set_bounding_box(bounding_box);
- scroll_begin = GestureEventForTest(details);
+ scroll_begin = CreateTestGestureEvent(details);
details = ui::GestureEventDetails(ui::ET_GESTURE_END);
details.set_bounding_box(bounding_box);
- end = GestureEventForTest(details);
+ end = CreateTestGestureEvent(details);
// If no default gesture handler is currently set, targeting should be
// performed using the location of the gesture event for a TAP and a
@@ -338,19 +319,18 @@ TEST_F(ViewTargeterTest, ViewTargeterForGestureEvents) {
// tests that the root view is targeted for gesture events which should
// not be targeted to any other view in the views tree.
TEST_F(ViewTargeterTest, TargetContentsAndRootView) {
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
init_params.bounds = gfx::Rect(0, 0, 200, 200);
- widget.Init(std::move(init_params));
+ widget->Init(std::move(init_params));
// The coordinates used for SetBounds() are in the parent coordinate space.
auto owning_content = std::make_unique<View>();
owning_content->SetBounds(0, 0, 100, 100);
- View* content = widget.SetContentsView(std::move(owning_content));
+ View* content = widget->SetContentsView(std::move(owning_content));
internal::RootView* root_view =
- static_cast<internal::RootView*>(widget.GetRootView());
+ static_cast<internal::RootView*>(widget->GetRootView());
ui::EventTargeter* targeter = root_view->targeter();
// A gesture event located entirely within the contents view should
@@ -358,7 +338,7 @@ TEST_F(ViewTargeterTest, TargetContentsAndRootView) {
gfx::RectF bounding_box(gfx::PointF(96.f, 96.f), gfx::SizeF(8.f, 8.f));
ui::GestureEventDetails details(ui::ET_GESTURE_TAP);
details.set_bounding_box(bounding_box);
- GestureEventForTest tap(details);
+ ui::GestureEvent tap = CreateTestGestureEvent(details);
EXPECT_EQ(content, targeter->FindTargetForEvent(root_view, &tap));
@@ -367,7 +347,7 @@ TEST_F(ViewTargeterTest, TargetContentsAndRootView) {
// the contents view.
bounding_box = gfx::RectF(gfx::PointF(194.f, 100.f), gfx::SizeF(8.f, 8.f));
details.set_bounding_box(bounding_box);
- tap = GestureEventForTest(details);
+ tap = CreateTestGestureEvent(details);
EXPECT_EQ(content, targeter->FindTargetForEvent(root_view, &tap));
@@ -376,7 +356,7 @@ TEST_F(ViewTargeterTest, TargetContentsAndRootView) {
// target the contents view.
bounding_box = gfx::RectF(gfx::PointF(50.f, 0.f), gfx::SizeF(400.f, 200.f));
details.set_bounding_box(bounding_box);
- tap = GestureEventForTest(details);
+ tap = CreateTestGestureEvent(details);
EXPECT_EQ(content, targeter->FindTargetForEvent(root_view, &tap));
@@ -385,25 +365,25 @@ TEST_F(ViewTargeterTest, TargetContentsAndRootView) {
// be targeted to the root view.
bounding_box = gfx::RectF(gfx::PointF(196.f, 100.f), gfx::SizeF(8.f, 8.f));
details.set_bounding_box(bounding_box);
- tap = GestureEventForTest(details);
+ tap = CreateTestGestureEvent(details);
- EXPECT_EQ(widget.GetRootView(),
+ EXPECT_EQ(widget->GetRootView(),
targeter->FindTargetForEvent(root_view, &tap));
// A gesture event completely outside the contents view should be targeted
// to the root view.
bounding_box = gfx::RectF(gfx::PointF(205.f, 100.f), gfx::SizeF(8.f, 8.f));
details.set_bounding_box(bounding_box);
- tap = GestureEventForTest(details);
+ tap = CreateTestGestureEvent(details);
- EXPECT_EQ(widget.GetRootView(),
+ EXPECT_EQ(widget->GetRootView(),
targeter->FindTargetForEvent(root_view, &tap));
// A gesture event with dimensions 1x1 located entirely within the
// contents view should target the contents view.
bounding_box = gfx::RectF(gfx::PointF(175.f, 100.f), gfx::SizeF(1.f, 1.f));
details.set_bounding_box(bounding_box);
- tap = GestureEventForTest(details);
+ tap = CreateTestGestureEvent(details);
EXPECT_EQ(content, targeter->FindTargetForEvent(root_view, &tap));
@@ -411,37 +391,32 @@ TEST_F(ViewTargeterTest, TargetContentsAndRootView) {
// contents view should be targeted to the root view.
bounding_box = gfx::RectF(gfx::PointF(205.f, 100.f), gfx::SizeF(1.f, 1.f));
details.set_bounding_box(bounding_box);
- tap = GestureEventForTest(details);
+ tap = CreateTestGestureEvent(details);
- EXPECT_EQ(widget.GetRootView(),
+ EXPECT_EQ(widget->GetRootView(),
targeter->FindTargetForEvent(root_view, &tap));
}
// Tests that calls to FindTargetForEvent() and FindNextBestTarget() change
// the location of a gesture event to be in the correct coordinate space.
TEST_F(ViewTargeterTest, GestureEventCoordinateConversion) {
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
init_params.bounds = gfx::Rect(0, 0, 200, 200);
- widget.Init(std::move(init_params));
+ widget->Init(std::move(init_params));
// The coordinates used for SetBounds() are in the parent coordinate space.
- View* child = new View;
+ View* content = widget->SetContentsView(std::make_unique<View>());
+ content->SetBounds(0, 0, 100, 100);
+ View* child = content->AddChildView(std::make_unique<View>());
child->SetBounds(50, 50, 20, 20);
- View* grandchild = new View;
+ View* grandchild = child->AddChildView(std::make_unique<View>());
grandchild->SetBounds(5, 5, 10, 10);
- View* great_grandchild = new View;
+ View* great_grandchild = grandchild->AddChildView(std::make_unique<View>());
great_grandchild->SetBounds(3, 3, 4, 4);
- View* content = widget.SetContentsView(std::make_unique<View>());
- content->SetBounds(0, 0, 100, 100);
- content->AddChildView(child);
- child->AddChildView(grandchild);
- grandchild->AddChildView(great_grandchild);
-
internal::RootView* root_view =
- static_cast<internal::RootView*>(widget.GetRootView());
+ static_cast<internal::RootView*>(widget->GetRootView());
ui::EventTargeter* targeter = root_view->targeter();
// Define a GESTURE_TAP event with a bounding box centered at (60, 60)
@@ -450,7 +425,7 @@ TEST_F(ViewTargeterTest, GestureEventCoordinateConversion) {
gfx::PointF center_point(bounding_box.CenterPoint());
ui::GestureEventDetails details(ui::ET_GESTURE_TAP);
details.set_bounding_box(bounding_box);
- GestureEventForTest tap(details);
+ ui::GestureEvent tap = CreateTestGestureEvent(details);
// Calculate the location of the gesture in each of the different
// coordinate spaces.
@@ -498,13 +473,13 @@ TEST_F(ViewTargeterTest, GestureEventCoordinateConversion) {
// The next target should be |root_view| and the location of
// the event should be changed into the coordinate space of the target.
- EXPECT_EQ(widget.GetRootView(), targeter->FindNextBestTarget(content, &tap));
+ EXPECT_EQ(widget->GetRootView(), targeter->FindNextBestTarget(content, &tap));
EXPECT_EQ(location_in_root, tap.location());
- SetGestureHandler(root_view, widget.GetRootView());
+ SetGestureHandler(root_view, widget->GetRootView());
// The next target should be NULL and the location of the event should
// remain unchanged.
- EXPECT_EQ(nullptr, targeter->FindNextBestTarget(widget.GetRootView(), &tap));
+ EXPECT_EQ(nullptr, targeter->FindNextBestTarget(widget->GetRootView(), &tap));
EXPECT_EQ(location_in_root, tap.location());
}
@@ -514,49 +489,46 @@ TEST_F(ViewTargeterTest, GestureEventCoordinateConversion) {
// Also verifies that ViewTargeterDelegate::DoesIntersectRect() can
// be called from the ViewTargeter installed on RootView.
TEST_F(ViewTargeterTest, DoesIntersectRect) {
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(0, 0, 650, 650);
- widget.Init(std::move(params));
+ widget->Init(std::move(params));
internal::RootView* root_view =
- static_cast<internal::RootView*>(widget.GetRootView());
+ static_cast<internal::RootView*>(widget->GetRootView());
ViewTargeter* view_targeter = root_view->targeter();
// The coordinates used for SetBounds() are in the parent coordinate space.
- TestingView v2;
- TestMaskedView v1, v3;
- v1.SetBounds(0, 0, 200, 200);
- v2.SetBounds(300, 0, 300, 300);
- v3.SetBounds(0, 0, 100, 100);
- root_view->AddChildView(&v1);
- root_view->AddChildView(&v2);
- v2.AddChildView(&v3);
+ auto* v1 = root_view->AddChildView(std::make_unique<TestMaskedView>());
+ v1->SetBounds(0, 0, 200, 200);
+ auto* v2 = root_view->AddChildView(std::make_unique<TestingView>());
+ v2->SetBounds(300, 0, 300, 300);
+ auto* v3 = v2->AddChildView(std::make_unique<TestMaskedView>());
+ v3->SetBounds(0, 0, 100, 100);
// The coordinates used below are in the local coordinate space of the
// view that is passed in as an argument.
// Hit tests against |v1|, which has a hit test mask.
- EXPECT_TRUE(v1.TestDoesIntersectRect(&v1, gfx::Rect(0, 0, 200, 200)));
- EXPECT_TRUE(v1.TestDoesIntersectRect(&v1, gfx::Rect(-10, -10, 110, 12)));
- EXPECT_TRUE(v1.TestDoesIntersectRect(&v1, gfx::Rect(112, 142, 1, 1)));
- EXPECT_FALSE(v1.TestDoesIntersectRect(&v1, gfx::Rect(0, 0, 20, 20)));
- EXPECT_FALSE(v1.TestDoesIntersectRect(&v1, gfx::Rect(-10, -10, 90, 12)));
- EXPECT_FALSE(v1.TestDoesIntersectRect(&v1, gfx::Rect(150, 49, 1, 1)));
+ EXPECT_TRUE(v1->TestDoesIntersectRect(v1, gfx::Rect(0, 0, 200, 200)));
+ EXPECT_TRUE(v1->TestDoesIntersectRect(v1, gfx::Rect(-10, -10, 110, 12)));
+ EXPECT_TRUE(v1->TestDoesIntersectRect(v1, gfx::Rect(112, 142, 1, 1)));
+ EXPECT_FALSE(v1->TestDoesIntersectRect(v1, gfx::Rect(0, 0, 20, 20)));
+ EXPECT_FALSE(v1->TestDoesIntersectRect(v1, gfx::Rect(-10, -10, 90, 12)));
+ EXPECT_FALSE(v1->TestDoesIntersectRect(v1, gfx::Rect(150, 49, 1, 1)));
// Hit tests against |v2|, which does not have a hit test mask.
- EXPECT_TRUE(v2.TestDoesIntersectRect(&v2, gfx::Rect(0, 0, 200, 200)));
- EXPECT_TRUE(v2.TestDoesIntersectRect(&v2, gfx::Rect(-10, 250, 60, 60)));
- EXPECT_TRUE(v2.TestDoesIntersectRect(&v2, gfx::Rect(250, 250, 1, 1)));
- EXPECT_FALSE(v2.TestDoesIntersectRect(&v2, gfx::Rect(-10, 250, 7, 7)));
- EXPECT_FALSE(v2.TestDoesIntersectRect(&v2, gfx::Rect(-1, -1, 1, 1)));
+ EXPECT_TRUE(v2->TestDoesIntersectRect(v2, gfx::Rect(0, 0, 200, 200)));
+ EXPECT_TRUE(v2->TestDoesIntersectRect(v2, gfx::Rect(-10, 250, 60, 60)));
+ EXPECT_TRUE(v2->TestDoesIntersectRect(v2, gfx::Rect(250, 250, 1, 1)));
+ EXPECT_FALSE(v2->TestDoesIntersectRect(v2, gfx::Rect(-10, 250, 7, 7)));
+ EXPECT_FALSE(v2->TestDoesIntersectRect(v2, gfx::Rect(-1, -1, 1, 1)));
// Hit tests against |v3|, which has a hit test mask and is a child of |v2|.
- EXPECT_TRUE(v3.TestDoesIntersectRect(&v3, gfx::Rect(0, 0, 50, 50)));
- EXPECT_TRUE(v3.TestDoesIntersectRect(&v3, gfx::Rect(90, 90, 1, 1)));
- EXPECT_FALSE(v3.TestDoesIntersectRect(&v3, gfx::Rect(10, 125, 50, 50)));
- EXPECT_FALSE(v3.TestDoesIntersectRect(&v3, gfx::Rect(110, 110, 1, 1)));
+ EXPECT_TRUE(v3->TestDoesIntersectRect(v3, gfx::Rect(0, 0, 50, 50)));
+ EXPECT_TRUE(v3->TestDoesIntersectRect(v3, gfx::Rect(90, 90, 1, 1)));
+ EXPECT_FALSE(v3->TestDoesIntersectRect(v3, gfx::Rect(10, 125, 50, 50)));
+ EXPECT_FALSE(v3->TestDoesIntersectRect(v3, gfx::Rect(110, 110, 1, 1)));
// Verify that hit-testing is performed correctly when using the
// call-through function ViewTargeter::DoesIntersectRect().
@@ -570,7 +542,7 @@ TEST_F(ViewTargeterTest, DoesIntersectRect) {
// (HitTestPoint(), HitTestRect(), etc.) return the correct values.
TEST_F(ViewTargeterTest, HitTestCallsOnView) {
// The coordinates in this test are in the coordinate space of the root view.
- Widget* widget = new Widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
widget->Init(std::move(params));
View* root_view = widget->GetRootView();
@@ -580,18 +552,16 @@ TEST_F(ViewTargeterTest, HitTestCallsOnView) {
// means that View::HitTestRect() will call into the targeter installed on
// the root view instead when we hit test against |v1|.
gfx::Rect v1_bounds = gfx::Rect(0, 0, 100, 100);
- TestingView* v1 = new TestingView();
+ TestingView* v1 = root_view->AddChildView(std::make_unique<TestingView>());
v1->SetBoundsRect(v1_bounds);
- root_view->AddChildView(v1);
// |v2| has a triangular hit test mask. Install a ViewTargeter on |v2| which
// will be called into by View::HitTestRect().
gfx::Rect v2_bounds = gfx::Rect(105, 0, 100, 100);
- TestMaskedView* v2 = new TestMaskedView();
+ TestMaskedView* v2 =
+ root_view->AddChildView(std::make_unique<TestMaskedView>());
v2->SetBoundsRect(v2_bounds);
- root_view->AddChildView(v2);
- ViewTargeter* view_targeter = new ViewTargeter(v2);
- v2->SetEventTargeter(base::WrapUnique(view_targeter));
+ v2->SetEventTargeter(std::make_unique<ViewTargeter>(v2));
gfx::Point v1_centerpoint = v1_bounds.CenterPoint();
gfx::Point v2_centerpoint = v2_bounds.CenterPoint();
@@ -639,30 +609,27 @@ TEST_F(ViewTargeterTest, HitTestCallsOnView) {
EXPECT_EQ(root_view, root_view->GetTooltipHandlerForPoint(v2_origin));
EXPECT_FALSE(v1->GetTooltipHandlerForPoint(v2_origin));
-
- widget->CloseNow();
}
TEST_F(ViewTargeterTest, FavorChildContainingHitBounds) {
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
init_params.bounds = gfx::Rect(0, 0, 200, 200);
- widget.Init(std::move(init_params));
+ widget->Init(std::move(init_params));
- View* content = widget.SetContentsView(std::make_unique<View>());
+ View* content = widget->SetContentsView(std::make_unique<View>());
content->SetBounds(0, 0, 50, 50);
View* child = content->AddChildView(std::make_unique<View>());
child->SetBounds(2, 2, 50, 50);
internal::RootView* root_view =
- static_cast<internal::RootView*>(widget.GetRootView());
+ static_cast<internal::RootView*>(widget->GetRootView());
ui::EventTargeter* targeter = root_view->targeter();
gfx::RectF bounding_box(gfx::PointF(4.f, 4.f), gfx::SizeF(42.f, 42.f));
ui::GestureEventDetails details(ui::ET_GESTURE_TAP);
details.set_bounding_box(bounding_box);
- GestureEventForTest tap(details);
+ ui::GestureEvent tap = CreateTestGestureEvent(details);
EXPECT_EQ(child, targeter->FindTargetForEvent(root_view, &tap));
}
diff --git a/chromium/ui/views/view_unittest.cc b/chromium/ui/views/view_unittest.cc
index 7fd47779e44..52f00ad4191 100644
--- a/chromium/ui/views/view_unittest.cc
+++ b/chromium/ui/views/view_unittest.cc
@@ -59,10 +59,13 @@
#include "ui/views/paint_info.h"
#include "ui/views/test/view_metadata_test_utils.h"
#include "ui/views/test/views_test_base.h"
+#include "ui/views/test/widget_test.h"
#include "ui/views/view_observer.h"
+#include "ui/views/view_utils.h"
#include "ui/views/views_features.h"
#include "ui/views/widget/native_widget.h"
#include "ui/views/widget/root_view.h"
+#include "ui/views/widget/unique_widget_ptr.h"
#include "ui/views/window/dialog_delegate.h"
using testing::ElementsAre;
@@ -445,22 +448,20 @@ void TestView::OnMouseExited(const ui::MouseEvent& event) {
}
TEST_F(ViewTest, MouseEvent) {
- TestView* v1 = new TestView();
- v1->SetBoundsRect(gfx::Rect(0, 0, 300, 300));
+ auto view1 = std::make_unique<TestView>();
+ view1->SetBoundsRect(gfx::Rect(0, 0, 300, 300));
- TestView* v2 = new TestView();
- v2->SetBoundsRect(gfx::Rect(100, 100, 100, 100));
+ auto view2 = std::make_unique<TestView>();
+ view2->SetBoundsRect(gfx::Rect(100, 100, 100, 100));
- std::unique_ptr<Widget> widget(new Widget);
+ UniqueWidgetPtr widget(std::make_unique<Widget>());
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(50, 50, 650, 650);
widget->Init(std::move(params));
- internal::RootView* root =
- static_cast<internal::RootView*>(widget->GetRootView());
+ auto* root = AsViewClass<internal::RootView>(widget->GetRootView());
- root->AddChildView(v1);
- v1->AddChildView(v2);
+ TestView* v1 = root->AddChildView(std::move(view1));
+ TestView* v2 = v1->AddChildView(std::move(view2));
v1->Reset();
v2->Reset();
@@ -499,30 +500,27 @@ TEST_F(ViewTest, MouseEvent) {
EXPECT_EQ(v2->location_.y(), -100);
// Make sure v1 did not receive the event
EXPECT_EQ(v1->last_mouse_event_type_, 0);
-
- widget->CloseNow();
}
// Confirm that a view can be deleted as part of processing a mouse press.
TEST_F(ViewTest, DeleteOnPressed) {
- TestView* v1 = new TestView();
- v1->SetBoundsRect(gfx::Rect(0, 0, 300, 300));
+ auto view1 = std::make_unique<TestView>();
+ view1->SetBoundsRect(gfx::Rect(0, 0, 300, 300));
- TestView* v2 = new TestView();
- v2->SetBoundsRect(gfx::Rect(100, 100, 100, 100));
+ auto view2 = std::make_unique<TestView>();
+ view2->SetBoundsRect(gfx::Rect(100, 100, 100, 100));
- v1->Reset();
- v2->Reset();
+ view1->Reset();
+ view2->Reset();
- std::unique_ptr<Widget> widget(new Widget);
+ UniqueWidgetPtr widget(std::make_unique<Widget>());
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(50, 50, 650, 650);
widget->Init(std::move(params));
View* root = widget->GetRootView();
- root->AddChildView(v1);
- v1->AddChildView(v2);
+ TestView* v1 = root->AddChildView(std::move(view1));
+ TestView* v2 = v1->AddChildView(std::move(view2));
v2->delete_on_pressed_ = true;
gfx::Point point(110, 120);
@@ -531,8 +529,6 @@ TEST_F(ViewTest, DeleteOnPressed) {
ui::EF_LEFT_MOUSE_BUTTON);
root->OnMousePressed(pressed);
EXPECT_TRUE(v1->children().empty());
-
- widget->CloseNow();
}
////////////////////////////////////////////////////////////////////////////////
@@ -2178,38 +2174,38 @@ class TestViewWidget {
public:
TestViewWidget(Widget::InitParams create_params,
ui::Accelerator* initial_accelerator,
- bool show_after_init = true)
- : view_(new TestView) {
- view_->Reset();
+ bool show_after_init = true) {
+ auto view = std::make_unique<TestView>();
+ view->Reset();
// Register a keyboard accelerator before the view is added to a window.
if (initial_accelerator) {
- view_->AddAccelerator(*initial_accelerator);
- EXPECT_EQ(view_->accelerator_count_map_[*initial_accelerator], 0);
+ view->AddAccelerator(*initial_accelerator);
+ EXPECT_EQ(view->accelerator_count_map_[*initial_accelerator], 0);
}
+ widget_ = std::make_unique<Widget>();
// Create a window and add the view as its child.
Widget::InitParams params = std::move(create_params);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(0, 0, 100, 100);
- widget_.Init(std::move(params));
- View* root = widget_.GetRootView();
- root->AddChildView(view_.get());
+ widget_->Init(std::move(params));
+ View* root = widget_->GetRootView();
+ view_ = root->AddChildView(std::move(view));
if (show_after_init)
- widget_.Show();
+ widget_->Show();
- EXPECT_TRUE(widget_.GetFocusManager());
+ EXPECT_TRUE(widget_->GetFocusManager());
}
TestViewWidget(const TestViewWidget&) = delete;
TestViewWidget& operator=(const TestViewWidget&) = delete;
TestView* view() { return view_; }
- Widget* widget() { return &widget_; }
+ Widget* widget() { return widget_.get(); }
private:
raw_ptr<TestView> view_;
- Widget widget_;
+ UniqueWidgetPtr widget_;
};
} // namespace
@@ -2450,19 +2446,17 @@ class ToplevelWidgetObserverView : public View {
// View::ViewHierarchyChanged() and View::NativeViewHierarchyChanged().
// b) a widget has the correct parent after reparenting.
TEST_F(ViewTest, NativeViewHierarchyChanged) {
- std::unique_ptr<Widget> toplevel1(new Widget);
+ UniqueWidgetPtr toplevel1 = std::make_unique<Widget>();
Widget::InitParams toplevel1_params =
CreateParams(Widget::InitParams::TYPE_POPUP);
- toplevel1_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
toplevel1->Init(std::move(toplevel1_params));
- std::unique_ptr<Widget> toplevel2(new Widget);
+ UniqueWidgetPtr toplevel2 = std::make_unique<Widget>();
Widget::InitParams toplevel2_params =
CreateParams(Widget::InitParams::TYPE_POPUP);
- toplevel2_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
toplevel2->Init(std::move(toplevel2_params));
- Widget* child = new Widget;
+ UniqueWidgetPtr child = std::make_unique<Widget>();
Widget::InitParams child_params(Widget::InitParams::TYPE_CONTROL);
child_params.parent = toplevel1->GetNativeView();
child->Init(std::move(child_params));
@@ -2517,21 +2511,21 @@ class TransformPaintView : public TestView {
};
TEST_F(ViewTest, TransformPaint) {
- TransformPaintView* v1 = new TransformPaintView();
- v1->SetBoundsRect(gfx::Rect(0, 0, 500, 300));
+ auto view1 = std::make_unique<TransformPaintView>();
+ view1->SetBoundsRect(gfx::Rect(0, 0, 500, 300));
- TestView* v2 = new TestView();
- v2->SetBoundsRect(gfx::Rect(100, 100, 200, 100));
+ auto view2 = std::make_unique<TestView>();
+ view2->SetBoundsRect(gfx::Rect(100, 100, 200, 100));
- Widget* widget = new Widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
params.bounds = gfx::Rect(50, 50, 650, 650);
widget->Init(std::move(params));
widget->Show();
View* root = widget->GetRootView();
- root->AddChildView(v1);
- v1->AddChildView(v2);
+ TransformPaintView* v1 = root->AddChildView(std::move(view1));
+ TestView* v2 = v1->AddChildView(std::move(view2));
// At this moment, |v2| occupies (100, 100) to (300, 200) in |root|.
v1->ClearScheduledPaintRect();
@@ -2551,25 +2545,23 @@ TEST_F(ViewTest, TransformPaint) {
v2->SchedulePaint();
EXPECT_EQ(gfx::Rect(100, 200, 100, 200), v1->scheduled_paint_rect());
-
- widget->CloseNow();
}
TEST_F(ViewTest, TransformEvent) {
- TestView* v1 = new TestView();
- v1->SetBoundsRect(gfx::Rect(0, 0, 500, 300));
+ auto view1 = std::make_unique<TestView>();
+ view1->SetBoundsRect(gfx::Rect(0, 0, 500, 300));
- TestView* v2 = new TestView();
- v2->SetBoundsRect(gfx::Rect(100, 100, 200, 100));
+ auto view2 = std::make_unique<TestView>();
+ view2->SetBoundsRect(gfx::Rect(100, 100, 200, 100));
- Widget* widget = new Widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
params.bounds = gfx::Rect(50, 50, 650, 650);
widget->Init(std::move(params));
View* root = widget->GetRootView();
- root->AddChildView(v1);
- v1->AddChildView(v2);
+ TestView* v1 = root->AddChildView(std::move(view1));
+ TestView* v2 = v1->AddChildView(std::move(view2));
// At this moment, |v2| occupies (100, 100) to (300, 200) in |root|.
@@ -2622,9 +2614,9 @@ TEST_F(ViewTest, TransformEvent) {
v1->SetTransform(gfx::Transform());
v2->SetTransform(gfx::Transform());
- TestView* v3 = new TestView();
- v3->SetBoundsRect(gfx::Rect(10, 10, 20, 30));
- v2->AddChildView(v3);
+ auto view3 = std::make_unique<TestView>();
+ view3->SetBoundsRect(gfx::Rect(10, 10, 20, 30));
+ TestView* v3 = v2->AddChildView(std::move(view3));
// Rotate |v3| clockwise with respect to |v2|.
transform = v1->GetTransform();
@@ -2693,16 +2685,13 @@ TEST_F(ViewTest, TransformEvent) {
EXPECT_EQ(25, v3->location_.y());
root->OnMouseReleased(released);
-
- widget->CloseNow();
}
TEST_F(ViewTest, TransformVisibleBound) {
gfx::Rect viewport_bounds(0, 0, 100, 100);
- std::unique_ptr<Widget> widget(new Widget);
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = viewport_bounds;
widget->Init(std::move(params));
widget->GetRootView()->SetBoundsRect(viewport_bounds);
@@ -2722,8 +2711,6 @@ TEST_F(ViewTest, TransformVisibleBound) {
transform.matrix().setRC(1, 3, 50.f);
child->SetTransform(transform);
EXPECT_EQ(gfx::Rect(40, 0, 10, 50), child->GetVisibleBounds());
-
- widget->CloseNow();
}
////////////////////////////////////////////////////////////////////////////////
@@ -2756,9 +2743,8 @@ class VisibleBoundsView : public View {
TEST_F(ViewTest, OnVisibleBoundsChanged) {
gfx::Rect viewport_bounds(0, 0, 100, 100);
- std::unique_ptr<Widget> widget(new Widget);
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = viewport_bounds;
widget->Init(std::move(params));
widget->GetRootView()->SetBoundsRect(viewport_bounds);
@@ -2792,62 +2778,60 @@ TEST_F(ViewTest, OnVisibleBoundsChanged) {
EXPECT_TRUE(child->received_notification());
EXPECT_EQ(1, child->GetVisibleBounds().height());
child->set_received_notification(false);
-
- widget->CloseNow();
}
TEST_F(ViewTest, SetBoundsPaint) {
- TestView top_view;
- TestView* child_view = new TestView;
+ auto top_view = std::make_unique<TestView>();
+ auto child = std::make_unique<TestView>();
- top_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100));
- top_view.scheduled_paint_rects_.clear();
- child_view->SetBoundsRect(gfx::Rect(10, 10, 20, 20));
- top_view.AddChildView(child_view);
+ top_view->SetBoundsRect(gfx::Rect(0, 0, 100, 100));
+ top_view->scheduled_paint_rects_.clear();
+ child->SetBoundsRect(gfx::Rect(10, 10, 20, 20));
+ TestView* child_view = top_view->AddChildView(std::move(child));
- top_view.scheduled_paint_rects_.clear();
+ top_view->scheduled_paint_rects_.clear();
child_view->SetBoundsRect(gfx::Rect(30, 30, 20, 20));
- EXPECT_EQ(2U, top_view.scheduled_paint_rects_.size());
+ EXPECT_EQ(2U, top_view->scheduled_paint_rects_.size());
// There should be 2 rects, spanning from (10, 10) to (50, 50).
- gfx::Rect paint_rect = top_view.scheduled_paint_rects_[0];
- paint_rect.Union(top_view.scheduled_paint_rects_[1]);
+ gfx::Rect paint_rect = top_view->scheduled_paint_rects_[0];
+ paint_rect.Union(top_view->scheduled_paint_rects_[1]);
EXPECT_EQ(gfx::Rect(10, 10, 40, 40), paint_rect);
}
// Assertions around painting and focus gain/lost.
TEST_F(ViewTest, FocusBlurPaints) {
- TestView parent_view;
- TestView* child_view1 = new TestView; // Owned by |parent_view|.
+ auto parent_view = std::make_unique<TestView>();
+ auto child = std::make_unique<TestView>(); // Owned by |parent_view|.
- parent_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100));
+ parent_view->SetBoundsRect(gfx::Rect(0, 0, 100, 100));
- child_view1->SetBoundsRect(gfx::Rect(0, 0, 20, 20));
- parent_view.AddChildView(child_view1);
+ child->SetBoundsRect(gfx::Rect(0, 0, 20, 20));
+ TestView* child_view = parent_view->AddChildView(std::move(child));
- parent_view.scheduled_paint_rects_.clear();
- child_view1->scheduled_paint_rects_.clear();
+ parent_view->scheduled_paint_rects_.clear();
+ child_view->scheduled_paint_rects_.clear();
// Focus change shouldn't trigger paints.
- child_view1->DoFocus();
+ child_view->DoFocus();
- EXPECT_TRUE(parent_view.scheduled_paint_rects_.empty());
- EXPECT_TRUE(child_view1->scheduled_paint_rects_.empty());
+ EXPECT_TRUE(parent_view->scheduled_paint_rects_.empty());
+ EXPECT_TRUE(child_view->scheduled_paint_rects_.empty());
- child_view1->DoBlur();
- EXPECT_TRUE(parent_view.scheduled_paint_rects_.empty());
- EXPECT_TRUE(child_view1->scheduled_paint_rects_.empty());
+ child_view->DoBlur();
+ EXPECT_TRUE(parent_view->scheduled_paint_rects_.empty());
+ EXPECT_TRUE(child_view->scheduled_paint_rects_.empty());
}
// Verifies SetBounds(same bounds) doesn't trigger a SchedulePaint().
TEST_F(ViewTest, SetBoundsSameBoundsDoesntSchedulePaint) {
- TestView view;
+ auto view = std::make_unique<TestView>();
- view.SetBoundsRect(gfx::Rect(0, 0, 100, 100));
- view.InvalidateLayout();
- view.scheduled_paint_rects_.clear();
- view.SetBoundsRect(gfx::Rect(0, 0, 100, 100));
- EXPECT_TRUE(view.scheduled_paint_rects_.empty());
+ view->SetBoundsRect(gfx::Rect(0, 0, 100, 100));
+ view->InvalidateLayout();
+ view->scheduled_paint_rects_.clear();
+ view->SetBoundsRect(gfx::Rect(0, 0, 100, 100));
+ EXPECT_TRUE(view->scheduled_paint_rects_.empty());
}
// Verifies AddChildView() and RemoveChildView() schedule appropriate paints.
@@ -2856,9 +2840,8 @@ TEST_F(ViewTest, AddAndRemoveSchedulePaints) {
// We have to put the View hierarchy into a Widget or no paints will be
// scheduled.
- std::unique_ptr<Widget> widget(new Widget);
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = viewport_bounds;
widget->Init(std::move(params));
widget->GetRootView()->SetBoundsRect(viewport_bounds);
@@ -2878,8 +2861,6 @@ TEST_F(ViewTest, AddAndRemoveSchedulePaints) {
std::unique_ptr<View> child_deleter(child_view);
ASSERT_EQ(1U, parent_view->scheduled_paint_rects_.size());
EXPECT_EQ(child_view->bounds(), parent_view->scheduled_paint_rects_.front());
-
- widget->CloseNow();
}
// Tests conversion methods with a transform.
@@ -3073,14 +3054,12 @@ TEST_F(ViewTest, ConversionsWithTransform) {
// Tests conversion methods to and from screen coordinates.
TEST_F(ViewTest, ConversionsToFromScreen) {
- std::unique_ptr<Widget> widget(new Widget);
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(50, 50, 650, 650);
widget->Init(std::move(params));
- View* child = new View;
- widget->GetRootView()->AddChildView(child);
+ View* child = widget->GetRootView()->AddChildView(std::make_unique<View>());
child->SetBounds(10, 10, 100, 200);
gfx::Transform t;
t.Scale(0.5, 0.5);
@@ -3105,17 +3084,14 @@ TEST_F(ViewTest, ConversionsToFromScreen) {
// Tests conversion methods for rectangles.
TEST_F(ViewTest, ConvertRectWithTransform) {
- std::unique_ptr<Widget> widget(new Widget);
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(50, 50, 650, 650);
widget->Init(std::move(params));
View* root = widget->GetRootView();
- TestView* v1 = new TestView;
- TestView* v2 = new TestView;
- root->AddChildView(v1);
- v1->AddChildView(v2);
+ TestView* v1 = root->AddChildView(std::make_unique<TestView>());
+ TestView* v2 = v1->AddChildView(std::make_unique<TestView>());
v1->SetBoundsRect(gfx::Rect(10, 10, 500, 500));
v2->SetBoundsRect(gfx::Rect(20, 20, 100, 200));
@@ -3146,8 +3122,6 @@ TEST_F(ViewTest, ConvertRectWithTransform) {
// |v2| now occupies (20, 20) to (120, 70) in |widget|
EXPECT_EQ(gfx::Rect(22, 60, 21, 8).ToString(),
v2->ConvertRectToWidget(rect).ToString());
-
- widget->CloseNow();
}
class ObserverView : public View {
@@ -3210,133 +3184,131 @@ void ObserverView::ViewHierarchyChanged(
// down).
// The tree looks like this:
// v1
-// +-- v2
+// +-- v2(view2)
// +-- v3
// +-- v4 (starts here, then get reparented to v1)
TEST_F(ViewTest, ViewHierarchyChanged) {
- ObserverView v1;
+ auto view1 = std::make_unique<ObserverView>();
+ ObserverView* v1 = view1.get();
- ObserverView* v3 = new ObserverView();
+ auto view3 = std::make_unique<ObserverView>();
- // Add |v3| to |v2|.
- std::unique_ptr<ObserverView> v2(new ObserverView());
- v2->AddChildView(v3);
+ auto view2 = std::make_unique<ObserverView>();
+ ObserverView* v3 = view2->AddChildView(std::move(view3));
- // Make sure both |v2| and |v3| receive the ViewHierarchyChanged()
+ // Make sure both |view2| and |v3| receive the ViewHierarchyChanged()
// notification.
- EXPECT_TRUE(v2->has_add_details());
- EXPECT_FALSE(v2->has_remove_details());
- EXPECT_EQ(v2.get(), v2->add_details().parent);
- EXPECT_EQ(v3, v2->add_details().child);
- EXPECT_EQ(nullptr, v2->add_details().move_view);
+ EXPECT_TRUE(view2->has_add_details());
+ EXPECT_FALSE(view2->has_remove_details());
+ EXPECT_EQ(view2.get(), view2->add_details().parent);
+ EXPECT_EQ(v3, view2->add_details().child);
+ EXPECT_EQ(nullptr, view2->add_details().move_view);
EXPECT_TRUE(v3->has_add_details());
EXPECT_FALSE(v3->has_remove_details());
- EXPECT_EQ(v2.get(), v3->add_details().parent);
+ EXPECT_EQ(view2.get(), v3->add_details().parent);
EXPECT_EQ(v3, v3->add_details().child);
EXPECT_EQ(nullptr, v3->add_details().move_view);
// Reset everything to the initial state.
- v2->ResetTestState();
+ view2->ResetTestState();
v3->ResetTestState();
- // Add |v2| to v1.
- v1.AddChildView(v2.get());
+ // Add |view2| to |view1|.
+ ObserverView* v2 = view1->AddChildView(std::move(view2));
- // Verifies that |v2| is the child view *added* and the parent view is |v1|.
- // Make sure all the views (v1, v2, v3) received _that_ information.
- EXPECT_TRUE(v1.has_add_details());
- EXPECT_FALSE(v1.has_remove_details());
- EXPECT_EQ(&v1, v1.add_details().parent);
- EXPECT_EQ(v2.get(), v1.add_details().child);
- EXPECT_EQ(nullptr, v1.add_details().move_view);
+ // Verifies that |v2| is the child view *added* and the parent view is
+ // |v1|. Make sure all the views (v1, v2, v3) received _that_ information.
+ EXPECT_TRUE(v1->has_add_details());
+ EXPECT_FALSE(v1->has_remove_details());
+ EXPECT_EQ(v1, view1->add_details().parent);
+ EXPECT_EQ(v2, view1->add_details().child);
+ EXPECT_EQ(nullptr, view1->add_details().move_view);
EXPECT_TRUE(v2->has_add_details());
EXPECT_FALSE(v2->has_remove_details());
- EXPECT_EQ(&v1, v2->add_details().parent);
- EXPECT_EQ(v2.get(), v2->add_details().child);
+ EXPECT_EQ(v1, v2->add_details().parent);
+ EXPECT_EQ(v2, v2->add_details().child);
EXPECT_EQ(nullptr, v2->add_details().move_view);
EXPECT_TRUE(v3->has_add_details());
EXPECT_FALSE(v3->has_remove_details());
- EXPECT_EQ(&v1, v3->add_details().parent);
- EXPECT_EQ(v2.get(), v3->add_details().child);
+ EXPECT_EQ(v1, v3->add_details().parent);
+ EXPECT_EQ(v2, v3->add_details().child);
EXPECT_EQ(nullptr, v3->add_details().move_view);
- // Reset everything to the initial state.
- v1.ResetTestState();
+ v1->ResetTestState();
v2->ResetTestState();
v3->ResetTestState();
- // Remove |v2| from |v1|.
- v1.RemoveChildView(v2.get());
+ view2 = view1->RemoveChildViewT(v2);
- // Verifies that |v2| is the child view *removed* and the parent view is |v1|.
- // Make sure all the views (v1, v2, v3) received _that_ information.
- EXPECT_FALSE(v1.has_add_details());
- EXPECT_TRUE(v1.has_remove_details());
- EXPECT_EQ(&v1, v1.remove_details().parent);
- EXPECT_EQ(v2.get(), v1.remove_details().child);
- EXPECT_EQ(nullptr, v1.remove_details().move_view);
+ // view2 now owns v2 from here.
+ // Verifies that |view2| is the child view *removed* and the parent view is
+ // |v1|. Make sure all the views (v1, v2, v3) received _that_ information.
+ EXPECT_FALSE(v1->has_add_details());
+ EXPECT_TRUE(v1->has_remove_details());
+ EXPECT_EQ(v1, v1->remove_details().parent);
+ EXPECT_EQ(v2, v1->remove_details().child);
+ EXPECT_EQ(nullptr, v1->remove_details().move_view);
EXPECT_FALSE(v2->has_add_details());
EXPECT_TRUE(v2->has_remove_details());
- EXPECT_EQ(&v1, v2->remove_details().parent);
- EXPECT_EQ(v2.get(), v2->remove_details().child);
- EXPECT_EQ(nullptr, v2->remove_details().move_view);
+ EXPECT_EQ(v1, view2->remove_details().parent);
+ EXPECT_EQ(v2, view2->remove_details().child);
+ EXPECT_EQ(nullptr, view2->remove_details().move_view);
EXPECT_FALSE(v3->has_add_details());
EXPECT_TRUE(v3->has_remove_details());
- EXPECT_EQ(&v1, v3->remove_details().parent);
+ EXPECT_EQ(v1, v3->remove_details().parent);
EXPECT_EQ(v3, v3->remove_details().child);
EXPECT_EQ(nullptr, v3->remove_details().move_view);
// Verifies notifications when reparenting a view.
- ObserverView* v4 = new ObserverView();
- // Add |v4| to |v2|.
- v2->AddChildView(v4);
+ // Add |v4| to |view2|.
+ auto* v4 = view2->AddChildView(std::make_unique<ObserverView>());
// Reset everything to the initial state.
- v1.ResetTestState();
+ v1->ResetTestState();
v2->ResetTestState();
v3->ResetTestState();
v4->ResetTestState();
- // Reparent |v4| to |v1|.
- v1.AddChildView(v4);
+ // Reparent |v4| to |view1|.
+ v1->AddChildView(v4);
// Verifies that all views receive the correct information for all the child,
// parent and move views.
// |v1| is the new parent, |v4| is the child for add, |v2| is the old parent.
- EXPECT_TRUE(v1.has_add_details());
- EXPECT_FALSE(v1.has_remove_details());
- EXPECT_EQ(&v1, v1.add_details().parent);
- EXPECT_EQ(v4, v1.add_details().child);
- EXPECT_EQ(v2.get(), v1.add_details().move_view);
+ EXPECT_TRUE(v1->has_add_details());
+ EXPECT_FALSE(v1->has_remove_details());
+ EXPECT_EQ(v1, view1->add_details().parent);
+ EXPECT_EQ(v4, view1->add_details().child);
+ EXPECT_EQ(v2, view1->add_details().move_view);
// |v2| is the old parent, |v4| is the child for remove, |v1| is the new
// parent.
EXPECT_FALSE(v2->has_add_details());
EXPECT_TRUE(v2->has_remove_details());
- EXPECT_EQ(v2.get(), v2->remove_details().parent);
- EXPECT_EQ(v4, v2->remove_details().child);
- EXPECT_EQ(&v1, v2->remove_details().move_view);
+ EXPECT_EQ(v2, view2->remove_details().parent);
+ EXPECT_EQ(v4, view2->remove_details().child);
+ EXPECT_EQ(v1, view2->remove_details().move_view);
// |v3| is not impacted by this operation, and hence receives no notification.
EXPECT_FALSE(v3->has_add_details());
EXPECT_FALSE(v3->has_remove_details());
// |v4| is the reparented child, so it receives notifications for the remove
- // and then the add. |v2| is its old parent, |v1| is its new parent.
+ // and then the add. |view2| is its old parent, |v1| is its new parent.
EXPECT_TRUE(v4->has_remove_details());
EXPECT_TRUE(v4->has_add_details());
- EXPECT_EQ(v2.get(), v4->remove_details().parent);
- EXPECT_EQ(&v1, v4->add_details().parent);
+ EXPECT_EQ(v2, v4->remove_details().parent);
+ EXPECT_EQ(v1, v4->add_details().parent);
EXPECT_EQ(v4, v4->add_details().child);
EXPECT_EQ(v4, v4->remove_details().child);
- EXPECT_EQ(&v1, v4->remove_details().move_view);
- EXPECT_EQ(v2.get(), v4->add_details().move_view);
+ EXPECT_EQ(v1, v4->remove_details().move_view);
+ EXPECT_EQ(v2, v4->add_details().move_view);
}
class WidgetObserverView : public View {
@@ -3393,23 +3365,22 @@ void WidgetObserverView::RemovedFromWidget() {
//
// finally v1 is removed from root.
TEST_F(ViewTest, AddedToRemovedFromWidget) {
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(50, 50, 650, 650);
- widget.Init(std::move(params));
+ widget->Init(std::move(params));
- View* root = widget.GetRootView();
+ View* root = widget->GetRootView();
auto v1 = std::make_unique<WidgetObserverView>();
auto v2 = std::make_unique<WidgetObserverView>();
auto v3 = std::make_unique<WidgetObserverView>();
- auto* v2_ptr = v1->AddChildView(std::move(v2));
+ WidgetObserverView* v2_ptr = v1->AddChildView(std::move(v2));
EXPECT_EQ(0, v2_ptr->added_to_widget_count());
EXPECT_EQ(0, v2_ptr->removed_from_widget_count());
- auto* v1_ptr = root->AddChildView(std::move(v1));
+ WidgetObserverView* v1_ptr = root->AddChildView(std::move(v1));
EXPECT_EQ(1, v1_ptr->added_to_widget_count());
EXPECT_EQ(0, v1_ptr->removed_from_widget_count());
EXPECT_EQ(1, v2_ptr->added_to_widget_count());
@@ -3418,7 +3389,7 @@ TEST_F(ViewTest, AddedToRemovedFromWidget) {
v1_ptr->ResetTestState();
v2_ptr->ResetTestState();
- auto* v3_ptr = v2_ptr->AddChildView(std::move(v3));
+ WidgetObserverView* v3_ptr = v2_ptr->AddChildView(std::move(v3));
EXPECT_EQ(0, v1_ptr->added_to_widget_count());
EXPECT_EQ(0, v1_ptr->removed_from_widget_count());
EXPECT_EQ(0, v2_ptr->added_to_widget_count());
@@ -3460,11 +3431,12 @@ TEST_F(ViewTest, AddedToRemovedFromWidget) {
EXPECT_EQ(0, v3_ptr->removed_from_widget_count());
// Test move between widgets.
- Widget second_widget;
+ UniqueWidgetPtr second_widget = std::make_unique<Widget>();
+ params = CreateParams(Widget::InitParams::TYPE_POPUP);
params.bounds = gfx::Rect(150, 150, 650, 650);
- second_widget.Init(std::move(params));
+ second_widget->Init(std::move(params));
- View* second_root = second_widget.GetRootView();
+ View* second_root = second_widget->GetRootView();
v1_ptr->ResetTestState();
v2_ptr->ResetTestState();
@@ -3492,12 +3464,12 @@ TEST_F(ViewTest, AddedToRemovedFromWidget) {
// +-- child2
// +-- child3
TEST_F(ViewTest, RemoveAllChildViews) {
- View root;
+ auto root = std::make_unique<View>();
- View* child1 = root.AddChildView(std::make_unique<View>());
+ View* child1 = root->AddChildView(std::make_unique<View>());
for (size_t i = 0; i < 2; ++i)
- root.AddChildView(std::make_unique<View>());
+ root->AddChildView(std::make_unique<View>());
View* foo = child1->AddChildView(std::make_unique<View>());
@@ -3505,14 +3477,14 @@ TEST_F(ViewTest, RemoveAllChildViews) {
for (size_t i = 0; i < 3; ++i)
foo->AddChildView(std::make_unique<View>());
- EXPECT_EQ(3u, root.children().size());
+ EXPECT_EQ(3u, root->children().size());
EXPECT_EQ(1u, child1->children().size());
EXPECT_EQ(3u, foo->children().size());
// Now remove all child views from root.
- root.RemoveAllChildViews();
+ root->RemoveAllChildViews();
- EXPECT_TRUE(root.children().empty());
+ EXPECT_TRUE(root->children().empty());
}
TEST_F(ViewTest, Contains) {
@@ -3553,23 +3525,23 @@ TEST_F(ViewTest, GetIndexOf) {
auto* foo1 = child1->AddChildView(std::make_unique<View>());
- EXPECT_EQ(-1, root->GetIndexOf(nullptr));
- EXPECT_EQ(-1, root->GetIndexOf(root.get()));
- EXPECT_EQ(0, root->GetIndexOf(child1));
- EXPECT_EQ(1, root->GetIndexOf(child2));
- EXPECT_EQ(-1, root->GetIndexOf(foo1));
+ EXPECT_FALSE(root->GetIndexOf(nullptr).has_value());
+ EXPECT_FALSE(root->GetIndexOf(root.get()).has_value());
+ EXPECT_EQ(0u, root->GetIndexOf(child1));
+ EXPECT_EQ(1u, root->GetIndexOf(child2));
+ EXPECT_FALSE(root->GetIndexOf(foo1).has_value());
- EXPECT_EQ(-1, child1->GetIndexOf(nullptr));
- EXPECT_EQ(-1, child1->GetIndexOf(root.get()));
- EXPECT_EQ(-1, child1->GetIndexOf(child1));
- EXPECT_EQ(-1, child1->GetIndexOf(child2));
- EXPECT_EQ(0, child1->GetIndexOf(foo1));
+ EXPECT_FALSE(child1->GetIndexOf(nullptr).has_value());
+ EXPECT_FALSE(child1->GetIndexOf(root.get()).has_value());
+ EXPECT_FALSE(child1->GetIndexOf(child1).has_value());
+ EXPECT_FALSE(child1->GetIndexOf(child2).has_value());
+ EXPECT_EQ(0u, child1->GetIndexOf(foo1));
- EXPECT_EQ(-1, child2->GetIndexOf(nullptr));
- EXPECT_EQ(-1, child2->GetIndexOf(root.get()));
- EXPECT_EQ(-1, child2->GetIndexOf(child2));
- EXPECT_EQ(-1, child2->GetIndexOf(child1));
- EXPECT_EQ(-1, child2->GetIndexOf(foo1));
+ EXPECT_FALSE(child2->GetIndexOf(nullptr).has_value());
+ EXPECT_FALSE(child2->GetIndexOf(root.get()).has_value());
+ EXPECT_FALSE(child2->GetIndexOf(child2).has_value());
+ EXPECT_FALSE(child2->GetIndexOf(child1).has_value());
+ EXPECT_FALSE(child2->GetIndexOf(foo1).has_value());
}
// Verifies that the child views can be reordered correctly.
@@ -3579,33 +3551,33 @@ TEST_F(ViewTest, ReorderChildren) {
auto* child = root->AddChildView(std::make_unique<View>());
auto* foo1 = child->AddChildView(std::make_unique<View>());
- View* foo2 = child->AddChildView(std::make_unique<View>());
- View* foo3 = child->AddChildView(std::make_unique<View>());
+ auto* foo2 = child->AddChildView(std::make_unique<View>());
+ auto* foo3 = child->AddChildView(std::make_unique<View>());
foo1->SetFocusBehavior(View::FocusBehavior::ALWAYS);
foo2->SetFocusBehavior(View::FocusBehavior::ALWAYS);
foo3->SetFocusBehavior(View::FocusBehavior::ALWAYS);
- ASSERT_EQ(0, child->GetIndexOf(foo1));
- ASSERT_EQ(1, child->GetIndexOf(foo2));
- ASSERT_EQ(2, child->GetIndexOf(foo3));
+ ASSERT_EQ(0u, child->GetIndexOf(foo1));
+ ASSERT_EQ(1u, child->GetIndexOf(foo2));
+ ASSERT_EQ(2u, child->GetIndexOf(foo3));
ASSERT_EQ(foo2, foo1->GetNextFocusableView());
ASSERT_EQ(foo3, foo2->GetNextFocusableView());
ASSERT_EQ(nullptr, foo3->GetNextFocusableView());
// Move |foo2| at the end.
- child->ReorderChildView(foo2, -1);
- ASSERT_EQ(0, child->GetIndexOf(foo1));
- ASSERT_EQ(1, child->GetIndexOf(foo3));
- ASSERT_EQ(2, child->GetIndexOf(foo2));
+ child->ReorderChildView(foo2, child->children().size());
+ ASSERT_EQ(0u, child->GetIndexOf(foo1));
+ ASSERT_EQ(1u, child->GetIndexOf(foo3));
+ ASSERT_EQ(2u, child->GetIndexOf(foo2));
ASSERT_EQ(foo3, foo1->GetNextFocusableView());
ASSERT_EQ(foo2, foo3->GetNextFocusableView());
ASSERT_EQ(nullptr, foo2->GetNextFocusableView());
// Move |foo1| at the end.
- child->ReorderChildView(foo1, -1);
- ASSERT_EQ(0, child->GetIndexOf(foo3));
- ASSERT_EQ(1, child->GetIndexOf(foo2));
- ASSERT_EQ(2, child->GetIndexOf(foo1));
+ child->ReorderChildView(foo1, child->children().size());
+ ASSERT_EQ(0u, child->GetIndexOf(foo3));
+ ASSERT_EQ(1u, child->GetIndexOf(foo2));
+ ASSERT_EQ(2u, child->GetIndexOf(foo1));
ASSERT_EQ(nullptr, foo1->GetNextFocusableView());
ASSERT_EQ(foo2, foo1->GetPreviousFocusableView());
ASSERT_EQ(foo2, foo3->GetNextFocusableView());
@@ -3613,9 +3585,9 @@ TEST_F(ViewTest, ReorderChildren) {
// Move |foo2| to the front.
child->ReorderChildView(foo2, 0);
- ASSERT_EQ(0, child->GetIndexOf(foo2));
- ASSERT_EQ(1, child->GetIndexOf(foo3));
- ASSERT_EQ(2, child->GetIndexOf(foo1));
+ ASSERT_EQ(0u, child->GetIndexOf(foo2));
+ ASSERT_EQ(1u, child->GetIndexOf(foo3));
+ ASSERT_EQ(2u, child->GetIndexOf(foo1));
ASSERT_EQ(nullptr, foo1->GetNextFocusableView());
ASSERT_EQ(foo3, foo1->GetPreviousFocusableView());
ASSERT_EQ(foo3, foo2->GetNextFocusableView());
@@ -3672,36 +3644,36 @@ TEST_F(ViewTest, GetViewByID) {
}
TEST_F(ViewTest, AddExistingChild) {
- View v1, v2, v3;
+ auto v1 = std::make_unique<View>();
- v1.AddChildView(&v2);
- v1.AddChildView(&v3);
- EXPECT_EQ(0, v1.GetIndexOf(&v2));
- EXPECT_EQ(1, v1.GetIndexOf(&v3));
+ auto* v2 = v1->AddChildView(std::make_unique<View>());
+ auto* v3 = v1->AddChildView(std::make_unique<View>());
+ EXPECT_EQ(0u, v1->GetIndexOf(v2));
+ EXPECT_EQ(1u, v1->GetIndexOf(v3));
// Check that there's no change in order when adding at same index.
- v1.AddChildViewAt(&v2, 0);
- EXPECT_EQ(0, v1.GetIndexOf(&v2));
- EXPECT_EQ(1, v1.GetIndexOf(&v3));
- v1.AddChildViewAt(&v3, 1);
- EXPECT_EQ(0, v1.GetIndexOf(&v2));
- EXPECT_EQ(1, v1.GetIndexOf(&v3));
+ v1->AddChildViewAt(v2, 0);
+ EXPECT_EQ(0u, v1->GetIndexOf(v2));
+ EXPECT_EQ(1u, v1->GetIndexOf(v3));
+ v1->AddChildViewAt(v3, 1);
+ EXPECT_EQ(0u, v1->GetIndexOf(v2));
+ EXPECT_EQ(1u, v1->GetIndexOf(v3));
// Add it at a different index and check for change in order.
- v1.AddChildViewAt(&v2, 1);
- EXPECT_EQ(1, v1.GetIndexOf(&v2));
- EXPECT_EQ(0, v1.GetIndexOf(&v3));
- v1.AddChildViewAt(&v2, 0);
- EXPECT_EQ(0, v1.GetIndexOf(&v2));
- EXPECT_EQ(1, v1.GetIndexOf(&v3));
+ v1->AddChildViewAt(v2, 1);
+ EXPECT_EQ(1u, v1->GetIndexOf(v2));
+ EXPECT_EQ(0u, v1->GetIndexOf(v3));
+ v1->AddChildViewAt(v2, 0);
+ EXPECT_EQ(0u, v1->GetIndexOf(v2));
+ EXPECT_EQ(1u, v1->GetIndexOf(v3));
// Check that calling AddChildView() moves to the end.
- v1.AddChildView(&v2);
- EXPECT_EQ(1, v1.GetIndexOf(&v2));
- EXPECT_EQ(0, v1.GetIndexOf(&v3));
- v1.AddChildView(&v3);
- EXPECT_EQ(0, v1.GetIndexOf(&v2));
- EXPECT_EQ(1, v1.GetIndexOf(&v3));
+ v1->AddChildView(v2);
+ EXPECT_EQ(1u, v1->GetIndexOf(v2));
+ EXPECT_EQ(0u, v1->GetIndexOf(v3));
+ v1->AddChildView(v3);
+ EXPECT_EQ(0u, v1->GetIndexOf(v2));
+ EXPECT_EQ(1u, v1->GetIndexOf(v3));
}
TEST_F(ViewTest, UseMirroredLayoutDisableMirroring) {
@@ -3780,18 +3752,17 @@ class ActiveWidget : public Widget {
TEST_F(ViewTest, AdvanceFocusIfNecessaryForUnfocusableView) {
// Create a widget with two views and give the first one focus.
- ActiveWidget widget;
+ UniqueWidgetPtr widget = std::make_unique<ActiveWidget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- widget.Init(std::move(params));
+ widget->Init(std::move(params));
- View* view1 = widget.GetRootView()->AddChildView(std::make_unique<View>());
+ View* view1 = widget->GetRootView()->AddChildView(std::make_unique<View>());
view1->SetFocusBehavior(View::FocusBehavior::ALWAYS);
- View* view2 = widget.GetRootView()->AddChildView(std::make_unique<View>());
+ View* view2 = widget->GetRootView()->AddChildView(std::make_unique<View>());
view2->SetFocusBehavior(View::FocusBehavior::ALWAYS);
- FocusManager* focus_manager = widget.GetFocusManager();
+ FocusManager* focus_manager = widget->GetFocusManager();
ASSERT_TRUE(focus_manager);
focus_manager->SetFocusedView(view1);
@@ -4512,7 +4483,7 @@ TEST_F(ViewLayerTest, ReorderUnderWidget) {
EXPECT_EQ(c2->layer(), parent_layer->children()[1]);
// Move c1 to the front. The layers should have moved too.
- content->ReorderChildView(c1, -1);
+ content->ReorderChildView(c1, content->children().size());
EXPECT_EQ(c1->layer(), parent_layer->children()[1]);
EXPECT_EQ(c2->layer(), parent_layer->children()[0]);
}
@@ -5123,7 +5094,7 @@ void TestView::OnThemeChanged() {
}
TEST_F(ViewTest, OnThemeChanged) {
- TestView* test_view = new TestView();
+ auto test_view = std::make_unique<TestView>();
EXPECT_FALSE(test_view->native_theme_);
// Child view added before the widget hierarchy exists should get the
@@ -5132,25 +5103,23 @@ TEST_F(ViewTest, OnThemeChanged) {
test_view->AddChildView(std::make_unique<TestView>());
EXPECT_FALSE(test_view_child->native_theme_);
- std::unique_ptr<Widget> widget(new Widget);
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget->Init(std::move(params));
- widget->GetRootView()->AddChildView(test_view);
- EXPECT_TRUE(test_view->native_theme_);
- EXPECT_EQ(widget->GetNativeTheme(), test_view->native_theme_);
+ TestView* test_view_ptr =
+ widget->GetRootView()->AddChildView(std::move(test_view));
+ EXPECT_TRUE(test_view_ptr->native_theme_);
+ EXPECT_EQ(widget->GetNativeTheme(), test_view_ptr->native_theme_);
EXPECT_TRUE(test_view_child->native_theme_);
EXPECT_EQ(widget->GetNativeTheme(), test_view_child->native_theme_);
// Child view added after the widget hierarchy exists should also get the
// notification.
TestView* test_view_child_2 =
- test_view->AddChildView(std::make_unique<TestView>());
+ test_view_ptr->AddChildView(std::make_unique<TestView>());
EXPECT_TRUE(test_view_child_2->native_theme_);
EXPECT_EQ(widget->GetNativeTheme(), test_view_child_2->native_theme_);
-
- widget->CloseNow();
}
class TestEventHandler : public ui::EventHandler {
@@ -5170,9 +5139,8 @@ class TestEventHandler : public ui::EventHandler {
};
TEST_F(ViewTest, ScopedTargetHandlerReceivesEvents) {
- std::unique_ptr<Widget> widget(new Widget);
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(50, 50, 350, 350);
widget->Init(std::move(params));
View* root = widget->GetRootView();
@@ -5208,7 +5176,7 @@ TEST_F(ViewTest, ScopedTargetHandlerReceivesEvents) {
// See comment above test for details.
class WidgetWithCustomTheme : public Widget {
public:
- explicit WidgetWithCustomTheme(ui::NativeTheme* theme) : theme_(theme) {}
+ explicit WidgetWithCustomTheme(ui::TestNativeTheme* theme) : theme_(theme) {}
WidgetWithCustomTheme(const WidgetWithCustomTheme&) = delete;
WidgetWithCustomTheme& operator=(const WidgetWithCustomTheme&) = delete;
@@ -5219,7 +5187,7 @@ class WidgetWithCustomTheme : public Widget {
const ui::NativeTheme* GetNativeTheme() const override { return theme_; }
private:
- raw_ptr<ui::NativeTheme> theme_;
+ ui::TestNativeTheme* theme_;
};
// See comment above test for details.
@@ -5264,16 +5232,20 @@ void AddViewWithChildLayer(View* parent) {
// called after the layer hierarchy matches the view hierarchy.
TEST_F(ViewTest, CrashOnAddFromFromOnThemeChanged) {
ui::TestNativeTheme theme;
- WidgetWithCustomTheme widget(&theme);
+ UniqueWidgetPtr widget = std::make_unique<WidgetWithCustomTheme>(&theme);
+ test::WidgetDestroyedWaiter waiter(widget.get());
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(50, 50, 350, 350);
- widget.Init(std::move(params));
+ widget->Init(std::move(params));
- AddViewWithChildLayer(widget.GetRootView());
- ViewThatAddsViewInOnThemeChanged* v = widget.GetRootView()->AddChildView(
+ AddViewWithChildLayer(widget->GetRootView());
+ ViewThatAddsViewInOnThemeChanged* v = widget->GetRootView()->AddChildView(
std::make_unique<ViewThatAddsViewInOnThemeChanged>());
EXPECT_TRUE(v->on_native_theme_changed_called());
+ // Initiate an explicit close and wait to ensure the |theme| outlives the
+ // |widget|.
+ widget->Close();
+ waiter.Wait();
}
// A View that removes its Layer when hidden.
@@ -5312,7 +5284,7 @@ class NoLayerWhenHiddenView : public View {
// Test that Views can safely manipulate Layers during Widget closure.
TEST_F(ViewTest, DestroyLayerInClose) {
bool removed_from_widget = false;
- auto widget = std::make_unique<Widget>();
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
widget->Init(std::move(params));
widget->SetBounds(gfx::Rect(0, 0, 100, 100));
@@ -5327,7 +5299,7 @@ TEST_F(ViewTest, DestroyLayerInClose) {
EXPECT_FALSE(view->was_hidden());
// Release and close the widget. It will be destroyed once it closes.
- widget.release()->Close();
+ widget.reset();
EXPECT_FALSE(view->layer());
// Ensure the layer went away via VisibilityChanged().
EXPECT_TRUE(view->was_hidden());
@@ -5416,7 +5388,7 @@ TEST_F(ViewTest, AttachChildViewWithComplicatedLayers) {
// Attach parent_view to grand_parent_view. children layers of parent_view
// should not change.
- auto* parent_view_ptr =
+ OrderableView* parent_view_ptr =
grand_parent_view->AddChildView(std::move(parent_view));
const std::vector<ui::Layer*>& layers_after_attached =
parent_view_ptr->layer()->children();
@@ -5478,9 +5450,8 @@ TEST_F(ViewTest, TestVisibleChangedCallback) {
}
TEST_F(ViewTest, TooltipShowsForDisabledView) {
- auto widget = std::make_unique<Widget>();
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget->Init(std::move(params));
widget->SetBounds(gfx::Rect(0, 0, 100, 100));
diff --git a/chromium/ui/views/view_unittest_mac.mm b/chromium/ui/views/view_unittest_mac.mm
index 66762709cf5..1120d7767b3 100644
--- a/chromium/ui/views/view_unittest_mac.mm
+++ b/chromium/ui/views/view_unittest_mac.mm
@@ -4,6 +4,8 @@
#include "ui/views/view.h"
+#include "base/memory/raw_ptr.h"
+
#import <Cocoa/Cocoa.h>
#import "base/mac/scoped_nsobject.h"
@@ -121,7 +123,7 @@ class ViewMacTest : public test::WidgetTest {
view_ = new ThreeFingerSwipeView;
view_->SetSize(widget_->GetClientAreaBoundsInScreen().size());
- widget_->non_client_view()->frame_view()->AddChildView(view_);
+ widget_->non_client_view()->frame_view()->AddChildView(view_.get());
}
void TearDown() override {
@@ -130,8 +132,8 @@ class ViewMacTest : public test::WidgetTest {
}
private:
- Widget* widget_ = nullptr;
- ThreeFingerSwipeView* view_ = nullptr;
+ raw_ptr<Widget> widget_ = nullptr;
+ raw_ptr<ThreeFingerSwipeView> view_ = nullptr;
};
// Three-finger swipes send immediate events and they cannot be tracked.
diff --git a/chromium/ui/views/widget/ax_native_widget_mac_unittest.mm b/chromium/ui/views/widget/ax_native_widget_mac_unittest.mm
index f6a7f430624..a762c79a55d 100644
--- a/chromium/ui/views/widget/ax_native_widget_mac_unittest.mm
+++ b/chromium/ui/views/widget/ax_native_widget_mac_unittest.mm
@@ -442,6 +442,7 @@ TEST_F(AXNativeWidgetMacTest, TextfieldEditableAttributes) {
EXPECT_EQ(textfield->GetSelectedText(),
base::SysNSStringToUTF16(ax_node.accessibilitySelectedText));
EXPECT_EQ(forward_range, gfx::Range(ax_node.accessibilitySelectedTextRange));
+ EXPECT_EQ(0, ax_node.accessibilityInsertionPointLineNumber);
const gfx::Range reversed_range(6, 2);
textfield->SetSelectedRange(reversed_range);
@@ -689,6 +690,7 @@ TEST_F(AXNativeWidgetMacTest, ProtectedTextfields) {
EXPECT_NSEQ(@"", ax_node.accessibilitySelectedText);
EXPECT_NSEQ(NSMakeRange(kTestStringLength, 0),
ax_node.accessibilitySelectedTextRange);
+ EXPECT_EQ(0, ax_node.accessibilityInsertionPointLineNumber);
EXPECT_EQ(kTestStringLength, ax_node.accessibilityNumberOfCharacters);
EXPECT_NSEQ(NSMakeRange(0, kTestStringLength),
@@ -705,6 +707,7 @@ TEST_F(AXNativeWidgetMacTest, ProtectedTextfields) {
EXPECT_EQ(u"12ab", textfield->GetText());
EXPECT_NSEQ(@"••••", ax_node.accessibilityValue);
EXPECT_EQ(4, ax_node.accessibilityNumberOfCharacters);
+ EXPECT_EQ(0, ax_node.accessibilityInsertionPointLineNumber);
}
// Test text-specific attributes of Labels.
@@ -773,8 +776,8 @@ class TestComboboxModel : public ui::ComboboxModel {
TestComboboxModel& operator=(const TestComboboxModel&) = delete;
// ui::ComboboxModel:
- int GetItemCount() const override { return 2; }
- std::u16string GetItemAt(int index) const override {
+ size_t GetItemCount() const override { return 2; }
+ std::u16string GetItemAt(size_t index) const override {
return index == 0 ? base::SysNSStringToUTF16(kTestStringValue)
: u"Second Item";
}
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.h b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.h
index 30c7365004a..e8496063fdb 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.h
+++ b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.h
@@ -8,6 +8,7 @@
#include <memory>
#include "base/callback.h"
+#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "ui/aura/client/drag_drop_client.h"
#include "ui/aura/client/drag_drop_delegate.h"
@@ -135,16 +136,16 @@ class VIEWS_EXPORT DesktopDragDropClientOzone
aura::Window* root_window() { return root_window_; }
private:
- aura::Window* const root_window_;
+ const raw_ptr<aura::Window> root_window_;
- ui::WmDragHandler* const drag_handler_;
+ const raw_ptr<ui::WmDragHandler> drag_handler_;
aura::client::DragUpdateInfo current_drag_info_;
// Last window under the mouse.
- aura::Window* current_window_ = nullptr;
+ raw_ptr<aura::Window> current_window_ = nullptr;
// The delegate corresponding to the window located at the mouse position.
- aura::client::DragDropDelegate* drag_drop_delegate_ = nullptr;
+ raw_ptr<aura::client::DragDropDelegate> drag_drop_delegate_ = nullptr;
// The data to be delivered through the drag and drop.
std::unique_ptr<ui::OSExchangeData> data_to_drop_;
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc
index d8280fdf428..1a41e35de2f 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_win.cc
@@ -70,33 +70,12 @@ ui::mojom::DragOperation DesktopDragDropClientWin::StartDragAndDrop(
// drag. (http://crbug.com/806174)
base::HangWatcher::InvalidateActiveExpectations();
- base::TimeTicks start_time = base::TimeTicks::Now();
-
HRESULT result = ::DoDragDrop(
ui::OSExchangeDataProviderWin::GetIDataObject(*data.get()),
drag_source_.Get(),
ui::DragDropTypes::DragOperationToDropEffect(allowed_operations),
&effect);
if (alive && source == ui::mojom::DragEventSource::kTouch) {
- // In a normal drag drop, ::DoDragDrop calls QueryContinueDrag every time
- // it gets a mouse or keyboard event. The windows doc
- // https://docs.microsoft.com/en-us/windows/win32/api/oleidl/nf-oleidl-idropsource-querycontinuedrag
- // says "every time it detects a change in keyboard or mouse button state"
- // but empirically, on a Yoga laptop with a touch screen running Windows 10,
- // it's called when it gets a mouse move event as well. (::DoDragDrop
- // doesn't support touch, so Chrome synthesizes mouse events from touch
- // events during drag drop.)
- // In the touch failure case, when ::DoDragDrop blocks waiting for a mouse
- // button down event to start the drag, it only calls
- // QueryContinueDrag once, when it gets an event that terminates the blocked
- // drag drop, e.g., a swipe gesture from outside the Chrome window. So, we
- // detect the failure case when a drag drop lasts more than one second, and
- // QueryContinueDrag was not called more than once.
- // See crbug.com/1126230.
- UMA_HISTOGRAM_BOOLEAN(
- "Windows.TouchDrag.Success",
- drag_source_->num_query_continues() > 1 ||
- (base::TimeTicks::Now() - start_time < base::Seconds(1)));
desktop_host_->FinishTouchDrag(touch_screen_point);
// Move the mouse cursor to where the drag drop started, to avoid issues
// when the drop is outside of the Chrome window.
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager.cc b/chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager.cc
index 235ddf884af..79cd1fc4c55 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager.cc
@@ -7,10 +7,10 @@
#include <utility>
#include "base/trace_event/trace_event.h"
-#include "ui/aura/cursor/cursor_loader.h"
#include "ui/aura/window_event_dispatcher.h"
#include "ui/aura/window_tree_host.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
+#include "ui/wm/core/cursor_loader.h"
namespace views {
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager.h b/chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager.h
index 0961f4a89b7..5634eaaaf13 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager.h
+++ b/chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager.h
@@ -8,8 +8,8 @@
#include <memory>
#include <set>
-#include "ui/aura/cursor/cursor_loader.h"
#include "ui/views/views_export.h"
+#include "ui/wm/core/cursor_loader.h"
#include "ui/wm/core/native_cursor_manager.h"
namespace aura {
@@ -63,7 +63,7 @@ class VIEWS_EXPORT DesktopNativeCursorManager : public wm::NativeCursorManager {
using Hosts = std::set<aura::WindowTreeHost*>;
Hosts hosts_;
- aura::CursorLoader cursor_loader_;
+ wm::CursorLoader cursor_loader_;
};
} // namespace views
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager_win.cc b/chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager_win.cc
index 80b626ae44d..e3885265397 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager_win.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager_win.cc
@@ -24,7 +24,8 @@ void DesktopNativeCursorManagerWin::SetSystemCursorSize(
if (hkcu_cursor_regkey_.Valid() &&
hkcu_cursor_regkey_.ReadValueDW(L"CursorBaseSize", &cursor_base_size) ==
ERROR_SUCCESS) {
- system_cursor_size_ = gfx::Size(cursor_base_size, cursor_base_size);
+ int size = base::checked_cast<int>(cursor_base_size);
+ system_cursor_size_ = gfx::Size(size, size);
}
// Report cursor size.
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc b/chromium/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
index e57049c4350..269c7a6fc81 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
@@ -1409,11 +1409,8 @@ void DesktopNativeWidgetAura::OnHostWorkspaceChanged(
native_widget_delegate_->OnNativeWidgetWorkspaceChanged();
}
-void DesktopNativeWidgetAura::OnHostMovedInPixels(
- aura::WindowTreeHost* host,
- const gfx::Point& new_origin_in_pixels) {
- TRACE_EVENT1("views", "DesktopNativeWidgetAura::OnHostMovedInPixels",
- "new_origin_in_pixels", new_origin_in_pixels.ToString());
+void DesktopNativeWidgetAura::OnHostMovedInPixels(aura::WindowTreeHost* host) {
+ TRACE_EVENT0("views", "DesktopNativeWidgetAura::OnHostMovedInPixels");
native_widget_delegate_->OnNativeWidgetMove();
}
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_native_widget_aura.h b/chromium/ui/views/widget/desktop_aura/desktop_native_widget_aura.h
index f2560e59590..4bb4896af96 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_native_widget_aura.h
+++ b/chromium/ui/views/widget/desktop_aura/desktop_native_widget_aura.h
@@ -263,8 +263,7 @@ class VIEWS_EXPORT DesktopNativeWidgetAura
void OnHostCloseRequested(aura::WindowTreeHost* host) override;
void OnHostResized(aura::WindowTreeHost* host) override;
void OnHostWorkspaceChanged(aura::WindowTreeHost* host) override;
- void OnHostMovedInPixels(aura::WindowTreeHost* host,
- const gfx::Point& new_origin_in_pixels) override;
+ void OnHostMovedInPixels(aura::WindowTreeHost* host) override;
private:
friend class RootWindowDestructionObserver;
@@ -279,7 +278,7 @@ class VIEWS_EXPORT DesktopNativeWidgetAura
ui::mojom::DragOperation& output_drag_op);
std::unique_ptr<aura::WindowTreeHost> host_;
- raw_ptr<DesktopWindowTreeHost> desktop_window_tree_host_;
+ raw_ptr<DesktopWindowTreeHost, DanglingUntriaged> desktop_window_tree_host_;
// See class documentation for Widget in widget.h for a note about ownership.
Widget::InitParams::Ownership ownership_;
@@ -291,9 +290,10 @@ class VIEWS_EXPORT DesktopNativeWidgetAura
// This is the return value from GetNativeView().
// WARNING: this may be NULL, in particular during shutdown it becomes NULL.
- raw_ptr<aura::Window> content_window_;
+ raw_ptr<aura::Window, DanglingUntriaged> content_window_;
- raw_ptr<internal::NativeWidgetDelegate> native_widget_delegate_;
+ raw_ptr<internal::NativeWidgetDelegate, DanglingUntriaged>
+ native_widget_delegate_;
std::unique_ptr<wm::FocusController> focus_client_;
std::unique_ptr<aura::client::ScreenPositionClient> position_client_;
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_screen_linux.cc b/chromium/ui/views/widget/desktop_aura/desktop_screen_ozone_linux.cc
index e2b3b5a2910..6a27456f003 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_screen_linux.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_screen_ozone_linux.cc
@@ -2,11 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/views/widget/desktop_aura/desktop_screen.h"
-#include "base/notreached.h"
+#include "base/scoped_observation.h"
+#include "ui/linux/device_scale_factor_observer.h"
+#include "ui/linux/linux_ui.h"
#include "ui/ozone/public/platform_screen.h"
-#include "ui/views/linux_ui/device_scale_factor_observer.h"
-#include "ui/views/linux_ui/linux_ui.h"
+#include "ui/views/widget/desktop_aura/desktop_screen.h"
#include "ui/views/widget/desktop_aura/desktop_screen_ozone.h"
namespace views {
@@ -14,7 +14,7 @@ namespace views {
// Listens to device scale factor changes that can be provided via "external" to
// Ozone sources such as toolkits, etc, and provides Ozone with new values.
class DesktopScreenOzoneLinux : public DesktopScreenOzone,
- public DeviceScaleFactorObserver {
+ public ui::DeviceScaleFactorObserver {
public:
DesktopScreenOzoneLinux() = default;
~DesktopScreenOzoneLinux() override = default;
@@ -23,7 +23,7 @@ class DesktopScreenOzoneLinux : public DesktopScreenOzone,
// DeviceScaleFactorObserver:
void OnDeviceScaleFactorChanged() override {
SetDeviceScaleFactorToPlatformScreen(
- LinuxUI::instance()->GetDeviceScaleFactor());
+ ui::LinuxUi::instance()->GetDeviceScaleFactor());
}
void SetDeviceScaleFactorToPlatformScreen(float scale_factor) {
@@ -40,7 +40,7 @@ class DesktopScreenOzoneLinux : public DesktopScreenOzone,
// set the display scale factor as early as possible so that list of displays
// have correct scale factor from the beginning.
void OnBeforePlatformScreenInit() override {
- auto* linux_ui = LinuxUI::instance();
+ auto* linux_ui = ui::LinuxUi::instance();
if (linux_ui) {
display_scale_factor_observer_.Observe(linux_ui);
// Send current scale factor as starting to observe doesn't actually
@@ -49,10 +49,10 @@ class DesktopScreenOzoneLinux : public DesktopScreenOzone,
}
}
- base::ScopedObservation<LinuxUI,
+ base::ScopedObservation<ui::LinuxUi,
DeviceScaleFactorObserver,
- &LinuxUI::AddDeviceScaleFactorObserver,
- &LinuxUI::RemoveDeviceScaleFactorObserver>
+ &ui::LinuxUi::AddDeviceScaleFactorObserver,
+ &ui::LinuxUi::RemoveDeviceScaleFactorObserver>
display_scale_factor_observer_{this};
};
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
index e861828b228..5cb499fa354 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
@@ -9,6 +9,7 @@
#include <string>
#include <vector>
+#include "base/memory/raw_ptr.h"
#include "ui/aura/null_window_targeter.h"
#include "ui/aura/scoped_window_targeter.h"
#include "ui/aura/window.h"
@@ -19,13 +20,13 @@
#include "ui/display/display.h"
#include "ui/display/screen.h"
#include "ui/events/event.h"
+#include "ui/linux/linux_ui.h"
#include "ui/platform_window/extensions/desk_extension.h"
#include "ui/platform_window/extensions/pinned_mode_extension.h"
#include "ui/platform_window/extensions/wayland_extension.h"
#include "ui/platform_window/extensions/x11_extension.h"
#include "ui/platform_window/platform_window_init_properties.h"
#include "ui/platform_window/wm/wm_move_resize_handler.h"
-#include "ui/views/linux_ui/linux_ui.h"
#include "ui/views/views_delegate.h"
#include "ui/views/widget/widget.h"
@@ -69,7 +70,7 @@ class SwapWithNewSizeObserverHelper : public ui::CompositorObserver {
compositor_ = nullptr;
}
- ui::Compositor* compositor_;
+ raw_ptr<ui::Compositor> compositor_;
const HelperCallback callback_;
};
@@ -258,7 +259,7 @@ gfx::Rect DesktopWindowTreeHostLinux::GetGuessedFullScreenSizeInPx() const {
void DesktopWindowTreeHostLinux::AddAdditionalInitProperties(
const Widget::InitParams& params,
ui::PlatformWindowInitProperties* properties) {
- const views::LinuxUI* linux_ui = views::LinuxUI::instance();
+ const ui::LinuxUi* linux_ui = ui::LinuxUi::instance();
properties->prefer_dark_theme = linux_ui && linux_ui->PreferDarkTheme();
// Set the background color on startup to make the initial flickering
@@ -294,7 +295,7 @@ void DesktopWindowTreeHostLinux::AddAdditionalInitProperties(
base::flat_map<std::string, std::string>
DesktopWindowTreeHostLinux::GetKeyboardLayoutMap() {
- if (auto* linux_ui = LinuxUI::instance())
+ if (auto* linux_ui = ui::LinuxUi::instance())
return linux_ui->GetKeyboardLayoutMap();
return WindowTreeHostPlatform::GetKeyboardLayoutMap();
}
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
index ff670d80999..cfdf2f5682e 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
@@ -85,7 +85,8 @@ ui::PlatformWindowOpacity GetPlatformWindowOpacity(
}
ui::PlatformWindowType GetPlatformWindowType(
- Widget::InitParams::Type window_type) {
+ Widget::InitParams::Type window_type,
+ bool requires_accelerated_widget) {
switch (window_type) {
case Widget::InitParams::TYPE_WINDOW:
return ui::PlatformWindowType::kWindow;
@@ -96,7 +97,8 @@ ui::PlatformWindowType GetPlatformWindowType(
case Widget::InitParams::TYPE_DRAG:
return ui::PlatformWindowType::kDrag;
case Widget::InitParams::TYPE_BUBBLE:
- return ui::PlatformWindowType::kBubble;
+ return requires_accelerated_widget ? ui::PlatformWindowType::kTooltip
+ : ui::PlatformWindowType::kBubble;
default:
return ui::PlatformWindowType::kPopup;
}
@@ -119,14 +121,18 @@ ui::PlatformWindowShadowType GetPlatformWindowShadowType(
}
ui::PlatformWindowInitProperties ConvertWidgetInitParamsToInitProperties(
- const Widget::InitParams& params) {
+ const Widget::InitParams& params,
+ bool requires_accelerated_widget) {
ui::PlatformWindowInitProperties properties;
- properties.type = GetPlatformWindowType(params.type);
+ properties.type =
+ GetPlatformWindowType(params.type, requires_accelerated_widget);
properties.activatable =
params.activatable == Widget::InitParams::Activatable::kYes;
properties.force_show_in_taskbar = params.force_show_in_taskbar;
- properties.keep_on_top =
- params.EffectiveZOrderLevel() != ui::ZOrderLevel::kNormal;
+ properties.z_order = params.EffectiveZOrderLevel();
+ properties.keep_on_top = properties.z_order != ui::ZOrderLevel::kNormal;
+ properties.is_security_surface =
+ properties.z_order == ui::ZOrderLevel::kSecuritySurface;
properties.visible_on_all_workspaces = params.visible_on_all_workspaces;
properties.remove_standard_frame = params.remove_standard_frame;
properties.workspace = params.workspace;
@@ -250,8 +256,14 @@ void DesktopWindowTreeHostPlatform::Init(const Widget::InitParams& params) {
if (params.type == Widget::InitParams::TYPE_WINDOW)
GetContentWindow()->SetProperty(aura::client::kAnimationsDisabledKey, true);
+#if defined(USE_AURA) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
+ const bool requires_accelerated_widget = params.requires_accelerated_widget;
+#else
+ const bool requires_accelerated_widget = false;
+#endif
ui::PlatformWindowInitProperties properties =
- ConvertWidgetInitParamsToInitProperties(params);
+ ConvertWidgetInitParamsToInitProperties(params,
+ requires_accelerated_widget);
AddAdditionalInitProperties(params, &properties);
// If we have a parent, record the parent/child relationship. We use this
@@ -265,7 +277,7 @@ void DesktopWindowTreeHostPlatform::Init(const Widget::InitParams& params) {
}
// Calculate initial bounds.
- properties.bounds = ToPixelRect(params.bounds);
+ properties.bounds = params.bounds;
// Set extensions delegate.
DCHECK(!properties.workspace_extension_delegate);
@@ -438,10 +450,9 @@ bool DesktopWindowTreeHostPlatform::IsVisible() const {
}
void DesktopWindowTreeHostPlatform::SetSize(const gfx::Size& size) {
- gfx::Size size_in_pixels = ToPixelRect(gfx::Rect(size)).size();
- auto bounds_in_pixels = GetBoundsInPixels();
- bounds_in_pixels.set_size(size_in_pixels);
- WindowTreeHostPlatform::SetBoundsInPixels(bounds_in_pixels);
+ auto bounds_in_dip = platform_window()->GetBoundsInDIP();
+ bounds_in_dip.set_size(size);
+ platform_window()->SetBoundsInDIP(bounds_in_dip);
}
void DesktopWindowTreeHostPlatform::StackAbove(aura::Window* window) {
@@ -893,17 +904,10 @@ absl::optional<ui::MenuType> DesktopWindowTreeHostPlatform::GetMenuType() {
}
absl::optional<ui::OwnedWindowAnchor>
-DesktopWindowTreeHostPlatform::GetOwnedWindowAnchorAndRectInPx() {
- auto* anchor =
+DesktopWindowTreeHostPlatform::GetOwnedWindowAnchorAndRectInDIP() {
+ const auto* anchor =
GetContentWindow()->GetProperty(aura::client::kOwnedWindowAnchor);
- if (!anchor)
- return absl::nullopt;
- // Make a copy of the structure. Otherwise, conversion will result in
- // overriding the stored property's value.
- ui::OwnedWindowAnchor window_anchor = *anchor;
- // Anchor rect must be translated from DIP to px.
- window_anchor.anchor_rect = ToPixelRect(window_anchor.anchor_rect);
- return window_anchor;
+ return anchor ? absl::make_optional(*anchor) : absl::nullopt;
}
gfx::Rect DesktopWindowTreeHostPlatform::ConvertRectToPixels(
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h
index cbf0abe7075..cbc3e8135d7 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h
+++ b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h
@@ -151,7 +151,7 @@ class VIEWS_EXPORT DesktopWindowTreeHostPlatform
absl::optional<gfx::Size> GetMaximumSizeForWindow() override;
SkPath GetWindowMaskForWindowShapeInPixels() override;
absl::optional<ui::MenuType> GetMenuType() override;
- absl::optional<ui::OwnedWindowAnchor> GetOwnedWindowAnchorAndRectInPx()
+ absl::optional<ui::OwnedWindowAnchor> GetOwnedWindowAnchorAndRectInDIP()
override;
gfx::Rect ConvertRectToPixels(const gfx::Rect& rect_in_dip) const override;
gfx::Rect ConvertRectToDIP(const gfx::Rect& rect_in_pixels) const override;
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_impl_interactive_uitest.cc b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_impl_interactive_uitest.cc
index 3135fcb8de3..58245d8c623 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_impl_interactive_uitest.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_impl_interactive_uitest.cc
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/memory/raw_ptr.h"
#include "ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h"
#include "base/run_loop.h"
@@ -132,7 +133,7 @@ class FakeWmMoveResizeHandler : public ui::WmMoveResizeHandler {
}
private:
- ui::PlatformWindow* platform_window_;
+ raw_ptr<ui::PlatformWindow> platform_window_;
gfx::Rect bounds_;
int hittest_ = -1;
@@ -206,7 +207,7 @@ class HitTestWidgetDelegate : public WidgetDelegate {
}
private:
- HitTestNonClientFrameView* frame_view_ = nullptr;
+ raw_ptr<HitTestNonClientFrameView> frame_view_ = nullptr;
};
// Test host that can intercept calls to the real host.
@@ -268,8 +269,8 @@ class DesktopWindowTreeHostPlatformImplTest
auto* native_widget = new DesktopNativeWidgetAura(toplevel);
toplevel_params.native_widget = native_widget;
host_ = new TestDesktopWindowTreeHostPlatformImpl(toplevel, native_widget);
- toplevel_params.desktop_window_tree_host = host_;
- toplevel_params.delegate = delegate_;
+ toplevel_params.desktop_window_tree_host = host_.get();
+ toplevel_params.delegate = delegate_.get();
toplevel_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
toplevel_params.bounds = bounds;
toplevel_params.remove_standard_frame = true;
@@ -316,8 +317,8 @@ class DesktopWindowTreeHostPlatformImplTest
base::TimeTicks::Now(), gesture_details);
}
- HitTestWidgetDelegate* delegate_ = nullptr;
- TestDesktopWindowTreeHostPlatformImpl* host_ = nullptr;
+ raw_ptr<HitTestWidgetDelegate> delegate_ = nullptr;
+ raw_ptr<TestDesktopWindowTreeHostPlatformImpl> host_ = nullptr;
};
// These tests are run using either click or touch events.
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc
index c096c26118a..348833ee09f 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc
@@ -8,6 +8,7 @@
#include <utility>
#include "base/command_line.h"
+#include "base/memory/raw_ptr.h"
#include "base/run_loop.h"
#include "ui/aura/window_tree_host.h"
#include "ui/aura/window_tree_host_observer.h"
@@ -99,7 +100,7 @@ class TestWidgetObserver : public WidgetObserver {
run_loop_->Quit();
}
- Widget* widget_;
+ raw_ptr<Widget> widget_;
std::unique_ptr<base::RunLoop> run_loop_;
bool on_widget_destroying_ = false;
bool visible_ = false;
@@ -281,7 +282,7 @@ class ResizeObserver : public aura::WindowTreeHostObserver {
}
private:
- aura::WindowTreeHost* const host_;
+ const raw_ptr<aura::WindowTreeHost> host_;
int resize_count_ = 0;
int bounds_change_count_ = 0;
};
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
index d7260950ca1..b6d24398347 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
@@ -378,7 +378,7 @@ void DesktopWindowTreeHostWin::SetShape(
scaled_rect.roundOut(&rounded_scaled_rect);
sk_rects.push_back(rounded_scaled_rect);
}
- shape.setRects(&sk_rects[0], sk_rects.size());
+ shape.setRects(&sk_rects[0], static_cast<int>(sk_rects.size()));
} else {
for (const gfx::Rect& rect : *native_shape)
shape.op(gfx::RectToSkIRect(rect), SkRegion::kUnion_Op);
@@ -947,7 +947,7 @@ void DesktopWindowTreeHostWin::HandleEndWMSizeMove() {
void DesktopWindowTreeHostWin::HandleMove() {
CheckForMonitorChange();
- OnHostMovedInPixels(GetBoundsInPixels().origin());
+ OnHostMovedInPixels();
}
void DesktopWindowTreeHostWin::HandleWorkAreaChanged() {
diff --git a/chromium/ui/views/widget/desktop_aura/window_event_filter_lacros.h b/chromium/ui/views/widget/desktop_aura/window_event_filter_lacros.h
index 36442939fc2..ef56b09f3ae 100644
--- a/chromium/ui/views/widget/desktop_aura/window_event_filter_lacros.h
+++ b/chromium/ui/views/widget/desktop_aura/window_event_filter_lacros.h
@@ -5,6 +5,7 @@
#ifndef UI_VIEWS_WIDGET_DESKTOP_AURA_WINDOW_EVENT_FILTER_LACROS_H_
#define UI_VIEWS_WIDGET_DESKTOP_AURA_WINDOW_EVENT_FILTER_LACROS_H_
+#include "base/memory/raw_ptr.h"
#include "ui/base/hit_test.h"
#include "ui/events/event_handler.h"
#include "ui/views/views_export.h"
@@ -49,14 +50,14 @@ class VIEWS_EXPORT WindowEventFilterLacros : public ui::EventHandler {
void MaybeDispatchHostWindowDragMovement(int hittest,
ui::LocatedEvent* event);
- DesktopWindowTreeHostPlatform* const desktop_window_tree_host_;
+ const raw_ptr<DesktopWindowTreeHostPlatform> desktop_window_tree_host_;
int previous_pressed_component_ = HTNOWHERE;
// A handler, which is used for interactive move/resize events if set and
// unless MaybeDispatchHostWindowDragMovement is overridden by a derived
// class.
- ui::WmMoveResizeHandler* const handler_;
+ const raw_ptr<ui::WmMoveResizeHandler> handler_;
};
} // namespace views
diff --git a/chromium/ui/views/widget/desktop_aura/window_event_filter_linux.cc b/chromium/ui/views/widget/desktop_aura/window_event_filter_linux.cc
index ed48c4c963e..98e1761fe3c 100644
--- a/chromium/ui/views/widget/desktop_aura/window_event_filter_linux.cc
+++ b/chromium/ui/views/widget/desktop_aura/window_event_filter_linux.cc
@@ -14,8 +14,8 @@
#include "ui/display/screen.h"
#include "ui/events/event.h"
#include "ui/events/event_utils.h"
+#include "ui/linux/linux_ui.h"
#include "ui/platform_window/wm/wm_move_resize_handler.h"
-#include "ui/views/linux_ui/linux_ui.h"
#include "ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h"
#include "ui/views/widget/native_widget_aura.h"
#include "ui/views/widget/widget.h"
@@ -75,23 +75,23 @@ bool WindowEventFilterLinux::HandleMouseEventWithHitTest(
void WindowEventFilterLinux::OnClickedCaption(ui::MouseEvent* event,
int previous_click_component) {
- LinuxUI* linux_ui = LinuxUI::instance();
+ ui::LinuxUi* linux_ui = ui::LinuxUi::instance();
- views::LinuxUI::WindowFrameActionSource action_type;
- views::LinuxUI::WindowFrameAction default_action;
+ ui::LinuxUi::WindowFrameActionSource action_type;
+ ui::LinuxUi::WindowFrameAction default_action;
if (event->IsRightMouseButton()) {
- action_type = LinuxUI::WindowFrameActionSource::kRightClick;
- default_action = LinuxUI::WindowFrameAction::kMenu;
+ action_type = ui::LinuxUi::WindowFrameActionSource::kRightClick;
+ default_action = ui::LinuxUi::WindowFrameAction::kMenu;
} else if (event->IsMiddleMouseButton()) {
- action_type = LinuxUI::WindowFrameActionSource::kMiddleClick;
- default_action = LinuxUI::WindowFrameAction::kNone;
+ action_type = ui::LinuxUi::WindowFrameActionSource::kMiddleClick;
+ default_action = ui::LinuxUi::WindowFrameAction::kNone;
} else if (event->IsLeftMouseButton() &&
event->flags() & ui::EF_IS_DOUBLE_CLICK) {
click_component_ = HTNOWHERE;
if (previous_click_component == HTCAPTION) {
- action_type = LinuxUI::WindowFrameActionSource::kDoubleClick;
- default_action = LinuxUI::WindowFrameAction::kToggleMaximize;
+ action_type = ui::LinuxUi::WindowFrameActionSource::kDoubleClick;
+ default_action = ui::LinuxUi::WindowFrameAction::kToggleMaximize;
} else {
return;
}
@@ -101,24 +101,24 @@ void WindowEventFilterLinux::OnClickedCaption(ui::MouseEvent* event,
}
auto* content_window = desktop_window_tree_host_->GetContentWindow();
- LinuxUI::WindowFrameAction action =
+ ui::LinuxUi::WindowFrameAction action =
linux_ui ? linux_ui->GetWindowFrameAction(action_type) : default_action;
switch (action) {
- case LinuxUI::WindowFrameAction::kNone:
+ case ui::LinuxUi::WindowFrameAction::kNone:
break;
- case LinuxUI::WindowFrameAction::kLower:
+ case ui::LinuxUi::WindowFrameAction::kLower:
LowerWindow();
event->SetHandled();
break;
- case LinuxUI::WindowFrameAction::kMinimize:
+ case ui::LinuxUi::WindowFrameAction::kMinimize:
desktop_window_tree_host_->Minimize();
event->SetHandled();
break;
- case LinuxUI::WindowFrameAction::kToggleMaximize:
+ case ui::LinuxUi::WindowFrameAction::kToggleMaximize:
MaybeToggleMaximizedState(content_window);
event->SetHandled();
break;
- case LinuxUI::WindowFrameAction::kMenu:
+ case ui::LinuxUi::WindowFrameAction::kMenu:
views::Widget* widget =
views::Widget::GetWidgetForNativeView(content_window);
if (!widget)
diff --git a/chromium/ui/views/widget/desktop_aura/window_event_filter_linux.h b/chromium/ui/views/widget/desktop_aura/window_event_filter_linux.h
index 8d617e4fdd7..5e32418f11f 100644
--- a/chromium/ui/views/widget/desktop_aura/window_event_filter_linux.h
+++ b/chromium/ui/views/widget/desktop_aura/window_event_filter_linux.h
@@ -5,6 +5,7 @@
#ifndef UI_VIEWS_WIDGET_DESKTOP_AURA_WINDOW_EVENT_FILTER_LINUX_H_
#define UI_VIEWS_WIDGET_DESKTOP_AURA_WINDOW_EVENT_FILTER_LINUX_H_
+#include "base/memory/raw_ptr.h"
#include "ui/base/hit_test.h"
#include "ui/events/event_handler.h"
#include "ui/views/views_export.h"
@@ -62,12 +63,12 @@ class VIEWS_EXPORT WindowEventFilterLinux : public ui::EventHandler {
// ui::EventHandler overrides:
void OnGestureEvent(ui::GestureEvent* event) override;
- DesktopWindowTreeHostPlatform* const desktop_window_tree_host_;
+ const raw_ptr<DesktopWindowTreeHostPlatform> desktop_window_tree_host_;
// A handler, which is used for interactive move/resize events if set and
// unless MaybeDispatchHostWindowDragMovement is overridden by a derived
// class.
- ui::WmMoveResizeHandler* const handler_;
+ const raw_ptr<ui::WmMoveResizeHandler> handler_;
// The non-client component for the target of a MouseEvent. Mouse events can
// be destructive to the window tree, which can cause the component of a
diff --git a/chromium/ui/views/widget/drop_helper.h b/chromium/ui/views/widget/drop_helper.h
index cb7aba3aaf6..92b3b62b231 100644
--- a/chromium/ui/views/widget/drop_helper.h
+++ b/chromium/ui/views/widget/drop_helper.h
@@ -117,7 +117,7 @@ class VIEWS_EXPORT DropHelper {
void NotifyDragExit();
// RootView we were created for.
- raw_ptr<View> root_view_;
+ raw_ptr<View, DanglingUntriaged> root_view_;
// View we're targeting events at.
raw_ptr<View> target_view_;
diff --git a/chromium/ui/views/widget/native_widget_aura.h b/chromium/ui/views/widget/native_widget_aura.h
index da3db65b967..f896b0060f8 100644
--- a/chromium/ui/views/widget/native_widget_aura.h
+++ b/chromium/ui/views/widget/native_widget_aura.h
@@ -238,7 +238,7 @@ class VIEWS_EXPORT NativeWidgetAura : public internal::NativeWidgetPrivate,
private:
void SetInitialFocus(ui::WindowShowState show_state);
- raw_ptr<internal::NativeWidgetDelegate> delegate_;
+ raw_ptr<internal::NativeWidgetDelegate, DanglingUntriaged> delegate_;
// WARNING: set to NULL when destroyed. As the Widget is not necessarily
// destroyed along with |window_| all usage of |window_| should first verify
diff --git a/chromium/ui/views/widget/native_widget_aura_unittest.cc b/chromium/ui/views/widget/native_widget_aura_unittest.cc
index 87749a08875..f547d376124 100644
--- a/chromium/ui/views/widget/native_widget_aura_unittest.cc
+++ b/chromium/ui/views/widget/native_widget_aura_unittest.cc
@@ -26,6 +26,7 @@
#include "ui/views/test/views_test_base.h"
#include "ui/views/test/widget_test.h"
#include "ui/views/widget/root_view.h"
+#include "ui/views/widget/unique_widget_ptr.h"
#include "ui/views/widget/widget_delegate.h"
#include "ui/wm/core/base_focus_rules.h"
#include "ui/wm/core/default_activation_client.h"
@@ -37,7 +38,6 @@ namespace {
NativeWidgetAura* Init(aura::Window* parent, Widget* widget) {
Widget::InitParams params(Widget::InitParams::TYPE_POPUP);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.parent = parent;
widget->Init(std::move(params));
return static_cast<NativeWidgetAura*>(widget->native_widget());
@@ -98,47 +98,44 @@ class NativeWidgetAuraTest : public ViewsTestBase {
TEST_F(NativeWidgetAuraTest, CenterWindowLargeParent) {
// Make a parent window larger than the host represented by
// WindowEventDispatcher.
- std::unique_ptr<aura::Window> parent(new aura::Window(nullptr));
+ auto parent = std::make_unique<aura::Window>(nullptr);
parent->Init(ui::LAYER_NOT_DRAWN);
parent->SetBounds(gfx::Rect(0, 0, 1024, 800));
- std::unique_ptr<Widget> widget(new Widget());
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
NativeWidgetAura* window = Init(parent.get(), widget.get());
window->CenterWindow(gfx::Size(100, 100));
EXPECT_EQ(gfx::Rect((640 - 100) / 2, (480 - 100) / 2, 100, 100),
window->GetNativeWindow()->bounds());
- widget->CloseNow();
}
TEST_F(NativeWidgetAuraTest, CenterWindowSmallParent) {
// Make a parent window smaller than the host represented by
// WindowEventDispatcher.
- std::unique_ptr<aura::Window> parent(new aura::Window(nullptr));
+ auto parent = std::make_unique<aura::Window>(nullptr);
parent->Init(ui::LAYER_NOT_DRAWN);
parent->SetBounds(gfx::Rect(0, 0, 480, 320));
- std::unique_ptr<Widget> widget(new Widget());
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
NativeWidgetAura* window = Init(parent.get(), widget.get());
window->CenterWindow(gfx::Size(100, 100));
EXPECT_EQ(gfx::Rect((480 - 100) / 2, (320 - 100) / 2, 100, 100),
window->GetNativeWindow()->bounds());
- widget->CloseNow();
}
// Verifies CenterWindow() constrains to parent size.
TEST_F(NativeWidgetAuraTest, CenterWindowSmallParentNotAtOrigin) {
// Make a parent window smaller than the host represented by
// WindowEventDispatcher and offset it slightly from the origin.
- std::unique_ptr<aura::Window> parent(new aura::Window(nullptr));
+ auto parent = std::make_unique<aura::Window>(nullptr);
parent->Init(ui::LAYER_NOT_DRAWN);
parent->SetBounds(gfx::Rect(20, 40, 480, 320));
- std::unique_ptr<Widget> widget(new Widget());
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
NativeWidgetAura* window = Init(parent.get(), widget.get());
window->CenterWindow(gfx::Size(500, 600));
// |window| should be no bigger than |parent|.
EXPECT_EQ("20,40 480x320", window->GetNativeWindow()->bounds().ToString());
- widget->CloseNow();
}
// View which handles both mouse and gesture events.
@@ -181,14 +178,13 @@ class EventHandlingView : public View {
TEST_F(NativeWidgetAuraTest, MouseClickInterruptsGestureScroll) {
Widget::InitParams init_params =
CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
init_params.bounds = gfx::Rect(100, 100);
- Widget widget;
- widget.Init(std::move(init_params));
- widget.Show();
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
+ widget->Init(std::move(init_params));
+ widget->Show();
- View* contents_view = widget.SetContentsView(std::make_unique<View>());
- View* child_view =
+ auto* contents_view = widget->SetContentsView(std::make_unique<View>());
+ auto* child_view =
contents_view->AddChildView(std::make_unique<EventHandlingView>());
child_view->SetBoundsRect(gfx::Rect(gfx::Size{50, 50}));
@@ -214,43 +210,38 @@ TEST_F(NativeWidgetAuraTest, MouseClickInterruptsGestureScroll) {
gfx::Point target_point = center_point;
target_point.Offset(0, 20);
int step_count = 10;
- ui::test::EventGenerator generator(widget.GetNativeView()->GetRootWindow());
+ ui::test::EventGenerator generator(widget->GetNativeView()->GetRootWindow());
generator.GestureScrollSequenceWithCallback(
center_point, target_point,
/*duration=*/base::Milliseconds(100), step_count,
base::BindRepeating(scroll_callback, &generator, &step_count));
// Verify that `child_view` receives gesture end events.
- EXPECT_TRUE(static_cast<EventHandlingView*>(child_view)
- ->HandledEventBefore(ui::ET_GESTURE_SCROLL_END));
- EXPECT_TRUE(static_cast<EventHandlingView*>(child_view)
- ->HandledEventBefore(ui::ET_GESTURE_END));
+ EXPECT_TRUE(child_view->HandledEventBefore(ui::ET_GESTURE_SCROLL_END));
+ EXPECT_TRUE(child_view->HandledEventBefore(ui::ET_GESTURE_END));
}
TEST_F(NativeWidgetAuraTest, CreateMinimized) {
Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.parent = nullptr;
params.context = root_window();
params.show_state = ui::SHOW_STATE_MINIMIZED;
params.bounds.SetRect(0, 0, 1024, 800);
- std::unique_ptr<Widget> widget(new Widget());
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
widget->Init(std::move(params));
widget->Show();
EXPECT_TRUE(widget->IsMinimized());
- widget->CloseNow();
}
// Tests that GetRestoreBounds returns the window bounds even if the window is
// transformed.
TEST_F(NativeWidgetAuraTest, RestoreBounds) {
Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.parent = nullptr;
params.context = root_window();
params.bounds.SetRect(0, 0, 400, 400);
- auto widget = std::make_unique<Widget>();
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
widget->Init(std::move(params));
widget->Show();
EXPECT_EQ(gfx::Rect(400, 400), widget->GetRestoredBounds());
@@ -297,34 +288,32 @@ class TestWindowObserver : public aura::WindowObserver {
// involve extra show state transitions.
TEST_F(NativeWidgetAuraTest, ToggleState) {
Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.parent = nullptr;
params.context = root_window();
params.show_state = ui::SHOW_STATE_NORMAL;
params.bounds.SetRect(0, 0, 1024, 800);
- Widget widget;
- widget.Init(std::move(params));
- std::unique_ptr<TestWindowObserver> observer(
- new TestWindowObserver(widget.GetNativeWindow()));
- widget.Show();
- EXPECT_FALSE(widget.IsMinimized());
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
+ widget->Init(std::move(params));
+ auto observer =
+ std::make_unique<TestWindowObserver>(widget->GetNativeWindow());
+ widget->Show();
+ EXPECT_FALSE(widget->IsMinimized());
EXPECT_EQ(0, observer->count());
EXPECT_EQ(ui::WindowShowState::SHOW_STATE_DEFAULT, observer->state());
- widget.Minimize();
- EXPECT_TRUE(widget.IsMinimized());
+ widget->Minimize();
+ EXPECT_TRUE(widget->IsMinimized());
EXPECT_EQ(1, observer->count());
EXPECT_EQ(ui::WindowShowState::SHOW_STATE_MINIMIZED, observer->state());
observer->Reset();
- widget.Show();
- widget.Restore();
+ widget->Show();
+ widget->Restore();
EXPECT_EQ(1, observer->count());
EXPECT_EQ(ui::WindowShowState::SHOW_STATE_NORMAL, observer->state());
observer.reset();
- EXPECT_FALSE(widget.IsMinimized());
- widget.CloseNow();
+ EXPECT_FALSE(widget->IsMinimized());
}
class TestLayoutManagerBase : public aura::LayoutManager {
@@ -400,16 +389,15 @@ class TestWidget : public Widget {
TEST_F(NativeWidgetAuraTest, ShowMaximizedDoesntBounceAround) {
root_window()->SetBounds(gfx::Rect(0, 0, 640, 480));
root_window()->SetLayoutManager(new MaximizeLayoutManager);
- std::unique_ptr<TestWidget> widget(new TestWidget());
+ UniqueWidgetPtr widget = std::make_unique<TestWidget>();
Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.parent = nullptr;
params.context = root_window();
params.show_state = ui::SHOW_STATE_MAXIMIZED;
params.bounds = gfx::Rect(10, 10, 100, 200);
widget->Init(std::move(params));
- EXPECT_FALSE(widget->did_size_change_more_than_once());
- widget->CloseNow();
+ EXPECT_FALSE(
+ static_cast<TestWidget*>(widget.get())->did_size_change_more_than_once());
}
class PropertyTestLayoutManager : public TestLayoutManagerBase {
@@ -442,9 +430,8 @@ TEST_F(NativeWidgetAuraTest, TestPropertiesWhenAddedToLayout) {
root_window()->SetBounds(gfx::Rect(0, 0, 640, 480));
PropertyTestLayoutManager* layout_manager = new PropertyTestLayoutManager();
root_window()->SetLayoutManager(layout_manager);
- std::unique_ptr<TestWidget> widget(new TestWidget());
+ UniqueWidgetPtr widget = std::make_unique<TestWidget>();
Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.delegate = new WidgetDelegate();
params.delegate->SetOwnedByWidget(true);
params.delegate->SetHasWindowSizeControls(true);
@@ -452,16 +439,14 @@ TEST_F(NativeWidgetAuraTest, TestPropertiesWhenAddedToLayout) {
params.context = root_window();
widget->Init(std::move(params));
EXPECT_TRUE(layout_manager->added());
- widget->CloseNow();
}
TEST_F(NativeWidgetAuraTest, GetClientAreaScreenBounds) {
// Create a widget.
Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.context = root_window();
params.bounds.SetRect(10, 20, 300, 400);
- std::unique_ptr<Widget> widget(new Widget());
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
widget->Init(std::move(params));
// For Aura, client area bounds match window bounds.
@@ -510,9 +495,8 @@ TEST_F(NativeWidgetAuraTest, DontCaptureOnGesture) {
child->set_consume_gesture_event(false);
content_view->SetLayoutManager(std::make_unique<FillLayout>());
content_view->AddChildView(child);
- std::unique_ptr<TestWidget> widget(new TestWidget());
+ UniqueWidgetPtr widget = std::make_unique<TestWidget>();
Widget::InitParams params(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.context = root_window();
params.bounds = gfx::Rect(0, 0, 100, 200);
widget->Init(std::move(params));
@@ -547,18 +531,16 @@ TEST_F(NativeWidgetAuraTest, DontCaptureOnGesture) {
// Verifies views with layers are targeted for events properly.
TEST_F(NativeWidgetAuraTest, PreferViewLayersToChildWindows) {
// Create two widgets: |parent| and |child|. |child| is a child of |parent|.
- std::unique_ptr<Widget> parent(new Widget());
+ UniqueWidgetPtr parent = std::make_unique<Widget>();
Widget::InitParams parent_params(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
- parent_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
parent_params.context = root_window();
parent->Init(std::move(parent_params));
View* parent_root = parent->SetContentsView(std::make_unique<View>());
parent->SetBounds(gfx::Rect(0, 0, 400, 400));
parent->Show();
- std::unique_ptr<Widget> child(new Widget());
+ UniqueWidgetPtr child = std::make_unique<Widget>();
Widget::InitParams child_params(Widget::InitParams::TYPE_CONTROL);
- child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
child_params.parent = parent->GetNativeWindow();
child->Init(std::move(child_params));
child->SetBounds(gfx::Rect(0, 0, 200, 200));
@@ -604,36 +586,34 @@ TEST_F(NativeWidgetAuraTest, PreferViewLayersToChildWindows) {
TEST_F(NativeWidgetAuraTest,
ShouldDescendIntoChildForEventHandlingChecksVisibleBounds) {
// Create two widgets: |parent| and |child|. |child| is a child of |parent|.
- Widget parent;
+ UniqueWidgetPtr parent = std::make_unique<Widget>();
Widget::InitParams parent_params(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
- parent_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
parent_params.context = root_window();
- parent.Init(std::move(parent_params));
- View* parent_root_view = parent.SetContentsView(std::make_unique<View>());
- parent.SetBounds(gfx::Rect(0, 0, 400, 400));
- parent.Show();
+ parent->Init(std::move(parent_params));
+ View* parent_root_view = parent->SetContentsView(std::make_unique<View>());
+ parent->SetBounds(gfx::Rect(0, 0, 400, 400));
+ parent->Show();
- Widget child;
+ UniqueWidgetPtr child = std::make_unique<Widget>();
Widget::InitParams child_params(Widget::InitParams::TYPE_CONTROL);
- child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- child_params.parent = parent.GetNativeWindow();
- child.Init(std::move(child_params));
- child.SetBounds(gfx::Rect(0, 0, 200, 200));
- child.Show();
+ child_params.parent = parent->GetNativeWindow();
+ child->Init(std::move(child_params));
+ child->SetBounds(gfx::Rect(0, 0, 200, 200));
+ child->Show();
// Point is over |child|.
EXPECT_EQ(
- child.GetNativeWindow(),
- parent.GetNativeWindow()->GetEventHandlerForPoint(gfx::Point(50, 50)));
+ child->GetNativeWindow(),
+ parent->GetNativeWindow()->GetEventHandlerForPoint(gfx::Point(50, 50)));
- View* parent_root_view_child = new View;
- parent_root_view->AddChildView(parent_root_view_child);
+ View* parent_root_view_child =
+ parent_root_view->AddChildView(std::make_unique<View>());
parent_root_view_child->SetBounds(0, 0, 10, 10);
// Create a View whose layer extends outside the bounds of its parent. Event
- // targetting should only consider the visible bounds.
- View* parent_root_view_child_child = new View;
- parent_root_view_child->AddChildView(parent_root_view_child_child);
+ // targeting should only consider the visible bounds.
+ View* parent_root_view_child_child =
+ parent_root_view_child->AddChildView(std::make_unique<View>());
parent_root_view_child_child->SetBounds(0, 0, 100, 100);
parent_root_view_child_child->SetPaintToLayer();
parent_root_view_child_child->layer()->parent()->StackAtTop(
@@ -643,8 +623,8 @@ TEST_F(NativeWidgetAuraTest,
// bounds of |parent_root_view_child_child|, so |child| should be the event
// target.
EXPECT_EQ(
- child.GetNativeWindow(),
- parent.GetNativeWindow()->GetEventHandlerForPoint(gfx::Point(20, 20)));
+ child->GetNativeWindow(),
+ parent->GetNativeWindow()->GetEventHandlerForPoint(gfx::Point(20, 20)));
}
// Verifies views with layers that have SetCanProcessEventWithinSubtree(false)
@@ -654,28 +634,26 @@ TEST_F(
NativeWidgetAuraTest,
ShouldDescendIntoChildForEventHandlingIgnoresViewsThatDoNotProcessEvents) {
// Create two widgets: `parent` and `child`. `child` is a child of `parent`.
- Widget parent;
+ UniqueWidgetPtr parent = std::make_unique<Widget>();
Widget::InitParams parent_params(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
- parent_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
parent_params.context = root_window();
- parent.Init(std::move(parent_params));
+ parent->Init(std::move(parent_params));
View* const parent_root_view =
- parent.SetContentsView(std::make_unique<View>());
- parent.SetBounds(gfx::Rect(0, 0, 400, 400));
- parent.Show();
+ parent->SetContentsView(std::make_unique<View>());
+ parent->SetBounds(gfx::Rect(0, 0, 400, 400));
+ parent->Show();
- Widget child;
+ UniqueWidgetPtr child = std::make_unique<Widget>();
Widget::InitParams child_params(Widget::InitParams::TYPE_CONTROL);
- child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- child_params.parent = parent.GetNativeWindow();
- child.Init(std::move(child_params));
- child.SetBounds(gfx::Rect(0, 0, 200, 200));
- child.Show();
+ child_params.parent = parent->GetNativeWindow();
+ child->Init(std::move(child_params));
+ child->SetBounds(gfx::Rect(0, 0, 200, 200));
+ child->Show();
// Point is over `child`.
EXPECT_EQ(
- child.GetNativeWindow(),
- parent.GetNativeWindow()->GetEventHandlerForPoint(gfx::Point(50, 50)));
+ child->GetNativeWindow(),
+ parent->GetNativeWindow()->GetEventHandlerForPoint(gfx::Point(50, 50)));
View* const view_overlapping_child =
parent_root_view->AddChildView(std::make_unique<View>());
@@ -689,24 +667,23 @@ TEST_F(
// to verify that the test setup is working (view with layer overlapping child
// window receives events).
EXPECT_EQ(
- parent.GetNativeWindow(),
- parent.GetNativeWindow()->GetEventHandlerForPoint(gfx::Point(50, 50)));
+ parent->GetNativeWindow(),
+ parent->GetNativeWindow()->GetEventHandlerForPoint(gfx::Point(50, 50)));
// Events should not be routed to `parent` if the view overlapping `child`
// does not process events.
view_overlapping_child->SetCanProcessEventsWithinSubtree(false);
EXPECT_EQ(
- child.GetNativeWindow(),
- parent.GetNativeWindow()->GetEventHandlerForPoint(gfx::Point(50, 50)));
+ child->GetNativeWindow(),
+ parent->GetNativeWindow()->GetEventHandlerForPoint(gfx::Point(50, 50)));
}
// Verifies that widget->FlashFrame() sets aura::client::kDrawAttentionKey,
// and activating the window clears it.
TEST_F(NativeWidgetAuraTest, FlashFrame) {
- std::unique_ptr<Widget> widget(new Widget());
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
params.context = root_window();
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget->Init(std::move(params));
aura::Window* window = widget->GetNativeWindow();
EXPECT_FALSE(window->GetProperty(aura::client::kDrawAttentionKey));
@@ -720,18 +697,6 @@ TEST_F(NativeWidgetAuraTest, FlashFrame) {
EXPECT_FALSE(window->GetProperty(aura::client::kDrawAttentionKey));
}
-TEST_F(NativeWidgetAuraTest, NoCrashOnThemeAfterClose) {
- std::unique_ptr<aura::Window> parent(new aura::Window(nullptr));
- parent->Init(ui::LAYER_NOT_DRAWN);
- parent->SetBounds(gfx::Rect(0, 0, 480, 320));
- std::unique_ptr<Widget> widget(new Widget());
- Init(parent.get(), widget.get());
- widget->Show();
- widget->Close();
- base::RunLoop().RunUntilIdle();
- widget->GetNativeTheme(); // Shouldn't crash.
-}
-
// Used to track calls to WidgetDelegate::OnWidgetMove().
class MoveTestWidgetDelegate : public WidgetDelegateView {
public:
@@ -757,17 +722,19 @@ class MoveTestWidgetDelegate : public WidgetDelegateView {
// Acquiring the layer resets the bounds of the window. This test verifies the
// Widget is still notified correctly of a move in this case.
TEST_F(NativeWidgetAuraTest, OnWidgetMovedInvokedAfterAcquireLayer) {
- // |delegate| deletes itself when the widget is destroyed.
- MoveTestWidgetDelegate* delegate = new MoveTestWidgetDelegate;
- Widget* widget = Widget::CreateWindowWithContext(delegate, root_window(),
- gfx::Rect(10, 10, 100, 200));
+ // |delegate| is owned by the Widget by default and is deleted when the widget
+ // is destroyed.
+ // See WidgetDelegateView::WidgetDelegateView();
+ auto delegate = std::make_unique<MoveTestWidgetDelegate>();
+ auto* delegate_ptr = delegate.get();
+ UniqueWidgetPtr widget = base::WrapUnique(Widget::CreateWindowWithContext(
+ std::move(delegate), root_window(), gfx::Rect(10, 10, 100, 200)));
widget->Show();
- delegate->ClearGotMove();
+ delegate_ptr->ClearGotMove();
// Simulate a maximize with animation.
widget->GetNativeView()->RecreateLayer();
widget->SetBounds(gfx::Rect(0, 0, 500, 500));
- EXPECT_TRUE(delegate->got_move());
- widget->CloseNow();
+ EXPECT_TRUE(delegate_ptr->got_move());
}
// Tests that if a widget has a view which should be initially focused when the
@@ -789,34 +756,32 @@ TEST_F(NativeWidgetAuraTest, PreventFocusOnNonActivableWindow) {
// visible.
TEST_F(NativeWidgetAuraTest, VisibilityOfChildBubbleWindow) {
// Create a parent window.
- Widget parent;
+ UniqueWidgetPtr parent = std::make_unique<Widget>();
Widget::InitParams parent_params(Widget::InitParams::TYPE_WINDOW);
- parent_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
parent_params.context = root_window();
- parent.Init(std::move(parent_params));
- parent.SetBounds(gfx::Rect(0, 0, 480, 320));
+ parent->Init(std::move(parent_params));
+ parent->SetBounds(gfx::Rect(0, 0, 480, 320));
// Add a child bubble window to the above parent window and show it.
- Widget child;
+ UniqueWidgetPtr child = std::make_unique<Widget>();
Widget::InitParams child_params(Widget::InitParams::TYPE_BUBBLE);
- child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- child_params.parent = parent.GetNativeWindow();
- child.Init(std::move(child_params));
- child.SetBounds(gfx::Rect(0, 0, 200, 200));
- child.Show();
+ child_params.parent = parent->GetNativeWindow();
+ child->Init(std::move(child_params));
+ child->SetBounds(gfx::Rect(0, 0, 200, 200));
+ child->Show();
// Check that the bubble window is added as the transient child and it is
// hidden because parent window is hidden.
wm::TransientWindowManager* manager =
- wm::TransientWindowManager::GetOrCreate(child.GetNativeWindow());
- EXPECT_EQ(parent.GetNativeWindow(), manager->transient_parent());
- EXPECT_FALSE(parent.IsVisible());
- EXPECT_FALSE(child.IsVisible());
+ wm::TransientWindowManager::GetOrCreate(child->GetNativeWindow());
+ EXPECT_EQ(parent->GetNativeWindow(), manager->transient_parent());
+ EXPECT_FALSE(parent->IsVisible());
+ EXPECT_FALSE(child->IsVisible());
// Show the parent window should make the transient child bubble visible.
- parent.Show();
- EXPECT_TRUE(parent.IsVisible());
- EXPECT_TRUE(child.IsVisible());
+ parent->Show();
+ EXPECT_TRUE(parent->IsVisible());
+ EXPECT_TRUE(child->IsVisible());
}
// Tests that for a child transient window, if its modal type is
@@ -824,42 +789,40 @@ TEST_F(NativeWidgetAuraTest, VisibilityOfChildBubbleWindow) {
// parent's visibility.
TEST_F(NativeWidgetAuraTest, TransientChildModalWindowVisibility) {
// Create a parent window.
- Widget parent;
+ UniqueWidgetPtr parent = std::make_unique<Widget>();
Widget::InitParams parent_params(Widget::InitParams::TYPE_WINDOW);
- parent_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
parent_params.context = root_window();
- parent.Init(std::move(parent_params));
- parent.SetBounds(gfx::Rect(0, 0, 400, 400));
- parent.Show();
- EXPECT_TRUE(parent.IsVisible());
+ parent->Init(std::move(parent_params));
+ parent->SetBounds(gfx::Rect(0, 0, 400, 400));
+ parent->Show();
+ EXPECT_TRUE(parent->IsVisible());
// Create a ui::MODAL_TYPE_WINDOW modal type transient child window.
- Widget child;
+ UniqueWidgetPtr child = std::make_unique<Widget>();
Widget::InitParams child_params(Widget::InitParams::TYPE_WINDOW);
- child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- child_params.parent = parent.GetNativeWindow();
+ child_params.parent = parent->GetNativeWindow();
child_params.delegate = new WidgetDelegate;
child_params.delegate->SetOwnedByWidget(true);
child_params.delegate->SetModalType(ui::MODAL_TYPE_WINDOW);
- child.Init(std::move(child_params));
- child.SetBounds(gfx::Rect(0, 0, 200, 200));
- child.Show();
- EXPECT_TRUE(parent.IsVisible());
- EXPECT_TRUE(child.IsVisible());
+ child->Init(std::move(child_params));
+ child->SetBounds(gfx::Rect(0, 0, 200, 200));
+ child->Show();
+ EXPECT_TRUE(parent->IsVisible());
+ EXPECT_TRUE(child->IsVisible());
// Hide the parent window should also hide the child window.
- parent.Hide();
- EXPECT_FALSE(parent.IsVisible());
- EXPECT_FALSE(child.IsVisible());
+ parent->Hide();
+ EXPECT_FALSE(parent->IsVisible());
+ EXPECT_FALSE(child->IsVisible());
// The child window can't be shown if the parent window is hidden.
- child.Show();
- EXPECT_FALSE(parent.IsVisible());
- EXPECT_FALSE(child.IsVisible());
+ child->Show();
+ EXPECT_FALSE(parent->IsVisible());
+ EXPECT_FALSE(child->IsVisible());
- parent.Show();
- EXPECT_TRUE(parent.IsVisible());
- EXPECT_TRUE(child.IsVisible());
+ parent->Show();
+ EXPECT_TRUE(parent->IsVisible());
+ EXPECT_TRUE(child->IsVisible());
}
// Tests that widgets that are created minimized have the correct restore
@@ -867,23 +830,22 @@ TEST_F(NativeWidgetAuraTest, TransientChildModalWindowVisibility) {
TEST_F(NativeWidgetAuraTest, MinimizedWidgetRestoreBounds) {
const gfx::Rect restore_bounds(300, 300);
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
params.context = root_window();
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.show_state = ui::SHOW_STATE_MINIMIZED;
params.bounds = restore_bounds;
- widget.Init(std::move(params));
- widget.Show();
+ widget->Init(std::move(params));
+ widget->Show();
- aura::Window* window = widget.GetNativeWindow();
+ aura::Window* window = widget->GetNativeWindow();
EXPECT_EQ(ui::SHOW_STATE_MINIMIZED,
window->GetProperty(aura::client::kShowStateKey));
EXPECT_EQ(restore_bounds,
*window->GetProperty(aura::client::kRestoreBoundsKey));
- widget.Restore();
+ widget->Restore();
EXPECT_EQ(restore_bounds, window->bounds());
}
diff --git a/chromium/ui/views/widget/native_widget_mac.h b/chromium/ui/views/widget/native_widget_mac.h
index 84b9b647c4e..cd8e460c461 100644
--- a/chromium/ui/views/widget/native_widget_mac.h
+++ b/chromium/ui/views/widget/native_widget_mac.h
@@ -8,7 +8,8 @@
#include <memory>
#include <string>
-#include "ui/base/ime/input_method_delegate.h"
+#include "base/memory/raw_ptr.h"
+#include "ui/base/ime/ime_key_event_dispatcher.h"
#include "ui/base/window_open_disposition.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/views/widget/native_widget_private.h"
@@ -40,7 +41,7 @@ class NativeWidgetMacNSWindowHost;
class VIEWS_EXPORT NativeWidgetMac : public internal::NativeWidgetPrivate,
public FocusChangeListener,
- public ui::internal::InputMethodDelegate {
+ public ui::ImeKeyEventDispatcher {
public:
explicit NativeWidgetMac(internal::NativeWidgetDelegate* delegate);
NativeWidgetMac(const NativeWidgetMac&) = delete;
@@ -255,7 +256,7 @@ class VIEWS_EXPORT NativeWidgetMac : public internal::NativeWidgetPrivate,
void OnWillChangeFocus(View* focused_before, View* focused_now) override;
void OnDidChangeFocus(View* focused_before, View* focused_now) override;
- // ui::internal::InputMethodDelegate:
+ // ui::ImeKeyEventDispatcher:
ui::EventDispatchDetails DispatchKeyEventPostIME(ui::KeyEvent* key) override;
private:
@@ -263,7 +264,7 @@ class VIEWS_EXPORT NativeWidgetMac : public internal::NativeWidgetPrivate,
friend class views::test::NativeWidgetMacTest;
class ZoomFocusMonitor;
- internal::NativeWidgetDelegate* delegate_;
+ raw_ptr<internal::NativeWidgetDelegate> delegate_;
std::unique_ptr<NativeWidgetMacNSWindowHost> ns_window_host_;
Widget::InitParams::Ownership ownership_;
@@ -277,7 +278,7 @@ class VIEWS_EXPORT NativeWidgetMac : public internal::NativeWidgetPrivate,
// Weak pointer to the FocusManager with with |zoom_focus_monitor_| and
// |ns_window_host_| are registered.
- FocusManager* focus_manager_ = nullptr;
+ raw_ptr<FocusManager> focus_manager_ = nullptr;
std::unique_ptr<ui::InputMethod> input_method_;
std::unique_ptr<ZoomFocusMonitor> zoom_focus_monitor_;
// Held while this widget is active if it's a child.
diff --git a/chromium/ui/views/widget/native_widget_mac.mm b/chromium/ui/views/widget/native_widget_mac.mm
index 42b1de89f5b..b3fc364e7b8 100644
--- a/chromium/ui/views/widget/native_widget_mac.mm
+++ b/chromium/ui/views/widget/native_widget_mac.mm
@@ -42,6 +42,7 @@
#include "ui/views/widget/native_widget_delegate.h"
#include "ui/views/widget/widget_aura_utils.h"
#include "ui/views/widget/widget_delegate.h"
+#include "ui/views/widget/widget_utils_mac.h"
#include "ui/views/window/native_frame_view.h"
using remote_cocoa::mojom::WindowVisibilityState;
@@ -53,7 +54,7 @@ namespace {
static base::RepeatingCallback<void(NativeWidgetMac*)>*
g_init_native_widget_callback = nullptr;
-NSInteger StyleMaskForParams(const Widget::InitParams& params) {
+uint64_t StyleMaskForParams(const Widget::InitParams& params) {
// If the Widget is modal, it will be displayed as a sheet. This works best if
// it has NSWindowStyleMaskTitled. For example, with
// NSWindowStyleMaskBorderless, the parent window still accepts input.
@@ -220,6 +221,14 @@ void NativeWidgetMac::InitNativeWidget(Widget::InitParams params) {
ns_window_host_->SetParent(parent_host);
ns_window_host_->InitWindow(params,
ConvertBoundsToScreenIfNeeded(params.bounds));
+
+ // In immersive fullscreen, bubbles will be shown under the toolbar by
+ // default. Fix it by explicitly StackAbove() its parent.
+ if (params.parent && views::IsNSToolbarFullScreenWindow(
+ params.parent.GetNativeNSView().window)) {
+ StackAbove(params.parent);
+ }
+
OnWindowInitialized();
// Only set the z-order here if it is non-default since setting it may affect
diff --git a/chromium/ui/views/widget/native_widget_mac_interactive_uitest.mm b/chromium/ui/views/widget/native_widget_mac_interactive_uitest.mm
index 4f8f154e4d9..24ab4a3ac2a 100644
--- a/chromium/ui/views/widget/native_widget_mac_interactive_uitest.mm
+++ b/chromium/ui/views/widget/native_widget_mac_interactive_uitest.mm
@@ -4,6 +4,8 @@
#include "ui/views/widget/native_widget_mac.h"
+#include "base/memory/raw_ptr.h"
+
#import <Cocoa/Cocoa.h>
#import "base/mac/mac_util.h"
@@ -68,7 +70,7 @@ class NativeWidgetMacInteractiveUITest::Observer : public TestWidgetObserver {
}
private:
- NativeWidgetMacInteractiveUITest* parent_;
+ raw_ptr<NativeWidgetMacInteractiveUITest> parent_;
};
// Test that showing a window causes it to attain global keyWindow status.
diff --git a/chromium/ui/views/widget/native_widget_mac_unittest.mm b/chromium/ui/views/widget/native_widget_mac_unittest.mm
index dda00910fda..c2f6e1bffe9 100644
--- a/chromium/ui/views/widget/native_widget_mac_unittest.mm
+++ b/chromium/ui/views/widget/native_widget_mac_unittest.mm
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/memory/raw_ptr.h"
+
#import "ui/views/widget/native_widget_mac.h"
#import <Cocoa/Cocoa.h>
@@ -58,10 +60,6 @@ const std::string kDummyWindowRestorationData = "e30=";
- (void)setWindowStateForEnd;
@end
-@interface NSWindow (PrivateAPI)
-- (BOOL)_isTitleHidden;
-@end
-
// Test NSWindow that provides hooks via method overrides to verify behavior.
@interface NativeWidgetMacTestWindow : NativeWidgetMacNSWindow
@property(readonly, nonatomic) int invalidateShadowCount;
@@ -122,7 +120,7 @@ class BridgedNativeWidgetTestApi {
}
private:
- remote_cocoa::NativeWidgetNSWindowBridge* bridge_;
+ raw_ptr<remote_cocoa::NativeWidgetNSWindowBridge> bridge_;
};
// Custom native_widget to create a NativeWidgetMacTestWindow.
@@ -247,7 +245,7 @@ class WidgetChangeObserver : public TestWidgetObserver {
int lost_visible_count_ = 0;
int target_gained_visible_count_ = 0;
int target_lost_visible_count_ = 0;
- base::RunLoop* run_loop_ = nullptr;
+ raw_ptr<base::RunLoop> run_loop_ = nullptr;
};
// This class gives public access to the protected ctor of
@@ -276,12 +274,12 @@ class CustomTooltipView : public View {
}
View* GetTooltipHandlerForPoint(const gfx::Point& point) override {
- return tooltip_handler_ ? tooltip_handler_ : this;
+ return tooltip_handler_ ? tooltip_handler_.get() : this;
}
private:
std::u16string tooltip_;
- View* tooltip_handler_; // Weak
+ raw_ptr<View> tooltip_handler_; // Weak
};
// A Widget subclass that exposes counts to calls made to OnMouseEvent().
@@ -419,7 +417,7 @@ class PaintCountView : public View {
private:
int paint_count_ = 0;
int target_paint_count_ = 0;
- base::RunLoop* run_loop_ = nullptr;
+ raw_ptr<base::RunLoop> run_loop_ = nullptr;
};
@@ -1091,7 +1089,7 @@ class ScopedSwizzleWaiter {
static ScopedSwizzleWaiter* instance_;
base::mac::ScopedObjCClassSwizzler swizzler_;
- base::RunLoop* run_loop_ = nullptr;
+ raw_ptr<base::RunLoop> run_loop_ = nullptr;
bool method_called_ = false;
};
@@ -1734,33 +1732,9 @@ TEST_F(NativeWidgetMacTest, NativeProperties) {
regular_widget->CloseNow();
}
-NSData* WindowContentsAsTIFF(NSWindow* window) {
- NSView* frame_view = [[window contentView] superview];
- EXPECT_TRUE(frame_view);
-
- // Inset to mask off left and right edges which vary in HighDPI.
- NSRect bounds = NSInsetRect([frame_view bounds], 4, 0);
-
- // On 10.6, the grippy changes appearance slightly when painted the second
- // time in a textured window. Since this test cares about the window title,
- // cut off the bottom of the window.
- bounds.size.height -= 40;
- bounds.origin.y += 40;
-
- NSBitmapImageRep* bitmap =
- [frame_view bitmapImageRepForCachingDisplayInRect:bounds];
- EXPECT_TRUE(bitmap);
-
- [frame_view cacheDisplayInRect:bounds toBitmapImageRep:bitmap];
- NSData* tiff = [bitmap TIFFRepresentation];
- EXPECT_TRUE(tiff);
- return tiff;
-}
-
class CustomTitleWidgetDelegate : public WidgetDelegate {
public:
- CustomTitleWidgetDelegate(Widget* widget)
- : widget_(widget), should_show_title_(true) {}
+ explicit CustomTitleWidgetDelegate(Widget* widget) : widget_(widget) {}
CustomTitleWidgetDelegate(const CustomTitleWidgetDelegate&) = delete;
CustomTitleWidgetDelegate& operator=(const CustomTitleWidgetDelegate&) =
@@ -1776,53 +1750,11 @@ class CustomTitleWidgetDelegate : public WidgetDelegate {
const Widget* GetWidget() const override { return widget_; }
private:
- Widget* widget_;
+ raw_ptr<Widget> widget_;
std::u16string title_;
- bool should_show_title_;
+ bool should_show_title_ = true;
};
-// Test that undocumented title-hiding API we're using does the job.
-TEST_F(NativeWidgetMacTest, DISABLED_DoesHideTitle) {
- // Same as CreateTopLevelPlatformWidget but with a custom delegate.
- Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
- Widget* widget = new Widget;
- params.native_widget =
- CreatePlatformNativeWidgetImpl(widget, kStubCapture, nullptr);
- CustomTitleWidgetDelegate delegate(widget);
- params.delegate = &delegate;
- params.bounds = gfx::Rect(0, 0, 800, 600);
- widget->Init(std::move(params));
- widget->Show();
-
- NSWindow* ns_window = widget->GetNativeWindow().GetNativeNSWindow();
- // Disable color correction so we can read unmodified values from the bitmap.
- [ns_window setColorSpace:[NSColorSpace sRGBColorSpace]];
-
- EXPECT_EQ(std::u16string(), delegate.GetWindowTitle());
- EXPECT_NSEQ(@"", [ns_window title]);
- NSData* empty_title_data = WindowContentsAsTIFF(ns_window);
-
- delegate.set_title(u"This is a title");
- widget->UpdateWindowTitle();
- NSData* this_title_data = WindowContentsAsTIFF(ns_window);
-
- // The default window with a title should look different from the
- // window with an empty title.
- EXPECT_NSNE(empty_title_data, this_title_data);
-
- delegate.set_should_show_title(false);
- delegate.set_title(u"This is another title");
- widget->UpdateWindowTitle();
- NSData* hidden_title_data = WindowContentsAsTIFF(ns_window);
-
- // With our magic setting, the window with a title should look the
- // same as the window with an empty title.
- EXPECT_TRUE([ns_window _isTitleHidden]);
- EXPECT_NSEQ(empty_title_data, hidden_title_data);
-
- widget->CloseNow();
-}
-
// Test calls to invalidate the shadow when composited frames arrive.
TEST_F(NativeWidgetMacTest, InvalidateShadow) {
NativeWidgetMacTestWindow* window;
@@ -2019,9 +1951,10 @@ class NativeWidgetMacFullKeyboardAccessTest : public NativeWidgetMacTest {
NativeWidgetMacTest::TearDown();
}
- Widget* widget_ = nullptr;
- remote_cocoa::NativeWidgetNSWindowBridge* bridge_ = nullptr;
- ui::test::ScopedFakeFullKeyboardAccess* fake_full_keyboard_access_ = nullptr;
+ raw_ptr<Widget> widget_ = nullptr;
+ raw_ptr<remote_cocoa::NativeWidgetNSWindowBridge> bridge_ = nullptr;
+ raw_ptr<ui::test::ScopedFakeFullKeyboardAccess> fake_full_keyboard_access_ =
+ nullptr;
};
// Ensure that calling SetSize doesn't change the origin.
@@ -2079,6 +2012,31 @@ TEST_F(NativeWidgetMacTest, SetSizeDoesntChangeOrigin) {
parent->CloseNow();
}
+// Tests that tooltip widgets get the correct accessibilty role so that they're
+// not announced as windows by VoiceOver.
+TEST_F(NativeWidgetMacTest, AccessibilityRole) {
+ {
+ NativeWidgetMacTestWindow* window;
+
+ Widget::InitParams init_params =
+ CreateParams(Widget::InitParams::TYPE_WINDOW);
+ Widget* widget =
+ CreateWidgetWithTestWindow(std::move(init_params), &window);
+ ASSERT_EQ([window accessibilityRole], NSAccessibilityWindowRole);
+ widget->CloseNow();
+ }
+ {
+ NativeWidgetMacTestWindow* window;
+
+ Widget::InitParams init_params =
+ CreateParams(Widget::InitParams::TYPE_TOOLTIP);
+ Widget* widget =
+ CreateWidgetWithTestWindow(std::move(init_params), &window);
+ ASSERT_EQ([window accessibilityRole], NSAccessibilityHelpTagRole);
+ widget->CloseNow();
+ }
+}
+
// Test that updateFullKeyboardAccess method on BridgedContentView correctly
// sets the keyboard accessibility mode on the associated focus manager.
TEST_F(NativeWidgetMacFullKeyboardAccessTest, FullKeyboardToggle) {
@@ -2152,7 +2110,7 @@ class NativeWidgetMacViewsOrderTest : public WidgetTest {
NativeHostHolder(NativeViewHost* host)
: host_(host), view_([[NSView alloc] init]) {}
- NativeViewHost* const host_;
+ const raw_ptr<NativeViewHost> host_;
base::scoped_nsobject<NSView> view_;
};
@@ -2166,7 +2124,7 @@ class NativeWidgetMacViewsOrderTest : public WidgetTest {
[[widget_->GetNativeView().GetNativeNSView() subviews] copy]);
native_host_parent_ = new View();
- widget_->GetContentsView()->AddChildView(native_host_parent_);
+ widget_->GetContentsView()->AddChildView(native_host_parent_.get());
const size_t kNativeViewCount = 3;
for (size_t i = 0; i < kNativeViewCount; ++i) {
@@ -2192,8 +2150,8 @@ class NativeWidgetMacViewsOrderTest : public WidgetTest {
NSArray<NSView*>* GetStartingSubviews() { return starting_subviews_; }
- Widget* widget_ = nullptr;
- View* native_host_parent_ = nullptr;
+ raw_ptr<Widget> widget_ = nullptr;
+ raw_ptr<View> native_host_parent_ = nullptr;
std::vector<std::unique_ptr<NativeHostHolder>> hosts_;
base::scoped_nsobject<NSArray<NSView*>> starting_subviews_;
};
diff --git a/chromium/ui/views/widget/root_view.cc b/chromium/ui/views/widget/root_view.cc
index cf4d61c50d2..e320ce15417 100644
--- a/chromium/ui/views/widget/root_view.cc
+++ b/chromium/ui/views/widget/root_view.cc
@@ -51,6 +51,11 @@ class MouseEnterExitEvent : public ui::MouseEvent {
}
~MouseEnterExitEvent() override = default;
+
+ // Event:
+ std::unique_ptr<ui::Event> Clone() const override {
+ return std::make_unique<MouseEnterExitEvent>(*this);
+ }
};
} // namespace
@@ -677,8 +682,8 @@ void RootView::GetAccessibleNodeData(ui::AXNodeData* node_data) {
auto* widget_delegate = GetWidget()->widget_delegate();
if (!widget_delegate)
return;
- node_data->SetName(widget_delegate->GetAccessibleWindowTitle());
node_data->role = widget_delegate->GetAccessibleWindowRole();
+ node_data->SetName(widget_delegate->GetAccessibleWindowTitle());
}
void RootView::UpdateParentLayer() {
diff --git a/chromium/ui/views/widget/unique_widget_ptr.cc b/chromium/ui/views/widget/unique_widget_ptr.cc
index 6e219970dee..252bc15b594 100644
--- a/chromium/ui/views/widget/unique_widget_ptr.cc
+++ b/chromium/ui/views/widget/unique_widget_ptr.cc
@@ -6,67 +6,13 @@
#include <utility>
-#include "base/scoped_observation.h"
-#include "ui/views/view.h"
-#include "ui/views/widget/widget.h"
-#include "ui/views/widget/widget_observer.h"
-
namespace views {
-namespace {
-
-struct WidgetAutoCloser {
- void operator()(Widget* widget) {
- widget->CloseWithReason(Widget::ClosedReason::kUnspecified);
- }
-};
-
-using WidgetAutoClosePtr = std::unique_ptr<Widget, WidgetAutoCloser>;
-
-} // namespace
-
-class UniqueWidgetPtr::UniqueWidgetPtrImpl : public WidgetObserver {
- public:
- UniqueWidgetPtrImpl() = default;
- // This class acts like unique_ptr<Widget>, so this constructor is
- // deliberately implicit.
- UniqueWidgetPtrImpl(std::unique_ptr<Widget> widget) // NOLINT
- : widget_closer_(widget.release()) {
- widget_observation_.Observe(widget_closer_.get());
- }
-
- UniqueWidgetPtrImpl(const UniqueWidgetPtrImpl&) = delete;
-
- UniqueWidgetPtrImpl& operator=(const UniqueWidgetPtrImpl&) = delete;
-
- ~UniqueWidgetPtrImpl() override = default;
-
- Widget* Get() const { return widget_closer_.get(); }
-
- void Reset() {
- if (!widget_closer_)
- return;
- widget_observation_.Reset();
- widget_closer_.reset();
- }
-
- // WidgetObserver overrides.
- void OnWidgetDestroying(Widget* widget) override {
- DCHECK_EQ(widget, widget_closer_.get());
- widget_observation_.Reset();
- widget_closer_.release();
- }
-
- private:
- base::ScopedObservation<Widget, WidgetObserver> widget_observation_{this};
- WidgetAutoClosePtr widget_closer_;
-};
-
UniqueWidgetPtr::UniqueWidgetPtr() = default;
-UniqueWidgetPtr::UniqueWidgetPtr(std::unique_ptr<Widget> widget)
- : unique_widget_ptr_impl_(
- std::make_unique<UniqueWidgetPtrImpl>(std::move(widget))) {}
+UniqueWidgetPtr::UniqueWidgetPtr(std::unique_ptr<Widget> widget) {
+ Init(std::move(widget));
+}
UniqueWidgetPtr::UniqueWidgetPtr(UniqueWidgetPtr&& other) = default;
@@ -94,4 +40,38 @@ Widget* UniqueWidgetPtr::get() const {
return unique_widget_ptr_impl_ ? unique_widget_ptr_impl_->Get() : nullptr;
}
+void UniqueWidgetPtr::Init(std::unique_ptr<Widget> widget) {
+ unique_widget_ptr_impl_ = std::make_unique<Impl>(std::move(widget));
+}
+
+void UniqueWidgetPtr::Impl::WidgetAutoCloser::operator()(Widget* widget) {
+ widget->CloseWithReason(Widget::ClosedReason::kUnspecified);
+}
+
+UniqueWidgetPtr::Impl::Impl() = default;
+
+UniqueWidgetPtr::Impl::Impl(std::unique_ptr<Widget> widget)
+ : widget_closer_(widget.release()) {
+ widget_observation_.Observe(widget_closer_.get());
+}
+
+UniqueWidgetPtr::Impl::~Impl() = default;
+
+Widget* UniqueWidgetPtr::Impl::Get() const {
+ return widget_closer_.get();
+}
+
+void UniqueWidgetPtr::Impl::Reset() {
+ if (!widget_closer_)
+ return;
+ widget_observation_.Reset();
+ widget_closer_.reset();
+}
+
+void UniqueWidgetPtr::Impl::OnWidgetDestroying(Widget* widget) {
+ DCHECK_EQ(widget, widget_closer_.get());
+ widget_observation_.Reset();
+ widget_closer_.release();
+}
+
} // namespace views
diff --git a/chromium/ui/views/widget/unique_widget_ptr.h b/chromium/ui/views/widget/unique_widget_ptr.h
index fc8c471db8e..a0198ab8f2c 100644
--- a/chromium/ui/views/widget/unique_widget_ptr.h
+++ b/chromium/ui/views/widget/unique_widget_ptr.h
@@ -7,21 +7,35 @@
#include <memory>
+#include "base/scoped_observation.h"
#include "ui/views/views_export.h"
+#include "ui/views/widget/widget.h"
+#include "ui/views/widget/widget_observer.h"
namespace views {
-class Widget;
-
-// Ensures the Widget is properly closed when this special
-// auto pointer goes out of scope.
-
+// A weak owning pointer to a Widget.
+// This smart pointer acts like a unique_ptr: it ensures the Widget is
+// properly closed when it goes out of scope.
+// It also acts like a WeakPtr: the Widget may be deleted by its native
+// widget and `get()` becomes nullptr when this happens.
+// Caller may check the validity of this pointer before dereferencing it if
+// the widget lifetime is in doubt.
class VIEWS_EXPORT UniqueWidgetPtr {
public:
UniqueWidgetPtr();
// This class acts like a std::unique_ptr<Widget>, so this constructor is
// deliberately implicit.
UniqueWidgetPtr(std::unique_ptr<Widget> widget); // NOLINT
+
+ // Construct from a subclass instance of Widget. Note that ~Widget() is
+ // virtual, so the downcasting is safe. This constructor is deliberately
+ // implicit.
+ template <class U>
+ UniqueWidgetPtr(std::unique_ptr<U> widget) { // NOLINT
+ Init(std::unique_ptr<Widget>(widget.release()));
+ }
+
UniqueWidgetPtr(UniqueWidgetPtr&&);
UniqueWidgetPtr& operator=(UniqueWidgetPtr&&);
~UniqueWidgetPtr();
@@ -33,9 +47,31 @@ class VIEWS_EXPORT UniqueWidgetPtr {
Widget* get() const;
private:
- class UniqueWidgetPtrImpl;
+ class Impl : public WidgetObserver {
+ public:
+ Impl();
+ explicit Impl(std::unique_ptr<Widget> widget);
+ Impl(const Impl&) = delete;
+ Impl& operator=(const Impl&) = delete;
+ ~Impl() override;
+
+ Widget* Get() const;
+ void Reset();
+
+ // WidgetObserver overrides.
+ void OnWidgetDestroying(Widget* widget) override;
+
+ private:
+ struct WidgetAutoCloser {
+ void operator()(Widget* widget);
+ };
+
+ base::ScopedObservation<Widget, WidgetObserver> widget_observation_{this};
+ std::unique_ptr<Widget, WidgetAutoCloser> widget_closer_;
+ };
+ void Init(std::unique_ptr<Widget> widget);
- std::unique_ptr<UniqueWidgetPtrImpl> unique_widget_ptr_impl_;
+ std::unique_ptr<Impl> unique_widget_ptr_impl_;
};
} // namespace views
diff --git a/chromium/ui/views/widget/widget.cc b/chromium/ui/views/widget/widget.cc
index 046d3cf77f7..2cb71ae39fa 100644
--- a/chromium/ui/views/widget/widget.cc
+++ b/chromium/ui/views/widget/widget.cc
@@ -49,7 +49,7 @@
#include "ui/views/window/dialog_delegate.h"
#if BUILDFLAG(IS_LINUX)
-#include "ui/views/linux_ui/linux_ui.h"
+#include "ui/linux/linux_ui.h"
#endif
namespace views {
@@ -1820,7 +1820,7 @@ const ui::NativeTheme* Widget::GetNativeTheme() const {
return parent_->GetNativeTheme();
#if BUILDFLAG(IS_LINUX)
- if (const views::LinuxUI* linux_ui = views::LinuxUI::instance()) {
+ if (const ui::LinuxUi* linux_ui = ui::LinuxUi::instance()) {
if (auto* native_theme = linux_ui->GetNativeTheme(GetNativeWindow()))
return native_theme;
}
diff --git a/chromium/ui/views/widget/widget.h b/chromium/ui/views/widget/widget.h
index d44b04c2587..6e8a17f9452 100644
--- a/chromium/ui/views/widget/widget.h
+++ b/chromium/ui/views/widget/widget.h
@@ -250,7 +250,7 @@ class VIEWS_EXPORT Widget : public internal::NativeWidgetDelegate,
// If null, a default implementation will be constructed. The default
// implementation deletes itself when the Widget closes.
- WidgetDelegate* delegate = nullptr;
+ raw_ptr<WidgetDelegate> delegate = nullptr;
// Internal name. Propagated to the NativeWidget. Useful for debugging.
std::string name;
@@ -349,13 +349,13 @@ class VIEWS_EXPORT Widget : public internal::NativeWidgetDelegate,
// If set, this value is used as the Widget's NativeWidget implementation.
// The Widget will not construct a default one.
- NativeWidget* native_widget = nullptr;
+ raw_ptr<NativeWidget> native_widget = nullptr;
// Aura-only. Provides a DesktopWindowTreeHost implementation to use instead
// of the default one.
// TODO(beng): Figure out if there's a better way to expose this, e.g. get
// rid of NW subclasses and do this all via message handling.
- DesktopWindowTreeHost* desktop_window_tree_host = nullptr;
+ raw_ptr<DesktopWindowTreeHost> desktop_window_tree_host = nullptr;
// Only used by NativeWidgetAura. Specifies the type of layer for the
// aura::Window.
@@ -394,6 +394,13 @@ class VIEWS_EXPORT Widget : public internal::NativeWidgetDelegate,
// If set, the widget was created in headless mode.
bool headless_mode = false;
+#if defined(USE_AURA) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS))
+ // Indicates whether the desktop native widget is required for the widget.
+ // This may enforce changing the type of the underlying platform window.
+ // See crbug.com/1280332
+ bool requires_accelerated_widget = false;
+#endif
+
#if BUILDFLAG(IS_CHROMEOS_LACROS)
// TODO(crbug.com/1327490): Rename restore info variables.
// Only used by Wayland. Specifies the session id window key, the restore
@@ -1202,7 +1209,7 @@ class VIEWS_EXPORT Widget : public internal::NativeWidgetDelegate,
// Non-owned pointer to the Widget's delegate. If a NULL delegate is supplied
// to Init() a default WidgetDelegate is created.
- raw_ptr<WidgetDelegate> widget_delegate_ = nullptr;
+ raw_ptr<WidgetDelegate, DanglingUntriaged> widget_delegate_ = nullptr;
// The parent of this widget. This is the widget that associates with
// the |params.parent| supplied to Init(). If no parent is given or the native
diff --git a/chromium/ui/views/widget/widget_delegate.cc b/chromium/ui/views/widget/widget_delegate.cc
index f332341247f..6d58e740b56 100644
--- a/chromium/ui/views/widget/widget_delegate.cc
+++ b/chromium/ui/views/widget/widget_delegate.cc
@@ -31,11 +31,6 @@ std::unique_ptr<ClientView> CreateDefaultClientView(WidgetDelegate* delegate,
widget, delegate->TransferOwnershipOfContentsView());
}
-std::unique_ptr<NonClientFrameView> CreateDefaultNonClientFrameView(
- Widget* widget) {
- return nullptr;
-}
-
std::unique_ptr<View> CreateDefaultOverlayView() {
return nullptr;
}
@@ -52,8 +47,6 @@ WidgetDelegate::WidgetDelegate()
: widget_initialized_callbacks_(std::make_unique<ClosureVector>()),
client_view_factory_(
base::BindOnce(&CreateDefaultClientView, base::Unretained(this))),
- non_client_frame_view_factory_(
- base::BindRepeating(&CreateDefaultNonClientFrameView)),
overlay_view_factory_(base::BindOnce(&CreateDefaultOverlayView)) {}
WidgetDelegate::~WidgetDelegate() {
@@ -284,8 +277,7 @@ ClientView* WidgetDelegate::CreateClientView(Widget* widget) {
std::unique_ptr<NonClientFrameView> WidgetDelegate::CreateNonClientFrameView(
Widget* widget) {
- DCHECK(non_client_frame_view_factory_);
- return non_client_frame_view_factory_.Run(widget);
+ return nullptr;
}
View* WidgetDelegate::CreateOverlayView() {
@@ -431,12 +423,6 @@ void WidgetDelegate::SetClientViewFactory(ClientViewFactory factory) {
client_view_factory_ = std::move(factory);
}
-void WidgetDelegate::SetNonClientFrameViewFactory(
- NonClientFrameViewFactory factory) {
- DCHECK(!GetWidget());
- non_client_frame_view_factory_ = std::move(factory);
-}
-
void WidgetDelegate::SetOverlayViewFactory(OverlayViewFactory factory) {
DCHECK(!GetWidget());
overlay_view_factory_ = std::move(factory);
diff --git a/chromium/ui/views/widget/widget_delegate.h b/chromium/ui/views/widget/widget_delegate.h
index 8176aa0ac84..431d19f2543 100644
--- a/chromium/ui/views/widget/widget_delegate.h
+++ b/chromium/ui/views/widget/widget_delegate.h
@@ -41,14 +41,6 @@ class VIEWS_EXPORT WidgetDelegate {
base::OnceCallback<std::unique_ptr<ClientView>(Widget*)>;
using OverlayViewFactory = base::OnceCallback<std::unique_ptr<View>()>;
- // NonClientFrameViewFactory is a RepeatingCallback because the
- // NonClientFrameView is rebuilt on Aura platforms when WindowTreeHost
- // properties that might affect its appearance change. Rebuilding the entire
- // NonClientFrameView is a pretty big hammer for that but it's the one we
- // have.
- using NonClientFrameViewFactory =
- base::RepeatingCallback<std::unique_ptr<NonClientFrameView>(Widget*)>;
-
struct Params {
Params();
~Params();
@@ -371,7 +363,6 @@ class VIEWS_EXPORT WidgetDelegate {
void RegisterDeleteDelegateCallback(base::OnceClosure callback);
void SetClientViewFactory(ClientViewFactory factory);
- void SetNonClientFrameViewFactory(NonClientFrameViewFactory factory);
void SetOverlayViewFactory(OverlayViewFactory factory);
// Called to notify the WidgetDelegate of changes to the state of its Widget.
@@ -431,7 +422,6 @@ class VIEWS_EXPORT WidgetDelegate {
ClosureVector delete_delegate_callbacks_;
ClientViewFactory client_view_factory_;
- NonClientFrameViewFactory non_client_frame_view_factory_;
OverlayViewFactory overlay_view_factory_;
};
diff --git a/chromium/ui/views/widget/widget_delegate_unittest.cc b/chromium/ui/views/widget/widget_delegate_unittest.cc
index 7c79bc7982a..d1b68157dcd 100644
--- a/chromium/ui/views/widget/widget_delegate_unittest.cc
+++ b/chromium/ui/views/widget/widget_delegate_unittest.cc
@@ -72,22 +72,6 @@ TEST_F(WidgetDelegateTest, ClientViewFactoryCanReplaceClientView) {
EXPECT_EQ(tracker.view(), client.get());
}
-TEST_F(WidgetDelegateTest,
- NonClientFrameViewFactoryCanReplaceNonClientFrameView) {
- ViewTracker tracker;
-
- auto delegate = std::make_unique<WidgetDelegate>();
- delegate->SetNonClientFrameViewFactory(
- base::BindLambdaForTesting([&tracker](Widget* widget) {
- auto view = std::make_unique<NonClientFrameView>();
- tracker.SetView(view.get());
- return view;
- }));
-
- auto nonclient = delegate->CreateNonClientFrameView(nullptr);
- EXPECT_EQ(tracker.view(), nonclient.get());
-}
-
TEST_F(WidgetDelegateTest, OverlayViewFactoryCanReplaceOverlayView) {
ViewTracker tracker;
diff --git a/chromium/ui/views/widget/widget_hwnd_utils.cc b/chromium/ui/views/widget/widget_hwnd_utils.cc
index b3a3efd0e52..89b4b5e0ec4 100644
--- a/chromium/ui/views/widget/widget_hwnd_utils.cc
+++ b/chromium/ui/views/widget/widget_hwnd_utils.cc
@@ -61,13 +61,13 @@ void CalculateWindowStylesFromInitParams(
// WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
*style |= WS_OVERLAPPEDWINDOW;
if (!widget_delegate->CanMaximize())
- *style &= ~WS_MAXIMIZEBOX;
+ *style &= static_cast<DWORD>(~WS_MAXIMIZEBOX);
if (!widget_delegate->CanMinimize())
- *style &= ~WS_MINIMIZEBOX;
+ *style &= static_cast<DWORD>(~WS_MINIMIZEBOX);
if (!widget_delegate->CanResize())
- *style &= ~(WS_THICKFRAME | WS_MAXIMIZEBOX);
+ *style &= static_cast<DWORD>(~(WS_THICKFRAME | WS_MAXIMIZEBOX));
if (params.remove_standard_frame)
- *style &= ~(WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
+ *style &= static_cast<DWORD>(~(WS_MINIMIZEBOX | WS_MAXIMIZEBOX));
if (native_widget_delegate->IsDialogBox()) {
*style |= DS_MODALFRAME;
@@ -87,7 +87,7 @@ void CalculateWindowStylesFromInitParams(
// See layered window comment below.
if (is_translucent)
- *style &= ~(WS_THICKFRAME | WS_CAPTION);
+ *style &= static_cast<DWORD>(~(WS_THICKFRAME | WS_CAPTION));
break;
}
case Widget::InitParams::TYPE_CONTROL:
diff --git a/chromium/ui/views/widget/widget_interactive_uitest.cc b/chromium/ui/views/widget/widget_interactive_uitest.cc
index 04791dcae6e..9140fa34e09 100644
--- a/chromium/ui/views/widget/widget_interactive_uitest.cc
+++ b/chromium/ui/views/widget/widget_interactive_uitest.cc
@@ -13,7 +13,7 @@
#include "base/location.h"
#include "base/memory/raw_ptr.h"
#include "base/run_loop.h"
-#include "base/strings/stringprintf.h"
+#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
@@ -42,6 +42,7 @@
#include "ui/views/test/widget_test.h"
#include "ui/views/touchui/touch_selection_controller_impl.h"
#include "ui/views/widget/root_view.h"
+#include "ui/views/widget/unique_widget_ptr.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_utils.h"
#include "ui/views/window/dialog_delegate.h"
@@ -62,6 +63,25 @@ namespace views::test {
namespace {
+template <class T>
+class UniqueWidgetPtrT : public views::UniqueWidgetPtr {
+ public:
+ UniqueWidgetPtrT() = default;
+ UniqueWidgetPtrT(std::unique_ptr<T> widget) // NOLINT
+ : views::UniqueWidgetPtr(std::move(widget)) {}
+ UniqueWidgetPtrT(UniqueWidgetPtrT&&) = default;
+ UniqueWidgetPtrT& operator=(UniqueWidgetPtrT&&) = default;
+ ~UniqueWidgetPtrT() = default;
+
+ T& operator*() const {
+ return static_cast<T&>(views::UniqueWidgetPtr::operator*());
+ }
+ T* operator->() const {
+ return static_cast<T*>(views::UniqueWidgetPtr::operator->());
+ }
+ T* get() const { return static_cast<T*>(views::UniqueWidgetPtr::get()); }
+};
+
// A View that closes the Widget and exits the current message-loop when it
// receives a mouse-release event.
class ExitLoopOnRelease : public View {
@@ -517,9 +537,9 @@ TEST_F(WidgetTestInteractive, CheckResizeControllerEvents) {
// Test view focus restoration when a widget is deactivated and re-activated.
TEST_F(WidgetTestInteractive, ViewFocusOnWidgetActivationChanges) {
WidgetAutoclosePtr widget1(CreateTopLevelPlatformWidget());
- View* view1 = new View;
+ View* view1 =
+ widget1->GetContentsView()->AddChildView(std::make_unique<View>());
view1->SetFocusBehavior(View::FocusBehavior::ALWAYS);
- widget1->GetContentsView()->AddChildView(view1);
WidgetAutoclosePtr widget2(CreateTopLevelPlatformWidget());
View* view2a = new View;
@@ -714,8 +734,9 @@ TEST_F(WidgetTestInteractive, ViewFocusOnHWNDEnabledChanges) {
EXPECT_EQ(hwnd, ::GetActiveWindow());
for (View* view : widget->GetContentsView()->children()) {
- SCOPED_TRACE(base::StringPrintf(
- "Child view %d", widget->GetContentsView()->GetIndexOf(view)));
+ SCOPED_TRACE("Child view " +
+ base::NumberToString(
+ widget->GetContentsView()->GetIndexOf(view).value()));
view->RequestFocus();
EXPECT_EQ(view, widget->GetFocusManager()->GetFocusedView());
@@ -765,33 +786,33 @@ class WidgetActivationTest : public Widget {
// Tests whether the widget only becomes active when the underlying window
// is really active.
TEST_F(WidgetTestInteractive, WidgetNotActivatedOnFakeActivationMessages) {
- WidgetActivationTest widget1;
+ UniqueWidgetPtrT widget1 = std::make_unique<WidgetActivationTest>();
Widget::InitParams init_params =
CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- init_params.native_widget = new DesktopNativeWidgetAura(&widget1);
+ init_params.native_widget = new DesktopNativeWidgetAura(widget1.get());
init_params.bounds = gfx::Rect(0, 0, 200, 200);
- widget1.Init(std::move(init_params));
- widget1.Show();
- EXPECT_EQ(true, widget1.active());
-
- WidgetActivationTest widget2;
- init_params.native_widget = new DesktopNativeWidgetAura(&widget2);
- widget2.Init(std::move(init_params));
- widget2.Show();
- EXPECT_EQ(true, widget2.active());
- EXPECT_EQ(false, widget1.active());
-
- HWND win32_native_window1 = HWNDForWidget(&widget1);
+ widget1->Init(std::move(init_params));
+ widget1->Show();
+ EXPECT_EQ(true, widget1->active());
+
+ UniqueWidgetPtrT widget2 = std::make_unique<WidgetActivationTest>();
+ init_params = CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
+ init_params.native_widget = new DesktopNativeWidgetAura(widget2.get());
+ widget2->Init(std::move(init_params));
+ widget2->Show();
+ EXPECT_EQ(true, widget2->active());
+ EXPECT_EQ(false, widget1->active());
+
+ HWND win32_native_window1 = HWNDForWidget(widget1.get());
EXPECT_TRUE(::IsWindow(win32_native_window1));
::SendMessage(win32_native_window1, WM_NCACTIVATE, 1, 0);
- EXPECT_EQ(false, widget1.active());
- EXPECT_EQ(true, widget2.active());
+ EXPECT_EQ(false, widget1->active());
+ EXPECT_EQ(true, widget2->active());
::SetActiveWindow(win32_native_window1);
- EXPECT_EQ(true, widget1.active());
- EXPECT_EQ(false, widget2.active());
+ EXPECT_EQ(true, widget1->active());
+ EXPECT_EQ(false, widget2->active());
}
// On Windows if we create a fullscreen window on a thread, then it affects the
@@ -799,42 +820,41 @@ TEST_F(WidgetTestInteractive, WidgetNotActivatedOnFakeActivationMessages) {
// this we reduce the bounds of a fullscreen window by 1px when it loses
// activation. This test verifies the same.
TEST_F(WidgetTestInteractive, FullscreenBoundsReducedOnActivationLoss) {
- Widget widget1;
+ UniqueWidgetPtr widget1 = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
- params.native_widget = new DesktopNativeWidgetAura(&widget1);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- widget1.Init(std::move(params));
- widget1.SetBounds(gfx::Rect(0, 0, 200, 200));
- widget1.Show();
+ params.native_widget = new DesktopNativeWidgetAura(widget1.get());
+ widget1->Init(std::move(params));
+ widget1->SetBounds(gfx::Rect(0, 0, 200, 200));
+ widget1->Show();
- widget1.Activate();
+ widget1->Activate();
RunPendingMessages();
EXPECT_EQ(::GetActiveWindow(),
- widget1.GetNativeWindow()->GetHost()->GetAcceleratedWidget());
+ widget1->GetNativeWindow()->GetHost()->GetAcceleratedWidget());
- widget1.SetFullscreen(true);
- EXPECT_TRUE(widget1.IsFullscreen());
+ widget1->SetFullscreen(true);
+ EXPECT_TRUE(widget1->IsFullscreen());
// Ensure that the StopIgnoringPosChanges task in HWNDMessageHandler runs.
// This task is queued when a widget becomes fullscreen.
RunPendingMessages();
EXPECT_EQ(::GetActiveWindow(),
- widget1.GetNativeWindow()->GetHost()->GetAcceleratedWidget());
- gfx::Rect fullscreen_bounds = widget1.GetWindowBoundsInScreen();
+ widget1->GetNativeWindow()->GetHost()->GetAcceleratedWidget());
+ gfx::Rect fullscreen_bounds = widget1->GetWindowBoundsInScreen();
- Widget widget2;
- params.native_widget = new DesktopNativeWidgetAura(&widget2);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- widget2.Init(std::move(params));
- widget2.SetBounds(gfx::Rect(0, 0, 200, 200));
- widget2.Show();
+ UniqueWidgetPtr widget2 = std::make_unique<Widget>();
+ params = CreateParams(Widget::InitParams::TYPE_WINDOW);
+ params.native_widget = new DesktopNativeWidgetAura(widget2.get());
+ widget2->Init(std::move(params));
+ widget2->SetBounds(gfx::Rect(0, 0, 200, 200));
+ widget2->Show();
- widget2.Activate();
+ widget2->Activate();
RunPendingMessages();
EXPECT_EQ(::GetActiveWindow(),
- widget2.GetNativeWindow()->GetHost()->GetAcceleratedWidget());
+ widget2->GetNativeWindow()->GetHost()->GetAcceleratedWidget());
gfx::Rect fullscreen_bounds_after_activation_loss =
- widget1.GetWindowBoundsInScreen();
+ widget1->GetWindowBoundsInScreen();
// After deactivation loss the bounds of the fullscreen widget should be
// reduced by 1px.
@@ -842,44 +862,40 @@ TEST_F(WidgetTestInteractive, FullscreenBoundsReducedOnActivationLoss) {
fullscreen_bounds_after_activation_loss.height(),
1);
- widget1.Activate();
+ widget1->Activate();
RunPendingMessages();
EXPECT_EQ(::GetActiveWindow(),
- widget1.GetNativeWindow()->GetHost()->GetAcceleratedWidget());
+ widget1->GetNativeWindow()->GetHost()->GetAcceleratedWidget());
gfx::Rect fullscreen_bounds_after_activate =
- widget1.GetWindowBoundsInScreen();
+ widget1->GetWindowBoundsInScreen();
// After activation the bounds of the fullscreen widget should be restored.
EXPECT_EQ(fullscreen_bounds, fullscreen_bounds_after_activate);
-
- widget1.CloseNow();
- widget2.CloseNow();
}
// Ensure the window rect and client rects are correct with a window that was
// maximized.
TEST_F(WidgetTestInteractive, FullscreenMaximizedWindowBounds) {
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
- params.native_widget = new DesktopNativeWidgetAura(&widget);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- widget.set_frame_type(Widget::FrameType::kForceCustom);
- widget.Init(std::move(params));
- widget.SetBounds(gfx::Rect(0, 0, 200, 200));
- widget.Show();
+ params.native_widget = new DesktopNativeWidgetAura(widget.get());
+ widget->set_frame_type(Widget::FrameType::kForceCustom);
+ widget->Init(std::move(params));
+ widget->SetBounds(gfx::Rect(0, 0, 200, 200));
+ widget->Show();
- widget.Maximize();
- EXPECT_TRUE(widget.IsMaximized());
+ widget->Maximize();
+ EXPECT_TRUE(widget->IsMaximized());
- widget.SetFullscreen(true);
- EXPECT_TRUE(widget.IsFullscreen());
- EXPECT_FALSE(widget.IsMaximized());
+ widget->SetFullscreen(true);
+ EXPECT_TRUE(widget->IsFullscreen());
+ EXPECT_FALSE(widget->IsMaximized());
// Ensure that the StopIgnoringPosChanges task in HWNDMessageHandler runs.
// This task is queued when a widget becomes fullscreen.
RunPendingMessages();
- aura::WindowTreeHost* host = widget.GetNativeWindow()->GetHost();
+ aura::WindowTreeHost* host = widget->GetNativeWindow()->GetHost();
HWND hwnd = host->GetAcceleratedWidget();
HMONITOR monitor = ::MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
@@ -889,22 +905,20 @@ TEST_F(WidgetTestInteractive, FullscreenMaximizedWindowBounds) {
ASSERT_TRUE(::GetMonitorInfo(monitor, &monitor_info));
gfx::Rect monitor_bounds(monitor_info.rcMonitor);
- gfx::Rect window_bounds = widget.GetWindowBoundsInScreen();
+ gfx::Rect window_bounds = widget->GetWindowBoundsInScreen();
gfx::Rect client_area_bounds = host->GetBoundsInPixels();
EXPECT_EQ(window_bounds, monitor_bounds);
EXPECT_EQ(monitor_bounds, client_area_bounds);
// Setting not fullscreen should return it to maximized.
- widget.SetFullscreen(false);
- EXPECT_FALSE(widget.IsFullscreen());
- EXPECT_TRUE(widget.IsMaximized());
+ widget->SetFullscreen(false);
+ EXPECT_FALSE(widget->IsFullscreen());
+ EXPECT_TRUE(widget->IsMaximized());
client_area_bounds = host->GetBoundsInPixels();
EXPECT_TRUE(monitor_bounds.Contains(client_area_bounds));
EXPECT_NE(monitor_bounds, client_area_bounds);
-
- widget.CloseNow();
}
#endif // BUILDFLAG(IS_WIN)
@@ -918,17 +932,16 @@ TEST_F(DesktopWidgetTestInteractive, WindowModalWindowDestroyedActivationTest) {
focus_listener.focus_changes();
// Create a top level widget.
- Widget top_level_widget;
+ UniqueWidgetPtr top_level_widget = std::make_unique<Widget>();
Widget::InitParams init_params =
CreateParams(Widget::InitParams::TYPE_WINDOW);
init_params.show_state = ui::SHOW_STATE_NORMAL;
gfx::Rect initial_bounds(0, 0, 500, 500);
init_params.bounds = initial_bounds;
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- top_level_widget.Init(std::move(init_params));
- ShowSync(&top_level_widget);
+ top_level_widget->Init(std::move(init_params));
+ ShowSync(top_level_widget.get());
- gfx::NativeView top_level_native_view = top_level_widget.GetNativeView();
+ gfx::NativeView top_level_native_view = top_level_widget->GetNativeView();
ASSERT_FALSE(focus_listener.focus_changes().empty());
EXPECT_EQ(1u, focus_changes.size());
EXPECT_EQ(top_level_native_view, focus_changes[0]);
@@ -938,7 +951,7 @@ TEST_F(DesktopWidgetTestInteractive, WindowModalWindowDestroyedActivationTest) {
dialog_delegate->SetModalType(ui::MODAL_TYPE_WINDOW);
Widget* modal_dialog_widget = views::DialogDelegate::CreateDialogWidget(
- dialog_delegate.release(), nullptr, top_level_widget.GetNativeView());
+ dialog_delegate.release(), nullptr, top_level_widget->GetNativeView());
modal_dialog_widget->SetBounds(gfx::Rect(100, 100, 200, 200));
// Note the dialog widget doesn't need a ShowSync. Since it is modal, it gains
@@ -953,33 +966,34 @@ TEST_F(DesktopWidgetTestInteractive, WindowModalWindowDestroyedActivationTest) {
#if BUILDFLAG(IS_MAC)
// Window modal dialogs on Mac are "sheets", which animate to close before
// activating their parent widget.
- views::test::WidgetActivationWaiter waiter(&top_level_widget, true);
+ views::test::WidgetActivationWaiter waiter(top_level_widget.get(), true);
modal_dialog_widget->Close();
waiter.Wait();
#else
- modal_dialog_widget->CloseNow();
+ views::test::WidgetDestroyedWaiter waiter(modal_dialog_widget);
+ modal_dialog_widget->Close();
+ waiter.Wait();
#endif
ASSERT_EQ(5u, focus_changes.size());
EXPECT_EQ(gfx::kNullNativeView, focus_changes[3]);
EXPECT_EQ(top_level_native_view, focus_changes[4]);
- top_level_widget.CloseNow();
+ top_level_widget->Close();
WidgetFocusManager::GetInstance()->RemoveFocusChangeListener(&focus_listener);
}
#endif
TEST_F(DesktopWidgetTestInteractive, CanActivateFlagIsHonored) {
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams init_params =
CreateParams(Widget::InitParams::TYPE_WINDOW);
init_params.bounds = gfx::Rect(0, 0, 200, 200);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
init_params.activatable = Widget::InitParams::Activatable::kNo;
- widget.Init(std::move(init_params));
+ widget->Init(std::move(init_params));
- widget.Show();
- EXPECT_FALSE(widget.IsActive());
+ widget->Show();
+ EXPECT_FALSE(widget->IsActive());
}
#if defined(USE_AURA)
@@ -1022,41 +1036,37 @@ TEST_F(WidgetTestInteractive, DisableViewDoesNotActivateWidget) {
#endif // !BUILDFLAG(IS_WIN)
// Create first widget and view, activate the widget, and focus the view.
- Widget widget1;
+ UniqueWidgetPtr widget1 = std::make_unique<Widget>();
Widget::InitParams params1 = CreateParams(Widget::InitParams::TYPE_POPUP);
- params1.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params1.activatable = Widget::InitParams::Activatable::kYes;
- widget1.Init(std::move(params1));
+ widget1->Init(std::move(params1));
- View* view1 = new View();
+ View* view1 = widget1->GetRootView()->AddChildView(std::make_unique<View>());
view1->SetFocusBehavior(View::FocusBehavior::ALWAYS);
- widget1.GetRootView()->AddChildView(view1);
- widget1.Show();
- ActivateSync(&widget1);
+ widget1->Show();
+ ActivateSync(widget1.get());
- FocusManager* focus_manager1 = widget1.GetFocusManager();
+ FocusManager* focus_manager1 = widget1->GetFocusManager();
ASSERT_TRUE(focus_manager1);
focus_manager1->SetFocusedView(view1);
EXPECT_EQ(view1, focus_manager1->GetFocusedView());
// Create second widget and view, activate the widget, and focus the view.
- Widget widget2;
+ UniqueWidgetPtr widget2 = std::make_unique<Widget>();
Widget::InitParams params2 = CreateParams(Widget::InitParams::TYPE_POPUP);
- params2.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params2.activatable = Widget::InitParams::Activatable::kYes;
- widget2.Init(std::move(params2));
+ widget2->Init(std::move(params2));
- View* view2 = new View();
+ View* view2 = widget2->GetRootView()->AddChildView(std::make_unique<View>());
view2->SetFocusBehavior(View::FocusBehavior::ALWAYS);
- widget2.GetRootView()->AddChildView(view2);
- widget2.Show();
- ActivateSync(&widget2);
- EXPECT_TRUE(widget2.IsActive());
- EXPECT_FALSE(widget1.IsActive());
+ widget2->Show();
+ ActivateSync(widget2.get());
+ EXPECT_TRUE(widget2->IsActive());
+ EXPECT_FALSE(widget1->IsActive());
- FocusManager* focus_manager2 = widget2.GetFocusManager();
+ FocusManager* focus_manager2 = widget2->GetFocusManager();
ASSERT_TRUE(focus_manager2);
focus_manager2->SetFocusedView(view2);
EXPECT_EQ(view2, focus_manager2->GetFocusedView());
@@ -1065,8 +1075,8 @@ TEST_F(WidgetTestInteractive, DisableViewDoesNotActivateWidget) {
// activated.
view1->SetEnabled(false);
EXPECT_NE(view1, focus_manager1->GetFocusedView());
- EXPECT_FALSE(widget1.IsActive());
- EXPECT_TRUE(widget2.IsActive());
+ EXPECT_FALSE(widget1->IsActive());
+ EXPECT_TRUE(widget2->IsActive());
}
TEST_F(WidgetTestInteractive, ShowCreatesActiveWindow) {
@@ -1140,13 +1150,12 @@ TEST_F(WidgetTestInteractive, WidgetShouldBeActiveWhenShow) {
#if BUILDFLAG(ENABLE_DESKTOP_AURA) || BUILDFLAG(IS_MAC)
TEST_F(WidgetTestInteractive, InactiveWidgetDoesNotGrabActivation) {
- WidgetAutoclosePtr widget(CreateTopLevelPlatformWidget());
+ UniqueWidgetPtr widget = base::WrapUnique(CreateTopLevelPlatformWidget());
ShowSync(widget.get());
EXPECT_EQ(GetWidgetShowState(widget.get()), ui::SHOW_STATE_NORMAL);
- WidgetAutoclosePtr widget2(new Widget());
+ UniqueWidgetPtr widget2 = std::make_unique<Widget>();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget2->Init(std::move(params));
widget2->Show();
RunPendingMessagesForActiveStatusChange();
@@ -1459,36 +1468,36 @@ class WidgetCaptureTest : public DesktopWidgetTestInteractive {
// Verifies Widget::SetCapture() results in updating native capture along with
// invoking the right Widget function.
void TestCapture(bool use_desktop_native_widget) {
- CaptureLostState capture_state1;
- CaptureLostTrackingWidget widget1(&capture_state1);
- InitPlatformWidget(&widget1, use_desktop_native_widget);
- widget1.Show();
+ UniqueWidgetPtrT widget1 =
+ std::make_unique<CaptureLostTrackingWidget>(capture_state1_.get());
+ InitPlatformWidget(widget1.get(), use_desktop_native_widget);
+ widget1->Show();
- CaptureLostState capture_state2;
- CaptureLostTrackingWidget widget2(&capture_state2);
- InitPlatformWidget(&widget2, use_desktop_native_widget);
- widget2.Show();
+ UniqueWidgetPtrT widget2 =
+ std::make_unique<CaptureLostTrackingWidget>(capture_state2_.get());
+ InitPlatformWidget(widget2.get(), use_desktop_native_widget);
+ widget2->Show();
// Set capture to widget2 and verity it gets it.
- widget2.SetCapture(widget2.GetRootView());
- EXPECT_FALSE(widget1.HasCapture());
- EXPECT_TRUE(widget2.HasCapture());
- EXPECT_FALSE(capture_state1.GetAndClearGotCaptureLost());
- EXPECT_FALSE(capture_state2.GetAndClearGotCaptureLost());
+ widget2->SetCapture(widget2->GetRootView());
+ EXPECT_FALSE(widget1->HasCapture());
+ EXPECT_TRUE(widget2->HasCapture());
+ EXPECT_FALSE(capture_state1_->GetAndClearGotCaptureLost());
+ EXPECT_FALSE(capture_state2_->GetAndClearGotCaptureLost());
// Set capture to widget1 and verify it gets it.
- widget1.SetCapture(widget1.GetRootView());
- EXPECT_TRUE(widget1.HasCapture());
- EXPECT_FALSE(widget2.HasCapture());
- EXPECT_FALSE(capture_state1.GetAndClearGotCaptureLost());
- EXPECT_TRUE(capture_state2.GetAndClearGotCaptureLost());
+ widget1->SetCapture(widget1->GetRootView());
+ EXPECT_TRUE(widget1->HasCapture());
+ EXPECT_FALSE(widget2->HasCapture());
+ EXPECT_FALSE(capture_state1_->GetAndClearGotCaptureLost());
+ EXPECT_TRUE(capture_state2_->GetAndClearGotCaptureLost());
// Release and verify no one has it.
- widget1.ReleaseCapture();
- EXPECT_FALSE(widget1.HasCapture());
- EXPECT_FALSE(widget2.HasCapture());
- EXPECT_TRUE(capture_state1.GetAndClearGotCaptureLost());
- EXPECT_FALSE(capture_state2.GetAndClearGotCaptureLost());
+ widget1->ReleaseCapture();
+ EXPECT_FALSE(widget1->HasCapture());
+ EXPECT_FALSE(widget2->HasCapture());
+ EXPECT_TRUE(capture_state1_->GetAndClearGotCaptureLost());
+ EXPECT_FALSE(capture_state2_->GetAndClearGotCaptureLost());
}
void InitPlatformWidget(Widget* widget, bool use_desktop_native_widget) {
@@ -1499,9 +1508,25 @@ class WidgetCaptureTest : public DesktopWidgetTestInteractive {
use_desktop_native_widget
? nullptr
: CreatePlatformNativeWidgetImpl(widget, kDefault, nullptr);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget->Init(std::move(params));
}
+
+ protected:
+ void SetUp() override {
+ DesktopWidgetTestInteractive::SetUp();
+ capture_state1_ = std::make_unique<CaptureLostState>();
+ capture_state2_ = std::make_unique<CaptureLostState>();
+ }
+
+ void TearDown() override {
+ capture_state1_.reset();
+ capture_state2_.reset();
+ DesktopWidgetTestInteractive::TearDown();
+ }
+
+ private:
+ std::unique_ptr<CaptureLostState> capture_state1_;
+ std::unique_ptr<CaptureLostState> capture_state2_;
};
// See description in TestCapture().
@@ -1549,6 +1574,7 @@ TEST_F(WidgetCaptureTest, DestroyWithCapture_Close) {
EXPECT_TRUE(capture_state.GetAndClearGotCaptureLost());
}
+// TODO(kylixrd): Remove this test once Widget ownership is normalized.
TEST_F(WidgetCaptureTest, DestroyWithCapture_WidgetOwnsNativeWidget) {
Widget widget;
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
@@ -1562,32 +1588,31 @@ TEST_F(WidgetCaptureTest, DestroyWithCapture_WidgetOwnsNativeWidget) {
// Test that no state is set if capture fails.
TEST_F(WidgetCaptureTest, FailedCaptureRequestIsNoop) {
- Widget widget;
+ UniqueWidgetPtr widget = std::make_unique<Widget>();
Widget::InitParams params =
CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
- params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.bounds = gfx::Rect(400, 400);
- widget.Init(std::move(params));
+ widget->Init(std::move(params));
- MouseView* mouse_view1 = new MouseView;
- MouseView* mouse_view2 = new MouseView;
auto contents_view = std::make_unique<View>();
- contents_view->AddChildView(mouse_view1);
- contents_view->AddChildView(mouse_view2);
- widget.SetContentsView(std::move(contents_view));
+ MouseView* mouse_view1 =
+ contents_view->AddChildView(std::make_unique<MouseView>());
+ MouseView* mouse_view2 =
+ contents_view->AddChildView(std::make_unique<MouseView>());
+ widget->SetContentsView(std::move(contents_view));
mouse_view1->SetBounds(0, 0, 200, 400);
mouse_view2->SetBounds(200, 0, 200, 400);
// Setting capture should fail because |widget| is not visible.
- widget.SetCapture(mouse_view1);
- EXPECT_FALSE(widget.HasCapture());
+ widget->SetCapture(mouse_view1);
+ EXPECT_FALSE(widget->HasCapture());
- widget.Show();
- ui::test::EventGenerator generator(GetRootWindow(&widget),
- widget.GetNativeWindow());
+ widget->Show();
+ ui::test::EventGenerator generator(GetRootWindow(widget.get()),
+ widget->GetNativeWindow());
generator.set_current_screen_location(
- widget.GetClientAreaBoundsInScreen().CenterPoint());
+ widget->GetClientAreaBoundsInScreen().CenterPoint());
generator.PressLeftButton();
EXPECT_FALSE(mouse_view1->pressed());
@@ -1799,37 +1824,33 @@ TEST_F(WidgetCaptureTest, MAYBE_SystemModalWindowReleasesCapture) {
WidgetFocusManager::GetInstance()->AddFocusChangeListener(&focus_listener);
// Create a top level widget.
- Widget top_level_widget;
+ UniqueWidgetPtr top_level_widget = std::make_unique<Widget>();
Widget::InitParams init_params =
CreateParams(Widget::InitParams::TYPE_WINDOW);
init_params.show_state = ui::SHOW_STATE_NORMAL;
gfx::Rect initial_bounds(0, 0, 500, 500);
init_params.bounds = initial_bounds;
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- top_level_widget.Init(std::move(init_params));
- ShowSync(&top_level_widget);
+ top_level_widget->Init(std::move(init_params));
+ ShowSync(top_level_widget.get());
ASSERT_FALSE(focus_listener.focus_changes().empty());
- EXPECT_EQ(top_level_widget.GetNativeView(),
+ EXPECT_EQ(top_level_widget->GetNativeView(),
focus_listener.focus_changes().back());
- EXPECT_FALSE(top_level_widget.HasCapture());
- top_level_widget.SetCapture(nullptr);
- EXPECT_TRUE(top_level_widget.HasCapture());
+ EXPECT_FALSE(top_level_widget->HasCapture());
+ top_level_widget->SetCapture(nullptr);
+ EXPECT_TRUE(top_level_widget->HasCapture());
// Create a modal dialog.
auto dialog_delegate = std::make_unique<DialogDelegateView>();
dialog_delegate->SetModalType(ui::MODAL_TYPE_SYSTEM);
Widget* modal_dialog_widget = views::DialogDelegate::CreateDialogWidget(
- dialog_delegate.release(), nullptr, top_level_widget.GetNativeView());
+ dialog_delegate.release(), nullptr, top_level_widget->GetNativeView());
modal_dialog_widget->SetBounds(gfx::Rect(100, 100, 200, 200));
ShowSync(modal_dialog_widget);
- EXPECT_FALSE(top_level_widget.HasCapture());
-
- modal_dialog_widget->CloseNow();
- top_level_widget.CloseNow();
+ EXPECT_FALSE(top_level_widget->HasCapture());
WidgetFocusManager::GetInstance()->RemoveFocusChangeListener(&focus_listener);
}
@@ -1846,32 +1867,30 @@ TEST_F(WidgetCaptureTest, MAYBE_SystemModalWindowReleasesCapture) {
// mouse events when a different widget grabs capture. Except for Windows,
// which does not send a synthetic mouse exit.
TEST_F(WidgetCaptureTest, MAYBE_MouseExitOnCaptureGrab) {
- Widget widget1;
+ UniqueWidgetPtr widget1 = std::make_unique<Widget>();
Widget::InitParams params1 =
CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
- params1.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- widget1.Init(std::move(params1));
+ widget1->Init(std::move(params1));
MouseView* mouse_view1 =
- widget1.SetContentsView(std::make_unique<MouseView>());
- widget1.Show();
- widget1.SetBounds(gfx::Rect(300, 300));
+ widget1->SetContentsView(std::make_unique<MouseView>());
+ widget1->Show();
+ widget1->SetBounds(gfx::Rect(300, 300));
- Widget widget2;
+ UniqueWidgetPtr widget2 = std::make_unique<Widget>();
Widget::InitParams params2 =
CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
- params2.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- widget2.Init(std::move(params2));
- widget2.Show();
- widget2.SetBounds(gfx::Rect(400, 0, 300, 300));
+ widget2->Init(std::move(params2));
+ widget2->Show();
+ widget2->SetBounds(gfx::Rect(400, 0, 300, 300));
- ui::test::EventGenerator generator(GetRootWindow(&widget1));
+ ui::test::EventGenerator generator(GetRootWindow(widget1.get()));
generator.set_current_screen_location(gfx::Point(100, 100));
generator.MoveMouseBy(0, 0);
EXPECT_EQ(1, mouse_view1->EnteredCalls());
EXPECT_EQ(0, mouse_view1->ExitedCalls());
- widget2.SetCapture(nullptr);
+ widget2->SetCapture(nullptr);
EXPECT_EQ(0, mouse_view1->EnteredCalls());
// On Windows, Chrome doesn't synthesize a separate mouse exited event.
// Instead, it uses ::TrackMouseEvent to get notified of the mouse leaving.
@@ -1916,18 +1935,17 @@ class CaptureOnActivationObserver : public WidgetObserver {
// Test that setting capture on widget activation of a non-toplevel widget
// (e.g. a bubble on Linux) succeeds.
TEST_F(WidgetCaptureTest, SetCaptureToNonToplevel) {
- Widget toplevel;
+ UniqueWidgetPtr toplevel = std::make_unique<Widget>();
Widget::InitParams toplevel_params =
CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
- toplevel_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- toplevel.Init(std::move(toplevel_params));
- toplevel.Show();
+ toplevel->Init(std::move(toplevel_params));
+ toplevel->Show();
- Widget* child = new Widget;
+ UniqueWidgetPtr child = std::make_unique<Widget>();
Widget::InitParams child_params =
CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
- child_params.parent = toplevel.GetNativeView();
- child_params.context = toplevel.GetNativeWindow();
+ child_params.parent = toplevel->GetNativeView();
+ child_params.context = toplevel->GetNativeWindow();
child->Init(std::move(child_params));
CaptureOnActivationObserver observer;
@@ -1983,39 +2001,37 @@ class MouseEventTrackingWidget : public Widget {
// on Windows that it is correctly processed by the widget that doesn't have
// capture. This behavior is not desired on OSes other than Windows.
TEST_F(WidgetCaptureTest, MouseEventDispatchedToRightWindow) {
- MouseEventTrackingWidget widget1;
+ UniqueWidgetPtrT widget1 = std::make_unique<MouseEventTrackingWidget>();
Widget::InitParams params1 =
CreateParams(views::Widget::InitParams::TYPE_WINDOW);
- params1.native_widget = new DesktopNativeWidgetAura(&widget1);
- params1.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- widget1.Init(std::move(params1));
- widget1.Show();
+ params1.native_widget = new DesktopNativeWidgetAura(widget1.get());
+ widget1->Init(std::move(params1));
+ widget1->Show();
- MouseEventTrackingWidget widget2;
+ UniqueWidgetPtrT widget2 = std::make_unique<MouseEventTrackingWidget>();
Widget::InitParams params2 =
CreateParams(views::Widget::InitParams::TYPE_WINDOW);
- params2.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- params2.native_widget = new DesktopNativeWidgetAura(&widget2);
- widget2.Init(std::move(params2));
- widget2.Show();
+ params2.native_widget = new DesktopNativeWidgetAura(widget2.get());
+ widget2->Init(std::move(params2));
+ widget2->Show();
// Set capture to widget2 and verity it gets it.
- widget2.SetCapture(widget2.GetRootView());
- EXPECT_FALSE(widget1.HasCapture());
- EXPECT_TRUE(widget2.HasCapture());
+ widget2->SetCapture(widget2->GetRootView());
+ EXPECT_FALSE(widget1->HasCapture());
+ EXPECT_TRUE(widget2->HasCapture());
- widget1.GetAndClearGotMouseEvent();
- widget2.GetAndClearGotMouseEvent();
+ widget1->GetAndClearGotMouseEvent();
+ widget2->GetAndClearGotMouseEvent();
// Send a mouse event to the RootWindow associated with |widget1|. Even though
// |widget2| has capture, |widget1| should still get the event.
ui::MouseEvent mouse_event(ui::ET_MOUSE_EXITED, gfx::Point(), gfx::Point(),
ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE);
ui::EventDispatchDetails details =
- widget1.GetNativeWindow()->GetHost()->GetEventSink()->OnEventFromSource(
+ widget1->GetNativeWindow()->GetHost()->GetEventSink()->OnEventFromSource(
&mouse_event);
ASSERT_FALSE(details.dispatcher_destroyed);
- EXPECT_TRUE(widget1.GetAndClearGotMouseEvent());
- EXPECT_FALSE(widget2.GetAndClearGotMouseEvent());
+ EXPECT_TRUE(widget1->GetAndClearGotMouseEvent());
+ EXPECT_FALSE(widget2->GetAndClearGotMouseEvent());
}
#endif // BUILDFLAG(IS_WIN)
diff --git a/chromium/ui/views/widget/widget_unittest.cc b/chromium/ui/views/widget/widget_unittest.cc
index 973badf83b7..6875e436ff1 100644
--- a/chromium/ui/views/widget/widget_unittest.cc
+++ b/chromium/ui/views/widget/widget_unittest.cc
@@ -118,6 +118,18 @@ class TestBubbleDialogDelegateView : public BubbleDialogDelegateView {
mutable bool reset_controls_called_;
};
+// Convenience to make constructing a GestureEvent simpler.
+ui::GestureEvent CreateTestGestureEvent(ui::EventType type, int x, int y) {
+ return ui::GestureEvent(x, y, 0, base::TimeTicks(),
+ ui::GestureEventDetails(type));
+}
+
+ui::GestureEvent CreateTestGestureEvent(const ui::GestureEventDetails& details,
+ int x,
+ int y) {
+ return ui::GestureEvent(x, y, 0, base::TimeTicks(), details);
+}
+
} // namespace
// A view that keeps track of the events it receives, and consumes all scroll
@@ -606,12 +618,6 @@ TEST_F(WidgetTest, ChangeActivation) {
// Tests visibility of child widgets.
TEST_F(WidgetTest, Visibility) {
-#if BUILDFLAG(IS_MAC)
- if (base::mac::IsAtLeastOS11()) {
- GTEST_SKIP() << "Window visibility notifications aren't delivered on "
- "macOS 11. See https://crbug.com/1114243.";
- }
-#endif
WidgetAutoclosePtr toplevel(CreateTopLevelPlatformWidget());
gfx::NativeView parent = toplevel->GetNativeView();
Widget* child = CreateChildPlatformWidget(parent);
@@ -1340,12 +1346,6 @@ TEST_F(DesktopWidgetObserverTest, OnWidgetMovedWhenOriginChangesNative) {
// Test correct behavior when widgets close themselves in response to visibility
// changes.
TEST_F(WidgetObserverTest, ClosingOnHiddenParent) {
-#if BUILDFLAG(IS_MAC)
- if (base::mac::IsAtLeastOS11()) {
- GTEST_SKIP() << "Window visibility notifications aren't delivered on "
- "macOS 11. See https://crbug.com/1114243.";
- }
-#endif
WidgetAutoclosePtr parent(NewWidget());
Widget* child = CreateChildPlatformWidget(parent->GetNativeView());
@@ -1730,6 +1730,8 @@ class DesktopAuraPaintWidgetTest : public DesktopWidgetTest {
class ContentsView : public View {
void GetAccessibleNodeData(ui::AXNodeData* node_data) override {
node_data->SetNameExplicitlyEmpty();
+ // Focusable Views need a valid role.
+ node_data->role = ax::mojom::Role::kDialog;
}
};
@@ -1818,16 +1820,14 @@ TEST_F(WidgetTest, GestureScrollEventDispatching) {
widget->GetRootView()->AddChildView(scroll_view);
{
- ui::GestureEvent begin(
- 5, 5, 0, base::TimeTicks(),
- ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN));
+ ui::GestureEvent begin =
+ CreateTestGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 5, 5);
widget->OnGestureEvent(&begin);
- ui::GestureEvent update(
- 25, 15, 0, base::TimeTicks(),
- ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_UPDATE, 20, 10));
+ ui::GestureEvent update = CreateTestGestureEvent(
+ ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_UPDATE, 20, 10), 25, 15);
widget->OnGestureEvent(&update);
- ui::GestureEvent end(25, 15, 0, base::TimeTicks(),
- ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_END));
+ ui::GestureEvent end =
+ CreateTestGestureEvent(ui::ET_GESTURE_SCROLL_END, 25, 15);
widget->OnGestureEvent(&end);
EXPECT_EQ(1, noscroll_view->GetEventCount(ui::ET_GESTURE_SCROLL_BEGIN));
@@ -1836,16 +1836,14 @@ TEST_F(WidgetTest, GestureScrollEventDispatching) {
}
{
- ui::GestureEvent begin(
- 65, 5, 0, base::TimeTicks(),
- ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN));
+ ui::GestureEvent begin =
+ CreateTestGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 65, 5);
widget->OnGestureEvent(&begin);
- ui::GestureEvent update(
- 85, 15, 0, base::TimeTicks(),
- ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_UPDATE, 20, 10));
+ ui::GestureEvent update = CreateTestGestureEvent(
+ ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_UPDATE, 20, 10), 85, 15);
widget->OnGestureEvent(&update);
- ui::GestureEvent end(85, 15, 0, base::TimeTicks(),
- ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_END));
+ ui::GestureEvent end =
+ CreateTestGestureEvent(ui::ET_GESTURE_SCROLL_END, 85, 15);
widget->OnGestureEvent(&end);
EXPECT_EQ(1, scroll_view->GetEventCount(ui::ET_GESTURE_SCROLL_BEGIN));
@@ -1917,16 +1915,15 @@ TEST_F(WidgetTest, EventHandlersOnRootView) {
// Dispatch a ui::ET_GESTURE_TAP_DOWN and a ui::ET_GESTURE_TAP_CANCEL event.
// The events are handled at the target phase and should not reach the
// post-target handler.
- ui::GestureEvent tap_down(5, 5, 0, ui::EventTimeForNow(),
- ui::GestureEventDetails(ui::ET_GESTURE_TAP_DOWN));
+ ui::GestureEvent tap_down =
+ CreateTestGestureEvent(ui::ET_GESTURE_TAP_DOWN, 5, 5);
widget->OnGestureEvent(&tap_down);
EXPECT_EQ(1, h1.GetEventCount(ui::ET_GESTURE_TAP_DOWN));
EXPECT_EQ(1, view->GetEventCount(ui::ET_GESTURE_TAP_DOWN));
EXPECT_EQ(0, h2.GetEventCount(ui::ET_GESTURE_TAP_DOWN));
- ui::GestureEvent tap_cancel(
- 5, 5, 0, ui::EventTimeForNow(),
- ui::GestureEventDetails(ui::ET_GESTURE_TAP_CANCEL));
+ ui::GestureEvent tap_cancel =
+ CreateTestGestureEvent(ui::ET_GESTURE_TAP_CANCEL, 5, 5);
widget->OnGestureEvent(&tap_cancel);
EXPECT_EQ(1, h1.GetEventCount(ui::ET_GESTURE_TAP_CANCEL));
EXPECT_EQ(1, view->GetEventCount(ui::ET_GESTURE_TAP_CANCEL));
@@ -2865,8 +2862,8 @@ TEST_F(WidgetTest, MAYBE_DisableTestRootViewHandlersWhenHidden) {
// Check RootView::gesture_handler_.
widget->Show();
EXPECT_EQ(nullptr, GetGestureHandler(root_view));
- ui::GestureEvent tap_down(15, 15, 0, base::TimeTicks(),
- ui::GestureEventDetails(ui::ET_GESTURE_TAP_DOWN));
+ ui::GestureEvent tap_down =
+ CreateTestGestureEvent(ui::ET_GESTURE_TAP_DOWN, 15, 15);
widget->OnGestureEvent(&tap_down);
EXPECT_EQ(view, GetGestureHandler(root_view));
widget->Hide();
@@ -2875,20 +2872,6 @@ TEST_F(WidgetTest, MAYBE_DisableTestRootViewHandlersWhenHidden) {
widget->Close();
}
-// Convenience to make constructing a GestureEvent simpler.
-class GestureEventForTest : public ui::GestureEvent {
- public:
- GestureEventForTest(ui::EventType type, int x, int y)
- : GestureEvent(x,
- y,
- 0,
- base::TimeTicks(),
- ui::GestureEventDetails(type)) {}
-
- GestureEventForTest(ui::GestureEventDetails details, int x, int y)
- : GestureEvent(x, y, 0, base::TimeTicks(), details) {}
-};
-
// Tests that the |gesture_handler_| member in RootView is always NULL
// after the dispatch of a ui::ET_GESTURE_END event corresponding to
// the release of the final touch point on the screen, but that
@@ -2907,14 +2890,14 @@ TEST_F(WidgetTest, GestureEndEvents) {
// If no gesture handler is set, a ui::ET_GESTURE_END event should not set
// the gesture handler.
EXPECT_EQ(nullptr, GetGestureHandler(root_view));
- GestureEventForTest end(ui::ET_GESTURE_END, 15, 15);
+ ui::GestureEvent end = CreateTestGestureEvent(ui::ET_GESTURE_END, 15, 15);
widget->OnGestureEvent(&end);
EXPECT_EQ(nullptr, GetGestureHandler(root_view));
// Change the handle mode of |view| to indicate that it would like
// to handle all events, then send a GESTURE_TAP to set the gesture handler.
view->set_handle_mode(EventCountView::CONSUME_EVENTS);
- GestureEventForTest tap(ui::ET_GESTURE_TAP, 15, 15);
+ ui::GestureEvent tap = CreateTestGestureEvent(ui::ET_GESTURE_TAP, 15, 15);
widget->OnGestureEvent(&tap);
EXPECT_TRUE(tap.handled());
EXPECT_EQ(view, GetGestureHandler(root_view));
@@ -2924,11 +2907,12 @@ TEST_F(WidgetTest, GestureEndEvents) {
// ui::ET_GESTURE_END corresponding to the final touch point.
ui::GestureEventDetails details(ui::ET_GESTURE_END);
details.set_touch_points(2);
- GestureEventForTest end_second_touch_point(details, 15, 15);
+ ui::GestureEvent end_second_touch_point =
+ CreateTestGestureEvent(details, 15, 15);
widget->OnGestureEvent(&end_second_touch_point);
EXPECT_EQ(view, GetGestureHandler(root_view));
- end = GestureEventForTest(ui::ET_GESTURE_END, 15, 15);
+ end = CreateTestGestureEvent(ui::ET_GESTURE_END, 15, 15);
widget->OnGestureEvent(&end);
EXPECT_TRUE(end.handled());
EXPECT_EQ(nullptr, GetGestureHandler(root_view));
@@ -2936,7 +2920,7 @@ TEST_F(WidgetTest, GestureEndEvents) {
// Send a GESTURE_TAP to set the gesture handler, then change the handle
// mode of |view| to indicate that it does not want to handle any
// further events.
- tap = GestureEventForTest(ui::ET_GESTURE_TAP, 15, 15);
+ tap = CreateTestGestureEvent(ui::ET_GESTURE_TAP, 15, 15);
widget->OnGestureEvent(&tap);
EXPECT_TRUE(tap.handled());
EXPECT_EQ(view, GetGestureHandler(root_view));
@@ -2945,11 +2929,11 @@ TEST_F(WidgetTest, GestureEndEvents) {
// The gesture handler should remain unchanged on a ui::ET_GESTURE_END
// corresponding to a second touch point, but should be reset to NULL by a
// ui::ET_GESTURE_END corresponding to the final touch point.
- end_second_touch_point = GestureEventForTest(details, 15, 15);
+ end_second_touch_point = CreateTestGestureEvent(details, 15, 15);
widget->OnGestureEvent(&end_second_touch_point);
EXPECT_EQ(view, GetGestureHandler(root_view));
- end = GestureEventForTest(ui::ET_GESTURE_END, 15, 15);
+ end = CreateTestGestureEvent(ui::ET_GESTURE_END, 15, 15);
widget->OnGestureEvent(&end);
EXPECT_FALSE(end.handled());
EXPECT_EQ(nullptr, GetGestureHandler(root_view));
@@ -2989,7 +2973,7 @@ TEST_F(WidgetTest, GestureEventsNotProcessed) {
// ui::ET_GESTURE_BEGIN events should never be seen by any view, but
// they should be marked as handled by OnEventProcessingStarted().
- GestureEventForTest begin(ui::ET_GESTURE_BEGIN, 5, 5);
+ ui::GestureEvent begin = CreateTestGestureEvent(ui::ET_GESTURE_BEGIN, 5, 5);
widget->OnGestureEvent(&begin);
EXPECT_EQ(0, v1->GetEventCount(ui::ET_GESTURE_BEGIN));
EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_BEGIN));
@@ -3005,7 +2989,7 @@ TEST_F(WidgetTest, GestureEventsNotProcessed) {
// ui::ET_GESTURE_END events should not be seen by any view when there is
// no default gesture handler set, but they should be marked as handled by
// OnEventProcessingStarted().
- GestureEventForTest end(ui::ET_GESTURE_END, 5, 5);
+ ui::GestureEvent end = CreateTestGestureEvent(ui::ET_GESTURE_END, 5, 5);
widget->OnGestureEvent(&end);
EXPECT_EQ(0, v1->GetEventCount(ui::ET_GESTURE_END));
EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_END));
@@ -3023,7 +3007,8 @@ TEST_F(WidgetTest, GestureEventsNotProcessed) {
// be marked as handled by OnEventProcessingStarted().
ui::GestureEventDetails details(ui::ET_GESTURE_END);
details.set_touch_points(2);
- GestureEventForTest end_second_touch_point(details, 5, 5);
+ ui::GestureEvent end_second_touch_point =
+ CreateTestGestureEvent(details, 5, 5);
widget->OnGestureEvent(&end_second_touch_point);
EXPECT_EQ(0, v1->GetEventCount(ui::ET_GESTURE_END));
EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_END));
@@ -3039,7 +3024,8 @@ TEST_F(WidgetTest, GestureEventsNotProcessed) {
// ui::ET_GESTURE_SCROLL_UPDATE events should never be seen by any view when
// there is no default gesture handler set, but they should be marked as
// handled by OnEventProcessingStarted().
- GestureEventForTest scroll_update(ui::ET_GESTURE_SCROLL_UPDATE, 5, 5);
+ ui::GestureEvent scroll_update =
+ CreateTestGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 5, 5);
widget->OnGestureEvent(&scroll_update);
EXPECT_EQ(0, v1->GetEventCount(ui::ET_GESTURE_SCROLL_UPDATE));
EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_SCROLL_UPDATE));
@@ -3055,7 +3041,8 @@ TEST_F(WidgetTest, GestureEventsNotProcessed) {
// ui::ET_GESTURE_SCROLL_END events should never be seen by any view when
// there is no default gesture handler set, but they should be marked as
// handled by OnEventProcessingStarted().
- GestureEventForTest scroll_end(ui::ET_GESTURE_SCROLL_END, 5, 5);
+ ui::GestureEvent scroll_end =
+ CreateTestGestureEvent(ui::ET_GESTURE_SCROLL_END, 5, 5);
widget->OnGestureEvent(&scroll_end);
EXPECT_EQ(0, v1->GetEventCount(ui::ET_GESTURE_SCROLL_END));
EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_SCROLL_END));
@@ -3071,7 +3058,8 @@ TEST_F(WidgetTest, GestureEventsNotProcessed) {
// ui::ET_SCROLL_FLING_START events should never be seen by any view when
// there is no default gesture handler set, but they should be marked as
// handled by OnEventProcessingStarted().
- GestureEventForTest scroll_fling_start(ui::ET_SCROLL_FLING_START, 5, 5);
+ ui::GestureEvent scroll_fling_start =
+ CreateTestGestureEvent(ui::ET_SCROLL_FLING_START, 5, 5);
widget->OnGestureEvent(&scroll_fling_start);
EXPECT_EQ(0, v1->GetEventCount(ui::ET_SCROLL_FLING_START));
EXPECT_EQ(0, v2->GetEventCount(ui::ET_SCROLL_FLING_START));
@@ -3121,7 +3109,7 @@ TEST_F(WidgetTest, GestureEventDispatch) {
// view hierarchy handle a ui::ET_GESTURE_TAP event. In this case the tap
// event should be dispatched to all views in the hierarchy, the gesture
// handler should remain unset, and the event should remain unhandled.
- GestureEventForTest tap(ui::ET_GESTURE_TAP, 5, 5);
+ ui::GestureEvent tap = CreateTestGestureEvent(ui::ET_GESTURE_TAP, 5, 5);
EXPECT_EQ(nullptr, GetGestureHandler(root_view));
widget->OnGestureEvent(&tap);
EXPECT_EQ(1, v1->GetEventCount(ui::ET_GESTURE_TAP));
@@ -3142,7 +3130,7 @@ TEST_F(WidgetTest, GestureEventDispatch) {
v1->set_handle_mode(EventCountView::CONSUME_EVENTS);
v2->set_handle_mode(EventCountView::CONSUME_EVENTS);
v3->set_handle_mode(EventCountView::CONSUME_EVENTS);
- tap = GestureEventForTest(ui::ET_GESTURE_TAP, 5, 5);
+ tap = CreateTestGestureEvent(ui::ET_GESTURE_TAP, 5, 5);
widget->OnGestureEvent(&tap);
EXPECT_EQ(0, v1->GetEventCount(ui::ET_GESTURE_TAP));
EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_TAP));
@@ -3159,12 +3147,13 @@ TEST_F(WidgetTest, GestureEventDispatch) {
v3->ResetCounts();
v4->ResetCounts();
v4->set_handle_mode(EventCountView::CONSUME_EVENTS);
- tap = GestureEventForTest(ui::ET_GESTURE_TAP, 5, 5);
+ tap = CreateTestGestureEvent(ui::ET_GESTURE_TAP, 5, 5);
widget->OnGestureEvent(&tap);
EXPECT_TRUE(tap.handled());
- GestureEventForTest show_press(ui::ET_GESTURE_SHOW_PRESS, 5, 5);
+ ui::GestureEvent show_press =
+ CreateTestGestureEvent(ui::ET_GESTURE_SHOW_PRESS, 5, 5);
widget->OnGestureEvent(&show_press);
- tap = GestureEventForTest(ui::ET_GESTURE_TAP, 5, 5);
+ tap = CreateTestGestureEvent(ui::ET_GESTURE_TAP, 5, 5);
widget->OnGestureEvent(&tap);
EXPECT_EQ(0, v1->GetEventCount(ui::ET_GESTURE_TAP));
EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_TAP));
@@ -3187,7 +3176,7 @@ TEST_F(WidgetTest, GestureEventDispatch) {
v3->ResetCounts();
v4->ResetCounts();
v3->set_handle_mode(EventCountView::PROPAGATE_EVENTS);
- tap = GestureEventForTest(ui::ET_GESTURE_TAP, 5, 5);
+ tap = CreateTestGestureEvent(ui::ET_GESTURE_TAP, 5, 5);
widget->OnGestureEvent(&tap);
EXPECT_EQ(0, v1->GetEventCount(ui::ET_GESTURE_TAP));
EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_TAP));
@@ -3237,7 +3226,8 @@ TEST_F(WidgetTest, ScrollGestureEventDispatch) {
// should bubble up the views hierarchy until it reaches the first view
// that will handle it (|v3|) and then sets the handler to |v3|.
EXPECT_EQ(nullptr, GetGestureHandler(root_view));
- GestureEventForTest tap_down(ui::ET_GESTURE_TAP_DOWN, 5, 5);
+ ui::GestureEvent tap_down =
+ CreateTestGestureEvent(ui::ET_GESTURE_TAP_DOWN, 5, 5);
widget->OnGestureEvent(&tap_down);
EXPECT_EQ(0, v1->GetEventCount(ui::ET_GESTURE_TAP_DOWN));
EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_TAP_DOWN));
@@ -3251,7 +3241,8 @@ TEST_F(WidgetTest, ScrollGestureEventDispatch) {
v4->ResetCounts();
// A ui::ET_GESTURE_TAP_CANCEL event should be dispatched to |v3| directly.
- GestureEventForTest tap_cancel(ui::ET_GESTURE_TAP_CANCEL, 5, 5);
+ ui::GestureEvent tap_cancel =
+ CreateTestGestureEvent(ui::ET_GESTURE_TAP_CANCEL, 5, 5);
widget->OnGestureEvent(&tap_cancel);
EXPECT_EQ(0, v1->GetEventCount(ui::ET_GESTURE_TAP_CANCEL));
EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_TAP_CANCEL));
@@ -3274,7 +3265,8 @@ TEST_F(WidgetTest, ScrollGestureEventDispatch) {
// handler (|v3|) does not handle scroll events, the event should bubble up
// the views hierarchy until it reaches the first view that will handle
// it (|v1|) and then sets the handler to |v1|.
- GestureEventForTest scroll_begin(ui::ET_GESTURE_SCROLL_BEGIN, 5, 5);
+ ui::GestureEvent scroll_begin =
+ CreateTestGestureEvent(ui::ET_GESTURE_SCROLL_BEGIN, 5, 5);
widget->OnGestureEvent(&scroll_begin);
EXPECT_EQ(1, v1->GetEventCount(ui::ET_GESTURE_SCROLL_BEGIN));
EXPECT_EQ(1, v2->GetEventCount(ui::ET_GESTURE_SCROLL_BEGIN));
@@ -3289,7 +3281,8 @@ TEST_F(WidgetTest, ScrollGestureEventDispatch) {
// A ui::ET_GESTURE_SCROLL_UPDATE event should be dispatched to |v1|
// directly.
- GestureEventForTest scroll_update(ui::ET_GESTURE_SCROLL_UPDATE, 5, 5);
+ ui::GestureEvent scroll_update =
+ CreateTestGestureEvent(ui::ET_GESTURE_SCROLL_UPDATE, 5, 5);
widget->OnGestureEvent(&scroll_update);
EXPECT_EQ(1, v1->GetEventCount(ui::ET_GESTURE_SCROLL_UPDATE));
EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_SCROLL_UPDATE));
@@ -3304,7 +3297,8 @@ TEST_F(WidgetTest, ScrollGestureEventDispatch) {
// A ui::ET_GESTURE_SCROLL_END event should be dispatched to |v1|
// directly and should not reset the gesture handler.
- GestureEventForTest scroll_end(ui::ET_GESTURE_SCROLL_END, 5, 5);
+ ui::GestureEvent scroll_end =
+ CreateTestGestureEvent(ui::ET_GESTURE_SCROLL_END, 5, 5);
widget->OnGestureEvent(&scroll_end);
EXPECT_EQ(1, v1->GetEventCount(ui::ET_GESTURE_SCROLL_END));
EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_SCROLL_END));
@@ -3319,7 +3313,8 @@ TEST_F(WidgetTest, ScrollGestureEventDispatch) {
// A ui::ET_GESTURE_PINCH_BEGIN event (which is a non-scroll event) should
// still be dispatched to |v1| directly.
- GestureEventForTest pinch_begin(ui::ET_GESTURE_PINCH_BEGIN, 5, 5);
+ ui::GestureEvent pinch_begin =
+ CreateTestGestureEvent(ui::ET_GESTURE_PINCH_BEGIN, 5, 5);
widget->OnGestureEvent(&pinch_begin);
EXPECT_EQ(1, v1->GetEventCount(ui::ET_GESTURE_PINCH_BEGIN));
EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_PINCH_BEGIN));
@@ -3334,7 +3329,7 @@ TEST_F(WidgetTest, ScrollGestureEventDispatch) {
// A ui::ET_GESTURE_END event should be dispatched to |v1| and should
// set the gesture handler to NULL.
- GestureEventForTest end(ui::ET_GESTURE_END, 5, 5);
+ ui::GestureEvent end = CreateTestGestureEvent(ui::ET_GESTURE_END, 5, 5);
widget->OnGestureEvent(&end);
EXPECT_EQ(1, v1->GetEventCount(ui::ET_GESTURE_END));
EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_END));
@@ -3406,8 +3401,8 @@ TEST_F(WidgetTest, GestureEventLocationWhileBubbling) {
// Define a GESTURE_TAP event located at (125, 105) in root view coordinates.
// This event is contained within all of |v1|, |v2|, and |v3|.
gfx::Point location_in_root(125, 105);
- GestureEventForTest tap(ui::ET_GESTURE_TAP, location_in_root.x(),
- location_in_root.y());
+ ui::GestureEvent tap = CreateTestGestureEvent(
+ ui::ET_GESTURE_TAP, location_in_root.x(), location_in_root.y());
// Calculate the location of the event in the local coordinate spaces
// of each of the views.
diff --git a/chromium/ui/views/widget/widget_utils_mac.h b/chromium/ui/views/widget/widget_utils_mac.h
index 8a3d31a2218..bf72f1fbbe1 100644
--- a/chromium/ui/views/widget/widget_utils_mac.h
+++ b/chromium/ui/views/widget/widget_utils_mac.h
@@ -5,12 +5,15 @@
#ifndef UI_VIEWS_WIDGET_WIDGET_UTILS_MAC_H_
#define UI_VIEWS_WIDGET_WIDGET_UTILS_MAC_H_
+#include "ui/views/views_export.h"
#include "ui/views/widget/widget.h"
namespace views {
gfx::Size GetWindowSizeForClientSize(Widget* widget, const gfx::Size& size);
+VIEWS_EXPORT bool IsNSToolbarFullScreenWindow(NSWindow* window);
+
} // namespace views
#endif // UI_VIEWS_WIDGET_WIDGET_UTILS_MAC_H_
diff --git a/chromium/ui/views/widget/widget_utils_mac.mm b/chromium/ui/views/widget/widget_utils_mac.mm
index 6a3b1dce6ef..5725676f194 100644
--- a/chromium/ui/views/widget/widget_utils_mac.mm
+++ b/chromium/ui/views/widget/widget_utils_mac.mm
@@ -14,4 +14,11 @@ gfx::Size GetWindowSizeForClientSize(Widget* widget, const gfx::Size& size) {
widget->GetNativeWindow().GetNativeNSWindow(), size);
}
+bool IsNSToolbarFullScreenWindow(NSWindow* window) {
+ // TODO(bur): Investigate other approaches to detecting
+ // NSToolbarFullScreenWindow. This is a private class and the name could
+ // change.
+ return [window isKindOfClass:NSClassFromString(@"NSToolbarFullScreenWindow")];
+}
+
} // namespace views
diff --git a/chromium/ui/views/widget/window_reorderer.h b/chromium/ui/views/widget/window_reorderer.h
index 2c7f23481b3..d0d2d889d87 100644
--- a/chromium/ui/views/widget/window_reorderer.h
+++ b/chromium/ui/views/widget/window_reorderer.h
@@ -49,7 +49,7 @@ class WindowReorderer : public aura::WindowObserver {
// The window and the root view of the native widget which owns the
// WindowReorderer.
raw_ptr<aura::Window> parent_window_;
- raw_ptr<View> root_view_;
+ raw_ptr<View, DanglingUntriaged> root_view_;
// Reorders windows as a result of the kHostViewKey being set on a child of
// |parent_window_|.
diff --git a/chromium/ui/views/widget/window_reorderer_unittest.cc b/chromium/ui/views/widget/window_reorderer_unittest.cc
index 4fabc4c1aa0..d06110e2f06 100644
--- a/chromium/ui/views/widget/window_reorderer_unittest.cc
+++ b/chromium/ui/views/widget/window_reorderer_unittest.cc
@@ -97,24 +97,24 @@ TEST_F(WindowReordererTest, Basic) {
// 2) Test the z-order of the windows and layers as a result of reordering the
// views.
- contents_view->ReorderChildView(host_view1, -1);
+ contents_view->ReorderChildView(host_view1, contents_view->children().size());
EXPECT_EQ("w2 w1", ChildWindowNamesAsString(*parent_window));
EXPECT_EQ("v w2 w1",
ui::test::ChildLayerNamesAsString(*parent_window->layer()));
- contents_view->ReorderChildView(host_view2, -1);
+ contents_view->ReorderChildView(host_view2, contents_view->children().size());
EXPECT_EQ("w1 w2", ChildWindowNamesAsString(*parent_window));
EXPECT_EQ("v w1 w2",
ui::test::ChildLayerNamesAsString(*parent_window->layer()));
// 3) Test the z-order of the windows and layers as a result of reordering the
// views in situations where the window order remains unchanged.
- contents_view->ReorderChildView(v, -1);
+ contents_view->ReorderChildView(v, contents_view->children().size());
EXPECT_EQ("w1 w2", ChildWindowNamesAsString(*parent_window));
EXPECT_EQ("w1 w2 v",
ui::test::ChildLayerNamesAsString(*parent_window->layer()));
- contents_view->ReorderChildView(host_view2, -1);
+ contents_view->ReorderChildView(host_view2, contents_view->children().size());
EXPECT_EQ("w1 w2", ChildWindowNamesAsString(*parent_window));
EXPECT_EQ("w1 v w2",
ui::test::ChildLayerNamesAsString(*parent_window->layer()));
diff --git a/chromium/ui/views/win/hwnd_message_handler.cc b/chromium/ui/views/win/hwnd_message_handler.cc
index 2d21f2e4080..29e812d41d5 100644
--- a/chromium/ui/views/win/hwnd_message_handler.cc
+++ b/chromium/ui/views/win/hwnd_message_handler.cc
@@ -26,6 +26,7 @@
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
#include "base/trace_event/trace_event.h"
+#include "base/win/dark_mode_support.h"
#include "base/win/scoped_gdi_object.h"
#include "base/win/win_util.h"
#include "base/win/windows_version.h"
@@ -191,7 +192,7 @@ LRESULT CALLBACK MoveLoopMouseWatcher::KeyHook(int n_code,
BOOL CALLBACK EnumChildWindowsForRedraw(HWND hwnd, LPARAM lparam) {
DWORD process_id;
GetWindowThreadProcessId(hwnd, &process_id);
- int flags = RDW_INVALIDATE | RDW_NOCHILDREN | RDW_FRAME;
+ UINT flags = RDW_INVALIDATE | RDW_NOCHILDREN | RDW_FRAME;
if (process_id == GetCurrentProcessId())
flags |= RDW_UPDATENOW;
RedrawWindow(hwnd, nullptr, nullptr, flags);
@@ -671,7 +672,7 @@ void HWNDMessageHandler::Show(ui::WindowShowState show_state,
return;
}
- DWORD native_show_state;
+ int native_show_state;
if (show_state == ui::SHOW_STATE_MAXIMIZED &&
!pixel_restore_bounds.IsEmpty()) {
WINDOWPLACEMENT placement = {0};
@@ -861,7 +862,8 @@ bool HWNDMessageHandler::RunMoveLoop(const gfx::Vector2d& drag_offset,
// tasks while in windows move loop.
base::CurrentThread::ScopedNestableTaskAllower allow_nested;
- SendMessage(hwnd(), WM_SYSCOMMAND, SC_MOVE | 0x0002, GetMessagePos());
+ SendMessage(hwnd(), WM_SYSCOMMAND, SC_MOVE | 0x0002,
+ static_cast<LPARAM>(GetMessagePos()));
// Windows doesn't appear to offer a way to determine whether the user
// canceled the move or not. We assume if the user released the mouse it was
// successful.
@@ -919,7 +921,7 @@ void HWNDMessageHandler::SetVisibilityChangedAnimationsEnabled(bool enabled) {
bool HWNDMessageHandler::SetTitle(const std::u16string& title) {
std::wstring current_title;
- size_t len_with_null = GetWindowTextLength(hwnd()) + 1;
+ auto len_with_null = static_cast<size_t>(GetWindowTextLength(hwnd())) + 1;
if (len_with_null == 1 && title.length() == 0)
return false;
if (len_with_null - 1 == title.length() &&
@@ -1015,7 +1017,7 @@ void HWNDMessageHandler::SetAspectRatio(float aspect_ratio) {
void HWNDMessageHandler::SizeConstraintsChanged() {
LONG style = GetWindowLong(hwnd(), GWL_STYLE);
// Ignore if this is not a standard window.
- if (style & (WS_POPUP | WS_CHILD))
+ if (style & static_cast<LONG>(WS_POPUP | WS_CHILD))
return;
// Windows cannot have WS_THICKFRAME set if translucent.
@@ -1463,7 +1465,7 @@ void HWNDMessageHandler::RestoreEnabledIfNecessary() {
void HWNDMessageHandler::ExecuteSystemMenuCommand(int command) {
if (command)
- SendMessage(hwnd(), WM_SYSCOMMAND, command, 0);
+ SendMessage(hwnd(), WM_SYSCOMMAND, static_cast<WPARAM>(command), 0);
}
void HWNDMessageHandler::TrackMouseEvents(DWORD mouse_tracking_flags) {
@@ -1706,6 +1708,8 @@ LRESULT HWNDMessageHandler::OnCreate(CREATESTRUCT* create_struct) {
fullscreen_handler_->set_hwnd(hwnd());
+ base::win::AllowDarkModeForWindow(hwnd(), true);
+
// This message initializes the window so that focus border are shown for
// windows.
SendMessage(hwnd(), WM_CHANGEUISTATE, MAKELPARAM(UIS_CLEAR, UISF_HIDEFOCUS),
@@ -2746,7 +2750,7 @@ void HWNDMessageHandler::OnSysCommand(UINT notification_code,
return;
}
- if (delegate_->HandleCommand(notification_code))
+ if (delegate_->HandleCommand(static_cast<int>(notification_code)))
return;
bool is_mouse_menu = (notification_code & sc_mask) == SC_MOUSEMENU;
@@ -2786,7 +2790,7 @@ LRESULT HWNDMessageHandler::OnTouchEvent(UINT message,
}
// Handle touch events only on Aura for now.
- size_t num_points = LOWORD(w_param);
+ WORD num_points = LOWORD(w_param);
std::unique_ptr<TOUCHINPUT[]> input(new TOUCHINPUT[num_points]);
if (ui::GetTouchInputInfoWrapper(reinterpret_cast<HTOUCHINPUT>(l_param),
num_points, input.get(),
@@ -2819,7 +2823,8 @@ LRESULT HWNDMessageHandler::OnTouchEvent(UINT message,
last_touch_or_pen_message_time_ = ::GetMessageTime();
gfx::Point touch_point(point.x, point.y);
- size_t touch_id = id_generator_.GetGeneratedID(input[i].dwID);
+ auto touch_id = static_cast<ui::PointerId>(
+ id_generator_.GetGeneratedID(input[i].dwID));
if (input[i].dwFlags & TOUCHEVENTF_DOWN) {
touch_ids_.insert(input[i].dwID);
@@ -2857,7 +2862,8 @@ LRESULT HWNDMessageHandler::OnTouchEvent(UINT message,
// Log that we've hit this code. When usage drops off, we can remove
// this "workaround". See https://crbug.com/811273
UMA_HISTOGRAM_BOOLEAN("TouchScreen.MissedTOUCHEVENTF_UP", true);
- size_t touch_id = id_generator_.GetGeneratedID(touch_number);
+ auto touch_id = static_cast<ui::PointerId>(
+ id_generator_.GetGeneratedID(touch_number));
touch_ids_.erase(touch_number);
GenerateTouchEvent(ui::ET_TOUCH_RELEASED, gfx::Point(0, 0), touch_id,
event_time, &touch_events);
@@ -2888,7 +2894,8 @@ void HWNDMessageHandler::OnWindowPosChanging(WINDOWPOS* window_pos) {
(window_pos->flags & (SWP_NOZORDER | SWP_NOACTIVATE))) {
// Just sizing/moving the window; ignore.
window_pos->flags |= SWP_NOSIZE | SWP_NOMOVE | SWP_NOREDRAW;
- window_pos->flags &= ~(SWP_SHOWWINDOW | SWP_HIDEWINDOW);
+ window_pos->flags &=
+ static_cast<unsigned int>(~(SWP_SHOWWINDOW | SWP_HIDEWINDOW));
}
} else if (!GetParent(hwnd())) {
RECT window_rect;
@@ -2971,7 +2978,8 @@ void HWNDMessageHandler::OnWindowPosChanging(WINDOWPOS* window_pos) {
window_pos->cy = new_window_rect.height();
// WARNING! Don't set SWP_FRAMECHANGED here, it breaks moving the child
// HWNDs for some reason.
- window_pos->flags &= ~(SWP_NOSIZE | SWP_NOMOVE | SWP_NOREDRAW);
+ window_pos->flags &= static_cast<unsigned int>(
+ ~(SWP_NOSIZE | SWP_NOMOVE | SWP_NOREDRAW));
window_pos->flags |= SWP_NOCOPYBITS;
// Now ignore all immediately-following SetWindowPos() changes. Windows
@@ -3020,7 +3028,7 @@ void HWNDMessageHandler::OnWindowPosChanging(WINDOWPOS* window_pos) {
if (ScopedFullscreenVisibility::IsHiddenForFullscreen(hwnd())) {
// Prevent the window from being made visible if we've been asked to do so.
// See comment in header as to why we might want this.
- window_pos->flags &= ~SWP_SHOWWINDOW;
+ window_pos->flags &= static_cast<unsigned int>(~SWP_SHOWWINDOW);
}
if (window_pos->flags & SWP_HIDEWINDOW)
@@ -3150,8 +3158,8 @@ LRESULT HWNDMessageHandler::HandleMouseEventInternal(UINT message,
// expect screen coordinates.
POINT screen_point = CR_POINT_INITIALIZER_FROM_LPARAM(l_param);
MapWindowPoints(hwnd(), HWND_DESKTOP, &screen_point, 1);
- w_param = SendMessage(hwnd(), WM_NCHITTEST, 0,
- MAKELPARAM(screen_point.x, screen_point.y));
+ w_param = static_cast<WPARAM>(SendMessage(
+ hwnd(), WM_NCHITTEST, 0, MAKELPARAM(screen_point.x, screen_point.y)));
if (w_param == HTCAPTION || w_param == HTSYSMENU) {
ShowSystemMenuAtScreenPixelLocation(hwnd(), gfx::Point(screen_point));
return 0;
@@ -3231,6 +3239,39 @@ LRESULT HWNDMessageHandler::HandleMouseEventInternal(UINT message,
base::WeakPtr<HWNDMessageHandler> ref(msg_handler_weak_factory_.GetWeakPtr());
bool handled = false;
+ if (event.type() == ui::ET_MOUSE_DRAGGED) {
+ constexpr int kMaxDragEventsToIgnore00Move = 6;
+ POINT point;
+ point.x = event.x();
+ point.y = event.y();
+ ::ClientToScreen(hwnd(), &point);
+ num_drag_events_after_press_++;
+ // Windows sometimes sends spurious WM_MOUSEMOVEs at 0,0. If this happens
+ // after a mouse down on a tab, it can cause a detach of the tab to 0,0.
+ // A past study indicated that most of the spurious moves are among the
+ // first 6 moves after a press, and there's a very long tail.
+ // If we get kMaxDragEventsToIgnore00Move mouse move events before the
+ // spurious 0,0 move event, the user is probably really dragging, and we
+ // want to allow moves to 0,0.
+ if (point.x == 0 && point.y == 0 &&
+ num_drag_events_after_press_ <= kMaxDragEventsToIgnore00Move) {
+ POINT cursor_pos;
+ ::GetCursorPos(&cursor_pos);
+
+ // This constant tries to balance between detecting valid moves to 0,0
+ // and avoiding the detach bug happening to tabs near 0,0.
+ constexpr int kMinSpuriousDistance = 30;
+ auto distance = sqrt(pow(static_cast<float>(abs(cursor_pos.x)), 2) +
+ pow(static_cast<float>(abs(cursor_pos.y)), 2));
+ if (distance > kMinSpuriousDistance) {
+ SetMsgHandled(true);
+ return 0;
+ }
+ }
+ } else if (event.type() == ui::ET_MOUSE_PRESSED) {
+ num_drag_events_after_press_ = 0;
+ }
+
// Don't send right mouse button up to the delegate when displaying system
// command menu. This prevents left clicking in the upper left hand corner of
// an app window and then right clicking from sending the right click to the
@@ -3315,7 +3356,8 @@ LRESULT HWNDMessageHandler::HandlePointerEventTypeTouchOrNonClient(
gfx::Point touch_point = gfx::Point(client_point.x, client_point.y);
ui::EventType event_type = GetTouchEventType(pointer_flags);
const base::TimeTicks event_time = ui::EventTimeForNow();
- size_t mapped_pointer_id = id_generator_.GetGeneratedID(pointer_id);
+ auto mapped_pointer_id =
+ static_cast<ui::PointerId>(id_generator_.GetGeneratedID(pointer_id));
// The pressure from POINTER_TOUCH_INFO is normalized to a range between 0
// and 1024, but we define the pressure of the range of [0,1].
@@ -3326,7 +3368,7 @@ LRESULT HWNDMessageHandler::HandlePointerEventTypeTouchOrNonClient(
float radius_y =
(pointer_touch_info.rcContact.bottom - pointer_touch_info.rcContact.top) /
2.0;
- int rotation_angle = pointer_touch_info.orientation;
+ auto rotation_angle = static_cast<int>(pointer_touch_info.orientation);
rotation_angle %= 180;
if (rotation_angle < 0)
rotation_angle += 180;
@@ -3487,7 +3529,7 @@ void HWNDMessageHandler::UpdateDwmFrame() {
void HWNDMessageHandler::GenerateTouchEvent(ui::EventType event_type,
const gfx::Point& point,
- size_t id,
+ ui::PointerId id,
base::TimeTicks time_stamp,
TouchEvents* touch_events) {
ui::TouchEvent event(event_type, point, time_stamp,
@@ -3649,8 +3691,13 @@ void HWNDMessageHandler::SizeWindowToAspectRatio(UINT param,
delegate_->GetMinMaxSize(&min_window_size, &max_window_size);
min_window_size = delegate_->DIPToScreenSize(min_window_size);
max_window_size = delegate_->DIPToScreenSize(max_window_size);
+
+ absl::optional<gfx::Size> max_size_param;
+ if (!max_window_size.IsEmpty())
+ max_size_param = max_window_size;
+
gfx::SizeRectToAspectRatio(GetWindowResizeEdge(param), aspect_ratio_.value(),
- min_window_size, max_window_size, window_rect);
+ min_window_size, max_size_param, window_rect);
}
POINT HWNDMessageHandler::GetCursorPos() const {
diff --git a/chromium/ui/views/win/hwnd_message_handler.h b/chromium/ui/views/win/hwnd_message_handler.h
index 73337f6b145..cdc283b7e1a 100644
--- a/chromium/ui/views/win/hwnd_message_handler.h
+++ b/chromium/ui/views/win/hwnd_message_handler.h
@@ -579,7 +579,7 @@ class VIEWS_EXPORT HWNDMessageHandler : public gfx::WindowImpl,
// |time_stamp| is the time stamp associated with the message.
void GenerateTouchEvent(ui::EventType event_type,
const gfx::Point& point,
- size_t id,
+ ui::PointerId id,
base::TimeTicks time_stamp,
TouchEvents* touch_events);
@@ -812,6 +812,13 @@ class VIEWS_EXPORT HWNDMessageHandler : public gfx::WindowImpl,
// call HandleWindowMinimizedOrRestored() when we get a WM_ACTIVATE message.
bool notify_restore_on_activate_ = false;
+ // Counts the number of drag events received after a drag started event.
+ // This will be used to ignore a drag event to 0, 0, if it is one of the
+ // first few drag events after a drag started event. We randomly receive
+ // bogus 0, 0 drag events after the start of a drag. See
+ // https://crbug.com/1270828.
+ int num_drag_events_after_press_ = 0;
+
// This tracks headless window visibility, fullscreen and min/max states. In
// headless mode the platform window is never made visible or change its
// state, so this structure holds the requested state for reporting.
diff --git a/chromium/ui/views/win/hwnd_util_aurawin.cc b/chromium/ui/views/win/hwnd_util_aurawin.cc
index e01c37d622d..f235774ded9 100644
--- a/chromium/ui/views/win/hwnd_util_aurawin.cc
+++ b/chromium/ui/views/win/hwnd_util_aurawin.cc
@@ -40,8 +40,8 @@ gfx::Rect GetWindowBoundsForClientBounds(View* view,
if (host) {
HWND hwnd = host->GetAcceleratedWidget();
RECT rect = client_bounds.ToRECT();
- DWORD style = ::GetWindowLong(hwnd, GWL_STYLE);
- DWORD ex_style = ::GetWindowLong(hwnd, GWL_EXSTYLE);
+ auto style = static_cast<DWORD>(::GetWindowLong(hwnd, GWL_STYLE));
+ auto ex_style = static_cast<DWORD>(::GetWindowLong(hwnd, GWL_EXSTYLE));
::AdjustWindowRectEx(&rect, style, FALSE, ex_style);
return gfx::Rect(rect);
}
@@ -60,7 +60,7 @@ void ShowSystemMenuAtScreenPixelLocation(HWND window, const gfx::Point& point) {
::TrackPopupMenu(menu, flags, point.x(), point.y(), 0, window, nullptr);
if (command)
- ::SendMessage(window, WM_SYSCOMMAND, command, 0);
+ ::SendMessage(window, WM_SYSCOMMAND, static_cast<WPARAM>(command), 0);
}
} // namespace views
diff --git a/chromium/ui/views/win/pen_event_processor.cc b/chromium/ui/views/win/pen_event_processor.cc
index 0970a037c69..2361c5f7df3 100644
--- a/chromium/ui/views/win/pen_event_processor.cc
+++ b/chromium/ui/views/win/pen_event_processor.cc
@@ -37,7 +37,8 @@ std::unique_ptr<ui::Event> PenEventProcessor::GenerateEvent(
UINT32 pointer_id,
const POINTER_PEN_INFO& pointer_pen_info,
const gfx::Point& point) {
- unsigned int mapped_pointer_id = id_generator_->GetGeneratedID(pointer_id);
+ auto mapped_pointer_id =
+ static_cast<ui::PointerId>(id_generator_->GetGeneratedID(pointer_id));
// We are now creating a fake mouse event with pointer type of pen from
// the WM_POINTER message and then setting up an associated pointer
diff --git a/chromium/ui/views/win/pen_event_processor.h b/chromium/ui/views/win/pen_event_processor.h
index f4a261ca33b..c9112736165 100644
--- a/chromium/ui/views/win/pen_event_processor.h
+++ b/chromium/ui/views/win/pen_event_processor.h
@@ -63,7 +63,7 @@ class VIEWS_EXPORT PenEventProcessor {
base::flat_map<UINT32, bool> sent_mouse_down_;
base::flat_map<UINT32, bool> sent_touch_start_;
- absl::optional<unsigned int> eraser_pointer_id_;
+ absl::optional<ui::PointerId> eraser_pointer_id_;
};
} // namespace views
diff --git a/chromium/ui/views/window/client_view.h b/chromium/ui/views/window/client_view.h
index ee0792840ea..77da352f50a 100644
--- a/chromium/ui/views/window/client_view.h
+++ b/chromium/ui/views/window/client_view.h
@@ -73,7 +73,7 @@ class VIEWS_EXPORT ClientView : public View {
private:
// The View that this ClientView contains.
- raw_ptr<View> contents_view_;
+ raw_ptr<View, DanglingUntriaged> contents_view_;
};
BEGIN_VIEW_BUILDER(VIEWS_EXPORT, ClientView, View)
diff --git a/chromium/ui/views/window/dialog_client_view.cc b/chromium/ui/views/window/dialog_client_view.cc
index 283ee15d15b..d59f49eaff6 100644
--- a/chromium/ui/views/window/dialog_client_view.cc
+++ b/chromium/ui/views/window/dialog_client_view.cc
@@ -382,7 +382,7 @@ void DialogClientView::SetupLayout() {
DISTANCE_BUTTON_MAX_LINKABLE_WIDTH));
// Track which columns to link sizes under MD.
- constexpr int kViewToColumnIndex[] = {1, 3, 5};
+ constexpr size_t kViewToColumnIndex[] = {1, 3, 5};
std::vector<size_t> columns_to_link;
// Skip views that are not a button, or are a specific subclass of Button
diff --git a/chromium/ui/views/window/frame_caption_button.cc b/chromium/ui/views/window/frame_caption_button.cc
index c5a9ff5f838..eb873521687 100644
--- a/chromium/ui/views/window/frame_caption_button.cc
+++ b/chromium/ui/views/window/frame_caption_button.cc
@@ -163,7 +163,7 @@ bool FrameCaptionButton::IsAnimatingImageSwap() const {
return swap_images_animation_->is_animating();
}
-void FrameCaptionButton::SetAlpha(int alpha) {
+void FrameCaptionButton::SetAlpha(SkAlpha alpha) {
if (alpha_ != alpha) {
alpha_ = alpha;
SchedulePaint();
@@ -272,8 +272,9 @@ void FrameCaptionButton::PaintButtonContents(gfx::Canvas* canvas) {
constexpr SkAlpha kHighlightVisibleOpacity = 0x14;
SkAlpha highlight_alpha = SK_AlphaTRANSPARENT;
if (hover_animation().is_animating()) {
- highlight_alpha = hover_animation().CurrentValueBetween(
- SK_AlphaTRANSPARENT, kHighlightVisibleOpacity);
+ highlight_alpha =
+ static_cast<SkAlpha>(hover_animation().CurrentValueBetween(
+ SK_AlphaTRANSPARENT, kHighlightVisibleOpacity));
} else if (GetState() == STATE_HOVERED || GetState() == STATE_PRESSED) {
// Painting a circular highlight in both "hovered" and "pressed" states
// simulates and ink drop highlight mode of
@@ -292,10 +293,14 @@ void FrameCaptionButton::PaintButtonContents(gfx::Canvas* canvas) {
DrawHighlight(canvas, flags);
}
- int icon_alpha = swap_images_animation_->CurrentValueBetween(0, 255);
- int crossfade_icon_alpha = 0;
- if (icon_alpha < static_cast<int>(kFadeOutRatio * 255))
- crossfade_icon_alpha = static_cast<int>(255 - icon_alpha / kFadeOutRatio);
+ SkAlpha icon_alpha =
+ static_cast<SkAlpha>(swap_images_animation_->CurrentValueBetween(
+ SK_AlphaTRANSPARENT, SK_AlphaOPAQUE));
+ SkAlpha crossfade_icon_alpha = 0;
+ if (icon_alpha < base::ClampRound<SkAlpha>(kFadeOutRatio * SK_AlphaOPAQUE)) {
+ crossfade_icon_alpha =
+ base::ClampRound<SkAlpha>(SK_AlphaOPAQUE - icon_alpha / kFadeOutRatio);
+ }
int centered_origin_x = (width() - icon_image_.width()) / 2;
int centered_origin_y = (height() - icon_image_.height()) / 2;
@@ -322,9 +327,9 @@ void FrameCaptionButton::PaintButtonContents(gfx::Canvas* canvas) {
}
}
-int FrameCaptionButton::GetAlphaForIcon(int base_alpha) const {
+SkAlpha FrameCaptionButton::GetAlphaForIcon(SkAlpha base_alpha) const {
if (!GetEnabled())
- return base_alpha * kDisabledButtonAlphaRatio;
+ return base::ClampRound<SkAlpha>(base_alpha * kDisabledButtonAlphaRatio);
if (paint_as_active_)
return base_alpha;
@@ -338,7 +343,7 @@ int FrameCaptionButton::GetAlphaForIcon(int base_alpha) const {
} else if (GetState() == STATE_PRESSED || GetState() == STATE_HOVERED) {
inactive_alpha = 1.0f;
}
- return base_alpha * inactive_alpha;
+ return base::ClampRound<SkAlpha>(base_alpha * inactive_alpha);
}
void FrameCaptionButton::UpdateInkDropBaseColor() {
diff --git a/chromium/ui/views/window/frame_caption_button.h b/chromium/ui/views/window/frame_caption_button.h
index 5a674e02399..bbc2c120b0d 100644
--- a/chromium/ui/views/window/frame_caption_button.h
+++ b/chromium/ui/views/window/frame_caption_button.h
@@ -61,7 +61,7 @@ class VIEWS_EXPORT FrameCaptionButton : public views::Button {
bool IsAnimatingImageSwap() const;
// Sets the alpha to use for painting. Used to animate visibility changes.
- void SetAlpha(int alpha);
+ void SetAlpha(SkAlpha alpha);
// views::Button:
void OnGestureEvent(ui::GestureEvent* event) override;
@@ -110,7 +110,7 @@ class VIEWS_EXPORT FrameCaptionButton : public views::Button {
// Determines what alpha to use for the icon based on animation and
// active state.
- int GetAlphaForIcon(int base_alpha) const;
+ SkAlpha GetAlphaForIcon(SkAlpha base_alpha) const;
void UpdateInkDropBaseColor();
@@ -124,7 +124,7 @@ class VIEWS_EXPORT FrameCaptionButton : public views::Button {
bool paint_as_active_ = false;
// Current alpha to use for painting.
- int alpha_ = 255;
+ SkAlpha alpha_ = SK_AlphaOPAQUE;
// Radius of the ink drop highlight and mask.
int ink_drop_corner_radius_ = kCaptionButtonInkDropDefaultCornerRadius;
diff --git a/chromium/ui/views/window/non_client_view.h b/chromium/ui/views/window/non_client_view.h
index ecd7ce9b72b..e9aad49b381 100644
--- a/chromium/ui/views/window/non_client_view.h
+++ b/chromium/ui/views/window/non_client_view.h
@@ -232,7 +232,7 @@ class VIEWS_EXPORT NonClientView : public View, public ViewTargeterDelegate {
// A ClientView object or subclass, responsible for sizing the contents view
// of the window, hit testing and perhaps other tasks depending on the
// implementation.
- const raw_ptr<ClientView> client_view_;
+ const raw_ptr<ClientView, DanglingUntriaged> client_view_;
// The NonClientFrameView that renders the non-client portions of the window.
// This object is not owned by the view hierarchy because it can be replaced
@@ -241,7 +241,7 @@ class VIEWS_EXPORT NonClientView : public View, public ViewTargeterDelegate {
// The overlay view, when non-NULL and visible, takes up the entire widget and
// is placed on top of the ClientView and NonClientFrameView.
- raw_ptr<View> overlay_view_ = nullptr;
+ raw_ptr<View, DanglingUntriaged> overlay_view_ = nullptr;
// The accessible name of this view.
std::u16string accessible_name_;
diff --git a/chromium/ui/views_content_client/views_content_client.h b/chromium/ui/views_content_client/views_content_client.h
index 37dae9ad330..f26003c3b8b 100644
--- a/chromium/ui/views_content_client/views_content_client.h
+++ b/chromium/ui/views_content_client/views_content_client.h
@@ -100,7 +100,7 @@ class VIEWS_CONTENT_CLIENT_EXPORT ViewsContentClient {
raw_ptr<sandbox::SandboxInterfaceInfo> sandbox_info_;
#else
int argc_;
- const char** argv_;
+ raw_ptr<const char*> argv_;
#endif
OnPreMainMessageLoopRunCallback on_pre_main_message_loop_run_callback_;
base::OnceClosure on_resources_loaded_callback_;
diff --git a/chromium/ui/views_content_client/views_content_client_main_parts_mac.mm b/chromium/ui/views_content_client/views_content_client_main_parts_mac.mm
index bc299671710..6e16b917e3c 100644
--- a/chromium/ui/views_content_client/views_content_client_main_parts_mac.mm
+++ b/chromium/ui/views_content_client/views_content_client_main_parts_mac.mm
@@ -12,7 +12,6 @@
#include "base/mac/scoped_nsobject.h"
#include "base/path_service.h"
#include "content/public/browser/context_factory.h"
-#include "content/public/browser/plugin_service.h"
#include "content/public/common/content_paths.h"
#include "content/public/common/result_codes.h"
#include "content/shell/browser/shell_application_mac.h"
diff --git a/chromium/ui/views_content_client/views_content_main_delegate.cc b/chromium/ui/views_content_client/views_content_main_delegate.cc
index e891e1ad671..442fcf8bb9f 100644
--- a/chromium/ui/views_content_client/views_content_main_delegate.cc
+++ b/chromium/ui/views_content_client/views_content_main_delegate.cc
@@ -43,7 +43,7 @@ ViewsContentMainDelegate::ViewsContentMainDelegate(
ViewsContentMainDelegate::~ViewsContentMainDelegate() {
}
-bool ViewsContentMainDelegate::BasicStartupComplete(int* exit_code) {
+absl::optional<int> ViewsContentMainDelegate::BasicStartupComplete() {
const base::CommandLine& command_line =
*base::CommandLine::ForCurrentProcess();
std::string process_type =
@@ -60,7 +60,7 @@ bool ViewsContentMainDelegate::BasicStartupComplete(int* exit_code) {
content::RegisterShellPathProvider();
- return false;
+ return absl::nullopt;
}
void ViewsContentMainDelegate::PreSandboxStartup() {
@@ -85,9 +85,14 @@ void ViewsContentMainDelegate::PreSandboxStartup() {
views_content_client_->OnResourcesLoaded();
}
-void ViewsContentMainDelegate::PreBrowserMain() {
- content::ContentMainDelegate::PreBrowserMain();
+absl::optional<int> ViewsContentMainDelegate::PreBrowserMain() {
+ absl::optional<int> exit_code =
+ content::ContentMainDelegate::PreBrowserMain();
+ if (exit_code.has_value())
+ return exit_code;
+
ViewsContentClientMainParts::PreBrowserMain();
+ return absl::nullopt;
}
content::ContentClient* ViewsContentMainDelegate::CreateContentClient() {
diff --git a/chromium/ui/views_content_client/views_content_main_delegate.h b/chromium/ui/views_content_client/views_content_main_delegate.h
index 10fdc8d81b7..a474e479c47 100644
--- a/chromium/ui/views_content_client/views_content_main_delegate.h
+++ b/chromium/ui/views_content_client/views_content_main_delegate.h
@@ -26,9 +26,9 @@ class ViewsContentMainDelegate : public content::ContentMainDelegate {
~ViewsContentMainDelegate() override;
// content::ContentMainDelegate implementation
- bool BasicStartupComplete(int* exit_code) override;
+ absl::optional<int> BasicStartupComplete() override;
void PreSandboxStartup() override;
- void PreBrowserMain() override;
+ absl::optional<int> PreBrowserMain() override;
content::ContentClient* CreateContentClient() override;
content::ContentBrowserClient* CreateContentBrowserClient() override;
diff --git a/chromium/ui/web_dialogs/web_dialog_ui.cc b/chromium/ui/web_dialogs/web_dialog_ui.cc
index d7f8b3e4e30..5757ad6d2ae 100644
--- a/chromium/ui/web_dialogs/web_dialog_ui.cc
+++ b/chromium/ui/web_dialogs/web_dialog_ui.cc
@@ -59,7 +59,7 @@ WebDialogUIBase::WebDialogUIBase(content::WebUI* web_ui) : web_ui_(web_ui) {}
// HTML dialogs won't swap WebUIs anyway since they don't navigate.
WebDialogUIBase::~WebDialogUIBase() = default;
-void WebDialogUIBase::CloseDialog(const base::ListValue* args) {
+void WebDialogUIBase::CloseDialog(const base::Value::List& args) {
OnDialogClosed(args);
}
@@ -76,7 +76,7 @@ void WebDialogUIBase::HandleRenderFrameCreated(
RenderFrameHost* render_frame_host) {
// Hook up the javascript function calls, also known as chrome.send("foo")
// calls in the HTML, to the actual C++ functions.
- web_ui_->RegisterDeprecatedMessageCallback(
+ web_ui_->RegisterMessageCallback(
"dialogClose", base::BindRepeating(&WebDialogUIBase::OnDialogClosed,
base::Unretained(this)));
@@ -100,13 +100,13 @@ void WebDialogUIBase::HandleRenderFrameCreated(
delegate->OnDialogShown(web_ui_);
}
-void WebDialogUIBase::OnDialogClosed(const base::ListValue* args) {
+void WebDialogUIBase::OnDialogClosed(const base::Value::List& args) {
WebDialogDelegate* delegate = GetDelegate(web_ui_->GetWebContents());
if (delegate) {
std::string json_retval;
- if (args && !args->GetListDeprecated().empty()) {
- if (args->GetListDeprecated()[0].is_string())
- json_retval = args->GetListDeprecated()[0].GetString();
+ if (!args.empty()) {
+ if (args[0].is_string())
+ json_retval = args[0].GetString();
else
NOTREACHED() << "Could not read JSON argument";
}
diff --git a/chromium/ui/web_dialogs/web_dialog_ui.h b/chromium/ui/web_dialogs/web_dialog_ui.h
index 78f30d7b460..742dc0275c6 100644
--- a/chromium/ui/web_dialogs/web_dialog_ui.h
+++ b/chromium/ui/web_dialogs/web_dialog_ui.h
@@ -33,7 +33,7 @@ class WEB_DIALOGS_EXPORT WebDialogUIBase {
WebDialogUIBase& operator=(const WebDialogUIBase&) = delete;
// Close the dialog, passing the specified arguments to the close handler.
- void CloseDialog(const base::ListValue* args);
+ void CloseDialog(const base::Value::List& args);
protected:
virtual ~WebDialogUIBase();
@@ -46,7 +46,7 @@ class WEB_DIALOGS_EXPORT WebDialogUIBase {
static WebDialogDelegate* GetDelegate(content::WebContents* web_contents);
// JS message handler.
- void OnDialogClosed(const base::ListValue* args);
+ void OnDialogClosed(const base::Value::List& args);
raw_ptr<content::WebUI> web_ui_;
};
diff --git a/chromium/ui/webui/BUILD.gn b/chromium/ui/webui/BUILD.gn
index a883f68ce18..873d5ae5d12 100644
--- a/chromium/ui/webui/BUILD.gn
+++ b/chromium/ui/webui/BUILD.gn
@@ -8,6 +8,8 @@ static_library("webui") {
"mojo_bubble_web_ui_controller.h",
"mojo_web_ui_controller.cc",
"mojo_web_ui_controller.h",
+ "untrusted_bubble_web_ui_controller.cc",
+ "untrusted_bubble_web_ui_controller.h",
"untrusted_web_ui_controller.cc",
"untrusted_web_ui_controller.h",
"untrusted_web_ui_controller_factory.cc",
diff --git a/chromium/ui/webui/PLATFORM_OWNERS b/chromium/ui/webui/PLATFORM_OWNERS
index 3ceebd77e11..d6e8e75f090 100644
--- a/chromium/ui/webui/PLATFORM_OWNERS
+++ b/chromium/ui/webui/PLATFORM_OWNERS
@@ -1,10 +1,8 @@
# Please use more specific OWNERS when possible.
antrim@chromium.org # For Chrome OS changes, CET.
-calamity@chromium.org
dpapad@chromium.org
johntlee@chromium.org
khorimoto@chromium.org # For Chrome OS changes.
-michaelpg@chromium.org # For Chrome OS changes.
rbpotter@chromium.org
# Only for backend infra changes e.g. //content/browser/webui,
diff --git a/chromium/ui/webui/resources/BUILD.gn b/chromium/ui/webui/resources/BUILD.gn
index 8c979f96125..4cea51192a3 100644
--- a/chromium/ui/webui/resources/BUILD.gn
+++ b/chromium/ui/webui/resources/BUILD.gn
@@ -9,6 +9,7 @@ import("//tools/typescript/ts_definitions.gni")
import("//tools/typescript/ts_library.gni")
import("//ui/webui/resources/include_polymer.gni")
import("//ui/webui/resources/tools/generate_grd.gni")
+import("./cr_elements/cr_elements.gni")
generate_grd("build_grd") {
grd_prefix = "webui_generated"
@@ -16,7 +17,6 @@ generate_grd("build_grd") {
public_deps = [
":build_ts_grdp",
- "cr_components/color_change_listener:build_grdp",
"css:build_grdp",
"html:build_grdp",
"images:build_grdp",
@@ -34,7 +34,6 @@ generate_grd("build_grd") {
"$target_gen_dir/js/resources.grdp",
"$target_gen_dir/resources_ts.grdp",
"$root_gen_dir/third_party/jstemplate/resources.grdp",
- "$root_gen_dir/ui/webui/resources/cr_components/color_change_listener/resources.grdp",
]
if (!is_chromeos_ash && !is_android) {
@@ -54,6 +53,7 @@ generate_grd("build_grd") {
"cr_components:build_grdp",
"cr_components/app_management:build_grdp",
"cr_components/customize_themes:build_grdp",
+ "cr_components/help_bubble:build_grdp",
"cr_components/most_visited:build_grdp",
"cr_elements:build_grdp",
"js/browser_command:build_grdp",
@@ -61,10 +61,11 @@ generate_grd("build_grd") {
]
grdp_files += [
"$root_gen_dir/third_party/polymer/v3_0/polymer_3_0_resources.grdp",
+ "$root_gen_dir/ui/webui/resources/cr_components/app_management/resources.grdp",
"$root_gen_dir/ui/webui/resources/cr_components/cr_components_resources.grdp",
"$root_gen_dir/ui/webui/resources/cr_components/customize_themes/resources.grdp",
+ "$root_gen_dir/ui/webui/resources/cr_components/help_bubble/resources.grdp",
"$root_gen_dir/ui/webui/resources/cr_components/most_visited/resources.grdp",
- "$root_gen_dir/ui/webui/resources/cr_components/app_management/resources.grdp",
"$root_gen_dir/ui/webui/resources/cr_elements/cr_elements_resources.grdp",
"$root_gen_dir/ui/webui/resources/js/browser_command/resources.grdp",
]
@@ -93,22 +94,30 @@ generate_grd("build_grd") {
public_deps += [
":build_cros_styles_grdp",
"//ash/webui/common/resources:build_grdp",
+ "//ash/webui/common/resources:build_html_css_wrapper_files_grdp",
"//chromeos/ash/components/cros_elements:build_grdp",
"//third_party/material_web_components:build_grdp",
"//third_party/web-animations-js:build_grdp",
]
grdp_files += [
+ "$root_gen_dir/ash/webui/common/resources/ash_common_resources.grdp",
+ "$root_gen_dir/ash/webui/common/resources/html_css_wrapper_files_resources.grdp",
"$root_gen_dir/chromeos/ash/components/cros_elements/cros_elements_resources.grdp",
- "$root_gen_dir/ui/webui/resources/cros_styles_resources.grdp",
- "$root_gen_dir/third_party/web-animations-js/web_animations_resources.grdp",
"$root_gen_dir/third_party/material_web_components/material_web_components_resources.grdp",
- "$root_gen_dir/ash/webui/common/resources/ash_common_resources.grdp",
+ "$root_gen_dir/third_party/web-animations-js/web_animations_resources.grdp",
+ "$root_gen_dir/ui/webui/resources/cros_styles_resources.grdp",
]
}
if (!is_android && !is_ios) {
- public_deps += [ "//third_party/lottie:build_grdp" ]
- grdp_files += [ "$root_gen_dir/third_party/lottie/resources.grdp" ]
+ public_deps += [
+ "cr_components/color_change_listener:build_grdp",
+ "//third_party/lottie:build_grdp",
+ ]
+ grdp_files += [
+ "$root_gen_dir/third_party/lottie/resources.grdp",
+ "$root_gen_dir/ui/webui/resources/cr_components/color_change_listener/resources.grdp",
+ ]
}
}
@@ -154,30 +163,17 @@ group("closure_compile") {
preprocessed_folder = "$target_gen_dir/preprocessed"
-generate_grd("build_ts_grdp") {
- grd_prefix = "webui"
- out_grd = "$target_gen_dir/resources_ts.grdp"
- public_deps = [ ":library" ]
- manifest_files = [ "$target_gen_dir/tsconfig.manifest" ]
-}
-
checked_in_dts_files = [
- "cr_elements/cr_button/cr_button.m.d.ts",
- "cr_elements/cr_checkbox/cr_checkbox.m.d.ts",
- "cr_elements/cr_container_shadow_behavior.m.d.ts",
- "cr_elements/cr_dialog/cr_dialog.m.d.ts",
- "cr_elements/cr_expand_button/cr_expand_button.m.d.ts",
- "cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.m.d.ts",
- "cr_elements/cr_icon_button/cr_icon_button.m.d.ts",
- "cr_elements/cr_input/cr_input.m.d.ts",
- "cr_elements/cr_lazy_render/cr_lazy_render.m.d.ts",
+ "cr_elements/cr_button/cr_button.d.ts",
+ "cr_elements/cr_dialog/cr_dialog.d.ts",
+ "cr_elements/cr_icon_button/cr_icon_button.d.ts",
+ "cr_elements/cr_input/cr_input.d.ts",
"cr_elements/cr_lottie/cr_lottie.m.d.ts",
- "cr_elements/cr_radio_button/cr_card_radio_button.m.d.ts",
- "cr_elements/cr_radio_button/cr_radio_button_behavior.m.d.ts",
- "cr_elements/cr_radio_button/cr_radio_button.m.d.ts",
- "cr_elements/cr_radio_group/cr_radio_group.m.d.ts",
+ "cr_elements/cr_radio_button/cr_card_radio_button.d.ts",
+ "cr_elements/cr_radio_button/cr_radio_button_behavior.d.ts",
+ "cr_elements/cr_radio_button/cr_radio_button.d.ts",
"cr_elements/cr_scrollable_behavior.m.d.ts",
- "cr_elements/cr_toggle/cr_toggle.m.d.ts",
+ "cr_elements/cr_toggle/cr_toggle.d.ts",
"cr_elements/find_shortcut_behavior.d.ts",
"cr_elements/policy/cr_policy_indicator_behavior.m.d.ts",
"cr_elements/policy/cr_policy_indicator.m.d.ts",
@@ -185,13 +181,20 @@ checked_in_dts_files = [
"cr_elements/policy/cr_tooltip_icon.m.d.ts",
"js/cr/ui/focus_row_behavior.m.d.ts",
"js/i18n_behavior.m.d.ts",
- "js/list_property_update_behavior.m.d.ts",
"js/parse_html_subset.m.d.ts",
"js/promise_resolver.m.d.ts",
"js/static_types.d.ts",
"js/web_ui_listener_behavior.m.d.ts",
]
+if (is_chromeos_ash || is_fuchsia || is_linux || is_mac || is_win) {
+ checked_in_dts_files += [
+ "js/cr/ui/context_menu_handler.d.ts",
+ "js/cr/ui/menu_button.d.ts",
+ "js/cr/ui/menu_item.d.ts",
+ ]
+}
+
if (is_chromeos_ash) {
checked_in_dts_files += [
"cr_components/chromeos/bluetooth/bluetooth_base_page.d.ts",
@@ -203,14 +206,50 @@ if (is_chromeos_ash) {
"cr_components/chromeos/bluetooth/bluetooth_pairing_enter_code_page.d.ts",
"cr_components/chromeos/bluetooth/bluetooth_pairing_request_code_page.d.ts",
"cr_components/chromeos/bluetooth/bluetooth_pairing_ui.d.ts",
+ "cr_components/chromeos/cellular_setup/base_page.m.d.ts",
+ "cr_components/chromeos/cellular_setup/button_bar.m.d.ts",
+ "cr_components/chromeos/cellular_setup/cellular_eid_dialog.m.d.ts",
+ "cr_components/chromeos/cellular_setup/cellular_setup.m.d.ts",
+ "cr_components/chromeos/cellular_setup/cellular_setup_delegate.m.d.ts",
+ "cr_components/chromeos/cellular_setup/cellular_setup_icons.m.d.ts",
+ "cr_components/chromeos/cellular_setup/cellular_types.m.d.ts",
+ "cr_components/chromeos/cellular_setup/esim_flow_ui.m.d.ts",
+ "cr_components/chromeos/cellular_setup/esim_manager_listener_behavior.m.d.ts",
+ "cr_components/chromeos/cellular_setup/esim_manager_utils.m.d.ts",
+ "cr_components/chromeos/cellular_setup/profile_discovery_list_page.m.d.ts",
+ "cr_components/chromeos/cellular_setup/provisioning_page.m.d.ts",
+ "cr_components/chromeos/cellular_setup/psim_flow_ui.m.d.ts",
+ "cr_components/chromeos/cellular_setup/setup_loading_page.m.d.ts",
+ "cr_components/chromeos/network/cellular_utils.m.d.ts",
+ "cr_components/chromeos/network/cr_policy_network_behavior_mojo.m.d.ts",
+ "cr_components/chromeos/network/cr_policy_network_indicator_mojo.m.d.ts",
+ "cr_components/chromeos/network/mojo_interface_provider.m.d.ts",
+ "cr_components/chromeos/network/network_apnlist.m.d.ts",
+ "cr_components/chromeos/network/network_choose_mobile.m.d.ts",
+ "cr_components/chromeos/network/network_config.m.d.ts",
+ "cr_components/chromeos/network/network_config_input.m.d.ts",
+ "cr_components/chromeos/network/network_config_toggle.m.d.ts",
+ "cr_components/chromeos/network/network_icon.m.d.ts",
+ "cr_components/chromeos/network/network_ip_config.m.d.ts",
+ "cr_components/chromeos/network/network_list.m.d.ts",
+ "cr_components/chromeos/network/network_list_item.m.d.ts",
+ "cr_components/chromeos/network/network_list_types.m.d.ts",
+ "cr_components/chromeos/network/network_listener_behavior.m.d.ts",
+ "cr_components/chromeos/network/network_nameservers.m.d.ts",
+ "cr_components/chromeos/network/network_property_list_mojo.m.d.ts",
+ "cr_components/chromeos/network/network_proxy.m.d.ts",
+ "cr_components/chromeos/network/network_shared_css.m.d.ts",
+ "cr_components/chromeos/network/network_siminfo.m.d.ts",
+ "cr_components/chromeos/network/onc_mojo.m.d.ts",
+ "cr_components/chromeos/network/sim_lock_dialogs.m.d.ts",
"cr_components/chromeos/smb_shares/add_smb_share_dialog.d.ts",
"cr_components/chromeos/smb_shares/smb_browser_proxy.d.ts",
- "js/cr/ui/context_menu_handler.m.d.ts",
- "js/cr/ui/dialogs.m.d.ts",
+ "cr_components/chromeos/traffic_counters/traffic_counters.d.ts",
+ "cr_components/chromeos/traffic_counters/traffic_counters_adapter.d.ts",
+ "cr_elements/cr_container_shadow_behavior.m.d.ts",
"js/cr/ui/grid.m.d.ts",
"js/cr/ui/list.m.d.ts",
- "js/cr/ui/menu_button.m.d.ts",
- "js/cr/ui/menu_item.m.d.ts",
+ "js/list_property_update_behavior.d.ts",
]
}
@@ -228,28 +267,42 @@ generate_definitions_js_files = [
"js/color_utils.js",
"js/cr/event_target.m.js",
"js/cr.m.js",
- "js/cr/ui/drag_wrapper.js",
- "js/cr/ui/focus_grid.js",
+ "js/cr/ui.m.js",
"js/cr/ui/focus_outline_manager.m.js",
"js/cr/ui/focus_row.m.js",
- "js/cr/ui/keyboard_shortcut_list.m.js",
- "js/cr/ui/store.js",
+ "js/cr/ui/keyboard_shortcut_list.js",
"js/event_tracker.m.js",
"js/load_time_data.m.js",
"js/plural_string_proxy.js",
- "js/search_highlight_utils.js",
"js/icon.js",
"js/util.m.js",
]
+if (is_chromeos_ash || is_fuchsia || is_linux || is_mac || is_win) {
+ generate_definitions_js_files += [
+ "js/cr/ui/menu.js",
+ "js/cr/ui/command.js",
+ "js/cr/ui/position_util.js",
+ ]
+}
+
+if (is_chromeos_ash) {
+ generate_definitions_js_files += [
+ "js/cr/ui/array_data_model.m.js",
+ "js/cr/ui/list_item.m.js",
+ "js/cr/ui/list_selection_controller.m.js",
+ "js/cr/ui/list_selection_model.m.js",
+ "js/cr/ui/list_single_selection_model.m.js",
+ "js/cr/ui/store_client.js",
+ "js/cr/ui/store.js",
+ ]
+}
+
if (include_polymer) {
generate_definitions_js_files += [
"cr_elements/action_link_css.m.js",
- "cr_elements/cr_fingerprint/cr_fingerprint_icon.m.js",
"cr_elements/cr_actionable_row_style.m.js",
"cr_elements/cr_icons_css.m.js",
- "cr_elements/cr_input/cr_input_style_css.m.js",
- "cr_elements/cr_radio_button/cr_radio_button_style_css.m.js",
"cr_elements/hidden_style_css.m.js",
"cr_elements/icons.m.js",
"cr_elements/md_select_css.m.js",
@@ -272,25 +325,6 @@ if (include_polymer) {
"cr_components/chromeos/quick_unlock/pin_keyboard.m.js",
"cr_components/chromeos/quick_unlock/setup_pin_keyboard.m.js",
"cr_elements/chromeos/cros_color_overrides.m.js",
- "cr_elements/chromeos/cr_picture/cr_camera.js",
- "cr_elements/chromeos/cr_picture/cr_picture_list.js",
- "cr_elements/chromeos/cr_picture/cr_picture_pane.js",
- "cr_elements/chromeos/cr_picture/cr_picture_types.js",
- "cr_elements/chromeos/cr_picture/icons.js",
- "cr_elements/chromeos/cr_picture/png.js",
- "cr_elements/chromeos/cr_picture/webcam_utils.js",
- "js/cr/ui.m.js",
- "js/cr/ui/array_data_model.m.js",
- "js/cr/ui/command.m.js",
- "js/cr/ui/list_item.m.js",
- "js/cr/ui/list_selection_model.m.js",
- "js/cr/ui/list_single_selection_model.m.js",
- "js/cr/ui/list_selection_controller.m.js",
- "js/cr/ui/menu.m.js",
- "js/cr/ui/position_util.m.js",
- "js/cr/ui/splitter.js",
- "js/cr/ui/store_client.js",
- "js/cr/ui/tree.js",
]
}
}
@@ -299,93 +333,37 @@ if (!is_android) {
generate_definitions_js_files += [ "js/cr/ui/focus_without_ink.m.js" ]
}
+if (is_ios) {
+ generate_definitions_js_files += [ "js/ios/web_ui.js" ]
+}
+
ts_library("library") {
root_dir = preprocessed_folder
out_dir = preprocessed_folder
composite = true
tsconfig_base = "tsconfig_base.json"
- in_files = [
- "cr_elements/cr_tab_box/cr_tab_box.ts",
- "cr_elements/cr_tab_box/cr_tab_box.html.ts",
- "cr_elements/cr_tree/cr_tree.ts",
- "cr_elements/cr_tree/cr_tree.html.ts",
- "cr_elements/cr_tree/cr_tree_base.ts",
- "cr_elements/cr_tree/cr_tree_item.ts",
- "cr_elements/cr_tree/cr_tree_item.html.ts",
- "js/assert_ts.ts",
- "js/custom_element.ts",
- ]
+ in_files = cr_elements_files + [
+ "js/assert_ts.ts",
+ "js/custom_element.ts",
+ "js/cr/ui/focus_grid.ts",
+ "js/cr/ui/drag_wrapper.ts",
+ "js/cr/ui/store_ts.ts",
+ ]
if (include_polymer) {
in_files += [
- "cr_components/iph_bubble/iph_bubble.html.ts",
- "cr_components/iph_bubble/iph_bubble.ts",
"cr_components/localized_link/localized_link.html.ts",
"cr_components/localized_link/localized_link.ts",
- "cr_components/managed_footnote/managed_footnote.html.ts",
- "cr_components/managed_footnote/managed_footnote.ts",
"cr_components/managed_dialog/managed_dialog.html.ts",
"cr_components/managed_dialog/managed_dialog.ts",
- "cr_elements/cr_auto_img/cr_auto_img.ts",
- "cr_elements/cr_grid/cr_grid.html.ts",
- "cr_elements/cr_grid/cr_grid.ts",
- "cr_elements/cr_a11y_announcer/cr_a11y_announcer.html.ts",
- "cr_elements/cr_a11y_announcer/cr_a11y_announcer.ts",
- "cr_elements/cr_action_menu/cr_action_menu.html.ts",
- "cr_elements/cr_action_menu/cr_action_menu.ts",
- "cr_elements/cr_container_shadow_mixin.ts",
- "cr_elements/cr_drawer/cr_drawer.html.ts",
- "cr_elements/cr_drawer/cr_drawer.ts",
- "cr_elements/cr_link_row/cr_link_row.html.ts",
- "cr_elements/cr_link_row/cr_link_row.ts",
- "cr_elements/cr_menu_selector/cr_menu_selector.ts",
- "cr_elements/cr_nav_menu_item_style.css.ts",
- "cr_elements/cr_page_host_style.css.ts",
- "cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector_grid.html.ts",
- "cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector_grid.ts",
- "cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.html.ts",
- "cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.ts",
- "cr_elements/cr_search_field/cr_search_field_mixin.ts",
- "cr_elements/cr_search_field/cr_search_field.html.ts",
- "cr_elements/cr_search_field/cr_search_field.ts",
- "cr_elements/cr_slider/cr_slider.html.ts",
- "cr_elements/cr_slider/cr_slider.ts",
- "cr_elements/cr_splitter/cr_splitter.ts",
- "cr_elements/cr_tabs/cr_tabs.html.ts",
- "cr_elements/cr_tabs/cr_tabs.ts",
- "cr_elements/cr_toast/cr_toast_manager.html.ts",
- "cr_elements/cr_toast/cr_toast_manager.ts",
- "cr_elements/cr_toast/cr_toast.html.ts",
- "cr_elements/cr_toast/cr_toast.ts",
- "cr_elements/cr_toolbar/cr_toolbar_search_field.html.ts",
- "cr_elements/cr_toolbar/cr_toolbar_search_field.ts",
- "cr_elements/cr_toolbar/cr_toolbar_selection_overlay.html.ts",
- "cr_elements/cr_toolbar/cr_toolbar_selection_overlay.ts",
- "cr_elements/cr_toolbar/cr_toolbar.html.ts",
- "cr_elements/cr_toolbar/cr_toolbar.ts",
- "cr_elements/cr_view_manager/cr_view_manager.html.ts",
- "cr_elements/cr_view_manager/cr_view_manager.ts",
- "cr_elements/find_shortcut_mixin.ts",
- "cr_elements/mouse_hoverable_mixin.ts",
- "cr_elements/mwb_element_shared_style.css.ts",
- "cr_elements/mwb_shared_icons.html.ts",
- "cr_elements/mwb_shared_style.css.ts",
- "cr_elements/mwb_shared_vars.css.ts",
- "cr_elements/search_highlight_style.css.ts",
+ "cr_components/managed_footnote/managed_footnote.html.ts",
+ "cr_components/managed_footnote/managed_footnote.ts",
"js/i18n_mixin.ts",
"js/list_property_update_mixin.ts",
+ "js/search_highlight_utils.ts",
"js/web_ui_listener_mixin.ts",
]
-
- if (is_chromeos) {
- # cr-searchable-drop-down is only used in smb and cups dialogs, both of
- # which are chromeos only.
- in_files += [
- "cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.html.ts",
- "cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.ts",
- ]
- }
}
definitions = [
@@ -414,6 +392,14 @@ ts_library("library") {
]
}
+generate_grd("build_ts_grdp") {
+ grd_prefix = "webui"
+ out_grd = "$target_gen_dir/resources_ts.grdp"
+ public_deps = [ ":library" ]
+ manifest_files =
+ filter_include(get_target_outputs(":library"), [ "*.manifest" ])
+}
+
ts_definitions("generate_definitions") {
root_dir = preprocessed_folder
out_dir = preprocessed_folder
diff --git a/chromium/ui/webui/resources/cr_components/BUILD.gn b/chromium/ui/webui/resources/cr_components/BUILD.gn
index 04d8c49d9c6..5f585069f27 100644
--- a/chromium/ui/webui/resources/cr_components/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/BUILD.gn
@@ -214,7 +214,6 @@ preprocess_if_expr("preprocess_src_ts") {
in_folder = "."
out_folder = preprocess_folder
in_files = [
- "iph_bubble/iph_bubble.ts",
"localized_link/localized_link.ts",
"managed_dialog/managed_dialog.ts",
"managed_footnote/managed_footnote.ts",
@@ -228,7 +227,6 @@ preprocess_if_expr("preprocess_generated_ts") {
in_folder = target_gen_dir
out_folder = preprocess_folder
in_files = [
- "iph_bubble/iph_bubble.html.ts",
"localized_link/localized_link.html.ts",
"managed_dialog/managed_dialog.html.ts",
"managed_footnote/managed_footnote.html.ts",
@@ -382,7 +380,6 @@ if (is_chromeos_ash) {
html_to_wrapper("html_wrapper_files") {
in_files = [
- "iph_bubble/iph_bubble.html",
"localized_link/localized_link.html",
"managed_dialog/managed_dialog.html",
"managed_footnote/managed_footnote.html",
diff --git a/chromium/ui/webui/resources/cr_components/app_management/BUILD.gn b/chromium/ui/webui/resources/cr_components/app_management/BUILD.gn
index 4855a2e46ee..2d90c7ca8b7 100644
--- a/chromium/ui/webui/resources/cr_components/app_management/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/app_management/BUILD.gn
@@ -8,22 +8,11 @@ import("//tools/polymer/css_to_wrapper.gni")
import("//tools/polymer/html_to_wrapper.gni")
import("//tools/typescript/ts_library.gni")
import("//ui/webui/resources/tools/generate_grd.gni")
+import("//ui/webui/webui_features.gni")
import("app_management.gni")
assert(!is_android && !is_ios)
-preprocess_folder_tmp = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/app_management_tmp"
-preprocess_folder =
- "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/app_management"
-
-css_to_wrapper("css_wrapper_files") {
- in_files = css_files
-}
-
-html_to_wrapper("html_wrapper_files") {
- in_files = html_files + html_icons_files
-}
-
mojom("mojo_bindings") {
sources = [ "app_management.mojom" ]
webui_module_path = "/"
@@ -86,22 +75,35 @@ mojom("mojo_bindings") {
]
}
-preprocess_if_expr("preprocess_src") {
- visibility = [ ":build_ts" ]
- in_folder = "."
- out_folder = preprocess_folder_tmp
- in_files = ts_files
-}
+preprocess_folder_tmp = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/app_management_tmp"
+preprocess_folder =
+ "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/app_management"
-preprocess_if_expr("preprocess_generated") {
- visibility = [ ":build_ts" ]
- deps = [
+preprocess_if_expr("preprocess") {
+ visibility = [
+ ":build_ts",
":css_wrapper_files",
":html_wrapper_files",
]
- in_folder = target_gen_dir
+ in_folder = "."
+ out_folder = preprocess_folder_tmp
+ in_files = ts_files + html_files + html_icons_files + css_files
+}
+
+html_to_wrapper("html_wrapper_files") {
+ deps = [ ":preprocess" ]
+ in_folder = preprocess_folder_tmp
out_folder = preprocess_folder_tmp
- in_files = html_wrapper_files + css_wrapper_files
+ in_files = html_files + html_icons_files
+ minify = optimize_webui
+}
+
+css_to_wrapper("css_wrapper_files") {
+ deps = [ ":preprocess" ]
+ in_folder = preprocess_folder_tmp
+ out_folder = preprocess_folder_tmp
+ in_files = css_files
+ minify = optimize_webui
}
copy("copy_mojo") {
@@ -131,8 +133,9 @@ ts_library("build_ts") {
]
extra_deps = [
":copy_mojo",
- ":preprocess_generated",
- ":preprocess_src",
+ ":css_wrapper_files",
+ ":html_wrapper_files",
+ ":preprocess",
]
}
@@ -140,7 +143,8 @@ generate_grd("build_grdp") {
grd_prefix = "cr_components_app_management"
out_grd = "$target_gen_dir/resources.grdp"
public_deps = [ ":build_ts" ]
- manifest_files = [ "$target_gen_dir/tsconfig.manifest" ]
+ manifest_files =
+ filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
resource_path_prefix = "cr_components/app_management"
}
@@ -151,7 +155,6 @@ source_set("unit_tests") {
deps = [
":mojo_bindings",
"//base/test:test_support",
- "//chrome/test:test_support",
"//mojo/public/cpp/test_support:test_utils",
"//testing/gtest",
]
diff --git a/chromium/ui/webui/resources/cr_components/app_management/app_management.mojom b/chromium/ui/webui/resources/cr_components/app_management/app_management.mojom
index f9cb799bac6..c19cec68468 100644
--- a/chromium/ui/webui/resources/cr_components/app_management/app_management.mojom
+++ b/chromium/ui/webui/resources/cr_components/app_management/app_management.mojom
@@ -42,6 +42,7 @@ enum PermissionType {
kContacts = 5,
kStorage = 6,
kPrinting = 7,
+ kFileHandling = 8,
};
enum TriState {
diff --git a/chromium/ui/webui/resources/cr_components/app_management/app_management_mojom_traits.cc b/chromium/ui/webui/resources/cr_components/app_management/app_management_mojom_traits.cc
index 03632522ac8..ba363dbfae6 100644
--- a/chromium/ui/webui/resources/cr_components/app_management/app_management_mojom_traits.cc
+++ b/chromium/ui/webui/resources/cr_components/app_management/app_management_mojom_traits.cc
@@ -129,6 +129,8 @@ PermissionType EnumTraits<PermissionType, apps::PermissionType>::ToMojom(
return PermissionType::kStorage;
case apps::PermissionType::kPrinting:
return PermissionType::kPrinting;
+ case apps::PermissionType::kFileHandling:
+ return PermissionType::kFileHandling;
}
}
@@ -160,6 +162,9 @@ bool EnumTraits<PermissionType, apps::PermissionType>::FromMojom(
case PermissionType::kPrinting:
*output = apps::PermissionType::kPrinting;
return true;
+ case PermissionType::kFileHandling:
+ *output = apps::PermissionType::kFileHandling;
+ return true;
}
}
@@ -192,9 +197,9 @@ bool EnumTraits<TriState, apps::TriState>::FromMojom(TriState input,
PermissionValueDataView::Tag
UnionTraits<PermissionValueDataView, apps::PermissionValuePtr>::GetTag(
const apps::PermissionValuePtr& r) {
- if (r->bool_value.has_value()) {
+ if (absl::holds_alternative<bool>(r->value)) {
return PermissionValueDataView::Tag::kBoolValue;
- } else if (r->tristate_value.has_value()) {
+ } else if (absl::holds_alternative<apps::TriState>(r->value)) {
return PermissionValueDataView::Tag::kTristateValue;
}
NOTREACHED();
diff --git a/chromium/ui/webui/resources/cr_components/app_management/app_management_mojom_traits.h b/chromium/ui/webui/resources/cr_components/app_management/app_management_mojom_traits.h
index 6097807af2a..9bbbce135c7 100644
--- a/chromium/ui/webui/resources/cr_components/app_management/app_management_mojom_traits.h
+++ b/chromium/ui/webui/resources/cr_components/app_management/app_management_mojom_traits.h
@@ -8,6 +8,7 @@
#include "components/services/app_service/public/cpp/app_types.h"
#include "components/services/app_service/public/cpp/permission.h"
#include "components/services/app_service/public/cpp/run_on_os_login_types.h"
+#include "third_party/abseil-cpp/absl/types/variant.h"
#include "ui/webui/resources/cr_components/app_management/app_management.mojom.h"
namespace mojo {
@@ -65,17 +66,24 @@ struct UnionTraits<PermissionValueDataView, apps::PermissionValuePtr> {
static PermissionValueDataView::Tag GetTag(const apps::PermissionValuePtr& r);
static bool IsNull(const apps::PermissionValuePtr& r) {
- return !r->bool_value.has_value() && !r->tristate_value.has_value();
+ return !absl::holds_alternative<bool>(r->value) &&
+ !absl::holds_alternative<apps::TriState>(r->value);
}
static void SetToNull(apps::PermissionValuePtr* out) { out->reset(); }
static bool bool_value(const apps::PermissionValuePtr& r) {
- return r->bool_value.value();
+ if (absl::holds_alternative<bool>(r->value)) {
+ return absl::get<bool>(r->value);
+ }
+ return false;
}
static apps::TriState tristate_value(const apps::PermissionValuePtr& r) {
- return r->tristate_value.value();
+ if (absl::holds_alternative<apps::TriState>(r->value)) {
+ return absl::get<apps::TriState>(r->value);
+ }
+ return apps::TriState::kBlock;
}
static bool Read(PermissionValueDataView data, apps::PermissionValuePtr* out);
diff --git a/chromium/ui/webui/resources/cr_components/app_management/file_handling_item.ts b/chromium/ui/webui/resources/cr_components/app_management/file_handling_item.ts
index a7834d694d6..64078cfb307 100644
--- a/chromium/ui/webui/resources/cr_components/app_management/file_handling_item.ts
+++ b/chromium/ui/webui/resources/cr_components/app_management/file_handling_item.ts
@@ -5,11 +5,11 @@
import './app_management_shared_style.css.js';
import './toggle_row.js';
-import {assert} from '//resources/js/assert.m.js';
+import {assert} from '//resources/js/assert_ts.js';
import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.m.js';
+import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.js';
import {I18nMixin} from '../../js/i18n_mixin.js';
import {App} from './app_management.mojom-webui.js';
@@ -123,7 +123,9 @@ export class AppManagementFileHandlingItemElement extends
private onDialogClose_(): void {
this.showOverflowDialog = false;
- focusWithoutInk(assert(this.shadowRoot!.querySelector('#type-list')!));
+ const toFocus = this.shadowRoot!.querySelector('#type-list');
+ assert(toFocus);
+ focusWithoutInk(toFocus);
}
private getValue_(app: App): boolean {
diff --git a/chromium/ui/webui/resources/cr_components/app_management/more_permissions_item.ts b/chromium/ui/webui/resources/cr_components/app_management/more_permissions_item.ts
index 3210571ce99..cc0437a109d 100644
--- a/chromium/ui/webui/resources/cr_components/app_management/more_permissions_item.ts
+++ b/chromium/ui/webui/resources/cr_components/app_management/more_permissions_item.ts
@@ -3,7 +3,7 @@
// found in the LICENSE file.
import './app_management_shared_style.css.js';
-import '//resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
+import '//resources/cr_elements/cr_icon_button/cr_icon_button.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -37,7 +37,7 @@ export class AppManagementMorePermissionsItemElement extends PolymerElement {
this.addEventListener('click', this.onClick_);
}
- onClick_() {
+ private onClick_() {
BrowserProxy.getInstance().handler.openNativeSettings(this.app.id);
recordAppManagementUserAction(
this.app.type, AppManagementUserAction.NATIVE_SETTINGS_OPENED);
diff --git a/chromium/ui/webui/resources/cr_components/app_management/permission_constants.ts b/chromium/ui/webui/resources/cr_components/app_management/permission_constants.ts
index 8e167aa14f1..50a97d50cff 100644
--- a/chromium/ui/webui/resources/cr_components/app_management/permission_constants.ts
+++ b/chromium/ui/webui/resources/cr_components/app_management/permission_constants.ts
@@ -4,6 +4,4 @@
import {PermissionType} from './app_management.mojom-webui.js';
-export {Permission, PermissionType, PermissionValue, TriState} from './app_management.mojom-webui.js';
-
export type PermissionTypeIndex = keyof typeof PermissionType;
diff --git a/chromium/ui/webui/resources/cr_components/app_management/permission_item.ts b/chromium/ui/webui/resources/cr_components/app_management/permission_item.ts
index 60959a72bdb..193b8ce2e3e 100644
--- a/chromium/ui/webui/resources/cr_components/app_management/permission_item.ts
+++ b/chromium/ui/webui/resources/cr_components/app_management/permission_item.ts
@@ -4,13 +4,13 @@
import './app_management_shared_style.css.js';
import './toggle_row.js';
-import {assert, assertNotReached} from '//resources/js/assert.m.js';
+import {assert, assertNotReached} from '//resources/js/assert_ts.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {App, Permission} from './app_management.mojom-webui.js';
+import {App, Permission, PermissionType, TriState} from './app_management.mojom-webui.js';
import {BrowserProxy} from './browser_proxy.js';
import {AppManagementUserAction} from './constants.js';
-import {PermissionType, PermissionTypeIndex, TriState} from './permission_constants.js';
+import {PermissionTypeIndex} from './permission_constants.js';
import {getTemplate} from './permission_item.html.js';
import {createBoolPermission, createTriStatePermission, getBoolPermissionValue, getTriStatePermissionValue, isBoolValue, isTriStateValue} from './permission_util.js';
import {AppManagementToggleRowElement} from './toggle_row.js';
@@ -81,35 +81,33 @@ export class AppManagementPermissionItemElement extends PolymerElement {
this.addEventListener('change', this.togglePermission_);
}
- private isAvailable_(app: App, permissionType: PermissionTypeIndex): boolean {
+ private isAvailable_(
+ app: App|undefined,
+ permissionType: PermissionTypeIndex|undefined): boolean {
if (app === undefined || permissionType === undefined) {
return false;
}
- assert(app);
-
return getPermission(app, permissionType) !== undefined;
}
- private isManaged_(app: App, permissionType: PermissionTypeIndex): boolean {
+ private isManaged_(app: App|undefined, permissionType: PermissionTypeIndex):
+ boolean {
if (app === undefined || permissionType === undefined ||
!this.isAvailable_(app, permissionType)) {
return false;
}
- assert(app);
const permission = getPermission(app, permissionType);
-
- assert(permission);
return permission.isManaged;
}
- private getValue_(app: App, permissionType: PermissionTypeIndex): boolean {
+ private getValue_(
+ app: App|undefined,
+ permissionType: PermissionTypeIndex|undefined): boolean {
if (app === undefined || permissionType === undefined) {
return false;
}
- assert(app);
-
return getPermissionValueBool(app, permissionType);
}
@@ -136,8 +134,6 @@ export class AppManagementPermissionItemElement extends PolymerElement {
* called when `syncPermissionManually` is set.
*/
syncPermission() {
- assert(this.app);
-
let newPermission: Permission|undefined = undefined;
let newBoolState = false; // to keep the closure compiler happy.
@@ -207,10 +203,8 @@ export class AppManagementPermissionItemElement extends PolymerElement {
break;
default:
assertNotReached();
- newPermissionValue = TriState.kBlock;
}
- assert(newPermissionValue !== undefined);
return createTriStatePermission(
PermissionType[permissionType], newPermissionValue,
currentPermission.isManaged);
@@ -251,7 +245,6 @@ export class AppManagementPermissionItemElement extends PolymerElement {
default:
assertNotReached();
- return AppManagementUserAction.NOTIFICATIONS_TURNED_ON;
}
}
}
diff --git a/chromium/ui/webui/resources/cr_components/app_management/permission_util.ts b/chromium/ui/webui/resources/cr_components/app_management/permission_util.ts
index 79f7273be04..bf91914155a 100644
--- a/chromium/ui/webui/resources/cr_components/app_management/permission_util.ts
+++ b/chromium/ui/webui/resources/cr_components/app_management/permission_util.ts
@@ -2,10 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
+import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js';
-import {Permission} from './app_management.mojom-webui.js';
-import {PermissionType, PermissionValue, TriState} from './permission_constants.js';
+import {Permission, PermissionType, PermissionValue, TriState} from './app_management.mojom-webui.js';
export function createPermission(
permissionType: PermissionType, value: PermissionValue,
@@ -65,10 +64,11 @@ export function createTriStatePermission(
export function isPermissionEnabled(permissionValue: PermissionValue): boolean {
if (isBoolValue(permissionValue)) {
return getBoolPermissionValue(permissionValue)!;
- } else if (isTriStateValue(permissionValue)) {
+ }
+
+ if (isTriStateValue(permissionValue)) {
return getTriStatePermissionValue(permissionValue) === TriState.kAllow;
- } else {
- assertNotReached();
- return false;
}
+
+ assertNotReached();
}
diff --git a/chromium/ui/webui/resources/cr_components/app_management/run_on_os_login_item.ts b/chromium/ui/webui/resources/cr_components/app_management/run_on_os_login_item.ts
index 24553a97147..0898c828312 100644
--- a/chromium/ui/webui/resources/cr_components/app_management/run_on_os_login_item.ts
+++ b/chromium/ui/webui/resources/cr_components/app_management/run_on_os_login_item.ts
@@ -5,7 +5,7 @@
import './app_management_shared_style.css.js';
import './toggle_row.js';
-import {assert, assertNotReached} from '//resources/js/assert.m.js';
+import {assert, assertNotReached} from '//resources/js/assert_ts.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {App} from './app_management.mojom-webui.js';
@@ -15,6 +15,25 @@ import {getTemplate} from './run_on_os_login_item.html.js';
import {AppManagementToggleRowElement} from './toggle_row.js';
import {recordAppManagementUserAction} from './util.js';
+function convertModeToBoolean(runOnOsLoginMode: RunOnOsLoginMode): boolean {
+ switch (runOnOsLoginMode) {
+ case RunOnOsLoginMode.kNotRun:
+ return false;
+ case RunOnOsLoginMode.kWindowed:
+ return true;
+ default:
+ assertNotReached();
+ }
+}
+
+function getRunOnOsLoginModeBoolean(runOnOsLoginMode: RunOnOsLoginMode):
+ boolean {
+ assert(
+ runOnOsLoginMode !== RunOnOsLoginMode.kUnknown,
+ 'Run on OS Login Mode is not set');
+ return convertModeToBoolean(runOnOsLoginMode);
+}
+
export class AppManagementRunOnOsLoginItemElement extends PolymerElement {
static get is() {
return 'app-management-run-on-os-login-item';
@@ -32,7 +51,7 @@ export class AppManagementRunOnOsLoginItemElement extends PolymerElement {
};
}
- loginModeLabel: String;
+ loginModeLabel: string;
app: App;
override ready() {
@@ -41,30 +60,20 @@ export class AppManagementRunOnOsLoginItemElement extends PolymerElement {
this.addEventListener('change', this.toggleOsLoginMode_);
}
- private isManaged_(app: App): boolean {
- if (app === undefined) {
- return false;
- }
- assert(app);
-
- const loginData = app.runOnOsLogin;
+ private isManaged_(): boolean {
+ const loginData = this.app.runOnOsLogin;
if (loginData) {
return loginData.isManaged;
}
return false;
}
- private getValue_(app: App): boolean {
- if (app === undefined) {
- return false;
- }
- assert(app);
-
- const loginMode = this.getRunOnOsLoginMode(app);
+ private getValue_(): boolean {
+ const loginMode = this.getRunOnOsLoginMode();
assert(loginMode);
if (loginMode) {
- return this.getRunOnOsLoginModeBoolean(loginMode);
+ return getRunOnOsLoginModeBoolean(loginMode);
}
return false;
}
@@ -91,7 +100,7 @@ export class AppManagementRunOnOsLoginItemElement extends PolymerElement {
newRunOnOsLoginMode,
);
const booleanRunOnOsLoginMode =
- this.getRunOnOsLoginModeBoolean(newRunOnOsLoginMode);
+ getRunOnOsLoginModeBoolean(newRunOnOsLoginMode);
const runOnOsLoginModeChangeAction = booleanRunOnOsLoginMode ?
AppManagementUserAction.RUN_ON_OS_LOGIN_MODE_TURNED_ON :
AppManagementUserAction.RUN_ON_OS_LOGIN_MODE_TURNED_OFF;
@@ -99,32 +108,12 @@ export class AppManagementRunOnOsLoginItemElement extends PolymerElement {
}
}
- private getRunOnOsLoginMode(app: App): RunOnOsLoginMode|null {
- if (app.runOnOsLogin) {
- return app.runOnOsLogin.loginMode;
+ private getRunOnOsLoginMode(): RunOnOsLoginMode|null {
+ if (this.app.runOnOsLogin) {
+ return this.app.runOnOsLogin.loginMode;
}
return null;
}
-
- private convertModeToBoolean(runOnOsLoginMode: RunOnOsLoginMode): boolean {
- switch (runOnOsLoginMode) {
- case RunOnOsLoginMode.kNotRun:
- return false;
- case RunOnOsLoginMode.kWindowed:
- return true;
- default:
- assertNotReached();
- return false;
- }
- }
-
- private getRunOnOsLoginModeBoolean(runOnOsLoginMode: RunOnOsLoginMode):
- boolean {
- assert(
- runOnOsLoginMode !== RunOnOsLoginMode.kUnknown,
- 'Run on OS Login Mode is not set');
- return this.convertModeToBoolean(runOnOsLoginMode);
- }
}
declare global {
diff --git a/chromium/ui/webui/resources/cr_components/app_management/toggle_row.ts b/chromium/ui/webui/resources/cr_components/app_management/toggle_row.ts
index f5f8c6ddafb..c24c9aebf17 100644
--- a/chromium/ui/webui/resources/cr_components/app_management/toggle_row.ts
+++ b/chromium/ui/webui/resources/cr_components/app_management/toggle_row.ts
@@ -2,11 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import './app_management_shared_style.css.js';
-import '//resources/cr_elements/cr_toggle/cr_toggle.m.js';
+import '//resources/cr_elements/cr_toggle/cr_toggle.js';
import '//resources/cr_elements/policy/cr_policy_indicator.m.js';
import '//resources/cr_elements/icons.m.js';
-import {CrToggleElement} from '//resources/cr_elements/cr_toggle/cr_toggle.m.js';
+import {CrToggleElement} from '//resources/cr_elements/cr_toggle/cr_toggle.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {getTemplate} from './toggle_row.html.js';
diff --git a/chromium/ui/webui/resources/cr_components/app_management/uninstall_button.ts b/chromium/ui/webui/resources/cr_components/app_management/uninstall_button.ts
index 95af8426b8b..ab5a62f39f9 100644
--- a/chromium/ui/webui/resources/cr_components/app_management/uninstall_button.ts
+++ b/chromium/ui/webui/resources/cr_components/app_management/uninstall_button.ts
@@ -3,10 +3,10 @@
// found in the LICENSE file.
import './app_management_shared_style.css.js';
-import '//resources/cr_elements/cr_button/cr_button.m.js';
+import '//resources/cr_elements/cr_button/cr_button.js';
import '//resources/cr_elements/policy/cr_tooltip_icon.m.js';
-import {assertNotReached} from '//resources/js/assert.m.js';
+import {assertNotReached} from '//resources/js/assert_ts.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {App} from './app_management.mojom-webui.js';
@@ -39,12 +39,8 @@ export class AppManamentUninstallButtonElement extends PolymerElement {
/**
* Returns true if the button should be disabled due to app install type.
*/
- getDisableState_(app: App): boolean {
- if (!app) {
- return true;
- }
-
- switch (app.installReason) {
+ private getDisableState_(): boolean {
+ switch (this.app.installReason) {
case InstallReason.kSystem:
case InstallReason.kPolicy:
return true;
@@ -56,28 +52,21 @@ export class AppManamentUninstallButtonElement extends PolymerElement {
return false;
default:
assertNotReached();
- return false;
}
}
/**
* Returns true if the app was installed by a policy.
*/
- private showPolicyIndicator_(app: App): boolean {
- if (!app) {
- return false;
- }
- return app.installReason === InstallReason.kPolicy;
+ private showPolicyIndicator_(): boolean {
+ return this.app.installReason === InstallReason.kPolicy;
}
/**
* Returns true if the uninstall button should be shown.
*/
- private showUninstallButton_(app: App): boolean {
- if (!app) {
- return false;
- }
- return app.installReason !== InstallReason.kSystem;
+ private showUninstallButton_(): boolean {
+ return this.app.installReason !== InstallReason.kSystem;
}
private onClick_() {
diff --git a/chromium/ui/webui/resources/cr_components/app_management/util.ts b/chromium/ui/webui/resources/cr_components/app_management/util.ts
index c9ec38d6088..91dbeb3eddd 100644
--- a/chromium/ui/webui/resources/cr_components/app_management/util.ts
+++ b/chromium/ui/webui/resources/cr_components/app_management/util.ts
@@ -2,22 +2,22 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
+import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js';
-import {App} from './app_management.mojom-webui.js';
+import {App, PermissionType} from './app_management.mojom-webui.js';
import {BrowserProxy} from './browser_proxy.js';
import {AppManagementUserAction, AppType, OptionalBool} from './constants.js';
-import {PermissionType, PermissionTypeIndex} from './permission_constants.js';
+import {PermissionTypeIndex} from './permission_constants.js';
import {isPermissionEnabled} from './permission_util.js';
/**
* @fileoverview Utility functions for the App Management page.
*/
-type AppManagementPageState = {
- apps: Record<string, App>,
- selectedAppId: string|null,
-};
+interface AppManagementPageState {
+ apps: Record<string, App>;
+ selectedAppId: string|null;
+}
export function createEmptyState(): AppManagementPageState {
return {
@@ -26,7 +26,7 @@ export function createEmptyState(): AppManagementPageState {
};
}
-export function createInitialState(apps: Array<App>): AppManagementPageState {
+export function createInitialState(apps: App[]): AppManagementPageState {
const initialState = createEmptyState();
for (const app of apps) {
@@ -78,7 +78,6 @@ export function toggleOptionalBool(bool: OptionalBool): OptionalBool {
return OptionalBool.kFalse;
default:
assertNotReached();
- return OptionalBool.kFalse;
}
}
@@ -90,7 +89,6 @@ export function convertOptionalBoolToBool(optionalBool: OptionalBool): boolean {
return false;
default:
assertNotReached();
- return false;
}
}
@@ -112,7 +110,6 @@ function getUserActionHistogramNameForAppType(appType: AppType): string {
return 'AppManagement.AppDetailViews.BorealisApp';
default:
assertNotReached();
- return '';
}
}
diff --git a/chromium/ui/webui/resources/cr_components/app_management/window_mode_item.ts b/chromium/ui/webui/resources/cr_components/app_management/window_mode_item.ts
index 12736123d32..6794304a969 100644
--- a/chromium/ui/webui/resources/cr_components/app_management/window_mode_item.ts
+++ b/chromium/ui/webui/resources/cr_components/app_management/window_mode_item.ts
@@ -5,7 +5,7 @@
import './app_management_shared_style.css.js';
import './toggle_row.js';
-import {assert, assertNotReached} from '//resources/js/assert.m.js';
+import {assert, assertNotReached} from '//resources/js/assert_ts.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {App} from './app_management.mojom-webui.js';
@@ -15,6 +15,22 @@ import {AppManagementToggleRowElement} from './toggle_row.js';
import {recordAppManagementUserAction} from './util.js';
import {getTemplate} from './window_mode_item.html.js';
+function convertWindowModeToBool(windowMode: WindowMode): boolean {
+ switch (windowMode) {
+ case WindowMode.kBrowser:
+ return false;
+ case WindowMode.kWindow:
+ return true;
+ default:
+ assertNotReached();
+ }
+}
+
+function getWindowModeBoolean(windowMode: WindowMode): boolean {
+ assert(windowMode !== WindowMode.kUnknown, 'Window Mode Not Set');
+ return convertWindowModeToBool(windowMode);
+}
+
export class AppManagementWindowModeElement extends PolymerElement {
static get is() {
return 'app-management-window-mode-item';
@@ -30,12 +46,15 @@ export class AppManagementWindowModeElement extends PolymerElement {
app: Object,
- hidden:
- {type: Boolean, computed: 'isHidden_(app)', reflectToAttribute: true},
+ hidden: {
+ type: Boolean,
+ computed: 'isHidden_(app)',
+ reflectToAttribute: true,
+ },
};
}
- windowModeLabel: String;
+ windowModeLabel: string;
app: App;
override ready() {
@@ -44,12 +63,8 @@ export class AppManagementWindowModeElement extends PolymerElement {
this.addEventListener('change', this.toggleWindowMode_);
}
- private getValue_(app: App): boolean {
- if (app === undefined) {
- return false;
- }
- assert(app);
- return this.getWindowModeBoolean(app.windowMode);
+ private getValue_(): boolean {
+ return getWindowModeBoolean(this.app.windowMode);
}
private onClick_() {
@@ -57,8 +72,7 @@ export class AppManagementWindowModeElement extends PolymerElement {
.querySelector<AppManagementToggleRowElement>('#toggle-row')!.click();
}
- toggleWindowMode_() {
- assert(this.app);
+ private toggleWindowMode_() {
const currentWindowMode = this.app.windowMode;
if (currentWindowMode === WindowMode.kUnknown) {
assertNotReached();
@@ -70,32 +84,15 @@ export class AppManagementWindowModeElement extends PolymerElement {
this.app.id,
newWindowMode,
);
- const booleanWindowMode = this.getWindowModeBoolean(newWindowMode);
+ const booleanWindowMode = getWindowModeBoolean(newWindowMode);
const windowModeChangeAction = booleanWindowMode ?
AppManagementUserAction.WINDOW_MODE_CHANGED_TO_WINDOW :
AppManagementUserAction.WINDOW_MODE_CHANGED_TO_BROWSER;
recordAppManagementUserAction(this.app.type, windowModeChangeAction);
}
- private convertWindowModeToBool(windowMode: WindowMode): boolean {
- switch (windowMode) {
- case WindowMode.kBrowser:
- return false;
- case WindowMode.kWindow:
- return true;
- default:
- assertNotReached();
- return false;
- }
- }
-
- private getWindowModeBoolean(windowMode: WindowMode): boolean {
- assert(windowMode !== WindowMode.kUnknown, 'Window Mode Not Set');
- return this.convertWindowModeToBool(windowMode);
- }
-
- private isHidden_(app: App): Boolean {
- return app.hideWindowMode;
+ private isHidden_(): boolean {
+ return this.app.hideWindowMode;
}
}
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/BUILD.gn b/chromium/ui/webui/resources/cr_components/certificate_manager/BUILD.gn
index 33d7ddecbe5..afef6f3fe65 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/BUILD.gn
@@ -8,6 +8,7 @@ import("//tools/polymer/css_to_wrapper.gni")
import("//tools/polymer/html_to_wrapper.gni")
import("//tools/typescript/ts_library.gni")
import("//ui/webui/resources/tools/generate_grd.gni")
+import("//ui/webui/webui_features.gni")
import("certificate_manager.gni")
assert(use_nss_certs)
@@ -15,55 +16,57 @@ assert(use_nss_certs)
preprocess_folder_tmp = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/certificate_manager_tmp"
preprocess_folder = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/certificate_manager"
-ts_library("build_ts") {
- root_dir = preprocess_folder_tmp
- out_dir = preprocess_folder
- composite = true
- tsconfig_base = "tsconfig_base.json"
- in_files = ts_files + css_wrapper_files + html_wrapper_files
- definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ]
-
- deps = [
- "//third_party/polymer/v3_0:library",
- "//ui/webui/resources:library",
- ]
- extra_deps = [
- ":preprocess_generated",
- ":preprocess_src",
+preprocess_if_expr("preprocess") {
+ visibility = [
+ ":build_ts",
+ ":css_wrapper_files",
+ ":html_wrapper_files",
]
+ in_folder = "."
+ out_folder = preprocess_folder_tmp
+ in_files = ts_files + html_files + css_files
}
css_to_wrapper("css_wrapper_files") {
- visibility = [ ":preprocess_generated" ]
+ deps = [ ":preprocess" ]
+ in_folder = preprocess_folder_tmp
+ out_folder = preprocess_folder_tmp
in_files = css_files
+ minify = optimize_webui
}
html_to_wrapper("html_wrapper_files") {
+ deps = [ ":preprocess" ]
+ in_folder = preprocess_folder_tmp
+ out_folder = preprocess_folder_tmp
in_files = html_files
+ minify = optimize_webui
}
-preprocess_if_expr("preprocess_src") {
- visibility = [ ":build_ts" ]
- in_folder = "."
- out_folder = preprocess_folder_tmp
- in_files = ts_files
-}
+ts_library("build_ts") {
+ root_dir = preprocess_folder_tmp
+ out_dir = preprocess_folder
+ composite = true
+ tsconfig_base = "tsconfig_base.json"
+ in_files = ts_files + css_wrapper_files + html_wrapper_files
+ definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ]
-preprocess_if_expr("preprocess_generated") {
- visibility = [ ":build_ts" ]
deps = [
+ "//third_party/polymer/v3_0:library",
+ "//ui/webui/resources:library",
+ ]
+ extra_deps = [
":css_wrapper_files",
":html_wrapper_files",
+ ":preprocess",
]
- in_folder = target_gen_dir
- out_folder = preprocess_folder_tmp
- in_files = html_wrapper_files + css_wrapper_files
}
generate_grd("build_grdp") {
grd_prefix = "cr_components_certificate_manager"
out_grd = "$target_gen_dir/resources.grdp"
public_deps = [ ":build_ts" ]
- manifest_files = [ "$target_gen_dir/tsconfig.manifest" ]
+ manifest_files =
+ filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
resource_path_prefix = "cr_components/certificate_manager"
}
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.ts b/chromium/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.ts
index ace147ede1e..636aeaa1493 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.ts
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.ts
@@ -8,17 +8,17 @@
* imported.
* - edit the trust level of an already existing certificate authority.
*/
-import '../../cr_elements/cr_button/cr_button.m.js';
-import '../../cr_elements/cr_checkbox/cr_checkbox.m.js';
-import '../../cr_elements/cr_dialog/cr_dialog.m.js';
+import '../../cr_elements/cr_button/cr_button.js';
+import '../../cr_elements/cr_checkbox/cr_checkbox.js';
+import '../../cr_elements/cr_dialog/cr_dialog.js';
import 'chrome://resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js';
import './certificate_shared.css.js';
import {PaperSpinnerLiteElement} from 'chrome://resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CrCheckboxElement} from '../../cr_elements/cr_checkbox/cr_checkbox.m.js';
-import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.m.js';
+import {CrCheckboxElement} from '../../cr_elements/cr_checkbox/cr_checkbox.js';
+import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.js';
import {I18nMixin} from '../../js/i18n_mixin.js';
import {loadTimeData} from '../../js/load_time_data.m.js';
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.ts b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.ts
index 0c1868b4d79..662e1762c3b 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.ts
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.ts
@@ -6,13 +6,13 @@
* @fileoverview A confirmation dialog allowing the user to delete various types
* of certificates.
*/
-import '../../cr_elements/cr_button/cr_button.m.js';
-import '../../cr_elements/cr_dialog/cr_dialog.m.js';
+import '../../cr_elements/cr_button/cr_button.js';
+import '../../cr_elements/cr_dialog/cr_dialog.js';
import './certificate_shared.css.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.m.js';
+import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.js';
import {assertNotReached} from '../../js/assert_ts.js';
import {I18nMixin} from '../../js/i18n_mixin.js';
import {loadTimeData} from '../../js/load_time_data.m.js';
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_entry.ts b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_entry.ts
index ac619cc8ef8..6c4ada26e98 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_entry.ts
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_entry.ts
@@ -5,7 +5,7 @@
/**
* @fileoverview An element that represents an SSL certificate entry.
*/
-import '../../cr_elements/cr_expand_button/cr_expand_button.m.js';
+import '../../cr_elements/cr_expand_button/cr_expand_button.js';
import '../../cr_elements/policy/cr_policy_indicator.m.js';
import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
import './certificate_shared.css.js';
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_list.html b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_list.html
index fd6a180ab6b..418e0ed5ac9 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_list.html
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_list.html
@@ -18,7 +18,7 @@
<cr-button id="import" on-click="onImportTap_"
hidden="[[!canImport_(certificateType, importAllowed, isKiosk_)]]">
[[i18n('certificateManagerImport')]]</cr-button>
-<if expr="chromeos_ash or chromeos_lacros">
+<if expr="is_chromeos">
<cr-button id="importAndBind" on-click="onImportAndBindTap_"
hidden="[[!canImportAndBind_(certificateType, importAllowed,
isGuest_)]]">
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_list.ts b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_list.ts
index 5ce51189323..d2d1355a0c1 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_list.ts
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_list.ts
@@ -6,7 +6,7 @@
* @fileoverview 'certificate-list' is an element that displays a list of
* certificates.
*/
-import '../../cr_elements/cr_button/cr_button.m.js';
+import '../../cr_elements/cr_button/cr_button.js';
import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
import './certificate_entry.js';
import './certificate_shared.css.js';
@@ -24,7 +24,7 @@ import {CertificatesBrowserProxyImpl, CertificatesError, CertificatesImportError
export interface CertificateListElement {
$: {
import: HTMLElement,
- // <if expr="chromeos_ash or chromeos_lacros">
+ // <if expr="is_chromeos">
importAndBind: HTMLElement,
// </if>
};
@@ -53,7 +53,7 @@ export class CertificateListElement extends CertificateListElementBase {
certificateType: String,
importAllowed: Boolean,
- // <if expr="chromeos_ash or chromeos_lacros">
+ // <if expr="is_chromeos">
isGuest_: {
type: Boolean,
value() {
@@ -73,10 +73,10 @@ export class CertificateListElement extends CertificateListElementBase {
};
}
- certificates: Array<CertificatesOrgGroup>;
+ certificates: CertificatesOrgGroup[];
certificateType: CertificateType;
importAllowed: boolean;
- // <if expr="chromeos_ash or chromeos_lacros">
+ // <if expr="is_chromeos">
private isGuest_: boolean;
// </if>
private isKiosk_: boolean;
@@ -105,7 +105,7 @@ export class CertificateListElement extends CertificateListElementBase {
this.importAllowed;
}
- // <if expr="chromeos_ash or chromeos_lacros">
+ // <if expr="is_chromeos">
private canImportAndBind_(): boolean {
return !this.isGuest_ &&
this.certificateType === CertificateType.PERSONAL && this.importAllowed;
@@ -152,7 +152,7 @@ export class CertificateListElement extends CertificateListElementBase {
this.handleImport_(false, e.target as HTMLElement);
}
- // <if expr="chromeos_ash or chromeos_lacros">
+ // <if expr="is_chromeos">
private onImportAndBindTap_(e: Event) {
this.handleImport_(true, e.target as HTMLElement);
}
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.gni b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.gni
index 3da673760c8..521ffb8a4c2 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.gni
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.gni
@@ -17,7 +17,7 @@ _web_component_files = [
"certificates_error_dialog.ts",
]
-if (is_chromeos_ash) {
+if (is_chromeos) {
_web_component_files += [
"certificate_provisioning_details_dialog.ts",
"certificate_provisioning_entry.ts",
@@ -42,7 +42,7 @@ _non_web_component_files = [
"certificates_browser_proxy.ts",
]
-if (is_chromeos_ash) {
+if (is_chromeos) {
_non_web_component_files += [ "certificate_provisioning_browser_proxy.ts" ]
}
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.html b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.html
index 5003f3e38a5..a1bca9aa7f5 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.html
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.html
@@ -37,7 +37,7 @@
certificate-type="[[certificateTypeEnum_.PERSONAL]]"
import-allowed="[[clientImportAllowed]]">
</certificate-list>
-<if expr="chromeos_ash">
+<if expr="is_chromeos">
<certificate-provisioning-list></certificate-provisioning-list>
</if>
</div>
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.ts b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.ts
index bd8b81205d6..00141d64984 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.ts
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager.ts
@@ -14,9 +14,8 @@ import './certificate_list.js';
import './certificate_password_decryption_dialog.js';
import './certificate_password_encryption_dialog.js';
import './certificates_error_dialog.js';
-// <if expr="chromeos_ash">
+// <if expr="is_chromeos">
import './certificate_provisioning_list.js';
-
// </if>
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -147,10 +146,10 @@ export class CertificateManagerElement extends CertificateManagerElementBase {
}
selected: number;
- personalCerts: Array<CertificatesOrgGroup>;
- serverCerts: Array<CertificatesOrgGroup>;
- caCerts: Array<CertificatesOrgGroup>;
- otherCerts: Array<CertificatesOrgGroup>;
+ personalCerts: CertificatesOrgGroup[];
+ serverCerts: CertificatesOrgGroup[];
+ caCerts: CertificatesOrgGroup[];
+ otherCerts: CertificatesOrgGroup[];
clientImportAllowed: boolean;
caImportAllowed: boolean;
private showCaTrustEditDialog_: boolean;
@@ -265,7 +264,7 @@ export class CertificateManagerElement extends CertificateManagerElementBase {
}, 0);
}
- private computeTabNames_(): Array<string> {
+ private computeTabNames_(): string[] {
return [
loadTimeData.getString('certificateManagerYourCertificates'),
...(this.isKiosk_ ?
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager_types.ts b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager_types.ts
index eafa9816de8..9a2c5900794 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager_types.ts
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_manager_types.ts
@@ -7,7 +7,7 @@
*/
// clang-format off
-// <if expr="chromeos_ash">
+// <if expr="is_chromeos">
import {CertificateProvisioningProcess} from './certificate_provisioning_browser_proxy.js';
// </if>
import {CertificatesError, CertificatesImportError,CertificateSubnode, CertificateType, NewCertificateSubNode} from './certificates_browser_proxy.js';
@@ -16,20 +16,20 @@ import {CertificatesError, CertificatesImportError,CertificateSubnode, Certifica
/**
* The payload of the 'certificate-action' event.
*/
-export type CertificateActionEventDetail = {
- action: CertificateAction,
- subnode: CertificateSubnode|NewCertificateSubNode|null,
- certificateType: CertificateType,
- anchor: HTMLElement,
-};
+export interface CertificateActionEventDetail {
+ action: CertificateAction;
+ subnode: CertificateSubnode|NewCertificateSubNode|null;
+ certificateType: CertificateType;
+ anchor: HTMLElement;
+}
/**
* The payload of the 'certificates-error' event.
*/
-export type CertificatesErrorEventDetail = {
- error: CertificatesError|CertificatesImportError|null,
- anchor: HTMLElement|null,
-};
+export interface CertificatesErrorEventDetail {
+ error: CertificatesError|CertificatesImportError|null;
+ anchor: HTMLElement|null;
+}
/**
* Enumeration of actions that require a popup menu to be shown to the user.
@@ -47,14 +47,14 @@ export enum CertificateAction {
*/
export const CertificateActionEvent = 'certificate-action';
-// <if expr="chromeos_ash">
+// <if expr="is_chromeos">
/**
* The payload of the 'certificate-provisioning-view-details-action' event.
*/
-export type CertificateProvisioningActionEventDetail = {
- model: CertificateProvisioningProcess,
- anchor: HTMLElement,
-};
+export interface CertificateProvisioningActionEventDetail {
+ model: CertificateProvisioningProcess;
+ anchor: HTMLElement;
+}
// </if>
/**
@@ -69,7 +69,7 @@ declare global {
interface HTMLElementEventMap {
'certificates-error': CustomEvent<CertificatesErrorEventDetail>;
'certificate-action': CustomEvent<CertificateActionEventDetail>;
- // <if expr="chromeos_ash">
+ // <if expr="is_chromeos">
'certificate-provisioning-view-details-action':
CustomEvent<CertificateProvisioningActionEventDetail>;
// </if>
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.ts b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.ts
index 0ed92343124..3a45ca1b0f2 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.ts
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.ts
@@ -6,15 +6,15 @@
* @fileoverview A dialog prompting the user for a decryption password such that
* a previously exported personal certificate can be imported.
*/
-import '../../cr_elements/cr_button/cr_button.m.js';
-import '../../cr_elements/cr_dialog/cr_dialog.m.js';
-import '../../cr_elements/cr_input/cr_input.m.js';
+import '../../cr_elements/cr_button/cr_button.js';
+import '../../cr_elements/cr_dialog/cr_dialog.js';
+import '../../cr_elements/cr_input/cr_input.js';
import './certificate_shared.css.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CrButtonElement} from '../../cr_elements/cr_button/cr_button.m.js';
-import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.m.js';
+import {CrButtonElement} from '../../cr_elements/cr_button/cr_button.js';
+import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.js';
import {I18nMixin} from '../../js/i18n_mixin.js';
import {getTemplate} from './certificate_password_decryption_dialog.html.js';
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.ts b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.ts
index b1d44b3aaf5..ed7eb7e614c 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.ts
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.ts
@@ -6,16 +6,16 @@
* @fileoverview A dialog prompting the user to encrypt a personal certificate
* before it is exported to disk.
*/
-import '../../cr_elements/cr_button/cr_button.m.js';
-import '../../cr_elements/cr_dialog/cr_dialog.m.js';
-import '../../cr_elements/cr_input/cr_input.m.js';
+import '../../cr_elements/cr_button/cr_button.js';
+import '../../cr_elements/cr_dialog/cr_dialog.js';
+import '../../cr_elements/cr_input/cr_input.js';
import '../../cr_elements/shared_vars_css.m.js';
import './certificate_shared.css.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CrButtonElement} from '../../cr_elements/cr_button/cr_button.m.js';
-import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.m.js';
+import {CrButtonElement} from '../../cr_elements/cr_button/cr_button.js';
+import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.js';
import {I18nMixin} from '../../js/i18n_mixin.js';
import {getTemplate} from './certificate_password_encryption_dialog.html.js';
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_browser_proxy.ts b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_browser_proxy.ts
index 2ca9840c3ac..a73baa818ab 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_browser_proxy.ts
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_browser_proxy.ts
@@ -15,16 +15,16 @@
*
* @see chrome/browser/ui/webui/settings/certificates_handler.cc
*/
-export type CertificateProvisioningProcess = {
- certProfileId: string,
- certProfileName: string,
- isDeviceWide: boolean,
- lastUnsuccessfulMessage: string,
- status: string,
- stateId: number,
- timeSinceLastUpdate: string,
- publicKey: string,
-};
+export interface CertificateProvisioningProcess {
+ certProfileId: string;
+ certProfileName: string;
+ isDeviceWide: boolean;
+ lastUnsuccessfulMessage: string;
+ status: string;
+ stateId: number;
+ timeSinceLastUpdate: string;
+ publicKey: string;
+}
export interface CertificateProvisioningBrowserProxy {
/**
@@ -39,8 +39,7 @@ export interface CertificateProvisioningBrowserProxy {
* provisioning process identified by |certProfileId|.
* This is Chrome OS specific, but always present for simplicity.
*/
- triggerCertificateProvisioningProcessUpdate(
- certProfileId: string, isDeviceWide: boolean): void;
+ triggerCertificateProvisioningProcessUpdate(certProfileId: string): void;
}
export class CertificateProvisioningBrowserProxyImpl implements
@@ -49,11 +48,8 @@ export class CertificateProvisioningBrowserProxyImpl implements
chrome.send('refreshCertificateProvisioningProcessses');
}
- triggerCertificateProvisioningProcessUpdate(
- certProfileId: string, isDeviceWide: boolean) {
- chrome.send(
- 'triggerCertificateProvisioningProcessUpdate',
- [certProfileId, isDeviceWide]);
+ triggerCertificateProvisioningProcessUpdate(certProfileId: string) {
+ chrome.send('triggerCertificateProvisioningProcessUpdate', [certProfileId]);
}
static getInstance(): CertificateProvisioningBrowserProxy {
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_details_dialog.ts b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_details_dialog.ts
index cb697a9deb7..e48e4dc489a 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_details_dialog.ts
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_details_dialog.ts
@@ -6,13 +6,13 @@
* @fileoverview 'certificate-provisioning-details-dialog' allows the user to
* view the details of an in-progress certiifcate provisioning process.
*/
-import '../../cr_elements/cr_expand_button/cr_expand_button.m.js';
-import '../../cr_elements/cr_dialog/cr_dialog.m.js';
+import '../../cr_elements/cr_expand_button/cr_expand_button.js';
+import '../../cr_elements/cr_dialog/cr_dialog.js';
import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.m.js';
+import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.js';
import {I18nMixin} from '../../js/i18n_mixin.js';
import {CertificateProvisioningBrowserProxyImpl, CertificateProvisioningProcess} from './certificate_provisioning_browser_proxy.js';
@@ -54,8 +54,7 @@ export class CertificateProvisioningDetailsDialogElement extends
private onRefresh_() {
CertificateProvisioningBrowserProxyImpl.getInstance()
- .triggerCertificateProvisioningProcessUpdate(
- this.model.certProfileId, this.model.isDeviceWide);
+ .triggerCertificateProvisioningProcessUpdate(this.model.certProfileId);
}
private shouldHideLastFailedStatus_(): boolean {
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_entry.ts b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_entry.ts
index 6319f4de77e..7f63d99c792 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_entry.ts
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_entry.ts
@@ -7,15 +7,15 @@
* one certificate provisioning processes.
*/
import '../../cr_elements/cr_action_menu/cr_action_menu.js';
-import '../../cr_elements/cr_icon_button/cr_icon_button.m.js';
-import '../../cr_elements/cr_lazy_render/cr_lazy_render.m.js';
+import '../../cr_elements/cr_icon_button/cr_icon_button.js';
+import '../../cr_elements/cr_lazy_render/cr_lazy_render.js';
import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
import './certificate_shared.css.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {CrActionMenuElement} from '../../cr_elements/cr_action_menu/cr_action_menu.js';
-import {CrLazyRenderElement} from '../../cr_elements/cr_lazy_render/cr_lazy_render.m.js';
+import {CrLazyRenderElement} from '../../cr_elements/cr_lazy_render/cr_lazy_render.js';
import {I18nMixin} from '../../js/i18n_mixin.js';
import {CertificateProvisioningViewDetailsActionEvent} from './certificate_manager_types.js';
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_list.ts b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_list.ts
index 6044a0b212c..32f1e6b0097 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_list.ts
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_list.ts
@@ -40,7 +40,7 @@ export class CertificateProvisioningListElement extends
type: Array,
value() {
return [];
- }
+ },
},
/**
@@ -52,7 +52,7 @@ export class CertificateProvisioningListElement extends
};
}
- private provisioningProcesses_: Array<CertificateProvisioningProcess>;
+ private provisioningProcesses_: CertificateProvisioningProcess[];
private provisioningDetailsDialogModel_: CertificateProvisioningProcess|null;
private showProvisioningDetailsDialog_: boolean;
private previousAnchor_: HTMLElement|null = null;
@@ -63,7 +63,7 @@ export class CertificateProvisioningListElement extends
* @return Whether |provisioningProcesses| contains at least one entry.
*/
private hasCertificateProvisioningEntries_(
- provisioningProcesses: Array<CertificateProvisioningProcess>): boolean {
+ provisioningProcesses: CertificateProvisioningProcess[]): boolean {
return provisioningProcesses.length !== 0;
}
@@ -72,7 +72,7 @@ export class CertificateProvisioningListElement extends
* provisioning processes
*/
private onCertificateProvisioningProcessesChanged_(
- certProvisioningProcesses: Array<CertificateProvisioningProcess>) {
+ certProvisioningProcesses: CertificateProvisioningProcess[]) {
this.provisioningProcesses_ = certProvisioningProcesses;
// If a cert provisioning process details dialog is being shown, update its
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.ts b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.ts
index 95a7ed07ce6..fb6785a5e7e 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.ts
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.ts
@@ -7,8 +7,8 @@
*/
import '../../cr_elements/cr_action_menu/cr_action_menu.js';
-import '../../cr_elements/cr_icon_button/cr_icon_button.m.js';
-import '../../cr_elements/cr_lazy_render/cr_lazy_render.m.js';
+import '../../cr_elements/cr_icon_button/cr_icon_button.js';
+import '../../cr_elements/cr_lazy_render/cr_lazy_render.js';
import '../../cr_elements/policy/cr_policy_indicator.m.js';
import '../../cr_elements/icons.m.js';
import './certificate_shared.css.js';
@@ -16,7 +16,7 @@ import './certificate_shared.css.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {CrActionMenuElement} from '../../cr_elements/cr_action_menu/cr_action_menu.js';
-import {CrLazyRenderElement} from '../../cr_elements/cr_lazy_render/cr_lazy_render.m.js';
+import {CrLazyRenderElement} from '../../cr_elements/cr_lazy_render/cr_lazy_render.js';
import {CrPolicyIndicatorType} from '../../cr_elements/policy/cr_policy_indicator_behavior.m.js';
import {I18nMixin} from '../../js/i18n_mixin.js';
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificates_browser_proxy.ts b/chromium/ui/webui/resources/cr_components/certificate_manager/certificates_browser_proxy.ts
index 91d2714f00c..e0627638434 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificates_browser_proxy.ts
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificates_browser_proxy.ts
@@ -12,24 +12,24 @@ import {sendWithPromise} from '../../js/cr.m.js';
/**
* @see chrome/browser/ui/webui/settings/certificates_handler.cc
*/
-export type CertificateSubnode = {
- extractable: boolean,
- id: string,
- name: string,
- policy: boolean,
- webTrustAnchor: boolean,
- canBeDeleted: boolean,
- canBeEdited: boolean,
- untrusted: boolean,
-};
+export interface CertificateSubnode {
+ extractable: boolean;
+ id: string;
+ name: string;
+ policy: boolean;
+ webTrustAnchor: boolean;
+ canBeDeleted: boolean;
+ canBeEdited: boolean;
+ untrusted: boolean;
+}
/**
* A data structure describing a certificate that is currently being imported,
* therefore it has no ID yet, but it has a name. Used within JS only.
*/
-export type NewCertificateSubNode = {
- name: string,
-};
+export interface NewCertificateSubNode {
+ name: string;
+}
/**
* Top-level grouping node in a certificate list, representing an organization
@@ -38,27 +38,27 @@ export type NewCertificateSubNode = {
* own CertificatesOrgGroup with |name| set to its display name.
* @see chrome/browser/ui/webui/settings/certificates_handler.cc
*/
-export type CertificatesOrgGroup = {
- id: string,
- name: string,
- containsPolicyCerts: boolean,
- subnodes: Array<CertificateSubnode>,
-};
-
-export type CaTrustInfo = {
- ssl: boolean,
- email: boolean,
- objSign: boolean,
-};
+export interface CertificatesOrgGroup {
+ id: string;
+ name: string;
+ containsPolicyCerts: boolean;
+ subnodes: CertificateSubnode[];
+}
+
+export interface CaTrustInfo {
+ ssl: boolean;
+ email: boolean;
+ objSign: boolean;
+}
/**
* Generic error returned from C++ via a Promise reject callback.
* @see chrome/browser/ui/webui/settings/certificates_handler.cc
*/
-export type CertificatesError = {
- title: string,
- description: string,
-};
+export interface CertificatesError {
+ title: string;
+ description: string;
+}
/**
* Enumeration of all possible certificate types.
@@ -76,11 +76,11 @@ export enum CertificateType {
* fail to be imported.
* @see chrome/browser/ui/webui/settings/certificates_handler.cc
*/
-export type CertificatesImportError = {
- title: string,
- description: string,
- certificateErrors: Array<{name: string, error: string}>,
-};
+export interface CertificatesImportError {
+ title: string;
+ description: string;
+ certificateErrors: Array<{name: string, error: string}>;
+}
export interface CertificatesBrowserProxy {
/**
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.ts b/chromium/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.ts
index ae6d7d548c9..8801ad39b6a 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.ts
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.ts
@@ -6,13 +6,13 @@
* @fileoverview A dialog for showing SSL certificate related error messages.
* The user can only close the dialog, there is no other possible interaction.
*/
-import '../../cr_elements/cr_button/cr_button.m.js';
-import '../../cr_elements/cr_dialog/cr_dialog.m.js';
+import '../../cr_elements/cr_button/cr_button.js';
+import '../../cr_elements/cr_dialog/cr_dialog.js';
import './certificate_shared.css.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.m.js';
+import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.js';
import {I18nMixin} from '../../js/i18n_mixin.js';
import {loadTimeData} from '../../js/load_time_data.m.js';
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/BUILD.gn b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/BUILD.gn
index 4032cb62755..33a090f2e4f 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/BUILD.gn
@@ -73,8 +73,8 @@ js_library("bluetooth_pairing_device_item") {
js_library("bluetooth_dialog") {
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
- "//ui/webui/resources/cr_elements/cr_input:cr_input.m",
+ "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog",
+ "//ui/webui/resources/cr_elements/cr_input:cr_input",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
]
@@ -107,7 +107,7 @@ js_library("bluetooth_pairing_request_code_page") {
":bluetooth_base_page",
"//chromeos/services/bluetooth_config/public/mojom:mojom_webui_js",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_input:cr_input.m",
+ "//ui/webui/resources/cr_elements/cr_input:cr_input",
]
}
@@ -143,7 +143,7 @@ js_library("bluetooth_base_page") {
deps = [
":bluetooth_types",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
+ "//ui/webui/resources/cr_elements/cr_button:cr_button",
"//ui/webui/resources/js:i18n_behavior.m",
]
}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_base_page.js b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_base_page.js
index d41223e1fad..0f3744d9291 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_base_page.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_base_page.js
@@ -7,7 +7,7 @@
* Base template with elements common to all Bluetooth UI sub-pages.
*/
-import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
+import 'chrome://resources/cr_elements/cr_button/cr_button.js';
import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
import 'chrome://resources/polymer/v3_0/paper-progress/paper-progress.js';
import 'chrome://resources/cr_elements/shared_vars_css.m.js';
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_battery_icon_percentage.js b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_battery_icon_percentage.js
index 6003ccf2f5d..309ea27d22a 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_battery_icon_percentage.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_battery_icon_percentage.js
@@ -34,8 +34,20 @@ const LOW_BATTERY_THRESHOLD_PERCENTAGE = 25;
* @type {Array<Array<number>>}
*/
const BATTERY_ICONS_RANGES = [
- [0, 7], [8, 14], [15, 21], [22, 28], [29, 35], [36, 42], [43, 49], [50, 56],
- [57, 63], [64, 70], [71, 77], [78, 85], [86, 92], [93, 100]
+ [0, 7],
+ [8, 14],
+ [15, 21],
+ [22, 28],
+ [29, 35],
+ [36, 42],
+ [43, 49],
+ [50, 56],
+ [57, 63],
+ [64, 70],
+ [71, 77],
+ [78, 85],
+ [86, 92],
+ [93, 100],
];
/**
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_dialog.js b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_dialog.js
index 3d57b77a8c9..3ecd1a8b7c2 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_dialog.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_dialog.js
@@ -9,9 +9,8 @@
* NOTE: This module depends on I18nBehavior which depends on loadTimeData.
*/
-import '../../../cr_elements/cr_button/cr_button.m.js';
-import '../../../cr_elements/cr_dialog/cr_dialog.m.js';
-import '../../../cr_elements/cr_input/cr_input.m.js';
+import '../../../cr_elements/cr_button/cr_button.js';
+import '../../../cr_elements/cr_input/cr_input.js';
import '../../../cr_elements/hidden_style_css.m.js';
import '../../../js/cr.m.js';
import '//resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
@@ -19,6 +18,7 @@ import '//resources/polymer/v3_0/iron-list/iron-list.js';
import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {CrDialogElement} from '../../../cr_elements/cr_dialog/cr_dialog.js';
import {assert} from '../../../js/assert.m.js';
import {I18nBehavior} from '../../../js/i18n_behavior.m.js';
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_metrics_utils.js b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_metrics_utils.js
index 0c1ef883929..b8b1cd2776e 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_metrics_utils.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_metrics_utils.js
@@ -71,4 +71,27 @@ export function recordUserInitiatedReconnectionAttemptDuration(
'Bluetooth.ChromeOS.UserInitiatedReconnectionAttempt.Duration.' +
successHistogramName + transportHistogramName,
durationInMs);
-} \ No newline at end of file
+}
+
+/**
+ * These values are persisted to logs and should not be renumbered or re-used.
+ * See tools/metrics/histograms/enums.xml.
+ * @enum {number}
+ */
+export const FastPairSavedDevicesUiEvent = {
+ SETTINGS_SAVED_DEVICE_LIST_SUBPAGE_SHOWN: 0,
+ SETTINGS_SAVED_DEVICE_LIST_HAS_DEVICES: 1,
+ SETTINGS_SAVED_DEVICE_LIST_REMOVE_DIALOG: 2,
+ SETTINGS_SAVED_DEVICE_LIST_REMOVE: 3,
+};
+
+/**
+ * Records metric indicating that |uiEvent| was displayed to the user.
+ * @param {!FastPairSavedDevicesUiEvent} uiEvent
+ * Fast Pair Saved Devices UI event displayed.
+ */
+export function recordSavedDevicesUiEventMetrics(uiEvent) {
+ chrome.metricsPrivate.recordEnumerationValue(
+ 'Bluetooth.ChromeOS.FastPair.SavedDevices.UiEvent', uiEvent,
+ Object.keys(FastPairSavedDevicesUiEvent).length);
+}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_confirm_code_page.js b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_confirm_code_page.js
index f393a14d5a3..2ef00ad2faf 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_confirm_code_page.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_confirm_code_page.js
@@ -10,7 +10,7 @@
import './bluetooth_base_page.js';
import '../../../cr_elements/shared_style_css.m.js';
-import '../../../cr_elements/cr_input/cr_input.m.js';
+import '../../../cr_elements/cr_input/cr_input.js';
import {I18nBehavior, I18nBehaviorInterface} from '//resources/js/i18n_behavior.m.js';
import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -51,7 +51,7 @@ export class SettingsBluetoothPairingConfirmCodePageElement extends
cancel: ButtonState.ENABLED,
pair: ButtonState.ENABLED,
},
- }
+ },
};
}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_enter_code_page.html b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_enter_code_page.html
index 0f7a4351d24..14828c20155 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_enter_code_page.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_enter_code_page.html
@@ -55,7 +55,7 @@
button-bar-state="[[buttonBarState_]]">
<div slot="page-body" id="pageBody" class="center" aria-live="polite">
<div id="message">
- [[getMessage_(device.*)]]
+ [[getMessage_(deviceName)]]
</div>
<div id="code" class="layout horizontal center center-justified">
<dom-repeat items="[[keys_]]">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_enter_code_page.js b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_enter_code_page.js
index 041af85dae2..b1b547e99c7 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_enter_code_page.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_enter_code_page.js
@@ -15,10 +15,8 @@ import '//resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
import {I18nBehavior, I18nBehaviorInterface} from '//resources/js/i18n_behavior.m.js';
import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {assert} from 'chrome://resources/js/assert.m.js';
-import {BluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
import {ButtonBarState, ButtonState} from './bluetooth_types.js';
-import {mojoString16ToString} from './bluetooth_utils.js';
// Pairing passkey can be a maximum of 16 characters while pairing code a max
// of 6 digits. This is used to check that the passed code is less than or
@@ -46,11 +44,11 @@ export class SettingsBluetoothPairingEnterCodeElement extends
static get properties() {
return {
/**
- * @type {?BluetoothDeviceProperties}
+ * @type {string}
*/
- device: {
- type: Object,
- value: null,
+ deviceName: {
+ type: String,
+ value: '',
},
/** @type {string} */
@@ -81,7 +79,7 @@ export class SettingsBluetoothPairingEnterCodeElement extends
keys_: {
type: Array,
computed: 'computeKeys_(code)',
- }
+ },
};
}
@@ -146,19 +144,7 @@ export class SettingsBluetoothPairingEnterCodeElement extends
* @return {string}
*/
getMessage_() {
- return this.i18n('bluetoothPairingEnterKeys', this.getDeviceName_());
- }
-
- /**
- * @return {string}
- * @private
- */
- getDeviceName_() {
- if (!this.device) {
- return '';
- }
-
- return mojoString16ToString(this.device.publicName);
+ return this.i18n('bluetoothPairingEnterKeys', this.deviceName);
}
}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_request_code_page.js b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_request_code_page.js
index fe31fc7a69e..56f7bad153a 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_request_code_page.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_request_code_page.js
@@ -10,7 +10,7 @@
import './bluetooth_base_page.js';
import '../../../cr_elements/shared_style_css.m.js';
-import '../../../cr_elements/cr_input/cr_input.m.js';
+import '../../../cr_elements/cr_input/cr_input.js';
import {I18nBehavior, I18nBehaviorInterface} from '//resources/js/i18n_behavior.m.js';
import {afterNextRender, html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -76,7 +76,7 @@ export class SettingsBluetoothRequestCodePageElement extends
pinCode_: {
type: String,
value: '',
- }
+ },
};
}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_ui.html b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_ui.html
index 78b414a2bdf..fec25fee3f6 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_ui.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_ui.html
@@ -42,7 +42,7 @@
<bluetooth-pairing-enter-code-page
code="[[pairingCode_]]"
num-keys-entered="[[numKeysEntered_]]"
- device="[[devicePendingPairing_]]"
+ device-name="[[getDeviceName_(devicePendingPairing_.*)]]"
id="deviceEnterCodePage">
</bluetooth-pairing-enter-code-page>
</template>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_ui.js b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_ui.js
index b212670cd20..45f7d4cbb64 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_ui.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_ui.js
@@ -7,7 +7,7 @@
* Root UI element for Bluetooth pairing dialog.
*/
-import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
+import 'chrome://resources/cr_elements/cr_button/cr_button.js';
import './bluetooth_pairing_device_selection_page.js';
import './bluetooth_pairing_enter_code_page.js';
import './bluetooth_pairing_request_code_page.js';
@@ -20,6 +20,7 @@ import {BluetoothDeviceProperties, BluetoothDiscoveryDelegateInterface, Bluetoot
import {assert, assertNotReached} from '../../../js/assert.m.js';
import {PairingAuthType} from './bluetooth_types.js';
+import {mojoString16ToString} from './bluetooth_utils.js';
import {getBluetoothConfig} from './cros_bluetooth_config.js';
/** @implements {KeyEnteredHandlerInterface} */
@@ -685,6 +686,17 @@ export class SettingsBluetoothPairingUiElement extends PolymerElement {
this.confirmCodeCallback_.reject();
}
}
+
+ /**
+ * @return {string}
+ * @private
+ */
+ getDeviceName_() {
+ if (!this.devicePendingPairing_) {
+ return '';
+ }
+ return mojoString16ToString(this.devicePendingPairing_.publicName);
+ }
}
customElements.define(
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_spinner_page.js b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_spinner_page.js
index 8ba040730cb..b0712185cdc 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_spinner_page.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_spinner_page.js
@@ -32,7 +32,7 @@ export class SettingsBluetoothSpinnerPageElement extends PolymerElement {
cancel: ButtonState.ENABLED,
pair: ButtonState.DISABLED,
},
- }
+ },
};
}
}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn
index 9e08e40989e..aa0f09b1dc0 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn
@@ -306,6 +306,7 @@ polymer_modulizer("activation_code_page") {
html_file = "activation_code_page.html"
html_type = "dom-module"
namespace_rewrites = cr_components_chromeos_namespace_rewrites
+ migrated_imports = cr_components_migrated_imports
auto_imports = cr_components_chromeos_auto_imports
}
@@ -314,6 +315,7 @@ polymer_modulizer("button_bar") {
html_file = "button_bar.html"
html_type = "dom-module"
namespace_rewrites = cr_components_chromeos_namespace_rewrites
+ migrated_imports = cr_components_migrated_imports
auto_imports = cr_components_chromeos_auto_imports
}
@@ -378,6 +380,7 @@ polymer_modulizer("cellular_eid_dialog") {
html_file = "cellular_eid_dialog.html"
html_type = "dom-module"
namespace_rewrites = cr_components_chromeos_namespace_rewrites
+ migrated_imports = cr_components_migrated_imports
auto_imports = cr_components_chromeos_auto_imports
}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page.js
index 2421842b543..4376cfe3d93 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page.js
@@ -153,7 +153,7 @@ Polymer({
isActivationCodeInvalidFormat_: {
type: Boolean,
value: false,
- }
+ },
},
/**
@@ -345,9 +345,9 @@ Polymer({
video: {
height: 130,
width: 482,
- facingMode: useUserFacingCamera ? 'user' : 'environment'
+ facingMode: useUserFacingCamera ? 'user' : 'environment',
},
- audio: false
+ audio: false,
})
.then(stream => {
this.stream_ = stream;
@@ -431,7 +431,7 @@ Polymer({
this.fire('activation-code-updated', {
activationCode: this.validateActivationCode_(this.activationCode) ?
this.activationCode :
- null
+ null,
});
},
@@ -658,5 +658,5 @@ Polymer({
// Because this string contains '<' and '>' characters, we cannot use i18n
// methods.
return loadTimeData.getString('scanQrCodeInputError');
- }
+ },
});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/base_page.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/base_page.js
index 3efd9ecd352..628fee7e24e 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/base_page.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/base_page.js
@@ -31,7 +31,7 @@ Polymer({
messageIcon: {
type: String,
value: '',
- }
+ },
},
/**
@@ -56,5 +56,5 @@ Polymer({
*/
isMessageIconShown_() {
return !!this.messageIcon;
- }
+ },
});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/base_page.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/base_page.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/base_page.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.js
index 4243c079456..653bcf509f4 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.js
@@ -31,7 +31,7 @@ Polymer({
forwardButtonLabel: {
type: String,
value: '',
- }
+ },
},
/**
@@ -99,5 +99,5 @@ Polymer({
assertNotReached();
return cellularSetup.ButtonState.ENABLED;
}
- }
+ },
});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_eid_dialog.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_eid_dialog.js
index a66c321c5b4..e4edb8d71ec 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_eid_dialog.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_eid_dialog.js
@@ -8,6 +8,8 @@
// The size of each tile in pixels.
const QR_CODE_TILE_SIZE = 5;
+// Styling for filled tiles in the QR code.
+const QR_CODE_FILL_STYLE = '#000000';
Polymer({
is: 'cellular-eid-dialog',
@@ -63,8 +65,7 @@ Polymer({
Polymer.dom.flush();
const context = this.getCanvasContext_();
context.clearRect(0, 0, this.canvasSize_, this.canvasSize_);
- context.fillStyle = getComputedStyle(this.$.qrCodeCanvas)
- .getPropertyValue('--cros-icon-color-primary-dark');
+ context.fillStyle = QR_CODE_FILL_STYLE;
let index = 0;
for (let x = 0; x < response.qrCode.size; x++) {
for (let y = 0; y < response.qrCode.size; y++) {
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_eid_dialog.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_eid_dialog.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_eid_dialog.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.js
index e2c7b944dda..fc124129934 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.js
@@ -75,7 +75,7 @@ Polymer({
*/
forwardButtonLabel_: {
type: String,
- }
+ },
},
listeners: {
@@ -141,5 +141,5 @@ Polymer({
*/
shouldShowEsimFlow_(currentPage) {
return currentPage === cellularSetup.CellularSetupPageName.ESIM_FLOW_UI;
- }
+ },
});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup_delegate.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup_delegate.m.d.ts
new file mode 100644
index 00000000000..f40d47c02da
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup_delegate.m.d.ts
@@ -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.
+
+export class CellularSetupDelegate {
+ shouldShowPageTitle(): boolean;
+ shouldShowCancelButton(): boolean;
+}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup_icons.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup_icons.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup_icons.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_types.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_types.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_types.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_manager_listener_behavior.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_manager_listener_behavior.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_manager_listener_behavior.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_manager_utils.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_manager_utils.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_manager_utils.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js
index 675fe5898aa..f8061446de4 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js
@@ -84,6 +84,6 @@ cr.define('cellular_setup', function() {
getCellularSetupRemote,
setESimManagerRemoteForTesting,
getESimManagerRemote,
- observeESimManager
+ observeESimManager,
};
});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_page.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_page.js
index 3b3c2b9ce36..3ba7bee9162 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_page.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_page.js
@@ -45,5 +45,5 @@ Polymer({
*/
isProfileSelected_(profile) {
return this.selectedProfile === profile;
- }
+ },
});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_page.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_page.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_page.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/provisioning_page.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/provisioning_page.js
index ace1aecc199..20b49c2be74 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/provisioning_page.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/provisioning_page.js
@@ -199,7 +199,7 @@ Polymer({
carrier: this.cellularMetadata.carrier,
MEID: this.cellularMetadata.meid,
IMEI: this.cellularMetadata.imei,
- MDN: this.cellularMetadata.mdn
+ MDN: this.cellularMetadata.mdn,
},
this.cellularMetadata.paymentUrl.url);
return;
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/provisioning_page.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/provisioning_page.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/provisioning_page.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.js
index 966cf7994d9..fc9168b5521 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.js
@@ -605,6 +605,6 @@ cr.define('cellularSetup', function() {
return {
PSimPageName: PSimPageName,
PSimUIState: PSimUIState,
- getTimeoutMsForPSimUIState: getTimeoutMsForPSimUIState
+ getTimeoutMsForPSimUIState: getTimeoutMsForPSimUIState,
};
});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/setup_loading_page.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/setup_loading_page.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/setup_loading_page.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/webview_post_util.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/webview_post_util.js
index 0ec5e8c3796..e59f38852c9 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/webview_post_util.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/webview_post_util.js
@@ -84,7 +84,7 @@ cr.define('webviewPost.util', function() {
code: WEBVIEW_REDIRECT_SCRIPT + '(' +
'document.getElementById(\'' + WEBVIEW_REDIRECT_FORM_ID + '\'),' +
' \'' + escape(paymentUrl) + '\',' +
- ' \'' + escape(postData || '') + '\');'
+ ' \'' + escape(postData || '') + '\');',
});
}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/BUILD.gn b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/BUILD.gn
index 24b0285cd8a..2c0d22e02ac 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/BUILD.gn
@@ -173,6 +173,7 @@ polymer_modulizer("password_page") {
html_file = "password_page.html"
html_type = "dom-module"
namespace_rewrites = cr_components_chromeos_namespace_rewrites
+ migrated_imports = cr_components_migrated_imports
auto_imports = cr_components_chromeos_auto_imports
}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/button_bar.js b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/button_bar.js
index c635763ead5..45d50cd72c2 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/button_bar.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/button_bar.js
@@ -32,7 +32,7 @@ Polymer({
shouldShowShadow: {
type: Boolean,
value: false,
- }
+ },
},
/** @private */
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/fake_mojo_service.js b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/fake_mojo_service.js
index f5603c93076..56d2cd50e47 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/fake_mojo_service.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/fake_mojo_service.js
@@ -62,7 +62,7 @@
for (let i = 0; i < this.deviceCount; i++) {
const deviceName = deviceNames[i % 4];
devices.push({
- remoteDevice: {deviceName: deviceName, deviceId: deviceName + '--' + i}
+ remoteDevice: {deviceName: deviceName, deviceId: deviceName + '--' + i},
});
}
return new Promise(function(resolve, reject) {
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.js b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.js
index 87e201e0079..1ab5d4bc36e 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.js
@@ -37,7 +37,7 @@ cr.define('multidevice_setup', function() {
type: Boolean,
computed: 'shouldForwardButtonBeDisabled_(' +
'passwordPageForwardButtonDisabled_, visiblePageName)',
- notify: true
+ notify: true,
},
/**
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/BUILD.gn b/chromium/ui/webui/resources/cr_components/chromeos/network/BUILD.gn
index 52ddb703ae9..9d6b09fe4fd 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/BUILD.gn
@@ -23,8 +23,6 @@ js_type_check("closure_compile") {
":network_config_select",
":network_config_toggle",
":network_icon",
- ":network_ip_config",
- ":network_list",
":network_list_types",
":network_listener_behavior",
":network_nameservers",
@@ -34,7 +32,6 @@ js_type_check("closure_compile") {
":network_proxy_exclusions",
":network_proxy_input",
":network_select",
- ":network_siminfo",
":onc_mojo",
":sim_lock_dialogs",
]
@@ -135,19 +132,10 @@ js_library("network_config_toggle") {
extra_sources = [ "$interfaces_path/networking_private_interface.js" ]
}
-js_library("network_ip_config") {
- deps = [
- ":onc_mojo",
- "../../../cr_elements/cr_toggle:cr_toggle",
- "//ui/webui/resources/js:i18n_behavior",
- ]
-}
-
js_library("network_nameservers") {
deps = [
":cr_policy_network_behavior_mojo",
":onc_mojo",
- "../../../cr_elements/cr_radio_group:cr_radio_group",
"//ui/webui/resources/js:i18n_behavior",
]
}
@@ -166,7 +154,6 @@ js_library("network_property_list_mojo") {
deps = [
":cr_policy_network_behavior_mojo",
":onc_mojo",
- "//ui/webui/resources/cr_elements/cr_input:cr_input",
"//ui/webui/resources/js:assert",
"//ui/webui/resources/js:i18n_behavior",
]
@@ -191,17 +178,6 @@ js_library("network_proxy_input") {
js_library("network_proxy_exclusions") {
}
-js_library("network_siminfo") {
- deps = [
- ":mojo_interface_provider",
- ":onc_mojo",
- ":sim_lock_dialogs",
- "//ui/webui/resources/cr_elements/cr_button:cr_button",
- "//ui/webui/resources/js:i18n_behavior",
- "//ui/webui/resources/js/cr/ui:focus_without_ink",
- ]
-}
-
js_library("network_icon") {
deps = [
":onc_mojo",
@@ -210,14 +186,6 @@ js_library("network_icon") {
]
}
-js_library("network_list") {
- deps = [
- ":network_list_types",
- "//ui/webui/resources/cr_elements:cr_scrollable_behavior",
- "//ui/webui/resources/js:list_property_update_behavior",
- ]
-}
-
js_library("network_list_item") {
deps = [
":cr_policy_network_behavior_mojo",
@@ -351,7 +319,7 @@ js_library("network_apnlist.m") {
":network_shared_css.m",
":onc_mojo.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
+ "//ui/webui/resources/cr_elements/cr_button:cr_button",
"//ui/webui/resources/cr_elements/policy:cr_tooltip_icon.m",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -368,7 +336,7 @@ js_library("network_choose_mobile.m") {
"//chromeos/services/network_config/public/mojom:mojom_js_library_for_compile",
"//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
+ "//ui/webui/resources/cr_elements/cr_button:cr_button",
"//ui/webui/resources/js:i18n_behavior.m",
]
extra_deps = [ ":network_choose_mobile_module" ]
@@ -384,13 +352,13 @@ js_library("network_config.m") {
":network_listener_behavior.m",
":network_password_input.m",
":network_shared_css.m",
- "//chrome/browser/ui/webui/settings/chromeos/search:mojo_bindings_js_library_for_compile",
+ "//chrome/browser/ui/webui/settings/ash/search:mojo_bindings_js_library_for_compile",
"//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
"//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon",
"//third_party/polymer/v3_0/components-chromium/paper-spinner:paper-spinner-lite",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
- "//ui/webui/resources/cr_elements/cr_toggle:cr_toggle.m",
+ "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog",
+ "//ui/webui/resources/cr_elements/cr_toggle:cr_toggle",
"//ui/webui/resources/cr_elements/policy:cr_policy_indicator.m",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
@@ -411,7 +379,7 @@ js_library("network_config_input.m") {
":network_config_element_behavior.m",
":network_shared_css.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_input:cr_input.m",
+ "//ui/webui/resources/cr_elements/cr_input:cr_input",
]
extra_deps = [ ":network_config_input_module" ]
}
@@ -438,7 +406,7 @@ js_library("network_config_toggle.m") {
":network_config_element_behavior.m",
":network_shared_css.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_toggle:cr_toggle.m",
+ "//ui/webui/resources/cr_elements/cr_toggle:cr_toggle",
]
extra_deps = [ ":network_config_toggle_module" ]
}
@@ -462,7 +430,7 @@ js_library("network_ip_config.m") {
":network_shared_css.m",
":onc_mojo.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_toggle:cr_toggle.m",
+ "//ui/webui/resources/cr_elements/cr_toggle:cr_toggle",
"//ui/webui/resources/cr_elements/policy:cr_policy_indicator.m",
]
extra_deps = [ ":network_ip_config_module" ]
@@ -477,7 +445,7 @@ js_library("network_list.m") {
"//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements:cr_scrollable_behavior.m",
- "//ui/webui/resources/js:list_property_update_behavior.m",
+ "//ui/webui/resources/js:list_property_update_behavior",
]
extra_deps = [ ":network_list_module" ]
}
@@ -519,9 +487,8 @@ js_library("network_nameservers.m") {
":network_shared_css.m",
"//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_input:cr_input.m",
- "//ui/webui/resources/cr_elements/cr_radio_button:cr_radio_button.m",
- "//ui/webui/resources/cr_elements/cr_radio_group:cr_radio_group.m",
+ "//ui/webui/resources/cr_elements/cr_input:cr_input",
+ "//ui/webui/resources/cr_elements/cr_radio_button:cr_radio_button",
"//ui/webui/resources/cr_elements/policy:cr_policy_indicator.m",
"//ui/webui/resources/js:i18n_behavior.m",
]
@@ -536,8 +503,8 @@ js_library("network_password_input.m") {
":network_config_element_behavior.m",
":network_shared_css.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m",
- "//ui/webui/resources/cr_elements/cr_input:cr_input.m",
+ "//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button",
+ "//ui/webui/resources/cr_elements/cr_input:cr_input",
"//ui/webui/resources/js:i18n_behavior.m",
]
extra_deps = [ ":network_password_input_module" ]
@@ -551,7 +518,7 @@ js_library("network_property_list_mojo.m") {
":network_shared_css.m",
":onc_mojo.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_input:cr_input.m",
+ "//ui/webui/resources/cr_elements/cr_input:cr_input",
"//ui/webui/resources/js:assert.m",
]
extra_deps = [ ":network_property_list_mojo_module" ]
@@ -567,9 +534,9 @@ js_library("network_proxy.m") {
":onc_mojo.m",
"//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
- "//ui/webui/resources/cr_elements/cr_input:cr_input.m",
- "//ui/webui/resources/cr_elements/cr_toggle:cr_toggle.m",
+ "//ui/webui/resources/cr_elements/cr_button:cr_button",
+ "//ui/webui/resources/cr_elements/cr_input:cr_input",
+ "//ui/webui/resources/cr_elements/cr_toggle:cr_toggle",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior.m",
]
@@ -582,7 +549,7 @@ js_library("network_proxy_exclusions.m") {
":network_shared_css.m",
"//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m",
+ "//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button",
"//ui/webui/resources/js:i18n_behavior.m",
]
extra_deps = [ ":network_proxy_exclusions_module" ]
@@ -594,7 +561,7 @@ js_library("network_proxy_input.m") {
":network_shared_css.m",
":onc_mojo.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_input:cr_input.m",
+ "//ui/webui/resources/cr_elements/cr_input:cr_input",
"//ui/webui/resources/js:i18n_behavior.m",
]
extra_deps = [ ":network_proxy_input_module" ]
@@ -633,8 +600,8 @@ js_library("network_siminfo.m") {
"//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
"//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
- "//ui/webui/resources/cr_elements/cr_toggle:cr_toggle.m",
+ "//ui/webui/resources/cr_elements/cr_button:cr_button",
+ "//ui/webui/resources/cr_elements/cr_toggle:cr_toggle",
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:i18n_behavior",
"//ui/webui/resources/js/cr/ui:focus_without_ink.m",
@@ -671,9 +638,9 @@ js_library("sim_lock_dialogs.m") {
"//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
"//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
- "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
- "//ui/webui/resources/cr_elements/cr_toggle:cr_toggle.m",
+ "//ui/webui/resources/cr_elements/cr_button:cr_button",
+ "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog",
+ "//ui/webui/resources/cr_elements/cr_toggle:cr_toggle",
"//ui/webui/resources/js:i18n_behavior.m",
]
extra_deps = [ ":sim_lock_dialogs_module" ]
@@ -719,6 +686,7 @@ polymer_modulizer("network_apnlist") {
html_file = "network_apnlist.html"
html_type = "dom-module"
auto_imports = cr_components_chromeos_auto_imports
+ migrated_imports = cr_components_migrated_imports
}
polymer_modulizer("network_choose_mobile") {
@@ -726,6 +694,7 @@ polymer_modulizer("network_choose_mobile") {
html_file = "network_choose_mobile.html"
html_type = "dom-module"
auto_imports = cr_components_chromeos_auto_imports
+ migrated_imports = cr_components_migrated_imports
namespace_rewrites =
cr_components_chromeos_namespace_rewrites + [
"cros_network_config.mojom.m.js|cros_network_config.mojom-lite.js",
@@ -741,6 +710,7 @@ polymer_modulizer("network_config") {
html_file = "network_config.html"
html_type = "dom-module"
auto_imports = cr_components_chromeos_auto_imports
+ migrated_imports = cr_components_migrated_imports
namespace_rewrites = cr_components_chromeos_namespace_rewrites
}
@@ -749,6 +719,7 @@ polymer_modulizer("network_config_input") {
html_file = "network_config_input.html"
html_type = "dom-module"
auto_imports = cr_components_chromeos_auto_imports
+ migrated_imports = cr_components_migrated_imports
}
polymer_modulizer("network_config_select") {
@@ -763,6 +734,7 @@ polymer_modulizer("network_config_toggle") {
html_file = "network_config_toggle.html"
html_type = "dom-module"
auto_imports = cr_components_chromeos_auto_imports
+ migrated_imports = cr_components_migrated_imports
}
polymer_modulizer("network_icon") {
@@ -782,7 +754,8 @@ polymer_modulizer("network_ip_config") {
js_file = "network_ip_config.js"
html_file = "network_ip_config.html"
html_type = "dom-module"
- auto_imports = cr_components_chromeos_auto_imports
+ auto_imports = cr_components_chromeos_auto_imports + [ "ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html|CrToggleElement" ]
+ migrated_imports = cr_components_migrated_imports
}
polymer_modulizer("network_list") {
@@ -790,6 +763,7 @@ polymer_modulizer("network_list") {
html_file = "network_list.html"
html_type = "dom-module"
auto_imports = cr_components_chromeos_auto_imports
+ migrated_imports = cr_components_migrated_imports
}
polymer_modulizer("network_list_item") {
@@ -797,6 +771,7 @@ polymer_modulizer("network_list_item") {
html_file = "network_list_item.html"
html_type = "dom-module"
auto_imports = cr_components_chromeos_auto_imports
+ migrated_imports = cr_components_migrated_imports
namespace_rewrites = cr_components_chromeos_namespace_rewrites
}
@@ -805,6 +780,7 @@ polymer_modulizer("network_nameservers") {
html_file = "network_nameservers.html"
html_type = "dom-module"
auto_imports = cr_components_chromeos_auto_imports
+ migrated_imports = cr_components_migrated_imports
}
polymer_modulizer("network_password_input") {
@@ -812,12 +788,14 @@ polymer_modulizer("network_password_input") {
html_file = "network_password_input.html"
html_type = "dom-module"
auto_imports = cr_components_chromeos_auto_imports
+ migrated_imports = cr_components_migrated_imports
}
polymer_modulizer("network_property_list_mojo") {
js_file = "network_property_list_mojo.js"
html_file = "network_property_list_mojo.html"
html_type = "dom-module"
+ migrated_imports = cr_components_migrated_imports
auto_imports = cr_components_chromeos_auto_imports
}
@@ -826,6 +804,7 @@ polymer_modulizer("network_proxy_exclusions") {
html_file = "network_proxy_exclusions.html"
html_type = "dom-module"
auto_imports = cr_components_chromeos_auto_imports
+ migrated_imports = cr_components_migrated_imports
namespace_rewrites = cr_components_chromeos_namespace_rewrites
}
@@ -834,6 +813,7 @@ polymer_modulizer("network_proxy") {
html_file = "network_proxy.html"
html_type = "dom-module"
auto_imports = cr_components_chromeos_auto_imports
+ migrated_imports = cr_components_migrated_imports
namespace_rewrites = cr_components_chromeos_namespace_rewrites
}
@@ -842,6 +822,7 @@ polymer_modulizer("network_proxy_input") {
html_file = "network_proxy_input.html"
html_type = "dom-module"
auto_imports = cr_components_chromeos_auto_imports
+ migrated_imports = cr_components_migrated_imports
namespace_rewrites = cr_components_chromeos_namespace_rewrites
}
@@ -863,7 +844,8 @@ polymer_modulizer("network_siminfo") {
js_file = "network_siminfo.js"
html_file = "network_siminfo.html"
html_type = "dom-module"
- auto_imports = cr_components_chromeos_auto_imports
+ auto_imports = cr_components_chromeos_auto_imports + [ "ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html|CrToggleElement" ]
+ migrated_imports = cr_components_migrated_imports
namespace_rewrites = cr_components_chromeos_namespace_rewrites
}
@@ -872,6 +854,7 @@ polymer_modulizer("sim_lock_dialogs") {
html_file = "sim_lock_dialogs.html"
html_type = "dom-module"
auto_imports = cr_components_chromeos_auto_imports
+ migrated_imports = cr_components_migrated_imports
namespace_rewrites = cr_components_chromeos_namespace_rewrites
}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/OWNERS b/chromium/ui/webui/resources/cr_components/chromeos/network/OWNERS
index f66fcf49c42..f82b840ffe7 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/OWNERS
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/OWNERS
@@ -4,3 +4,4 @@ gordonseto@google.com
jonmann@chromium.org
khorimoto@chromium.org
stevenjb@chromium.org
+jiajunz@google.com
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_utils.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_utils.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/cellular_utils.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_indicator_mojo.js b/chromium/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_indicator_mojo.js
index 73ad2eaa2b3..cd6830b9435 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_indicator_mojo.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_indicator_mojo.js
@@ -76,5 +76,5 @@ Polymer({
const matches = !!this.property &&
this.property.activeValue === this.property.policyValue;
return this.getIndicatorTooltip(this.indicatorType, '', matches);
- }
+ },
});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_indicator_mojo.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_indicator_mojo.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_indicator_mojo.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/mojo_interface_provider.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/mojo_interface_provider.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/mojo_interface_provider.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_apnlist.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_apnlist.js
index 6d74a5048b8..4d1f28f5152 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_apnlist.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_apnlist.js
@@ -53,7 +53,7 @@ Polymer({
type: Array,
value() {
return [];
- }
+ },
},
/**
@@ -69,7 +69,7 @@ Polymer({
accessPointName: kDefaultAccessPointName,
name: kOtherAccessPointName,
};
- }
+ },
},
/**
@@ -81,7 +81,7 @@ Polymer({
value() {
return ['accessPointName', 'username', 'password'];
},
- readOnly: true
+ readOnly: true,
},
/**
@@ -94,10 +94,10 @@ Polymer({
return {
'accessPointName': 'String',
'username': 'String',
- 'password': 'Password'
+ 'password': 'Password',
};
},
- readOnly: true
+ readOnly: true,
},
/** @private */
@@ -106,7 +106,7 @@ Polymer({
value() {
return loadTimeData.valueExists('useAttachApn') &&
loadTimeData.getBoolean('useAttachApn');
- }
+ },
},
/** @private */
@@ -392,5 +392,5 @@ Polymer({
*/
isApnItemSelected_(item) {
return item.accessPointName === this.selectedApn_;
- }
+ },
});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_apnlist.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/network_apnlist.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_apnlist.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.js
index 021810d891b..5badcff8076 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.js
@@ -48,7 +48,7 @@ Polymer({
type: Array,
value() {
return [];
- }
+ },
},
},
@@ -85,7 +85,7 @@ Polymer({
this.mobileNetworkList_ = cellular.foundNetworks || [];
if (!this.mobileNetworkList_.length) {
this.mobileNetworkList_ = [
- {networkId: 'none', longName: this.i18n('networkCellularNoNetworks')}
+ {networkId: 'none', longName: this.i18n('networkCellularNoNetworks')},
];
}
// Set selectedMobileNetworkId_ after the dom-repeat has been stamped.
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_config.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config.js
index 486ffaf021b..7809fac32c7 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_config.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config.js
@@ -529,6 +529,11 @@ Polymer({
}
},
+ /** @private */
+ getHiddenNetworkMigrationEnabled() {
+ return loadTimeData.getBoolean('enableHiddenNetworkMigration');
+ },
+
/**
* @param {boolean} connect If true, connect after save.
* @private
@@ -560,6 +565,15 @@ Polymer({
}
const propertiesToSet = this.getPropertiesToSet_();
if (this.managedProperties_.source === mojom.OncSource.kNone) {
+ if (this.getHiddenNetworkMigrationEnabled()) {
+ // Note: Set hidden SSID mode of new WiFi networks to disabled to avoid
+ // unintentionally marking networks as hidden if not in range or
+ // misspelled, etc.
+ if (this.mojoType_ === mojom.NetworkType.kWiFi) {
+ propertiesToSet.typeConfig.wifi.hiddenSsid =
+ chromeos.networkConfig.mojom.HiddenSsidMode.kDisabled;
+ }
+ }
if (!this.autoConnect_) {
// Note: Do not set autoConnect to true, the connection manager will do
// that on a successful connection (unless set to false here).
@@ -2379,5 +2393,5 @@ Polymer({
// Reset error if user starts typing new password.
this.setError_('');
}
- }
+ },
});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_config.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_input.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_input.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_input.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_toggle.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_toggle.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config_toggle.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_icon.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_icon.js
index e7159c24504..bbaede41b4b 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_icon.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_icon.js
@@ -59,7 +59,7 @@ Polymer({
ariaLabel: {
type: String,
reflectToAttribute: true,
- computed: 'computeAriaLabel_(locale, networkState)'
+ computed: 'computeAriaLabel_(locale, networkState)',
},
},
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_icon.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/network_icon.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_icon.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_ip_config.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_ip_config.js
index 63979d0f08d..672e0542acf 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_ip_config.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_ip_config.js
@@ -138,7 +138,7 @@ Polymer({
'ipv6.ipAddress',
];
},
- readOnly: true
+ readOnly: true,
},
/**
@@ -252,7 +252,7 @@ Polymer({
}
if (!this.ipConfig_.ipv4) {
this.ipConfig_.ipv4 = {
- type: chromeos.networkConfig.mojom.IPConfigType.kIPv4
+ type: chromeos.networkConfig.mojom.IPConfigType.kIPv4,
};
}
this.setIpv4Defaults_(this.ipConfig_.ipv4);
@@ -362,7 +362,7 @@ Polymer({
// expects a ManagedProperty and routingPrefix has the same type as
// netmask.
'ipv4.netmask': this.getIPFieldEditType_(staticIpConfig.routingPrefix),
- 'ipv4.gateway': this.getIPFieldEditType_(staticIpConfig.gateway)
+ 'ipv4.gateway': this.getIPFieldEditType_(staticIpConfig.gateway),
};
},
@@ -390,7 +390,7 @@ Polymer({
field: 'staticIpConfig',
value: this.ipConfig_.ipv4 ?
this.getIPConfigProperties_(this.ipConfig_.ipv4) :
- {}
+ {},
});
},
@@ -416,5 +416,5 @@ Polymer({
classes += ' indented';
}
return classes;
- }
+ },
});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_ip_config.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/network_ip_config.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_ip_config.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_list.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.html
index 52ed0aac7ea..3f5766b850a 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.html
@@ -132,7 +132,6 @@
selectable
aria-label$="[[rowLabel]]"
aria-live="[[getLiveStatus_(isFocused)]]"
- role="button"
focus-type="rowWrapper"
on-keydown="onKeydown_"
on-click="onSelected_">
@@ -228,6 +227,7 @@
</div>
<template is="dom-if" if="[[isCellularUnlockDialogOpen_]]" restamp>
<sim-lock-dialogs
+ global-policy="[[globalPolicy]]"
is-dialog-open="{{isCellularUnlockDialogOpen_}}"
device-state="[[deviceState]]">
</sim-lock-dialogs>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.js
index 3593cdbfa46..1b6b18a4d92 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.js
@@ -26,7 +26,7 @@ Polymer({
reflectToAttribute: true,
observer: 'disabledChanged_',
computed: 'computeDisabled_(deviceState, deviceState.inhibitReason,' +
- 'disableItem)'
+ 'disableItem)',
},
/**
@@ -83,13 +83,6 @@ Polymer({
computed: 'getButtonLabel_(item)',
},
- /** Expose the aria role attribute as "button". */
- role: {
- type: String,
- reflectToAttribute: true,
- value: 'button',
- },
-
/**
* The cached ConnectionState for the network.
* @type {!chromeos.networkConfig.mojom.ConnectionStateType|undefined}
@@ -205,15 +198,6 @@ Polymer({
computed: 'computeIsESimUnactivatedProfile_(managedProperties_)',
},
- /** @private {boolean} */
- isESimPolicyEnabled_: {
- type: Boolean,
- value() {
- return loadTimeData.valueExists('esimPolicyEnabled') &&
- loadTimeData.getBoolean('esimPolicyEnabled');
- }
- },
-
/**
* Indicates the network item is a blocked cellular network by policy.
* @private
@@ -251,6 +235,18 @@ Polymer({
this.unlisten(this, 'keydown', 'onKeydown_');
},
+ /**
+ * @return {boolean}
+ * @private
+ */
+ isESimNetwork_() {
+ const mojom = chromeos.networkConfig.mojom;
+ return !!this.networkState &&
+ this.networkState.type === mojom.NetworkType.kCellular &&
+ !!this.networkState.typeState.cellular.eid &&
+ !!this.networkState.typeState.cellular.iccid;
+ },
+
/** @private */
async itemChanged_() {
if (this.item && !this.item.hasOwnProperty('customItemType')) {
@@ -283,10 +279,7 @@ Polymer({
// Show service provider subtext only when networkState is an eSIM cellular
// network.
- if (!this.networkState ||
- this.networkState.type !== mojom.NetworkType.kCellular ||
- !this.networkState.typeState.cellular.eid ||
- !this.networkState.typeState.cellular.iccid) {
+ if (!this.isESimNetwork_()) {
return;
}
@@ -343,7 +336,7 @@ Polymer({
setItemTitle_() {
const itemName = this.getItemName_();
const subtitle = this.getSubtitle();
- if (!subtitle) {
+ if (!subtitle || (this.isESimNetwork_() && itemName === subtitle)) {
this.itemTitle_ = itemName;
return;
}
@@ -1009,8 +1002,7 @@ Polymer({
}
if (this.item.type === mojom.NetworkType.kCellular) {
- return this.isESimPolicyEnabled_ &&
- !!this.globalPolicy.allowOnlyPolicyCellularNetworks;
+ return !!this.globalPolicy.allowOnlyPolicyCellularNetworks;
}
return this.isBlockedWifiNetwork_();
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_types.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_types.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_types.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_listener_behavior.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/network_listener_behavior.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_listener_behavior.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.js
index f8433b5170c..676c03e139e 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.js
@@ -13,7 +13,7 @@
const NameserversType = {
AUTOMATIC: 'automatic',
CUSTOM: 'custom',
- GOOGLE: 'google'
+ GOOGLE: 'google',
};
Polymer({
@@ -69,14 +69,14 @@ Polymer({
value() {
return this.i18nAdvanced(
'networkNameserversGoogle', {substitutions: [], tags: ['a']});
- }
+ },
},
/** @private */
canChangeConfigType_: {
type: Boolean,
computed: 'computeCanChangeConfigType_(managedProperties)',
- }
+ },
},
/** @const */
@@ -107,10 +107,10 @@ Polymer({
/*
* Returns the nameserver type CrRadioGroupElement.
- * @return {?CrRadioGroupElement}
+ * @return {?HTMLElement}
*/
getNameserverRadioButtons() {
- return /** @type {?CrRadioGroupElement} */ (this.$$('#nameserverType'));
+ return /** @type {?HTMLElement} */ (this.$$('#nameserverType'));
},
/**
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.js
index cfcd11b56e3..5c8456ccc69 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.js
@@ -85,7 +85,7 @@ Polymer({
hasAnyInputFocused_: {
type: Boolean,
value: false,
- }
+ },
},
/** @private */
@@ -127,7 +127,7 @@ Polymer({
attemptToFocusFirstEditableCrInput_() {
Polymer.dom.flush();
- const crInput = /** @type {?CrInputElement} */
+ const crInput = /** @type {?HTMLElement} */
(this.shadowRoot.querySelector('cr-input:not([readonly])'));
if (!crInput) {
return;
@@ -136,7 +136,7 @@ Polymer({
// Note that |this.hasAnyInputFocused_| should not change here because a
// CrInputElement's focus event may not properly fire before
// |this.propertyDict| reaches steady state.
- crInput.focusInput();
+ /** @type {{focusInput: function():void}} */ (crInput).focusInput();
},
/**
@@ -151,7 +151,7 @@ Polymer({
return;
}
- const crInput = /** @type {!CrInputElement} */ (e.target);
+ const crInput = /** @type {!HTMLElement} */ (e.target);
// Subsequent focuses to the same CrInputElement after the first will not
// select the entire text.
if (crInput.getAttribute('edited') === 'true') {
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy.js
index c3cb28a52dd..850f089715d 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy.js
@@ -73,7 +73,7 @@ Polymer({
proxyTypes_: {
type: Array,
value: ['Direct', 'PAC', 'WPAD', 'Manual'],
- readOnly: true
+ readOnly: true,
},
/**
@@ -233,7 +233,7 @@ Polymer({
proxy.excludeDomains =
proxy.excludeDomains || this.savedExcludeDomains_ || {
activeValue: [],
- policySource: chromeos.networkConfig.mojom.PolicySource.kNone
+ policySource: chromeos.networkConfig.mojom.PolicySource.kNone,
};
}
return proxy;
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_exclusions.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_exclusions.js
index d5296edc632..f5539943d01 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_exclusions.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_exclusions.js
@@ -28,8 +28,8 @@ Polymer({
value() {
return [];
},
- notify: true
- }
+ notify: true,
+ },
},
/**
@@ -41,5 +41,5 @@ Polymer({
const index = event.model.index;
this.splice('exclusions', index, 1);
this.fire('proxy-exclusions-change');
- }
+ },
});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_input.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_input.js
index 40c3f6f4248..df15480c008 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_input.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_proxy_input.js
@@ -62,5 +62,5 @@ Polymer({
}
this.value.port.activeValue = port;
this.fire('proxy-input-change', this.value);
- }
+ },
});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_shared_css.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/network_shared_css.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_shared_css.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_siminfo.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_siminfo.html
index eb6bfd8afaf..734a444e151 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_siminfo.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_siminfo.html
@@ -27,6 +27,10 @@
margin-inline-end: 10px;
}
+ cr-policy-indicator {
+ margin-inline-end: var(--cr-button-edge-spacing);
+ }
+
cr-toggle {
margin-inline-start: var(--cr-button-edge-spacing);
}
@@ -67,7 +71,8 @@
</div>
</div>
<cr-button id="changePinButton" on-click="onChangePinTap_"
- hidden$="[[!showChangePinButton_(deviceState, isActiveSim_)]]"
+ hidden$="[[!showChangePinButton_(deviceState, isActiveSim_,
+ isSimPinLockRestricted_)]]"
disabled="[[disabled]]">
[[i18n('networkSimChangePin')]]
</cr-button>
@@ -81,8 +86,14 @@
</paper-tooltip>
<div class="separator"></div>
</template>
+ <template is="dom-if" if="[[shouldShowPolicyIndicator_(isActiveSim_,
+ isSimPinLockRestricted_)]]" restamp>
+ <cr-policy-indicator id="simLockPolicyIcon" indicator-type="devicePolicy">
+ </cr-policy-indicator>
+ </template>
<cr-toggle id="simLockButton"
- disabled="[[isSimLockButtonDisabled_(disabled, isActiveSim_)]]"
+ disabled="[[isSimLockButtonDisabled_(disabled, isActiveSim_,
+ isSimPinLockRestricted_, lockEnabled_)]]"
on-change="onSimLockEnabledChange_" checked="{{lockEnabled_}}"
aria-labelledby="pinRequiredLabel pinRequiredSublabel">
</cr-toggle>
@@ -91,6 +102,7 @@
<template is="dom-if" if="[[isDialogOpen_]]" restamp>
<sim-lock-dialogs
+ global-policy="[[globalPolicy]]"
show-change-pin="[[showChangePin_]]"
is-dialog-open="{{isDialogOpen_}}"
device-state="[[deviceState]]">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_siminfo.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_siminfo.js
index 88c34ebc945..c02f7758f8c 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_siminfo.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_siminfo.js
@@ -20,7 +20,7 @@ const TOGGLE_DEBOUNCE_MS = 500;
*/
const State = {
SIM_LOCKED: 0,
- SIM_UNLOCKED: 1
+ SIM_UNLOCKED: 1,
};
Polymer({
@@ -42,6 +42,9 @@ Polymer({
value: null,
},
+ /** @type {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} */
+ globalPolicy: Object,
+
disabled: {
type: Boolean,
value: false,
@@ -86,7 +89,7 @@ Polymer({
isActiveSim_: {
type: Boolean,
value: false,
- computed: 'computeIsActiveSim_(networkState, deviceState)'
+ computed: 'computeIsActiveSim_(networkState, deviceState)',
},
/** @private {!State} */
@@ -96,6 +99,23 @@ Polymer({
computed: 'computeState_(networkState, deviceState, deviceState.*,' +
'isActiveSim_)',
},
+
+ /** @private {boolean} */
+ isSimLockPolicyEnabled_: {
+ type: Boolean,
+ value() {
+ return loadTimeData.valueExists('isSimLockPolicyEnabled') &&
+ loadTimeData.getBoolean('isSimLockPolicyEnabled');
+ },
+ },
+
+ /** @private {boolean} */
+ isSimPinLockRestricted_: {
+ type: Boolean,
+ value: false,
+ computed: 'computeIsSimPinLockRestricted_(isSimLockPolicyEnabled_,' +
+ 'globalPolicy, globalPolicy.*, lockEnabled_)',
+ },
},
/** @private {boolean|undefined} */
@@ -250,6 +270,10 @@ Polymer({
* @private
*/
showChangePinButton_() {
+ if (this.isSimPinLockRestricted_) {
+ return false;
+ }
+
if (!this.deviceState || !this.deviceState.simLockStatus) {
return false;
}
@@ -262,6 +286,12 @@ Polymer({
* @private
*/
isSimLockButtonDisabled_() {
+ // If SIM PIN locking is restricted by admin, and the SIM does not have SIM
+ // PIN lock enabled, users should not be able to enable PIN locking.
+ if (this.isSimPinLockRestricted_ && !this.lockEnabled_) {
+ return true;
+ }
+
return this.disabled || !this.isActiveSim_;
},
@@ -286,6 +316,23 @@ Polymer({
},
/**
+ * @return {boolean}
+ * @private
+ */
+ shouldShowPolicyIndicator_() {
+ return this.isSimPinLockRestricted_ && this.isActiveSim_;
+ },
+
+ /**
+ * @return {boolean}
+ * @private
+ */
+ computeIsSimPinLockRestricted_() {
+ return this.isSimLockPolicyEnabled_ && !!this.globalPolicy &&
+ !this.globalPolicy.allowCellularSimLock;
+ },
+
+ /**
* @param {!State} state1
* @param {!State} state2
* @return {boolean} Whether state1 is the same as state2.
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_siminfo.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/network_siminfo.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_siminfo.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js b/chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js
index 439c848ef26..f0482440e41 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js
@@ -652,6 +652,7 @@
signalStrength: 0,
simLockEnabled: false,
simLocked: false,
+ simLockType: '',
};
break;
case mojom.NetworkType.kEthernet:
@@ -794,7 +795,7 @@
signalStrength: 0,
simLocked: false,
supportNetworkScan: false,
- }
+ },
};
break;
case mojom.NetworkType.kEthernet:
@@ -809,7 +810,7 @@
carrier: '',
hasConnectedToHost: false,
signalStrength: 0,
- }
+ },
};
break;
case mojom.NetworkType.kVPN:
@@ -818,7 +819,7 @@
providerName: '',
type: mojom.VpnType.kOpenVPN,
openVpn: {},
- }
+ },
};
break;
case mojom.NetworkType.kWiFi:
@@ -831,7 +832,7 @@
signalStrength: 0,
isSyncable: false,
isConfiguredByActiveUser: false,
- }
+ },
};
break;
}
@@ -863,9 +864,9 @@
typeConfig: {
wifi: {
security: mojom.SecurityType.kNone,
- hiddenSsid: mojom.HiddenSsidMode.kAutomatic
- }
- }
+ hiddenSsid: mojom.HiddenSsidMode.kAutomatic,
+ },
+ },
};
break;
}
@@ -1116,7 +1117,7 @@
return {
activeValue: s,
policySource: chromeos.networkConfig.mojom.PolicySource.kNone,
- policyValue: undefined
+ policyValue: undefined,
};
}
@@ -1128,7 +1129,7 @@
return {
activeValue: n,
policySource: chromeos.networkConfig.mojom.PolicySource.kNone,
- policyValue: 0
+ policyValue: 0,
};
}
@@ -1140,7 +1141,7 @@
return {
activeValue: b,
policySource: chromeos.networkConfig.mojom.PolicySource.kNone,
- policyValue: false
+ policyValue: false,
};
}
@@ -1151,7 +1152,7 @@
return {
lastResetTime: null,
autoReset: false,
- userSpecifiedResetDay: 1
+ userSpecifiedResetDay: 1,
};
}
@@ -1409,7 +1410,7 @@
}
result.push(/* @type {!chromeos.networkConfig.mojom.SubjectAltName} */ {
type: type,
- value: value[0]
+ value: value[0],
});
}
return result;
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.html b/chromium/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.html
index 0615915e355..374d88b2f04 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.html
@@ -61,7 +61,7 @@
<div slot="title">[[i18n('networkSimEnterPinTitle')]]</div>
<div slot="body">
<div id="enter-pin-description" aria-hidden="true">
- [[i18n('networkSimEnterPinDescription')]]
+ [[getEnterPinDescription_(isSimPinLockRestricted_)]]
</div>
<network-password-input id="enterPin"
value="{{pin_}}"
@@ -133,14 +133,19 @@
<cr-dialog id="unlockPinDialog"
on-cancel="onCancel_"
close-text="[[i18n('close')]]">
- <div slot="title">[[i18n('networkSimLockedTitle')]]</div>
+ <div slot="title" aria-live="polite">[[i18n('networkSimLockedTitle')]]</div>
<div slot="body">
+ <template is="dom-if" if="[[isSimPinLockRestricted_]]">
+ <div id="adminSubtitle">
+ [[i18n('networkSimLockPolicyAdminSubtitle')]]
+ </div>
+ </template>
<network-password-input id="unlockPin"
value="{{pin_}}"
on-enter="sendUnlockPin_"
disabled="[[inProgress_]]">
</network-password-input>
- <div class="pinEntrySubtext" aria-live="assertive">
+ <div class="pinEntrySubtext" aria-live="polite">
[[getPinEntrySubtext_(error_, deviceState)]]
</div>
</div>
@@ -160,18 +165,19 @@
<cr-dialog id="unlockPukDialog"
on-cancel="onCancel_"
close-text="[[i18n('close')]]">
- <div slot="title">[[i18n('networkSimLockedTitle')]]</div>
+ <div slot="title" aria-live="polite">[[i18n('networkSimLockedTitle')]]</div>
<div slot="body">
<div id="puk-subtitle">
- [[i18n('networkSimPukDialogSubtitle')]]
+ [[getNetworkSimPukDialogString_(isSimPinLockRestricted_)]]
</div>
<div id="puk-warning-container">
<template is="dom-if" if="[[hasErrorText_]]">
<iron-icon id="puk-warning-icon" icon="cellular-setup:warning">
</iron-icon>
</template>
- <div aria-live="assertive">
- [[getPukWarningMessage_(error_, deviceState)]]
+ <div aria-live="polite">
+ [[getPukWarningMessage_(error_, deviceState,
+ isSimPinLockRestricted_)]]
</div>
</div>
<network-password-input id="unlockPuk"
@@ -182,10 +188,13 @@
error-message="[[getPukErrorMessage_(error_, deviceState)]]"
allow-error-message>
</network-password-input>
+ <!-- TODO(b/228093904): Use template dom-if instead of
+ hidden for SIM PIN Lock Dialog refactor. -->
<network-password-input id="unlockPin1"
value="{{pin_new1_}}"
label="[[i18n('networkSimEnterNewPin')]]"
disabled="[[inProgress_]]"
+ hidden="[[isSimPinLockRestricted_]]"
allow-error-message>
</network-password-input>
<network-password-input id="unlockPin2"
@@ -194,7 +203,9 @@
on-enter="sendUnlockPuk_"
disabled="[[inProgress_]]"
invalid="[[isSecondNewPinInvalid_(error_, deviceState)]]"
- error-message="[[getSecondNewPinErrorMessage_(error_, deviceState)]]"
+ error-message="[[getSecondNewPinErrorMessage_(error_,
+ deviceState)]]"
+ hidden="[[isSimPinLockRestricted_]]"
allow-error-message>
</network-password-input>
</div>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.js b/chromium/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.js
index 8e4dc3a44d8..6582fefb164 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.js
@@ -14,7 +14,7 @@ const ErrorType = {
INCORRECT_PUK: 'incorrect-puk',
MISMATCHED_PIN: 'mismatched-pin',
INVALID_PIN: 'invalid-pin',
- INVALID_PUK: 'invalid-puk'
+ INVALID_PUK: 'invalid-puk',
};
const DIGITS_ONLY_REGEX = /^[0-9]+$/;
@@ -34,6 +34,9 @@ Polymer({
observer: 'deviceStateChanged_',
},
+ /** @type {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} */
+ globalPolicy: Object,
+
/**
* Set to true when there is an open dialog.
* @type {boolean}
@@ -149,6 +152,23 @@ Polymer({
type: String,
observer: 'pinOrPukChange_',
},
+
+ /** @private {boolean} */
+ isSimLockPolicyEnabled_: {
+ type: Boolean,
+ value() {
+ return loadTimeData.valueExists('isSimLockPolicyEnabled') &&
+ loadTimeData.getBoolean('isSimLockPolicyEnabled');
+ },
+ },
+
+ /** @private {boolean} */
+ isSimPinLockRestricted_: {
+ type: Boolean,
+ value: false,
+ computed: 'computeIsSimPinLockRestricted_(isSimLockPolicyEnabled_,' +
+ 'globalPolicy, globalPolicy.*)',
+ },
},
/** @private {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
@@ -284,6 +304,15 @@ Polymer({
},
/**
+ * @return {boolean}
+ * @private
+ */
+ computeIsSimPinLockRestricted_() {
+ return this.isSimLockPolicyEnabled_ && !!this.globalPolicy &&
+ !this.globalPolicy.allowCellularSimLock;
+ },
+
+ /**
* Clears error message on user interacion.
* @private
*/
@@ -349,6 +378,12 @@ Polymer({
if (!this.validatePuk_(puk)) {
return;
}
+
+ if (this.isSimPinLockRestricted_) {
+ this.unlockCellularSim_('', puk);
+ return;
+ }
+
const pin = this.$.unlockPin1.value;
if (!this.validatePin_(pin, this.$.unlockPin2.value)) {
return;
@@ -444,8 +479,9 @@ Polymer({
this.enterPinEnabled_ = !this.inProgress_ && !!this.pin_ && !hasError;
this.changePinEnabled_ = !this.inProgress_ && !!this.pin_ &&
!!this.pin_new1_ && !!this.pin_new2_ && !hasError;
- this.enterPukEnabled_ = !this.inProgress_ && !!this.puk_ &&
- !!this.pin_new1_ && !!this.pin_new2_ && !hasError;
+ this.enterPukEnabled_ = !this.inProgress_ && !!this.puk_ && !hasError &&
+ (this.isSimPinLockRestricted_ ||
+ (!!this.pin_new1_ && !!this.pin_new2_));
},
/**
@@ -542,6 +578,16 @@ Polymer({
* @return {string}
* @private
*/
+ getEnterPinDescription_() {
+ return this.isSimPinLockRestricted_ ?
+ this.i18n('networkSimLockPolicyAdminSubtitle') :
+ this.i18n('networkSimEnterPinDescription');
+ },
+
+ /**
+ * @return {string}
+ * @private
+ */
getErrorMsg_() {
if (this.error_ === ErrorType.NONE) {
return '';
@@ -679,6 +725,26 @@ Polymer({
* @private
*/
getPukWarningMessage_() {
+ return this.isSimPinLockRestricted_ ?
+ this.getPukWarningSimPinRestrictedMessage_() :
+ this.getPukWarningSimPinUnrestrictedMessage_();
+ },
+
+ /**
+ * @return {string}
+ * @private
+ */
+ getNetworkSimPukDialogString_() {
+ return this.isSimPinLockRestricted_ ?
+ this.i18n('networkSimPukDialogManagedSubtitle') :
+ this.i18n('networkSimPukDialogSubtitle');
+ },
+
+ /**
+ * @return {string}
+ * @private
+ */
+ getPukWarningSimPinUnrestrictedMessage_() {
if (this.isPukInvalid_()) {
const retriesLeft = this.getNumRetriesLeft_();
if (retriesLeft === 1) {
@@ -690,5 +756,24 @@ Polymer({
return this.i18n('networkSimPukDialogWarningNoFailures');
},
+
+ /**
+ * @return {string}
+ * @private
+ */
+ getPukWarningSimPinRestrictedMessage_() {
+ if (this.isPukInvalid_()) {
+ const retriesLeft = this.getNumRetriesLeft_();
+ if (retriesLeft === 1) {
+ return this.i18n(
+ 'networkSimPukDialogManagedWarningWithFailure', retriesLeft);
+ }
+
+ return this.i18n(
+ 'networkSimPukDialogManagedWarningWithFailures', retriesLeft);
+ }
+
+ return this.i18n('networkSimPukDialogManagedWarningNoFailures');
+ },
});
})(); \ No newline at end of file
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.m.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.m.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.m.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics.js b/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics.js
index 6d0a42a7e6d..346d015dd4f 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics.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 '../../../cr_elements/cr_button/cr_button.m.js';
+import '../../../cr_elements/cr_button/cr_button.js';
import './routine_group.js';
import {loadTimeData} from '//resources/js/load_time_data.m.js';
@@ -53,7 +53,7 @@ Polymer({
type: Boolean,
value() {
return loadTimeData.getBoolean('enableArcNetworkDiagnostics');
- }
+ },
},
/**
@@ -72,7 +72,7 @@ Polymer({
type: RoutineType.kLanConnectivity,
func: () => getNetworkDiagnosticsService().runLanConnectivity(),
},
- ]
+ ],
},
{
group: RoutineGroup.WIFI,
@@ -88,7 +88,7 @@ Polymer({
func: () =>
getNetworkDiagnosticsService().runHasSecureWiFiConnection(),
},
- ]
+ ],
},
{
group: RoutineGroup.PORTAL,
@@ -98,7 +98,7 @@ Polymer({
type: RoutineType.kCaptivePortal,
func: () => getNetworkDiagnosticsService().runCaptivePortal(),
},
- ]
+ ],
},
{
group: RoutineGroup.GATEWAY,
@@ -109,7 +109,7 @@ Polymer({
func: () =>
getNetworkDiagnosticsService().runGatewayCanBePinged(),
},
- ]
+ ],
},
{
group: RoutineGroup.FIREWALL,
@@ -130,7 +130,7 @@ Polymer({
type: RoutineType.kHttpsLatency,
func: () => getNetworkDiagnosticsService().runHttpsLatency(),
},
- ]
+ ],
},
{
group: RoutineGroup.DNS,
@@ -151,7 +151,7 @@ Polymer({
type: RoutineType.kDnsResolution,
func: () => getNetworkDiagnosticsService().runDnsResolution(),
},
- ]
+ ],
},
{
group: RoutineGroup.GOOGLE_SERVICES,
@@ -164,8 +164,8 @@ Polymer({
func: () => getNetworkDiagnosticsService().runVideoConferencing(
/*stun_server_hostname=*/ null),
},
- ]
- }
+ ],
+ },
];
if (this.areArcNetworkingRoutinesEnabled_) {
routineGroups.push({
@@ -187,7 +187,7 @@ Polymer({
func: () =>
getNetworkDiagnosticsService().runArcDnsResolution(),
},
- ]
+ ],
});
}
const routines = [];
@@ -200,7 +200,7 @@ Polymer({
}
return routines;
- }
+ },
},
/**
@@ -210,7 +210,7 @@ Polymer({
RoutineGroup_: {
type: Object,
value: RoutineGroup,
- }
+ },
},
/**
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics_types.js b/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics_types.js
index f6a23cbd7e1..217516b90c4 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics_types.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics_types.js
@@ -44,11 +44,11 @@ export const RoutineGroup = {
FIREWALL: 4,
DNS: 5,
GOOGLE_SERVICES: 6,
- ARC: 7
+ ARC: 7,
};
export const Icons = {
TEST_FAILED: 'test_failed.png',
TEST_NOT_RUN: 'test_not_run.png',
- TEST_PASSED: 'test_passed.png'
+ TEST_PASSED: 'test_passed.png',
};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.js b/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.js
index 82c6037a4ef..8b6fd7e8dab 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.js
@@ -194,8 +194,10 @@ Polymer({
*/
showSettingsLink_(network) {
const validStates = [
- NetworkState.kConnected, NetworkState.kConnecting, NetworkState.kPortal,
- NetworkState.kOnline
+ NetworkState.kConnected,
+ NetworkState.kConnecting,
+ NetworkState.kPortal,
+ NetworkState.kOnline,
];
return validStates.includes(network.state);
},
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/os_cr_components.gni b/chromium/ui/webui/resources/cr_components/chromeos/os_cr_components.gni
index 7ed33bffa18..8a14e94d76d 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/os_cr_components.gni
+++ b/chromium/ui/webui/resources/cr_components/chromeos/os_cr_components.gni
@@ -70,3 +70,14 @@ cr_components_chromeos_auto_imports = [
"ui/webui/resources/html/list_property_update_behavior.html|ListPropertyUpdateBehavior",
"ui/webui/resources/html/polymer.html|Polymer,flush,html,afterNextRender",
]
+
+cr_components_migrated_imports = [
+ "ui/webui/resources/cr_elements/cr_button/cr_button.html",
+ "ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html",
+ "ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html",
+ "ui/webui/resources/cr_elements/cr_input/cr_input.html",
+ "ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.html",
+ "ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.html",
+ "ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html",
+ "ui/webui/resources/html/list_property_update_behavior.html",
+]
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/BUILD.gn b/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/BUILD.gn
index 846598d9b07..83d1b6971fa 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/BUILD.gn
@@ -29,7 +29,7 @@ js_library("pin_keyboard.m") {
sources = [ "$root_gen_dir/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.m.js" ]
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_input:cr_input.m",
+ "//ui/webui/resources/cr_elements/cr_input:cr_input",
"//ui/webui/resources/js:i18n_behavior.m",
]
extra_deps = [ ":pin_keyboard_module" ]
@@ -63,6 +63,7 @@ polymer_modulizer("pin_keyboard") {
html_file = "pin_keyboard.html"
html_type = "dom-module"
namespace_rewrites = cr_components_chromeos_namespace_rewrites
+ migrated_imports = cr_components_migrated_imports
auto_imports = cr_components_chromeos_auto_imports
}
@@ -71,6 +72,7 @@ polymer_modulizer("setup_pin_keyboard") {
html_file = "setup_pin_keyboard.html"
html_type = "dom-module"
namespace_rewrites = cr_components_chromeos_namespace_rewrites
+ migrated_imports = cr_components_migrated_imports
auto_imports = cr_components_chromeos_auto_imports
}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/lock_screen_constants.js b/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/lock_screen_constants.js
index fd1606d2d22..7cc0d46b405 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/lock_screen_constants.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/lock_screen_constants.js
@@ -22,7 +22,7 @@ cr.define('settings', function() {
CHOOSE_PIN_OR_PASSWORD: 2,
ENTER_PIN: 3,
CONFIRM_PIN: 4,
- MAX_BUCKET: 5
+ MAX_BUCKET: 5,
};
/**
* Helper function to send the progress of the pin setup to be recorded in the
@@ -37,13 +37,15 @@ cr.define('settings', function() {
return;
}
chrome.send('metricsHandler:recordInHistogram', [
- PinUnlockUmaHistogramName, currentProgress, LockScreenProgress.MAX_BUCKET
+ PinUnlockUmaHistogramName,
+ currentProgress,
+ LockScreenProgress.MAX_BUCKET,
]);
};
// #cr_define_end
return {
recordLockScreenProgress: recordLockScreenProgress,
- LockScreenProgress: LockScreenProgress
+ LockScreenProgress: LockScreenProgress,
};
});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/setup_pin_keyboard.js b/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/setup_pin_keyboard.js
index c395db0f9eb..8d0fd1647de 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/setup_pin_keyboard.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/setup_pin_keyboard.js
@@ -25,7 +25,7 @@
/** @enum {string} */
/* #export */ const ProblemType = {
WARNING: 'warning',
- ERROR: 'error'
+ ERROR: 'error',
};
Polymer({
@@ -98,7 +98,7 @@ Polymer({
type: Object,
value() {
return function() {};
- }
+ },
},
/**
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/BUILD.gn b/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/BUILD.gn
index a5aeb3ae142..aa165d6cedf 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/BUILD.gn
@@ -18,10 +18,9 @@ js_type_check("closure_compile_module") {
js_library("add_smb_share_dialog") {
deps = [
":smb_browser_proxy",
- "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
- "//ui/webui/resources/cr_elements/cr_checkbox:cr_checkbox.m",
- "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
- "//ui/webui/resources/cr_elements/cr_input:cr_input.m",
+ "//ui/webui/resources/cr_elements/cr_button:cr_button",
+ "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog",
+ "//ui/webui/resources/cr_elements/cr_input:cr_input",
"//ui/webui/resources/js:cr.m",
"//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:load_time_data.m",
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/add_smb_share_dialog.js b/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/add_smb_share_dialog.js
index 20c0b559e13..b6e2c038666 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/add_smb_share_dialog.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/smb_shares/add_smb_share_dialog.js
@@ -9,10 +9,10 @@
* destroyed when finished, and re-created when shown again.
*/
-import '../../../cr_elements/cr_button/cr_button.m.js';
-import '../../../cr_elements/cr_checkbox/cr_checkbox.m.js';
-import '../../../cr_elements/cr_dialog/cr_dialog.m.js';
-import '../../../cr_elements/cr_input/cr_input.m.js';
+import '../../../cr_elements/cr_button/cr_button.js';
+import '../../../cr_elements/cr_checkbox/cr_checkbox.js';
+import '../../../cr_elements/cr_dialog/cr_dialog.js';
+import '../../../cr_elements/cr_input/cr_input.js';
import '../../../cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.js';
import '../../../cr_elements/icons.m.js';
import '../../../cr_elements/shared_style_css.m.js';
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/traffic_counters/traffic_counters.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/traffic_counters/traffic_counters.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/traffic_counters/traffic_counters.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/traffic_counters/traffic_counters_adapter.d.ts b/chromium/ui/webui/resources/cr_components/chromeos/traffic_counters/traffic_counters_adapter.d.ts
new file mode 100644
index 00000000000..bb6e23a8aa7
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/traffic_counters/traffic_counters_adapter.d.ts
@@ -0,0 +1,5 @@
+// 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.
+
+export {};
diff --git a/chromium/ui/webui/resources/cr_components/color_change_listener/BUILD.gn b/chromium/ui/webui/resources/cr_components/color_change_listener/BUILD.gn
index 97fa1971347..3fad7e0e3c7 100644
--- a/chromium/ui/webui/resources/cr_components/color_change_listener/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/color_change_listener/BUILD.gn
@@ -6,6 +6,8 @@ import("//mojo/public/tools/bindings/mojom.gni")
import("//tools/typescript/ts_library.gni")
import("//ui/webui/resources/tools/generate_grd.gni")
+assert(!is_android && !is_ios)
+
preprocess_folder = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/color_change_listener"
mojom("mojom") {
@@ -49,6 +51,7 @@ generate_grd("build_grdp") {
grd_prefix = "cr_components_color_change_listener"
out_grd = "$target_gen_dir/resources.grdp"
public_deps = [ ":build_ts" ]
- manifest_files = [ "$target_gen_dir/tsconfig.manifest" ]
+ manifest_files =
+ filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
resource_path_prefix = "cr_components/color_change_listener"
}
diff --git a/chromium/ui/webui/resources/cr_components/color_change_listener/colors_css_updater.ts b/chromium/ui/webui/resources/cr_components/color_change_listener/colors_css_updater.ts
index edd9997b080..4cad3509d1b 100644
--- a/chromium/ui/webui/resources/cr_components/color_change_listener/colors_css_updater.ts
+++ b/chromium/ui/webui/resources/cr_components/color_change_listener/colors_css_updater.ts
@@ -11,8 +11,9 @@ import {BrowserProxy} from './browser_proxy.js';
/**
* The CSS selector used to get the <link> node with the colors.css stylesheet.
+ * The wildcard is needed since the URL ends with a timestamp.
*/
-export const COLORS_CSS_SELECTOR: string = 'link[href$=\'colors.css\']';
+export const COLORS_CSS_SELECTOR: string = 'link[href*=\'colors.css\']';
/**
* Forces the document to refresh its colors.css stylesheet. This is used to
@@ -29,8 +30,8 @@ export function refreshColorCss(): boolean {
return false;
}
const hrefURL = new URL(href);
- const params =
- new URLSearchParams([['version', new Date().getTime().toString()]]);
+ const params = new URLSearchParams(hrefURL.search);
+ params.set('version', new Date().getTime().toString());
const newHref = `${hrefURL.origin}${hrefURL.pathname}?${params.toString()}`;
colorCssNode.setAttribute('href', newHref);
return true;
diff --git a/chromium/ui/webui/resources/cr_components/customize_themes/BUILD.gn b/chromium/ui/webui/resources/cr_components/customize_themes/BUILD.gn
index 060c24d9ec7..93d6305ff9d 100644
--- a/chromium/ui/webui/resources/cr_components/customize_themes/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/customize_themes/BUILD.gn
@@ -7,6 +7,7 @@ import("//tools/grit/preprocess_if_expr.gni")
import("//tools/polymer/html_to_wrapper.gni")
import("//tools/typescript/ts_library.gni")
import("//ui/webui/resources/tools/generate_grd.gni")
+import("//ui/webui/webui_features.gni")
import("customize_themes.gni")
assert(!is_android && !is_ios)
@@ -22,16 +23,32 @@ mojom("mojom") {
webui_module_path = "chrome://resources/cr_components/customize_themes/"
}
-html_to_wrapper("html_wrapper_files") {
- in_files = html_files
-}
-
# Output folder used to hold preprocess_if_expr() output.
preprocess_folder_tmp = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/customize_themes_tmp"
# Output folder used to hold ts_library() output.
preprocess_folder = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/customize_themes"
+preprocess_if_expr("preprocess") {
+ in_folder = "."
+ out_folder = preprocess_folder_tmp
+ in_files = ts_files + html_files
+}
+
+html_to_wrapper("html_wrapper_files") {
+ deps = [ ":preprocess" ]
+ in_folder = preprocess_folder_tmp
+ out_folder = preprocess_folder_tmp
+ in_files = html_files
+ minify = optimize_webui
+}
+
+copy("copy_mojom") {
+ deps = [ ":mojom_webui_js" ]
+ sources = [ "$root_gen_dir/mojom-webui/ui/webui/resources/cr_components/customize_themes/customize_themes.mojom-webui.js" ]
+ outputs = [ "$preprocess_folder_tmp/{{source_file_part}}" ]
+}
+
ts_library("build_ts") {
root_dir = preprocess_folder_tmp
out_dir = preprocess_folder
@@ -46,30 +63,11 @@ ts_library("build_ts") {
]
extra_deps = [
":copy_mojom",
- ":preprocess_generated",
- ":preprocess_src",
+ ":html_wrapper_files",
+ ":preprocess",
]
}
-preprocess_if_expr("preprocess_src") {
- in_folder = "."
- out_folder = preprocess_folder_tmp
- in_files = ts_files
-}
-
-preprocess_if_expr("preprocess_generated") {
- deps = [ ":html_wrapper_files" ]
- in_folder = target_gen_dir
- out_folder = preprocess_folder_tmp
- in_files = html_wrapper_files
-}
-
-copy("copy_mojom") {
- deps = [ ":mojom_webui_js" ]
- sources = [ "$root_gen_dir/mojom-webui/ui/webui/resources/cr_components/customize_themes/customize_themes.mojom-webui.js" ]
- outputs = [ "$preprocess_folder_tmp/{{source_file_part}}" ]
-}
-
generate_grd("build_grdp") {
grd_prefix = "cr_components_customize_themes"
out_grd = "$target_gen_dir/resources.grdp"
@@ -79,6 +77,7 @@ generate_grd("build_grdp") {
"brush.svg",
]
public_deps = [ ":build_ts" ]
- manifest_files = [ "$target_gen_dir/tsconfig.manifest" ]
+ manifest_files =
+ filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
resource_path_prefix = "cr_components/customize_themes"
}
diff --git a/chromium/ui/webui/resources/cr_components/customize_themes/customize_themes.html b/chromium/ui/webui/resources/cr_components/customize_themes/customize_themes.html
index b03b9484cbd..511ea11af89 100644
--- a/chromium/ui/webui/resources/cr_components/customize_themes/customize_themes.html
+++ b/chromium/ui/webui/resources/cr_components/customize_themes/customize_themes.html
@@ -147,7 +147,8 @@
</cr-button>
</div>
</div>
-<cr-grid id="themesContainer" columns="6" role="radiogroup">
+<cr-grid id="themesContainer" aria-label="[[i18n('themesContainerLabel')]]"
+ columns="6" role="radiogroup">
<div aria-label="[[i18n('colorPickerLabel')]]"
tabindex$="[[getTabIndex_('autogenerated', selectedTheme)]]"
on-click="onAutogeneratedThemeClick_" role="radio"
diff --git a/chromium/ui/webui/resources/cr_components/customize_themes/customize_themes.ts b/chromium/ui/webui/resources/cr_components/customize_themes/customize_themes.ts
index 5a8ba09c625..2eb816b6b3a 100644
--- a/chromium/ui/webui/resources/cr_components/customize_themes/customize_themes.ts
+++ b/chromium/ui/webui/resources/cr_components/customize_themes/customize_themes.ts
@@ -3,8 +3,8 @@
// found in the LICENSE file.
import '../managed_dialog/managed_dialog.js';
-import '../../cr_elements/cr_button/cr_button.m.js';
-import '../../cr_elements/cr_icon_button/cr_icon_button.m.js';
+import '../../cr_elements/cr_button/cr_button.js';
+import '../../cr_elements/cr_icon_button/cr_icon_button.js';
import '../../cr_elements/cr_icons_css.m.js';
import '../../cr_elements/cr_grid/cr_grid.js';
import '../../cr_elements/shared_vars_css.m.js';
@@ -76,13 +76,13 @@ export class CustomizeThemesElement extends CustomizeThemesElementBase {
showManagedThemeDialog_: {
type: Boolean,
value: false,
- }
+ },
};
}
selectedTheme: Theme|null;
autoConfirmThemeChanges: boolean;
- private chromeThemes_: Array<ChromeTheme>;
+ private chromeThemes_: ChromeTheme[];
private showManagedThemeDialog_: boolean;
private handler_: CustomizeThemesHandlerInterface =
diff --git a/chromium/ui/webui/resources/cr_components/help_bubble/BUILD.gn b/chromium/ui/webui/resources/cr_components/help_bubble/BUILD.gn
new file mode 100644
index 00000000000..cbe4967bb8c
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/help_bubble/BUILD.gn
@@ -0,0 +1,78 @@
+# 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("//mojo/public/tools/bindings/mojom.gni")
+import("//tools/grit/preprocess_if_expr.gni")
+import("//tools/polymer/html_to_wrapper.gni")
+import("//tools/typescript/ts_library.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
+import("help_bubble.gni")
+
+assert(!is_android && !is_ios)
+
+mojom("mojo_bindings") {
+ sources = [ "help_bubble.mojom" ]
+
+ public_deps = [ "//mojo/public/mojom/base" ]
+
+ webui_module_path = "chrome://resources/cr_components/help_bubble/"
+}
+
+html_to_wrapper("html_wrapper_files") {
+ in_files = html_files
+}
+
+# Output folder used to hold preprocess_if_expr() output.
+preprocess_folder_tmp = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/help_bubble_tmp"
+
+# Output folder used to hold ts_library() output.
+preprocess_folder =
+ "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/help_bubble"
+
+ts_library("build_ts") {
+ root_dir = preprocess_folder_tmp
+ out_dir = preprocess_folder
+ composite = true
+ tsconfig_base = "tsconfig_base.json"
+ in_files = ts_files + html_wrapper_files + mojo_files
+
+ deps = [
+ "//third_party/polymer/v3_0:library",
+ "//ui/webui/resources:library",
+ "//ui/webui/resources/mojo:library",
+ ]
+ extra_deps = [
+ ":copy_mojom",
+ ":preprocess_generated",
+ ":preprocess_src",
+ ]
+}
+
+preprocess_if_expr("preprocess_src") {
+ in_folder = "."
+ out_folder = preprocess_folder_tmp
+ in_files = ts_files
+}
+
+preprocess_if_expr("preprocess_generated") {
+ deps = [ ":html_wrapper_files" ]
+ in_folder = target_gen_dir
+ out_folder = preprocess_folder_tmp
+ in_files = html_wrapper_files
+}
+
+copy("copy_mojom") {
+ deps = [ ":mojo_bindings_webui_js" ]
+ sources = [ "$root_gen_dir/mojom-webui/ui/webui/resources/cr_components/help_bubble/help_bubble.mojom-webui.js" ]
+ outputs = [ "$preprocess_folder_tmp/{{source_file_part}}" ]
+}
+
+generate_grd("build_grdp") {
+ grd_prefix = "cr_components_help_bubble"
+ out_grd = "$target_gen_dir/resources.grdp"
+ deps = [ ":build_ts" ]
+ manifest_files =
+ filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
+ resource_path_prefix = "cr_components/help_bubble"
+}
diff --git a/chromium/ui/webui/resources/cr_components/help_bubble/COMMON_METADATA b/chromium/ui/webui/resources/cr_components/help_bubble/COMMON_METADATA
new file mode 100644
index 00000000000..973c3b1f096
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/help_bubble/COMMON_METADATA
@@ -0,0 +1,3 @@
+monorail {
+ component: "UI>Browser>UserEducation"
+} \ No newline at end of file
diff --git a/chromium/ui/aura/cursor/DIR_METADATA b/chromium/ui/webui/resources/cr_components/help_bubble/DIR_METADATA
index f3434449946..c06412005f7 100644
--- a/chromium/ui/aura/cursor/DIR_METADATA
+++ b/chromium/ui/webui/resources/cr_components/help_bubble/DIR_METADATA
@@ -6,6 +6,4 @@
# For the schema of this file, see Metadata message:
# https://source.chromium.org/chromium/infra/infra/+/main:go/src/infra/tools/dirmd/proto/dir_metadata.proto
-monorail {
- component: "Internals>Input"
-}
+mixins: "//ui/webui/resources/cr_components/help_bubble/COMMON_METADATA"
diff --git a/chromium/ui/webui/resources/cr_components/help_bubble/OWNERS b/chromium/ui/webui/resources/cr_components/help_bubble/OWNERS
new file mode 100644
index 00000000000..2e22546b6d1
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/help_bubble/OWNERS
@@ -0,0 +1,6 @@
+dfried@chromium.org
+dpenning@chromium.org
+emshack@chromium.org
+
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chromium/ui/webui/resources/cr_components/help_bubble/README.md b/chromium/ui/webui/resources/cr_components/help_bubble/README.md
new file mode 100644
index 00000000000..9cd5b72501a
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/help_bubble/README.md
@@ -0,0 +1,80 @@
+# WebUI HelpBubble Implementation (Frontend)
+
+[Backend documentation can be found here.](/components/user_education/webui/README.md)
+
+Allows a WebUI page to support Polymer-based, blue material design ("Navi")
+[HelpBubble](/components/user_education/common/help_bubble.h)s that can be shown in the course of a
+[Feature Promo](/components/user_education/common/feature_promo_controller.h) or
+[Tutorial](/components/user_education/common/tutorial.h).
+
+This is done by associating HTML elements in a component with an
+[ElementIdentifier](/ui/base/interaction/element_identifier.h) so they can be
+referenced by a Tutorial step or a `FeaturePromoSpecification`.
+
+Once elements are linked in this way, their visibility is reported via
+[ElementTracker](/ui/base/interaction/element_tracker.h) and can be referenced
+for any of the usual purposes (e.g. in tests or "hidden" Tutorial steps) and
+not just for the purpose of anchoring a help bubble.
+
+## Usage
+
+Please start with the instructions in the
+[Backend Usage Guide](/components/user_education/webui/README.md#usage), and
+proceed here when you reach the appropriate step.
+
+Once you have performed setup on the backend:
+
+ * Add [HelpBubbleMixin](./help_bubble_mixin.ts) to your Polymer component.
+
+ * In your component's `ready()` or `connectedCallback()` method, call
+ `HelpBubbleMixin.registerHelpBubbleIdentifier()` one or more times.
+
+ * The first parameter should be the name of an
+ [ElementIdentifier](/ui/base/interaction/element_identifier.h) you
+ specified when creating your
+ [HelpBubbleHandler](/components/user_education/webui/help_bubble_handler.h)
+ in your
+ [WebUIController](/content/public/browser/web_ui_controller.h)
+
+ * For elements declared with `DECLARE_ELEMENT_IDENTIFIER_VALUE()` this is
+ just the name of the constant you specified.
+
+ * The second parameter should be the HTML element id of the element you wish
+ to anchor the help bubble to when it is displayed.
+
+ * In this way, you effectively create a mapping between the native identifier
+ and the anchor element.
+
+ * You may add multiple mappings, though each ElementIdentifier name and each
+ HTML id may only be mapped once.
+
+ * You may also add mappings for elements you do not intend to anchor a help
+ bubble to, but whose visibility you care able for a Tutorial step or
+ interactive test.
+
+ * It is rare, but if your anchor element is not immediately present in your
+ component, you can instead wait to call `registerHelpBubbleIdentifier()`
+ until after the element is created.
+
+## Limitations
+
+Currently the frontend has the following limitations (many of these will be
+relaxed or removed in the near future):
+
+ * Whether the native code believes that a help bubble can be shown in your
+ component is based on the visibility of the corresponding anchor HTML element
+ - the one with the ID you passed to
+ `HelpBubbleMixin.registerHelpBubbleIdentifier()`.
+
+ * Visibility is not determined relative to the current viewport but rather to
+ the entire page. The viewport will automatically scroll to display the
+ anchor element when the bubble is shown.
+
+ * Some features of `HelpBubble` are not yet supported (or are not fully
+ supported) in WebUI. Support for the following will be added in future
+ updates:
+ * Timeouts
+ * Close button
+ * Action buttons
+ * Progress indicator
+ * Most `user_education::HelpBubbleArrow` values
diff --git a/chromium/ui/webui/resources/cr_components/help_bubble/help_bubble.gni b/chromium/ui/webui/resources/cr_components/help_bubble/help_bubble.gni
new file mode 100644
index 00000000000..2669f0a1f32
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/help_bubble/help_bubble.gni
@@ -0,0 +1,27 @@
+# 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.
+
+# Files holding a Polymer element definition AND have an equivalent .html file.
+_web_component_files = [ "help_bubble.ts" ]
+
+# Files that are passed as input to html_to_wrapper().
+html_files = []
+foreach(f, _web_component_files) {
+ html_files += [ string_replace(f, ".ts", ".html") ]
+}
+
+# Files that are generated by html_to_wrapper().
+html_wrapper_files = []
+foreach(f, html_files) {
+ html_wrapper_files += [ f + ".ts" ]
+}
+
+_non_web_component_files = [
+ "help_bubble_mixin.ts",
+ "help_bubble_proxy.ts",
+]
+
+mojo_files = [ "help_bubble.mojom-webui.js" ]
+
+ts_files = _web_component_files + _non_web_component_files
diff --git a/chromium/ui/webui/resources/cr_components/help_bubble/help_bubble.html b/chromium/ui/webui/resources/cr_components/help_bubble/help_bubble.html
new file mode 100644
index 00000000000..5ec2a385c8d
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/help_bubble/help_bubble.html
@@ -0,0 +1,239 @@
+<style include="cr-hidden-style">
+ :host {
+ position: absolute;
+ z-index: 1;
+ }
+
+ /* HelpBubblePosition.ABOVE */
+ :host([position='0']) {
+ transform: translateY(-100%);
+ }
+
+ /* HelpBubblePosition.BELOW */
+ :host([position='1']) {
+ transform: none;
+ }
+
+ /* HelpBubblePosition.LEFT */
+ :host([position='2']) {
+ transform: translate(-100%, -50%);
+ }
+
+ /* HelpBubblePosition.RIGHT */
+ :host([position='3']) {
+ transform: translateY(-50%);
+ }
+
+ #arrow {
+ --help-bubble-arrow-size: 16px;
+ --help-bubble-arrow-offset: calc(var(--help-bubble-arrow-size) / 2);
+ background-color: var(--help-bubble-background);
+ height: var(--help-bubble-arrow-size);
+ position: absolute;
+ transform: rotate(-45deg);
+ width: var(--help-bubble-arrow-size);
+ z-index: -1;
+ }
+
+ /* Turns the arrow direction downwards, when the bubble is placed above
+ * the anchor element */
+ #arrow.above {
+ border-bottom-left-radius: 2px;
+ bottom: calc(0 - var(--help-bubble-arrow-offset));
+ left: calc(50% - var(--help-bubble-arrow-offset));
+ }
+
+ /* Turns the arrow direction upwards, when the bubble is placed below
+ * the anchor element */
+ #arrow.below {
+ border-top-right-radius: 2px;
+ left: calc(50% - var(--help-bubble-arrow-offset));
+ top: calc(0 - var(--help-bubble-arrow-offset));
+ }
+
+ /* Turns the arrow direction to the right, when the bubble is placed to the
+ * left of the anchor element */
+ #arrow.left {
+ border-bottom-right-radius: 2px;
+ right: calc(0 - var(--help-bubble-arrow-offset));
+ top: calc(50% - var(--help-bubble-arrow-offset));
+ }
+
+ /* Turns the arrow direction to the left, when the bubble is placed to the
+ * right of the anchor element */
+ #arrow.right {
+ border-top-left-radius: 2px;
+ left: calc(0 - var(--help-bubble-arrow-offset));
+ top: calc(50% - var(--help-bubble-arrow-offset));
+ }
+
+ #topContainer {
+ display: flex;
+ flex-direction: row;
+ }
+
+ #progress {
+ display: inline-block;
+ flex: auto;
+ }
+
+ #progress div {
+ --help-bubble-progress-size: 8px;
+ background-color: var(--help-bubble-text-color);
+ border: 1px solid var(--help-bubble-text-color);
+ border-radius: 50%;
+ display: inline-block;
+ height: var(--help-bubble-progress-size);
+ margin-inline-end: var(--help-bubble-element-spacing);
+ margin-top: 5px;
+ width: var(--help-bubble-progress-size);
+ }
+
+ #progress .total-progress {
+ background-color: var(--help-bubble-background);
+ }
+
+ .body {
+ flex: 1;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: 500;
+ letter-spacing: 0.3px;
+ line-height: 20px;
+ }
+
+ .title {
+ flex: 1;
+ font-family: 'Roboto';
+ font-size: 18px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 22px;
+ }
+
+ /* Note: help bubbles have the same color treatment in both light and dark
+ * themes, which is why the values below do not change based on theme
+ * preference. */
+
+ .help-bubble {
+ --help-bubble-background: var(--google-blue-700);
+ --help-bubble-element-spacing: 8px;
+ --help-bubble-text-color: var(--google-grey-200);
+ background-color: var(--help-bubble-background);
+ border-radius: 8px;
+ box-shadow: 0 6px 10px 4px rgba(60, 64, 67, 0.15), 0 2px 3px rgba(60, 64, 67, 0.3);
+ color: var(--help-bubble-text-color);
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ padding: 16px 20px;
+ width: 340px;
+ }
+
+ #main {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ margin-top: var(--help-bubble-element-spacing);
+ }
+
+ #middleRowSpacer {
+ margin-inline-start: 32px;
+ }
+
+ cr-icon-button {
+ --cr-icon-button-fill-color: var(--help-bubble-text-color);
+ --cr-icon-button-hover-background-color:
+ rgba(var(--google-blue-300-rgb), .3);
+ --cr-icon-button-icon-size: 16px;
+ --cr-icon-button-size: 24px;
+ --cr-icon-button-stroke-color: var(--help-bubble-text-color);
+ box-sizing: border-box;
+ display: block;
+ flex: none;
+ float: right;
+ height: var(--cr-icon-button-size);
+ margin: 0;
+ margin-inline-start: var(--help-bubble-element-spacing);
+ order: 2;
+ width: var(--cr-icon-button-size);
+ }
+
+ cr-icon-button:focus {
+ border: 2px solid var(--help-bubble-text-color);
+ }
+
+ #infoIcon {
+ --info-icon-button-size: 24px;
+ height: var(--info-icon-button-size);
+ margin-inline-end: var(--help-bubble-element-spacing);
+ width: var(--info-icon-button-size);
+ }
+
+ #buttons {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-end;
+ margin-top: 24px;
+ }
+
+ cr-button {
+ --text-color: var(--help-bubble-text-color);
+ border-color: var(--help-bubble-text-color);
+ }
+
+ cr-button:not(:first-child) {
+ margin-inline-start: var(--help-bubble-element-spacing);
+ }
+
+ cr-button:focus {
+ border-color: var(--help-bubble-background);
+ box-shadow: 0 0 0 2px var(--help-bubble-text-color);
+ }
+
+ cr-button.default-button {
+ --text-color: var(--help-bubble-background);
+ background-color: var(--help-bubble-text-color);
+ }
+
+ cr-button.default-button:focus {
+ border: 2px solid var(--help-bubble-background);
+ box-shadow: 0 0 0 1px var(--help-bubble-text-color);
+ }
+</style>
+
+<div class="help-bubble">
+ <div id="topContainer">
+ <div id="progress" hidden$="[[!progress]]">
+ <template is="dom-repeat" items="[[progressData_]]">
+ <div class$="[[getProgressClass_(index)]]"></div>
+ </template>
+ </div>
+ <div id="infoIcon" hidden$="[[!shouldShowInfoIcon_(progress, infoIcon)]]"></div>
+ <div class="title"
+ hidden$="[[!shouldShowTitleInTopContainer_(progress, titleText)]]">
+ [[titleText]]
+ </div>
+ <div class="body"
+ hidden$="[[!shouldShowBodyInTopContainer_(progress, titleText)]]">
+ [[bodyText]]
+ </div>
+ <cr-icon-button id="close" iron-icon="cr:close"
+ hidden$="[[!shouldShowCloseButton_(buttons, forceCloseButton)]]"
+ aria-label$="[[closeText]]" on-click="dismiss_">
+ </cr-icon-button>
+ </div>
+ <div id="main" hidden$="[[!shouldShowBodyInMain_(progress, titleText)]]">
+ <div id="middleRowSpacer" hidden$="[[!shouldShowInfoIcon_(progress, infoIcon)]]"></div>
+ <div class="body">[[bodyText]]</div>
+ </div>
+ <div id="buttons" hidden$="[[!buttons.length]]">
+ <template is="dom-repeat" items="[[buttons]]" sort="buttonSortFunc_">
+ <cr-button id$="[[getButtonId_(itemsIndex)]]"
+ tabindex$="[[getButtonTabIndex_(itemsIndex, item.isDefault)]]"
+ class$="[[getButtonClass_(item.isDefault)]]"
+ on-click="onButtonClick_">[[item.text]]</cr-button>
+ </template>
+ </div>
+ <div id="arrow" class$="[[getArrowClass_(position)]]"></div>
+</div>
diff --git a/chromium/ui/webui/resources/cr_components/help_bubble/help_bubble.mojom b/chromium/ui/webui/resources/cr_components/help_bubble/help_bubble.mojom
new file mode 100644
index 00000000000..28deb1bef4e
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/help_bubble/help_bubble.mojom
@@ -0,0 +1,105 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module help_bubble.mojom;
+
+// Contains IPC calls that allow the HelpBubbleFactory system to connect to
+// the HelpBubbleMixin and HelpBubbleElement component.
+//
+// The calls here allow User Education systems that use the HelpBubble
+// architecture to display help bubbles in WebUI surfaces (including pages like
+// Settings and secondary UI elements such as the Sidebar).
+//
+// Systems expected to use this IPC include FeaturePromo and Tutorials. For
+// more detailed usage information, see README.md.
+
+// Where the help bubble floats relative to its anchor.
+enum HelpBubblePosition {
+ ABOVE,
+ BELOW,
+ LEFT,
+ RIGHT
+};
+
+// Simplified version of user_education::HelpBubbleButtonParams.
+struct HelpBubbleButtonParams {
+ string text;
+ bool is_default = false;
+};
+
+// Progress indicator for tutorial bubbles.
+struct Progress {
+ uint8 current;
+ uint8 total;
+};
+
+// Simplified version of user_education::HelpBubbleParams.
+struct HelpBubbleParams {
+ // Holds the name of the ElementIdentifier used to identify the help bubble's
+ // anchor in C++ code. The HelpBubbleMixin then maps this to a specific HTML
+ // element ID.
+ string native_identifier;
+
+ HelpBubblePosition position = HelpBubblePosition.BELOW;
+ string? title_text;
+ string body_text;
+ string close_button_alt_text;
+ bool force_close_button = false;
+ Progress? progress;
+ array<HelpBubbleButtonParams> buttons;
+};
+
+// Used by the controller to bootstrap IPC. Any WebUIController can implement
+// this interface to use help bubbles; see README.md for more information.
+interface HelpBubbleHandlerFactory {
+ // This method is called on bootstrap to create the browser-side handler.
+ CreateHelpBubbleHandler(
+ pending_remote<HelpBubbleClient> client,
+ pending_receiver<HelpBubbleHandler> handler);
+};
+
+// Object which handles the C++/browser side of help bubble management for a
+// WebUIController.
+//
+// Help bubbles are anchored to specific elements in the UI, identified by
+// ui::ElementIdentifiers. The HelpBubbleMixin maps this to an HTML id within
+// its component.
+//
+// We always use the name of the ElementIdentifier (`native_identifier`) when
+// showing a help bubble or when communicating events back to the handler on the
+// browser side, because HTML ids can be ambiguous within a document with shadow
+// DOMs.
+interface HelpBubbleHandler {
+ // Indicates that the visibility of the element that the help bubble could be
+ // anchored to has changed.
+ HelpBubbleAnchorVisibilityChanged(string native_identifier, bool visible);
+
+ // Notifies that a button on the help bubble anchored to `native_identifier`
+ // has been pressed and the help bubble is closing as a result. The
+ // `buttonIndex` parameter will be set to the (0-indexed) index of the button
+ // as it was specified in the `HelpBubbleParams.buttons` used to show the help
+ // bubble.
+ HelpBubbleButtonPressed(string native_identifier, uint8 button_index);
+
+ // Called when the help bubble anchored to `native_identifier` is closed,
+ // either because the element it is associated with goes away, or because the
+ // user canceled it (e.g. pressed the [x] button).
+ HelpBubbleClosed(string native_identifier, bool by_user);
+};
+
+// Represents WebUI component that can display help bubbles. The implementing UI
+// should use a HelpBubbleMixin; see README.md for detailed instructions.
+interface HelpBubbleClient {
+ // Shows a help bubble with parameters defined by `params` attached to
+ // `target`.
+ ShowHelpBubble(HelpBubbleParams params);
+
+ // Toggles focus to the help bubble anchored to `native_identifier` or to its
+ // anchor element.
+ ToggleFocusForAccessibility(string native_identifier);
+
+ // Invoked to hide the help bubble anchored to `native_identifier` if it
+ // should no longer be shown.
+ HideHelpBubble(string native_identifier);
+};
diff --git a/chromium/ui/webui/resources/cr_components/help_bubble/help_bubble.ts b/chromium/ui/webui/resources/cr_components/help_bubble/help_bubble.ts
new file mode 100644
index 00000000000..07b5920e20b
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/help_bubble/help_bubble.ts
@@ -0,0 +1,336 @@
+// 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.
+
+/**
+ * @fileoverview A bubble for displaying in-product help. These are created
+ * dynamically by HelpBubbleMixin, and their API should be considered an
+ * implementation detail and subject to change (you should not add them to your
+ * components directly).
+ */
+import 'chrome://resources/cr_elements/cr_button/cr_button.js';
+import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js';
+import 'chrome://resources/cr_elements/hidden_style_css.m.js';
+import 'chrome://resources/cr_elements/icons.m.js';
+
+import {CrButtonElement} from '//resources/cr_elements/cr_button/cr_button.js';
+import {CrIconButtonElement} from '//resources/cr_elements/cr_icon_button/cr_icon_button.js';
+import {assert, assertNotReached} from '//resources/js/assert_ts.js';
+import {isWindows} from '//resources/js/cr.m.js';
+import {DomRepeatEvent, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {getTemplate} from './help_bubble.html.js';
+import {HelpBubbleButtonParams, HelpBubblePosition, Progress} from './help_bubble.mojom-webui.js';
+
+const ANCHOR_HIGHLIGHT_CLASS = 'help-anchor-highlight';
+
+const ACTION_BUTTON_ID_PREFIX = 'action-button-';
+
+export const HELP_BUBBLE_DISMISSED_EVENT = 'help-bubble-dismissed';
+
+export type HelpBubbleDismissedEvent = CustomEvent<{
+ anchorId: string,
+ fromActionButton: boolean,
+ buttonIndex?: number,
+}>;
+
+export interface HelpBubbleElement {
+ $: {
+ arrow: HTMLElement,
+ buttons: HTMLElement,
+ close: CrIconButtonElement,
+ main: HTMLElement,
+ progress: HTMLElement,
+ topContainer: HTMLElement,
+ };
+}
+
+export class HelpBubbleElement extends PolymerElement {
+ static get is() {
+ return 'help-bubble';
+ }
+
+ static get template() {
+ return getTemplate();
+ }
+
+ static get properties() {
+ return {
+ anchorId: {
+ type: String,
+ value: '',
+ reflectToAttribute: true,
+ },
+
+ closeText: String,
+
+ position: {
+ type: HelpBubblePosition,
+ value: HelpBubblePosition.BELOW,
+ reflectToAttribute: true,
+ },
+ };
+ }
+
+ anchorId: string;
+ bodyText: string;
+ titleText: string;
+ closeText: string;
+ position: HelpBubblePosition;
+ buttons: HelpBubbleButtonParams[] = [];
+ progress: Progress|null = null;
+ infoIcon: string|null = null;
+ forceCloseButton: boolean;
+
+ /**
+ * HTMLElement corresponding to |this.anchorId|.
+ */
+ private anchorElement_: HTMLElement|null = null;
+
+ /**
+ * Backing data for the dom-repeat that generates progress indicators.
+ * The elements are placeholders only.
+ */
+ private progressData_: void[] = [];
+
+ /**
+ * Shows the bubble.
+ */
+ show() {
+ // Set up the progress track.
+ if (this.progress) {
+ this.progressData_ = new Array(this.progress.total);
+ } else {
+ this.progressData_ = [];
+ }
+
+ this.anchorElement_ =
+ this.parentElement!.querySelector<HTMLElement>(`#${this.anchorId}`)!;
+ assert(
+ this.anchorElement_,
+ 'Tried to show a help bubble but couldn\'t find element with id ' +
+ this.anchorId);
+
+ // Reset the aria-hidden attribute as screen readers need to access the
+ // contents of an opened bubble.
+ this.style.display = 'block';
+ this.removeAttribute('aria-hidden');
+ this.updatePosition_();
+ this.setAnchorHighlight_(true);
+ }
+
+ /**
+ * Hides the bubble, clears out its contents, and ensures that screen readers
+ * ignore it while hidden.
+ *
+ * TODO(dfried): We are moving towards formalizing help bubbles as single-use;
+ * in which case most of this tear-down logic can be removed since the entire
+ * bubble will go away on hide.
+ */
+ hide() {
+ this.style.display = 'none';
+ this.setAttribute('aria-hidden', 'true');
+ this.setAnchorHighlight_(false);
+ this.anchorElement_ = null;
+ }
+
+ /**
+ * Retrieves the current anchor element, if set and the bubble is showing,
+ * otherwise null.
+ */
+ getAnchorElement(): HTMLElement|null {
+ return this.anchorElement_;
+ }
+
+ /**
+ * Returns the button with the given `buttonIndex`, or null if not found.
+ */
+ getButtonForTesting(buttonIndex: number): CrButtonElement|null {
+ return this.$.buttons.querySelector<CrButtonElement>(
+ `[id="${ACTION_BUTTON_ID_PREFIX + buttonIndex}"]`);
+ }
+
+ /**
+ * Returns whether the default button is leading (true on Windows) vs trailing
+ * (all other platforms).
+ */
+ static isDefaultButtonLeading(): boolean {
+ return isWindows;
+ }
+
+ private dismiss_() {
+ assert(this.anchorId, 'Dismiss: expected help bubble to have an anchor.');
+ this.dispatchEvent(new CustomEvent(HELP_BUBBLE_DISMISSED_EVENT, {
+ detail: {
+ anchorId: this.anchorId,
+ fromActionButton: false,
+ },
+ }));
+ }
+
+ private getProgressClass_(index: number): string {
+ return index < this.progress!.current ? 'current-progress' :
+ 'total-progress';
+ }
+
+ private shouldShowTitleInTopContainer_(
+ progress: Progress|null, titleText: string): boolean {
+ return !!titleText && !progress;
+ }
+
+ private shouldShowBodyInTopContainer_(
+ progress: Progress|null, titleText: string): boolean {
+ return !progress && !titleText;
+ }
+
+ private shouldShowBodyInMain_(progress: Progress|null, titleText: string):
+ boolean {
+ return !!progress || !!titleText;
+ }
+
+ private shouldShowCloseButton_(
+ buttons: HelpBubbleButtonParams[], forceCloseButton: boolean): boolean {
+ return buttons.length === 0 || forceCloseButton;
+ }
+
+ private shouldShowInfoIcon_(progress: Progress|null, infoIcon: string):
+ boolean {
+ // TODO(mickeyburks): Info icon needs to be added to HelpBubbleParams
+ return !progress && infoIcon !== null && infoIcon !== '';
+ }
+
+ private onButtonClick_(e: DomRepeatEvent<HelpBubbleButtonParams>) {
+ assert(
+ this.anchorId,
+ 'Action button clicked: expected help bubble to have an anchor.');
+ // There is no access to the model index here due to limitations of
+ // dom-repeat. However, the index is stored in the node's identifier.
+ const index: number = parseInt(
+ (e.target as Element).id.substring(ACTION_BUTTON_ID_PREFIX.length));
+ this.dispatchEvent(new CustomEvent(HELP_BUBBLE_DISMISSED_EVENT, {
+ detail: {
+ anchorId: this.anchorId,
+ fromActionButton: true,
+ buttonIndex: index,
+ },
+ }));
+ }
+
+ private getButtonId_(index: number): string {
+ return ACTION_BUTTON_ID_PREFIX + index;
+ }
+
+ private getButtonClass_(isDefault: boolean): string {
+ return isDefault ? 'default-button' : '';
+ }
+
+ private getButtonTabIndex_(index: number, isDefault: boolean): number {
+ return isDefault ? 1 : index + 2;
+ }
+
+ private buttonSortFunc_(
+ button1: HelpBubbleButtonParams,
+ button2: HelpBubbleButtonParams): number {
+ // Default button is leading on Windows, trailing on other platforms.
+ if (button1.isDefault) {
+ return isWindows ? -1 : 1;
+ }
+ if (button2.isDefault) {
+ return isWindows ? 1 : -1;
+ }
+ return 0;
+ }
+
+ private getArrowClass_(position: HelpBubblePosition): string {
+ switch (position) {
+ case HelpBubblePosition.ABOVE:
+ return 'above';
+ case HelpBubblePosition.BELOW:
+ return 'below';
+ case HelpBubblePosition.LEFT:
+ return 'left';
+ case HelpBubblePosition.RIGHT:
+ return 'right';
+ default:
+ assertNotReached('Unknown help bubble position: ' + position);
+ }
+ }
+
+ /**
+ * Sets the bubble position, as relative to that of the anchor element and
+ * |this.position|.
+ */
+ private updatePosition_() {
+ assert(
+ this.anchorElement_, 'Update position: expected valid anchor element.');
+
+ // Inclusive of 8px visible arrow and 8px margin.
+ const parentRect = this.offsetParent!.getBoundingClientRect();
+ const anchorRect = this.anchorElement_.getBoundingClientRect();
+ const anchorLeft = anchorRect.left - parentRect.left;
+ const anchorHorizontalCenter = anchorLeft + anchorRect.width / 2;
+ const anchorTop = anchorRect.top - parentRect.top;
+ const ARROW_OFFSET = 16;
+ const LEFT_MARGIN = 8;
+ const HELP_BUBBLE_WIDTH = 362;
+
+ let helpLeft: string = '';
+ let helpTop: string = '';
+
+ switch (this.position) {
+ case HelpBubblePosition.ABOVE:
+ // Anchor the help bubble to the top center of the anchor element.
+ helpTop = `${anchorTop - ARROW_OFFSET}px`;
+ helpLeft = `${
+ Math.max(
+ LEFT_MARGIN,
+ anchorHorizontalCenter - HELP_BUBBLE_WIDTH / 2)}px`;
+ break;
+ case HelpBubblePosition.BELOW:
+ // Anchor the help bubble to the bottom center of the anchor element.
+ helpTop = `${anchorTop + anchorRect.height + ARROW_OFFSET}px`;
+ helpLeft = `${
+ Math.max(
+ LEFT_MARGIN,
+ anchorHorizontalCenter - HELP_BUBBLE_WIDTH / 2)}px`;
+ break;
+ case HelpBubblePosition.LEFT:
+ // Anchor the help bubble to the center left of the anchor element.
+ helpTop = `${anchorTop + anchorRect.height / 2}px`;
+ helpLeft = `${anchorLeft - ARROW_OFFSET}px`;
+ break;
+ case HelpBubblePosition.RIGHT:
+ // Anchor the help bubble to the center right of the anchor element.
+ helpTop = `${anchorTop + anchorRect.height / 2}px`;
+ helpLeft = `${anchorLeft + anchorRect.width + ARROW_OFFSET}px`;
+ break;
+ default:
+ assertNotReached();
+ }
+
+ this.style.top = helpTop;
+ this.style.left = helpLeft;
+ }
+
+ /**
+ * Styles the anchor element to appear highlighted while the bubble is open,
+ * or removes the highlight.
+ */
+ private setAnchorHighlight_(highlight: boolean) {
+ assert(
+ this.anchorElement_,
+ 'Set anchor highlight: expected valid anchor element.');
+ this.anchorElement_.classList.toggle(ANCHOR_HIGHLIGHT_CLASS, highlight);
+ }
+}
+
+customElements.define(HelpBubbleElement.is, HelpBubbleElement);
+
+declare global {
+ interface HTMLElementTagNameMap {
+ 'help-bubble': HelpBubbleElement;
+ }
+ interface HTMLElementEventMap {
+ [HELP_BUBBLE_DISMISSED_EVENT]: HelpBubbleDismissedEvent;
+ }
+}
diff --git a/chromium/ui/webui/resources/cr_components/help_bubble/help_bubble_mixin.ts b/chromium/ui/webui/resources/cr_components/help_bubble/help_bubble_mixin.ts
new file mode 100644
index 00000000000..6568e93a371
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/help_bubble/help_bubble_mixin.ts
@@ -0,0 +1,308 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview Logic common to components that support a help bubble.
+ *
+ * A component implementing this mixin should call
+ * registerHelpBubbleIdentifier() to associate specific element identifiers
+ * referenced in an IPH or Tutorials journey with the ids of the HTML elements
+ * that journey cares about (typically, points for help bubbles to anchor to).
+ *
+ * Multiple components in the same WebUI may have this mixin. Each mixin will
+ * receive ALL help bubble-related messages from its associated WebUIController
+ * and determines if any given message is relevant. This is done by checking
+ * against registered identifier.
+ *
+ * See README.md for more information.
+ */
+
+import {assert} from 'chrome://resources/js/assert_ts.js';
+import {EventTracker} from 'chrome://resources/js/event_tracker.m.js';
+import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {HELP_BUBBLE_DISMISSED_EVENT, HelpBubbleDismissedEvent, HelpBubbleElement} from './help_bubble.js';
+import {HelpBubbleClientCallbackRouter, HelpBubbleHandlerInterface, HelpBubbleParams} from './help_bubble.mojom-webui.js';
+import {HelpBubbleProxyImpl} from './help_bubble_proxy.js';
+
+type Constructor<T> = new (...args: any[]) => T;
+
+export const HelpBubbleMixin = dedupingMixin(
+ <T extends Constructor<PolymerElement>>(superClass: T): T&
+ Constructor<HelpBubbleMixinInterface> => {
+ class HelpBubbleMixin extends superClass implements
+ HelpBubbleMixinInterface {
+ private helpBubbleHandler_: HelpBubbleHandlerInterface;
+ private helpBubbleCallbackRouter_: HelpBubbleClientCallbackRouter;
+ /**
+ * A map from the name of the native identifier used in the tutorial or
+ * IPH definition to the target element's HTML ID.
+ *
+ * Example entry:
+ * "kHeightenSecuritySettingsElementId" => "toggleSecureMode"
+ */
+ private helpBubbleNativeToTargetId_: Map<string, string> = new Map();
+ private listenerIds_: number[] = [];
+ private helpBubbleTargetObserver_: IntersectionObserver|null = null;
+ /**
+ * Tracks the last known visibility of any element registered via
+ * `registerHelpBubbleIdentifier()` and tracked by
+ * `helpBubbleTargetObserver_`. Maps from HTML id to last known
+ * visibility.
+ */
+ private targetVisibility_: Map<string, boolean> = new Map();
+ private dismissedEventTracker_: EventTracker = new EventTracker();
+
+ constructor(...args: any[]) {
+ super(...args);
+
+ this.helpBubbleHandler_ =
+ HelpBubbleProxyImpl.getInstance().getHandler();
+ this.helpBubbleCallbackRouter_ =
+ HelpBubbleProxyImpl.getInstance().getCallbackRouter();
+ }
+
+ override connectedCallback() {
+ super.connectedCallback();
+
+ const router = this.helpBubbleCallbackRouter_;
+ this.listenerIds_.push(
+ router.showHelpBubble.addListener(
+ this.onShowHelpBubble_.bind(this)),
+ router.toggleFocusForAccessibility.addListener(
+ this.onToggleHelpBubbleFocusForAccessibility_.bind(this)),
+ router.hideHelpBubble.addListener(
+ this.onHideHelpBubble_.bind(this)));
+
+ this.helpBubbleTargetObserver_ =
+ new IntersectionObserver((entries, _observer) => {
+ for (const entry of entries) {
+ this.onTargetVisibilityChanged_(
+ entry.target, entry.isIntersecting);
+ }
+ }, {root: document.body});
+
+ // When the component is connected, if the target elements were
+ // already registered, they should be observed now. Any targets
+ // registered from this point forward will observed on registration.
+ for (const htmlId of this.helpBubbleNativeToTargetId_.values()) {
+ this.observeTarget_(htmlId);
+ }
+ }
+
+ override disconnectedCallback() {
+ super.disconnectedCallback();
+
+ for (const listenerId of this.listenerIds_) {
+ this.helpBubbleCallbackRouter_.removeListener(listenerId);
+ }
+ this.listenerIds_ = [];
+ assert(this.helpBubbleTargetObserver_);
+ this.helpBubbleTargetObserver_.disconnect();
+ this.helpBubbleTargetObserver_ = null;
+ this.helpBubbleNativeToTargetId_.clear();
+ this.targetVisibility_.clear();
+ }
+
+ /**
+ * Maps `nativeId`, which should be the name of a ui::ElementIdentifier
+ * referenced by the WebUIController, with the `htmlId` of an element in
+ * this component.
+ *
+ * Example:
+ * registerHelpBubbleIdentifier(
+ * 'kMyComponentTitleLabelElementIdentifier',
+ * 'title');
+ *
+ * See README.md for full instructions.
+ */
+ registerHelpBubbleIdentifier(nativeId: string, htmlId: string): void {
+ assert(!this.helpBubbleNativeToTargetId_.has(nativeId));
+ this.helpBubbleNativeToTargetId_.set(nativeId, htmlId);
+ // This can be called before or after `connectedCallback()`, so if the
+ // component isn't connected and the observer set up yet, delay
+ // observation until it is.
+ if (!this.helpBubbleTargetObserver_) {
+ return;
+ }
+ this.observeTarget_(htmlId);
+ }
+
+ /**
+ * Returns whether any help bubble is currently showing in this
+ * component.
+ */
+ isHelpBubbleShowing(): boolean {
+ return !!this.shadowRoot!.querySelector('help-bubble');
+ }
+
+ /**
+ * Returns whether a help bubble anchored to element with HTML id
+ * `anchorId` is currently showing.
+ */
+ isHelpBubbleShowingFor(anchorId: string): boolean {
+ return !!this.getHelpBubbleFor_(anchorId);
+ }
+
+ /**
+ * Displays a help bubble with `params` anchored to the HTML element
+ * with id `anchorId`. Note that `params.nativeIdentifier` is ignored by
+ * this method, since the anchor is already specified.
+ */
+ showHelpBubble(anchorId: string, params: HelpBubbleParams): void {
+ const oldBubble = this.getHelpBubbleFor_(anchorId);
+ assert(
+ !oldBubble,
+ 'Can\'t show help bubble; ' +
+ 'bubble already showing and anchored to ' + anchorId);
+
+ const bubble = document.createElement('help-bubble');
+ const anchor = this.findAnchorElement_(anchorId);
+ assert(anchor, 'Help bubble anchor element not found ' + anchorId);
+ anchor.parentNode!.insertBefore(bubble, anchor);
+ this.dismissedEventTracker_.add(
+ bubble, HELP_BUBBLE_DISMISSED_EVENT,
+ this.onHelpBubbleDismissed_.bind(this));
+
+ bubble.anchorId = anchorId;
+ bubble.closeText = params.closeButtonAltText;
+ bubble.position = params.position;
+ bubble.bodyText = params.bodyText;
+ bubble.forceCloseButton = params.forceCloseButton;
+ bubble.titleText = params.titleText || '';
+ bubble.progress = params.progress || null;
+ assert(
+ !bubble.progress ||
+ bubble.progress.total >= bubble.progress.current);
+ bubble.buttons = params.buttons;
+ bubble.show();
+ anchor!.focus();
+ }
+
+ /**
+ * Hides a help bubble anchored to element with id `anchorId` if there
+ * is one. Returns true if a bubble was hidden.
+ */
+ hideHelpBubble(anchorId: string): boolean {
+ const bubble = this.getHelpBubbleFor_(anchorId);
+ if (!bubble) {
+ return false;
+ }
+ this.dismissedEventTracker_.remove(
+ bubble, HELP_BUBBLE_DISMISSED_EVENT);
+ bubble.hide();
+ bubble.remove();
+ return true;
+ }
+
+ private onTargetVisibilityChanged_(
+ target: Element, isVisible: boolean) {
+ if (isVisible === this.targetVisibility_.get(target.id)) {
+ return;
+ }
+ this.targetVisibility_.set(target.id, isVisible);
+ const hidden = this.hideHelpBubble(target.id);
+ const nativeId = this.getNativeIdForAnchor_(target.id);
+ assert(nativeId);
+ if (hidden) {
+ this.helpBubbleHandler_.helpBubbleClosed(nativeId, false);
+ }
+ this.helpBubbleHandler_.helpBubbleAnchorVisibilityChanged(
+ nativeId, isVisible);
+ }
+
+ /**
+ * Observes visibility for element with id `htmlId` to properly send
+ * visibility changed events to the associated handler.
+ */
+ private observeTarget_(htmlId: string) {
+ assert(this.helpBubbleTargetObserver_);
+ const anchor = this.findAnchorElement_(htmlId);
+ assert(anchor, 'Help bubble anchor not found; expected id ' + htmlId);
+ this.helpBubbleTargetObserver_.observe(anchor);
+ }
+
+ private onShowHelpBubble_(params: HelpBubbleParams): void {
+ if (!this.helpBubbleNativeToTargetId_.has(params.nativeIdentifier)) {
+ // Identifier not handled by this mixin.
+ return;
+ }
+
+ const anchorId: string =
+ this.helpBubbleNativeToTargetId_.get(params.nativeIdentifier)!;
+ this.showHelpBubble(anchorId, params);
+ }
+
+ private onToggleHelpBubbleFocusForAccessibility_(nativeId: string) {
+ if (!this.helpBubbleNativeToTargetId_.has(nativeId)) {
+ // Identifier not handled by this mixin.
+ return;
+ }
+
+ const anchorId = this.helpBubbleNativeToTargetId_.get(nativeId)!;
+ const bubble = this.getHelpBubbleFor_(anchorId);
+ if (bubble) {
+ const anchor = bubble.getAnchorElement();
+ if (anchor) {
+ anchor.focus();
+ }
+ }
+ }
+
+ private onHideHelpBubble_(nativeId: string): void {
+ if (!this.helpBubbleNativeToTargetId_.has(nativeId)) {
+ // Identifier not handled by this mixin.
+ return;
+ }
+
+ this.hideHelpBubble(this.helpBubbleNativeToTargetId_.get(nativeId)!);
+ }
+
+ private findAnchorElement_(anchorId: string): HTMLElement|null {
+ return this.shadowRoot!.querySelector<HTMLElement>(`#${anchorId}`);
+ }
+
+ private getNativeIdForAnchor_(anchorId: string): string|null {
+ for (const [nativeId, htmlId] of this.helpBubbleNativeToTargetId_) {
+ if (htmlId === anchorId) {
+ return nativeId;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Returns a help bubble element anchored to element with HTML id
+ * `anchorId`, or null if none.
+ */
+ private getHelpBubbleFor_(anchorId: string): HelpBubbleElement|null {
+ return this.shadowRoot!.querySelector(
+ `help-bubble[anchor-id='${anchorId}']`);
+ }
+
+ private onHelpBubbleDismissed_(e: HelpBubbleDismissedEvent) {
+ const hidden = this.hideHelpBubble(e.detail.anchorId);
+ assert(hidden);
+ const nativeId = this.getNativeIdForAnchor_(e.detail.anchorId);
+ if (nativeId) {
+ if (e.detail.fromActionButton) {
+ this.helpBubbleHandler_.helpBubbleButtonPressed(
+ nativeId, e.detail.buttonIndex!);
+ } else {
+ this.helpBubbleHandler_.helpBubbleClosed(nativeId, true);
+ }
+ }
+ }
+ }
+
+ return HelpBubbleMixin;
+ });
+
+export interface HelpBubbleMixinInterface {
+ registerHelpBubbleIdentifier(nativeId: string, htmlId: string): void;
+ isHelpBubbleShowing(): boolean;
+ isHelpBubbleShowingFor(anchorId: string): boolean;
+ showHelpBubble(anchorId: string, params: HelpBubbleParams): void;
+ hideHelpBubble(anchorId: string): boolean;
+}
diff --git a/chromium/ui/webui/resources/cr_components/help_bubble/help_bubble_proxy.ts b/chromium/ui/webui/resources/cr_components/help_bubble/help_bubble_proxy.ts
new file mode 100644
index 00000000000..86d9c2c3f47
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/help_bubble/help_bubble_proxy.ts
@@ -0,0 +1,40 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {HelpBubbleClientCallbackRouter, HelpBubbleHandlerFactory, HelpBubbleHandlerInterface, HelpBubbleHandlerRemote} from './help_bubble.mojom-webui.js';
+
+export interface HelpBubbleProxy {
+ getHandler(): HelpBubbleHandlerInterface;
+ getCallbackRouter(): HelpBubbleClientCallbackRouter;
+}
+
+export class HelpBubbleProxyImpl implements HelpBubbleProxy {
+ private callbackRouter_ = new HelpBubbleClientCallbackRouter();
+ private handler_ = new HelpBubbleHandlerRemote();
+
+ constructor() {
+ const factory = HelpBubbleHandlerFactory.getRemote();
+ factory.createHelpBubbleHandler(
+ this.callbackRouter_.$.bindNewPipeAndPassRemote(),
+ this.handler_.$.bindNewPipeAndPassReceiver());
+ }
+
+ static getInstance(): HelpBubbleProxy {
+ return instance || (instance = new HelpBubbleProxyImpl());
+ }
+
+ static setInstance(obj: HelpBubbleProxy) {
+ instance = obj;
+ }
+
+ getHandler(): HelpBubbleHandlerRemote {
+ return this.handler_;
+ }
+
+ getCallbackRouter(): HelpBubbleClientCallbackRouter {
+ return this.callbackRouter_;
+ }
+}
+
+let instance: HelpBubbleProxy|null = null; \ No newline at end of file
diff --git a/chromium/ui/webui/resources/cr_components/help_bubble/tsconfig_base.json b/chromium/ui/webui/resources/cr_components/help_bubble/tsconfig_base.json
new file mode 100644
index 00000000000..3f69ccee4b0
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/help_bubble/tsconfig_base.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../../../../tools/typescript/tsconfig_base.json",
+ "compilerOptions": {
+ "allowJs": true,
+ "noUncheckedIndexedAccess": false,
+ "noUnusedLocals": false,
+ "strictPropertyInitialization": false
+ }
+}
diff --git a/chromium/ui/webui/resources/cr_components/history_clusters/BUILD.gn b/chromium/ui/webui/resources/cr_components/history_clusters/BUILD.gn
index cc3758de4f3..5d11b25852f 100644
--- a/chromium/ui/webui/resources/cr_components/history_clusters/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/history_clusters/BUILD.gn
@@ -8,6 +8,7 @@ import("//tools/polymer/css_to_wrapper.gni")
import("//tools/polymer/html_to_wrapper.gni")
import("//tools/typescript/ts_library.gni")
import("//ui/webui/resources/tools/generate_grd.gni")
+import("//ui/webui/webui_features.gni")
import("history_clusters.gni")
assert(!is_android)
@@ -22,17 +23,33 @@ mojom("mojo_bindings") {
sources = [ "history_clusters.mojom" ]
public_deps = [
"//mojo/public/mojom/base",
+ "//ui/base/mojom",
+ "//ui/gfx/geometry/mojom",
"//url/mojom:url_mojom_gurl",
]
webui_module_path = "chrome://resources/cr_components/history_clusters/"
}
+preprocess_if_expr("preprocess") {
+ in_folder = "."
+ out_folder = preprocess_folder_tmp
+ in_files = ts_files + html_files + css_files
+}
+
css_to_wrapper("css_wrapper_files") {
+ deps = [ ":preprocess" ]
+ in_folder = preprocess_folder_tmp
+ out_folder = preprocess_folder_tmp
in_files = css_files
+ minify = optimize_webui
}
html_to_wrapper("html_wrapper_files") {
+ deps = [ ":preprocess" ]
+ in_folder = preprocess_folder_tmp
+ out_folder = preprocess_folder_tmp
in_files = html_files
+ minify = optimize_webui
}
copy("copy_history_clusters_mojom") {
@@ -41,30 +58,6 @@ copy("copy_history_clusters_mojom") {
deps = [ ":mojo_bindings_webui_js" ]
}
-generate_grd("build_grdp") {
- grd_prefix = "cr_components_history_clusters"
- out_grd = "$target_gen_dir/resources.grdp"
- public_deps = [ ":build_ts" ]
- manifest_files = [ "$target_gen_dir/tsconfig.manifest" ]
- resource_path_prefix = "cr_components/history_clusters"
-}
-
-preprocess_if_expr("preprocess") {
- in_folder = "."
- out_folder = preprocess_folder_tmp
- in_files = ts_files
-}
-
-preprocess_if_expr("preprocess_generated") {
- deps = [
- ":css_wrapper_files",
- ":html_wrapper_files",
- ]
- in_folder = target_gen_dir
- out_folder = preprocess_folder_tmp
- in_files = html_wrapper_files + css_wrapper_files
-}
-
ts_library("build_ts") {
root_dir = preprocess_folder_tmp
out_dir = preprocess_folder
@@ -80,7 +73,17 @@ ts_library("build_ts") {
definitions = [ "//tools/typescript/definitions/metrics_private.d.ts" ]
extra_deps = [
":copy_history_clusters_mojom",
+ ":css_wrapper_files",
+ ":html_wrapper_files",
":preprocess",
- ":preprocess_generated",
]
}
+
+generate_grd("build_grdp") {
+ grd_prefix = "cr_components_history_clusters"
+ out_grd = "$target_gen_dir/resources.grdp"
+ public_deps = [ ":build_ts" ]
+ manifest_files =
+ filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
+ resource_path_prefix = "cr_components/history_clusters"
+}
diff --git a/chromium/ui/webui/resources/cr_components/history_clusters/cluster.html b/chromium/ui/webui/resources/cr_components/history_clusters/cluster.html
index ed086631ce0..697eb4da64b 100644
--- a/chromium/ui/webui/resources/cr_components/history_clusters/cluster.html
+++ b/chromium/ui/webui/resources/cr_components/history_clusters/cluster.html
@@ -7,6 +7,10 @@
padding-bottom: var(--cluster-padding-vertical);
}
+ :host([in-side-panel]) {
+ padding-bottom: 0;
+ }
+
:host-context(.focus-outline-visible):host(:focus) #container {
box-shadow: inset 0 0 0 2px var(--cr-focus-outline-color);
}
@@ -17,16 +21,20 @@
margin-bottom: var(--cluster-padding-vertical);
}
+ :host([in-side-panel]) #container {
+ border-bottom: 3px solid var(--cr-separator-color);
+ }
+
/* We need an inner container div to apply spacing between clusters. This is
because iron-list ignores the margin on the host element. */
- #container {
+ :host(:not([in-side-panel])) #container {
background-color: var(--cr-card-background-color);
border-radius: var(--cr-card-border-radius);
box-shadow: var(--cr-card-shadow);
padding: var(--cluster-padding-vertical) 0;
}
- #label-row {
+ .label-row {
align-items: center;
display: flex;
flex-grow: 1;
@@ -37,12 +45,24 @@
user-select: none;
}
- #label {
+ .label {
color: var(--cr-primary-text-color);
font-size: 1rem; /* 16px */
font-weight: 500;
}
+ .debug-info {
+ color: var(--cr-secondary-text-color);
+ }
+
+ #label-and-timestamp {
+ align-items: center;
+ display: flex;
+ flex-direction: column;
+ flex-shrink: 0;
+ row-gap: 6px;
+ }
+
#related-searches {
display: flex;
flex-wrap: wrap;
@@ -99,8 +119,20 @@
on-open-all-visits="onOpenAllVisits_"
on-remove-all-visits="onRemoveAllVisits_"
on-remove-visit="onRemoveVisit_">
- <div id="label-row">
- <div id="label"></div>
+ <!-- In the side panel the label and timestamp should be stacked on the
+ left, while outside the side panel the timestamp and the menu should
+ be side by side on the right. -->
+ <div class="label-row" hidden="[[!inSidePanel]]">
+ <div id="label-and-timestamp">
+ <div id="labelSidePanel" class="label"></div>
+ <div class="debug-info">[[cluster.debugInfo]]</div>
+ <div class="timestamp">[[cluster.visits.0.relativeDate]]</div>
+ </div>
+ <menu-container></menu-container>
+ </div>
+ <div class="label-row" hidden="[[inSidePanel]]">
+ <div id="label" class="label"></div>
+ <div class="debug-info">[[cluster.debugInfo]]</div>
<div class="timestamp-and-menu">
<div class="timestamp">[[cluster.visits.0.relativeDate]]</div>
<menu-container></menu-container>
diff --git a/chromium/ui/webui/resources/cr_components/history_clusters/cluster.ts b/chromium/ui/webui/resources/cr_components/history_clusters/cluster.ts
index 49dc6f5a9bf..0b2f769326d 100644
--- a/chromium/ui/webui/resources/cr_components/history_clusters/cluster.ts
+++ b/chromium/ui/webui/resources/cr_components/history_clusters/cluster.ts
@@ -37,6 +37,8 @@ const HistoryClusterElementBase = I18nMixin(PolymerElement);
interface HistoryClusterElement {
$: {
label: HTMLElement,
+ labelSidePanel: HTMLElement,
+ container: HTMLElement,
};
}
@@ -65,6 +67,15 @@ class HistoryClusterElement extends HistoryClusterElementBase {
},
/**
+ * Whether the cluster is in the side panel.
+ */
+ inSidePanel: {
+ type: Boolean,
+ value: () => loadTimeData.getBoolean('inSidePanel'),
+ reflectToAttribute: true,
+ },
+
+ /**
* The current query for which related clusters are requested and shown.
*/
query: String,
@@ -112,13 +123,14 @@ class HistoryClusterElement extends HistoryClusterElementBase {
cluster: Cluster;
index: number;
+ inSidePanel: boolean;
query: string;
private callbackRouter_: PageCallbackRouter;
private expanded_: boolean;
- private hiddenVisits_: Array<URLVisit>;
+ private hiddenVisits_: URLVisit[];
private onVisitsRemovedListenerId_: number|null = null;
private unusedLabel_: string;
- private visibleVisits_: Array<URLVisit>;
+ private visibleVisits_: URLVisit[];
//============================================================================
// Overridden methods
@@ -242,7 +254,7 @@ class HistoryClusterElement extends HistoryClusterElementBase {
* multiple Clusters, all Clusters receive this callback in order to get a
* chance to remove their matching visits.
*/
- private onVisitsRemoved_(removedVisits: Array<URLVisit>) {
+ private onVisitsRemoved_(removedVisits: URLVisit[]) {
const visitHasBeenRemoved = (visit: URLVisit) => {
return removedVisits.findIndex((removedVisit) => {
if (visit.normalizedUrl.url !== removedVisit.normalizedUrl.url) {
@@ -286,7 +298,7 @@ class HistoryClusterElement extends HistoryClusterElementBase {
}));
}
- private computeHiddenVisits_(): Array<URLVisit> {
+ private computeHiddenVisits_(): URLVisit[] {
return this.cluster.visits.filter((visit: URLVisit) => {
return visit.hidden;
});
@@ -299,12 +311,13 @@ class HistoryClusterElement extends HistoryClusterElementBase {
return 'no_label';
}
+ const label = this.inSidePanel ? this.$.labelSidePanel : this.$.label;
insertHighlightedTextWithMatchesIntoElement(
- this.$.label, this.cluster.label!, this.cluster.labelMatchPositions);
+ label, this.cluster.label!, this.cluster.labelMatchPositions);
return this.cluster.label!;
}
- private computeVisibleVisits_(): Array<URLVisit> {
+ private computeVisibleVisits_(): URLVisit[] {
return this.cluster.visits.filter((visit: URLVisit) => {
return !visit.hidden;
});
diff --git a/chromium/ui/webui/resources/cr_components/history_clusters/clusters.html b/chromium/ui/webui/resources/cr_components/history_clusters/clusters.html
index 2cde804bed5..51d4060ca13 100644
--- a/chromium/ui/webui/resources/cr_components/history_clusters/clusters.html
+++ b/chromium/ui/webui/resources/cr_components/history_clusters/clusters.html
@@ -13,6 +13,11 @@
padding: var(--first-cluster-padding-top) var(--cluster-padding-horizontal) 0;
}
+ :host([in-side-panel]) #clusters {
+ min-width: 0;
+ padding: 0 0 0;
+ }
+
#placeholder {
align-items: center;
color: var(--md-loading-message-color);
diff --git a/chromium/ui/webui/resources/cr_components/history_clusters/clusters.ts b/chromium/ui/webui/resources/cr_components/history_clusters/clusters.ts
index 1549b2ffc48..92f8e32bee0 100644
--- a/chromium/ui/webui/resources/cr_components/history_clusters/clusters.ts
+++ b/chromium/ui/webui/resources/cr_components/history_clusters/clusters.ts
@@ -4,9 +4,9 @@
import './cluster.js';
import './history_clusters_shared_style.css.js';
-import '../../cr_elements/cr_button/cr_button.m.js';
-import '../../cr_elements/cr_dialog/cr_dialog.m.js';
-import '../../cr_elements/cr_lazy_render/cr_lazy_render.m.js';
+import '../../cr_elements/cr_button/cr_button.js';
+import '../../cr_elements/cr_dialog/cr_dialog.js';
+import '../../cr_elements/cr_lazy_render/cr_lazy_render.js';
import '../../cr_elements/cr_toast/cr_toast.js';
import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
import 'chrome://resources/polymer/v3_0/iron-scroll-threshold/iron-scroll-threshold.js';
@@ -17,8 +17,8 @@ import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-li
import {IronScrollThresholdElement} from 'chrome://resources/polymer/v3_0/iron-scroll-threshold/iron-scroll-threshold.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.m.js';
-import {CrLazyRenderElement} from '../../cr_elements/cr_lazy_render/cr_lazy_render.m.js';
+import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.js';
+import {CrLazyRenderElement} from '../../cr_elements/cr_lazy_render/cr_lazy_render.js';
import {CrToastElement} from '../../cr_elements/cr_toast/cr_toast.js';
import {assert} from '../../js/assert_ts.js';
import {FocusOutlineManager} from '../../js/cr/ui/focus_outline_manager.m.js';
@@ -72,8 +72,8 @@ export class HistoryClustersElement extends HistoryClustersElementBase {
*/
inSidePanel: {
type: Boolean,
+ value: () => loadTimeData.getBoolean('inSidePanel'),
reflectToAttribute: true,
- value: false,
},
/**
@@ -133,7 +133,7 @@ export class HistoryClustersElement extends HistoryClustersElementBase {
private placeholderText_: string;
private result_: QueryResult;
private showSpinner_: boolean;
- private visitsToBeRemoved_: Array<URLVisit>;
+ private visitsToBeRemoved_: URLVisit[];
//============================================================================
// Overridden methods
@@ -222,7 +222,7 @@ export class HistoryClustersElement extends HistoryClustersElementBase {
* Called with `event` received from a visit requesting to be removed. `event`
* may contain the related visits of the said visit, if applicable.
*/
- private onRemoveVisits_(event: CustomEvent<Array<URLVisit>>) {
+ private onRemoveVisits_(event: CustomEvent<URLVisit[]>) {
// Return early if there is a pending remove request.
if (this.visitsToBeRemoved_.length) {
return;
@@ -238,16 +238,6 @@ export class HistoryClustersElement extends HistoryClustersElementBase {
}
/**
- * Called when the value of the search field changes.
- */
- private onSearchChanged_(event: CustomEvent<string>) {
- // Update the query based on the value of the search field, if necessary.
- if (event.detail !== this.query) {
- this.query = event.detail;
- }
- }
-
- /**
* Called when the scrollable area has been scrolled nearly to the bottom.
*/
private onScrolledToBottom_() {
@@ -287,7 +277,7 @@ export class HistoryClustersElement extends HistoryClustersElementBase {
* loaded before the user ever gets a chance to see this button.
*/
private getLoadMoreButtonHidden_(
- _result: QueryResult, _resultClusters: Array<Cluster>,
+ _result: QueryResult, _resultClusters: Cluster[],
_resultCanLoadMore: Time): boolean {
return !this.result_ || this.result_.clusters.length === 0 ||
!this.result_.canLoadMore;
@@ -337,7 +327,7 @@ export class HistoryClustersElement extends HistoryClustersElementBase {
});
this.showSpinner_ = false;
- if (this.inSidePanel) {
+ if (loadTimeData.getBoolean('inSidePanel')) {
this.pageHandler_.showSidePanelUI();
}
}
@@ -352,7 +342,9 @@ export class HistoryClustersElement extends HistoryClustersElementBase {
// Prevent sending further load-more requests until this one finishes.
this.set('result_.canLoadMore', false);
}
- this.pageHandler_.startQueryClusters(this.query.trim());
+ this.pageHandler_.startQueryClusters(
+ this.query.trim(),
+ new URLSearchParams(window.location.search).has('recluster'));
});
}
@@ -360,7 +352,7 @@ export class HistoryClustersElement extends HistoryClustersElementBase {
* Called with the original remove params when the last accepted request to
* browser to remove visits succeeds.
*/
- private onVisitsRemoved_(removedVisits: Array<URLVisit>) {
+ private onVisitsRemoved_(removedVisits: URLVisit[]) {
// Show the confirmation toast once done removing one visit only; since a
// confirmation dialog was not shown prior to the action.
if (removedVisits.length === 1) {
diff --git a/chromium/ui/webui/resources/cr_components/history_clusters/history_clusters.gni b/chromium/ui/webui/resources/cr_components/history_clusters/history_clusters.gni
index 9f906b953e9..e7b7653b695 100644
--- a/chromium/ui/webui/resources/cr_components/history_clusters/history_clusters.gni
+++ b/chromium/ui/webui/resources/cr_components/history_clusters/history_clusters.gni
@@ -27,7 +27,6 @@ foreach(f, html_files) {
ts_files = _web_component_files + [
"browser_proxy.ts",
"metrics_proxy.ts",
- "open_window_proxy.ts",
"utils.ts",
]
diff --git a/chromium/ui/webui/resources/cr_components/history_clusters/history_clusters.mojom b/chromium/ui/webui/resources/cr_components/history_clusters/history_clusters.mojom
index 88854f4b3f0..0eadaf90630 100644
--- a/chromium/ui/webui/resources/cr_components/history_clusters/history_clusters.mojom
+++ b/chromium/ui/webui/resources/cr_components/history_clusters/history_clusters.mojom
@@ -5,6 +5,8 @@
module history_clusters.mojom;
import "mojo/public/mojom/base/time.mojom";
+import "ui/base/mojom/window_open_disposition.mojom";
+import "ui/gfx/geometry/mojom/geometry.mojom";
import "url/mojom/url.mojom";
// Represents a search query related to a visit to the search results page.
@@ -112,7 +114,8 @@ struct URLVisit {
bool hidden;
// A key-value dictionary of additional debug info to show. This is not
- // visible in production, and used for development only.
+ // visible in production, and used for development only. Disabled by default,
+ // but can be enabled by the 'JourneysUserVisibleDebug' flag.
map<string, string> debug_info;
};
@@ -137,6 +140,11 @@ struct Cluster {
// Search queries related to this cluster's visits.
array<SearchQuery> related_searches;
+
+ // Additional debug string to show. This is not visible in production, and
+ // used for development only. Disabled by default, but can be enabled by the
+ // 'JourneysUserVisibleDebug' flag.
+ string? debug_info;
};
// Represents a set of Clusters returned by the browser in response to a request
@@ -159,9 +167,16 @@ struct QueryResult {
// Browser-side handler for requests from WebUI page.
interface PageHandler {
+ // Opens the history cluster specified by url
+ OpenHistoryCluster(url.mojom.Url url,
+ ui.mojom.ClickModifiers click_modifiers);
+
// The ClustersBrowserProxy singleton calls this when it's first initialized.
SetPage(pending_remote<Page> page);
+ // Shows a context menu for a history cluster item.
+ ShowContextMenuForURL(url.mojom.Url url, gfx.mojom.Point point);
+
// Notify the backend that the side panel UI is ready to be shown.
ShowSidePanelUI();
@@ -170,8 +185,9 @@ interface PageHandler {
// its state once the request is fulfilled by the browser.
ToggleVisibility(bool visible) => (bool visible);
- // Queries for clusters matching `query`.
- StartQueryClusters(string query);
+ // Queries for clusters matching `query`. If true, `recluster` forces
+ // reclustering as if `persist_clusters_in_history_db` were false.
+ StartQueryClusters(string query, bool recluster);
// Asks the service for more clusters. Call this when the user has scrolled
// to the bottom of the page. `query` is passed through for sanity checking.
diff --git a/chromium/ui/webui/resources/cr_components/history_clusters/menu_container.ts b/chromium/ui/webui/resources/cr_components/history_clusters/menu_container.ts
index 268152f14d6..20d1e35afa4 100644
--- a/chromium/ui/webui/resources/cr_components/history_clusters/menu_container.ts
+++ b/chromium/ui/webui/resources/cr_components/history_clusters/menu_container.ts
@@ -4,14 +4,14 @@
import './history_clusters_shared_style.css.js';
import '../../cr_elements/cr_action_menu/cr_action_menu.js';
-import '../../cr_elements/cr_icon_button/cr_icon_button.m.js';
-import '../../cr_elements/cr_lazy_render/cr_lazy_render.m.js';
+import '../../cr_elements/cr_icon_button/cr_icon_button.js';
+import '../../cr_elements/cr_lazy_render/cr_lazy_render.js';
import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {CrActionMenuElement} from '../../cr_elements/cr_action_menu/cr_action_menu.js';
-import {CrLazyRenderElement} from '../../cr_elements/cr_lazy_render/cr_lazy_render.m.js';
+import {CrLazyRenderElement} from '../../cr_elements/cr_lazy_render/cr_lazy_render.js';
import {loadTimeData} from '../../js/load_time_data.m.js';
import {URLVisit} from './history_clusters.mojom-webui.js';
diff --git a/chromium/ui/webui/resources/cr_components/history_clusters/open_window_proxy.ts b/chromium/ui/webui/resources/cr_components/history_clusters/open_window_proxy.ts
deleted file mode 100644
index 24f31b8ad97..00000000000
--- a/chromium/ui/webui/resources/cr_components/history_clusters/open_window_proxy.ts
+++ /dev/null
@@ -1,30 +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.
-
-/**
- * @fileoverview This file provides an abstraction layer for Window.open() for
- * for mocking in tests.
- * TODO(http://crbug.com/1250487): Refactor this file and similar files into
- * ui/webui/resources/js/
- */
-
-export interface OpenWindowProxy {
- open(url: string): void;
-}
-
-export class OpenWindowProxyImpl implements OpenWindowProxy {
- open(url: string) {
- window.open(url);
- }
-
- static getInstance(): OpenWindowProxy {
- return instance || (instance = new OpenWindowProxyImpl());
- }
-
- static setInstance(obj: OpenWindowProxy) {
- instance = obj;
- }
-}
-
-let instance: OpenWindowProxy|null = null;
diff --git a/chromium/ui/webui/resources/cr_components/history_clusters/search_query.ts b/chromium/ui/webui/resources/cr_components/history_clusters/search_query.ts
index ba00f453d3c..5e441e17b99 100644
--- a/chromium/ui/webui/resources/cr_components/history_clusters/search_query.ts
+++ b/chromium/ui/webui/resources/cr_components/history_clusters/search_query.ts
@@ -6,9 +6,9 @@ import './history_clusters_shared_style.css.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {BrowserProxyImpl} from './browser_proxy.js';
import {RelatedSearchAction, SearchQuery} from './history_clusters.mojom-webui.js';
import {MetricsProxyImpl} from './metrics_proxy.js';
-import {OpenWindowProxyImpl} from './open_window_proxy.js';
import {getTemplate} from './search_query.html.js';
/**
@@ -75,7 +75,7 @@ class SearchQueryElement extends PolymerElement {
// To record metrics.
this.onAuxClick_();
- OpenWindowProxyImpl.getInstance().open(this.searchQuery.url.url);
+ this.openUrl_(event);
}
private onKeydown_(e: KeyboardEvent) {
@@ -87,7 +87,18 @@ class SearchQueryElement extends PolymerElement {
// To record metrics.
this.onAuxClick_();
- OpenWindowProxyImpl.getInstance().open(this.searchQuery.url.url);
+ this.openUrl_(e);
+ }
+
+ private openUrl_(event: MouseEvent|KeyboardEvent) {
+ BrowserProxyImpl.getInstance().handler.openHistoryCluster(
+ this.searchQuery.url, {
+ middleButton: false,
+ altKey: event.altKey,
+ ctrlKey: event.ctrlKey,
+ metaKey: event.metaKey,
+ shiftKey: event.shiftKey,
+ });
}
}
diff --git a/chromium/ui/webui/resources/cr_components/history_clusters/shared_vars.css b/chromium/ui/webui/resources/cr_components/history_clusters/shared_vars.css
index 61468278fef..05ffceb9f4f 100644
--- a/chromium/ui/webui/resources/cr_components/history_clusters/shared_vars.css
+++ b/chromium/ui/webui/resources/cr_components/history_clusters/shared_vars.css
@@ -31,6 +31,11 @@ html {
/* Sizes: */
html {
+ --card-max-width: 960px;
+ --card-min-width: 550px;
+ --card-padding-between: 16px;
+ --card-padding-side: 24px;
+ --first-card-padding-top: 24px;
--cluster-max-width: var(--card-max-width);
--cluster-min-width: var(--card-min-width);
--cluster-padding-horizontal: var(--card-padding-side);
diff --git a/chromium/ui/webui/resources/cr_components/history_clusters/url_visit.html b/chromium/ui/webui/resources/cr_components/history_clusters/url_visit.html
index db4000e1a98..d97c9b01143 100644
--- a/chromium/ui/webui/resources/cr_components/history_clusters/url_visit.html
+++ b/chromium/ui/webui/resources/cr_components/history_clusters/url_visit.html
@@ -92,7 +92,7 @@
}
</style>
<div id="header" on-click="onClick_" on-auxclick="onAuxClick_"
- on-keydown="onKeydown_">
+ on-keydown="onKeydown_" on-contextmenu="onContextMenu_">
<a id="link-container" href="[[visit.normalizedUrl.url]]">
<page-favicon url="[[visit.normalizedUrl]]"></page-favicon>
<div id="page-info">
diff --git a/chromium/ui/webui/resources/cr_components/history_clusters/url_visit.ts b/chromium/ui/webui/resources/cr_components/history_clusters/url_visit.ts
index 91bd214c842..290a6793383 100644
--- a/chromium/ui/webui/resources/cr_components/history_clusters/url_visit.ts
+++ b/chromium/ui/webui/resources/cr_components/history_clusters/url_visit.ts
@@ -5,18 +5,18 @@
import './page_favicon.js';
import './history_clusters_shared_style.css.js';
import '../../cr_elements/cr_action_menu/cr_action_menu.js';
-import '../../cr_elements/cr_icon_button/cr_icon_button.m.js';
-import '../../cr_elements/cr_lazy_render/cr_lazy_render.m.js';
+import '../../cr_elements/cr_icon_button/cr_icon_button.js';
+import '../../cr_elements/cr_lazy_render/cr_lazy_render.js';
import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {CrActionMenuElement} from '../../cr_elements/cr_action_menu/cr_action_menu.js';
-import {CrLazyRenderElement} from '../../cr_elements/cr_lazy_render/cr_lazy_render.m.js';
+import {CrLazyRenderElement} from '../../cr_elements/cr_lazy_render/cr_lazy_render.js';
import {loadTimeData} from '../../js/load_time_data.m.js';
+import {BrowserProxyImpl} from './browser_proxy.js';
import {Annotation, URLVisit} from './history_clusters.mojom-webui.js';
-import {OpenWindowProxyImpl} from './open_window_proxy.js';
import {getTemplate} from './url_visit.html.js';
import {insertHighlightedTextWithMatchesIntoElement} from './utils.js';
@@ -115,7 +115,7 @@ class VisitRowElement extends MenuContainerElementBase {
unusedUrlForDisplay_: {
type: String,
computed: 'computeUrlForDisplay_(visit)',
- }
+ },
};
}
@@ -125,7 +125,7 @@ class VisitRowElement extends MenuContainerElementBase {
query: string;
visit: URLVisit;
- private annotations_: Array<string>;
+ private annotations_: string[];
private allowDeletingHistory_: boolean;
private debugInfo_: string;
private unusedTitle_: string;
@@ -144,7 +144,7 @@ class VisitRowElement extends MenuContainerElementBase {
}));
}
- private onClick_(event: Event) {
+ private onClick_(event: MouseEvent) {
// Ignore previously handled events.
if (event.defaultPrevented) {
return;
@@ -155,7 +155,18 @@ class VisitRowElement extends MenuContainerElementBase {
// To record metrics.
this.onAuxClick_();
- OpenWindowProxyImpl.getInstance().open(this.visit.normalizedUrl.url);
+ this.openUrl_(event);
+ }
+
+ private onContextMenu_(event: MouseEvent) {
+ // Because WebUI has a Blink-provided context menu that's suitable, and
+ // Side Panel always UIs always have a custom context menu.
+ if (!loadTimeData.getBoolean('inSidePanel')) {
+ return;
+ }
+
+ BrowserProxyImpl.getInstance().handler.showContextMenuForURL(
+ this.visit.normalizedUrl, {x: event.clientX, y: event.clientY});
}
private onKeydown_(e: KeyboardEvent) {
@@ -167,7 +178,7 @@ class VisitRowElement extends MenuContainerElementBase {
// To record metrics.
this.onAuxClick_();
- OpenWindowProxyImpl.getInstance().open(this.visit.normalizedUrl.url);
+ this.openUrl_(e);
}
private onActionMenuButtonClick_(event: Event) {
@@ -191,7 +202,7 @@ class VisitRowElement extends MenuContainerElementBase {
// Helper methods
//============================================================================
- private computeAnnotations_(): Array<string> {
+ private computeAnnotations_(): string[] {
return this.visit.annotations
.map((annotation: number) => annotationToStringId.get(annotation))
.filter(
@@ -222,6 +233,17 @@ class VisitRowElement extends MenuContainerElementBase {
this.visit.urlForDisplayMatchPositions);
return this.visit.urlForDisplay;
}
+
+ private openUrl_(event: MouseEvent|KeyboardEvent) {
+ BrowserProxyImpl.getInstance().handler.openHistoryCluster(
+ this.visit.normalizedUrl, {
+ middleButton: false,
+ altKey: event.altKey,
+ ctrlKey: event.ctrlKey,
+ metaKey: event.metaKey,
+ shiftKey: event.shiftKey,
+ });
+ }
}
customElements.define(VisitRowElement.is, VisitRowElement);
diff --git a/chromium/ui/webui/resources/cr_components/iph_bubble/iph_bubble.html b/chromium/ui/webui/resources/cr_components/iph_bubble/iph_bubble.html
deleted file mode 100644
index 6c6596aeac7..00000000000
--- a/chromium/ui/webui/resources/cr_components/iph_bubble/iph_bubble.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<style>
- :host {
- position: absolute;
- z-index: 1;
- }
-
- .arrow {
- background-color: var(--iph-bubble-background);
- height: 16px;
- position: absolute;
- transform: rotate(-45deg);
- width: 16px;
- z-index: -1;
- }
-
- /* Turns the arrow direction downwards, when the bubble is placed above
- * the anchor element */
- :host([position=above]) .arrow {
- border-bottom-left-radius: 2px;
- bottom: -8px;
- left: calc(50% - 8px);
- }
-
- /* Turns the arrow direction upwards, when the bubble is placed below
- * the anchor element */
- :host([position=below]) .arrow {
- border-top-right-radius: 2px;
- left: calc(50% - 8px);
- top: -8px;
- }
-
- /* Turns the arrow direction to the right, when the bubble is placed to the
- * left of the anchor element */
- :host([position=left]) .arrow {
- border-bottom-right-radius: 2px;
- right: -8px;
- top: calc(50% - 8px);
- }
-
- /* Turns the arrow direction to the left, when the bubble is placed to the
- * right of the anchor element */
- :host([position=right]) .arrow {
- border-top-left-radius: 2px;
- left: -8px;
- top: calc(50% - 8px);
- }
-
- .body {
- font-size: 14px;
- }
-
- .iph-bubble {
- --iph-bubble-background: var(--google-blue-700);
- --iph-bubble-text-color: var(--google-grey-200);
- background-color: var(--iph-bubble-background);
- border-radius: 8px;
- color: var(--iph-bubble-text-color);
- padding: 12px 16px;
- width: 362px;
- }
-
- .iph-bubble-container {
- display: none;
- opacity: 0;
- }
-
- :host([open]) .iph-bubble-container
- {
- display: block;
- opacity: 1;
- }
-</style>
-
-<div class="iph-bubble-container">
- <div class="iph-bubble">
- <div class="body">[[body]]</div>
- <div class="arrow"></div>
- </div>
-</div>
diff --git a/chromium/ui/webui/resources/cr_components/iph_bubble/iph_bubble.ts b/chromium/ui/webui/resources/cr_components/iph_bubble/iph_bubble.ts
deleted file mode 100644
index 0b77e1b24c1..00000000000
--- a/chromium/ui/webui/resources/cr_components/iph_bubble/iph_bubble.ts
+++ /dev/null
@@ -1,190 +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.
-/**
- * @fileoverview A bubble for displaying in-product help. This is a WIP, do not
- * use.
- */
-import {assert} from '//resources/js/assert.m.js';
-import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-
-import {getTemplate} from './iph_bubble.html.js';
-
-const ANCHOR_HIGHLIGHT_CLASS = 'iph-anchor-highlight';
-
-enum Position {
- ABOVE = 'above',
- BELOW = 'below',
- LEFT = 'left',
- RIGHT = 'right',
-}
-
-export interface IPHBubbleElement {
- open: boolean;
- _setOpen(open: boolean): void;
-}
-
-/** @polymer */
-export class IPHBubbleElement extends PolymerElement {
- static get is() {
- return 'iph-bubble';
- }
-
- static get template() {
- return getTemplate();
- }
-
- static get properties() {
- return {
- /**
- * The id of the element that the iph is anchored to. This element
- * must be a sibling of the iph. If this property is not set,
- * then the iph will be anchored to the parent node containing it.
- */
- anchorId: {type: String, value: ''},
-
- /**
- * The main promo text. Required.
- */
- body: {type: String, value: ''},
-
- /**
- * Readonly variable tracking whether the bubble is currently displayed.
- */
- open: {
- readOnly: true,
- type: Boolean,
- value: false,
- reflectToAttribute: true,
- },
-
- /**
- * Determines position relative to the anchor element, and where the
- * bubble's arrow points. Must be one of 'above', 'below', 'left' or
- * 'right'. Required.
- */
- position: {type: Position, value: Position.ABOVE},
- };
- }
-
- anchorId: string;
- position: Position;
-
- /**
- * HTMLElement corresponding to |this.anchorId|.
- */
- private anchorElement_?: HTMLElement;
-
- /**
- * Shows the bubble.
- */
- show() {
- if (!this.anchorElement_) {
- this.anchorElement_ = this.findAnchorElement_();
- }
- // Reset the aria-hidden attribute as screen readers need to access the
- // contents of an opened bubble.
- this.removeAttribute('aria-hidden');
- this.updatePosition_();
- this.highlightAnchor_();
- this._setOpen(true);
- }
-
- /**
- * Hides the bubble and ensures that screen readers cannot its contents
- * while hidden.
- */
- hide() {
- this.setAttribute('aria-hidden', 'true');
- this.unhighlightAnchor_();
- this._setOpen(false);
- }
-
- /**
- * Returns the element that this iph is anchored to. It is either the element
- * given by |this.anchorId|, or the immediate parent of the iph.
- */
- private findAnchorElement_(): HTMLElement {
- const parentNode: any = this.parentNode;
- if (this.anchorId) {
- return parentNode.querySelector(`#${this.anchorId}`);
- } else if (parentNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
- return parentNode.host;
- } else {
- return parentNode;
- }
- }
-
- /**
- * Sets the bubble position, as relative to that of the anchor element and
- * |this.position|.
- */
- private updatePosition_() {
- assert(Object.values(Position).includes(this.position));
- if (!this.anchorElement_) {
- return;
- }
- // Inclusive of 8px visible arrow and 8px margin.
- const offset = 16;
- const parentRect = this.offsetParent!.getBoundingClientRect();
- const anchorRect = this.anchorElement_.getBoundingClientRect();
- const anchorLeft = anchorRect.left - parentRect.left;
- const anchorTop = anchorRect.top - parentRect.top;
- let iphLeft: string, iphTop: string, iphTransform: string;
- switch (this.position) {
- case Position.ABOVE:
- // Anchor the iph bubble to the top center of the anchor element.
- iphTop = `${anchorTop - offset}px`;
- iphLeft = `${anchorLeft + anchorRect.width / 2}px`;
- // Horizontally center the iph bubble.
- iphTransform = `translate(-50%, -100%)`;
- break;
- case Position.BELOW:
- // Anchor the iph bubble to the bottom center of the anchor element.
- iphTop = `${anchorTop + anchorRect.height + offset}px`;
- iphLeft = `${anchorLeft + anchorRect.width / 2}px`;
- // Horizontally center the iph bubble.
- iphTransform = `translateX(-50%)`;
- break;
- case Position.LEFT:
- // Anchor the iph bubble to the center left of the anchor element.
- iphTop = `${anchorTop + anchorRect.height / 2}px`;
- iphLeft = `${anchorLeft - offset}px`;
- // Vertically center the iph bubble.
- iphTransform = `translate(-100%, -50%)`;
- break;
- case Position.RIGHT:
- // Anchor the iph bubble to the center right of the anchor element.
- iphTop = `${anchorTop + anchorRect.height / 2}px`;
- iphLeft = `${anchorLeft + anchorRect.width + offset}px`;
- // Vertically center the iph bubble.
- iphTransform = `translateY(-50%)`;
- break;
- }
- this.style.top = iphTop;
- this.style.left = iphLeft;
- this.style.transform = iphTransform;
- }
-
- /**
- * Styles the anchor element to appear highlighted while the bubble is open.
- */
- private highlightAnchor_() {
- if (!this.anchorElement_) {
- return;
- }
- this.anchorElement_.classList.add(ANCHOR_HIGHLIGHT_CLASS);
- }
-
- /**
- * Resets the anchor element to its original styling while the bubble is
- * closed.
- */
- private unhighlightAnchor_() {
- if (!this.anchorElement_) {
- return;
- }
- this.anchorElement_.classList.remove(ANCHOR_HIGHLIGHT_CLASS);
- }
-}
-customElements.define(IPHBubbleElement.is, IPHBubbleElement);
diff --git a/chromium/ui/webui/resources/cr_components/localized_link/localized_link.ts b/chromium/ui/webui/resources/cr_components/localized_link/localized_link.ts
index 2b323dad886..4c0cfc0aaea 100644
--- a/chromium/ui/webui/resources/cr_components/localized_link/localized_link.ts
+++ b/chromium/ui/webui/resources/cr_components/localized_link/localized_link.ts
@@ -28,13 +28,13 @@ import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.m
import {getTemplate} from './localized_link.html.js';
-interface LocalizedLinkElement {
+export interface LocalizedLinkElement {
$: {
container: HTMLElement,
};
}
-class LocalizedLinkElement extends PolymerElement {
+export class LocalizedLinkElement extends PolymerElement {
static get is() {
return 'localized-link';
}
diff --git a/chromium/ui/webui/resources/cr_components/managed_dialog/managed_dialog.ts b/chromium/ui/webui/resources/cr_components/managed_dialog/managed_dialog.ts
index f4b87ad2a90..c5cb8d9c10f 100644
--- a/chromium/ui/webui/resources/cr_components/managed_dialog/managed_dialog.ts
+++ b/chromium/ui/webui/resources/cr_components/managed_dialog/managed_dialog.ts
@@ -6,15 +6,15 @@
* @fileoverview 'managed-dialog' is a dialog that is displayed when a user
* interact with some UI features which are managed by the user's organization.
*/
-import '../../cr_elements/cr_button/cr_button.m.js';
-import '../../cr_elements/cr_dialog/cr_dialog.m.js';
+import '../../cr_elements/cr_button/cr_button.js';
+import '../../cr_elements/cr_dialog/cr_dialog.js';
import '../../cr_elements/icons.m.js';
import '../../cr_elements/shared_vars_css.m.js';
import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.m.js';
+import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.js';
import {I18nMixin} from '../../js/i18n_mixin.js';
import {getTemplate} from './managed_dialog.html.js';
diff --git a/chromium/ui/webui/resources/cr_components/managed_footnote/managed_footnote.ts b/chromium/ui/webui/resources/cr_components/managed_footnote/managed_footnote.ts
index 38eb5486370..9fe8edbac40 100644
--- a/chromium/ui/webui/resources/cr_components/managed_footnote/managed_footnote.ts
+++ b/chromium/ui/webui/resources/cr_components/managed_footnote/managed_footnote.ts
@@ -57,7 +57,7 @@ export class ManagedFootnoteElement extends ManagedFootnoteElementBase {
showDeviceInfo: {
type: Boolean,
value: false,
- }
+ },
};
}
diff --git a/chromium/ui/webui/resources/cr_components/most_visited/BUILD.gn b/chromium/ui/webui/resources/cr_components/most_visited/BUILD.gn
index f2568f6c966..3015af1a334 100644
--- a/chromium/ui/webui/resources/cr_components/most_visited/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/most_visited/BUILD.gn
@@ -6,6 +6,7 @@ import("//mojo/public/tools/bindings/mojom.gni")
import("//tools/polymer/html_to_wrapper.gni")
import("//tools/typescript/ts_library.gni")
import("//ui/webui/resources/tools/generate_grd.gni")
+import("//ui/webui/webui_features.gni")
import("most_visited.gni")
assert(!is_android && !is_ios)
@@ -25,6 +26,7 @@ mojom("mojom") {
html_to_wrapper("html_wrapper_files") {
in_files = html_files
+ minify = optimize_webui
}
copy("copy_mojom") {
@@ -38,15 +40,6 @@ copy("copy_src") {
outputs = [ "$target_gen_dir/{{source_file_part}}" ]
}
-generate_grd("build_grdp") {
- grd_prefix = "cr_components_most_visited"
- out_grd = "$target_gen_dir/resources.grdp"
-
- public_deps = [ ":build_ts" ]
- manifest_files = [ "$target_gen_dir/tsconfig.manifest" ]
- resource_path_prefix = "cr_components/most_visited"
-}
-
ts_library("build_ts") {
root_dir = target_gen_dir
out_dir = preprocess_folder
@@ -64,3 +57,13 @@ ts_library("build_ts") {
":html_wrapper_files",
]
}
+
+generate_grd("build_grdp") {
+ grd_prefix = "cr_components_most_visited"
+ out_grd = "$target_gen_dir/resources.grdp"
+
+ public_deps = [ ":build_ts" ]
+ manifest_files =
+ filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
+ resource_path_prefix = "cr_components/most_visited"
+}
diff --git a/chromium/ui/webui/resources/cr_components/most_visited/most_visited.html b/chromium/ui/webui/resources/cr_components/most_visited/most_visited.html
index fa00ea27291..94c6d397815 100644
--- a/chromium/ui/webui/resources/cr_components/most_visited/most_visited.html
+++ b/chromium/ui/webui/resources/cr_components/most_visited/most_visited.html
@@ -44,19 +44,29 @@
#addShortcutIcon,
.query-tile-icon {
- -webkit-mask-image: url(chrome://resources/images/add.svg);
-webkit-mask-repeat: no-repeat;
-webkit-mask-size: 100%;
- background-color: var(--google-grey-900);
height: 24px;
width: 24px;
}
+ #addShortcutIcon {
+ -webkit-mask-image: url(chrome://resources/images/add.svg);
+ background-color: var(--google-grey-900);
+ }
+
.query-tile-icon {
-webkit-mask-image: url(chrome://resources/images/icon_search.svg);
background-color: var(--google-grey-700);
}
+ @media (forced-colors: active) {
+ #addShortcutIcon,
+ .query-tile-icon {
+ background-color: ButtonText;
+ }
+ }
+
:host([use-white-tile-icon_]) #addShortcutIcon {
background-color: white;
}
@@ -95,6 +105,15 @@
box-shadow: var(--most-visited-focus-shadow);
}
+ @media (forced-colors: active) {
+ :host-context(.focus-outline-visible) .tile:focus,
+ :host-context(.focus-outline-visible) #addShortcut:focus {
+ /* Use outline instead of box-shadow (which does not work) in Windows
+ HCM. */
+ outline: var(--cr-focus-outline-hcm);
+ }
+ }
+
#addShortcut {
background-color: transparent;
border: none;
@@ -239,7 +258,8 @@
</template>
</dom-repeat>
<cr-button id="addShortcut" tabindex="0" on-click="onAdd_"
- hidden$="[[!showAdd_]]" on-keydown="onAddShortcutKeyDown_" noink>
+ hidden$="[[!showAdd_]]" on-keydown="onAddShortcutKeyDown_"
+ aria-label="[[i18n('addLinkTitle')]]" title="[[i18n('addLinkTitle')]]" noink>
<div class="tile-icon">
<div id="addShortcutIcon" draggable="false"></div>
</div>
diff --git a/chromium/ui/webui/resources/cr_components/most_visited/most_visited.ts b/chromium/ui/webui/resources/cr_components/most_visited/most_visited.ts
index f10b0105e9f..6e7dbae4cf1 100644
--- a/chromium/ui/webui/resources/cr_components/most_visited/most_visited.ts
+++ b/chromium/ui/webui/resources/cr_components/most_visited/most_visited.ts
@@ -3,16 +3,16 @@
// found in the LICENSE file.
import 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js';
-import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
-import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
-import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
+import 'chrome://resources/cr_elements/cr_button/cr_button.js';
+import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
+import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js';
import 'chrome://resources/cr_elements/cr_icons_css.m.js';
-import 'chrome://resources/cr_elements/cr_input/cr_input.m.js';
+import 'chrome://resources/cr_elements/cr_input/cr_input.js';
import 'chrome://resources/cr_elements/cr_toast/cr_toast.js';
import 'chrome://resources/cr_elements/hidden_style_css.m.js';
import {CrActionMenuElement} from 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js';
-import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
+import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
import {CrToastElement} from 'chrome://resources/cr_elements/cr_toast/cr_toast.js';
import {assert} from 'chrome://resources/js/assert.m.js';
import {skColorToRgba} from 'chrome://resources/js/color_utils.js';
@@ -50,7 +50,7 @@ function setTilePosition(tile: HTMLElement, {x, y}: {x: number, y: number}) {
tile.style.top = `${y}px`;
}
-function getHitIndex(rects: Array<DOMRect>, x: number, y: number): number {
+function getHitIndex(rects: DOMRect[], x: number, y: number): number {
return rects.findIndex(
r => x >= r.left && x <= r.right && y >= r.top && y <= r.bottom);
}
@@ -231,7 +231,7 @@ export class MostVisitedElement extends MostVisitedElementBase {
private showAdd_: boolean;
private showToastButtons_: boolean;
private screenWidth_: ScreenWidth;
- private tiles_: Array<MostVisitedTile>;
+ private tiles_: MostVisitedTile[];
private toastContent_: string;
private visible_: boolean;
@@ -242,7 +242,7 @@ export class MostVisitedElement extends MostVisitedElementBase {
private setMostVisitedInfoListenerId_: number|null = null;
private actionMenuTargetIndex_: number = -1;
private dragOffset_: {x: number, y: number}|null;
- private tileRects_: Array<DOMRect> = [];
+ private tileRects_: DOMRect[] = [];
private isRtl_: boolean;
private eventTracker_: EventTracker;
private boundOnWidthChange_: () => void;
@@ -548,9 +548,9 @@ export class MostVisitedElement extends MostVisitedElementBase {
private getFaviconUrl_(url: Url): string {
const faviconUrl = new URL('chrome://favicon2/');
faviconUrl.searchParams.set('size', '24');
- faviconUrl.searchParams.set('scale_factor', '1x');
- faviconUrl.searchParams.set('show_fallback_monogram', '');
- faviconUrl.searchParams.set('page_url', url.url);
+ faviconUrl.searchParams.set('scaleFactor', '1x');
+ faviconUrl.searchParams.set('showFallbackMonogram', '');
+ faviconUrl.searchParams.set('pageUrl', url.url);
return faviconUrl.href;
}
diff --git a/chromium/ui/webui/resources/cr_elements/BUILD.gn b/chromium/ui/webui/resources/cr_elements/BUILD.gn
index 9a0313f63c3..599b95bf53e 100644
--- a/chromium/ui/webui/resources/cr_elements/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_elements/BUILD.gn
@@ -11,15 +11,17 @@ import("//tools/polymer/polymer.gni")
import("//ui/webui/resources/include_polymer.gni")
import("//ui/webui/resources/tools/generate_grd.gni")
import("//ui/webui/resources/tools/js_modulizer.gni")
+import("//ui/webui/webui_features.gni")
+import("./cr_elements.gni")
preprocess_folder = "$root_gen_dir/ui/webui/resources/preprocessed/cr_elements"
if (include_polymer) {
preprocess_gen_manifest = "preprocessed_gen_manifest.json"
+ preprocess_src_manifest = "preprocessed_src_manifest.json"
}
if (is_chromeos_ash) {
preprocess_polymer2_manifest = "preprocessed_polymer2_manifest.json"
- preprocess_src_manifest = "preprocessed_src_manifest.json"
}
if (include_polymer) {
@@ -27,13 +29,15 @@ if (include_polymer) {
grd_prefix = "cr_elements"
out_grd = "$target_gen_dir/${grd_prefix}_resources.grdp"
public_deps = [ ":preprocess" ]
- manifest_files = [ "$target_gen_dir/$preprocess_gen_manifest" ]
+ manifest_files = [
+ "$target_gen_dir/$preprocess_gen_manifest",
+ "$target_gen_dir/$preprocess_src_manifest",
+ ]
if (is_chromeos_ash) {
manifest_files += [
# TODO(crbug.com/1184053): Fully remove once no longer used by CrOS.
"$target_gen_dir/$preprocess_polymer2_manifest",
- "$target_gen_dir/$preprocess_src_manifest",
]
}
resource_path_prefix = "cr_elements"
@@ -42,78 +46,37 @@ if (include_polymer) {
group("preprocess") {
public_deps = [
- ":preprocess_generated_ts",
- ":preprocess_src_ts",
+ ":html_wrapper_files_native",
+ ":preprocess_ts",
]
if (include_polymer) {
- public_deps += [ ":preprocess_generated" ]
+ public_deps += [
+ ":css_wrapper_files",
+ ":html_wrapper_files",
+ ":preprocess_generated",
+ ":preprocess_src",
+ ]
}
if (is_chromeos_ash) {
public_deps += [
# TODO(crbug.com/1184053): Fully remove once no longer used by CrOS.
":preprocess_polymer2",
- ":preprocess_src",
- ]
- }
-}
-
-if (is_chromeos_ash) {
- preprocess_if_expr("preprocess_src") {
- in_folder = "."
- out_folder = "$preprocess_folder"
- out_manifest = "$target_gen_dir/$preprocess_src_manifest"
-
- in_files = [
- "chromeos/cr_picture/cr_picture_types.js",
- "chromeos/cr_picture/png.js",
- "chromeos/cr_picture/webcam_utils.js",
]
}
}
# TS files are passed to a separate target so that they are not listed in the
# |out_manifest|.
-preprocess_if_expr("preprocess_src_ts") {
+preprocess_if_expr("preprocess_ts") {
in_folder = "."
out_folder = preprocess_folder
- in_files = [
- "cr_tab_box/cr_tab_box.ts",
- "cr_tree/cr_tree_base.ts",
- "cr_tree/cr_tree_item.ts",
- "cr_tree/cr_tree.ts",
- ]
+ in_files = web_component_files_native_ts + native_html_files +
+ non_web_component_files_ts
if (include_polymer) {
- in_files += [
- "cr_a11y_announcer/cr_a11y_announcer.ts",
- "cr_action_menu/cr_action_menu.ts",
- "cr_auto_img/cr_auto_img.ts",
- "cr_container_shadow_mixin.ts",
- "cr_drawer/cr_drawer.ts",
- "cr_grid/cr_grid.ts",
- "cr_link_row/cr_link_row.ts",
- "cr_menu_selector/cr_menu_selector.ts",
- "cr_profile_avatar_selector/cr_profile_avatar_selector_grid.ts",
- "cr_profile_avatar_selector/cr_profile_avatar_selector.ts",
- "cr_search_field/cr_search_field_mixin.ts",
- "cr_search_field/cr_search_field.ts",
- "cr_slider/cr_slider.ts",
- "cr_splitter/cr_splitter.ts",
- "cr_tabs/cr_tabs.ts",
- "cr_toast/cr_toast_manager.ts",
- "cr_toast/cr_toast.ts",
- "cr_toolbar/cr_toolbar_search_field.ts",
- "cr_toolbar/cr_toolbar_selection_overlay.ts",
- "cr_toolbar/cr_toolbar.ts",
- "cr_view_manager/cr_view_manager.ts",
- "find_shortcut_mixin.ts",
- "mouse_hoverable_mixin.ts",
- ]
-
- if (is_chromeos) {
- in_files += [ "cr_searchable_drop_down/cr_searchable_drop_down.ts" ]
- }
+ in_files += web_component_files_polymer_ts + polymer_html_files +
+ icons_html_files + css_files
}
}
@@ -126,42 +89,13 @@ if (is_chromeos_ash) {
"action_link_css.html",
"chromeos/cros_color_overrides.html",
"cr_actionable_row_style.html",
- "cr_button/cr_button.html",
- "cr_button/cr_button.js",
- "cr_checkbox/cr_checkbox.html",
- "cr_checkbox/cr_checkbox.js",
"cr_container_shadow_behavior.html",
"cr_container_shadow_behavior.js",
- "cr_dialog/cr_dialog.html",
- "cr_dialog/cr_dialog.js",
- "cr_expand_button/cr_expand_button.html",
- "cr_expand_button/cr_expand_button.js",
- "cr_fingerprint/cr_fingerprint_icon.html",
- "cr_fingerprint/cr_fingerprint_progress_arc.html",
- "cr_fingerprint/cr_fingerprint_progress_arc.js",
- "cr_icon_button/cr_icon_button.html",
- "cr_icon_button/cr_icon_button.js",
"cr_icons_css.html",
- "cr_input/cr_input.html",
- "cr_input/cr_input.js",
- "cr_input/cr_input_style_css.html",
- "cr_lazy_render/cr_lazy_render.html",
- "cr_lazy_render/cr_lazy_render.js",
"cr_lottie/cr_lottie.html",
"cr_lottie/cr_lottie.js",
- "cr_radio_button/cr_card_radio_button.html",
- "cr_radio_button/cr_card_radio_button.js",
- "cr_radio_button/cr_radio_button_behavior.html",
- "cr_radio_button/cr_radio_button_behavior.js",
- "cr_radio_button/cr_radio_button.html",
- "cr_radio_button/cr_radio_button.js",
- "cr_radio_button/cr_radio_button_style_css.html",
- "cr_radio_group/cr_radio_group.html",
- "cr_radio_group/cr_radio_group.js",
"cr_scrollable_behavior.html",
"cr_scrollable_behavior.js",
- "cr_toggle/cr_toggle.html",
- "cr_toggle/cr_toggle.js",
"find_shortcut_behavior.js",
"hidden_style_css.html",
"icons.html",
@@ -181,6 +115,13 @@ if (is_chromeos_ash) {
}
if (include_polymer) {
+ preprocess_if_expr("preprocess_src") {
+ in_folder = "."
+ out_folder = preprocess_folder
+ out_manifest = "$target_gen_dir/$preprocess_src_manifest"
+ in_files = [ "cr_radio_button/cr_radio_button_behavior.js" ]
+ }
+
preprocess_if_expr("preprocess_generated") {
deps = [ ":custom_elements" ]
in_folder = target_gen_dir
@@ -189,26 +130,16 @@ if (include_polymer) {
in_files = [
"action_link_css.m.js",
"cr_actionable_row_style.m.js",
- "cr_button/cr_button.m.js",
- "cr_checkbox/cr_checkbox.m.js",
- "cr_container_shadow_behavior.m.js",
- "cr_dialog/cr_dialog.m.js",
- "cr_expand_button/cr_expand_button.m.js",
- "cr_fingerprint/cr_fingerprint_icon.m.js",
- "cr_fingerprint/cr_fingerprint_progress_arc.m.js",
- "cr_icon_button/cr_icon_button.m.js",
+ "cr_button/cr_button.js",
+ "cr_dialog/cr_dialog.js",
+ "cr_icon_button/cr_icon_button.js",
"cr_icons_css.m.js",
- "cr_input/cr_input.m.js",
- "cr_input/cr_input_style_css.m.js",
- "cr_lazy_render/cr_lazy_render.m.js",
+ "cr_input/cr_input.js",
"cr_lottie/cr_lottie.m.js",
- "cr_radio_button/cr_card_radio_button.m.js",
- "cr_radio_button/cr_radio_button_behavior.m.js",
- "cr_radio_button/cr_radio_button.m.js",
- "cr_radio_button/cr_radio_button_style_css.m.js",
- "cr_radio_group/cr_radio_group.m.js",
+ "cr_radio_button/cr_card_radio_button.js",
+ "cr_radio_button/cr_radio_button.js",
"cr_scrollable_behavior.m.js",
- "cr_toggle/cr_toggle.m.js",
+ "cr_toggle/cr_toggle.js",
"hidden_style_css.m.js",
"icons.m.js",
"md_select_css.m.js",
@@ -223,100 +154,30 @@ if (include_polymer) {
if (is_chromeos_ash) {
in_files += [
"chromeos/cros_color_overrides.m.js",
- "chromeos/cr_picture/cr_camera.js",
- "chromeos/cr_picture/cr_picture_list.js",
- "chromeos/cr_picture/cr_picture_pane.js",
- "chromeos/cr_picture/icons.js",
+ "cr_container_shadow_behavior.m.js",
]
}
}
}
-# TS files are passed to a separate target so that they are not listed in the
-# |out_manifest|.
-preprocess_if_expr("preprocess_generated_ts") {
- deps = [ ":html_wrapper_files_native" ]
- in_folder = target_gen_dir
- out_folder = preprocess_folder
- in_files = [
- "cr_tab_box/cr_tab_box.html.ts",
- "cr_tree/cr_tree.html.ts",
- "cr_tree/cr_tree_item.html.ts",
- ]
- if (include_polymer) {
- deps += [
- ":css_wrapper_files",
- ":html_wrapper_files",
- ]
- in_files += [
- "cr_a11y_announcer/cr_a11y_announcer.html.ts",
- "cr_action_menu/cr_action_menu.html.ts",
- "cr_drawer/cr_drawer.html.ts",
- "cr_grid/cr_grid.html.ts",
- "cr_link_row/cr_link_row.html.ts",
- "cr_nav_menu_item_style.css.ts",
- "cr_page_host_style.css.ts",
- "cr_profile_avatar_selector/cr_profile_avatar_selector_grid.html.ts",
- "cr_profile_avatar_selector/cr_profile_avatar_selector.html.ts",
- "cr_search_field/cr_search_field.html.ts",
- "cr_slider/cr_slider.html.ts",
- "cr_tabs/cr_tabs.html.ts",
- "cr_toast/cr_toast.html.ts",
- "cr_toast/cr_toast_manager.html.ts",
- "cr_toolbar/cr_toolbar.html.ts",
- "cr_toolbar/cr_toolbar_search_field.html.ts",
- "cr_toolbar/cr_toolbar_selection_overlay.html.ts",
- "cr_view_manager/cr_view_manager.html.ts",
- "mwb_element_shared_style.css.ts",
- "mwb_shared_icons.html.ts",
- "mwb_shared_style.css.ts",
- "mwb_shared_vars.css.ts",
- "search_highlight_style.css.ts",
- ]
-
- if (is_chromeos) {
- in_files += [ "cr_searchable_drop_down/cr_searchable_drop_down.html.ts" ]
- }
- }
-}
-
if (include_polymer) {
group("closure_compile") {
deps = [
":cr_elements_resources",
- "cr_button:closure_compile",
- "cr_checkbox:closure_compile",
- "cr_dialog:closure_compile",
- "cr_expand_button:closure_compile",
- "cr_fingerprint:closure_compile",
- "cr_icon_button:closure_compile",
- "cr_input:closure_compile",
"cr_lottie:closure_compile",
- "cr_radio_button:closure_compile",
- "cr_radio_group:closure_compile",
- "cr_toggle:closure_compile",
"policy:closure_compile",
# Targets for auto-generated Polymer 3 JS Modules
":cr_elements_module_resources",
"cr_button:closure_compile_module",
- "cr_checkbox:closure_compile_module",
"cr_dialog:closure_compile_module",
- "cr_expand_button:closure_compile_module",
- "cr_fingerprint:closure_compile_module",
"cr_icon_button:closure_compile_module",
"cr_input:closure_compile_module",
- "cr_lazy_render:closure_compile_module",
"cr_lottie:closure_compile_module",
"cr_radio_button:closure_compile_module",
- "cr_radio_group:closure_compile_module",
"cr_toggle:closure_compile_module",
"policy:closure_compile_module",
]
-
- if (is_chromeos) {
- deps += [ "chromeos:closure_compile" ]
- }
}
js_type_check("cr_elements_resources") {
@@ -387,10 +248,11 @@ if (include_polymer) {
}
js_modulizer("modulize") {
- input_files = [
- "cr_container_shadow_behavior.js",
- "cr_scrollable_behavior.js",
- ]
+ input_files = [ "cr_scrollable_behavior.js" ]
+
+ if (is_chromeos_ash) {
+ input_files += [ "cr_container_shadow_behavior.js" ]
+ }
}
}
@@ -406,18 +268,13 @@ if (include_polymer) {
":modulize",
":shared_style_css_module",
":shared_vars_css_module",
- "cr_button:cr_button_module",
- "cr_checkbox:cr_checkbox_module",
- "cr_dialog:cr_dialog_module",
- "cr_expand_button:cr_expand_button_module",
- "cr_fingerprint:polymer3_elements",
- "cr_icon_button:cr_icon_button_module",
- "cr_input:polymer3_elements",
- "cr_lazy_render:cr_lazy_render_module",
+ "cr_button:web_components",
+ "cr_dialog:web_components",
+ "cr_icon_button:web_components",
+ "cr_input:web_components",
"cr_lottie:cr_lottie_module",
- "cr_radio_button:polymer3_elements",
- "cr_radio_group:cr_radio_group_module",
- "cr_toggle:cr_toggle_module",
+ "cr_radio_button:web_components",
+ "cr_toggle:web_components",
"policy:polymer3_elements",
]
@@ -430,20 +287,22 @@ if (include_polymer) {
if (include_polymer) {
js_type_check("cr_elements_module_resources") {
is_polymer3 = true
- deps = [
- ":cr_container_shadow_behavior.m",
- ":cr_scrollable_behavior.m",
- ]
+ deps = [ ":cr_scrollable_behavior.m" ]
if (is_chromeos_ash) {
- deps += [ ":find_shortcut_behavior" ]
+ deps += [
+ ":cr_container_shadow_behavior.m",
+ ":find_shortcut_behavior",
+ ]
}
}
- js_library("cr_container_shadow_behavior.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/cr_elements/cr_container_shadow_behavior.m.js" ]
- deps = [ "//ui/webui/resources/js:assert.m" ]
- extra_deps = [ ":modulize" ]
+ if (is_chromeos_ash) {
+ js_library("cr_container_shadow_behavior.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/cr_elements/cr_container_shadow_behavior.m.js" ]
+ deps = [ "//ui/webui/resources/js:assert.m" ]
+ extra_deps = [ ":modulize" ]
+ }
}
js_library("cr_scrollable_behavior.m") {
@@ -462,55 +321,34 @@ if (is_chromeos_ash) {
"//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:cr.m",
"//ui/webui/resources/js:util.m",
- "//ui/webui/resources/js/cr/ui:keyboard_shortcut_list.m",
+ "//ui/webui/resources/js/cr/ui:keyboard_shortcut_list",
]
}
}
html_to_wrapper("html_wrapper_files_native") {
- in_files = [
- "cr_tab_box/cr_tab_box.html",
- "cr_tree/cr_tree.html",
- "cr_tree/cr_tree_item.html",
- ]
+ deps = [ ":preprocess_ts" ]
+ in_folder = preprocess_folder
+ out_folder = preprocess_folder
+ in_files = native_html_files
+ minify = optimize_webui
template = "native"
}
if (include_polymer) {
html_to_wrapper("html_wrapper_files") {
- in_files = [
- "cr_a11y_announcer/cr_a11y_announcer.html",
- "cr_action_menu/cr_action_menu.html",
- "cr_drawer/cr_drawer.html",
- "cr_grid/cr_grid.html",
- "cr_link_row/cr_link_row.html",
- "cr_profile_avatar_selector/cr_profile_avatar_selector_grid.html",
- "cr_profile_avatar_selector/cr_profile_avatar_selector.html",
- "cr_search_field/cr_search_field.html",
- "cr_slider/cr_slider.html",
- "cr_tabs/cr_tabs.html",
- "cr_toast/cr_toast.html",
- "cr_toast/cr_toast_manager.html",
- "cr_toolbar/cr_toolbar.html",
- "cr_toolbar/cr_toolbar_search_field.html",
- "cr_toolbar/cr_toolbar_selection_overlay.html",
- "cr_view_manager/cr_view_manager.html",
- "mwb_shared_icons.html",
- ]
-
- if (is_chromeos) {
- in_files += [ "cr_searchable_drop_down/cr_searchable_drop_down.html" ]
- }
+ deps = [ ":preprocess_ts" ]
+ in_folder = preprocess_folder
+ out_folder = preprocess_folder
+ in_files = polymer_html_files + icons_html_files
+ minify = optimize_webui
}
css_to_wrapper("css_wrapper_files") {
- in_files = [
- "cr_nav_menu_item_style.css",
- "mwb_element_shared_style.css",
- "mwb_shared_style.css",
- "mwb_shared_vars.css",
- "search_highlight_style.css",
- "cr_page_host_style.css",
- ]
+ deps = [ ":preprocess_ts" ]
+ in_folder = preprocess_folder
+ out_folder = preprocess_folder
+ in_files = css_files
+ minify = optimize_webui
}
}
diff --git a/chromium/ui/webui/resources/cr_elements/README.md b/chromium/ui/webui/resources/cr_elements/README.md
index 5680a0a2a6b..5f71f09d128 100644
--- a/chromium/ui/webui/resources/cr_elements/README.md
+++ b/chromium/ui/webui/resources/cr_elements/README.md
@@ -1,6 +1,7 @@
-This directory contains simple Polymer web components for Web UI. These
-components may be shared across any WebUI and should be compatible across
-all platforms (including ios).
+This directory contains simple web components for Web UI. These components may
+be shared across any WebUI. Non-Polymer components should be compatible across
+all platforms (including ios). Polymer components currently are not supported
+on iOS or Android.
These web components may not contain any i18n dependencies and may not use
I18nBehavior. Instead, any text (labels, tooltips, etc) should be passed as
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/BUILD.gn b/chromium/ui/webui/resources/cr_elements/chromeos/BUILD.gn
index 0697f526a9f..b5bd6363747 100644
--- a/chromium/ui/webui/resources/cr_elements/chromeos/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_elements/chromeos/BUILD.gn
@@ -3,24 +3,12 @@
# found in the LICENSE file.
import("//build/config/chromeos/ui_mode.gni")
-import("//third_party/closure_compiler/compile_js.gni")
import("//tools/polymer/polymer.gni")
assert(is_chromeos, "Only ChromeOS components belong here.")
-group("closure_compile") {
- deps = [
- # Targets for auto-generated Polymer3/JS Modules
- "cr_picture:closure_compile_module",
- ]
-}
-
group("polymer3_elements") {
public_deps = [ ":cros_color_overrides_module" ]
-
- if (is_chromeos_ash) {
- public_deps += [ "cr_picture:web_components" ]
- }
}
polymer_modulizer("cros_color_overrides") {
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/BUILD.gn b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/BUILD.gn
deleted file mode 100644
index bf8bb86e780..00000000000
--- a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/BUILD.gn
+++ /dev/null
@@ -1,66 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/chromeos/ui_mode.gni")
-import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/html_to_js.gni")
-
-assert(is_chromeos)
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [
- ":png",
- ":webcam_utils",
- ]
-
- if (is_chromeos_ash) {
- deps += [
- ":cr_camera",
- ":cr_picture_list",
- ":cr_picture_pane",
- ]
- }
-}
-
-js_library("png") {
-}
-
-js_library("webcam_utils") {
-}
-
-if (is_chromeos_ash) {
- js_library("cr_picture_types") {
- }
-
- js_library("cr_picture_pane") {
- deps = [
- ":cr_camera",
- ":cr_picture_types",
- ":png",
- ]
- }
-
- js_library("cr_camera") {
- deps = [ ":webcam_utils" ]
- }
-
- js_library("cr_picture_list") {
- deps = [
- ":cr_picture_types",
- ":png",
- "//third_party/polymer/v3_0/components-chromium/iron-selector:iron-selector",
- "//ui/webui/resources/js:assert.m",
- ]
- }
-
- html_to_js("web_components") {
- js_files = [
- "cr_camera.js",
- "cr_picture_list.js",
- "cr_picture_pane.js",
- "icons.js",
- ]
- }
-}
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.html b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.html
deleted file mode 100644
index 92bc4eb1248..00000000000
--- a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.html
+++ /dev/null
@@ -1,152 +0,0 @@
- <style>
- :host {
- --cr-camera-hidden-frame-size: 406px;
- --cr-camera-preview-frame-size: 280px;
- }
-
- #perspectiveBox {
- height: var(--cr-camera-image-size, 228px);
- margin: auto;
- perspective: 600px;
- width: var(--cr-camera-image-size, 228px);
- }
-
- #userImageStreamCrop {
- border-top-left-radius: 2px;
- border-top-right-radius: 2px;
- height: 100%;
- overflow: hidden;
- position: relative;
- transform: rotateY(180deg);
- width: 100%;
- }
-
- #userImageStreamCrop::after {
- border: 100px solid rgba(214, 214, 214, 0.34);
- border-radius: 100%;
- content: '';
- display: block;
- height: var(--cr-camera-hidden-frame-size);
- margin: 50% 50%;
- transform: translateZ(0) translateX(-50%) translateY(-50%);
- transition: width 100ms, height 100ms;
- transition-timing-function: ease-in;
- width: var(--cr-camera-hidden-frame-size);
- }
-
- :host-context([dir=rtl]) #userImageStreamCrop::after {
- float: left;
- }
-
- #userImageStreamCrop.preview::after {
- height: var(--cr-camera-preview-frame-size);
- transition-timing-function: ease-out;
- width: var(--cr-camera-preview-frame-size);
- }
-
- :host:not([videomode]) #userImageStreamCrop.capture::after {
- background-color: white;
- transition: background-color 50ms ease-in 100ms;
- }
-
- @keyframes flash {
- 0% { background-color: rgba(255, 255, 255, 0); }
- 33% { background-color: rgba(255, 255, 255, 0.67); }
- 100% { background-color: rgba(255, 255, 255, 0); }
- }
-
- :host([videomode]) #userImageStreamCrop.capture::after {
- animation-delay: 100ms;
- animation-duration: 100ms;
- animation-iteration-count: 10;
- animation-name: flash;
- animation-timing-function: ease-out;
- }
-
- paper-spinner-lite {
- bottom: 0;
- left: 0;
- margin: auto auto;
- position: absolute;
- right: 0;
- top: 0;
- }
-
- #cameraVideo {
- height: var(--cr-camera-image-size, 228px);
- object-fit: cover;
- object-position: center;
- position: absolute;
- width: var(--cr-camera-image-size, 228px);
- }
-
- #cameraControls {
- align-items: center;
- background-color: var(--google-blue-500);
- border-bottom-left-radius: 2px;
- border-bottom-right-radius: 2px;
- display: flex;
- height: 32px;
- justify-content: space-between;
- margin: auto;
- width: var(--cr-camera-image-size, 228px);
- }
-
- #cameraControls > div {
- height: 28px;
- line-height: normal;
- margin: 0 10px;
- width: 28px;
- }
-
- #cameraControls cr-icon-button {
- --cr-icon-button-icon-size: 20px;
- --cr-icon-button-size: 28px;
- margin: 0;
- }
-
- #takePhoto {
- --cr-icon-button-fill-color: #ededed;
- --cr-icon-button-stroke-color: white;
- }
-
- :host([videomode]) #takePhoto {
- --cr-icon-button-fill-color: red;
- }
-
- #switchMode {
- --cr-icon-button-fill-color: white;
- }
-
- :host-context([dir=rtl]) #switchMode {
- float: left;
- }
- </style>
- <div id="perspectiveBox">
- <div id="userImageStreamCrop">
- <video id="cameraVideo" autoplay hidden="[[!cameraOnline_]]"></video>
- <paper-spinner-lite active="[[!cameraOnline_]]"></paper-spinner-lite>
- </div>
- </div>
- <div id="cameraControls">
- <div>
- <!-- Empty div for even 'space-between' justification -->
- </div>
- <div>
- <iron-a11y-keys keys="up down left right"></iron-a11y-keys>
- <cr-icon-button id="takePhoto" tabindex="1"
- title="[[getTakePhotoLabel_(videomode, takePhotoLabel,
- captureVideoLabel)]]" on-click="takePhoto"
- disabled="[[!cameraOnline_]]"
- iron-icon="[[getTakePhotoIcon_(videomode)]]">
- </cr-icon-button>
- </div>
- <div>
- <cr-icon-button hidden="[[!videoModeEnabled]]" id="switchMode"
- tabindex="2" on-click="onTapSwitchMode_"
- title="[[getSwitchModeLabel_(videomode, switchModeToCameraLabel,
- switchModeToVideoLabel)]]" disabled="[[!cameraOnline_]]"
- iron-icon="[[getSwitchModeIcon_(videomode)]]">
- </cr-icon-button>
- </div>
- </div>
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.js b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.js
deleted file mode 100644
index 2b984e0d5e5..00000000000
--- a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.js
+++ /dev/null
@@ -1,214 +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.
-
-/**
- * @fileoverview
- * 'cr-camera' is a Polymer element used to take a picture from the
- * user webcam to use as a Chrome OS profile picture.
- */
-import '../../shared_style_css.m.js';
-import '../../cr_icon_button/cr_icon_button.m.js';
-import '//resources/polymer/v3_0/iron-a11y-keys/iron-a11y-keys.js';
-import '//resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js';
-import './icons.js';
-
-import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-
-import * as webcamUtils from './webcam_utils.js';
-
-Polymer({
- is: 'cr-camera',
-
- _template: html`{__html_template__}`,
-
- properties: {
- /** Strings provided by host */
- takePhotoLabel: String,
- captureVideoLabel: String,
- switchModeToCameraLabel: String,
- switchModeToVideoLabel: String,
-
- /** True if video mode is enabled. */
- videoModeEnabled: {
- type: Boolean,
- value: false,
- },
-
- /**
- * True if currently in video mode.
- * @private {boolean}
- */
- videomode: {
- type: Boolean,
- value: false,
- reflectToAttribute: true,
- },
-
- /**
- * True when the camera is actually streaming video. May be false even when
- * the camera is present and shown, but still initializing.
- * @private {boolean}
- */
- cameraOnline_: {
- type: Boolean,
- value: false,
- },
- },
-
- /** @private {boolean} */
- cameraStartInProgress_: false,
-
- /** @private {boolean} */
- cameraCaptureInProgress_: false,
-
- /** @override */
- attached() {
- this.$.cameraVideo.addEventListener('canplay', function() {
- this.$.userImageStreamCrop.classList.add('preview');
- this.cameraOnline_ = true;
- this.focusTakePhotoButton();
- }.bind(this));
- this.startCamera();
- },
-
- /** @override */
- detached() {
- this.stopCamera();
- },
-
- /** Only focuses the button if it's not disabled. */
- focusTakePhotoButton() {
- if (this.cameraOnline_) {
- this.$.takePhoto.focus();
- }
- },
-
- /**
- * Performs photo capture from the live camera stream. A 'photo-taken' event
- * will be fired as soon as captured photo is available, with the
- * 'photoDataURL' property containing the photo encoded as a data URL.
- */
- async takePhoto() {
- if (!this.cameraOnline_ || this.cameraCaptureInProgress_) {
- return;
- }
- this.cameraCaptureInProgress_ = true;
- this.$.userImageStreamCrop.classList.remove('preview');
- this.$.userImageStreamCrop.classList.add('capture');
-
- const numFrames = this.videomode ?
- webcamUtils.CAPTURE_DURATION_MS / webcamUtils.CAPTURE_INTERVAL_MS :
- 1;
-
- try {
- const frames = await webcamUtils.captureFrames(
- /** @type {!HTMLVideoElement} */ (this.$.cameraVideo),
- this.getCaptureSize_(), webcamUtils.CAPTURE_INTERVAL_MS, numFrames);
-
- const photoDataUrl = webcamUtils.convertFramesToPng(frames);
- this.fire('photo-taken', {photoDataUrl});
- } catch (e) {
- console.error(e);
- }
- this.$.userImageStreamCrop.classList.remove('capture');
- this.cameraCaptureInProgress_ = false;
- },
-
- /** Tries to start the camera stream capture. */
- startCamera() {
- this.stopCamera();
- this.cameraStartInProgress_ = true;
-
- const successCallback = function(stream) {
- if (this.cameraStartInProgress_) {
- this.$.cameraVideo.srcObject = stream;
- this.cameraStream_ = stream;
- } else {
- webcamUtils.stopMediaTracks(stream);
- }
- this.cameraStartInProgress_ = false;
- }.bind(this);
-
- const errorCallback = function() {
- this.cameraOnline_ = false;
- this.cameraStartInProgress_ = false;
- }.bind(this);
-
- navigator.webkitGetUserMedia(
- {video: webcamUtils.kDefaultVideoConstraints}, successCallback,
- errorCallback);
- },
-
- /** Stops the camera stream capture if it's currently active. */
- stopCamera() {
- this.$.userImageStreamCrop.classList.remove('preview');
- this.cameraOnline_ = false;
- this.$.cameraVideo.srcObject = null;
- webcamUtils.stopMediaTracks(this.cameraStream_);
- this.cameraStream_ = null;
- // Cancel any pending getUserMedia() checks.
- this.cameraStartInProgress_ = false;
- },
-
- /**
- * Get the correct capture size for single photo or video mode.
- * @return {{height: number, width: number}}
- * @private
- */
- getCaptureSize_() {
- if (this.videomode) {
- /** Reduce capture size when in video mode. */
- return {
- width: webcamUtils.CAPTURE_SIZE.width / 2,
- height: webcamUtils.CAPTURE_SIZE.height / 2,
- };
- }
- return webcamUtils.CAPTURE_SIZE;
- },
-
- /**
- * Switch between photo and video mode.
- * @private
- */
- onTapSwitchMode_() {
- this.videomode = !this.videomode;
- this.fire('switch-mode', this.videomode);
- },
-
- /**
- * @return {string}
- * @private
- */
- getTakePhotoIcon_() {
- return this.videomode ? 'cr-picture:videocam-shutter-icon' :
- 'cr-picture:camera-shutter-icon';
- },
-
- /**
- * Returns the label to use for take photo button.
- * @return {string}
- * @private
- */
- getTakePhotoLabel_(videomode, photoLabel, videoLabel) {
- return videomode ? videoLabel : photoLabel;
- },
-
- /**
- * @return {string}
- * @private
- */
- getSwitchModeIcon_() {
- return this.videomode ? 'cr-picture:camera-alt-icon' :
- 'cr-picture:videocam-icon';
- },
-
- /**
- * Returns the label to use for switch mode button.
- * @return {string}
- * @private
- */
- getSwitchModeLabel_(videomode, cameraLabel, videoLabel) {
- return videomode ? cameraLabel : videoLabel;
- },
-});
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_list.html b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_list.html
deleted file mode 100644
index a7816eaed6d..00000000000
--- a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_list.html
+++ /dev/null
@@ -1,100 +0,0 @@
- <style include="cr-shared-style">
- #container {
- /* Add margin at the bottom of the list. Note that there is no margin
- * to the window boundary when the list scrolls. */
- border-bottom: 40px transparent solid;
- }
-
- :host {
- display: inline-block;
- margin-top: -6px;
- }
-
- img {
- border-radius: 50%;
- height: 64px;
- margin: 6px;
- vertical-align: top;
- width: 64px;
- }
-
- img.iron-selected {
- border: 2px solid rgba(66, 133, 244, 0.6);
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.17);
- margin: 4px;
- outline: none;
- }
-
- img:focus {
- outline: 1px solid rgba(66, 133, 244, 0.6);
- }
-
- iron-icon {
- --iron-icon-fill-color: var(--google-grey-500);
- --iron-icon-height: 24px;
- --iron-icon-width: 24px;
- background-color: rgb(237, 237, 237);
- border: 0;
- border-radius: 50%;
- margin: 6px;
- padding: 20px;
- position: static;
- }
-
- iron-icon.iron-selected {
- border: 2px solid rgba(66, 133, 244, 0.6);
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.17);
- margin: 4px;
- outline: none;
- }
-
- iron-icon:focus {
- outline: 1px solid rgba(66, 133, 244, 0.6);
- }
- </style>
-
- <div id="container">
- <iron-a11y-keys keys="up down left right space enter"
- on-keys-pressed="onKeysPressed">
- </iron-a11y-keys>
- <iron-selector id="selector"
- on-iron-activate="onIronActivate_" on-iron-select="onIronSelect_"
- on-selected-item-changed="onSelectedItemChanged_"
- selected-item="{{selectedItem}}" role="radiogroup">
- <!-- Selects the camera as the picture source. -->
- <iron-icon id="cameraImage" role="radio"
- data-type$="[[selectionTypesEnum_.CAMERA]]"
- icon="cr:camera-alt" title="[[takePhotoLabel]]"
- hidden="[[!cameraPresent]]">
- </iron-icon>
- <template is="dom-if" if="[[chooseFileLabel]]">
- <!-- Selects the file picker as the picture source. -->
- <iron-icon data-type$="[[selectionTypesEnum_.FILE]]" role="radio"
- icon="cr:folder-filled" title="[[chooseFileLabel]]">
- </iron-icon>
- </template>
- <!-- Shows and selects the current profile picture. -->
- <img id="profileImage" role="radio"
- data-type$="[[selectionTypesEnum_.PROFILE]]"
- data-url$="[[profileImageUrl_]]"
- src="[[getImgSrc_(profileImageUrl_)]]"
- hidden="[[!profileImageUrl_]]"
- srcset="[[getImgSrc2x_(profileImageUrl_)]]"
- title="[[profileImageLabel]]">
- <!-- Shows and selects the previously selected ('old') picture. -->
- <img id="oldImage" role="radio"
- data-type$="[[selectionTypesEnum_.OLD]]"
- data-url$="[[oldImageUrl_]]"
- src="[[getImgSrc_(oldImageUrl_)]]" hidden="[[!oldImageUrl_]]"
- title="[[oldImageLabel]]">
- <!-- Shows the list of available images to select from. -->
- <template is="dom-repeat" items="[[defaultImages]]">
- <img role="radio"
- data-type$="[[selectionTypesEnum_.DEFAULT]]"
- data-index$="[[index]]" data-image-index$="[[item.index]]"
- data-url$="[[item.url]]"
- src="[[getImgSrc_(item.url)]]"
- srcset="[[getImgSrc2x_(item.url)]]" title="[[item.title]]">
- </template>
- </iron-selector>
- </div>
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_list.js b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_list.js
deleted file mode 100644
index ac9f453100c..00000000000
--- a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_list.js
+++ /dev/null
@@ -1,330 +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.
-
-/**
- * @fileoverview
- * 'cr-picture-list' is a Polymer element used to show a selectable list of
- * profile pictures plus a camera selector, file picker, and the current
- * profile image.
- */
-
-import '../../icons.m.js';
-import '../../shared_style_css.m.js';
-import '//resources/polymer/v3_0/iron-a11y-keys/iron-a11y-keys.js';
-import '//resources/polymer/v3_0/iron-icon/iron-icon.js';
-import '//resources/polymer/v3_0/iron-selector/iron-selector.js';
-
-import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-
-import {CrPicture} from './cr_picture_types.js';
-import {convertImageSequenceToPng, isEncodedPngDataUrlAnimated} from './png.js';
-
-Polymer({
- is: 'cr-picture-list',
-
- _template: html`{__html_template__}`,
-
- properties: {
- cameraPresent: Boolean,
-
- /**
- * The default user images.
- * @type {!Array<!{index: number, title: string, url: string}>}
- */
- defaultImages: {
- type: Array,
- observer: 'onDefaultImagesChanged_',
- },
-
- /** Strings provided by host */
- chooseFileLabel: String,
- oldImageLabel: String,
- profileImageLabel: String,
- takePhotoLabel: String,
-
- /**
- * The currently selected item. This property is bound to the iron-selector
- * and never directly assigned. This may be undefined momentarily as
- * the selection changes due to iron-selector implementation details.
- * @private {?CrPicture.ImageElement}
- */
- selectedItem: {
- type: Object,
- notify: true,
- observer: 'onImageSelected_',
- },
-
- /**
- * The url of the currently set profile picture image.
- * @private
- */
- profileImageUrl_: {
- type: String,
- value: CrPicture.kDefaultImageUrl,
- },
-
- /**
- * The url of the old image, which is either the existing image sourced from
- * the camera or a file.
- * @private
- */
- oldImageUrl_: {
- type: String,
- value: '',
- },
-
- /** @private */
- selectionTypesEnum_: {
- type: Object,
- value: CrPicture.SelectionTypes,
- readOnly: true,
- },
- },
-
- /** @private {boolean} */
- cameraSelected_: false,
-
- /** @private {string} */
- selectedImageUrl_: '',
-
- /**
- * The fallback image to be selected when the user discards the 'old' image.
- * This may be null if the user started with the old image.
- * @private {?CrPicture.ImageElement}
- */
- fallbackImage_: null,
-
- setFocus() {
- if (this.selectedItem) {
- this.selectedItem.focus();
- }
- },
-
- onImageSelected_(newImg, oldImg) {
- if (newImg) {
- newImg.setAttribute('tabindex', '0');
- newImg.setAttribute('aria-checked', 'true');
- newImg.focus();
- }
- if (oldImg) {
- oldImg.removeAttribute('tabindex');
- oldImg.removeAttribute('aria-checked');
- }
- },
-
- /**
- * @param {string} imageUrl
- * @param {boolean} selected
- */
- setProfileImageUrl(imageUrl, selected) {
- this.profileImageUrl_ = imageUrl;
- this.$.profileImage.title = this.profileImageLabel;
- if (!selected) {
- return;
- }
- this.setSelectedImage_(
- /**
- * @type {!CrPicture.ImageElement}
- */
- (this.$.profileImage));
- },
-
- /**
- * @param {string} imageUrl
- */
- setSelectedImageUrl(imageUrl) {
- const image = this.$.selector.items.find(function(image) {
- return image.dataset.url === imageUrl;
- });
- if (image) {
- this.setSelectedImage_(
- /**
- * @type {!CrPicture.ImageElement}
- */
- (image));
- this.selectedImageUrl_ = '';
- } else {
- this.selectedImageUrl_ = imageUrl;
- }
- },
-
- /**
- * @param {string} imageUrl
- */
- setOldImageUrl(imageUrl) {
- if (imageUrl === CrPicture.kDefaultImageUrl) {
- // Treat the default image as empty so it does not show in the list.
- this.oldImageUrl_ = '';
- this.setSelectedImageUrl(CrPicture.kDefaultImageUrl);
- return;
- }
- this.oldImageUrl_ = imageUrl;
- if (imageUrl) {
- this.$.selector.select(this.$.selector.indexOf(this.$.oldImage));
- this.selectedImageUrl_ = imageUrl;
- } else if (this.cameraSelected_) {
- this.$.selector.select(this.$.selector.indexOf(this.$.cameraImage));
- } else if (
- this.fallbackImage_ &&
- this.fallbackImage_.dataset.type !== CrPicture.SelectionTypes.OLD) {
- this.selectImage_(
- /**
- * @type {!CrPicture.ImageElement}
- */
- (this.fallbackImage_), true /* activate */);
- } else {
- this.selectImage_(
- /**
- * @type {!CrPicture.ImageElement}
- */
- (this.$.profileImage), true /* activate */);
- }
- },
-
- /**
- * Handler for when accessibility-specific keys are pressed.
- * @param {!CustomEvent<!{key: string, keyboardEvent: Object}>} e
- */
- onKeysPressed(e) {
- if (!this.selectedItem) {
- return;
- }
-
- const selector = /** @type {IronSelectorElement} */ (this.$.selector);
- const prevSelected = this.selectedItem;
- let activate = false;
- switch (e.detail.key) {
- case 'enter':
- case 'space':
- activate = true;
- break;
- case 'up':
- case 'left':
- do {
- selector.selectPrevious();
- } while (this.selectedItem.hidden &&
- this.selectedItem !== prevSelected);
- break;
- case 'down':
- case 'right':
- do {
- selector.selectNext();
- } while (this.selectedItem.hidden &&
- this.selectedItem !== prevSelected);
- break;
- default:
- return;
- }
- this.selectImage_(this.selectedItem, activate);
- e.detail.keyboardEvent.preventDefault();
- },
-
- /**
- * @param {!CrPicture.ImageElement} image
- */
- setSelectedImage_(image) {
- this.fallbackImage_ = image;
- // If the user is currently taking a photo, do not change the focus.
- if (!this.selectedItem ||
- this.selectedItem.dataset.type !== CrPicture.SelectionTypes.CAMERA) {
- this.$.selector.select(this.$.selector.indexOf(image));
- this.selectedItem = image;
- }
- },
-
- /** @private */
- onDefaultImagesChanged_() {
- if (this.selectedImageUrl_) {
- this.setSelectedImageUrl(this.selectedImageUrl_);
- }
- },
-
- /**
- * @param {!CrPicture.ImageElement} selected
- * @param {boolean} activate
- * @private
- */
- selectImage_(selected, activate) {
- this.cameraSelected_ =
- selected.dataset.type === CrPicture.SelectionTypes.CAMERA;
- this.selectedItem = selected;
-
- if (selected.dataset.type === CrPicture.SelectionTypes.CAMERA) {
- if (activate) {
- this.fire('focus-action', selected);
- }
- } else if (
- activate || selected.dataset.type !== CrPicture.SelectionTypes.FILE) {
- this.fire('image-activate', selected);
- }
- },
-
- /**
- * @param {!Event} event
- * @private
- */
- onIronActivate_(event) {
- event.stopPropagation();
- const type = event.detail.item.dataset.type;
- // Don't change focus when activating the camera via mouse.
- const activate = type !== CrPicture.SelectionTypes.CAMERA;
- this.selectImage_(event.detail.item, activate);
- },
-
- /**
- * @param {!Event} event
- * @private
- */
- onIronSelect_(event) {
- event.stopPropagation();
- },
-
- /**
- * @param {!Event} event
- * @private
- */
- onSelectedItemChanged_(event) {
- if (event.target.selectedItem) {
- event.target.selectedItem.scrollIntoViewIfNeeded(false);
- }
- },
-
- /**
- * Returns the image to use for 'src'.
- * @param {string} url
- * @return {string}
- * @private
- */
- getImgSrc_(url) {
- // Use first frame of animated user images.
- if (url.startsWith('chrome://theme')) {
- return url + '[0]';
- }
-
- /**
- * Extract first frame from image by creating a single frame PNG using
- * url as input if base64 encoded and potentially animated.
- */
- if (url.split(',')[0] === 'data:image/png;base64') {
- return convertImageSequenceToPng([url]);
- }
-
- return url;
- },
-
- /**
- * Returns the 2x (high dpi) image to use for 'srcset' for chrome://theme
- * images. Note: 'src' will still be used as the 1x candidate as per the HTML
- * spec.
- * @param {string} url
- * @return {string}
- * @private
- */
- getImgSrc2x_(url) {
- if (!url.startsWith('chrome://theme')) {
- return '';
- }
- return url + '[0]@2x 2x';
- },
-});
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.html b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.html
deleted file mode 100644
index b590053da36..00000000000
--- a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.html
+++ /dev/null
@@ -1,72 +0,0 @@
- <style include="cr-shared-style">
- :host {
- display: inline-block;
- }
-
- cr-camera {
- --cr-camera-image-size: 288px;
- }
-
- #preview {
- height: 288px;
- }
-
- img {
- background-size: 100% 100%;
- border-radius: 50%;
- display: block;
- height: 288px;
- width: 288px;
- }
-
- img:not([data-show-discard]) {
- background-color: rgba(0, 0, 0, 0.08);
- border-radius: 50%;
- bottom: 0;
- height: var(--cr-picture-image-size, 228px);
- left: 0;
- margin: auto;
- padding: 2px;
- position: absolute;
- right: 0;
- top: 0;
- width: var(--cr-picture-image-size, 228px);
- }
-
- #discard {
- align-items: center;
- background-clip: content-box;
- background-color: var(--google-blue-500);
- border-bottom-left-radius: 2px;
- border-bottom-right-radius: 2px;
- display: flex;
- height: 32px;
- justify-content: center;
- width: 288px;
- }
-
- cr-icon-button {
- --cr-icon-button-fill-color: white;
- --cr-icon-button-icon-size: 24px;
- --cr-icon-button-size: 28px;
- margin: 0;
- }
- </style>
- <div id="preview" hidden="[[!showImagePreview_(cameraActive_, imageSrc)]]">
- <img id="image" alt="[[previewAltText]]" src="[[getImgSrc_(imageUrl)]]"
- data-show-discard$="[[showDiscard_(imageType)]]">
- <div id="discard" hidden="[[!showDiscard_(imageType)]]">
- <cr-icon-button class="icon-picture-delete" id="discardImage"
- title="[[discardImageLabel]]" on-click="onTapDiscardImage_">
- </cr-icon-button>
- </div>
- </div>
- <template is="dom-if" if="[[cameraActive_]]">
- <cr-camera id="camera"
- take-photo-label="[[takePhotoLabel]]"
- capture-video-label="[[captureVideoLabel]]"
- switch-mode-to-camera-label="[[switchModeToCameraLabel]]"
- switch-mode-to-video-label="[[switchModeToVideoLabel]]"
- video-mode-enabled="[[cameraVideoModeEnabled]]">
- </cr-camera>
- </template>
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.js b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.js
deleted file mode 100644
index d0370c92a06..00000000000
--- a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.js
+++ /dev/null
@@ -1,185 +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.
-
-/**
- * @fileoverview
- * 'cr-picture-pane' is a Polymer element used to show either a profile
- * picture or a camera image preview.
- */
-
-import '../../shared_style_css.m.js';
-import '../../cr_icon_button/cr_icon_button.m.js';
-import './cr_camera.js';
-
-import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-
-import {CrPicture} from './cr_picture_types.js';
-import {convertImageSequenceToPng, isEncodedPngDataUrlAnimated} from './png.js';
-
-Polymer({
- is: 'cr-picture-pane',
-
- _template: html`{__html_template__}`,
-
- properties: {
-
- /** Whether the camera is present / available */
- cameraPresent: Boolean,
-
- /** Image source to show when imageType !== CAMERA. */
- imageSrc: {
- type: String,
- observer: 'imageSrcChanged_',
- },
-
- /** Image URL to use when imageType !== CAMERA. */
- imageUrl: {
- type: String,
- value: '',
- },
-
- /**
- * The type of image to display in the preview.
- * @type {CrPicture.SelectionTypes}
- */
- imageType: {
- type: String,
- value: CrPicture.SelectionTypes.NONE,
- },
-
- /** Strings provided by host */
- discardImageLabel: String,
- previewAltText: String,
- takePhotoLabel: String,
- captureVideoLabel: String,
- switchModeToCameraLabel: String,
- switchModeToVideoLabel: String,
-
- /** Whether camera video mode is enabled */
- cameraVideoModeEnabled: Boolean,
-
- /** Whether the camera should be shown and active (started). */
- cameraActive_: {
- type: Boolean,
- computed: 'getCameraActive_(cameraPresent, imageType)',
- observer: 'cameraActiveChanged_',
- },
- },
-
- /**
- * Tells the camera to take a photo; the camera will fire a 'photo-taken'
- * event when the photo is completed.
- */
- takePhoto() {
- const camera = /** @type {?CrCameraElement} */ (this.$$('#camera'));
- if (camera) {
- camera.takePhoto();
- }
- },
-
- /** Tells the pane to focus the main action button. */
- focusActionButton() {
- if (this.showDiscard_()) {
- this.$.discardImage.focus();
- } else if (this.cameraActive_) {
- this.$$('#camera').focusTakePhotoButton();
- }
- },
-
- /** Tells the pane to preview the deprecated default image. */
- previewDeprecatedImage(url) {
- this.imageSrc = url;
- this.imageType = CrPicture.SelectionTypes.DEPRECATED;
- },
-
- /**
- * @return {boolean}
- * @private
- */
- getCameraActive_() {
- return this.cameraPresent &&
- this.imageType === CrPicture.SelectionTypes.CAMERA;
- },
-
- /** @private */
- cameraActiveChanged_() {
- const camera = /** @type {?CrCameraElement} */ (this.$$('#camera'));
- if (!camera) {
- return;
- } // Camera will be started when attached.
- if (this.cameraActive_) {
- camera.startCamera();
- } else {
- camera.stopCamera();
- }
- },
-
- /** @private */
- imageSrcChanged_() {
- /**
- * If current image URL is an object URL created below then revoke it to
- * prevent this code from using more than one object URL per document.
- */
- if (this.imageUrl.startsWith('blob:')) {
- URL.revokeObjectURL(this.imageUrl);
- }
-
- /**
- * Data URLs for PNG images can be large. Create an object URL to avoid
- * URL length limits.
- */
- const image = /** @type {!HTMLImageElement} */ (this.$$('#image'));
- if (this.imageSrc.startsWith('data:image/png')) {
- const byteString = atob(this.imageSrc.split(',')[1]);
- const bytes = new Uint8Array(byteString.length);
- for (let i = 0; i < byteString.length; i++) {
- bytes[i] = byteString.charCodeAt(i);
- }
- const blob = new Blob([bytes], {'type': 'image/png'});
- // Use first frame as placeholder while rest of image loads.
- image.style.backgroundImage =
- 'url(' + convertImageSequenceToPng([this.imageSrc]) + ')';
- this.imageUrl = URL.createObjectURL(blob);
- } else {
- image.style.backgroundImage = 'none';
- this.imageUrl = this.imageSrc;
- }
- },
-
- /**
- * @return {boolean}
- * @private
- */
- showImagePreview_() {
- return !this.cameraActive_ && !!this.imageSrc;
- },
-
- /**
- * @return {boolean}
- * @private
- */
- showDiscard_() {
- return this.imageType === CrPicture.SelectionTypes.OLD;
- },
-
- /** @private */
- onTapDiscardImage_() {
- this.fire('discard-image');
- },
-
- /**
- * Returns the image to use for 'src'.
- * @param {string} url
- * @return {string}
- * @private
- */
- getImgSrc_(url) {
- // Always use 2x user image for preview.
- if (url.startsWith('chrome://theme')) {
- return url + '@2x';
- }
-
- return url;
- },
-});
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_types.html b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_types.html
deleted file mode 100644
index f6194bab15b..00000000000
--- a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_types.html
+++ /dev/null
@@ -1 +0,0 @@
-<script src="cr_picture_types.js"></script>
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_types.js b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_types.js
deleted file mode 100644
index f4fdb12b2fd..00000000000
--- a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_types.js
+++ /dev/null
@@ -1,38 +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.
-
-export const CrPicture = {};
-
-/**
- * Contains the possible types for picture list image elements.
- * @enum {string}
- */
-CrPicture.SelectionTypes = {
- CAMERA: 'camera',
- FILE: 'file',
- PROFILE: 'profile',
- // 'old' image is any selected non-profile and non-default image. It can be
- // from the camera or a file.
- OLD: 'old',
- DEFAULT: 'default',
- // 'deprecated' image is from the deprecated set of default images which is
- // still selected by the user.
- DEPRECATED: 'deprecated',
- NONE: '',
-};
-
-/**
- * An picture list image element.
- * @typedef {{
- * dataset: {
- * type: !CrPicture.SelectionTypes,
- * index: (number|undefined),
- * imageIndex: (number|undefined),
- * },
- * src: string,
- * }}
- */
-CrPicture.ImageElement;
-
-CrPicture.kDefaultImageUrl = 'chrome://theme/IDR_LOGIN_DEFAULT_USER';
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/icons.html b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/icons.html
deleted file mode 100644
index df625195dbd..00000000000
--- a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/icons.html
+++ /dev/null
@@ -1,11 +0,0 @@
-
-<iron-iconset-svg name="cr-picture" size="24">
- <svg>
- <defs>
- <g id="camera-alt-icon"><circle cx="12" cy="12" r="3.2"></circle><path d="M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"></path></g>
- <g id="camera-shutter-icon"><circle cx="12" cy="12" r="10" stroke-width="2"></circle></g>
- <g id="videocam-icon"><path d="M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"></path></g>
- <g id="videocam-shutter-icon"><circle cx="12" cy="12" r="7" stroke-width="8"></circle></g>
- </defs>
- </svg>
-</iron-iconset-svg>
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/icons.js b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/icons.js
deleted file mode 100644
index a5bfc534ea6..00000000000
--- a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/icons.js
+++ /dev/null
@@ -1,9 +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 '//resources/polymer/v3_0/iron-iconset-svg/iron-iconset-svg.js';
-
-import {html} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-
-const template = html`{__html_template__}`;
-document.head.appendChild(template.content);
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/png.html b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/png.html
deleted file mode 100644
index 8525acfe5fd..00000000000
--- a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/png.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<link rel="import" href="../../../html/cr.html">
-<script src="png.js"></script>
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/png.js b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/png.js
deleted file mode 100644
index 5c149a693af..00000000000
--- a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/png.js
+++ /dev/null
@@ -1,539 +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.
-
- /**
- * @fileoverview
- * 'CrPngBehavior' is a behavior to convert image sequences into APNG
- * (animated PNG) images.
- */
-
- /**
- * PNG frame delay fraction numerator.
- * @const
- */
- const PNG_FRAME_DELAY_NUMERATOR = 1;
-
- /**
- * PNG frame delay fraction denominator.
- * @const
- */
- const PNG_FRAME_DELAY_DENOMINATOR = 20;
-
- /**
- * PNG signature.
- * @const
- */
- const PNG_SIGNATURE = [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A];
-
- /**
- * PNG bit depth (8 = 32bpp).
- * @const
- */
- const PNG_BIT_DEPTH = 8;
-
- /**
- * PNG compression method (0 = deflate/inflate compression with a sliding
- * window PNG compression).
- * @const
- */
- const PNG_COMPRESSION_METHOD = 0;
-
- /**
- * PNG filter method (0 = adaptive filtering with five basic filter types).
- * @const
- */
- const PNG_FILTER_METHOD = 0;
-
- /**
- * PNG interlace method (0 = no interlace).
- * @const
- */
- const PNG_INTERLACE_METHOD = 0;
-
- /**
- * CRC table for PNG encode.
- *
- * Generated using:
- *
- * for (var i = 0; i < 256; i++) {
- * var value = i;
- * for (var j = 0; j < 8; j++) {
- * if (value & 1)
- * value = ((0xEDB88320) ^ (value >>> 1));
- * else
- * value = (value >>> 1);
- * }
- * TABLE[i] = value;
- * }
- *
- * @const
- */
- const PNG_CRC_TABLE = [
- 0x0, 0x77073096, 0xEE0E612C, 0x990951BA, 0x76DC419, 0x706AF48F,
- 0xE963A535, 0x9E6495A3, 0xEDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
- 0x9B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2,
- 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
- 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
- 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
- 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C,
- 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
- 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,
- 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
- 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x1DB7106,
- 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x6B6B51F, 0x9FBFE4A5, 0xE8B8D433,
- 0x7807C9A2, 0xF00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x86D3D2D,
- 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
- 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,
- 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
- 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,
- 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
- 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA,
- 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
- 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
- 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x3B6E20C, 0x74B1D29A,
- 0xEAD54739, 0x9DD277AF, 0x4DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84,
- 0xD6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0xA00AE27, 0x7D079EB1,
- 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
- 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
- 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E,
- 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
- 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,
- 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
- 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28,
- 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
- 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x26D930A, 0x9C0906A9, 0xEB0E363F,
- 0x72076785, 0x5005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0xCB61B38,
- 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0xBDBDF21, 0x86D3D2D4, 0xF1D4E242,
- 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
- 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,
- 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
- 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC,
- 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
- 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
- 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
- 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
- ];
-
- /**
- * PNG object state.
- * @typedef {{
- * frames: number,
- * sequences: number,
- * width: number,
- * height: number,
- * colour: number,
- * chunks: !Array<Uint8Array>
- * }}
- */
- let CrPngState;
-
- /**
- * Construct an internal representation of the png.
- * @param {!Array<string>} images The data URLs for each image.
- * @return {!CrPngState}
- * @private
- */
- function convertDataUrlsToCrPng(images) {
- const png =
- /** @type {!CrPngState} */ ({frames: 0, sequences: 0, chunks: []});
-
- /** Append signature. */
- png.chunks.push(new Uint8Array(PNG_SIGNATURE));
-
- /**
- * http://www.w3.org/TR/2003/REC-PNG-20031110/#11IHDR
- *
- * Width 4 bytes
- * Height 4 bytes
- * Bit depth 1 byte
- * Colour type 1 byte
- * Compression method 1 byte
- * Filter method 1 byte
- * Interlace method 1 byte
- */
- const IHDR = new Uint8Array(12 + 13);
- writeUInt32(IHDR, 13, 0);
- writeFourCC(IHDR, 'IHDR', 4);
- /** Write size at the end when known. */
- writeUInt8(IHDR, PNG_BIT_DEPTH, 16);
- /** Write colour at the end when known. */
- writeUInt8(IHDR, PNG_COMPRESSION_METHOD, 18);
- writeUInt8(IHDR, PNG_FILTER_METHOD, 19);
- writeUInt8(IHDR, PNG_INTERLACE_METHOD, 20);
- /** Write CRC at the end when size and colour is known. */
- png.chunks.push(IHDR);
-
- /**
- * acTL
- *
- * Number of frames 4 bytes
- * Number of times to loop 4 bytes
- */
- const acTL = new Uint8Array(12 + 8);
- writeUInt32(acTL, 8, 0);
- writeFourCC(acTL, 'acTL', 4);
- writeUInt32(acTL, images.length, 8);
- writeUInt32(acTL, 0, 12);
- writeUInt32(acTL, getCRC(acTL, 4, 16), 16);
- png.chunks.push(acTL);
-
- /** Append each image as a PNG frame. */
- for (let i = 0; i < images.length; ++i) {
- appendFrameFromDataURL(images[i], png);
- }
-
- /** Update IHDR now that size and colour is known. */
- writeUInt32(IHDR, png.width, 8);
- writeUInt32(IHDR, png.height, 12);
- writeUInt8(IHDR, png.colour, 17);
- writeUInt32(IHDR, getCRC(IHDR, 4, 8 + 13), 8 + 13);
-
- /**
- * http://www.w3.org/TR/2003/REC-PNG-20031110/#11IEND
- */
- const IEND = new Uint8Array(12);
- writeUInt32(IEND, 0, 0);
- writeFourCC(IEND, 'IEND', 4);
- writeUInt32(IEND, getCRC(IEND, 4, 8), 8);
- png.chunks.push(IEND);
-
- return png;
- }
-
- /**
- * Get a binary representation of the png.
- * @param {!Array<string>} images The data URLs for each image.
- * @return {!Uint8Array} Binary data for animated png image.
- */
- export function convertImageSequenceToPngBinary(images) {
- const png = convertDataUrlsToCrPng(images);
- const numBytes =
- png.chunks.reduce((value, next) => value + next.byteLength, 0);
- const result = new Uint8Array(numBytes);
- let offset = 0;
- for (const chunk of png.chunks) {
- result.set(/** @type {!ArrayBufferView} */ (chunk), offset);
- offset += chunk.byteLength;
- }
- return result;
- }
-
- /**
- * Returns a data URL for an animated PNG image that is created
- * from a sequence of images.
- * @param {!Array<string>} images The data URLs for each image.
- * @return {string} A data URL for an animated PNG image.
- */
- export function convertImageSequenceToPng(images) {
- const png = convertDataUrlsToCrPng(images);
- return 'data:image/png;base64,' +
- btoa(png.chunks
- .map(function(chunk) {
- return String.fromCharCode.apply(null, chunk);
- })
- .join(''));
- }
-
- /**
- * Returns true if the data URL is an animated PNG image. If the PNG is
- * animated, then 'acTL' will have been set by convertImageSequenceToPng().
- * acTL is the animation control chunk in the data stream of an animated PNG.
- * If it exists we assume the image is animated, regardless of the number of
- * frames. The offset is the PNG signature ( 8 bytes) + IHDR (25 bytes) + 4
- * bytes of padding zeros. See https://wiki.mozilla.org/APNG_Specification
- * @param {string} url An btoa encoded data URL for a PNG image.
- * @return {boolean} True if data URL is an animated PNG image.
- */
- export function isEncodedPngDataUrlAnimated(url) {
- const decoded = atob(url.substr('data:image/png;base64,'.length));
- return decoded.substr(37, 4) === 'acTL';
- }
-
- /**
- * Reads Uint32 from buffer.
- * @param {!Uint8Array} buffer Buffer to read UInt32 from.
- * @param {number} offset Offset in buffer to read UInt32 at.
- * @return {number} The value read.
- */
- function readUInt32(buffer, offset) {
- return (buffer[offset + 0] << 24) + (buffer[offset + 1] << 16) +
- (buffer[offset + 2] << 8) + (buffer[offset + 3] << 0);
- }
-
- /**
- * Reads string from buffer.
- * @param {!Uint8Array} buffer Buffer to read string from.
- * @param {number} offset Offset in buffer to read string at.
- * @param {number} length Length of string to read.
- * @return {string} The value read.
- */
- function readString(buffer, offset, length) {
- let str = '';
- for (let i = 0; i < length; i++) {
- str += String.fromCharCode(buffer[offset + i]);
- }
- return str;
- }
-
- /**
- * Write bytes to buffer.
- * @param {!Uint8Array} buffer Buffer to write bytes to.
- * @param {!Uint8Array} bytes Array of bytes to be written.
- * @param {number} offset Offset in buffer to write bytes at.
- */
- function writeBytes(buffer, bytes, offset) {
- for (let i = 0; i < bytes.length; i++) {
- buffer[offset + i] = bytes[i] & 0xFF;
- }
- }
-
- /**
- * Write UInt8 to buffer.
- * @param {!Uint8Array} buffer Buffer to write UInt8 to.
- * @param {number} u8 UInt8 to be written.
- * @param {number} offset Offset in buffer to write UInt8 at.
- */
- function writeUInt8(buffer, u8, offset) {
- buffer[offset] = u8 & 0xFF;
- }
-
- /**
- * Write UInt16 to buffer.
- * @param {!Uint8Array} buffer Buffer to write UInt16 to.
- * @param {number} u16 UInt16 to be written.
- * @param {number} offset Offset in buffer to write UInt16 at.
- */
- function writeUInt16(buffer, u16, offset) {
- buffer[offset + 0] = (u16 >> 8) & 0xFF;
- buffer[offset + 1] = (u16 >> 0) & 0xFF;
- }
-
- /**
- * Write UInt32 to buffer.
- * @param {!Uint8Array} buffer Buffer to write UInt32 to.
- * @param {number} u32 UInt32 to be written.
- * @param {number} offset Offset in buffer to write UInt32 at.
- */
- function writeUInt32(buffer, u32, offset) {
- buffer[offset + 0] = (u32 >> 24) & 0xFF;
- buffer[offset + 1] = (u32 >> 16) & 0xFF;
- buffer[offset + 2] = (u32 >> 8) & 0xFF;
- buffer[offset + 3] = (u32 >> 0) & 0xFF;
- }
-
- /**
- * Write string to buffer.
- * @param {!Uint8Array} buffer Buffer to write string to.
- * @param {string} string String to be written.
- * @param {number} offset Offset in buffer to write string at.
- */
- function writeString(buffer, string, offset) {
- for (let i = 0; i < string.length; i++) {
- buffer[offset + i] = string.charCodeAt(i);
- }
- }
-
- /**
- * Write FourCC code to buffer.
- * @param {!Uint8Array} buffer Buffer to write FourCC code to.
- * @param {string} fourcc FourCC code to be written.
- * @param {number} offset Offset in buffer to write FourCC code at.
- */
- function writeFourCC(buffer, fourcc, offset) {
- buffer[offset + 0] = fourcc.charCodeAt(0);
- buffer[offset + 1] = fourcc.charCodeAt(1);
- buffer[offset + 2] = fourcc.charCodeAt(2);
- buffer[offset + 3] = fourcc.charCodeAt(3);
- }
-
- /**
- * Compute CRC from buffer data.
- * @param {!Uint8Array} buffer Buffer with data to compute CRC from.
- * @param {number} start Start index in buffer.
- * @param {number} end End index in buffer.
- * @return {number} The computed CRC.
- */
- function getCRC(buffer, start, end) {
- let crc = 0xFFFFFFFF;
- for (let i = start; i < end; i++) {
- const crcTableIndex = (crc ^ (buffer[i])) & 0xFF;
- crc = PNG_CRC_TABLE[crcTableIndex] ^ (crc >>> 8);
- }
- return crc ^ 0xFFFFFFFF;
- }
-
- /**
- * Append frame from data URL to PNG object.
- * @param {string} dataURL Data URL for frame.
- * @param {!CrPngState} png PNG object to add frame to.
- */
- function appendFrameFromDataURL(dataURL, png) {
- /** Convert data URL to Uint8Array. */
- const byteString = atob(dataURL.split(',')[1]);
- const bytes = new Uint8Array(byteString.length);
- writeString(bytes, byteString, 0);
-
- /** Check signature. */
- const signature = bytes.subarray(0, PNG_SIGNATURE.length);
- if (signature.toString() !== PNG_SIGNATURE.toString()) {
- console.error('Bad PNG signature');
- }
-
- /**
- * fcTL
- *
- * Sequence number 4 bytes
- * Width 4 bytes
- * Height 4 bytes
- * X position 4 bytes
- * Y position 4 bytes
- * Frame delay numerator 2 bytes
- * Frame delay denominator 2 bytes
- * Dispose op 1 bytes
- * Blend op 1 bytes
- */
- const fcTL = new Uint8Array(12 + 26);
- writeUInt32(fcTL, 26, 0);
- writeFourCC(fcTL, 'fcTL', 4);
- writeUInt32(fcTL, png.sequences, 8);
- /** Write size at the end when known. */
- writeUInt32(fcTL, 0, 20);
- writeUInt32(fcTL, 0, 24);
- writeUInt16(fcTL, PNG_FRAME_DELAY_NUMERATOR, 28);
- writeUInt16(fcTL, PNG_FRAME_DELAY_DENOMINATOR, 30);
- writeUInt8(fcTL, 0, 32);
- writeUInt8(fcTL, 0, 33);
- /** Write CRC at the end when size is known. */
- png.sequences += 1;
- png.chunks.push(fcTL);
-
- /** Append data chunks for frame. */
- let i = PNG_SIGNATURE.length;
- while ((i + 12) <= bytes.length) {
- /**
- * http://www.w3.org/TR/2003/REC-PNG-20031110/#5Chunk-layout
- *
- * length = 4 bytes
- * type = 4 bytes (IHDR, PLTE, IDAT, IEND or others)
- * chunk = length bytes
- * crc = 4 bytes
- */
- const length = readUInt32(bytes, i);
- const type = readString(bytes, i + 4, 4);
- const chunk = bytes.subarray(i + 8, i + 8 + length);
-
- /** We should have enough bytes left for length. */
- if (length !== chunk.length) {
- console.error('Unexpectedly reached end of file');
- }
-
- switch (type) {
- case 'IHDR':
- /**
- * http://www.w3.org/TR/2003/REC-PNG-20031110/#11IHDR
- *
- * Width 4 bytes
- * Height 4 bytes
- * Bit depth 1 byte
- * Colour type 1 byte
- * Compression method 1 byte
- * Filter method 1 byte
- * Interlace method 1 byte
- */
- const width = readUInt32(chunk, 0);
- const height = readUInt32(chunk, 4);
- const depth = chunk[8];
- const colour = chunk[9];
- const compression = chunk[10];
- const filter = chunk[11];
- const interlace = chunk[12];
-
- /** Initialize size and colour if this is the first frame. */
- if (png.frames === 0) {
- png.width = width;
- png.height = height;
- png.colour = colour;
- }
-
- /** Check that header matches our expectations. */
- if (width !== png.width) {
- console.error('Bad PNG width: ' + width);
- }
- if (height !== png.height) {
- console.error('Bad PNG height: ' + height);
- }
- if (depth !== PNG_BIT_DEPTH) {
- console.error('Bad PNG bit depth: ' + depth);
- }
- if (colour !== png.colour) {
- console.error('Bad PNG colour type: ' + colour);
- }
- if (compression !== PNG_COMPRESSION_METHOD) {
- console.error('Bad PNG compression method: ' + compression);
- }
- if (filter !== PNG_FILTER_METHOD) {
- console.error('Bad PNG filter method: ' + filter);
- }
- if (interlace !== PNG_INTERLACE_METHOD) {
- console.error('Bad PNG interlace method: ' + interlace);
- }
- break;
- case 'IDAT':
- /** Append as IDAT chunk if this is the first frame. */
- if (png.frames === 0) {
- /**
- * http://www.w3.org/TR/2003/REC-PNG-20031110/#11IDAT
- *
- * Data X bytes
- */
- const IDAT = new Uint8Array(12 + length);
- writeUInt32(IDAT, length, 0);
- writeFourCC(IDAT, 'IDAT', 4);
- writeBytes(IDAT, chunk, 8);
- writeUInt32(IDAT, getCRC(IDAT, 4, 8 + length), 8 + length);
- png.chunks.push(IDAT);
- } else {
- /**
- * fdAT
- *
- * Sequence number 4 bytes
- * Frame data X bytes
- */
- const fdAT = new Uint8Array(12 + 4 + length);
- writeUInt32(fdAT, 4 + length, 0);
- writeFourCC(fdAT, 'fdAT', 4);
- writeUInt32(fdAT, png.sequences, 8);
- writeBytes(fdAT, chunk, 12);
- writeUInt32(fdAT, getCRC(fdAT, 4, 12 + length), 12 + length);
- png.sequences += 1;
- png.chunks.push(fdAT);
- }
- break;
- case 'PLTE':
- /**
- * https://www.w3.org/TR/2003/REC-PNG-20031110/#11PLTE
- *
- * Palette data X bytes
- */
- const PLTE = new Uint8Array(12 + length);
- writeUInt32(PLTE, length, 0);
- writeFourCC(PLTE, 'PLTE', 4);
- writeBytes(PLTE, chunk, 8);
- writeUInt32(PLTE, getCRC(PLTE, 4, 8 + length), 8 + length);
- png.chunks.push(PLTE);
- break;
- case 'IEND':
- /** Update fcTL now that size is known. */
- writeUInt32(fcTL, png.width, 12);
- writeUInt32(fcTL, png.height, 16);
- writeUInt32(fcTL, getCRC(fcTL, 4, 34), 34);
- png.frames += 1;
- return;
- }
-
- /** Advance to next chunk. */
- i += 12 + length;
- }
- console.error('Unexpectedly reached end of file');
- }
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/webcam_utils.js b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/webcam_utils.js
deleted file mode 100644
index 42bbda9eff4..00000000000
--- a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/webcam_utils.js
+++ /dev/null
@@ -1,181 +0,0 @@
-// 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 {convertImageSequenceToPng, convertImageSequenceToPngBinary} from './png.js';
-
-/**
- * Dimensions for camera capture.
- */
-export const CAPTURE_SIZE = {
- height: 576,
- width: 576,
-};
-
-/**
- * Interval between frames for camera capture (milliseconds).
- * @const
- */
-export const CAPTURE_INTERVAL_MS = 1000 / 10;
-
-/**
- * Duration of camera capture (milliseconds).
- * @type {number}
- */
-export const CAPTURE_DURATION_MS = 1000;
-
-/**
- * Default media constraints to request the front facing webcam.
- */
-export const kDefaultVideoConstraints = {
- facingMode: 'user',
- height: {ideal: CAPTURE_SIZE.height},
- width: {ideal: CAPTURE_SIZE.width},
-};
-
-/**
- * Stops all video tracks associated with a MediaStream object.
- * @param {?MediaStream} stream
- */
-export function stopMediaTracks(stream) {
- if (stream) {
- stream.getVideoTracks().forEach(track => track.stop());
- }
-}
-
-
-/**
- * Allocates a canvas for capturing a single still frame at a specific size.
- * @param {{width: number, height: number}} size Frame size.
- * @return {!HTMLCanvasElement} The allocated canvas.
- */
-function allocateFrame(size) {
- const canvas =
- /** @type {!HTMLCanvasElement} */ (document.createElement('canvas'));
- canvas.width = size.width;
- canvas.height = size.height;
- const ctx = /** @type {!CanvasRenderingContext2D} */ (
- canvas.getContext('2d', {alpha: false}));
- // Flip frame horizontally.
- ctx.translate(size.width, 0);
- ctx.scale(-1.0, 1.0);
- return canvas;
-}
-
-/**
- * Captures a single still frame from a <video> element, placing it at the
- * current drawing origin of a canvas context.
- * @param {!HTMLVideoElement} video Video element to capture from.
- * @param {!HTMLCanvasElement} canvas Canvas to save frame in.
- * @return {!HTMLCanvasElement} The canvas frame was saved in.
- */
-function writeVideoFrameToCanvas(video, canvas) {
- const ctx =
- /** @type {!CanvasRenderingContext2D} */ (
- canvas.getContext('2d', {alpha: false}));
- const width = video.videoWidth;
- const height = video.videoHeight;
- if (width < canvas.width || height < canvas.height) {
- console.error(
- 'Video capture size too small: ' + width + 'x' + height + '!');
- }
- const src = {};
- if (width / canvas.width > height / canvas.height) {
- // Full height, crop left/right.
- src.height = height;
- src.width = height * canvas.width / canvas.height;
- } else {
- // Full width, crop top/bottom.
- src.width = width;
- src.height = width * canvas.height / canvas.width;
- }
- src.x = (width - src.width) / 2;
- src.y = (height - src.height) / 2;
- ctx.drawImage(
- video, src.x, src.y, src.width, src.height, 0, 0, canvas.width,
- canvas.height);
- return canvas;
-}
-
-/**
- * Captures one frame from |video| every |intervalMs|, [numFrames] times.
- * @param {!HTMLVideoElement} video
- * @param {{height: number, width: number}} captureSize
- * @param {number} intervalMs
- * @param {number} numFrames
- * @return {!Promise<!Array<!HTMLCanvasElement>>} an array of canvas elements of
- * the captured frames
- */
-export async function captureFrames(video, captureSize, intervalMs, numFrames) {
- return new Promise((resolve) => {
- if (numFrames <= 0) {
- throw new Error('numFrames must be greater than 0');
- }
- if (intervalMs <= 0) {
- throw new Error('intervalMs must be greater than 0');
- }
- /** Pre-allocate all frames needed for capture. */
- const frames = [];
- while (frames.length < numFrames) {
- frames.push(allocateFrame(captureSize));
- }
-
- const capturedFrames = [];
-
- const interval = window.setInterval(() => {
- /** Stop capturing frames when all allocated frames have been consumed. */
- if (frames.length) {
- capturedFrames.push(writeVideoFrameToCanvas(video, frames.pop()));
- } else {
- window.clearInterval(interval);
- resolve(capturedFrames);
- }
- }, intervalMs);
- });
-}
-
-/**
- * Mirrors the array around the last element by appending a reversed copy of
- * itself (minus the first and last element). This makes playback appear
- * continuous when played in a loop.
- * @example ['a', 'b', 'c'] => ['a', 'b', 'c', 'b']
- * @param {!Array<T>} arr
- * @return {!Array<T>}
- * @template T
- */
-function mirror(arr) {
- return arr.concat(arr.slice(1, -1).reverse());
-}
-
-/**
- * Encode frames and convert to animated PNG image as a data URL.
- * @param {!Array<!HTMLCanvasElement>} frames The frames to convert to image.
- * @return {!string} The data URL for image.
- */
-export function convertFramesToPng(frames) {
- /** Encode captured frames. */
- const encodedImages = frames.map(function(frame) {
- return frame.toDataURL('image/png');
- });
-
- /** No need for further processing if single frame. */
- if (encodedImages.length === 1) {
- return encodedImages[0];
- }
-
- /** Create forward/backward image sequence. */
- const forwardBackwardImageSequence = mirror(encodedImages);
-
- /** Convert image sequence to animated PNG. */
- return convertImageSequenceToPng(forwardBackwardImageSequence);
-}
-
-/**
- * Encode frames and convert to animated PNG image as a Uint8Array.
- * @param {!Array<!HTMLCanvasElement>} frames
- * @return {Uint8Array}
- */
-export function convertFramesToPngBinary(frames) {
- const encodedImages = frames.map(frame => frame.toDataURL('image/png'));
- return convertImageSequenceToPngBinary(mirror(encodedImages));
-}
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/os_cr_elements.gni b/chromium/ui/webui/resources/cr_elements/chromeos/os_cr_elements.gni
deleted file mode 100644
index 65aefff764d..00000000000
--- a/chromium/ui/webui/resources/cr_elements/chromeos/os_cr_elements.gni
+++ /dev/null
@@ -1,11 +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.
-
-import("//third_party/closure_compiler/compile_js.gni")
-
-cr_elements_chromeos_namespace_rewrites = [
- "cr.png.convertImageSequenceToPng|convertImageSequenceToPng",
- "cr.png.isEncodedPngDataUrlAnimated|isEncodedPngDataUrlAnimated",
- "cr.ui.Action|Action",
-]
diff --git a/chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html b/chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html
index 34ccdcc3318..85d1164ed0c 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html
@@ -11,6 +11,14 @@
position: absolute;
}
+ @media (forced-colors: active) {
+ :host dialog {
+ /* Use border instead of box-shadow (which does not work) in Windows
+ HCM. */
+ border: var(--cr-border-hcm);
+ }
+ }
+
:host dialog::backdrop {
background-color: transparent;
}
@@ -48,6 +56,14 @@
outline: none;
}
+ @media (forced-colors: active) {
+ :host ::slotted(.dropdown-item:focus) {
+ /* Use outline instead of background-color (which does not work) in
+ Windows HCM. */
+ outline: var(--cr-focus-outline-hcm);
+ }
+ }
+
.item-wrapper {
background: var(--cr-menu-background-sheen);
outline: none;
diff --git a/chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.ts b/chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.ts
index 3607b2cd2d0..e9f8113f640 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.ts
@@ -15,32 +15,32 @@ import {getDeepActiveElement} from '../../js/util.m.js';
import {getTemplate} from './cr_action_menu.html.js';
-type ShowAtConfig = {
- top?: number,
- left?: number,
- width?: number,
- height?: number,
- anchorAlignmentX?: number,
- anchorAlignmentY?: number,
- minX?: number,
- minY?: number,
- maxX?: number,
- maxY?: number,
- noOffset?: boolean,
-};
-
-export type ShowAtPositionConfig = {
- top: number,
- left: number,
- width?: number,
- height?: number,
- anchorAlignmentX?: number,
- anchorAlignmentY?: number,
- minX?: number,
- minY?: number,
- maxX?: number,
- maxY?: number,
-};
+interface ShowAtConfig {
+ top?: number;
+ left?: number;
+ width?: number;
+ height?: number;
+ anchorAlignmentX?: number;
+ anchorAlignmentY?: number;
+ minX?: number;
+ minY?: number;
+ maxX?: number;
+ maxY?: number;
+ noOffset?: boolean;
+}
+
+export interface ShowAtPositionConfig {
+ top: number;
+ left: number;
+ width?: number;
+ height?: number;
+ anchorAlignmentX?: number;
+ anchorAlignmentY?: number;
+ minX?: number;
+ minY?: number;
+ maxX?: number;
+ maxY?: number;
+}
export enum AnchorAlignment {
BEFORE_START = -2,
diff --git a/chromium/ui/webui/resources/cr_elements/cr_button/BUILD.gn b/chromium/ui/webui/resources/cr_elements/cr_button/BUILD.gn
index 7f6dae0aec2..c04be21a2af 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_button/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_elements/cr_button/BUILD.gn
@@ -3,39 +3,21 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
-js_type_check("closure_compile") {
- uses_legacy_modules = true
- deps = [ ":cr_button" ]
-}
-
-js_library("cr_button") {
- deps = [
- "//third_party/polymer/v1_0/components-chromium/paper-behaviors:paper-ripple-behavior-extracted",
- "//ui/webui/resources/js/cr/ui:focus_outline_manager",
- ]
-}
-
-polymer_modulizer("cr_button") {
- js_file = "cr_button.js"
- html_file = "cr_button.html"
- html_type = "dom-module"
+html_to_js("web_components") {
+ js_files = [ "cr_button.js" ]
}
js_type_check("closure_compile_module") {
is_polymer3 = true
- deps = [ ":cr_button.m" ]
+ deps = [ ":cr_button" ]
}
-js_library("cr_button.m") {
- sources = [
- "$root_gen_dir/ui/webui/resources/cr_elements/cr_button/cr_button.m.js",
- ]
+js_library("cr_button") {
deps = [
"//third_party/polymer/v3_0/components-chromium/paper-behaviors:paper-ripple-behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js/cr/ui:focus_outline_manager.m",
]
- extra_deps = [ ":cr_button_module" ]
}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_button/cr_button.m.d.ts b/chromium/ui/webui/resources/cr_elements/cr_button/cr_button.d.ts
index 951f8b4a6be..951f8b4a6be 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_button/cr_button.m.d.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_button/cr_button.d.ts
diff --git a/chromium/ui/webui/resources/cr_elements/cr_button/cr_button.html b/chromium/ui/webui/resources/cr_elements/cr_button/cr_button.html
index 214f571e5da..0549e6595a3 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_button/cr_button.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_button/cr_button.html
@@ -1,13 +1,3 @@
-<link rel="import" href="../../html/polymer.html">
-
-<link rel="import" href="../../html/cr/ui/focus_outline_manager.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-behaviors/paper-ripple-behavior.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html">
-<link rel="import" href="../hidden_style_css.html">
-<link rel="import" href="../shared_vars_css.html">
-
-<dom-module id="cr-button">
- <template>
<style include="cr-hidden-style">
:host {
--active-shadow-rgb: var(--google-grey-800-rgb);
@@ -86,6 +76,14 @@
box-shadow: 0 0 0 2px var(--focus-shadow-color);
}
+ @media (forced-colors: active) {
+ :host-context(.focus-outline-visible):host(:focus) {
+ /* Use outline instead of box-shadow (which does not work) in Windows
+ HCM. */
+ outline: var(--cr-focus-outline-hcm);
+ }
+ }
+
:host(:active) {
background: var(--active-bg);
box-shadow: var(--active-shadow,
@@ -163,6 +161,3 @@
}
</style>
<slot></slot>
- </template>
- <script src="cr_button.js"></script>
-</dom-module>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_button/cr_button.js b/chromium/ui/webui/resources/cr_elements/cr_button/cr_button.js
index c82e93d0994..efa6f6b9ded 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_button/cr_button.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_button/cr_button.js
@@ -7,11 +7,22 @@
* be interacted with like a normal button using click as well as space and
* enter to effectively click the button and fire a 'click' event.
*/
+import '//resources/polymer/v3_0/paper-styles/color.js';
+import '../hidden_style_css.m.js';
+import '../shared_vars_css.m.js';
+
+import {PaperRippleBehavior} from '//resources/polymer/v3_0/paper-behaviors/paper-ripple-behavior.js';
+import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {FocusOutlineManager} from '../../js/cr/ui/focus_outline_manager.m.js';
+
Polymer({
is: 'cr-button',
+ _template: html`{__html_template__}`,
+
behaviors: [
- Polymer.PaperRippleBehavior,
+ PaperRippleBehavior,
],
properties: {
@@ -70,7 +81,7 @@ Polymer({
/** @override */
ready() {
- cr.ui.FocusOutlineManager.forDocument(document);
+ FocusOutlineManager.forDocument(document);
this.timeoutIds_ = new Set();
},
@@ -197,7 +208,7 @@ Polymer({
* @return {PaperRippleElement}
*/
_createRipple() {
- const ripple = Polymer.PaperRippleBehavior._createRipple();
+ const ripple = PaperRippleBehavior._createRipple();
if (this.circleRipple) {
ripple.setAttribute('center', '');
@@ -207,4 +218,3 @@ Polymer({
return ripple;
},
});
-/* #ignore */ console.warn('crbug/1173575, non-JS module files deprecated.');
diff --git a/chromium/ui/webui/resources/cr_elements/cr_checkbox/BUILD.gn b/chromium/ui/webui/resources/cr_elements/cr_checkbox/BUILD.gn
deleted file mode 100644
index f7f9dee0ef1..00000000000
--- a/chromium/ui/webui/resources/cr_elements/cr_checkbox/BUILD.gn
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-
-js_type_check("closure_compile") {
- uses_legacy_modules = true
- deps = [ ":cr_checkbox" ]
-}
-
-js_library("cr_checkbox") {
- deps = [ "//third_party/polymer/v1_0/components-chromium/paper-behaviors:paper-ripple-behavior-extracted" ]
-}
-
-polymer_modulizer("cr_checkbox") {
- js_file = "cr_checkbox.js"
- html_file = "cr_checkbox.html"
- html_type = "dom-module"
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [ ":cr_checkbox.m" ]
-}
-
-js_library("cr_checkbox.m") {
- sources = [
- "$root_gen_dir/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.m.js",
- ]
- deps = [
- "//third_party/polymer/v3_0/components-chromium/paper-behaviors:paper-ripple-behavior",
- "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- ]
- extra_deps = [ ":cr_checkbox_module" ]
-}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html b/chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html
index f9af4d510ca..66cbbbbef78 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html
@@ -1,26 +1,3 @@
-<link rel="import" href="../../html/polymer.html">
-
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-behaviors/paper-ripple-behavior.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html">
-<link rel="import" href="../shared_vars_css.html">
-
-<!--
-List of customizable styles:
-
- --cr-checkbox-border-size
- --cr-checkbox-checked-box-background-color
- --cr-checkbox-checked-box-color
- --cr-checkbox-label-color
- --cr-checkbox-label-padding-start
- --cr-checkbox-mark-color
- --cr-checkbox-ripple-checked-color
- --cr-checkbox-ripple-size
- --cr-checkbox-ripple-unchecked-color
- --cr-checkbox-size
- --cr-checkbox-unchecked-box-color
--->
-<dom-module id="cr-checkbox">
- <template>
<style>
:host {
-webkit-tap-highlight-color: transparent;
@@ -86,6 +63,13 @@ List of customizable styles:
width: var(--cr-checkbox-size);
}
+ @media (forced-colors: active) {
+ /* paper-ripple is not showing in Windows HCM. Use outline instead. */
+ :host(:focus) #checkbox {
+ outline: var(--cr-focus-outline-hcm);
+ }
+ }
+
#checkmark {
border-color: var(--cr-checkbox-mark-color);
border-style: solid;
@@ -165,6 +149,3 @@ List of customizable styles:
<slot></slot>
</div>
<div id="ariaDescription" aria-hidden="true">[[ariaDescription]]</div>
- </template>
- <script src="cr_checkbox.js"></script>
-</dom-module>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.js b/chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.js
deleted file mode 100644
index 04709bcfb32..00000000000
--- a/chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.js
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview 'cr-checkbox' is a component similar to native checkbox. It
- * fires a 'change' event *only* when its state changes as a result of a user
- * interaction. By default it assumes there will be child(ren) passed in to be
- * used as labels. If no label will be provided, a .no-label class should be
- * added to hide the spacing between the checkbox and the label container.
- */
-Polymer({
- is: 'cr-checkbox',
-
- behaviors: [
- Polymer.PaperRippleBehavior,
- ],
-
- properties: {
- checked: {
- type: Boolean,
- value: false,
- reflectToAttribute: true,
- observer: 'checkedChanged_',
- notify: true,
- },
-
- disabled: {
- type: Boolean,
- value: false,
- reflectToAttribute: true,
- observer: 'disabledChanged_',
- },
-
- ariaDescription: String,
-
- tabIndex: {
- type: Number,
- value: 0,
- observer: 'onTabIndexChanged_',
- },
- },
-
- listeners: {
- blur: 'hideRipple_',
- click: 'onClick_',
- focus: 'showRipple_',
- up: 'hideRipple_',
- },
-
- /** @override */
- ready() {
- this.removeAttribute('unresolved');
- },
-
- focus() {
- this.$.checkbox.focus();
- },
-
- /** @return {!Element} */
- getFocusableElement() {
- return this.$.checkbox;
- },
-
- /** @private */
- checkedChanged_() {
- this.$.checkbox.setAttribute(
- 'aria-checked', this.checked ? 'true' : 'false');
- },
-
- /**
- * @param {boolean} current
- * @param {boolean} previous
- * @private
- */
- disabledChanged_(current, previous) {
- if (previous === undefined && !this.disabled) {
- return;
- }
-
- this.tabIndex = this.disabled ? -1 : 0;
- this.$.checkbox.setAttribute(
- 'aria-disabled', this.disabled ? 'true' : 'false');
- },
-
- /** @private */
- showRipple_() {
- this.getRipple().showAndHoldDown();
- },
-
- /** @private */
- hideRipple_() {
- this.getRipple().clear();
- },
-
- /**
- * @param {!Event} e
- * @private
- */
- onClick_(e) {
- if (this.disabled || e.target.tagName === 'A') {
- return;
- }
-
- // Prevent |click| event from bubbling. It can cause parents of this
- // elements to erroneously re-toggle this control.
- e.stopPropagation();
- e.preventDefault();
-
- this.checked = !this.checked;
- this.fire('change', this.checked);
- },
-
- /**
- * @param {!KeyboardEvent} e
- * @private
- */
- onKeyDown_(e) {
- if (e.key !== ' ' && e.key !== 'Enter') {
- return;
- }
-
- e.preventDefault();
- e.stopPropagation();
- if (e.repeat) {
- return;
- }
-
- if (e.key === 'Enter') {
- this.click();
- }
- },
-
- /**
- * @param {!KeyboardEvent} e
- * @private
- */
- onKeyUp_(e) {
- if (e.key === ' ' || e.key === 'Enter') {
- e.preventDefault();
- e.stopPropagation();
- }
-
- if (e.key === ' ') {
- this.click();
- }
- },
-
- /** @private */
- onTabIndexChanged_() {
- // :host shouldn't have a tabindex because it's set on #checkbox.
- this.removeAttribute('tabindex');
- },
-
- // customize the element's ripple
- _createRipple() {
- this._rippleContainer = this.$.checkbox;
- const ripple = Polymer.PaperRippleBehavior._createRipple();
- ripple.id = 'ink';
- ripple.setAttribute('recenters', '');
- ripple.classList.add('circle', 'toggle-ink');
- return ripple;
- },
-});
-/* #ignore */ console.warn('crbug/1173575, non-JS module files deprecated.');
diff --git a/chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.m.d.ts b/chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.m.d.ts
deleted file mode 100644
index a9e15e56fcc..00000000000
--- a/chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.m.d.ts
+++ /dev/null
@@ -1,22 +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 {LegacyElementMixin} from 'chrome://resources/polymer/v3_0/polymer/lib/legacy/legacy-element-mixin.js';
-
-interface CrCheckboxElement extends LegacyElementMixin, HTMLElement {
- checked: boolean;
- disabled: boolean;
- ariaDescription: string|null|undefined;
- tabIndex: number;
- focus(): void;
- getFocusableElement(): Element;
-}
-
-export {CrCheckboxElement};
-
-declare global {
- interface HTMLElementTagNameMap {
- 'cr-checkbox': CrCheckboxElement;
- }
-}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.ts b/chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.ts
new file mode 100644
index 00000000000..343a8ec7a1b
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.ts
@@ -0,0 +1,192 @@
+// 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.
+
+/**
+ * @fileoverview 'cr-checkbox' is a component similar to native checkbox. It
+ * fires a 'change' event *only* when its state changes as a result of a user
+ * interaction. By default it assumes there will be child(ren) passed in to be
+ * used as labels. If no label will be provided, a .no-label class should be
+ * added to hide the spacing between the checkbox and the label container.
+ *
+ * List of customizable styles:
+ * --cr-checkbox-border-size
+ * --cr-checkbox-checked-box-background-color
+ * --cr-checkbox-checked-box-color
+ * --cr-checkbox-label-color
+ * --cr-checkbox-label-padding-start
+ * --cr-checkbox-mark-color
+ * --cr-checkbox-ripple-checked-color
+ * --cr-checkbox-ripple-size
+ * --cr-checkbox-ripple-unchecked-color
+ * --cr-checkbox-size
+ * --cr-checkbox-unchecked-box-color
+ */
+import '//resources/polymer/v3_0/paper-styles/color.js';
+import '../shared_vars_css.m.js';
+
+import {PaperRippleBehavior} from '//resources/polymer/v3_0/paper-behaviors/paper-ripple-behavior.js';
+import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {getTemplate} from './cr_checkbox.html.js';
+
+const CrCheckboxElementBase =
+ mixinBehaviors([PaperRippleBehavior], PolymerElement) as
+ {new (): PolymerElement & PaperRippleBehavior};
+
+export interface CrCheckboxElement {
+ $: {
+ checkbox: HTMLElement,
+ };
+}
+
+export class CrCheckboxElement extends CrCheckboxElementBase {
+ static get is() {
+ return 'cr-checkbox';
+ }
+
+ static get template() {
+ return getTemplate();
+ }
+
+ static get properties() {
+ return {
+ checked: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true,
+ observer: 'checkedChanged_',
+ notify: true,
+ },
+
+ disabled: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true,
+ observer: 'disabledChanged_',
+ },
+
+ ariaDescription: String,
+
+ tabIndex: {
+ type: Number,
+ value: 0,
+ observer: 'onTabIndexChanged_',
+ },
+ };
+ }
+
+ checked: boolean;
+ disabled: boolean;
+ ariaDescription: string;
+ override tabIndex: number;
+
+ /* eslint-disable-next-line @typescript-eslint/naming-convention */
+ override _rippleContainer: Element;
+
+ override ready() {
+ super.ready();
+ this.removeAttribute('unresolved');
+ this.addEventListener('blur', this.hideRipple_.bind(this));
+ this.addEventListener('click', this.onClick_.bind(this));
+ this.addEventListener('focus', this.showRipple_.bind(this));
+ this.addEventListener('up', this.hideRipple_.bind(this));
+ }
+
+ override focus() {
+ this.$.checkbox.focus();
+ }
+
+ getFocusableElement(): HTMLElement {
+ return this.$.checkbox;
+ }
+
+ private checkedChanged_() {
+ this.$.checkbox.setAttribute(
+ 'aria-checked', this.checked ? 'true' : 'false');
+ }
+
+ private disabledChanged_(_current: boolean, previous: boolean) {
+ if (previous === undefined && !this.disabled) {
+ return;
+ }
+
+ this.tabIndex = this.disabled ? -1 : 0;
+ this.$.checkbox.setAttribute(
+ 'aria-disabled', this.disabled ? 'true' : 'false');
+ }
+
+ private showRipple_() {
+ this.getRipple().showAndHoldDown();
+ }
+
+ private hideRipple_() {
+ this.getRipple().clear();
+ }
+
+ private onClick_(e: Event) {
+ if (this.disabled || (e.target as HTMLElement).tagName === 'A') {
+ return;
+ }
+
+ // Prevent |click| event from bubbling. It can cause parents of this
+ // elements to erroneously re-toggle this control.
+ e.stopPropagation();
+ e.preventDefault();
+
+ this.checked = !this.checked;
+ this.dispatchEvent(new CustomEvent(
+ 'change', {bubbles: true, composed: true, detail: this.checked}));
+ }
+
+ private onKeyDown_(e: KeyboardEvent) {
+ if (e.key !== ' ' && e.key !== 'Enter') {
+ return;
+ }
+
+ e.preventDefault();
+ e.stopPropagation();
+ if (e.repeat) {
+ return;
+ }
+
+ if (e.key === 'Enter') {
+ this.click();
+ }
+ }
+
+ private onKeyUp_(e: KeyboardEvent) {
+ if (e.key === ' ' || e.key === 'Enter') {
+ e.preventDefault();
+ e.stopPropagation();
+ }
+
+ if (e.key === ' ') {
+ this.click();
+ }
+ }
+
+ private onTabIndexChanged_() {
+ // :host shouldn't have a tabindex because it's set on #checkbox.
+ this.removeAttribute('tabindex');
+ }
+
+ // Overridden from PaperRippleBehavior
+ /* eslint-disable-next-line @typescript-eslint/naming-convention */
+ override _createRipple() {
+ this._rippleContainer = this.$.checkbox;
+ const ripple = super._createRipple();
+ ripple.id = 'ink';
+ ripple.setAttribute('recenters', '');
+ ripple.classList.add('circle', 'toggle-ink');
+ return ripple;
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ 'cr-checkbox': CrCheckboxElement;
+ }
+}
+
+customElements.define(CrCheckboxElement.is, CrCheckboxElement);
diff --git a/chromium/ui/webui/resources/cr_elements/cr_dialog/BUILD.gn b/chromium/ui/webui/resources/cr_elements/cr_dialog/BUILD.gn
index f80650e6e58..5efc5d3778c 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_dialog/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_elements/cr_dialog/BUILD.gn
@@ -3,43 +3,20 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
-js_type_check("closure_compile") {
- uses_legacy_modules = true
- deps = [ ":cr_dialog" ]
-}
-
-js_library("cr_dialog") {
- deps = [
- "..:cr_container_shadow_behavior",
- "//ui/webui/resources/js:assert",
- ]
-}
-
-polymer_modulizer("cr_dialog") {
- js_file = "cr_dialog.js"
- html_file = "cr_dialog.html"
- html_type = "dom-module"
- auto_imports = [
- "ui/webui/resources/cr_elements/cr_container_shadow_behavior.html|CrContainerShadowBehavior",
- "ui/webui/resources/html/assert.html|assert",
- ]
+html_to_js("web_components") {
+ js_files = [ "cr_dialog.js" ]
}
js_type_check("closure_compile_module") {
is_polymer3 = true
- deps = [ ":cr_dialog.m" ]
+ deps = [ ":cr_dialog" ]
}
-js_library("cr_dialog.m") {
- sources = [
- "$root_gen_dir/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.m.js",
- ]
+js_library("cr_dialog") {
deps = [
- "..:cr_container_shadow_behavior.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
]
- extra_deps = [ ":cr_dialog_module" ]
}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.m.d.ts b/chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.d.ts
index 9c92c692ccb..6f4938c3cd2 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.m.d.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.d.ts
@@ -2,11 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import {LegacyElementMixin} from 'chrome://resources/polymer/v3_0/polymer/lib/legacy/legacy-element-mixin.js';
-import {CrContainerShadowBehavior} from '../cr_container_shadow_behavior.m.js';
-
-interface CrDialogElement extends CrContainerShadowBehavior, LegacyElementMixin,
- HTMLElement {
+interface CrDialogElement extends HTMLElement {
open: boolean;
closeText: string|null|undefined;
ignorePopstate: boolean;
diff --git a/chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html b/chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html
index 7d3109accac..773bf67389e 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html
@@ -1,14 +1,3 @@
-<link rel="import" href="../../html/polymer.html">
-
-<link rel="import" href="../../html/assert.html">
-<link rel="import" href="../cr_container_shadow_behavior.html">
-<link rel="import" href="../cr_icon_button/cr_icon_button.html">
-<link rel="import" href="../cr_icons_css.html">
-<link rel="import" href="../hidden_style_css.html">
-<link rel="import" href="../shared_vars_css.html">
-
-<dom-module id="cr-dialog">
- <template>
<style include="cr-hidden-style cr-icons">
dialog {
--scroll-border-color: var(--paper-grey-300);
@@ -39,6 +28,14 @@
}
}
+ @media (forced-colors: active) {
+ dialog {
+ /* Use border instead of box-shadow (which does not work) in Windows
+ HCM. */
+ border: var(--cr-border-hcm);
+ }
+ }
+
dialog[open] #content-wrapper {
/* Keep max-height within viewport, and flex content accordingly. */
display: flex;
@@ -202,6 +199,3 @@
</div>
</dialog>
</if>
- </template>
- <script src="cr_dialog.js"></script>
-</dom-module>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.js b/chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.js
index dd0316c14af..19c90975352 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.js
@@ -19,85 +19,119 @@
* width/height (as well as other available mixins to style other parts of the
* dialog contents).
*/
-Polymer({
- is: 'cr-dialog',
-
- behaviors: [CrContainerShadowBehavior],
-
- properties: {
- open: {
- type: Boolean,
- value: false,
- reflectToAttribute: true,
- },
-
- /**
- * Alt-text for the dialog close button.
- */
- closeText: String,
-
- /**
- * True if the dialog should remain open on 'popstate' events. This is used
- * for navigable dialogs that have their separate navigation handling code.
- */
- ignorePopstate: {
- type: Boolean,
- value: false,
- },
-
- /**
- * True if the dialog should ignore 'Enter' keypresses.
- */
- ignoreEnterKey: {
- type: Boolean,
- value: false,
- },
-
- /**
- * True if the dialog should consume 'keydown' events. If ignoreEnterKey
- * is true, 'Enter' key won't be consumed.
- */
- consumeKeydownEvent: {
- type: Boolean,
- value: false,
- },
-
- /**
- * True if the dialog should not be able to be cancelled, which will prevent
- * 'Escape' key presses from closing the dialog.
- */
- noCancel: {
- type: Boolean,
- value: false,
- },
-
- // True if dialog should show the 'X' close button.
- showCloseButton: {
- type: Boolean,
- value: false,
- },
-
- showOnAttach: {
- type: Boolean,
- value: false,
- },
- },
-
- listeners: {
- 'pointerdown': 'onPointerdown_',
- },
-
- /** @private {?IntersectionObserver} */
- intersectionObserver_: null,
-
- /** @private {?MutationObserver} */
- mutationObserver_: null,
-
- /** @private {?Function} */
- boundKeydown_: null,
+import '../cr_icon_button/cr_icon_button.js';
+import '../cr_icons_css.m.js';
+import '../hidden_style_css.m.js';
+import '../shared_vars_css.m.js';
+
+import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {assert} from '../../js/assert.m.js';
+import {CrContainerShadowMixin} from '../cr_container_shadow_mixin.js';
+
+class CrContainerShadowMixinInterface {
+ /** @param {boolean} enable */
+ enableShadowBehavior(enable) {}
+
+ showDropShadows() {}
+}
+
+/**
+ * @constructor
+ * @extends {PolymerElement}
+ * @implements {CrContainerShadowMixinInterface}
+ */
+const CrDialogElementBase = CrContainerShadowMixin(PolymerElement);
+
+/** @polymer */
+export class CrDialogElement extends CrDialogElementBase {
+ static get is() {
+ return 'cr-dialog';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ static get properties() {
+ return {
+ open: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true,
+ },
+
+ /**
+ * Alt-text for the dialog close button.
+ */
+ closeText: String,
+
+ /**
+ * True if the dialog should remain open on 'popstate' events. This is
+ * used for navigable dialogs that have their separate navigation handling
+ * code.
+ */
+ ignorePopstate: {
+ type: Boolean,
+ value: false,
+ },
+
+ /**
+ * True if the dialog should ignore 'Enter' keypresses.
+ */
+ ignoreEnterKey: {
+ type: Boolean,
+ value: false,
+ },
+
+ /**
+ * True if the dialog should consume 'keydown' events. If ignoreEnterKey
+ * is true, 'Enter' key won't be consumed.
+ */
+ consumeKeydownEvent: {
+ type: Boolean,
+ value: false,
+ },
+
+ /**
+ * True if the dialog should not be able to be cancelled, which will
+ * prevent 'Escape' key presses from closing the dialog.
+ */
+ noCancel: {
+ type: Boolean,
+ value: false,
+ },
+
+ // True if dialog should show the 'X' close button.
+ showCloseButton: {
+ type: Boolean,
+ value: false,
+ },
+
+ showOnAttach: {
+ type: Boolean,
+ value: false,
+ },
+ };
+ }
+
+ constructor() {
+ super();
+
+ /** @private {?IntersectionObserver} */
+ this.intersectionObserver_ = null;
+
+ /** @private {?MutationObserver} */
+ this.mutationObserver_ = null;
+
+ /** @private {?Function} */
+ this.boundKeydown_ = null;
+ }
/** @override */
ready() {
+ super.ready();
+
// If the active history entry changes (i.e. user clicks back button),
// all open dialogs should be cancelled.
window.addEventListener('popstate', function() {
@@ -109,10 +143,14 @@ Polymer({
if (!this.ignoreEnterKey) {
this.addEventListener('keypress', this.onKeypress_.bind(this));
}
- },
+ this.addEventListener(
+ 'pointerdown',
+ e => this.onPointerdown_(/** @type {!PointerEvent} */ (e)));
+ }
/** @override */
- attached() {
+ connectedCallback() {
+ super.connectedCallback();
const mutationObserverCallback = function() {
if (this.$.dialog.open) {
this.enableShadowBehavior(true);
@@ -135,16 +173,17 @@ Polymer({
if (this.showOnAttach) {
this.showModal();
}
- },
+ }
/** @override */
- detached() {
+ disconnectedCallback() {
+ super.disconnectedCallback();
this.removeKeydownListener_();
if (this.mutationObserver_) {
this.mutationObserver_.disconnect();
this.mutationObserver_ = null;
}
- },
+ }
/** @private */
addKeydownListener_() {
@@ -160,7 +199,7 @@ Polymer({
// will bypass cr-dialog. We should consume those events too in order to
// behave modally. This prevents accidentally triggering keyboard commands.
document.body.addEventListener('keydown', this.boundKeydown_);
- },
+ }
/** @private */
removeKeydownListener_() {
@@ -171,27 +210,29 @@ Polymer({
this.removeEventListener('keydown', this.boundKeydown_);
document.body.removeEventListener('keydown', this.boundKeydown_);
this.boundKeydown_ = null;
- },
+ }
showModal() {
this.$.dialog.showModal();
assert(this.$.dialog.open);
this.open = true;
- this.fire('cr-dialog-open');
- },
+ this.dispatchEvent(
+ new CustomEvent('cr-dialog-open', {bubbles: true, composed: true}));
+ }
cancel() {
- this.fire('cancel');
+ this.dispatchEvent(
+ new CustomEvent('cancel', {bubbles: true, composed: true}));
this.$.dialog.close();
assert(!this.$.dialog.open);
this.open = false;
- },
+ }
close() {
this.$.dialog.close('success');
assert(!this.$.dialog.open);
this.open = false;
- },
+ }
/**
* Set the title of the dialog for a11y reader.
@@ -200,7 +241,7 @@ Polymer({
setTitleAriaLabel(title) {
this.$.dialog.removeAttribute('aria-labelledby');
this.$.dialog.setAttribute('aria-label', title);
- },
+ }
/**
* @private
@@ -210,7 +251,7 @@ Polymer({
// Because the dialog may have a default Enter key handler, prevent
// keypress events from bubbling up from this element.
e.stopPropagation();
- },
+ }
/**
* @param {!Event} e
@@ -224,8 +265,9 @@ Polymer({
// Catch and re-fire the 'close' event such that it bubbles across Shadow
// DOM v1.
- this.fire('close');
- },
+ this.dispatchEvent(
+ new CustomEvent('close', {bubbles: true, composed: true}));
+ }
/**
* @param {!Event} e
@@ -248,8 +290,9 @@ Polymer({
// Catch and re-fire the native 'cancel' event such that it bubbles across
// Shadow DOM v1.
- this.fire('cancel');
- },
+ this.dispatchEvent(
+ new CustomEvent('cancel', {bubbles: true, composed: true}));
+ }
/**
* Expose the inner native <dialog> for some rare cases where it needs to be
@@ -259,7 +302,7 @@ Polymer({
*/
getNative() {
return /** @type {!HTMLDialogElement} */ (this.$.dialog);
- },
+ }
/**
* @param {!Event} e
@@ -287,7 +330,7 @@ Polymer({
actionButton.click();
e.preventDefault();
}
- },
+ }
/**
* @param {!Event} e
@@ -306,7 +349,7 @@ Polymer({
// Stop propagation to behave modally.
e.stopPropagation();
- },
+ }
/** @param {!PointerEvent} e */
onPointerdown_(e) {
@@ -332,10 +375,11 @@ Polymer({
// Prevent any text from being selected within the dialog when clicking in
// the backdrop area.
e.preventDefault();
- },
+ }
focus() {
- this.$$('.title-container').focus();
- },
-});
-/* #ignore */ console.warn('crbug/1173575, non-JS module files deprecated.');
+ this.shadowRoot.querySelector('.title-container').focus();
+ }
+}
+
+customElements.define(CrDialogElement.is, CrDialogElement);
diff --git a/chromium/ui/webui/resources/cr_elements/cr_elements.gni b/chromium/ui/webui/resources/cr_elements/cr_elements.gni
new file mode 100644
index 00000000000..263e74b8727
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_elements/cr_elements.gni
@@ -0,0 +1,128 @@
+# 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("//ui/webui/resources/include_polymer.gni")
+
+# TS files holding a non-Polymer element definition and have an equivalent .html
+# file.
+web_component_files_native_ts = [
+ "cr_tab_box/cr_tab_box.ts",
+ "cr_tree/cr_tree.ts",
+ "cr_tree/cr_tree_item.ts",
+]
+
+# Files that are passed as input to html_to_wrapper().
+native_html_files = []
+foreach(f, web_component_files_native_ts) {
+ native_html_files += [ string_replace(f, ".ts", ".html") ]
+}
+
+# Files that are generated by html_to_wrapper().
+native_html_wrapper_files = []
+foreach(f, native_html_files) {
+ native_html_wrapper_files += [ f + ".ts" ]
+}
+
+if (include_polymer) {
+ # TS files holding a Polymer element definition and have an equivalent .html
+ # file.
+ web_component_files_polymer_ts = [
+ "cr_a11y_announcer/cr_a11y_announcer.ts",
+ "cr_action_menu/cr_action_menu.ts",
+ "cr_checkbox/cr_checkbox.ts",
+ "cr_drawer/cr_drawer.ts",
+ "cr_expand_button/cr_expand_button.ts",
+ "cr_fingerprint/cr_fingerprint_progress_arc.ts",
+ "cr_grid/cr_grid.ts",
+ "cr_link_row/cr_link_row.ts",
+ "cr_profile_avatar_selector/cr_profile_avatar_selector_grid.ts",
+ "cr_profile_avatar_selector/cr_profile_avatar_selector.ts",
+ "cr_radio_group/cr_radio_group.ts",
+ "cr_search_field/cr_search_field.ts",
+ "cr_slider/cr_slider.ts",
+ "cr_tabs/cr_tabs.ts",
+ "cr_toast/cr_toast_manager.ts",
+ "cr_toast/cr_toast.ts",
+ "cr_toolbar/cr_toolbar.ts",
+ "cr_toolbar/cr_toolbar_search_field.ts",
+ "cr_toolbar/cr_toolbar_selection_overlay.ts",
+ "cr_view_manager/cr_view_manager.ts",
+ ]
+
+ if (is_chromeos) {
+ web_component_files_polymer_ts +=
+ [ "cr_searchable_drop_down/cr_searchable_drop_down.ts" ]
+ }
+
+ icons_html_files = [
+ "mwb_shared_icons.html",
+ "cr_fingerprint/cr_fingerprint_icon.html",
+ ]
+
+ # Polymer HTML files that are passed as input to html_to_wrapper().
+ polymer_html_files = []
+ foreach(f, web_component_files_polymer_ts) {
+ polymer_html_files += [ string_replace(f, ".ts", ".html") ]
+ }
+
+ # Files that are generated by html_to_wrapper().
+ polymer_html_wrapper_files = []
+ foreach(f, polymer_html_files + icons_html_files) {
+ polymer_html_wrapper_files += [ f + ".ts" ]
+ }
+}
+
+# Files that either dont hold a custom element definition or the custom element
+# does not have an equivalent .html file.
+non_web_component_files_ts = [
+ "cr_lazy_render/cr_lazy_render.ts",
+ "cr_splitter/cr_splitter.ts",
+ "cr_tree/cr_tree_base.ts",
+]
+
+if (include_polymer) {
+ non_web_component_files_ts += [
+ "cr_auto_img/cr_auto_img.ts",
+ "cr_container_shadow_mixin.ts",
+ "cr_menu_selector/cr_menu_selector.ts",
+ "cr_search_field/cr_search_field_mixin.ts",
+ "find_shortcut_mixin.ts",
+ "mouse_hoverable_mixin.ts",
+ ]
+
+ # Files that are passed as input to css_to_wrapper().
+ css_files = [
+ "cr_nav_menu_item_style.css",
+ "cr_page_host_style.css",
+ "cr_radio_button/cr_radio_button_style.css",
+ "mwb_element_shared_style.css",
+ "mwb_shared_style.css",
+ "mwb_shared_vars.css",
+ "search_highlight_style.css",
+ "cr_input/cr_input_style.css",
+ ]
+
+ # Files that are generated by css_to_wrapper().
+ css_wrapper_files = []
+ foreach(f, css_files) {
+ css_wrapper_files += [ f + ".ts" ]
+ }
+}
+
+# List of all files above with the "cr_elements/" prefix to be used in a parent
+# BUILD.gn file.
+cr_elements_files = []
+foreach(f,
+ web_component_files_native_ts + native_html_wrapper_files +
+ non_web_component_files_ts) {
+ cr_elements_files += [ "cr_elements/" + f ]
+}
+
+if (include_polymer) {
+ foreach(f,
+ web_component_files_polymer_ts + polymer_html_wrapper_files +
+ css_wrapper_files) {
+ cr_elements_files += [ "cr_elements/" + f ]
+ }
+}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_expand_button/BUILD.gn b/chromium/ui/webui/resources/cr_elements/cr_expand_button/BUILD.gn
deleted file mode 100644
index c0bc8f39ba2..00000000000
--- a/chromium/ui/webui/resources/cr_elements/cr_expand_button/BUILD.gn
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-
-js_type_check("closure_compile") {
- uses_legacy_modules = true
- deps = [ ":cr_expand_button" ]
-}
-
-js_library("cr_expand_button") {
- deps = [ "//ui/webui/resources/js/cr/ui:focus_without_ink" ]
-}
-
-polymer_modulizer("cr_expand_button") {
- js_file = "cr_expand_button.js"
- html_file = "cr_expand_button.html"
- html_type = "dom-module"
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [ ":cr_expand_button.m" ]
-}
-
-js_library("cr_expand_button.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.m.js" ]
- deps = [
- "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/js/cr/ui:focus_without_ink.m",
- ]
- extra_deps = [ ":cr_expand_button_module" ]
-}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.html b/chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.html
index f39416f2107..92ec64acb94 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.html
@@ -1,13 +1,3 @@
-<link rel="import" href="../../html/polymer.html">
-
-<link rel="import" href="../../html/cr/ui/focus_without_ink.html">
-<link rel="import" href="../cr_actionable_row_style.html">
-<link rel="import" href="../cr_icon_button/cr_icon_button.html">
-<link rel="import" href="../icons.html">
-<link rel="import" href="../shared_vars_css.html">
-
-<dom-module id="cr-expand-button">
- <template>
<style include="cr-actionable-row-style">
:host([disabled]) {
opacity: 0.65;
@@ -32,6 +22,3 @@
<div id="label" aria-hidden="true"><slot></slot></div>
<cr-icon-button id="icon" aria-labelledby="label" disabled="[[disabled]]"
tabindex="[[tabIndex]]"></cr-icon-button>
- </template>
- <script src="cr_expand_button.js"></script>
-</dom-module>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.js b/chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.js
deleted file mode 100644
index d7d56bdd3c9..00000000000
--- a/chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.js
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview
- * 'cr-expand-button' is a chrome-specific wrapper around a button that toggles
- * between an opened (expanded) and closed state.
- */
-Polymer({
- is: 'cr-expand-button',
-
- properties: {
- /**
- * If true, the button is in the expanded state and will show the icon
- * specified in the `collapseIcon` property. If false, the button shows the
- * icon specified in the `expandIcon` property.
- */
- expanded: {
- type: Boolean,
- value: false,
- notify: true,
- observer: 'onExpandedChange_',
- },
-
- /**
- * If true, the button will be disabled and grayed out.
- */
- disabled: {
- type: Boolean,
- value: false,
- reflectToAttribute: true,
- },
-
- /** A11y text descriptor for this control. */
- ariaLabel: {
- type: String,
- observer: 'onAriaLabelChange_',
- },
-
- tabIndex: {
- type: Number,
- value: 0,
- },
-
- expandIcon: {
- type: String,
- value: 'cr:expand-more',
- observer: 'onIconChange_',
- },
-
- collapseIcon: {
- type: String,
- value: 'cr:expand-less',
- observer: 'onIconChange_',
- },
- },
-
- observers: [
- 'updateAriaExpanded_(disabled, expanded)',
- ],
-
- listeners: {
- click: 'toggleExpand_',
- },
-
- /** @type {boolean} */
- get noink() {
- return this.$.icon.noink;
- },
-
- /** @type {boolean} */
- set noink(value) {
- this.$.icon.noink = value;
- },
-
- focus() {
- this.$.icon.focus();
- },
-
- /** @private */
- onAriaLabelChange_() {
- if (this.ariaLabel) {
- this.$.icon.removeAttribute('aria-labelledby');
- this.$.icon.setAttribute('aria-label', this.ariaLabel);
- } else {
- this.$.icon.removeAttribute('aria-label');
- this.$.icon.setAttribute('aria-labelledby', 'label');
- }
- },
-
- /** @private */
- onExpandedChange_() {
- this.updateIcon_();
- },
-
- /** @private */
- onIconChange_() {
- this.updateIcon_();
- },
-
- /** @private */
- updateIcon_() {
- this.$.icon.ironIcon = this.expanded ? this.collapseIcon : this.expandIcon;
- },
-
- /**
- * @param {!Event} event
- * @private
- */
- toggleExpand_(event) {
- // Prevent |click| event from bubbling. It can cause parents of this
- // elements to erroneously re-toggle this control.
- event.stopPropagation();
- event.preventDefault();
-
- this.scrollIntoViewIfNeeded();
- this.expanded = !this.expanded;
- cr.ui.focusWithoutInk(this.$.icon);
- },
-
- /** @private */
- updateAriaExpanded_() {
- if (this.disabled) {
- this.$.icon.removeAttribute('aria-expanded');
- } else {
- this.$.icon.setAttribute('aria-expanded', this.expanded);
- }
- },
-});
-/* #ignore */ console.warn('crbug/1173575, non-JS module files deprecated.');
diff --git a/chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.m.d.ts b/chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.m.d.ts
deleted file mode 100644
index e98af061305..00000000000
--- a/chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.m.d.ts
+++ /dev/null
@@ -1,21 +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 {LegacyElementMixin} from 'chrome://resources/polymer/v3_0/polymer/lib/legacy/legacy-element-mixin.js';
-
-interface CrExpandButtonElement extends LegacyElementMixin, HTMLElement {
- expanded: boolean;
- disabled: boolean;
- tabIndex: number;
- noink: boolean;
- focus(): void;
-}
-
-export {CrExpandButtonElement};
-
-declare global {
- interface HTMLElementTagNameMap {
- 'cr-expand-button': CrExpandButtonElement;
- }
-}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.ts b/chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.ts
new file mode 100644
index 00000000000..4de1f24c93e
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.ts
@@ -0,0 +1,172 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview
+ * 'cr-expand-button' is a chrome-specific wrapper around a button that toggles
+ * between an opened (expanded) and closed state.
+ */
+import '../cr_actionable_row_style.m.js';
+import '../cr_icon_button/cr_icon_button.js';
+import '../icons.m.js';
+import '../shared_vars_css.m.js';
+
+import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {focusWithoutInk} from '../../js/cr/ui/focus_without_ink.m.js';
+import {CrIconButtonElement} from '../cr_icon_button/cr_icon_button.js';
+
+import {getTemplate} from './cr_expand_button.html.js';
+
+export interface CrExpandButtonElement {
+ $: {
+ icon: CrIconButtonElement,
+ };
+}
+
+export class CrExpandButtonElement extends PolymerElement {
+ static get is() {
+ return 'cr-expand-button';
+ }
+
+ static get template() {
+ return getTemplate();
+ }
+
+ static get properties() {
+ return {
+ /**
+ * If true, the button is in the expanded state and will show the icon
+ * specified in the `collapseIcon` property. If false, the button shows
+ * the icon specified in the `expandIcon` property.
+ */
+ expanded: {
+ type: Boolean,
+ value: false,
+ notify: true,
+ observer: 'onExpandedChange_',
+ },
+
+ /**
+ * If true, the button will be disabled and grayed out.
+ */
+ disabled: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true,
+ },
+
+ /** A11y text descriptor for this control. */
+ ariaLabel: {
+ type: String,
+ observer: 'onAriaLabelChange_',
+ },
+
+ tabIndex: {
+ type: Number,
+ value: 0,
+ },
+
+ expandIcon: {
+ type: String,
+ value: 'cr:expand-more',
+ observer: 'onIconChange_',
+ },
+
+ collapseIcon: {
+ type: String,
+ value: 'cr:expand-less',
+ observer: 'onIconChange_',
+ },
+
+ expandTitle: String,
+ collapseTitle: String,
+
+ tooltipText_: {
+ type: String,
+ computed: 'computeTooltipText_(expandTitle, collapseTitle, expanded)',
+ observer: 'onTooltipTextChange_',
+ },
+ };
+ }
+
+ expanded: boolean;
+ disabled: boolean;
+ expandIcon: string;
+ collapseIcon: string;
+ expandTitle: string;
+ collapseTitle: string;
+ private tooltipText_: string;
+
+ static get observers() {
+ return ['updateAriaExpanded_(disabled, expanded)'];
+ }
+
+ override ready() {
+ super.ready();
+ this.addEventListener('click', this.toggleExpand_);
+ }
+
+ private computeTooltipText_(): string {
+ return this.expanded ? this.collapseTitle : this.expandTitle;
+ }
+
+ private onTooltipTextChange_() {
+ this.title = this.tooltipText_;
+ }
+
+ override focus() {
+ this.$.icon.focus();
+ }
+
+ private onAriaLabelChange_() {
+ if (this.ariaLabel) {
+ this.$.icon.removeAttribute('aria-labelledby');
+ this.$.icon.setAttribute('aria-label', this.ariaLabel);
+ } else {
+ this.$.icon.removeAttribute('aria-label');
+ this.$.icon.setAttribute('aria-labelledby', 'label');
+ }
+ }
+
+ private onExpandedChange_() {
+ this.updateIcon_();
+ }
+
+ private onIconChange_() {
+ this.updateIcon_();
+ }
+
+ private updateIcon_() {
+ this.$.icon.ironIcon = this.expanded ? this.collapseIcon : this.expandIcon;
+ }
+
+ private toggleExpand_(event: Event) {
+ // Prevent |click| event from bubbling. It can cause parents of this
+ // elements to erroneously re-toggle this control.
+ event.stopPropagation();
+ event.preventDefault();
+
+ this.scrollIntoViewIfNeeded();
+ this.expanded = !this.expanded;
+ focusWithoutInk(this.$.icon);
+ }
+
+ private updateAriaExpanded_() {
+ if (this.disabled) {
+ this.$.icon.removeAttribute('aria-expanded');
+ } else {
+ this.$.icon.setAttribute(
+ 'aria-expanded', this.expanded ? 'true' : 'false');
+ }
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ 'cr-expand-button': CrExpandButtonElement;
+ }
+}
+
+customElements.define(CrExpandButtonElement.is, CrExpandButtonElement);
diff --git a/chromium/ui/webui/resources/cr_elements/cr_fingerprint/BUILD.gn b/chromium/ui/webui/resources/cr_elements/cr_fingerprint/BUILD.gn
deleted file mode 100644
index b274ec3d786..00000000000
--- a/chromium/ui/webui/resources/cr_elements/cr_fingerprint/BUILD.gn
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-
-js_type_check("closure_compile") {
- uses_legacy_modules = true
- deps = [ ":cr_fingerprint_progress_arc" ]
-}
-
-js_library("cr_fingerprint_progress_arc") {
- deps = [
- "../cr_lottie:cr_lottie",
- "//third_party/polymer/v1_0/components-chromium/iron-icon:iron-icon-extracted",
- ]
-}
-
-group("polymer3_elements") {
- public_deps = [
- ":cr_fingerprint_icon_module",
- ":cr_fingerprint_progress_arc_module",
- ]
-}
-
-polymer_modulizer("cr_fingerprint_progress_arc") {
- js_file = "cr_fingerprint_progress_arc.js"
- html_file = "cr_fingerprint_progress_arc.html"
- html_type = "dom-module"
-}
-
-polymer_modulizer("cr_fingerprint_icon") {
- js_file = "cr_fingerprint_icon.m.js"
- html_file = "cr_fingerprint_icon.html"
- html_type = "iron-iconset"
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [ ":cr_fingerprint_progress_arc.m" ]
-}
-
-js_library("cr_fingerprint_progress_arc.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.m.js" ]
- deps = [
- "../cr_lottie:cr_lottie.m",
- "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon",
- "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- ]
- extra_deps = [ ":cr_fingerprint_progress_arc_module" ]
-}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_icon.html b/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_icon.html
index 7b7be357a8e..db8f98bd52c 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_icon.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_icon.html
@@ -1,6 +1,3 @@
-<link rel="import" href="../../html/polymer.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/iron-iconset-svg/iron-iconset-svg.html">
-
<iron-iconset-svg name="cr-fingerprint-icon" size="32">
<svg>
<defs>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.html b/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.html
index a83d498bfab..a42149b5dfb 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.html
@@ -1,11 +1,3 @@
-<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/iron-media-query/iron-media-query.html">
-<link rel="import" href="../../html/polymer.html">
-<link rel="import" href="cr_fingerprint_icon.html">
-<link rel="import" href="../cr_lottie/cr_lottie.html">
-
-<dom-module id="cr-fingerprint-progress-arc">
- <template>
<style>
:host {
user-select: none;
@@ -42,6 +34,3 @@
</cr-lottie>
<iron-icon id="fingerprintScanned" hidden></iron-icon>
</div>
- </template>
- <script src="cr_fingerprint_progress_arc.js"></script>
-</dom-module>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.m.d.ts b/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.m.d.ts
deleted file mode 100644
index 6190d5cfd07..00000000000
--- a/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.m.d.ts
+++ /dev/null
@@ -1,41 +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 {CrLottieElement} from 'chrome://resources/cr_elements/cr_lottie/cr_lottie.m.js';
-import {IronIconElement} from 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
-import {LegacyElementMixin} from 'chrome://resources/polymer/v3_0/polymer/lib/legacy/legacy-element-mixin.js';
-
-export const FINGERPRINT_SCANNED_ICON_DARK: string;
-export const FINGERPRINT_SCANNED_ICON_LIGHT: string;
-export const FINGERPRINT_CHECK_DARK_URL: string;
-export const FINGERPRINT_CHECK_LIGHT_URL: string;
-export const PROGRESS_CIRCLE_BACKGROUND_COLOR_DARK: string;
-export const PROGRESS_CIRCLE_BACKGROUND_COLOR_LIGHT: string;
-export const PROGRESS_CIRCLE_FILL_COLOR_DARK: string;
-export const PROGRESS_CIRCLE_FILL_COLOR_LIGHT: string;
-
-interface CrFingerprintProgressArcElement extends LegacyElementMixin,
- HTMLElement {
- circleRadius: number;
-
- reset(): void;
- setProgress(
- prevPercentComplete: number, currPercentComplete: number,
- isComplete: boolean): void;
- setPlay(shouldPlay: boolean): void;
- isComplete(): boolean;
- $: {
- canvas: HTMLCanvasElement,
- fingerprintScanned: IronIconElement,
- scanningAnimation: CrLottieElement,
- };
-}
-
-export {CrFingerprintProgressArcElement};
-
-declare global {
- interface HTMLElementTagNameMap {
- 'cr-fingerprint-progress-arc': CrFingerprintProgressArcElement;
- }
-}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.js b/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.ts
index 818460e981b..673452726bc 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.ts
@@ -2,207 +2,204 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+import '//resources/polymer/v3_0/iron-icon/iron-icon.js';
+import '//resources/polymer/v3_0/iron-media-query/iron-media-query.js';
+import './cr_fingerprint_icon.html.js';
+import '../cr_lottie/cr_lottie.m.js';
+
+import {assert} from '//resources/js/assert_ts.js';
+import {IronIconElement} from '//resources/polymer/v3_0/iron-icon/iron-icon.js';
+import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {CrLottieElement} from '../cr_lottie/cr_lottie.m.js';
+
+import {getTemplate} from './cr_fingerprint_progress_arc.html.js';
+
/**
* The dark-mode fingerprint icon displayed temporarily each time a user scans
* their fingerprint and persistently once the enrollment process is complete.
- * @type {string}
*/
-/* #export */ const FINGERPRINT_SCANNED_ICON_DARK =
+export const FINGERPRINT_SCANNED_ICON_DARK: string =
'cr-fingerprint-icon:fingerprint-scanned-dark';
/**
* The light-mode fingerprint icon displayed temporarily each time a user scans
* their fingerprint and persistently once the enrollment process is complete.
- * @type {string}
*/
-/* #export */ const FINGERPRINT_SCANNED_ICON_LIGHT =
+export const FINGERPRINT_SCANNED_ICON_LIGHT: string =
'cr-fingerprint-icon:fingerprint-scanned-light';
-/** @type {string} */
-/* #export */ const FINGERPRINT_CHECK_DARK_URL =
+export const FINGERPRINT_CHECK_DARK_URL: string =
'chrome://theme/IDR_FINGERPRINT_COMPLETE_CHECK_DARK';
-/** @type {string} */
-/* #export */ const FINGERPRINT_CHECK_LIGHT_URL =
+export const FINGERPRINT_CHECK_LIGHT_URL: string =
'chrome://theme/IDR_FINGERPRINT_COMPLETE_CHECK_LIGHT';
/**
* The dark-mode color of the progress circle background: Google Grey 700.
- * @type {string}
*/
-/* #export */ const PROGRESS_CIRCLE_BACKGROUND_COLOR_DARK =
+export const PROGRESS_CIRCLE_BACKGROUND_COLOR_DARK: string =
'rgba(95, 99, 104, 1.0)';
/**
* The light-mode color of the progress circle background: Google Grey 200.
- * @type {string}
*/
-/* #export */ const PROGRESS_CIRCLE_BACKGROUND_COLOR_LIGHT =
+export const PROGRESS_CIRCLE_BACKGROUND_COLOR_LIGHT: string =
'rgba(232, 234, 237, 1.0)';
/**
* The dark-mode color of the setup progress arc: Google Blue 400.
- * @type {string}
*/
-/* #export */ const PROGRESS_CIRCLE_FILL_COLOR_DARK =
+export const PROGRESS_CIRCLE_FILL_COLOR_DARK: string =
'rgba(102, 157, 246, 1.0)';
/**
* The light-mode color of the setup progress arc: Google Blue 500.
- * @type {string}
*/
-/* #export */ const PROGRESS_CIRCLE_FILL_COLOR_LIGHT =
+export const PROGRESS_CIRCLE_FILL_COLOR_LIGHT: string =
'rgba(66, 133, 244, 1.0)';
-(function() {
-
/**
* The time in milliseconds of the animation updates.
- * @type {number}
*/
-const ANIMATE_TICKS_MS = 20;
+const ANIMATE_TICKS_MS: number = 20;
/**
* The duration in milliseconds of the animation of the progress circle when the
* user is touching the scanner.
- * @type {number}
*/
-const ANIMATE_DURATION_MS = 200;
+const ANIMATE_DURATION_MS: number = 200;
/**
* The radius of the add fingerprint progress circle.
- * @type {number}
*/
-const DEFAULT_PROGRESS_CIRCLE_RADIUS = 114;
+const DEFAULT_PROGRESS_CIRCLE_RADIUS: number = 114;
/**
* The default height of the icon located in the center of the fingerprint
* progress circle.
- * @type {number}
*/
-const ICON_HEIGHT = 118;
+const ICON_HEIGHT: number = 118;
/**
* The default width of the icon located in the center of the fingerprint
* progress circle.
- * @type {number}
*/
-const ICON_WIDTH = 106;
+const ICON_WIDTH: number = 106;
/**
* The default size of the check mark located in the bottom-right corner of the
* fingerprint progress circle.
- * @type {number}
*/
-const CHECK_MARK_SIZE = 53;
+const CHECK_MARK_SIZE: number = 53;
/**
* The time in milliseconds of the fingerprint scan success timeout.
- * @type {number}
*/
-const FINGERPRINT_SCAN_SUCCESS_MS = 500;
+const FINGERPRINT_SCAN_SUCCESS_MS: number = 500;
/**
* The thickness of the fingerprint progress circle.
- * @type {number}
*/
-const PROGRESS_CIRCLE_STROKE_WIDTH = 4;
-
-Polymer({
- is: 'cr-fingerprint-progress-arc',
-
- properties: {
- /**
- * Radius of the fingerprint progress circle being displayed.
- * @type {number}
- */
- circleRadius: {
- type: Number,
- value: DEFAULT_PROGRESS_CIRCLE_RADIUS,
- },
-
- /**
- * Whether lottie animation should be autoplayed.
- * @type {boolean}
- */
- autoplay: {
- type: Boolean,
- value: false,
- },
-
- /**
- * Scale factor based the configured radius (circleRadius) vs the default
- * radius (DEFAULT_PROGRESS_CIRCLE_RADIUS).
- * This will affect the size of icons and check mark.
- * @type {number}
- * @private
- */
- scale_: {
- type: Number,
- value: 1.0,
- },
-
- /**
- * Whether fingerprint enrollment is complete.
- * @type {boolean}
- * @private
- */
- isComplete_: Boolean,
-
- /**
- * Whether the fingerprint progress page is being rendered in dark mode.
- * @type {boolean}
- * @private
- */
- isDarkModeActive_: {
- type: Boolean,
- value: false,
- observer: 'onDarkModeChanged_',
- },
- },
+const PROGRESS_CIRCLE_STROKE_WIDTH: number = 4;
+
+
+export interface CrFingerprintProgressArcElement {
+ $: {
+ canvas: HTMLCanvasElement,
+ fingerprintScanned: IronIconElement,
+ scanningAnimation: CrLottieElement,
+ };
+}
+
+export class CrFingerprintProgressArcElement extends PolymerElement {
+ static get is() {
+ return 'cr-fingerprint-progress-arc';
+ }
+
+ static get template() {
+ return getTemplate();
+ }
+
+ static get properties() {
+ return {
+ /**
+ * Radius of the fingerprint progress circle being displayed.
+ */
+ circleRadius: {
+ type: Number,
+ value: DEFAULT_PROGRESS_CIRCLE_RADIUS,
+ },
+
+ /**
+ * Whether lottie animation should be autoplayed.
+ */
+ autoplay: {
+ type: Boolean,
+ value: false,
+ },
+
+ /**
+ * Scale factor based the configured radius (circleRadius) vs the default
+ * radius (DEFAULT_PROGRESS_CIRCLE_RADIUS).
+ * This will affect the size of icons and check mark.
+ */
+ scale_: {
+ type: Number,
+ value: 1.0,
+ },
+
+ /**
+ * Whether fingerprint enrollment is complete.
+ */
+ isComplete_: Boolean,
+
+ /**
+ * Whether the fingerprint progress page is being rendered in dark mode.
+ */
+ isDarkModeActive_: {
+ type: Boolean,
+ value: false,
+ observer: 'onDarkModeChanged_',
+ },
+ };
+ }
- /**
- * Animation ID for the fingerprint progress circle.
- * @type {number|undefined}
- * @private
- */
- progressAnimationIntervalId_: undefined,
+ circleRadius: number;
+ autoplay: boolean;
+ private scale_: number;
+ private isComplete_: boolean;
+ private isDarkModeActive_: boolean;
- /**
- * Percentage of the enrollment process completed as of the last update.
- * @type {number}
- * @private
- */
- progressPercentDrawn_: 0,
+ // Animation ID for the fingerprint progress circle.
+ private progressAnimationIntervalId_: number|undefined = undefined;
- /**
- * Timer ID for fingerprint scan success update.
- * @type {number|undefined}
- * @private
- */
- updateTimerId_: undefined,
+ // Percentage of the enrollment process completed as of the last update.
+ private progressPercentDrawn_: number = 0;
+
+ // Timer ID for fingerprint scan success update.
+ private updateTimerId_: number|undefined = undefined;
/**
* Updates the current state to account for whether dark mode is enabled.
- * @private
*/
- onDarkModeChanged_() {
+ private onDarkModeChanged_() {
this.clearCanvas_();
this.drawProgressCircle_(this.progressPercentDrawn_);
this.updateAnimationAsset_();
this.updateIconAsset_();
- },
+ }
+
+ override connectedCallback() {
+ super.connectedCallback();
- /** @override */
- attached() {
this.scale_ = this.circleRadius / DEFAULT_PROGRESS_CIRCLE_RADIUS;
this.updateIconAsset_();
this.updateImages_();
- },
+ }
/**
* Reset the element to initial state, when the enrollment just starts.
- * @public
*/
reset() {
this.cancelAnimations_();
@@ -212,27 +209,27 @@ Polymer({
this.drawProgressCircle_(/** currentPercent = */ 0);
this.$.fingerprintScanned.hidden = true;
- const scanningAnimation =
- /** @type {CrLottieElement|HTMLElement} */ (this.$.scanningAnimation);
+ const scanningAnimation = this.$.scanningAnimation;
scanningAnimation.singleLoop = false;
scanningAnimation.classList.add('translucent');
this.updateAnimationAsset_();
this.resizeAndCenterIcon_(scanningAnimation);
scanningAnimation.hidden = false;
- },
+ }
/**
* Animates the progress circle. Animates an arc that starts at the top of
* the circle to prevPercentComplete, to an arc that starts at the top of the
* circle to currPercentComplete.
- * @param {number} prevPercentComplete The previous progress indicates the
- * start angle of the arc we want to draw.
- * @param {number} currPercentComplete The current progress indicates the end
- * angle of the arc we want to draw.
- * @param {boolean} isComplete Indicate whether enrollment is complete.
- * @public
+ * @param prevPercentComplete The previous progress indicates the start angle
+ * of the arc we want to draw.
+ * @param currPercentComplete The current progress indicates the end angle of
+ * the arc we want to draw.
+ * @param isComplete Indicate whether enrollment is complete.
*/
- setProgress(prevPercentComplete, currPercentComplete, isComplete) {
+ setProgress(
+ prevPercentComplete: number, currPercentComplete: number,
+ isComplete: boolean) {
if (this.isComplete_) {
return;
}
@@ -260,7 +257,9 @@ Polymer({
this.clearCanvas_();
this.drawProgressCircle_(nextPercentToDraw);
if (!this.progressAnimationIntervalId_) {
- this.fire('cr-fingerprint-progress-arc-drawn');
+ this.dispatchEvent(new CustomEvent(
+ 'cr-fingerprint-progress-arc-drawn',
+ {bubbles: true, composed: true}));
}
nextPercentToDraw += step;
};
@@ -273,55 +272,50 @@ Polymer({
} else {
this.animateScanProgress_();
}
- },
+ }
/**
* Controls the animation based on the value of |shouldPlay|.
- * @param {boolean} shouldPlay Will play the animation if true else pauses it.
- * @public
+ * @param shouldPlay Will play the animation if true else pauses it.
*/
- setPlay(shouldPlay) {
- const scanningAnimation =
- /** @type {CrLottieElement|HTMLElement} */ (this.$.scanningAnimation);
- scanningAnimation.setPlay(shouldPlay);
- },
-
- /** @public */
- isComplete() {
+ setPlay(shouldPlay: boolean) {
+ this.$.scanningAnimation.setPlay(shouldPlay);
+ }
+
+ isComplete(): boolean {
return this.isComplete_;
- },
+ }
/**
* Draws an arc on the canvas element around the center with radius
* |circleRadius|.
- * @param {number} startAngle The start angle of the arc we want to draw.
- * @param {number} endAngle The end angle of the arc we want to draw.
- * @param {string} color The color of the arc we want to draw. The string is
+ * @param startAngle The start angle of the arc we want to draw.
+ * @param endAngle The end angle of the arc we want to draw.
+ * @param color The color of the arc we want to draw. The string is
* in the format rgba(r',g',b',a'). r', g', b' are values from [0-255]
* and a' is a value from [0-1].
- * @private
*/
- drawArc_(startAngle, endAngle, color) {
+ private drawArc_(startAngle: number, endAngle: number, color: string) {
const c = this.$.canvas;
const ctx = c.getContext('2d');
+ assert(!!ctx);
ctx.beginPath();
ctx.arc(c.width / 2, c.height / 2, this.circleRadius, startAngle, endAngle);
ctx.lineWidth = PROGRESS_CIRCLE_STROKE_WIDTH;
ctx.strokeStyle = color;
ctx.stroke();
- },
+ }
/**
* Draws a circle on the canvas element around the center with radius
* |circleRadius|. The first |currentPercent| of the circle, starting at the
* top, is drawn with |PROGRESS_CIRCLE_FILL_COLOR|; the remainder of the
* circle is drawn |PROGRESS_CIRCLE_BACKGROUND_COLOR|.
- * @param {number} currentPercent A value from [0-100] indicating the
+ * @param currentPercent A value from [0-100] indicating the
* percentage of progress to display.
- * @private
*/
- drawProgressCircle_(currentPercent) {
+ private drawProgressCircle_(currentPercent: number) {
// Angles on HTML canvases start at 0 radians on the positive x-axis and
// increase in the clockwise direction. We want to start at the top of the
// circle, which is 3pi/2.
@@ -342,16 +336,14 @@ Polymer({
this.isDarkModeActive_ ? PROGRESS_CIRCLE_BACKGROUND_COLOR_DARK :
PROGRESS_CIRCLE_BACKGROUND_COLOR_LIGHT);
this.progressPercentDrawn_ = currentPercent;
- },
+ }
/**
* Updates the lottie animation taking into account the current state and
* whether dark mode is enabled.
- * @private
*/
- updateAnimationAsset_() {
- const scanningAnimation =
- /** @type {CrLottieElement} */ (this.$.scanningAnimation);
+ private updateAnimationAsset_() {
+ const scanningAnimation = this.$.scanningAnimation;
if (this.isComplete_) {
scanningAnimation.animationUrl = this.isDarkModeActive_ ?
FINGERPRINT_CHECK_DARK_URL :
@@ -361,25 +353,21 @@ Polymer({
scanningAnimation.animationUrl = this.isDarkModeActive_ ?
'chrome://theme/IDR_FINGERPRINT_ICON_ANIMATION_DARK' :
'chrome://theme/IDR_FINGERPRINT_ICON_ANIMATION_LIGHT';
- },
+ }
/**
* Updates the fingerprint-scanned icon based on whether dark mode is enabled.
- * @private
*/
- updateIconAsset_() {
- const fingerprintScanned =
- /** @type {IronIconElement} */ (this.$.fingerprintScanned);
- fingerprintScanned.icon = this.isDarkModeActive_ ?
+ private updateIconAsset_() {
+ this.$.fingerprintScanned.icon = this.isDarkModeActive_ ?
FINGERPRINT_SCANNED_ICON_DARK :
FINGERPRINT_SCANNED_ICON_LIGHT;
- },
+ }
/*
* Cleans up any pending animation update created by setInterval().
- * @private
*/
- cancelAnimations_() {
+ private cancelAnimations_() {
this.progressPercentDrawn_ = 0;
if (this.progressAnimationIntervalId_) {
clearInterval(this.progressAnimationIntervalId_);
@@ -389,64 +377,56 @@ Polymer({
window.clearTimeout(this.updateTimerId_);
this.updateTimerId_ = undefined;
}
- },
+ }
/**
* Show animation for enrollment completion.
- * @private
*/
- animateScanComplete_() {
- const scanningAnimation =
- /** @type {CrLottieElement|HTMLElement} */ (this.$.scanningAnimation);
+ private animateScanComplete_() {
+ const scanningAnimation = this.$.scanningAnimation;
scanningAnimation.singleLoop = true;
scanningAnimation.autoplay = true;
scanningAnimation.classList.remove('translucent');
this.updateAnimationAsset_();
this.resizeCheckMark_(scanningAnimation);
this.$.fingerprintScanned.hidden = false;
- },
+ }
/**
* Show animation for enrollment in progress.
- * @private
*/
- animateScanProgress_() {
+ private animateScanProgress_() {
this.$.fingerprintScanned.hidden = false;
this.$.scanningAnimation.hidden = true;
this.updateTimerId_ = window.setTimeout(() => {
this.$.scanningAnimation.hidden = false;
this.$.fingerprintScanned.hidden = true;
}, FINGERPRINT_SCAN_SUCCESS_MS);
- },
+ }
/**
* Clear the canvas of any renderings.
- * @private
*/
- clearCanvas_() {
+ private clearCanvas_() {
const c = this.$.canvas;
const ctx = c.getContext('2d');
+ assert(!!ctx);
ctx.clearRect(0, 0, c.width, c.height);
- },
+ }
/**
* Update the size and position of the animation images.
- * @private
*/
- updateImages_() {
- this.resizeAndCenterIcon_(
- /** @type {!HTMLElement} */ (this.$.scanningAnimation));
- this.resizeAndCenterIcon_(
- /** @type {!HTMLElement} */ (this.$.fingerprintScanned));
- },
+ private updateImages_() {
+ this.resizeAndCenterIcon_(this.$.scanningAnimation);
+ this.resizeAndCenterIcon_(this.$.fingerprintScanned);
+ }
/**
* Resize the icon based on the scale and place it in the center of the
* fingerprint progress circle.
- * @param {!HTMLElement} target
- * @private
*/
- resizeAndCenterIcon_(target) {
+ private resizeAndCenterIcon_(target: HTMLElement) {
// Resize icon based on the default width/height and scale.
target.style.width = ICON_WIDTH * this.scale_ + 'px';
target.style.height = ICON_HEIGHT * this.scale_ + 'px';
@@ -456,15 +436,13 @@ Polymer({
const top = this.$.canvas.height / 2 - ICON_HEIGHT * this.scale_ / 2;
target.style.left = left + 'px';
target.style.top = top + 'px';
- },
+ }
/**
* Resize the check mark based on the scale and place it in the bottom-right
* corner of the fingerprint progress circle.
- * @param {!HTMLElement} target
- * @private
*/
- resizeCheckMark_(target) {
+ private resizeCheckMark_(target: HTMLElement) {
// Resize check mark based on the default size and scale.
target.style.width = CHECK_MARK_SIZE * this.scale_ + 'px';
target.style.height = CHECK_MARK_SIZE * this.scale_ + 'px';
@@ -476,7 +454,14 @@ Polymer({
CHECK_MARK_SIZE * this.scale_;
target.style.left = left + 'px';
target.style.top = top + 'px';
- },
-});
-/* #ignore */ console.warn('crbug/1173575, non-JS module files deprecated.');
-})();
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ 'cr-fingerprint-progress-arc': CrFingerprintProgressArcElement;
+ }
+}
+
+customElements.define(
+ CrFingerprintProgressArcElement.is, CrFingerprintProgressArcElement);
diff --git a/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc_externs.js b/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc_externs.js
new file mode 100644
index 00000000000..9beb0cb1ecf
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc_externs.js
@@ -0,0 +1,22 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/* Minimal externs file provided for places in the code that
+ * still use JavaScript instead of TypeScript.
+ * @externs
+ */
+
+/**
+ * @constructor
+ * @extends {HTMLElement}
+ */
+function CrFingerprintProgressArcElement() {}
+
+/**
+ * @param {number} prevPercentComplete
+ * @param {number} currPercentComplete
+ * @param {boolean} isComplete
+ */
+CrFingerprintProgressArcElement.prototype.setProgress = function(
+ prevPercentComplete, currPercentComplete, isComplete) {};
diff --git a/chromium/ui/webui/resources/cr_elements/cr_icon_button/BUILD.gn b/chromium/ui/webui/resources/cr_elements/cr_icon_button/BUILD.gn
index ad2d8613851..b6d3b4d9d3e 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_icon_button/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_elements/cr_icon_button/BUILD.gn
@@ -3,33 +3,20 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
-js_type_check("closure_compile") {
- uses_legacy_modules = true
- deps = [ ":cr_icon_button" ]
-}
-
-js_library("cr_icon_button") {
- deps = [ "//third_party/polymer/v1_0/components-chromium/paper-behaviors:paper-ripple-behavior-extracted" ]
-}
-
-polymer_modulizer("cr_icon_button") {
- js_file = "cr_icon_button.js"
- html_file = "cr_icon_button.html"
- html_type = "dom-module"
+html_to_js("web_components") {
+ js_files = [ "cr_icon_button.js" ]
}
js_type_check("closure_compile_module") {
is_polymer3 = true
- deps = [ ":cr_icon_button.m" ]
+ deps = [ ":cr_icon_button" ]
}
-js_library("cr_icon_button.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.m.js" ]
+js_library("cr_icon_button") {
deps = [
"//third_party/polymer/v3_0/components-chromium/paper-behaviors:paper-ripple-behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
- extra_deps = [ ":cr_icon_button_module" ]
}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.m.d.ts b/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.d.ts
index 674e2412491..674e2412491 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.m.d.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.d.ts
diff --git a/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html b/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html
index e7ec685d5a4..0058f2b3b0d 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html
@@ -1,10 +1,3 @@
-<link rel="import" href="../../html/polymer.html">
-
-<link rel="import" href="../shared_vars_css.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
-
-<dom-module id="cr-icon-button">
- <template>
<style>
:host {
--cr-icon-button-fill-color: var(--google-grey-700);
@@ -43,6 +36,14 @@
var(--cr-focus-outline-color));
}
+ @media (forced-colors: active) {
+ :host(:focus-visible:focus) {
+ /* Use outline instead of box-shadow (which does not work) in Windows
+ HCM. */
+ outline: var(--cr-focus-outline-hcm);
+ }
+ }
+
:host(:active) {
background-color: var(--cr-icon-button-active-background-color,
var(--cr-active-background-color));
@@ -80,6 +81,12 @@
width: 100%;
}
+ @media (forced-colors: active) {
+ :host(:not([iron-icon])) #maskedImage {
+ background-color: ButtonText;
+ }
+ }
+
#icon {
align-items: center;
border-radius: 4px;
@@ -110,6 +117,3 @@
<div id="icon">
<div id="maskedImage"></div>
</div>
- </template>
- <script src="cr_icon_button.js"></script>
-</dom-module>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.js b/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.js
index a5bb2d68ef2..436c998a604 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.js
@@ -40,61 +40,93 @@
* When using iron-icon's, more than one icon can be specified by setting
* the |ironIcon| property to a comma-delimited list of keys.
*/
-Polymer({
- is: 'cr-icon-button',
-
- properties: {
- disabled: {
- type: Boolean,
- value: false,
- reflectToAttribute: true,
- observer: 'disabledChanged_',
- },
+import '../shared_vars_css.m.js';
+import '//resources/polymer/v3_0/iron-icon/iron-icon.js';
+
+import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+export class CrIconButtonElement extends PolymerElement {
+ static get is() {
+ return 'cr-icon-button';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ static get properties() {
+ return {
+ disabled: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true,
+ observer: 'disabledChanged_',
+ },
+
+ /**
+ * Use this property in order to configure the "tabindex" attribute.
+ */
+ customTabIndex: {
+ type: Number,
+ observer: 'applyTabIndex_',
+ },
+
+ ironIcon: {
+ type: String,
+ observer: 'onIronIconChanged_',
+ reflectToAttribute: true,
+ },
+
+ /** @private */
+ multipleIcons_: {
+ type: Boolean,
+ reflectToAttribute: true,
+ },
+ };
+ }
+
+ constructor() {
+ super();
/**
- * Use this property in order to configure the "tabindex" attribute.
+ * It is possible to activate a tab when the space key is pressed down. When
+ * this element has focus, the keyup event for the space key should not
+ * perform a 'click'. |spaceKeyDown_| tracks when a space pressed and
+ * handled by this element. Space keyup will only result in a 'click' when
+ * |spaceKeyDown_| is true. |spaceKeyDown_| is set to false when element
+ * loses focus.
+ * @private {boolean}
*/
- customTabIndex: {
- type: Number,
- observer: 'applyTabIndex_',
- },
-
- ironIcon: {
- type: String,
- observer: 'onIronIconChanged_',
- reflectToAttribute: true,
- },
-
- /** @private */
- multipleIcons_: {
- type: Boolean,
- reflectToAttribute: true,
- },
- },
-
- hostAttributes: {
- 'aria-disabled': 'false',
- role: 'button',
- tabindex: 0,
- },
-
- listeners: {
- blur: 'onBlur_',
- click: 'onClick_',
- keydown: 'onKeyDown_',
- keyup: 'onKeyUp_',
- },
+ this.spaceKeyDown_ = false;
+ }
+
+ /** @override */
+ ready() {
+ super.ready();
+ this.setAttribute('aria-disabled', 'false');
+ if (!this.hasAttribute('role')) {
+ this.setAttribute('role', 'button');
+ }
+ if (!this.hasAttribute('tabindex')) {
+ this.setAttribute('tabindex', '0');
+ }
- /**
- * It is possible to activate a tab when the space key is pressed down. When
- * this element has focus, the keyup event for the space key should not
- * perform a 'click'. |spaceKeyDown_| tracks when a space pressed and handled
- * by this element. Space keyup will only result in a 'click' when
- * |spaceKeyDown_| is true. |spaceKeyDown_| is set to false when element loses
- * focus.
- * @private {boolean}
- */
- spaceKeyDown_: false,
+ this.addEventListener('blur', this.onBlur_.bind(this));
+ this.addEventListener('click', this.onClick_.bind(this));
+ this.addEventListener(
+ 'keydown', e => this.onKeyDown_(/** @type {!KeyboardEvent} */ (e)));
+ this.addEventListener(
+ 'keyup', e => this.onKeyUp_(/** @type {!KeyboardEvent} */ (e)));
+ }
+
+ /** @param {string} className */
+ toggleClass(className) {
+ if (this.classList.contains(className)) {
+ this.classList.remove(className);
+ } else {
+ this.classList.add(className);
+ }
+ }
/**
* @param {boolean} newValue
@@ -110,7 +142,7 @@ Polymer({
}
this.setAttribute('aria-disabled', this.disabled ? 'true' : 'false');
this.applyTabIndex_();
- },
+ }
/**
* Updates the tabindex HTML attribute to the actual value.
@@ -122,12 +154,12 @@ Polymer({
value = this.disabled ? -1 : 0;
}
this.setAttribute('tabindex', value);
- },
+ }
/** @private */
onBlur_() {
this.spaceKeyDown_ = false;
- },
+ }
/**
* @param {!Event} e
@@ -137,7 +169,7 @@ Polymer({
if (this.disabled) {
e.stopImmediatePropagation();
}
- },
+ }
/** @private */
onIronIconChanged_() {
@@ -156,7 +188,7 @@ Polymer({
.forEach(child => child.setAttribute('role', 'none'));
}
});
- },
+ }
/**
* @param {!KeyboardEvent} e
@@ -178,7 +210,7 @@ Polymer({
} else if (e.key === ' ') {
this.spaceKeyDown_ = true;
}
- },
+ }
/**
* @param {!KeyboardEvent} e
@@ -194,6 +226,7 @@ Polymer({
this.spaceKeyDown_ = false;
this.click();
}
- },
-});
-/* #ignore */ console.warn('crbug/1173575, non-JS module files deprecated.');
+ }
+}
+
+customElements.define(CrIconButtonElement.is, CrIconButtonElement);
diff --git a/chromium/ui/webui/resources/cr_elements/cr_input/BUILD.gn b/chromium/ui/webui/resources/cr_elements/cr_input/BUILD.gn
index 5eebbd6a854..ba02c9f74dd 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_input/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_elements/cr_input/BUILD.gn
@@ -3,49 +3,21 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
-js_type_check("closure_compile") {
- uses_legacy_modules = true
- deps = [ ":cr_input" ]
-}
-
-js_library("cr_input") {
- deps = [ "//ui/webui/resources/js:assert" ]
-}
-
-group("polymer3_elements") {
- public_deps = [
- ":cr_input_module",
- ":cr_input_style_css_module",
- ]
-}
-
-polymer_modulizer("cr_input") {
- js_file = "cr_input.js"
- html_file = "cr_input.html"
- html_type = "dom-module"
- auto_imports = [ "ui/webui/resources/html/assert.html|assert" ]
-}
-
-polymer_modulizer("cr_input_style_css") {
- js_file = "cr_input_style_css.m.js"
- html_file = "cr_input_style_css.html"
- html_type = "style-module"
+html_to_js("web_components") {
+ js_files = [ "cr_input.js" ]
}
js_type_check("closure_compile_module") {
is_polymer3 = true
- deps = [ ":cr_input.m" ]
+ deps = [ ":cr_input" ]
}
-js_library("cr_input.m") {
- sources =
- [ "$root_gen_dir/ui/webui/resources/cr_elements/cr_input/cr_input.m.js" ]
+js_library("cr_input") {
deps = [
"../../js:assert.m",
"//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
- extra_deps = [ ":cr_input_module" ]
}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.m.d.ts b/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.d.ts
index eeca0587185..eeca0587185 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.m.d.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.d.ts
diff --git a/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.html b/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.html
index 2a74dc7f1af..13bd990db63 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.html
@@ -1,14 +1,3 @@
-<link rel="import" href="../../html/polymer.html">
-
-<link rel="import" href="../../html/assert.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html">
-<link rel="import" href="../hidden_style_css.html">
-<link rel="import" href="../shared_style_css.html">
-<link rel="import" href="../shared_vars_css.html">
-<link rel="import" href="cr_input_style_css.html">
-
-<dom-module id="cr-input">
- <template>
<style include="cr-hidden-style cr-input-style cr-shared-style">
/*
A 'suffix' element will be outside the underlined space, while a
@@ -153,6 +142,3 @@
<slot name="suffix"></slot>
</div>
<div id="error" aria-live="assertive">[[displayErrorMessage_]]</div>
- </template>
- <script src="cr_input.js"></script>
-</dom-module>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.js b/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.js
index 8b77cd6a2b2..78fff96883a 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.js
@@ -2,7 +2,16 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-(function() {
+import '//resources/polymer/v3_0/paper-styles/color.js';
+import '../hidden_style_css.m.js';
+import '../shared_style_css.m.js';
+import '../shared_vars_css.m.js';
+import './cr_input_style.css.js';
+
+import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {assert} from '../../js/assert.m.js';
+
/**
* Input types supported by cr-input.
@@ -51,6 +60,8 @@ const SUPPORTED_INPUT_TYPES = new Set([
Polymer({
is: 'cr-input',
+ _template: html`{__html_template__}`,
+
properties: {
/** @type {string|undefined} */
ariaDescription: {
@@ -330,5 +341,3 @@ Polymer({
return !this.invalid;
},
});
-/* #ignore */ console.warn('crbug/1173575, non-JS module files deprecated.');
-})();
diff --git a/chromium/ui/webui/resources/cr_elements/cr_input/cr_input_style_css.html b/chromium/ui/webui/resources/cr_elements/cr_input/cr_input_style.css
index 84224366a96..a4143ed38a9 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_input/cr_input_style_css.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_input/cr_input_style.css
@@ -1,12 +1,12 @@
-<link rel="import" href="../../html/polymer.html">
+/* 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. */
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html">
-<link rel="import" href="../shared_vars_css.html">
+/* #css_wrapper_metadata_start
+ * #type=style
+ * #import=../../cr_elements/shared_vars_css.m.js
+ * #css_wrapper_metadata_end */
-<!-- Common input styling for Material Design WebUI. -->
-<dom-module id="cr-input-style">
- <template>
- <style>
:host {
--cr-input-background-color: var(--google-grey-100);
--cr-input-color: var(--cr-primary-text-color);
@@ -101,6 +101,3 @@
transition: opacity 120ms ease-in, width 180ms ease-out;
width: 100%;
}
- </style>
- </template>
-</dom-module>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_lazy_render/BUILD.gn b/chromium/ui/webui/resources/cr_elements/cr_lazy_render/BUILD.gn
deleted file mode 100644
index 6a9231335a7..00000000000
--- a/chromium/ui/webui/resources/cr_elements/cr_lazy_render/BUILD.gn
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-
-js_type_check("closure_compile") {
- uses_legacy_modules = true
- deps = [ ":cr_lazy_render" ]
-}
-
-js_library("cr_lazy_render") {
- externs_list = [ "$externs_path/pending_polymer.js" ]
-}
-
-polymer_modulizer("cr_lazy_render") {
- js_file = "cr_lazy_render.js"
- html_file = "cr_lazy_render.html"
- html_type = "dom-module"
- namespace_rewrites = [ "Polymer.Templatize.templatize|templatize" ]
- auto_imports = [ "ui/webui/resources/html/polymer.html|Polymer,html,templatize,TemplateInstanceBase" ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [ ":cr_lazy_render.m" ]
-}
-
-js_library("cr_lazy_render.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/cr_elements/cr_lazy_render/cr_lazy_render.m.js" ]
- deps = [
- "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- ]
- extra_deps = [ ":cr_lazy_render_module" ]
-}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_lazy_render/cr_lazy_render.html b/chromium/ui/webui/resources/cr_elements/cr_lazy_render/cr_lazy_render.html
deleted file mode 100644
index eab1f83aaa1..00000000000
--- a/chromium/ui/webui/resources/cr_elements/cr_lazy_render/cr_lazy_render.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<link rel="import" href="../../html/polymer.html">
-
-<dom-module id="cr-lazy-render">
- <template>
- <slot></slot>
- </template>
- <script src="cr_lazy_render.js"></script>
-</dom-module>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_lazy_render/cr_lazy_render.js b/chromium/ui/webui/resources/cr_elements/cr_lazy_render/cr_lazy_render.js
deleted file mode 100644
index 67124f7c885..00000000000
--- a/chromium/ui/webui/resources/cr_elements/cr_lazy_render/cr_lazy_render.js
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview
- * cr-lazy-render is a simple variant of dom-if designed for lazy rendering
- * of elements that are accessed imperatively.
- * Usage:
- * <cr-lazy-render id="menu">
- * <template>
- * <heavy-menu></heavy-menu>
- * </template>
- * </cr-lazy-render>
- *
- * this.$.menu.get().show();
- */
-
-Polymer({
- is: 'cr-lazy-render',
-
- /** @private {?Element} */
- child_: null,
-
- /** @private {?Element|?TemplateInstanceBase} */
- instance_: null,
-
- /**
- * Stamp the template into the DOM tree synchronously
- * @return {Element} Child element which has been stamped into the DOM tree.
- */
- get() {
- if (!this.child_) {
- this.render_();
- }
- return this.child_;
- },
-
- /**
- * @return {?Element} The element contained in the template, if it has
- * already been stamped.
- */
- getIfExists() {
- return this.child_;
- },
-
- /** @private */
- render_() {
- const template =
- /** @type {!HTMLTemplateElement} */ (this.getContentChildren()[0]);
- const TemplateClass = Polymer.Templatize.templatize(template, this, {
- mutableData: false,
- forwardHostProp: this._forwardHostPropV2,
- });
- const parentNode = this.parentNode;
- if (parentNode && !this.child_) {
- this.instance_ = new TemplateClass();
- this.child_ = this.instance_.root.firstElementChild;
- parentNode.insertBefore(this.instance_.root, this);
- }
- },
-
- /**
- * @param {string} prop
- * @param {Object} value
- */
- _forwardHostPropV2(prop, value) {
- if (this.instance_) {
- this.instance_.forwardHostProp(prop, value);
- }
- },
-});
-/* #ignore */ console.warn('crbug/1173575, non-JS module files deprecated.');
diff --git a/chromium/ui/webui/resources/cr_elements/cr_lazy_render/cr_lazy_render.m.d.ts b/chromium/ui/webui/resources/cr_elements/cr_lazy_render/cr_lazy_render.m.d.ts
deleted file mode 100644
index faeff7d2042..00000000000
--- a/chromium/ui/webui/resources/cr_elements/cr_lazy_render/cr_lazy_render.m.d.ts
+++ /dev/null
@@ -1,19 +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 {LegacyElementMixin} from 'chrome://resources/polymer/v3_0/polymer/lib/legacy/legacy-element-mixin.js';
-
-interface CrLazyRenderElement<T extends HTMLElement> extends LegacyElementMixin,
- HTMLElement {
- get(): T;
- getIfExists(): (T|null);
-}
-
-export {CrLazyRenderElement};
-
-declare global {
- interface HTMLElementTagNameMap {
- 'cr-lazy-render': CrLazyRenderElement<HTMLElement>;
- }
-}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_lazy_render/cr_lazy_render.ts b/chromium/ui/webui/resources/cr_elements/cr_lazy_render/cr_lazy_render.ts
new file mode 100644
index 00000000000..36ee739f7b1
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_elements/cr_lazy_render/cr_lazy_render.ts
@@ -0,0 +1,81 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview
+ * cr-lazy-render is a simple variant of dom-if designed for lazy rendering
+ * of elements that are accessed imperatively.
+ * Usage:
+ * <cr-lazy-render id="menu">
+ * <template>
+ * <heavy-menu></heavy-menu>
+ * </template>
+ * </cr-lazy-render>
+ *
+ * this.$.menu.get().show();
+ */
+
+import {html, PolymerElement, TemplateInstanceBase, templatize} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {assert} from '../../js/assert_ts.js';
+
+export class CrLazyRenderElement<T extends HTMLElement> extends PolymerElement {
+ static get is() {
+ return 'cr-lazy-render';
+ }
+
+ static get template() {
+ return html`<slot></slot>`;
+ }
+
+ private child_: T|null = null;
+ private instance_: TemplateInstanceBase|null = null;
+
+ /**
+ * Stamp the template into the DOM tree synchronously
+ * @return Child element which has been stamped into the DOM tree.
+ */
+ override get(): T {
+ if (!this.child_) {
+ this.render_();
+ }
+ assert(this.child_);
+ return this.child_;
+ }
+
+ /**
+ * @return The element contained in the template, if it has
+ * already been stamped.
+ */
+ getIfExists(): (T|null) {
+ return this.child_;
+ }
+
+ private render_() {
+ const template =
+ (this.shadowRoot!.querySelector('slot')!.assignedNodes({flatten: true})
+ .filter(n => n.nodeType === Node.ELEMENT_NODE)[0]) as
+ HTMLTemplateElement;
+
+ const TemplateClass = templatize(template, this, {
+ mutableData: false,
+ forwardHostProp: this._forwardHostPropV2,
+ });
+ const parentNode = this.parentNode;
+ if (parentNode && !this.child_) {
+ this.instance_ = new TemplateClass();
+ this.child_ = this.instance_.root.firstElementChild as T;
+ parentNode.insertBefore(this.instance_.root, this);
+ }
+ }
+
+ /* eslint-disable-next-line @typescript-eslint/naming-convention */
+ _forwardHostPropV2(prop: string, value: object) {
+ if (this.instance_) {
+ this.instance_.forwardHostProp(prop, value);
+ }
+ }
+}
+
+customElements.define(CrLazyRenderElement.is, CrLazyRenderElement);
diff --git a/chromium/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.html b/chromium/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.html
index d3eb55a544f..9715d13eb56 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.html
@@ -57,6 +57,6 @@
</div>
<slot></slot>
<cr-icon-button id="icon" iron-icon="[[getIcon_(external)]]" role="link"
- aria-roledescription$="[[roleDescription]]"
+ aria-roledescription$="[[roleDescription]]" part="icon"
aria-labelledby="label subLabel" disabled="[[disabled]]">
</cr-icon-button>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.ts b/chromium/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.ts
index cd3d26af846..93b4e457176 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.ts
@@ -10,7 +10,7 @@
* page (somewhat like an HTML link).
*/
import '../cr_actionable_row_style.m.js';
-import '../cr_icon_button/cr_icon_button.m.js';
+import '../cr_icon_button/cr_icon_button.js';
import '../hidden_style_css.m.js';
import '../icons.m.js';
import '../shared_style_css.m.js';
@@ -19,7 +19,7 @@ import '//resources/polymer/v3_0/iron-icon/iron-icon.js';
import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CrIconButtonElement} from '../cr_icon_button/cr_icon_button.m.js';
+import {CrIconButtonElement} from '../cr_icon_button/cr_icon_button.js';
import {getTemplate} from './cr_link_row.html.js';
diff --git a/chromium/ui/webui/resources/cr_elements/cr_lottie/cr_lottie.js b/chromium/ui/webui/resources/cr_elements/cr_lottie/cr_lottie.js
index 0e35c779175..53a10561d15 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_lottie/cr_lottie.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_lottie/cr_lottie.js
@@ -209,7 +209,7 @@ Polymer({
const clientRect = canvasElement.getBoundingClientRect();
const drawSize = {
width: clientRect.width * devicePixelRatio,
- height: clientRect.height * devicePixelRatio
+ height: clientRect.height * devicePixelRatio,
};
return drawSize;
},
@@ -289,7 +289,7 @@ Polymer({
const message = [{
animationData,
drawSize: this.getCanvasDrawBufferSize_(),
- params: {loop: !this.singleLoop, autoplay: this.autoplay}
+ params: {loop: !this.singleLoop, autoplay: this.autoplay},
}];
if (!this.hasTransferredCanvas_) {
message[0].canvas = this.offscreenCanvas_;
diff --git a/chromium/ui/webui/resources/cr_elements/cr_lottie/cr_lottie.m.d.ts b/chromium/ui/webui/resources/cr_elements/cr_lottie/cr_lottie.m.d.ts
index b71df126dca..6f8ede83a35 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_lottie/cr_lottie.m.d.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_lottie/cr_lottie.m.d.ts
@@ -9,10 +9,12 @@ export const LOTTIE_JS_URL: string;
interface CrLottieElement extends LegacyElementMixin, HTMLElement {
animationUrl: string;
autoplay: boolean;
+ setPlay(shouldPlay: boolean): void;
+ singleLoop: boolean;
+
$: {
canvas: HTMLCanvasElement,
};
- setPlay(shouldPlay: boolean): void;
}
export {CrLottieElement};
diff --git a/chromium/ui/webui/resources/cr_elements/cr_menu_selector/cr_menu_selector.ts b/chromium/ui/webui/resources/cr_elements/cr_menu_selector/cr_menu_selector.ts
index 5a5fbadb5f5..d5e028ac203 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_menu_selector/cr_menu_selector.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_menu_selector/cr_menu_selector.ts
@@ -24,7 +24,7 @@ export class CrMenuSelector extends HTMLElement {
this.setAttribute('role', 'menu');
}
- private getItems_(): Array<HTMLElement> {
+ private getItems_(): HTMLElement[] {
return Array.from(
this.querySelectorAll('[role=menuitem]:not([disabled]):not([hidden])'));
}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.ts b/chromium/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.ts
index 232b02de781..2ec1bb07a9f 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.ts
@@ -7,7 +7,7 @@
* profile avatar icons and allows an avatar to be selected.
*/
-import '../cr_button/cr_button.m.js';
+import '../cr_button/cr_button.js';
import '../shared_vars_css.m.js';
import '../shared_style_css.m.js';
import '//resources/polymer/v3_0/paper-styles/color.js';
@@ -20,13 +20,13 @@ import {getImage} from '../../js/icon.js';
import {getTemplate} from './cr_profile_avatar_selector.html.js';
-export type AvatarIcon = {
- url: string,
- label: string,
- index: number,
- isGaiaAvatar: boolean,
- selected: boolean,
-};
+export interface AvatarIcon {
+ url: string;
+ label: string;
+ index: number;
+ isGaiaAvatar: boolean;
+ selected: boolean;
+}
export class CrProfileAvatarSelectorElement extends PolymerElement {
static get is() {
@@ -46,7 +46,7 @@ export class CrProfileAvatarSelectorElement extends PolymerElement {
type: Array,
value() {
return [];
- }
+ },
},
/**
diff --git a/chromium/ui/webui/resources/cr_elements/cr_radio_button/BUILD.gn b/chromium/ui/webui/resources/cr_elements/cr_radio_button/BUILD.gn
index 66890945890..2a2d6dff495 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_radio_button/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_elements/cr_radio_button/BUILD.gn
@@ -3,98 +3,39 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-import("../../tools/js_modulizer.gni")
+import("//tools/polymer/html_to_js.gni")
-js_type_check("closure_compile") {
- uses_legacy_modules = true
- deps = [
- ":cr_card_radio_button",
- ":cr_radio_button",
- ]
-}
-
-js_library("cr_radio_button") {
- deps = [ ":cr_radio_button_behavior" ]
-}
-
-js_library("cr_card_radio_button") {
- deps = [
- ":cr_radio_button_behavior",
- "//third_party/polymer/v1_0/components-chromium/iron-icon:iron-icon-extracted",
+html_to_js("web_components") {
+ js_files = [
+ "cr_radio_button.js",
+ "cr_card_radio_button.js",
]
}
-js_library("cr_radio_button_behavior") {
- deps = [ "//third_party/polymer/v1_0/components-chromium/paper-behaviors:paper-ripple-behavior-extracted" ]
-}
-
-# Targets for auto-generating and typechecking Polymer 3 JS modules
-
-group("polymer3_elements") {
- public_deps = [
- ":cr_card_radio_button_module",
- ":cr_radio_button_module",
- ":cr_radio_button_style_css_module",
- ":modulize",
- ]
-}
-
-js_modulizer("modulize") {
- input_files = [ "cr_radio_button_behavior.js" ]
- namespace_rewrites = [ "Polymer.PaperRippleBehavior|PaperRippleBehavior" ]
-}
-
-polymer_modulizer("cr_radio_button") {
- js_file = "cr_radio_button.js"
- html_file = "cr_radio_button.html"
- html_type = "dom-module"
- auto_imports = [ "ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_behavior.html|CrRadioButtonBehavior" ]
-}
-
-polymer_modulizer("cr_card_radio_button") {
- js_file = "cr_card_radio_button.js"
- html_file = "cr_card_radio_button.html"
- html_type = "dom-module"
- auto_imports = [ "ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_behavior.html|CrRadioButtonBehavior" ]
-}
-
-polymer_modulizer("cr_radio_button_style_css") {
- js_file = "cr_radio_button_style_css.m.js"
- html_file = "cr_radio_button_style_css.html"
- html_type = "style-module"
-}
-
js_type_check("closure_compile_module") {
is_polymer3 = true
deps = [
- ":cr_card_radio_button.m",
- ":cr_radio_button.m",
- ":cr_radio_button_behavior.m",
+ ":cr_card_radio_button",
+ ":cr_radio_button",
+ ":cr_radio_button_behavior",
]
}
-js_library("cr_radio_button.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.m.js" ]
+js_library("cr_radio_button") {
deps = [
- ":cr_radio_button_behavior.m",
+ ":cr_radio_button_behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
- extra_deps = [ ":cr_radio_button_module" ]
}
-js_library("cr_card_radio_button.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.m.js" ]
+js_library("cr_card_radio_button") {
deps = [
- ":cr_radio_button_behavior.m",
+ ":cr_radio_button_behavior",
"//third_party/polymer/v3_0/components-chromium/iron-icon",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
- extra_deps = [ ":cr_card_radio_button_module" ]
}
-js_library("cr_radio_button_behavior.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_behavior.m.js" ]
+js_library("cr_radio_button_behavior") {
deps = [ "//third_party/polymer/v3_0/components-chromium/paper-behaviors:paper-ripple-behavior" ]
- extra_deps = [ ":modulize" ]
}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.m.d.ts b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.d.ts
index 5c9f2d999f8..a056728e1cb 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.m.d.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.d.ts
@@ -2,11 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import {LegacyElementMixin} from 'chrome://resources/polymer/v3_0/polymer/lib/legacy/legacy-element-mixin.js';
-import {CrRadioButtonBehavior} from './cr_radio_button_behavior.m.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-interface CrCardRadioButtonElement extends LegacyElementMixin,
- CrRadioButtonBehavior, HTMLElement {
+import {CrRadioButtonBehavior} from './cr_radio_button_behavior.js';
+
+interface CrCardRadioButtonElement extends CrRadioButtonBehavior,
+ PolymerElement {
$: {
button: HTMLElement,
};
diff --git a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.html b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.html
index 9c2a653c610..984a835f50d 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.html
@@ -1,13 +1,3 @@
-<link rel="import" href="../../html/polymer.html">
-
-<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
-<link rel="import" href="cr_radio_button_behavior.html">
-<link rel="import" href="cr_radio_button_style_css.html">
-<link rel="import" href="../icons.html">
-<link rel="import" href="../shared_vars_css.html">
-
-<dom-module id="cr-card-radio-button">
- <template>
<style include="cr-radio-button-style">
:host {
background-color: var(--cr-card-background-color);
@@ -95,6 +85,3 @@
<slot></slot>
</span>
</div>
- </template>
- <script src="cr_card_radio_button.js"></script>
-</dom-module>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.js b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.js
index 6d19ac71563..5ff8f0471c1 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.js
@@ -7,12 +7,32 @@
* 'cr-card-radio-button' is a radio button in the style of a card. A checkmark
* is displayed in the upper right hand corner if the radio button is selected.
*/
-Polymer({
- is: 'cr-card-radio-button',
+import '//resources/polymer/v3_0/iron-icon/iron-icon.js';
+import './cr_radio_button_style.css.js';
+import '../icons.m.js';
+import '../shared_vars_css.m.js';
- behaviors: [
- CrRadioButtonBehavior,
- ],
+import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
- onFocus_() {},
-});
+import {CrRadioButtonBehavior, CrRadioButtonBehaviorInterface} from './cr_radio_button_behavior.js';
+
+/**
+ * @constructor
+ * @extends {PolymerElement}
+ * @implements {CrRadioButtonBehaviorInterface}
+ */
+const CrCardRadioButtonElementBase =
+ mixinBehaviors([CrRadioButtonBehavior], PolymerElement);
+
+/** @polymer */
+export class CrCardRadioButtonElement extends CrCardRadioButtonElementBase {
+ static get is() {
+ return 'cr-card-radio-button';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+}
+
+customElements.define(CrCardRadioButtonElement.is, CrCardRadioButtonElement);
diff --git a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.m.d.ts b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.d.ts
index ca5cdeef624..2515f436158 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.m.d.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.d.ts
@@ -2,11 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import {LegacyElementMixin} from 'chrome://resources/polymer/v3_0/polymer/lib/legacy/legacy-element-mixin.js';
-import {CrRadioButtonBehavior} from './cr_radio_button_behavior.m.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-interface CrRadioButtonElement extends LegacyElementMixin,
- CrRadioButtonBehavior, HTMLElement {
+import {CrRadioButtonBehavior} from './cr_radio_button_behavior.js';
+
+interface CrRadioButtonElement extends CrRadioButtonBehavior, PolymerElement {
$: {
button: HTMLElement,
};
diff --git a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.html b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.html
index 9c1ffe959a0..e792dbcfa59 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.html
@@ -1,13 +1,3 @@
-<link rel="import" href="../../html/polymer.html">
-
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html">
-<link rel="import" href="../hidden_style_css.html">
-<link rel="import" href="../shared_vars_css.html">
-<link rel="import" href="cr_radio_button_behavior.html">
-<link rel="import" href="cr_radio_button_style_css.html">
-
-<dom-module id="cr-radio-button">
- <template>
<style include="cr-radio-button-style cr-hidden-style"></style>
<div aria-checked$="[[getAriaChecked_(checked)]]"
@@ -29,6 +19,3 @@
<slot></slot>
</span>
</div>
- </template>
- <script src="cr_radio_button.js"></script>
-</dom-module>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.js b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.js
index 3af06db4622..960a6766649 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.js
@@ -2,10 +2,32 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-Polymer({
- is: 'cr-radio-button',
+import '//resources/polymer/v3_0/paper-styles/color.js';
+import '../hidden_style_css.m.js';
+import '../shared_vars_css.m.js';
+import './cr_radio_button_style.css.js';
- behaviors: [
- CrRadioButtonBehavior,
- ],
-});
+import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {CrRadioButtonBehavior, CrRadioButtonBehaviorInterface} from './cr_radio_button_behavior.js';
+
+/**
+ * @constructor
+ * @extends {PolymerElement}
+ * @implements {CrRadioButtonBehaviorInterface}
+ */
+const CrRadioButtonElementBase =
+ mixinBehaviors([CrRadioButtonBehavior], PolymerElement);
+
+/** @polymer */
+export class CrRadioButtonElement extends CrRadioButtonElementBase {
+ static get is() {
+ return 'cr-radio-button';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+}
+
+customElements.define(CrRadioButtonElement.is, CrRadioButtonElement);
diff --git a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_behavior.m.d.ts b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_behavior.d.ts
index 850f2e10930..850f2e10930 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_behavior.m.d.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_behavior.d.ts
diff --git a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_behavior.js b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_behavior.js
index 06291a8c108..20105f0117a 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_behavior.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_behavior.js
@@ -7,7 +7,7 @@
*/
// clang-format off
-// #import {PaperRippleBehavior} from 'chrome://resources/polymer/v3_0/paper-behaviors/paper-ripple-behavior.js'
+import {PaperRippleBehavior} from 'chrome://resources/polymer/v3_0/paper-behaviors/paper-ripple-behavior.js';
// clang-format on
/** @polymerBehavior */
@@ -130,7 +130,7 @@ const CrRadioButtonBehaviorImpl = {
// customize the element's ripple
_createRipple() {
this._rippleContainer = this.$$('.disc-wrapper');
- const ripple = Polymer.PaperRippleBehavior._createRipple();
+ const ripple = PaperRippleBehavior._createRipple();
ripple.id = 'ink';
ripple.setAttribute('recenters', '');
ripple.classList.add('circle', 'toggle-ink');
@@ -140,13 +140,13 @@ const CrRadioButtonBehaviorImpl = {
/** @polymerBehavior */
-/* #export */ const CrRadioButtonBehavior = [
- Polymer.PaperRippleBehavior,
+export const CrRadioButtonBehavior = [
+ PaperRippleBehavior,
CrRadioButtonBehaviorImpl,
];
/** @interface */
-/* #export */ class CrRadioButtonBehaviorInterface {
+export class CrRadioButtonBehaviorInterface {
constructor() {
/** @type {boolean} */
this.checked;
@@ -158,5 +158,3 @@ const CrRadioButtonBehaviorImpl = {
/** @return {!PaperRippleElement} */
getRipple() {}
}
-
-/* #ignore */ console.warn('crbug/1173575, non-JS module files deprecated.');
diff --git a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_style_css.html b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_style.css
index a3fdf64cbb0..56c2e182081 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_style_css.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_style.css
@@ -1,12 +1,15 @@
-<link rel="import" href="../../html/polymer.html">
+/* 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. */
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html">
-<link rel="import" href="../shared_vars_css.html">
+/* #css_wrapper_metadata_start
+ * #type=style
+ * #import=../shared_vars_css.m.js
+ * #import=../shared_vars_css.m.js
+ * #css_wrapper_metadata_end */
-<!-- Common radio-button styling for Material Design WebUI. -->
-<dom-module id="cr-radio-button-style">
- <template>
- <style>
+
+/* Common radio-button styling for Material Design WebUI. */
:host {
--cr-radio-button-checked-color: var(--google-blue-600);
--cr-radio-button-checked-ripple-color:
@@ -122,6 +125,3 @@
:host([checked]) paper-ripple {
color: var(--cr-radio-button-checked-ripple-color);
}
- </style>
- </template>
-</dom-module>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_radio_group/BUILD.gn b/chromium/ui/webui/resources/cr_elements/cr_radio_group/BUILD.gn
deleted file mode 100644
index b1805b291b7..00000000000
--- a/chromium/ui/webui/resources/cr_elements/cr_radio_group/BUILD.gn
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-
-js_type_check("closure_compile") {
- uses_legacy_modules = true
- deps = [ ":cr_radio_group" ]
-}
-
-js_library("cr_radio_group") {
- deps = [
- "//ui/webui/resources/cr_elements/cr_radio_button:cr_radio_button",
- "//ui/webui/resources/js:event_tracker",
- ]
-}
-
-# Targets for auto-generating and typechecking Polymer 3 JS modules
-
-polymer_modulizer("cr_radio_group") {
- js_file = "cr_radio_group.js"
- html_file = "cr_radio_group.html"
- html_type = "dom-module"
- auto_imports = [
- "ui/webui/resources/html/event_tracker.html|EventTracker",
- "ui/webui/resources/html/polymer.html|Polymer,html,dom",
- ]
- namespace_rewrites = [ "Polymer.dom|dom" ]
-}
-
-js_type_check("closure_compile_module") {
- is_polymer3 = true
- deps = [ ":cr_radio_group.m" ]
-}
-
-js_library("cr_radio_group.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.m.js" ]
- deps = [
- "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
- "//ui/webui/resources/cr_elements/cr_radio_button:cr_radio_button.m",
- "//ui/webui/resources/js:event_tracker.m",
- ]
- extra_deps = [ ":cr_radio_group_module" ]
-}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.m.d.ts b/chromium/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.d.ts
index ae5836f3b65..ae5836f3b65 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.m.d.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.d.ts
diff --git a/chromium/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.html b/chromium/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.html
index 0e4996e4a86..63c43aa942b 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.html
@@ -1,11 +1,3 @@
-<link rel="import" href="../../html/polymer.html">
-
-<link rel="import" href="../../html/event_tracker.html">
-<link rel="import" href="../cr_radio_button/cr_radio_button.html">
-<link rel="import" href="../shared_vars_css.html">
-
-<dom-module id="cr-radio-group">
- <template>
<style>
:host {
display: inline-block;
@@ -26,6 +18,3 @@
}
</style>
<slot></slot>
- </template>
- <script src="cr_radio_group.js"></script>
-</dom-module>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.js b/chromium/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.js
deleted file mode 100644
index 5b5bdfe327c..00000000000
--- a/chromium/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.js
+++ /dev/null
@@ -1,282 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-(() => {
-
- /**
- * @param {!Element} radio
- * @return {boolean}
- */
- function isEnabled(radio) {
- return radio.matches(':not([disabled]):not([hidden])') &&
- radio.style.display !== 'none' && radio.style.visibility !== 'hidden';
- }
-
- Polymer({
- is: 'cr-radio-group',
-
- properties: {
- disabled: {
- type: Boolean,
- value: false,
- reflectToAttribute: true,
- observer: 'update_',
- },
-
- selected: {
- type: String,
- notify: true,
- observer: 'update_',
- },
-
- selectableElements: {
- type: String,
- value: 'cr-radio-button, cr-card-radio-button, controlled-radio-button',
- },
-
- /**
- * @type {!RegExp}
- * @private
- */
- selectableRegExp_: {
- value: Object,
- computed: 'computeSelectableRegExp_(selectableElements)',
- },
- },
-
- listeners: {
- keydown: 'onKeyDown_',
- click: 'onClick_',
- },
-
- hostAttributes: {
- 'aria-disabled': 'false',
- role: 'radiogroup',
- },
-
- /** @private {Array<!CrRadioButtonElement>} */
- buttons_: null,
-
- /** @private {cr.EventTracker} */
- buttonEventTracker_: null,
-
- /** @private {Map<string, number>} */
- deltaKeyMap_: null,
-
- /** @private {boolean} */
- isRtl_: false,
-
- /** @private {PolymerDomApi.ObserveHandle} */
- observer_: null,
-
- /** @private {Function} */
- populateBound_: null,
-
- /** @override */
- attached() {
- this.isRtl_ = this.matches(':host-context([dir=rtl]) cr-radio-group');
- this.deltaKeyMap_ = new Map([
- ['ArrowDown', 1],
- ['ArrowLeft', this.isRtl_ ? 1 : -1],
- ['ArrowRight', this.isRtl_ ? -1 : 1],
- ['ArrowUp', -1],
- ['PageDown', 1],
- ['PageUp', -1],
- ]);
- this.buttonEventTracker_ = new cr.EventTracker();
-
- this.populateBound_ = () => this.populate_();
- // Needed for when the radio buttons change when using dom-repeat or
- // dom-if.
- // TODO(crbug.com/738611): After migration to Polymer 2, remove Polymer 1
- // references.
- if (Polymer.DomIf) {
- this.$$('slot').addEventListener('slotchange', this.populateBound_);
- } else {
- this.observer_ = Polymer.dom(this).observeNodes(this.populateBound_);
- }
-
- this.populate_();
- },
-
- /** @override */
- detached() {
- if (Polymer.DomIf) {
- this.$$('slot').removeEventListener('slotchange', this.populateBound_);
- } else if (this.observer_) {
- Polymer.dom(this).unobserveNodes(
- /** @type {!PolymerDomApi.ObserveHandle} */ (this.observer_));
- }
- this.buttonEventTracker_.removeAll();
- },
-
- /** @override */
- focus() {
- if (this.disabled || !this.buttons_) {
- return;
- }
-
- const radio =
- this.buttons_.find(radio => this.isButtonEnabledAndSelected_(radio));
- if (radio) {
- radio.focus();
- }
- },
-
- /**
- * @param {!KeyboardEvent} event
- * @private
- */
- onKeyDown_(event) {
- if (this.disabled) {
- return;
- }
-
- if (event.ctrlKey || event.shiftKey || event.metaKey || event.altKey) {
- return;
- }
-
- const targetElement = /** @type {!CrRadioButtonElement} */ (event.target);
- if (!this.buttons_.includes(targetElement)) {
- return;
- }
-
- if (event.key === ' ' || event.key === 'Enter') {
- event.preventDefault();
- this.select_(/** @type {!CrRadioButtonElement} */ (event.target));
- return;
- }
-
- const enabledRadios = this.buttons_.filter(isEnabled);
- if (enabledRadios.length === 0) {
- return;
- }
-
- let selectedIndex;
- const max = enabledRadios.length - 1;
- if (event.key === 'Home') {
- selectedIndex = 0;
- } else if (event.key === 'End') {
- selectedIndex = max;
- } else if (this.deltaKeyMap_.has(event.key)) {
- const delta = this.deltaKeyMap_.get(event.key);
- // If nothing selected, start from the first radio then add |delta|.
- const lastSelection = enabledRadios.findIndex(radio => radio.checked);
- selectedIndex = Math.max(0, lastSelection) + delta;
- // Wrap the selection, if needed.
- if (selectedIndex > max) {
- selectedIndex = 0;
- } else if (selectedIndex < 0) {
- selectedIndex = max;
- }
- } else {
- return;
- }
-
- const radio = enabledRadios[selectedIndex];
- const name = `${radio.name}`;
- if (this.selected !== name) {
- event.preventDefault();
- this.selected = name;
- radio.focus();
- }
- },
-
- /**
- * @return {!RegExp}
- * @private
- */
- computeSelectableRegExp_() {
- const tags = this.selectableElements.split(', ').join('|');
- return new RegExp(`^(${tags})$`, 'i');
- },
-
- /**
- * @param {!Event} event
- * @private
- */
- onClick_(event) {
- const path = event.composedPath();
- if (path.some(target => /^a$/i.test(target.tagName))) {
- return;
- }
- const target = /** @type {!CrRadioButtonElement} */ (
- path.find(n => this.selectableRegExp_.test(n.tagName)));
- if (target && this.buttons_.includes(target)) {
- this.select_(/** @type {!CrRadioButtonElement} */ (target));
- }
- },
-
- /** @private */
- populate_() {
- // TODO(crbug.com/738611): After migration to Polymer 2, remove
- // Polymer 1 references.
- this.buttons_ = Polymer.DomIf ?
- this.$$('slot')
- .assignedNodes({flatten: true})
- .filter(n => this.selectableRegExp_.test(n.tagName)) :
- this.queryAllEffectiveChildren(this.selectableElements);
- this.buttonEventTracker_.removeAll();
- this.buttons_.forEach(el => {
- this.buttonEventTracker_.add(
- el, 'disabled-changed', () => this.populate_());
- this.buttonEventTracker_.add(
- el, 'name-changed', () => this.populate_());
- });
- this.update_();
- },
-
- /**
- * @param {!CrRadioButtonElement} button
- * @private
- */
- select_(button) {
- if (!isEnabled(button)) {
- return;
- }
-
- const name = `${button.name}`;
- if (this.selected !== name) {
- this.selected = name;
- }
- },
-
- /**
- * @param {!Element} button
- * @return {boolean}
- * @private
- */
- isButtonEnabledAndSelected_(button) {
- return !this.disabled && button.checked && isEnabled(button);
- },
-
- /** @private */
- update_() {
- if (!this.buttons_) {
- return;
- }
- let noneMadeFocusable = true;
- this.buttons_.forEach(radio => {
- radio.checked = this.selected !== undefined &&
- `${radio.name}` === `${this.selected}`;
- const disabled = this.disabled || !isEnabled(radio);
- const canBeFocused = radio.checked && !disabled;
- if (canBeFocused) {
- radio.focusable = true;
- noneMadeFocusable = false;
- } else {
- radio.focusable = false;
- }
- radio.setAttribute('aria-disabled', `${disabled}`);
- });
- this.setAttribute('aria-disabled', `${this.disabled}`);
- if (noneMadeFocusable && !this.disabled) {
- const radio = this.buttons_.find(isEnabled);
- if (radio) {
- radio.focusable = true;
- }
- }
- },
- });
-})();
diff --git a/chromium/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.ts b/chromium/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.ts
new file mode 100644
index 00000000000..e392ed85cb5
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.ts
@@ -0,0 +1,264 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import '../cr_radio_button/cr_radio_button.js';
+import '../shared_vars_css.m.js';
+
+import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {assert} from '../../js/assert_ts.js';
+import {EventTracker} from '../../js/event_tracker.m.js';
+import {CrRadioButtonElement} from '../cr_radio_button/cr_radio_button.js';
+
+import {getTemplate} from './cr_radio_group.html.js';
+
+function isEnabled(radio: HTMLElement): boolean {
+ return radio.matches(':not([disabled]):not([hidden])') &&
+ radio.style.display !== 'none' && radio.style.visibility !== 'hidden';
+}
+
+export class CrRadioGroupElement extends PolymerElement {
+ static get is() {
+ return 'cr-radio-group';
+ }
+
+ static get template() {
+ return getTemplate();
+ }
+
+ static get properties() {
+ return {
+ disabled: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true,
+ observer: 'update_',
+ },
+
+ selected: {
+ type: String,
+ notify: true,
+ observer: 'update_',
+ },
+
+ selectableElements: {
+ type: String,
+ value: 'cr-radio-button, cr-card-radio-button, controlled-radio-button',
+ },
+
+ selectableRegExp_: {
+ value: Object,
+ computed: 'computeSelectableRegExp_(selectableElements)',
+ },
+ };
+ }
+
+ disabled: boolean;
+ selected: string;
+ selectableElements: string;
+ private selectableRegExp_: RegExp;
+
+ private buttons_: CrRadioButtonElement[]|null = null;
+ private buttonEventTracker_: EventTracker|null = null;
+ private deltaKeyMap_: Map<string, number>|null = null;
+ private isRtl_: boolean = false;
+ private populateBound_: (() => void)|null = null;
+
+ override ready() {
+ super.ready();
+ this.addEventListener(
+ 'keydown', e => this.onKeyDown_(/** @type {!KeyboardEvent} */ (e)));
+ this.addEventListener('click', this.onClick_.bind(this));
+
+ if (!this.hasAttribute('role')) {
+ this.setAttribute('role', 'radiogroup');
+ }
+ this.setAttribute('aria-disabled', 'false');
+ }
+
+ override connectedCallback() {
+ super.connectedCallback();
+ this.isRtl_ = this.matches(':host-context([dir=rtl]) cr-radio-group');
+ this.deltaKeyMap_ = new Map([
+ ['ArrowDown', 1],
+ ['ArrowLeft', this.isRtl_ ? 1 : -1],
+ ['ArrowRight', this.isRtl_ ? -1 : 1],
+ ['ArrowUp', -1],
+ ['PageDown', 1],
+ ['PageUp', -1],
+ ]);
+ this.buttonEventTracker_ = new EventTracker();
+
+ this.populateBound_ = () => this.populate_();
+ assert(this.populateBound_);
+ this.shadowRoot!.querySelector('slot')!.addEventListener(
+ 'slotchange', this.populateBound_);
+
+ this.populate_();
+ }
+
+ override disconnectedCallback() {
+ super.disconnectedCallback();
+ assert(this.populateBound_);
+ this.shadowRoot!.querySelector('slot')!.removeEventListener(
+ 'slotchange', this.populateBound_);
+ assert(this.buttonEventTracker_);
+ this.buttonEventTracker_.removeAll();
+ }
+
+ override focus() {
+ if (this.disabled || !this.buttons_) {
+ return;
+ }
+
+ const radio =
+ this.buttons_.find(radio => this.isButtonEnabledAndSelected_(radio));
+ if (radio) {
+ radio.focus();
+ }
+ }
+
+ private onKeyDown_(event: KeyboardEvent) {
+ if (this.disabled) {
+ return;
+ }
+
+ if (event.ctrlKey || event.shiftKey || event.metaKey || event.altKey) {
+ return;
+ }
+
+ const targetElement = event.target as CrRadioButtonElement;
+ if (!this.buttons_ || !this.buttons_.includes(targetElement)) {
+ return;
+ }
+
+ if (event.key === ' ' || event.key === 'Enter') {
+ event.preventDefault();
+ this.select_(targetElement);
+ return;
+ }
+
+ const enabledRadios = this.buttons_.filter(isEnabled);
+ if (enabledRadios.length === 0) {
+ return;
+ }
+
+ assert(this.deltaKeyMap_);
+ let selectedIndex;
+ const max = enabledRadios.length - 1;
+ if (event.key === 'Home') {
+ selectedIndex = 0;
+ } else if (event.key === 'End') {
+ selectedIndex = max;
+ } else if (this.deltaKeyMap_.has(event.key)) {
+ const delta = this.deltaKeyMap_.get(event.key)!;
+ // If nothing selected, start from the first radio then add |delta|.
+ const lastSelection = enabledRadios.findIndex(radio => radio.checked);
+ selectedIndex = Math.max(0, lastSelection) + delta;
+ // Wrap the selection, if needed.
+ if (selectedIndex > max) {
+ selectedIndex = 0;
+ } else if (selectedIndex < 0) {
+ selectedIndex = max;
+ }
+ } else {
+ return;
+ }
+
+ const radio = enabledRadios[selectedIndex]!;
+ const name = `${radio.name}`;
+ if (this.selected !== name) {
+ event.preventDefault();
+ this.selected = name;
+ radio.focus();
+ }
+ }
+
+ private computeSelectableRegExp_(): RegExp {
+ const tags = this.selectableElements.split(', ').join('|');
+ return new RegExp(`^(${tags})$`, 'i');
+ }
+
+ private onClick_(event: Event) {
+ const path = event.composedPath();
+ if (path.some(target => /^a$/i.test((target as HTMLElement).tagName))) {
+ return;
+ }
+ const target =
+ path.find(
+ n => this.selectableRegExp_.test((n as HTMLElement).tagName)) as
+ CrRadioButtonElement;
+ if (target && this.buttons_ && this.buttons_.includes(target)) {
+ this.select_(target);
+ }
+ }
+
+ private populate_() {
+ const nodes =
+ this.shadowRoot!.querySelector('slot')!.assignedNodes({flatten: true});
+ this.buttons_ =
+ Array.from(nodes).filter(
+ node => node.nodeType === Node.ELEMENT_NODE &&
+ (node as HTMLElement).matches(this.selectableElements)) as
+ CrRadioButtonElement[];
+ assert(this.buttonEventTracker_);
+ this.buttonEventTracker_.removeAll();
+ this.buttons_!.forEach(el => {
+ this.buttonEventTracker_!.add(
+ el, 'disabled-changed', () => this.populate_());
+ this.buttonEventTracker_!.add(el, 'name-changed', () => this.populate_());
+ });
+ this.update_();
+ }
+
+ private select_(button: CrRadioButtonElement) {
+ if (!isEnabled(button)) {
+ return;
+ }
+
+ const name = `${button.name}`;
+ if (this.selected !== name) {
+ this.selected = name;
+ }
+ }
+
+ private isButtonEnabledAndSelected_(button: CrRadioButtonElement): boolean {
+ return !this.disabled && button.checked && isEnabled(button);
+ }
+
+ private update_() {
+ if (!this.buttons_) {
+ return;
+ }
+ let noneMadeFocusable = true;
+ this.buttons_.forEach(radio => {
+ radio.checked =
+ this.selected !== undefined && `${radio.name}` === `${this.selected}`;
+ const disabled = this.disabled || !isEnabled(radio);
+ const canBeFocused = radio.checked && !disabled;
+ if (canBeFocused) {
+ radio.focusable = true;
+ noneMadeFocusable = false;
+ } else {
+ radio.focusable = false;
+ }
+ radio.setAttribute('aria-disabled', `${disabled}`);
+ });
+ this.setAttribute('aria-disabled', `${this.disabled}`);
+ if (noneMadeFocusable && !this.disabled) {
+ const radio = this.buttons_.find(isEnabled);
+ if (radio) {
+ radio.focusable = true;
+ }
+ }
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ 'cr-radio-group': CrRadioGroupElement;
+ }
+}
+
+customElements.define(CrRadioGroupElement.is, CrRadioGroupElement);
diff --git a/chromium/ui/webui/resources/cr_elements/cr_search_field/cr_search_field.ts b/chromium/ui/webui/resources/cr_elements/cr_search_field/cr_search_field.ts
index c22429b4c87..241a5a86cc1 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_search_field/cr_search_field.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_search_field/cr_search_field.ts
@@ -8,9 +8,9 @@
* uses CrSearchFieldMixin.
*/
-import '../cr_icon_button/cr_icon_button.m.js';
-import '../cr_input/cr_input.m.js';
-import '../cr_input/cr_input_style_css.m.js';
+import '../cr_icon_button/cr_icon_button.js';
+import '../cr_input/cr_input.js';
+import '../cr_input/cr_input_style.css.js';
import '../icons.m.js';
import '../shared_style_css.m.js';
import '../shared_vars_css.m.js';
@@ -18,7 +18,7 @@ import '//resources/polymer/v3_0/iron-icon/iron-icon.js';
import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CrInputElement} from '../cr_input/cr_input.m.js';
+import {CrInputElement} from '../cr_input/cr_input.js';
import {getTemplate} from './cr_search_field.html.js';
import {CrSearchFieldMixin} from './cr_search_field_mixin.js';
diff --git a/chromium/ui/webui/resources/cr_elements/cr_search_field/cr_search_field_mixin.ts b/chromium/ui/webui/resources/cr_elements/cr_search_field/cr_search_field_mixin.ts
index feb5f5d5a1f..aab318fbd6c 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_search_field/cr_search_field_mixin.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_search_field/cr_search_field_mixin.ts
@@ -6,7 +6,7 @@
* Helper functions for implementing an incremental search field. See
* <settings-subpage-search> for a simple implementation.
*/
-import {CrInputElement} from 'chrome://resources/cr_elements/cr_input/cr_input.m.js';
+import {CrInputElement} from 'chrome://resources/cr_elements/cr_input/cr_input.js';
import {assertNotReached} from 'chrome://resources/js/assert_ts.js';
import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chromium/ui/webui/resources/cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.ts b/chromium/ui/webui/resources/cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.ts
index 21c9a365d67..1bfd96c7949 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.ts
@@ -14,7 +14,7 @@
* dropdown matches the previously saved dropdown value. This property can be
* used to disable certain user actions when the dropdown is invalid.
*/
-import '../cr_input/cr_input.m.js';
+import '../cr_input/cr_input.js';
import '../hidden_style_css.m.js';
import '../icons.m.js';
import '../shared_style_css.m.js';
@@ -26,7 +26,7 @@ import '//resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js';
import {IronDropdownElement} from '//resources/polymer/v3_0/iron-dropdown/iron-dropdown.js';
import {DomRepeatEvent, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CrInputElement} from '../cr_input/cr_input.m.js';
+import {CrInputElement} from '../cr_input/cr_input.js';
import {getTemplate} from './cr_searchable_drop_down.html.js';
diff --git a/chromium/ui/webui/resources/cr_elements/cr_slider/cr_slider.ts b/chromium/ui/webui/resources/cr_elements/cr_slider/cr_slider.ts
index 7be408902ed..ab7cd7b1f37 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_slider/cr_slider.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_slider/cr_slider.ts
@@ -25,11 +25,11 @@ import {getTemplate} from './cr_slider.html.js';
* aria-valuemax, and aria-valuenow, and is optional. If missing, |value| will
* be used instead.
*/
-export type SliderTick = {
- value: number,
- label: string,
- ariaValue?: number,
-};
+export interface SliderTick {
+ value: number;
+ label: string;
+ ariaValue?: number;
+}
function clamp(min: number, max: number, value: number): number {
return Math.min(max, Math.max(min, value));
@@ -194,7 +194,7 @@ export class CrSliderElement extends CrSliderElementBase {
min: number;
noKeybindings: boolean;
snaps: boolean;
- ticks: Array<SliderTick>|Array<number>;
+ ticks: SliderTick[]|number[];
value: number;
private disabled_: boolean;
@@ -461,6 +461,8 @@ export class CrSliderElement extends CrSliderElementBase {
}
}
+ // Overridden from PaperRippleBehavior
+ /* eslint-disable-next-line @typescript-eslint/naming-convention */
override _createRipple() {
this._rippleContainer = this.$.knob;
const ripple = super._createRipple();
diff --git a/chromium/ui/webui/resources/cr_elements/cr_splitter/cr_splitter.ts b/chromium/ui/webui/resources/cr_elements/cr_splitter/cr_splitter.ts
index 7b2ae6ab7e6..b1785b44b77 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_splitter/cr_splitter.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_splitter/cr_splitter.ts
@@ -3,41 +3,28 @@
// found in the LICENSE file.
import {assert} from 'chrome://resources/js/assert_ts.js';
-import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-export class CrSplitterElement extends PolymerElement {
+export class CrSplitterElement extends HTMLElement {
static get is() {
return 'cr-splitter';
}
- static get template() {
- return null;
- }
-
- static get properties() {
- return {
- resizeNextElement: Boolean,
- };
- }
-
private handlers_: Map<string, (e: any) => void>|null = null;
private startX_: number = 0;
private startWidth_: number = -1;
resizeNextElement: boolean = false;
- override ready() {
- super.ready();
+ constructor() {
+ super();
this.addEventListener('mousedown', e => this.onMouseDown_(e));
this.addEventListener('touchstart', e => this.onTouchStart_(e));
}
- override connectedCallback() {
- super.connectedCallback();
+ connectedCallback() {
this.handlers_ = new Map();
}
- override disconnectedCallback() {
- super.disconnectedCallback();
+ disconnectedCallback() {
this.removeAllHandlers_();
this.handlers_ = null;
}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_tab_box/cr_tab_box.html b/chromium/ui/webui/resources/cr_elements/cr_tab_box/cr_tab_box.html
index b3a81f7867d..8159c431b75 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_tab_box/cr_tab_box.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_tab_box/cr_tab_box.html
@@ -2,6 +2,7 @@
:host {
display: flex;
flex-direction: column;
+ width: fit-content;
--tabs-background-color: #fbfbfb;
--tabs-border-color: #c8c8c8;
--tabs-hover-text-color: black;
@@ -31,7 +32,6 @@
cursor: default;
display: block;
margin-inline-start: 0;
- min-width: 0;
padding: 4px 9px 4px 10px;
text-align: center;
transition: none;
diff --git a/chromium/ui/webui/resources/cr_elements/cr_tab_box/cr_tab_box.ts b/chromium/ui/webui/resources/cr_elements/cr_tab_box/cr_tab_box.ts
index 1d92acf8878..956b0832199 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_tab_box/cr_tab_box.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_tab_box/cr_tab_box.ts
@@ -8,6 +8,12 @@ import {CustomElement} from '../../js/custom_element.js';
import {getTemplate} from './cr_tab_box.html.js';
+declare global {
+ interface HTMLElementEventMap {
+ 'selected-index-change': CustomEvent<number>;
+ }
+}
+
export class CrTabBoxElement extends CustomElement {
static override get template() {
return getTemplate();
diff --git a/chromium/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.html b/chromium/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.html
index c8158dae52c..0d7b18060f0 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.html
@@ -17,19 +17,16 @@
height: 100%;
justify-content: center;
opacity: .8;
+ outline: none;
padding: 0 var(--cr-tabs-tab-inline-padding, 0);
position: relative;
transition: opacity 100ms cubic-bezier(.4, 0, 1, 1);
}
- .tab:focus-visible:focus {
+ :host-context(.focus-outline-visible) .tab:focus {
outline: var(--cr-tabs-focus-outline, auto);
}
- :host(:not(.keyboard-focus)) .tab {
- outline: none;
- }
-
.selected {
color: var(--cr-tabs-selected-color, var(--google-blue-600));
opacity: 1;
@@ -99,6 +96,12 @@
background: var(--cr-tabs-selected-color, var(--google-blue-300));
}
}
+
+ @media (forced-colors: active) {
+ .tab-indicator {
+ background: SelectedItem;
+ }
+ }
</style>
<template is="dom-repeat" items="[[tabNames]]">
<div
diff --git a/chromium/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.ts b/chromium/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.ts
index 4480c444881..554c0a57de2 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.ts
@@ -75,7 +75,6 @@ export class CrTabsElement extends PolymerElement {
this.setAttribute('role', 'tablist');
this.addEventListener('keydown', this.onKeyDown_.bind(this));
- this.addEventListener('mousedown', this.onMouseDown_);
}
private getAriaSelected_(index: number): string {
@@ -126,12 +125,7 @@ export class CrTabsElement extends PolymerElement {
this.updateIndicator_(newIndicator, newTabRect, leftmostEdge, fullWidth);
}
- private onMouseDown_() {
- this.classList.remove('keyboard-focus');
- }
-
private onKeyDown_(e: KeyboardEvent) {
- this.classList.add('keyboard-focus');
const count = this.tabNames.length;
let newSelection;
if (e.key === 'Home') {
diff --git a/chromium/ui/webui/resources/cr_elements/cr_toggle/BUILD.gn b/chromium/ui/webui/resources/cr_elements/cr_toggle/BUILD.gn
index fa5439ec42d..1edd072fc22 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_toggle/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_elements/cr_toggle/BUILD.gn
@@ -3,35 +3,20 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
+import("//tools/polymer/html_to_js.gni")
-js_type_check("closure_compile") {
- uses_legacy_modules = true
- deps = [ ":cr_toggle" ]
-}
-
-js_library("cr_toggle") {
- deps = [ "//third_party/polymer/v1_0/components-chromium/paper-behaviors:paper-ripple-behavior-extracted" ]
-}
-
-polymer_modulizer("cr_toggle") {
- js_file = "cr_toggle.js"
- html_file = "cr_toggle.html"
- html_type = "dom-module"
+html_to_js("web_components") {
+ js_files = [ "cr_toggle.js" ]
}
js_type_check("closure_compile_module") {
is_polymer3 = true
- deps = [ ":cr_toggle.m" ]
+ deps = [ ":cr_toggle" ]
}
-js_library("cr_toggle.m") {
- sources = [
- "$root_gen_dir/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.m.js",
- ]
+js_library("cr_toggle") {
deps = [
"//third_party/polymer/v3_0/components-chromium/paper-behaviors:paper-ripple-behavior",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
- extra_deps = [ ":cr_toggle_module" ]
}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.m.d.ts b/chromium/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.d.ts
index 18cd9222323..18cd9222323 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.m.d.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.d.ts
diff --git a/chromium/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html b/chromium/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html
index 41e0f424ac4..18ad7dad9d6 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html
@@ -1,10 +1,3 @@
-<link rel="import" href="../../html/polymer.html">
-
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-behaviors/paper-ripple-behavior.html">
-<link rel="import" href="../shared_vars_css.html">
-
-<dom-module id="cr-toggle">
- <template>
<style>
:host {
--cr-toggle-checked-bar-color: var(--google-blue-600);
@@ -24,6 +17,18 @@
width: 34px;
}
+ @media (forced-colors: active) {
+ :host {
+ /* TODO(crbug.com/1176612): cr-toggle heavily relies on
+ background-color to convey various states (on/off,
+ enabled/disabled). Until proper specs for HCM exist, turn off
+ forced-colors automatic adjustments so that the cr-toggle is at
+ least visible. Replace with a HCM compliant implementation once
+ specs exist.*/
+ forced-color-adjust: none;
+ }
+ }
+
@media (prefers-color-scheme: dark) {
:host {
--cr-toggle-checked-bar-color: var(--google-blue-300);
@@ -118,6 +123,3 @@
</style>
<span id="bar"></span>
<span id="knob"></span>
- </template>
- <script src="cr_toggle.js"></script>
-</dom-module>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.js b/chromium/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.js
index 4e8adb71550..d362cd60339 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.js
@@ -7,7 +7,7 @@
* intentional.
* @type {number}
*/
-/* #export */ const MOVE_THRESHOLD_PX = 5;
+export const MOVE_THRESHOLD_PX = 5;
/**
* @fileoverview 'cr-toggle' is a component for showing an on/off switch. It
@@ -15,66 +15,107 @@
* interaction. Besides just clicking the element, its state can be changed by
* dragging (pointerdown+pointermove) the element towards the desired direction.
*/
-Polymer({
- is: 'cr-toggle',
-
- behaviors: [Polymer.PaperRippleBehavior],
-
- properties: {
- checked: {
- type: Boolean,
- value: false,
- reflectToAttribute: true,
- observer: 'checkedChanged_',
- notify: true,
- },
-
- dark: {
- type: Boolean,
- value: false,
- reflectToAttribute: true,
- },
-
- disabled: {
- type: Boolean,
- value: false,
- reflectToAttribute: true,
- observer: 'disabledChanged_',
- },
- },
-
- hostAttributes: {
- 'aria-disabled': 'false',
- 'aria-pressed': 'false',
- role: 'button',
- tabindex: 0,
- },
-
- listeners: {
- blur: 'hideRipple_',
- click: 'onClick_',
- focus: 'onFocus_',
- keydown: 'onKeyDown_',
- keyup: 'onKeyUp_',
- pointerdown: 'onPointerDown_',
- pointerup: 'onPointerUp_',
- },
-
- /** @private {?Function} */
- boundPointerMove_: null,
+import {PaperRippleBehavior} from '//resources/polymer/v3_0/paper-behaviors/paper-ripple-behavior.js';
+import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import '../shared_vars_css.m.js';
- /**
- * Whether the state of the toggle has already taken into account by
- * |pointeremove| handlers. Used in the 'click' handler.
- * @private {boolean}
- */
- handledInPointerMove_: false,
+class PaperRippleBehaviorInterface {
+ /** @return {!PaperRippleElement} */
+ getRipple() {}
+}
+
+/**
+ * @constructor
+ * @extends {PolymerElement}
+ * @implements {PaperRippleBehaviorInterface}
+ */
+const CrToggleElementBase =
+ mixinBehaviors([PaperRippleBehavior], PolymerElement);
+
+/** @polymer */
+export class CrToggleElement extends CrToggleElementBase {
+ static get is() {
+ return 'cr-toggle';
+ }
+
+ static get template() {
+ return html`{__html_template__}`;
+ }
+
+ static get properties() {
+ return {
+ checked: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true,
+ observer: 'checkedChanged_',
+ notify: true,
+ },
+
+ dark: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true,
+ },
+
+ disabled: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true,
+ observer: 'disabledChanged_',
+ },
+ };
+ }
+
+ constructor() {
+ super();
+ /** @private {?Function} */
+ this.boundPointerMove_ = null;
+
+ /**
+ * Whether the state of the toggle has already taken into account by
+ * |pointeremove| handlers. Used in the 'click' handler.
+ * @private {boolean}
+ */
+ this.handledInPointerMove_ = false;
+
+ /** @private {?number} */
+ this.pointerDownX_ = null;
+
+ /** @type {!Element} */
+ this._rippleContainer;
+ }
+
+ /** @override */
+ ready() {
+ super.ready();
+ if (!this.hasAttribute('role')) {
+ this.setAttribute('role', 'button');
+ }
+ if (!this.hasAttribute('tabindex')) {
+ this.setAttribute('tabindex', '0');
+ }
+ this.setAttribute('aria-pressed', 'false');
+ this.setAttribute('aria-disabled', 'false');
+ }
/** @override */
- attached() {
+ connectedCallback() {
+ super.connectedCallback();
+ this.addEventListener('blur', this.hideRipple_.bind(this));
+ this.addEventListener('click', this.onClick_.bind(this));
+ this.addEventListener('focus', this.onFocus_.bind(this));
+ this.addEventListener(
+ 'keydown', e => this.onKeyDown_(/** @type {!KeyboardEvent} */ (e)));
+ this.addEventListener(
+ 'keyup', e => this.onKeyUp_(/** @type {!KeyboardEvent} */ (e)));
+ this.addEventListener(
+ 'pointerdown',
+ e => this.onPointerDown_(/** @type {!PointerEvent} */ (e)));
+ this.addEventListener('pointerup', this.onPointerUp_.bind(this));
+
const direction =
this.matches(':host-context([dir=rtl]) cr-toggle') ? -1 : 1;
-
this.boundPointerMove_ = (e) => {
// Prevent unwanted text selection to occur while moving the pointer, this
// is important.
@@ -93,34 +134,34 @@ Polymer({
this.toggleState_(/* fromKeyboard= */ false);
}
};
- },
+ }
/** @private */
checkedChanged_() {
this.setAttribute('aria-pressed', this.checked ? 'true' : 'false');
- },
+ }
/** @private */
disabledChanged_() {
this.setAttribute('tabindex', this.disabled ? -1 : 0);
this.setAttribute('aria-disabled', this.disabled ? 'true' : 'false');
- },
+ }
/** @private */
onFocus_() {
this.getRipple().showAndHoldDown();
- },
+ }
/** @private */
hideRipple_() {
this.getRipple().clear();
- },
+ }
/** @private */
onPointerUp_() {
this.removeEventListener('pointermove', this.boundPointerMove_);
this.hideRipple_();
- },
+ }
/**
* @param {!PointerEvent} e
@@ -138,7 +179,7 @@ Polymer({
this.pointerDownX_ = e.clientX;
this.handledInPointerMove_ = false;
this.addEventListener('pointermove', this.boundPointerMove_);
- },
+ }
/**
* @param {!Event} e
@@ -159,7 +200,7 @@ Polymer({
// If no pointermove event fired, then user just clicked on the
// toggle button and therefore it should be toggled.
this.toggleState_(/* fromKeyboard= */ false);
- },
+ }
/**
* @param {boolean} fromKeyboard
@@ -177,8 +218,9 @@ Polymer({
}
this.checked = !this.checked;
- this.fire('change', this.checked);
- },
+ this.dispatchEvent(new CustomEvent(
+ 'change', {bubbles: true, composed: true, detail: this.checked}));
+ }
/**
* @param {!KeyboardEvent} e
@@ -198,7 +240,7 @@ Polymer({
if (e.key === 'Enter') {
this.toggleState_(/* fromKeyboard= */ true);
}
- },
+ }
/**
* @param {!KeyboardEvent} e
@@ -215,16 +257,17 @@ Polymer({
if (e.key === ' ') {
this.toggleState_(/* fromKeyboard= */ true);
}
- },
+ }
// customize the element's ripple
_createRipple() {
this._rippleContainer = this.$.knob;
- const ripple = Polymer.PaperRippleBehavior._createRipple();
+ const ripple = PaperRippleBehavior._createRipple();
ripple.id = 'ink';
ripple.setAttribute('recenters', '');
ripple.classList.add('circle', 'toggle-ink');
return ripple;
- },
-});
-/* #ignore */ console.warn('crbug/1173575, non-JS module files deprecated.');
+ }
+}
+
+customElements.define(CrToggleElement.is, CrToggleElement);
diff --git a/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.ts b/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.ts
index 5eece9cacdb..90ea96ac3d5 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.ts
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import '../cr_icon_button/cr_icon_button.m.js';
+import '../cr_icon_button/cr_icon_button.js';
import '../cr_icons_css.m.js';
import '../hidden_style_css.m.js';
import '../icons.m.js';
diff --git a/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.ts b/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.ts
index 628c56923a2..1d63347621e 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.ts
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import '../cr_icon_button/cr_icon_button.m.js';
+import '../cr_icon_button/cr_icon_button.js';
import '../cr_icons_css.m.js';
import '../icons.m.js';
import '../shared_style_css.m.js';
@@ -62,7 +62,7 @@ export class CrToolbarSearchFieldElement extends
isSpinnerShown_: {
type: Boolean,
- computed: 'computeIsSpinnerShown_(spinnerActive, showingSearch)'
+ computed: 'computeIsSpinnerShown_(spinnerActive, showingSearch)',
},
searchFocused_: {type: Boolean, value: false},
diff --git a/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.ts b/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.ts
index 03e70fc3a20..0b0952251e4 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.ts
@@ -13,15 +13,15 @@
* tab-traversal.
*/
-import '../cr_button/cr_button.m.js';
-import '../cr_icon_button/cr_icon_button.m.js';
+import '../cr_button/cr_button.js';
+import '../cr_icon_button/cr_icon_button.js';
import '../icons.m.js';
import '../shared_vars_css.m.js';
import {IronA11yAnnouncer} from '//resources/polymer/v3_0/iron-a11y-announcer/iron-a11y-announcer.js';
import {Debouncer, microTask, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CrButtonElement} from '../cr_button/cr_button.m.js';
+import {CrButtonElement} from '../cr_button/cr_button.js';
import {getTemplate} from './cr_toolbar_selection_overlay.html.js';
diff --git a/chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree.ts b/chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree.ts
index 1e2619a5de6..52cfbab2c53 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree.ts
@@ -7,7 +7,7 @@ import {isMac} from '../../js/cr.m.js';
import {getTemplate} from './cr_tree.html.js';
import {CrTreeBaseElement} from './cr_tree_base.js';
-import {SELECTED_ATTR} from './cr_tree_item.js';
+import {CrTreeItemElement, SELECTED_ATTR} from './cr_tree_item.js';
/**
* @fileoverview cr-tree is a container for a tree structure. Items can be added
@@ -84,18 +84,11 @@ export class CrTreeElement extends CrTreeBaseElement {
* Initializes the element.
*/
connectedCallback() {
- // Make list focusable
- if (!this.hasAttribute('tabindex')) {
- this.tabIndex = 0;
- }
-
if (!this.hasAttribute('role')) {
this.setAttribute('role', 'tree');
}
this.addEventListener('keydown', this.handleKeyDown.bind(this));
- this.addEventListener('focus', this.onFocus.bind(this));
- this.addEventListener('blur', this.onBlur.bind(this));
}
// CrTreeBase implementation:
@@ -142,6 +135,9 @@ export class CrTreeElement extends CrTreeBaseElement {
if (item.id) {
this.setAttribute('aria-activedescendant', item.id);
}
+ if (this.matches(':focus-within') || this.shadowRoot!.activeElement) {
+ (item as CrTreeItemElement).rowElement.focus();
+ }
} else {
this.removeAttribute('aria-activedescendant');
}
@@ -151,15 +147,12 @@ export class CrTreeElement extends CrTreeBaseElement {
}
}
- // Event handlers:
- // TODO(rbpotter): Figure out if there is a better way to handle tree:focus
- // and tree[icon-visibility] styles from tree.css.
- onFocus() {
- this.setAttribute('tree-focused', 'true');
- }
-
- onBlur() {
- this.setAttribute('tree-focused', 'false');
+ override addAt(child: CrTreeBaseElement, index: number) {
+ super.addAt(child, index);
+ // aria-owns doesn't work well for the tree because the treeitem role is
+ // set on the rowElement within cr-tree-item's shadow DOM. Set the size
+ // here, so the correct number of items is read.
+ this.setAttribute('aria-setsize', this.items.length.toString());
}
/**
diff --git a/chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree_base.ts b/chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree_base.ts
index 4edce25f1f3..de31f929b47 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree_base.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree_base.ts
@@ -17,14 +17,14 @@ export abstract class CrTreeBaseElement extends CustomElement {
}
static get observedAttributes() {
- return ['icon-visibility', 'tree-focused'];
+ return ['icon-visibility'];
}
detail: object = {};
private parent_: CrTreeBaseElement|null = null;
attributeChangedCallback(name: string, _oldValue: string, newValue: string) {
- assert(name === 'icon-visibility' || name === 'tree-focused');
+ assert(name === 'icon-visibility');
this.items.forEach(item => item.setAttribute(name, newValue));
}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.html b/chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.html
index 76196d75863..30eb59e0048 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.html
@@ -2,6 +2,8 @@
:host {
--white-100: rgba(255, 255, 255, 0);
--white-80: rgba(255, 255, 255, .8);
+ --leaf-icon: var(--cr-tree-item-leaf-icon,
+ url(chrome://theme/IDR_FOLDER_CLOSED));
}
:host .tree-row {
@@ -53,6 +55,7 @@
visibility: visible;
}
+ :host([force-hover-style]) .tree-row,
.tree-row:hover {
background-color: hsl(214, 91%, 97%);
border-color: hsl(214, 91%, 85%);
@@ -68,7 +71,7 @@
}
:host([selected]) .tree-row:hover,
- :host([selected][tree-focused=true]) .tree-row {
+ :host([selected]) .tree-row:focus {
background-color: hsl(214, 91%, 89%);
border-color: rgb(125, 162, 206);
}
@@ -81,6 +84,12 @@
display: none;
}
+ #extra-aria-label {
+ clip: rect(0,0,0,0);
+ display: inline-block;
+ position: fixed;
+ }
+
:host .tree-row > * {
box-sizing: border-box;
display: inline-block;
@@ -104,12 +113,20 @@
background-image: url(chrome://theme/IDR_FOLDER_CLOSED);
}
+ :host(:not([may-have-children])) .tree-row > .tree-label-icon {
+ background-image: var(--leaf-icon);
+ }
+
<if expr="is_macosx or is_ios">
@media (prefers-color-scheme: dark) {
.tree-label-icon,
:host([may-have-children]) .tree-row > .tree-label-icon {
background-image: url(chrome://theme/IDR_FOLDER_CLOSED_WHITE);
}
+
+ :host(:not([may-have-children])) .tree-row > .tree-label-icon {
+ background-image: var(--leaf-icon);
+ }
}
</if>
@@ -151,9 +168,11 @@
}
}
</style>
-<div class="tree-row" part="row">
+<div class="tree-row" role="treeitem" aria-owns="tree-children"
+ aria-labelledby="label extra-aria-label">
<span class="expand-icon"></span>
<span class="tree-label-icon"></span>
- <span class="tree-label"></span>
+ <span class="tree-label" id="label"></span>
+ <span id="extra-aria-label"></span>
</div>
-<div class="tree-children" role="group"></div>
+<div class="tree-children" id="tree-children" role="group"></div>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.ts b/chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.ts
index 19b67592a4d..43d64012a45 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.ts
@@ -48,18 +48,27 @@ export class CrTreeItemElement extends CrTreeBaseElement {
}
private label_: string = '';
+ private extraAriaLabel_: string = '';
private depth_: number = 0;
+ private rowElement_: HTMLElement|null = null;
connectedCallback() {
- const labelId =
- 'tree-item-label-autogen-id-' + treeItemAutoGeneratedIdCounter++;
- this.labelElement.id = labelId;
- this.setAttribute('aria-labelledby', labelId);
+ this.id = 'tree-item-autogen-id-' + treeItemAutoGeneratedIdCounter++;
this.labelElement.textContent = this.label_;
+ const extraAriaLabel =
+ this.shadowRoot!.querySelector<HTMLElement>('#extra-aria-label');
+ assert(extraAriaLabel);
+ extraAriaLabel.textContent = this.extraAriaLabel_;
this.toggleAttribute(SELECTED_ATTR, false);
- this.addEventListener('click', this.handleClick.bind(this));
- this.addEventListener('mousedown', this.handleMouseDown.bind(this));
- this.addEventListener('dblclick', this.handleDblClick.bind(this));
+ this.rowElement.setAttribute('aria-selected', 'false');
+ const expand = this.shadowRoot!.querySelector<HTMLElement>('.expand-icon');
+ assert(expand);
+ expand.addEventListener('click', this.handleExpandClick_.bind(this));
+ expand.addEventListener(
+ 'mousedown', this.handleExpandMouseDown_.bind(this));
+ this.addEventListener('click', this.handleClick_.bind(this));
+ this.addEventListener('mousedown', this.handleMouseDown_.bind(this));
+ this.addEventListener('dblclick', this.handleDblClick_.bind(this));
}
override attributeChangedCallback(
@@ -75,22 +84,35 @@ export class CrTreeItemElement extends CrTreeBaseElement {
super.attributeChangedCallback(name, oldValue, newValue);
}
+ forceHoverStyle(hover: boolean) {
+ this.toggleAttribute('force-hover-style', hover);
+ }
+
private onSelectedChange_(selected: boolean) {
+ const rowElement = this.rowElement;
if (selected) {
+ rowElement.setAttribute('tabIndex', '0');
this.reveal();
this.labelElement.scrollIntoViewIfNeeded();
if (this.tree) {
this.tree.selectedItem = this;
}
+ rowElement.setAttribute('aria-selected', 'true');
} else if (this.tree && this.tree.selectedItem === this) {
this.tree.selectedItem = null;
+ rowElement.setAttribute('aria-selected', 'false');
+ rowElement.setAttribute('tabIndex', '-1');
+ } else {
+ rowElement.setAttribute('aria-selected', 'false');
+ rowElement.setAttribute('tabIndex', '-1');
}
}
private onExpandedChange_(expanded: boolean) {
+ const rowElement = this.rowElement;
if (expanded) {
if (this.hasAttribute(MAY_HAVE_CHILDREN_ATTR)) {
- this.setAttribute('aria-expanded', 'true');
+ rowElement.setAttribute('aria-expanded', 'true');
this.dispatchEvent(new CustomEvent(
'cr-tree-item-expand',
{bubbles: true, composed: true, detail: true}));
@@ -105,9 +127,9 @@ export class CrTreeItemElement extends CrTreeBaseElement {
}
}
if (this.hasAttribute(MAY_HAVE_CHILDREN_ATTR)) {
- this.setAttribute('aria-expanded', 'false');
+ rowElement.setAttribute('aria-expanded', 'false');
} else {
- this.removeAttribute('aria-expanded');
+ rowElement.removeAttribute('aria-expanded');
}
this.dispatchEvent(new CustomEvent(
'cr-tree-item-collapse',
@@ -125,6 +147,7 @@ export class CrTreeItemElement extends CrTreeBaseElement {
const row = this.shadowRoot!.querySelector<HTMLElement>('.tree-row');
assert(row);
row.style.paddingInlineStart = rowDepth * INDENT_PX + 'px';
+ this.rowElement.setAttribute('aria-level', depth.toString());
this.depth_ = depth;
this.items.forEach(item => item.depth = depth + 1);
}
@@ -155,7 +178,7 @@ export class CrTreeItemElement extends CrTreeBaseElement {
super.setHasChildren(hasChildren);
if (hasChildren) {
this.toggleAttribute(MAY_HAVE_CHILDREN_ATTR, true);
- this.toggleAttribute('aria-expanded', this.expanded);
+ this.rowElement.toggleAttribute('aria-expanded', this.expanded);
}
}
@@ -169,30 +192,40 @@ export class CrTreeItemElement extends CrTreeBaseElement {
}
// Mouse event handlers
- handleMouseDown(e: MouseEvent) {
+ private handleMouseDown_(e: MouseEvent) {
if (e.button === 2) { // right
- this.handleClick(e);
+ this.handleClick_(e);
+ }
+ }
+
+ private handleExpandMouseDown_(e: MouseEvent) {
+ if (e.button === 2) { // right
+ this.handleExpandClick_(e);
}
}
/**
* Handles double click events on the tree item.
*/
- handleDblClick(e: Event) {
+ private handleDblClick_(e: Event) {
const expanded = this.expanded;
this.expanded = !expanded;
e.stopPropagation();
}
/**
+ * Called when the user clicks on a tree item's expand icon.
+ */
+ private handleExpandClick_(e: Event) {
+ this.expanded = !this.expanded;
+ e.stopPropagation();
+ }
+
+ /**
* Called when the user clicks on a tree item.
*/
- handleClick(e: Event) {
- if ((e.target as HTMLElement).classList.contains('expand-icon')) {
- this.expanded = !this.expanded;
- } else {
- this.toggleAttribute(SELECTED_ATTR, true);
- }
+ private handleClick_(e: Event) {
+ this.toggleAttribute(SELECTED_ATTR, true);
e.stopPropagation();
}
@@ -214,7 +247,16 @@ export class CrTreeItemElement extends CrTreeBaseElement {
get labelElement(): HTMLElement {
const labelEl = this.shadowRoot!.querySelector<HTMLElement>('.tree-label');
assert(labelEl);
- return labelEl as HTMLElement;
+ return labelEl;
+ }
+
+ get rowElement(): HTMLElement {
+ if (!this.rowElement_) {
+ this.rowElement_ =
+ this.shadowRoot!.querySelector<HTMLElement>('.tree-row');
+ }
+ assert(this.rowElement_);
+ return this.rowElement_;
}
/**
@@ -230,6 +272,14 @@ export class CrTreeItemElement extends CrTreeBaseElement {
this.labelElement.textContent = s;
}
}
+
+ setExtraAriaLabel(s: string) {
+ this.extraAriaLabel_ = s;
+ if (this.shadowRoot && this.shadowRoot.querySelector('#extra-aria-label')) {
+ this.shadowRoot!.querySelector<HTMLElement>(
+ '#extra-aria-label')!.textContent = s;
+ }
+ }
}
declare global {
diff --git a/chromium/ui/webui/resources/cr_elements/cr_view_manager/cr_view_manager.ts b/chromium/ui/webui/resources/cr_elements/cr_view_manager/cr_view_manager.ts
index ee6c31a328b..1b22d5152ce 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_view_manager/cr_view_manager.ts
+++ b/chromium/ui/webui/resources/cr_elements/cr_view_manager/cr_view_manager.ts
@@ -5,7 +5,7 @@
import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {assert} from '../../js/assert_ts.js';
-import {CrLazyRenderElement} from '../cr_lazy_render/cr_lazy_render.m.js';
+import {CrLazyRenderElement} from '../cr_lazy_render/cr_lazy_render.js';
import {getTemplate} from './cr_view_manager.html.js';
@@ -45,7 +45,7 @@ viewAnimations.set('slide-in-fade-in-ltr', element => {
const animation = element.animate(
[
{transform: 'translateX(-8px)', opacity: 0},
- {transform: 'translateX(0)', opacity: 1}
+ {transform: 'translateX(0)', opacity: 1},
],
{
duration: 300,
@@ -60,7 +60,7 @@ viewAnimations.set('slide-in-fade-in-rtl', element => {
const animation = element.animate(
[
{transform: 'translateX(8px)', opacity: 0},
- {transform: 'translateX(0)', opacity: 1}
+ {transform: 'translateX(0)', opacity: 1},
],
{
duration: 300,
diff --git a/chromium/ui/webui/resources/cr_elements/find_shortcut_behavior.d.ts b/chromium/ui/webui/resources/cr_elements/find_shortcut_behavior.d.ts
index 87f54123da2..a40e46a1d5b 100644
--- a/chromium/ui/webui/resources/cr_elements/find_shortcut_behavior.d.ts
+++ b/chromium/ui/webui/resources/cr_elements/find_shortcut_behavior.d.ts
@@ -13,5 +13,5 @@ export interface FindShortcutBehavior {
declare const FindShortcutBehavior: object;
export const FindShortcutManager: {
- listeners: Array<FindShortcutBehavior>,
+ listeners: FindShortcutBehavior[],
};
diff --git a/chromium/ui/webui/resources/cr_elements/find_shortcut_behavior.js b/chromium/ui/webui/resources/cr_elements/find_shortcut_behavior.js
index 393a7e970b1..fee963c99b4 100644
--- a/chromium/ui/webui/resources/cr_elements/find_shortcut_behavior.js
+++ b/chromium/ui/webui/resources/cr_elements/find_shortcut_behavior.js
@@ -4,7 +4,7 @@
import {assert, assertNotReached} from '../js/assert.m.js';
import {isMac} from '../js/cr.m.js';
-import {KeyboardShortcutList} from '../js/cr/ui/keyboard_shortcut_list.m.js';
+import {KeyboardShortcutList} from '../js/cr/ui/keyboard_shortcut_list.js';
import {isTextInputElement} from '../js/util.m.js';
/**
diff --git a/chromium/ui/webui/resources/cr_elements/find_shortcut_mixin.ts b/chromium/ui/webui/resources/cr_elements/find_shortcut_mixin.ts
index 9ca2663b699..d6e435bc0c8 100644
--- a/chromium/ui/webui/resources/cr_elements/find_shortcut_mixin.ts
+++ b/chromium/ui/webui/resources/cr_elements/find_shortcut_mixin.ts
@@ -6,7 +6,7 @@ import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/pol
import {assert, assertNotReached} from '../js/assert.m.js';
import {isMac} from '../js/cr.m.js';
-import {KeyboardShortcutList} from '../js/cr/ui/keyboard_shortcut_list.m.js';
+import {KeyboardShortcutList} from '../js/cr/ui/keyboard_shortcut_list.js';
import {isTextInputElement} from '../js/util.m.js';
/**
@@ -19,7 +19,7 @@ export const FindShortcutManager = (() => {
/**
* Stack of listeners. Only the top listener will handle the shortcut.
*/
- const listeners: Array<FindShortcutMixinInterface> = [];
+ const listeners: FindShortcutMixinInterface[] = [];
/**
* Tracks if any modal context is open in settings. This assumes only one
diff --git a/chromium/ui/webui/resources/cr_elements/icons.html b/chromium/ui/webui/resources/cr_elements/icons.html
index aee974dafb6..f62105753ef 100644
--- a/chromium/ui/webui/resources/cr_elements/icons.html
+++ b/chromium/ui/webui/resources/cr_elements/icons.html
@@ -129,6 +129,10 @@ blurry at 20 px). Please use 20 px icons when available.
d="M20 18c1.1 0 1.99-.9 1.99-2L22 6c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2H0v2h24v-2h-4zM4 6h16v10H4V6z">
</path>
</g>
+ <g id="create">
+ <path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z">
+ </path>
+ </g>
<g id="delete">
<path d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"></path>
</g>
diff --git a/chromium/ui/webui/resources/cr_elements/md_select_css.html b/chromium/ui/webui/resources/cr_elements/md_select_css.html
index a5c641ba7eb..8ed3e6ae482 100644
--- a/chromium/ui/webui/resources/cr_elements/md_select_css.html
+++ b/chromium/ui/webui/resources/cr_elements/md_select_css.html
@@ -62,6 +62,14 @@
box-shadow: 0 0 0 2px var(--md-select-focus-shadow-color);
}
+ @media (forced-colors: active) {
+ .md-select:focus {
+ /* Use outline instead of box-shadow (which does not work) in Windows
+ HCM. */
+ outline: var(--cr-focus-outline-hcm);
+ }
+ }
+
/* Should not have an outline if opened by mouse click. */
.md-select:active {
box-shadow: none;
diff --git a/chromium/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.js b/chromium/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.js
index 8ae242bf195..4c4ca0d2b07 100644
--- a/chromium/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.js
+++ b/chromium/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.js
@@ -31,8 +31,6 @@ var CrPolicyStrings;
/**
* Possible policy indicators that can be shown in settings.
- * Must be kept in sync with the PolicyIndicatorType enum located in
- * chrome/browser/ui/webui/site_settings_helper.h
* @enum {string}
*/
/* #export */ const CrPolicyIndicatorType = {
diff --git a/chromium/ui/webui/resources/cr_elements/policy/cr_tooltip_icon.html b/chromium/ui/webui/resources/cr_elements/policy/cr_tooltip_icon.html
index 4a07decfa2e..b8596274bfe 100644
--- a/chromium/ui/webui/resources/cr_elements/policy/cr_tooltip_icon.html
+++ b/chromium/ui/webui/resources/cr_elements/policy/cr_tooltip_icon.html
@@ -17,7 +17,14 @@
--iron-icon-width: var(--cr-icon-size);
--iron-icon-height: var(--cr-icon-size);
--iron-icon-fill-color:
- var(--cr-tooltip-icon-fill-color, var(--google-grey-700));
+ var(--cr-tooltip-icon-fill-color, var(--google-grey-700));
+ }
+
+ @media (prefers-color-scheme: dark) {
+ iron-icon {
+ --iron-icon-fill-color:
+ var(--cr-tooltip-icon-fill-color, var(--google-grey-500));
+ }
}
</style>
<iron-icon id="indicator" tabindex="0" aria-label$="[[iconAriaLabel]]"
diff --git a/chromium/ui/webui/resources/cr_elements/policy/cr_tooltip_icon.js b/chromium/ui/webui/resources/cr_elements/policy/cr_tooltip_icon.js
index ee069725c82..5d927590471 100644
--- a/chromium/ui/webui/resources/cr_elements/policy/cr_tooltip_icon.js
+++ b/chromium/ui/webui/resources/cr_elements/policy/cr_tooltip_icon.js
@@ -16,7 +16,7 @@ Polymer({
tooltipPosition: {
type: String,
value: 'top',
- }
+ },
},
/** @return {!Element} */
diff --git a/chromium/ui/webui/resources/cr_elements/shared_vars_css.html b/chromium/ui/webui/resources/cr_elements/shared_vars_css.html
index 6a571847976..92c54ddc141 100644
--- a/chromium/ui/webui/resources/cr_elements/shared_vars_css.html
+++ b/chromium/ui/webui/resources/cr_elements/shared_vars_css.html
@@ -141,6 +141,16 @@
}
}
+ @media (forced-colors: active) {
+ html {
+ /* In Windows HCM, |box-shadow| is not showing. The suggested workaround
+ is to use |outline| or |border| instead. The color does not matter,
+ since it is forced by the OS so using 'transparent'. */
+ --cr-focus-outline-hcm: 2px solid transparent;
+ --cr-border-hcm: 2px solid transparent;
+ }
+ }
+
/* Don't use color values past this point. Instead, create a variable that's
* set for both light and dark modes and use a single variable below. */
@@ -202,7 +212,7 @@
--cr-form-field-bottom-spacing: 16px;
--cr-form-field-label-font-size: .625rem;
--cr-form-field-label-height: 1em;
- --cr-form-field-label-line-height: 1em;
+ --cr-form-field-label-line-height: 1;
}
</style>
</custom-style>
diff --git a/chromium/ui/webui/resources/css/BUILD.gn b/chromium/ui/webui/resources/css/BUILD.gn
index 3801cb717f5..a8a3d16d57e 100644
--- a/chromium/ui/webui/resources/css/BUILD.gn
+++ b/chromium/ui/webui/resources/css/BUILD.gn
@@ -26,7 +26,6 @@ preprocess_if_expr("preprocess_src") {
"action_link.css",
"butter_bar.css",
"chrome_shared.css",
- "dialogs.css",
"i18n_process.css",
"list.css",
"menu_button.css",
@@ -36,7 +35,6 @@ preprocess_if_expr("preprocess_src") {
"text_defaults.css",
"text_defaults_md.css",
"throbber.css",
- "tree.css",
"widgets.css",
]
diff --git a/chromium/ui/webui/resources/css/dialogs.css b/chromium/ui/webui/resources/css/dialogs.css
deleted file mode 100644
index 0f2805bb6ef..00000000000
--- a/chromium/ui/webui/resources/css/dialogs.css
+++ /dev/null
@@ -1,146 +0,0 @@
-/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-.cr-dialog-container {
- -webkit-box-align: center;
- -webkit-box-pack: center;
- display: -webkit-box;
- height: 100%;
- left: 0;
- overflow: hidden;
- position: absolute;
- top: 0;
- transition: opacity 250ms linear;
- user-select: none;
- width: 100%;
- z-index: 9999;
-}
-
-.cr-dialog-frame {
- -webkit-box-orient: vertical;
- -webkit-box-shadow: 5px 5px 5px rgba(100, 100, 100, 0.5);
- background-color: white;
- border: 1px solid rgba(0, 0, 0, 0.3);
- border-radius: 3px;
- box-shadow: 0 4px 23px 5px rgba(0, 0, 0, 0.2),
- 0 2px 6px rgba(0, 0, 0, 0.15);
- cursor: default;
- display: -webkit-box;
- padding: 14px 17px;
- position: relative;
- width: 460px;
-}
-
-.cr-dialog-frame:focus {
- outline: none;
-}
-
-@keyframes pulse {
- 0% {
- transform: scale(1);
- }
- 40% {
- transform: scale(1.02);
- }
- 60% {
- transform: scale(1.02);
- }
- 100% {
- transform: scale(1);
- }
-}
-
-.cr-dialog-frame.pulse {
- animation-duration: 180ms;
- animation-iteration-count: 1;
- animation-name: pulse;
- animation-timing-function: ease-in-out;
-}
-
-.shown > .cr-dialog-frame {
- opacity: 1;
- transform: perspective(500px) scale(1)
- translateY(0) rotateX(0);
-}
-
-.cr-dialog-frame {
- opacity: 0;
- transform: perspective(500px) scale(0.99)
- translateY(-20px) rotateX(5deg);
- transition: all 180ms;
- transition-duration: 250ms;
-}
-
-.cr-dialog-shield {
- background-color: white;
- bottom: 0;
- display: block;
- left: 0;
- opacity: 0;
- pointer-events: none;
- position: absolute;
- right: 0;
- top: 0;
- transition: opacity 500ms;
-}
-
-.shown > .cr-dialog-shield {
- opacity: 0.75;
- transition: opacity 500ms;
-}
-
-[hidden] {
- display: none;
-}
-
-.cr-dialog-title {
- display: block;
- font-size: 120%;
- font-weight: bold;
- margin-bottom: 10px;
- margin-inline-end: 20px;
- white-space: nowrap;
- word-wrap: normal;
-}
-
-.cr-dialog-text {
- margin: 13px 0;
-}
-
-.cr-dialog-text,
-.cr-dialog-title {
- overflow: hidden;
- text-overflow: ellipsis;
-}
-
-.cr-dialog-frame input {
- -webkit-box-sizing: border-box;
- width: 100%;
-}
-
-.cr-dialog-buttons {
- -webkit-box-orient: horizontal;
- -webkit-box-pack: end;
- display: -webkit-box;
- padding-top: 10px;
-}
-
-.cr-dialog-close {
- background: url(chrome://theme/IDR_CLOSE_DIALOG) center no-repeat;
- display: inline-block;
- height: 44px;
- opacity: 0.7;
- position: absolute;
- right: 0;
- top: 0;
- width: 44px;
-}
-
-.cr-dialog-close:hover {
- background-image: url(chrome://theme/IDR_CLOSE_DIALOG_H);
-}
-
-.cr-dialog-close:active {
- background-image: url(chrome://theme/IDR_CLOSE_DIALOG_P);
-}
diff --git a/chromium/ui/webui/resources/css/tree.css b/chromium/ui/webui/resources/css/tree.css
deleted file mode 100644
index f2d270ed61e..00000000000
--- a/chromium/ui/webui/resources/css/tree.css
+++ /dev/null
@@ -1,185 +0,0 @@
-/* Copyright (c) 2012 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. */
-
-tree {
- display: block;
- outline: none;
- overflow: auto;
-}
-
-.tree-item > .tree-row {
- align-items: center;
- background-color: rgba(255, 255, 255, 0);
- border: 1px solid rgba(255, 255, 255, 0); /* transparent white */
- border-radius: 2px;
- color: black;
- cursor: default;
- display: flex;
- line-height: 28px;
- padding: 0 3px;
- position: relative;
- user-select: none;
- white-space: nowrap;
-}
-
-.expand-icon {
- background: url(../images/tree_triangle.svg) no-repeat center center;
- background-size: 8px 5.5px;
- height: 16px;
- min-width: 16px;
- opacity: .6;
- transform: rotate(-90deg);
- transition: all 150ms;
- width: 16px;
-}
-
-html[dir=rtl] .expand-icon {
- transform: rotate(90deg);
-}
-
-.tree-item[expanded] > .tree-row > .expand-icon {
- background-image: url(../images/tree_triangle.svg);
- opacity: .5;
- transform: rotate(0);
-}
-
-.tree-row .expand-icon {
- visibility: hidden;
-}
-
-.tree-row[may-have-children] .expand-icon {
- visibility: visible;
-}
-
-.tree-row[has-children=false] .expand-icon {
- visibility: hidden;
-}
-
-.tree-row:hover {
- background-color: hsl(214, 91%, 97%);
- border-color: hsl(214, 91%, 85%);
- z-index: 1;
-}
-
-/* WebKit has a bug with attribute selectors so we apply selected to the tree
- * row as well. https://bugs.webkit.org/show_bug.cgi?id=12519. */
-.tree-row[selected] {
- background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.8),
- rgba(255,255,255,0));
-}
-
-.tree-row[selected] {
- background-color: hsl(0, 0%, 90%);
- border-color: hsl(0, 0%, 85%);
- z-index: 2;
-}
-
-.tree-row[selected]:hover,
-tree:focus .tree-row[selected] {
- background-color: hsl(214, 91%, 89%);
- border-color: rgb(125, 162, 206);
-}
-
-.tree-children[expanded] {
- display: block;
-}
-
-.tree-children {
- display: none;
-}
-
-.tree-item > .tree-row > * {
- box-sizing: border-box;
- display: inline-block;
-}
-
-.tree-label-icon {
- background-position: 0 50%;
- background-repeat: no-repeat;
- height: 20px;
- min-width: 20px;
- width: 20px;
-}
-
-.tree-label {
- white-space: pre;
-}
-
-.tree-label-icon,
-.tree-row[may-have-children] > .tree-label-icon {
- background-image: url(chrome://theme/IDR_FOLDER_CLOSED);
-}
-
-<if expr="is_macosx or is_ios">
-@media (prefers-color-scheme: dark) {
- .tree-label-icon,
- .tree-row[may-have-children] > .tree-label-icon {
- background-image: url(chrome://theme/IDR_FOLDER_CLOSED_WHITE);
- }
-}
-</if>
-
-<if expr="not is_macosx and not is_ios">
-.tree-item[expanded] > .tree-row > .tree-label-icon {
- background-image: url(chrome://theme/IDR_FOLDER_OPEN);
-}
-</if>
-
-html[dir=rtl] .tree-label-icon,
-html[dir=rtl] .tree-row[may-have-children] > .tree-label-icon,
-html[dir=rtl] .tree-item[expanded] > .tree-row > .tree-label-icon {
- transform: scaleX(-1);
-}
-
-tree[icon-visibility=hidden] .tree-label-icon {
- display: none;
-}
-
-tree[icon-visibility=parent] .tree-label-icon,
-tree[icon-visibility=parent] .tree-row[has-children=false] > .tree-label-icon {
- background-image: none;
-}
-
-/* We need to ensure that even empty labels take up space */
-.tree-label:empty::after {
- content: ' ';
- white-space: pre;
-}
-
-.tree-rename > .tree-row > .tree-label {
- -webkit-user-modify: read-write-plaintext-only;
- background: white;
- color: black;
- outline: 1px solid black;
- user-select: auto;
-}
-
-.tree-item[editing] input {
- /* Do not inherit the line-height */
- font-family: inherit;
- font-size: inherit;
- font-weight: inherit;
- margin: -2px -8px -2px -3px;
-<if expr="not is_macosx and not is_ios">
- outline: none;
-</if>
- padding: 1px 7px 1px 1px;
-}
-
-html[dir=rtl] .tree-item[editing] input {
- margin: -2px -3px -2px -8px;
- padding: 1px 1px 1px 7px;
-}
-
-@media(forced-colors) {
- .tree-row[selected],
- .tree-row:hover,
- .tree-row[selected]:hover,
- tree:focus .tree-row[selected] {
- background-color: Highlight;
- background-image: none;
- color: HighlightText;
- forced-color-adjust: none;
- }
-}
diff --git a/chromium/ui/webui/resources/html/BUILD.gn b/chromium/ui/webui/resources/html/BUILD.gn
index b4b8153a91f..893acc1aa28 100644
--- a/chromium/ui/webui/resources/html/BUILD.gn
+++ b/chromium/ui/webui/resources/html/BUILD.gn
@@ -2,6 +2,7 @@
# 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("//ui/webui/resources/tools/generate_grd.gni")
include_polymer = !is_android && !is_ios
@@ -11,43 +12,43 @@ generate_grd("build_grdp") {
out_grd = "$target_gen_dir/resources.grdp"
resource_path_prefix = "html"
input_files = [
- "action_link.html",
"assert.html",
- "cr/event_target.html",
- "cr.html",
- "cr/ui/array_data_model.html",
- "cr/ui/command.html",
- "cr/ui/context_menu_handler.html",
- "cr/ui/focus_manager.html",
- "cr/ui/focus_outline_manager.html",
- "cr/ui/focus_row.html",
- "cr/ui.html",
- "cr/ui/keyboard_shortcut_list.html",
- "cr/ui/list.html",
- "cr/ui/list_item.html",
- "cr/ui/list_selection_controller.html",
- "cr/ui/list_selection_model.html",
- "cr/ui/menu_button.html",
- "cr/ui/menu.html",
- "cr/ui/menu_item.html",
- "cr/ui/position_util.html",
- "event_tracker.html",
"load_time_data.html",
"parse_html_subset.html",
- "promise_resolver.html",
"test_loader.html",
- "util.html",
]
- if (include_polymer) {
+ if (is_chromeos_ash) {
input_files += [
- "cr/ui/focus_row_behavior.html",
- "cr/ui/focus_without_ink.html",
- "i18n_behavior.html",
- "list_property_update_behavior.html",
- "polymer.html",
- "web_ui_listener_behavior.html",
+ "action_link.html",
+ "cr.html",
+ "cr/event_target.html",
+ "cr/ui.html",
+ "cr/ui/array_data_model.html",
+ "cr/ui/focus_manager.html",
+ "cr/ui/focus_outline_manager.html",
+ "cr/ui/focus_row.html",
+ "cr/ui/list.html",
+ "cr/ui/list_item.html",
+ "cr/ui/list_selection_controller.html",
+ "cr/ui/list_selection_model.html",
+ "event_tracker.html",
+ "promise_resolver.html",
+ "util.html",
]
}
+
+ if (include_polymer) {
+ input_files += [ "polymer.html" ]
+
+ if (is_chromeos_ash) {
+ input_files += [
+ "cr/ui/focus_without_ink.html",
+ "cr/ui/focus_row_behavior.html",
+ "i18n_behavior.html",
+ "web_ui_listener_behavior.html",
+ ]
+ }
+ }
input_files_base_dir = rebase_path(".", "//")
}
diff --git a/chromium/ui/webui/resources/html/cr/ui/command.html b/chromium/ui/webui/resources/html/cr/ui/command.html
deleted file mode 100644
index 04b6e53c145..00000000000
--- a/chromium/ui/webui/resources/html/cr/ui/command.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<link rel="import" href="../../../html/cr/ui.html">
-<link rel="import" href="../../../html/cr/ui/keyboard_shortcut_list.html">
-
-<script src="../../../js/cr/ui/command.js"></script>
diff --git a/chromium/ui/webui/resources/html/cr/ui/context_menu_handler.html b/chromium/ui/webui/resources/html/cr/ui/context_menu_handler.html
deleted file mode 100644
index d4e2641b395..00000000000
--- a/chromium/ui/webui/resources/html/cr/ui/context_menu_handler.html
+++ /dev/null
@@ -1 +0,0 @@
-<script src="../../../js/cr/ui/context_menu_handler.js"></script>
diff --git a/chromium/ui/webui/resources/html/cr/ui/keyboard_shortcut_list.html b/chromium/ui/webui/resources/html/cr/ui/keyboard_shortcut_list.html
deleted file mode 100644
index 7b330f8df96..00000000000
--- a/chromium/ui/webui/resources/html/cr/ui/keyboard_shortcut_list.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<link rel="import" href="../../../html/cr.html">
-
-<script src="../../../js/cr/ui/keyboard_shortcut_list.js"></script>
diff --git a/chromium/ui/webui/resources/html/cr/ui/menu.html b/chromium/ui/webui/resources/html/cr/ui/menu.html
deleted file mode 100644
index 16ec5e38d67..00000000000
--- a/chromium/ui/webui/resources/html/cr/ui/menu.html
+++ /dev/null
@@ -1 +0,0 @@
-<script src="../../../js/cr/ui/menu.js"></script>
diff --git a/chromium/ui/webui/resources/html/cr/ui/menu_button.html b/chromium/ui/webui/resources/html/cr/ui/menu_button.html
deleted file mode 100644
index c203da5aa8b..00000000000
--- a/chromium/ui/webui/resources/html/cr/ui/menu_button.html
+++ /dev/null
@@ -1 +0,0 @@
-<script src="../../../js/cr/ui/menu_button.js"></script>
diff --git a/chromium/ui/webui/resources/html/cr/ui/menu_item.html b/chromium/ui/webui/resources/html/cr/ui/menu_item.html
deleted file mode 100644
index d28138f1879..00000000000
--- a/chromium/ui/webui/resources/html/cr/ui/menu_item.html
+++ /dev/null
@@ -1 +0,0 @@
-<script src="../../../js/cr/ui/menu_item.js"></script>
diff --git a/chromium/ui/webui/resources/html/cr/ui/position_util.html b/chromium/ui/webui/resources/html/cr/ui/position_util.html
deleted file mode 100644
index ef06075d970..00000000000
--- a/chromium/ui/webui/resources/html/cr/ui/position_util.html
+++ /dev/null
@@ -1 +0,0 @@
-<script src="../../../js/cr/ui/position_util.js"></script>
diff --git a/chromium/ui/webui/resources/html/list_property_update_behavior.html b/chromium/ui/webui/resources/html/list_property_update_behavior.html
deleted file mode 100644
index b7f152edffb..00000000000
--- a/chromium/ui/webui/resources/html/list_property_update_behavior.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<link rel="import" href="polymer.html">
-
-<script src="../js/list_property_update_behavior.js"></script>
diff --git a/chromium/ui/webui/resources/js/BUILD.gn b/chromium/ui/webui/resources/js/BUILD.gn
index 40229e5b79f..2fe0c9f0017 100644
--- a/chromium/ui/webui/resources/js/BUILD.gn
+++ b/chromium/ui/webui/resources/js/BUILD.gn
@@ -24,7 +24,7 @@ generate_grd("build_grdp") {
"$target_gen_dir/$preprocess_src_manifest",
]
if (include_polymer) {
- manifest_files += [ "$target_gen_dir/browser_command/tsconfig.manifest" ]
+ manifest_files += [ "$target_gen_dir/browser_command/build_ts.manifest" ]
}
resource_path_prefix = "js"
}
@@ -51,6 +51,7 @@ preprocess_if_expr("preprocess_src_ts") {
"custom_element.ts",
"i18n_mixin.ts",
"list_property_update_mixin.ts",
+ "search_highlight_utils.ts",
"web_ui_listener_mixin.ts",
]
}
@@ -64,14 +65,14 @@ preprocess_if_expr("preprocess_src") {
"assert.js",
"color_utils.js",
"cr.m.js",
- "i18n_template_no_process.js",
"icon.js",
"load_time_data.m.js",
"plural_string_proxy.js",
"static_types.js",
- "search_highlight_utils.js",
"test_loader.js",
"test_loader_util.js",
+
+ # Used by security interstitials and ios inspect UI
"util.js",
"webui_resource_test.js",
"webview_manager.js",
@@ -96,6 +97,7 @@ preprocess_if_expr("preprocess_src") {
"cr.js",
"event_tracker.js",
"i18n_behavior.js",
+ "i18n_template_no_process.js",
"list_property_update_behavior.js",
"parse_html_subset.js",
"polymer_config.js",
@@ -134,7 +136,6 @@ preprocess_if_expr("preprocess_generated") {
if (include_polymer) {
in_files += [
"i18n_behavior.m.js",
- "list_property_update_behavior.m.js",
"web_ui_listener_behavior.m.js",
]
}
@@ -150,36 +151,45 @@ preprocess_if_expr("preprocess_generated") {
}
group("closure_compile") {
- deps = [
- ":js_resources",
- "cr:closure_compile",
- "cr/ui:closure_compile",
- ]
+ deps = [ ":js_resources" ]
+ if (is_chromeos_ash) {
+ deps += [
+ "cr:closure_compile",
+ "cr/ui:closure_compile",
+ ]
+ }
}
js_type_check("js_resources") {
uses_legacy_modules = true
deps = [
- ":action_link",
":assert",
":cr",
- ":event_tracker",
- ":i18n_behavior",
- ":i18n_template_no_process",
- ":list_property_update_behavior",
":load_time_data",
- ":parse_html_subset",
":promise_resolver",
":util",
- ":web_ui_listener_behavior",
":webui_resource_test",
]
+
if (is_ios) {
deps += [ "ios:web_ui" ]
}
+
+ if (is_chromeos_ash) {
+ deps += [
+ ":action_link",
+ ":event_tracker",
+ ":i18n_behavior",
+ ":i18n_template_no_process",
+ ":parse_html_subset",
+ ":web_ui_listener_behavior",
+ ]
+ }
}
-js_library("action_link") {
+if (is_chromeos_ash) {
+ js_library("action_link") {
+ }
}
js_library("assert") {
@@ -193,22 +203,20 @@ js_library("cr") {
externs_list = [ "$externs_path/chrome_send.js" ]
}
-js_library("event_tracker") {
- deps = [ ":cr" ]
-}
-
-js_library("i18n_template_no_process") {
- deps = [ ":load_time_data" ]
-}
-
-js_library("i18n_behavior") {
- deps = [
- ":load_time_data",
- ":parse_html_subset",
- ]
-}
+if (is_chromeos_ash) {
+ js_library("event_tracker") {
+ deps = [ ":cr" ]
+ }
-js_library("list_property_update_behavior") {
+ js_library("i18n_template_no_process") {
+ deps = [ ":load_time_data" ]
+ }
+ js_library("i18n_behavior") {
+ deps = [
+ ":load_time_data",
+ ":parse_html_subset",
+ ]
+ }
}
js_library("load_time_data") {
@@ -216,7 +224,9 @@ js_library("load_time_data") {
extra_deps = [ ":unmodulize" ]
}
-js_library("parse_html_subset") {
+if (is_chromeos_ash) {
+ js_library("parse_html_subset") {
+ }
}
js_library("promise_resolver") {
@@ -231,8 +241,10 @@ js_library("util") {
js_library("webview_manager") {
}
-js_library("web_ui_listener_behavior") {
- deps = [ ":cr" ]
+if (is_chromeos_ash) {
+ js_library("web_ui_listener_behavior") {
+ deps = [ ":cr" ]
+ }
}
js_library("webui_resource_test") {
@@ -253,7 +265,6 @@ js_modulizer("modulize_local") {
"assert.js",
"event_tracker.js",
"i18n_behavior.js",
- "list_property_update_behavior.js",
"parse_html_subset.js",
"promise_resolver.js",
"util.js",
@@ -268,10 +279,8 @@ js_modulizer("modulize_local") {
]
}
- namespace_rewrites = [
- "cr.search_highlight_utils.Range|Range",
- "Polymer.ArraySplice.calculateSplices|calculateSplices",
- ]
+ namespace_rewrites =
+ [ "Polymer.ArraySplice.calculateSplices|calculateSplices" ]
}
js_unmodulizer("unmodulize") {
@@ -294,12 +303,11 @@ js_type_check("js_resources_modules") {
":event_tracker.m",
":i18n_behavior.m",
":icon",
- ":list_property_update_behavior.m",
+ ":list_property_update_behavior",
":load_time_data.m",
":parse_html_subset.m",
":plural_string_proxy",
":promise_resolver.m",
- ":search_highlight_utils",
":static_types",
":util.m",
":web_ui_listener_behavior.m",
@@ -345,14 +353,10 @@ js_library("i18n_behavior.m") {
extra_deps = [ ":modulize_local" ]
}
-js_library("list_property_update_behavior.m") {
- sources = [
- "$root_gen_dir/ui/webui/resources/js/list_property_update_behavior.m.js",
- ]
+js_library("list_property_update_behavior") {
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
- extra_deps = [ ":modulize_local" ]
}
js_library("load_time_data.m") {
@@ -401,10 +405,6 @@ js_library("promise_resolver.m") {
extra_deps = [ ":modulize_local" ]
}
-js_library("search_highlight_utils") {
- deps = [ ":assert.m" ]
-}
-
js_library("static_types") {
deps = [ ":assert.m" ]
}
diff --git a/chromium/ui/webui/resources/js/browser_command/BUILD.gn b/chromium/ui/webui/resources/js/browser_command/BUILD.gn
index a8210cafec1..1c81fde967b 100644
--- a/chromium/ui/webui/resources/js/browser_command/BUILD.gn
+++ b/chromium/ui/webui/resources/js/browser_command/BUILD.gn
@@ -52,6 +52,7 @@ generate_grd("build_grdp") {
grd_prefix = "webui_js_browser_command"
out_grd = "$target_gen_dir/resources.grdp"
public_deps = [ ":build_ts" ]
- manifest_files = [ "$target_gen_dir/tsconfig.manifest" ]
+ manifest_files =
+ filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
resource_path_prefix = "js/browser_command"
}
diff --git a/chromium/ui/webui/resources/js/browser_command/browser_command.mojom b/chromium/ui/webui/resources/js/browser_command/browser_command.mojom
index e4677c4ae8f..749b01ebcf9 100644
--- a/chromium/ui/webui/resources/js/browser_command/browser_command.mojom
+++ b/chromium/ui/webui/resources/js/browser_command/browser_command.mojom
@@ -20,6 +20,9 @@ enum Command {
kOpenSafeBrowsingEnhancedProtectionSettings = 2,
kOpenFeedbackForm = 3,
kOpenPrivacyGuide = 4,
+ kStartTabGroupTutorial = 5,
+ kOpenPasswordManager = 6,
+ kNoOpCommand = 7,
};
// Click information needed to determine user's desired window disposition using
diff --git a/chromium/ui/webui/resources/js/cr.gni b/chromium/ui/webui/resources/js/cr.gni
index 1a20b8a0956..7fb7ae5bf70 100644
--- a/chromium/ui/webui/resources/js/cr.gni
+++ b/chromium/ui/webui/resources/js/cr.gni
@@ -10,9 +10,6 @@ cr_namespace_rewrites = [
"cr.ui.Command|Command",
"cr.ui.contextMenuHandler|contextMenuHandler",
"cr.ui.decorate|decorate",
- "cr.ui.dialogs.BaseDialog|BaseDialog",
- "cr.ui.dialogs.AlertDialog|AlertDialog",
- "cr.ui.dialogs.ConfirmDialog|ConfirmDialog",
"cr.ui.Action|Action",
"cr.ui.AnchorType|AnchorType",
"cr.ui.ArrayDataModel|ArrayDataModel",
@@ -35,8 +32,5 @@ cr_namespace_rewrites = [
"cr.ui.Size|Size",
"cr.ui.Splitter|Splitter",
"cr.ui.StoreObserver|StoreObserver",
- "cr.ui.Tab|Tab",
- "cr.ui.Tree|Tree",
- "cr.ui.TreeItem|TreeItem",
"cr.ui.VirtualFocusRow|VirtualFocusRow",
]
diff --git a/chromium/ui/webui/resources/js/cr.js b/chromium/ui/webui/resources/js/cr.js
index feaf427cf7f..fb182dc4073 100644
--- a/chromium/ui/webui/resources/js/cr.js
+++ b/chromium/ui/webui/resources/js/cr.js
@@ -84,7 +84,7 @@ var cr = cr || function(global) {
* element has the attribute then the value is true.
* Use only for properties of type {boolean}.
*/
- BOOL_ATTR: 'boolAttr'
+ BOOL_ATTR: 'boolAttr',
};
/**
@@ -451,6 +451,6 @@ var cr = cr || function(global) {
/** Whether this is on iOS. */
get isIOS() {
return /CriOS/.test(navigator.userAgent);
- }
+ },
};
}(this);
diff --git a/chromium/ui/webui/resources/js/cr.m.js b/chromium/ui/webui/resources/js/cr.m.js
index 4d772349508..6496724f80c 100644
--- a/chromium/ui/webui/resources/js/cr.m.js
+++ b/chromium/ui/webui/resources/js/cr.m.js
@@ -261,7 +261,7 @@ export const PropertyKind = {
* element has the attribute then the value is true.
* Use only for properties of type {boolean}.
*/
- BOOL_ATTR: 'boolAttr'
+ BOOL_ATTR: 'boolAttr',
};
/**
diff --git a/chromium/ui/webui/resources/js/cr/BUILD.gn b/chromium/ui/webui/resources/js/cr/BUILD.gn
index 577de971dd2..d2c90ba9255 100644
--- a/chromium/ui/webui/resources/js/cr/BUILD.gn
+++ b/chromium/ui/webui/resources/js/cr/BUILD.gn
@@ -2,30 +2,35 @@
# 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("//third_party/closure_compiler/compile_js.gni")
import("../../tools/js_modulizer.gni")
-js_type_check("closure_compile") {
- uses_legacy_modules = true
- deps = [
- ":event_target",
- ":ui",
- ]
+if (is_chromeos_ash) {
+ js_type_check("closure_compile") {
+ uses_legacy_modules = true
+ deps = [
+ ":event_target",
+ ":ui",
+ ]
+ }
}
js_type_check("closure_compile_modules") {
- deps = [
- ":event_target.m",
- ":ui.m",
- ]
+ deps = [ ":event_target.m" ]
+ if (is_chromeos_ash) {
+ deps += [ ":ui.m" ]
+ }
}
-js_library("event_target") {
- deps = [ "..:cr" ]
-}
+if (is_chromeos_ash) {
+ js_library("event_target") {
+ deps = [ "..:cr" ]
+ }
-js_library("ui") {
- deps = [ "..:cr" ]
+ js_library("ui") {
+ deps = [ "..:cr" ]
+ }
}
js_library("event_target.m") {
@@ -33,9 +38,13 @@ js_library("event_target.m") {
extra_deps = [ ":modulize_local" ]
}
-js_library("ui.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui.m.js" ]
- extra_deps = [ ":modulize_local" ]
+if (is_chromeos_ash) {
+ # Deprecated, and only used on Desktop by bluetooth-internals and ntp4, which
+ # have opted to drop typechecking.
+ js_library("ui.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui.m.js" ]
+ extra_deps = [ ":modulize_local" ]
+ }
}
group("modulize") {
diff --git a/chromium/ui/webui/resources/js/cr/ui.js b/chromium/ui/webui/resources/js/cr/ui.js
index 4b67bafa816..10ea83fd300 100644
--- a/chromium/ui/webui/resources/js/cr/ui.js
+++ b/chromium/ui/webui/resources/js/cr/ui.js
@@ -69,7 +69,8 @@ cr.define('cr.ui', function() {
* {@code decorate} method added to it.
*/
/* #export */ function define(tagNameOrFunction) {
- let createFunction, tagName;
+ let createFunction;
+ let tagName;
if (typeof tagNameOrFunction === 'function') {
createFunction = tagNameOrFunction;
tagName = '';
@@ -221,6 +222,6 @@ cr.define('cr.ui', function() {
define: define,
limitInputWidth: limitInputWidth,
toCssPx: toCssPx,
- swallowDoubleClick: swallowDoubleClick
+ swallowDoubleClick: swallowDoubleClick,
};
});
diff --git a/chromium/ui/webui/resources/js/cr/ui/BUILD.gn b/chromium/ui/webui/resources/js/cr/ui/BUILD.gn
index 274354356fa..ab455630b13 100644
--- a/chromium/ui/webui/resources/js/cr/ui/BUILD.gn
+++ b/chromium/ui/webui/resources/js/cr/ui/BUILD.gn
@@ -28,6 +28,19 @@ group("preprocess") {
public_deps = [
":preprocess_generated",
":preprocess_src",
+ ":preprocess_src_ts",
+ ]
+}
+
+# TS files are passed to a separate target so that they are not listed in the
+# |out_manifest|.
+preprocess_if_expr("preprocess_src_ts") {
+ in_folder = "."
+ out_folder = preprocess_folder
+ in_files = [
+ "drag_wrapper.ts",
+ "focus_grid.ts",
+ "store_ts.ts",
]
}
@@ -35,37 +48,38 @@ preprocess_if_expr("preprocess_src") {
in_folder = "./"
out_folder = "$preprocess_folder"
out_manifest = "$target_gen_dir/$preprocess_src_manifest"
- in_files = [
- "drag_wrapper.js",
- "focus_grid.js",
- "focus_outline_manager.js",
- "splitter.js",
- "store.js",
- "tree.js",
- ]
- if (is_chromeos_ash) {
+ in_files = [ "keyboard_shortcut_list.js" ]
+
+ if (!is_android) {
+ # The files below are deprecated, and are included on non-CrOS builds only
+ # for the old NTP (chrome://apps) page.
in_files += [
- "array_data_model.js",
"command.js",
"context_menu_handler.js",
- "dialogs.js",
+ "menu_button.js",
+ "menu_item.js",
+ "menu.js",
+ "position_util.js",
+ ]
+ }
+
+ if (is_chromeos_ash) {
+ in_files += [
+ "array_data_model.js",
"focus_manager.js",
+ "focus_outline_manager.js",
"focus_row.js",
"focus_row_behavior.js",
"focus_without_ink.js",
"grid.js",
- "keyboard_shortcut_list.js",
"list_item.js",
"list.js",
"list_selection_controller.js",
"list_selection_model.js",
"list_single_selection_model.js",
- "menu_button.js",
- "menu_item.js",
- "menu.js",
- "position_util.js",
"store_client.js",
+ "store.js",
]
}
}
@@ -76,235 +90,152 @@ preprocess_if_expr("preprocess_generated") {
out_folder = "$preprocess_folder"
out_manifest = "$target_gen_dir/$preprocess_gen_manifest"
in_files = [
- "array_data_model.m.js",
"focus_outline_manager.m.js",
"focus_row.m.js",
- "keyboard_shortcut_list.m.js",
- "list_item.m.js",
- "list.m.js",
- "list_selection_controller.m.js",
- "list_selection_model.m.js",
]
if (!is_android) {
in_files += [
- "command.m.js",
- "context_menu_handler.m.js",
"focus_row_behavior.m.js",
"focus_without_ink.m.js",
- "menu_button.m.js",
- "menu_item.m.js",
- "menu.m.js",
- "position_util.m.js",
]
}
if (is_chromeos_ash) {
in_files += [
- "dialogs.m.js",
+ "array_data_model.m.js",
"grid.m.js",
+ "list_item.m.js",
+ "list.m.js",
+ "list_selection_controller.m.js",
+ "list_selection_model.m.js",
"list_single_selection_model.m.js",
]
}
}
group("closure_compile") {
- deps = [
- ":ui_resources",
- ":ui_resources_modules",
- ]
-}
-
-js_type_check("ui_resources") {
- uses_legacy_modules = true
- deps = [
- ":array_data_model",
- ":command",
- ":context_menu_handler",
- ":dialogs",
- ":focus_manager",
- ":focus_outline_manager",
- ":focus_row",
- ":focus_row_behavior",
- ":focus_without_ink",
- ":keyboard_shortcut_list",
- ":list",
- ":list_item",
- ":list_selection_controller",
- ":list_selection_model",
- ":list_single_selection_model",
- ":menu",
- ":menu_button",
- ":menu_item",
- ":position_util",
- ]
-
+ deps = [ ":ui_resources_modules" ]
if (is_chromeos_ash) {
- deps += [ ":grid" ]
+ deps += [ ":ui_resources" ]
}
}
-js_library("array_data_model") {
- deps = [
- "..:event_target",
- "../..:cr",
- ]
-}
-
-js_library("command") {
- deps = [
- ":keyboard_shortcut_list",
- "..:ui",
- "../..:cr",
- ]
-}
-
-js_library("context_menu_handler") {
- deps = [
- ":menu",
- ":menu_button",
- ":position_util",
- "..:event_target",
- "..:ui",
- "../..:cr",
- ]
-}
-
-js_library("dialogs") {
- deps = [
- "../..:cr",
- "../..:util",
- ]
-}
-
-js_library("focus_manager") {
- deps = [ "../..:cr" ]
-}
-
-js_library("focus_outline_manager") {
- deps = [ "../..:cr" ]
-}
-
-js_library("focus_row_behavior") {
- deps = [
- ":focus_row",
- ":focus_without_ink",
- ]
-}
-
-js_library("focus_row") {
- deps = [
- "../..:assert",
- "../..:cr",
- "../..:event_tracker",
- "../..:util",
- ]
-}
-
-js_library("focus_without_ink") {
- deps = [
- "..:ui",
- "../..:cr",
- ]
-}
-
-js_library("grid") {
- deps = [ ":list" ]
-}
-
-js_library("keyboard_shortcut_list") {
- deps = [ "../..:cr" ]
-}
-
-js_library("list") {
- deps = [
- ":array_data_model",
- ":list_item",
- ":list_selection_controller",
- ":list_selection_model",
- ]
-}
+if (is_chromeos_ash) {
+ js_type_check("ui_resources") {
+ uses_legacy_modules = true
+ deps = [
+ ":array_data_model",
+ ":focus_manager",
+ ":focus_outline_manager",
+ ":focus_row",
+ ":focus_row_behavior",
+ ":focus_without_ink",
+ ":grid",
+ ":list",
+ ":list_item",
+ ":list_selection_controller",
+ ":list_selection_model",
+ ":list_single_selection_model",
+ ]
+ }
-js_library("list_item") {
- deps = [ "../..:cr" ]
-}
+ js_library("array_data_model") {
+ deps = [
+ "..:event_target",
+ "../..:cr",
+ ]
+ }
-js_library("list_selection_controller") {
- deps = [
- ":list_selection_model",
- "../..:cr",
- ]
-}
+ js_library("focus_manager") {
+ deps = [ "../..:cr" ]
+ }
-js_library("list_selection_model") {
- deps = [
- "..:event_target",
- "../..:cr",
- ]
-}
+ js_library("focus_outline_manager") {
+ deps = [ "../..:cr" ]
+ }
-js_library("list_single_selection_model") {
- deps = [
- "..:event_target",
- "../..:cr",
- ]
-}
+ if (is_chromeos_ash) {
+ js_library("focus_row_behavior") {
+ deps = [
+ ":focus_row",
+ ":focus_without_ink",
+ ]
+ }
+ }
-js_library("menu_button") {
- deps = [
- ":menu",
- ":menu_item",
- ":position_util",
- "..:ui",
- "../..:assert",
- "../..:cr",
- "../..:event_tracker",
- ]
-}
+ js_library("focus_row") {
+ deps = [
+ "../..:assert",
+ "../..:cr",
+ "../..:event_tracker",
+ "../..:util",
+ ]
+ }
-js_library("menu_item") {
- deps = [
- ":command",
- "..:ui",
- "../..:cr",
- "../..:load_time_data",
- ]
-}
+ js_library("focus_without_ink") {
+ deps = [
+ "..:ui",
+ "../..:cr",
+ ]
+ }
-js_library("menu") {
- deps = [
- ":menu_item",
- "..:ui",
- "../..:assert",
- "../..:cr",
- ]
-}
+ if (is_chromeos_ash) {
+ js_library("grid") {
+ deps = [ ":list" ]
+ }
+ }
-js_library("position_util") {
- deps = [ "../..:cr" ]
+ if (is_chromeos_ash) {
+ js_library("list") {
+ deps = [
+ ":array_data_model",
+ ":list_item",
+ ":list_selection_controller",
+ ":list_selection_model",
+ ]
+ }
+
+ js_library("list_item") {
+ deps = [ "../..:cr" ]
+ }
+
+ js_library("list_selection_controller") {
+ deps = [
+ ":list_selection_model",
+ "../..:cr",
+ ]
+ }
+
+ js_library("list_selection_model") {
+ deps = [
+ "..:event_target",
+ "../..:cr",
+ ]
+ }
+
+ js_library("list_single_selection_model") {
+ deps = [
+ "..:event_target",
+ "../..:cr",
+ ]
+ }
+ }
}
js_modulizer("modulize") {
input_files = [
"array_data_model.js",
- "command.js",
- "context_menu_handler.js",
- "dialogs.js",
"focus_outline_manager.js",
"focus_row.js",
"focus_row_behavior.js",
"focus_without_ink.js",
"grid.js",
- "keyboard_shortcut_list.js",
"list.js",
"list_item.js",
"list_selection_controller.js",
"list_selection_model.js",
"list_single_selection_model.js",
- "menu.js",
- "menu_button.js",
- "menu_item.js",
- "position_util.js",
]
namespace_rewrites = cr_namespace_rewrites
}
@@ -312,88 +243,67 @@ js_modulizer("modulize") {
js_type_check("ui_resources_modules") {
is_polymer3 = true
deps = [
- ":array_data_model.m",
- ":command.m",
- ":context_menu_handler.m",
- ":dialogs.m",
- ":drag_wrapper",
- ":focus_grid",
":focus_outline_manager.m",
":focus_row.m",
":focus_row_behavior.m",
":focus_without_ink.m",
- ":grid.m",
- ":keyboard_shortcut_list.m",
- ":list.m",
- ":list_item.m",
- ":list_selection_controller.m",
- ":list_selection_model.m",
- ":list_single_selection_model.m",
- ":menu.m",
- ":menu_button.m",
- ":menu_item.m",
- ":position_util.m",
- ":splitter",
- ":store",
- ":store_client",
- ":tree",
- ]
-}
-
-js_library("array_data_model.m") {
- sources =
- [ "$root_gen_dir/ui/webui/resources/js/cr/ui/array_data_model.m.js" ]
- deps = [
- "..:event_target.m",
- "../..:assert.m",
]
-
- extra_deps = [ ":modulize" ]
-}
-
-js_library("command.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/command.m.js" ]
- deps = [
- ":keyboard_shortcut_list.m",
- "../:ui.m",
- "../..:assert.m",
- "../..:cr.m",
- ]
-
- extra_deps = [ ":modulize" ]
+ if (is_chromeos_ash) {
+ deps += [
+ ":array_data_model.m",
+ ":command",
+ ":context_menu_handler",
+ ":grid.m",
+ ":keyboard_shortcut_list",
+ ":list.m",
+ ":list_item.m",
+ ":list_selection_controller.m",
+ ":list_selection_model.m",
+ ":list_single_selection_model.m",
+ ":menu",
+ ":menu_button",
+ ":menu_item",
+ ":position_util",
+ ":store",
+ ":store_client",
+ ]
+ }
}
-js_library("context_menu_handler.m") {
- sources =
- [ "$root_gen_dir/ui/webui/resources/js/cr/ui/context_menu_handler.m.js" ]
- deps = [
- ":menu.m",
- ":menu_button.m",
- ":menu_item.m",
- ":position_util.m",
- "..:event_target.m",
- "../:ui.m",
- "../..:assert.m",
- "../..:cr.m",
- "../..:event_tracker.m",
- ]
-
- extra_deps = [ ":modulize" ]
-}
+if (is_chromeos_ash) {
+ js_library("array_data_model.m") {
+ sources =
+ [ "$root_gen_dir/ui/webui/resources/js/cr/ui/array_data_model.m.js" ]
+ deps = [
+ "..:event_target.m",
+ "../..:assert.m",
+ ]
-js_library("dialogs.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/dialogs.m.js" ]
- extra_deps = [ ":modulize" ]
-}
+ extra_deps = [ ":modulize" ]
+ }
-js_library("drag_wrapper") {
-}
+ js_library("command") {
+ deps = [
+ ":keyboard_shortcut_list",
+ "../:ui.m",
+ "../..:assert.m",
+ "../..:cr.m",
+ ]
+ }
-js_library("focus_grid") {
- deps = [
- ":focus_row.m",
- "../..:assert.m",
- ]
+ js_library("context_menu_handler") {
+ deps = [
+ ":menu",
+ ":menu_button",
+ ":menu_item",
+ ":position_util",
+ "..:event_target.m",
+ "../:ui.m",
+ "../..:assert.m",
+ "../..:cr.m",
+ "../..:event_tracker.m",
+ ]
+ }
}
js_library("focus_outline_manager.m") {
@@ -434,137 +344,111 @@ js_library("focus_without_ink.m") {
extra_deps = [ ":modulize" ]
}
-js_library("grid.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/grid.m.js" ]
- deps = [
- ":list.m",
- ":list_item.m",
- ":list_selection_controller.m",
- ":list_selection_model.m",
- "../:ui.m",
- ]
- extra_deps = [ ":modulize" ]
-}
-
-js_library("keyboard_shortcut_list.m") {
- sources = [
- "$root_gen_dir/ui/webui/resources/js/cr/ui/keyboard_shortcut_list.m.js",
- ]
- extra_deps = [ ":modulize" ]
-}
-
-js_library("list.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/list.m.js" ]
- deps = [
- ":array_data_model.m",
- ":list_item.m",
- ":list_selection_controller.m",
- ":list_selection_model.m",
- "../:ui.m",
- "../..:cr.m",
- ]
- extra_deps = [ ":modulize" ]
-}
+if (is_chromeos_ash) {
+ js_library("grid.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/grid.m.js" ]
+ deps = [
+ ":list.m",
+ ":list_item.m",
+ ":list_selection_controller.m",
+ ":list_selection_model.m",
+ "../:ui.m",
+ ]
+ extra_deps = [ ":modulize" ]
+ }
-js_library("list_item.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/list_item.m.js" ]
- deps = [ "../..:cr.m" ]
- extra_deps = [ ":modulize" ]
-}
+ js_library("keyboard_shortcut_list") {
+ }
-js_library("list_selection_controller.m") {
- sources = [
- "$root_gen_dir/ui/webui/resources/js/cr/ui/list_selection_controller.m.js",
- ]
- deps = [
- ":list_selection_model.m",
- "../..:cr.m",
- ]
- extra_deps = [ ":modulize" ]
-}
+ js_library("list.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/list.m.js" ]
+ deps = [
+ ":array_data_model.m",
+ ":list_item.m",
+ ":list_selection_controller.m",
+ ":list_selection_model.m",
+ "../:ui.m",
+ "../..:cr.m",
+ ]
+ extra_deps = [ ":modulize" ]
+ }
-js_library("list_selection_model.m") {
- sources =
- [ "$root_gen_dir/ui/webui/resources/js/cr/ui/list_selection_model.m.js" ]
- deps = [
- "..:event_target.m",
- "../..:cr.m",
- ]
- extra_deps = [ ":modulize" ]
-}
+ js_library("list_item.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/list_item.m.js" ]
+ deps = [ "../..:cr.m" ]
+ extra_deps = [ ":modulize" ]
+ }
-js_library("list_single_selection_model.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/list_single_selection_model.m.js" ]
- deps = [
- "..:event_target.m",
- "../..:cr.m",
- ]
- extra_deps = [ ":modulize" ]
-}
+ js_library("list_selection_controller.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/list_selection_controller.m.js" ]
+ deps = [
+ ":list_selection_model.m",
+ "../..:cr.m",
+ ]
+ extra_deps = [ ":modulize" ]
+ }
-js_library("menu.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/menu.m.js" ]
- deps = [
- ":menu_item.m",
- "../:ui.m",
- "../..:assert.m",
- "../..:cr.m",
- ]
- extra_deps = [ ":modulize" ]
-}
+ js_library("list_selection_model.m") {
+ sources = [
+ "$root_gen_dir/ui/webui/resources/js/cr/ui/list_selection_model.m.js",
+ ]
+ deps = [
+ "..:event_target.m",
+ "../..:cr.m",
+ ]
+ extra_deps = [ ":modulize" ]
+ }
-js_library("menu_button.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/menu_button.m.js" ]
- deps = [
- ":menu.m",
- ":menu_item.m",
- ":position_util.m",
- "../:ui.m",
- "../..:assert.m",
- "../..:cr.m",
- "../..:event_tracker.m",
- ]
- extra_deps = [ ":modulize" ]
-}
+ js_library("list_single_selection_model.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/list_single_selection_model.m.js" ]
+ deps = [
+ "..:event_target.m",
+ "../..:cr.m",
+ ]
+ extra_deps = [ ":modulize" ]
+ }
-js_library("menu_item.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/menu_item.m.js" ]
- deps = [
- ":command.m",
- "../:ui.m",
- "../..:assert.m",
- "../..:cr.m",
- "../..:load_time_data.m",
- ]
- extra_deps = [ ":modulize" ]
-}
+ js_library("menu") {
+ deps = [
+ ":menu_item",
+ "../:ui.m",
+ "../..:assert.m",
+ "../..:cr.m",
+ ]
+ }
-js_library("position_util.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/position_util.m.js" ]
- extra_deps = [ ":modulize" ]
-}
+ js_library("menu_button") {
+ deps = [
+ ":menu",
+ ":menu_item",
+ ":position_util",
+ "../:ui.m",
+ "../..:assert.m",
+ "../..:cr.m",
+ "../..:event_tracker.m",
+ ]
+ }
-js_library("splitter") {
- deps = [
- "..:ui.m",
- "../..:cr.m",
- ]
-}
+ js_library("menu_item") {
+ deps = [
+ ":command",
+ "../:ui.m",
+ "../..:assert.m",
+ "../..:cr.m",
+ "../..:load_time_data.m",
+ ]
+ }
-js_library("store") {
-}
+ js_library("position_util") {
+ }
-js_library("store_client") {
- deps = [
- ":store",
- "../..:assert.m",
- ]
-}
+ js_library("store") {
+ }
-js_library("tree") {
- deps = [
- "../:ui.m",
- "../..:assert.m",
- "../..:cr.m",
- ]
+ js_library("store_client") {
+ deps = [
+ ":store",
+ "../..:assert.m",
+ ]
+ }
}
diff --git a/chromium/ui/webui/resources/js/cr/ui/command.js b/chromium/ui/webui/resources/js/cr/ui/command.js
index 6351638e99f..9f68bb8322c 100644
--- a/chromium/ui/webui/resources/js/cr/ui/command.js
+++ b/chromium/ui/webui/resources/js/cr/ui/command.js
@@ -21,20 +21,19 @@
*/
// clang-format off
-// #import {assert} from '../../assert.m.js';
-// #import {define as crUiDefine} from '../ui.m.js';
-// #import {KeyboardShortcutList} from './keyboard_shortcut_list.m.js';
-// #import {dispatchPropertyChange, getPropertyDescriptor, PropertyKind} from '../../cr.m.js';
-// #import {MenuItem} from './menu_item.m.js';
+import {assert} from '../../assert.m.js';
+import {define as crUiDefine} from '../ui.m.js';
+import {KeyboardShortcutList} from './keyboard_shortcut_list.js';
+import {dispatchPropertyChange, getPropertyDescriptor, PropertyKind} from '../../cr.m.js';
+import {MenuItem} from './menu_item.js';
// clang-format on
-cr.define('cr.ui', function() {
/**
* Creates a new command element.
* @constructor
* @extends {HTMLElement}
*/
- /* #export */ const Command = cr.ui.define('command');
+ export const Command = crUiDefine('command');
Command.prototype = {
__proto__: HTMLElement.prototype,
@@ -102,11 +101,11 @@ cr.define('cr.ui', function() {
set shortcut(shortcut) {
const oldShortcut = this.shortcut_;
if (shortcut !== oldShortcut) {
- this.keyboardShortcuts_ = new cr.ui.KeyboardShortcutList(shortcut);
+ this.keyboardShortcuts_ = new KeyboardShortcutList(shortcut);
// Set this after the keyboardShortcuts_ since that might throw.
this.shortcut_ = shortcut;
- cr.dispatchPropertyChange(
+ dispatchPropertyChange(
this, 'shortcut', this.shortcut_, oldShortcut);
}
},
@@ -131,7 +130,7 @@ cr.define('cr.ui', function() {
Command.prototype.label;
Object.defineProperty(
Command.prototype, 'label',
- cr.getPropertyDescriptor('label', cr.PropertyKind.ATTR));
+ getPropertyDescriptor('label', PropertyKind.ATTR));
/**
* Whether the command is disabled or not.
@@ -140,14 +139,14 @@ cr.define('cr.ui', function() {
Command.prototype.disabled;
Object.defineProperty(
Command.prototype, 'disabled',
- cr.getPropertyDescriptor('disabled', cr.PropertyKind.BOOL_ATTR));
+ getPropertyDescriptor('disabled', PropertyKind.BOOL_ATTR));
/**
* Whether the command is hidden or not.
*/
Object.defineProperty(
Command.prototype, 'hidden',
- cr.getPropertyDescriptor('hidden', cr.PropertyKind.BOOL_ATTR));
+ getPropertyDescriptor('hidden', PropertyKind.BOOL_ATTR));
/**
* Whether the command is checked or not.
@@ -156,7 +155,7 @@ cr.define('cr.ui', function() {
Command.prototype.checked;
Object.defineProperty(
Command.prototype, 'checked',
- cr.getPropertyDescriptor('checked', cr.PropertyKind.BOOL_ATTR));
+ getPropertyDescriptor('checked', PropertyKind.BOOL_ATTR));
/**
* The flag that prevents the shortcut text from being displayed on menu.
@@ -169,11 +168,11 @@ cr.define('cr.ui', function() {
Command.prototype.hideShortcutText;
Object.defineProperty(
Command.prototype, 'hideShortcutText',
- cr.getPropertyDescriptor('hideShortcutText', cr.PropertyKind.BOOL_ATTR));
+ getPropertyDescriptor('hideShortcutText', PropertyKind.BOOL_ATTR));
/**
* Dispatches a canExecute event on the target.
- * @param {!cr.ui.Command} command The command that we are testing for.
+ * @param {!Command} command The command that we are testing for.
* @param {EventTarget} target The target element to dispatch the event on.
*/
function dispatchCanExecuteEvent(command, target) {
@@ -224,7 +223,7 @@ cr.define('cr.ui', function() {
const target = e.target;
// Ignore focus on a menu button or command item.
- if (target.menu || target.command || (target instanceof cr.ui.MenuItem)) {
+ if (target.menu || target.command || (target instanceof MenuItem)) {
return;
}
@@ -261,17 +260,17 @@ cr.define('cr.ui', function() {
}
}
}
- }
+ },
};
/**
* The event type used for canExecute events.
- * @param {!cr.ui.Command} command The command that we are evaluating.
+ * @param {!Command} command The command that we are evaluating.
* @extends {Event}
* @constructor
* @class
*/
- /* #export */ function CanExecuteEvent(command) {
+ export function CanExecuteEvent(command) {
const e = new Event('canExecute', {bubbles: true, cancelable: true});
e.__proto__ = CanExecuteEvent.prototype;
e.command = command;
@@ -283,7 +282,7 @@ cr.define('cr.ui', function() {
/**
* The current command
- * @type {cr.ui.Command}
+ * @type {Command}
*/
command: null,
@@ -301,14 +300,5 @@ cr.define('cr.ui', function() {
this.canExecute_ = !!canExecute;
this.stopPropagation();
this.preventDefault();
- }
- };
-
- // Export
- // #cr_define_end
- console.warn('crbug/1173575, non-JS module files deprecated.');
- return {
- Command: Command,
- CanExecuteEvent: CanExecuteEvent,
+ },
};
-});
diff --git a/chromium/ui/webui/resources/js/cr/ui/context_menu_handler.m.d.ts b/chromium/ui/webui/resources/js/cr/ui/context_menu_handler.d.ts
index 0227a74b0dd..03ca296befa 100644
--- a/chromium/ui/webui/resources/js/cr/ui/context_menu_handler.m.d.ts
+++ b/chromium/ui/webui/resources/js/cr/ui/context_menu_handler.d.ts
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import {Menu} from './menu.m.js';
-import {HideType} from './menu_button.m.js';
+import {Menu} from './menu.js';
+import {HideType} from './menu_button.js';
export const contextMenuHandler: ContextMenuHandler;
diff --git a/chromium/ui/webui/resources/js/cr/ui/context_menu_handler.js b/chromium/ui/webui/resources/js/cr/ui/context_menu_handler.js
index 50e3b43cc31..a699a8d8822 100644
--- a/chromium/ui/webui/resources/js/cr/ui/context_menu_handler.js
+++ b/chromium/ui/webui/resources/js/cr/ui/context_menu_handler.js
@@ -7,36 +7,32 @@
// should only be used by legacy UIs that have not yet been updated to new
// patterns. Use Web Components in any new code.
-// require: event_target.js
-
// clang-format off
-// #import {assertInstanceof} from '../../assert.m.js';
-// #import {NativeEventTarget as EventTarget} from '../event_target.m.js'
-// #import {EventTracker} from '../../event_tracker.m.js'
-// #import {isWindows, isLinux, isMac, isLacros, dispatchPropertyChange} from '../../cr.m.js';
-// #import {decorate} from '../ui.m.js';
-// #import {Menu} from './menu.m.js';
-// #import {MenuItem} from './menu_item.m.js';
-// #import {HideType} from './menu_button.m.js';
-// #import {positionPopupAtPoint} from './position_util.m.js';
+import {assertInstanceof} from '../../assert.m.js';
+import {NativeEventTarget as EventTarget} from '../event_target.m.js';
+import {EventTracker} from '../../event_tracker.m.js';
+import {isWindows, isLinux, isMac, isLacros, dispatchPropertyChange} from '../../cr.m.js';
+import {decorate} from '../ui.m.js';
+import {Menu} from './menu.js';
+import {MenuItem} from './menu_item.js';
+import {HideType} from './menu_button.js';
+import {positionPopupAtPoint} from './position_util.js';
// clang-format on
-cr.define('cr.ui', function() {
- /* #ignore */ /** @const */ const Menu = cr.ui.Menu;
/**
* Handles context menus.
* @implements {EventListener}
*/
- class ContextMenuHandler extends cr.EventTarget {
+ class ContextMenuHandler extends EventTarget {
constructor() {
super();
- /** @private {!cr.EventTracker} */
- this.showingEvents_ = new cr.EventTracker();
+ /** @private {!EventTracker} */
+ this.showingEvents_ = new EventTracker();
/**
* The menu that we are currently showing.
- * @private {?cr.ui.Menu}
+ * @private {?Menu}
*/
this.menu_ = null;
@@ -55,7 +51,7 @@ cr.define('cr.ui', function() {
* Shows a menu as a context menu.
* @param {!Event} e The event triggering the show (usually a contextmenu
* event).
- * @param {!cr.ui.Menu} menu The menu to show.
+ * @param {!Menu} menu The menu to show.
*/
showMenu(e, menu) {
menu.updateCommands(assertInstanceof(e.currentTarget, Node));
@@ -90,8 +86,8 @@ cr.define('cr.ui', function() {
/**
* Hide the currently shown menu.
- * @param {cr.ui.HideType=} opt_hideType Type of hide.
- * default: cr.ui.HideType.INSTANT.
+ * @param {HideType=} opt_hideType Type of hide.
+ * default: HideType.INSTANT.
*/
hideMenu(opt_hideType) {
const menu = this.menu;
@@ -99,7 +95,7 @@ cr.define('cr.ui', function() {
return;
}
- if (opt_hideType === cr.ui.HideType.DELAYED) {
+ if (opt_hideType === HideType.DELAYED) {
menu.classList.add('hide-delayed');
} else {
menu.classList.remove('hide-delayed');
@@ -114,7 +110,7 @@ cr.define('cr.ui', function() {
// On windows we might hide the menu in a right mouse button up and if
// that is the case we wait some short period before we allow the menu
// to be shown again.
- this.hideTimestamp_ = cr.isWindows ? Date.now() : 0;
+ this.hideTimestamp_ = isWindows ? Date.now() : 0;
const ev = new Event('hide');
ev.element = originalContextElement;
@@ -125,14 +121,15 @@ cr.define('cr.ui', function() {
/**
* Positions the menu
* @param {!Event} e The event object triggering the showing.
- * @param {!cr.ui.Menu} menu The menu to position.
+ * @param {!Menu} menu The menu to position.
* @private
*/
positionMenu_(e, menu) {
// TODO(arv): Handle scrolled documents when needed.
const element = e.currentTarget;
- let x, y;
+ let x;
+ let y;
// When the user presses the context menu key (on the keyboard) we need
// to detect this.
if (this.keyIsDown_) {
@@ -147,7 +144,7 @@ cr.define('cr.ui', function() {
y = e.clientY;
}
- cr.ui.positionPopupAtPoint(x, y, menu);
+ positionPopupAtPoint(x, y, menu);
}
/**
@@ -180,7 +177,7 @@ cr.define('cr.ui', function() {
if (!this.menu.contains(e.target)) {
this.hideMenu();
if (e.button === 0 /* Left button */ &&
- (cr.isLinux || cr.isMac || cr.isLacros)) {
+ (isLinux || isMac || isLacros)) {
// Emulate Mac and Linux, which swallow native 'mousedown' events
// that close menus.
e.preventDefault();
@@ -213,9 +210,9 @@ cr.define('cr.ui', function() {
case 'activate':
const hideDelayed =
- e.target instanceof cr.ui.MenuItem && e.target.checkable;
+ e.target instanceof MenuItem && e.target.checkable;
this.hideMenu(
- hideDelayed ? cr.ui.HideType.DELAYED : cr.ui.HideType.INSTANT);
+ hideDelayed ? HideType.DELAYED : HideType.INSTANT);
break;
case 'focus':
@@ -265,7 +262,7 @@ cr.define('cr.ui', function() {
if (typeof menu === 'string' && menu[0] === '#') {
menu = this.ownerDocument.getElementById(menu.slice(1));
- cr.ui.decorate(menu, Menu);
+ decorate(menu, Menu);
}
if (menu === oldContextMenu) {
@@ -289,7 +286,7 @@ cr.define('cr.ui', function() {
this.setAttribute('contextmenu', '#' + menu.id);
}
- cr.dispatchPropertyChange(this, 'contextMenu', menu, oldContextMenu);
+ dispatchPropertyChange(this, 'contextMenu', menu, oldContextMenu);
});
if (!target.getRectForContextMenu) {
@@ -307,7 +304,7 @@ cr.define('cr.ui', function() {
* Sets the given contextMenu to the given element. A contextMenu property
* would be added if necessary.
* @param {!Element} element The element or class to set the contextMenu to.
- * @param {!cr.ui.Menu} contextMenu The contextMenu property to be set.
+ * @param {!Menu} contextMenu The contextMenu property to be set.
*/
setContextMenu(element, contextMenu) {
if (!element.contextMenu) {
@@ -321,12 +318,4 @@ cr.define('cr.ui', function() {
* The singleton context menu handler.
* @type {!ContextMenuHandler}
*/
- /* #export */ const contextMenuHandler = new ContextMenuHandler();
-
- // Export
- // #cr_define_end
- console.warn('crbug/1173575, non-JS module files deprecated.');
- return {
- contextMenuHandler: contextMenuHandler,
- };
-});
+ export const contextMenuHandler = new ContextMenuHandler();
diff --git a/chromium/ui/webui/resources/js/cr/ui/dialogs.js b/chromium/ui/webui/resources/js/cr/ui/dialogs.js
deleted file mode 100644
index 4ae3b36aee2..00000000000
--- a/chromium/ui/webui/resources/js/cr/ui/dialogs.js
+++ /dev/null
@@ -1,396 +0,0 @@
-// Copyright (c) 2012 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 {isRTL} from 'chrome://resources/js/util.m.js'
-
-cr.define('cr.ui.dialogs', function() {
- /**
- * @constructor
- */
- /* #export */ function BaseDialog(parentNode) {
- this.parentNode_ = parentNode;
- this.document_ = parentNode.ownerDocument;
-
- // The DOM element from the dialog which should receive focus when the
- // dialog is first displayed.
- this.initialFocusElement_ = null;
-
- // The DOM element from the parent which had focus before we were displayed,
- // so we can restore it when we're hidden.
- this.previousActiveElement_ = null;
-
- /**
- * If set true, BaseDialog assumes that focus traversal of elements inside
- * the dialog due to 'Tab' key events is handled by its container (and the
- * practical example is this.parentNode_ is a modal <dialog> element).
- *
- * The default is false: BaseDialog handles focus traversal for the entire
- * DOM document. See findFocusableElements_(), also crbug.com/1078300.
- *
- * @protected {boolean}
- */
- this.hasModalContainer = false;
-
- /** @private{boolean} */
- this.showing_ = false;
-
- /** @protected {?Element} */
- this.container = null;
-
- /** @protected {?Element} */
- this.frame = null;
-
- /** @protected {?Element} */
- this.title = null;
-
- /** @protected {?Element} */
- this.text = null;
-
- /** @protected {?Element} */
- this.closeButton = null;
-
- /** @protected {?Element} */
- this.okButton = null;
-
- /** @protected {?Element} */
- this.cancelButton = null;
-
- /** @protected {?Element} */
- this.buttons = null;
-
- this.initDom();
- }
-
- /**
- * Default text for Ok and Cancel buttons.
- *
- * Clients should override these with localized labels.
- */
- BaseDialog.OK_LABEL = '[LOCALIZE ME] Ok';
- BaseDialog.CANCEL_LABEL = '[LOCALIZE ME] Cancel';
-
- /**
- * Number of miliseconds animation is expected to take, plus some margin for
- * error.
- */
- BaseDialog.ANIMATE_STABLE_DURATION = 500;
-
- /** @protected */
- BaseDialog.prototype.initDom = function() {
- const doc = this.document_;
- this.container = doc.createElement('div');
- this.container.className = 'cr-dialog-container';
- this.container.addEventListener(
- 'keydown', this.onContainerKeyDown.bind(this));
- this.shield_ = doc.createElement('div');
- this.shield_.className = 'cr-dialog-shield';
- this.container.appendChild(this.shield_);
- this.container.addEventListener(
- 'mousedown', this.onContainerMouseDown_.bind(this));
-
- this.frame = doc.createElement('div');
- this.frame.className = 'cr-dialog-frame';
- this.frame.setAttribute('role', 'dialog');
- // Elements that have negative tabIndex can be focused but are not traversed
- // by Tab key.
- this.frame.tabIndex = -1;
- this.container.appendChild(this.frame);
-
- this.title = doc.createElement('div');
- this.title.className = 'cr-dialog-title';
- this.frame.appendChild(this.title);
-
- this.closeButton = doc.createElement('div');
- this.closeButton.className = 'cr-dialog-close';
- this.closeButton.addEventListener('click', this.onCancelClick_.bind(this));
- this.frame.appendChild(this.closeButton);
-
- this.text = doc.createElement('div');
- this.text.className = 'cr-dialog-text';
- this.frame.appendChild(this.text);
-
- this.buttons = doc.createElement('div');
- this.buttons.className = 'cr-dialog-buttons';
- this.frame.appendChild(this.buttons);
-
- this.okButton = doc.createElement('button');
- this.okButton.className = 'cr-dialog-ok';
- this.okButton.textContent = BaseDialog.OK_LABEL;
- this.okButton.addEventListener('click', this.onOkClick_.bind(this));
- this.buttons.appendChild(this.okButton);
-
- this.cancelButton = doc.createElement('button');
- this.cancelButton.className = 'cr-dialog-cancel';
- this.cancelButton.textContent = BaseDialog.CANCEL_LABEL;
- this.cancelButton.addEventListener('click', this.onCancelClick_.bind(this));
- this.buttons.appendChild(this.cancelButton);
-
- this.initialFocusElement_ = this.okButton;
- };
-
- /** @private {Function|undefined} */
- BaseDialog.prototype.onOk_ = null;
-
- /** @private {Function|undefined} */
- BaseDialog.prototype.onCancel_ = null;
-
- /** @protected */
- BaseDialog.prototype.onContainerKeyDown = function(event) {
- // 0=cancel, 1=ok.
- const focus = i => [this.cancelButton, this.okButton][i].focus();
-
- if (event.key === 'Escape' && !this.cancelButton.disabled) {
- this.onCancelClick_(event);
- } else if (event.key === 'ArrowLeft') {
- focus(isRTL() ? 1 : 0);
- } else if (event.key === 'ArrowRight') {
- focus(isRTL() ? 0 : 1);
- } else {
- // Not handled, so return and allow event to propagate.
- return;
- }
- event.stopPropagation();
- event.preventDefault();
- };
-
- /** @private */
- BaseDialog.prototype.onContainerMouseDown_ = function(event) {
- if (event.target === this.container) {
- const classList = this.container.classList;
- // Start 'pulse' animation.
- classList.remove('pulse');
- setTimeout(classList.add.bind(classList, 'pulse'), 0);
- event.preventDefault();
- }
- };
-
- /** @private */
- BaseDialog.prototype.onOkClick_ = function(event) {
- this.hide();
- if (this.onOk_) {
- this.onOk_();
- }
- };
-
- /** @private */
- BaseDialog.prototype.onCancelClick_ = function(event) {
- this.hide();
- if (this.onCancel_) {
- this.onCancel_();
- }
- };
-
- /** @param {string} label */
- BaseDialog.prototype.setOkLabel = function(label) {
- this.okButton.textContent = label;
- };
-
- /** @param {string} label */
- BaseDialog.prototype.setCancelLabel = function(label) {
- this.cancelButton.textContent = label;
- };
-
- BaseDialog.prototype.setInitialFocusOnCancel = function() {
- this.initialFocusElement_ = this.cancelButton;
- };
-
- /**
- * @param {string} message
- * @param {Function=} opt_onOk
- * @param {Function=} opt_onCancel
- * @param {Function=} opt_onShow
- */
- BaseDialog.prototype.show = function(
- message, opt_onOk, opt_onCancel, opt_onShow) {
- this.showWithTitle('', message, opt_onOk, opt_onCancel, opt_onShow);
- };
-
- /**
- * @param {string} title
- * @param {string} message
- * @param {Function=} opt_onOk
- * @param {Function=} opt_onCancel
- * @param {Function=} opt_onShow
- */
- BaseDialog.prototype.showHtml = function(
- title, message, opt_onOk, opt_onCancel, opt_onShow) {
- this.text.innerHTML = message;
- this.show_(title, opt_onOk, opt_onCancel, opt_onShow);
- };
-
- /** @private */
- BaseDialog.prototype.findFocusableElements_ = function(doc) {
- let elements =
- Array.prototype.filter.call(doc.querySelectorAll('*'), function(n) {
- return n.tabIndex >= 0;
- });
-
- const iframes = doc.querySelectorAll('iframe');
- for (let i = 0; i < iframes.length; i++) {
- // Some iframes have an undefined contentDocument for security reasons,
- // such as chrome://terms (which is used in the chromeos OOBE screens).
- const iframe = iframes[i];
- let contentDoc;
- try {
- contentDoc = iframe.contentDocument;
- } catch (e) {
- } // ignore SecurityError
- if (contentDoc) {
- elements = elements.concat(this.findFocusableElements_(contentDoc));
- }
- }
- return elements;
- };
-
- /**
- * @param {string} title
- * @param {string} message
- * @param {Function=} opt_onOk
- * @param {Function=} opt_onCancel
- * @param {Function=} opt_onShow
- */
- BaseDialog.prototype.showWithTitle = function(
- title, message, opt_onOk, opt_onCancel, opt_onShow) {
- this.text.textContent = message;
- this.show_(title, opt_onOk, opt_onCancel, opt_onShow);
- };
-
- /**
- * @param {string} title
- * @param {Function=} opt_onOk
- * @param {Function=} opt_onCancel
- * @param {Function=} opt_onShow
- * @private
- */
- BaseDialog.prototype.show_ = function(
- title, opt_onOk, opt_onCancel, opt_onShow) {
- this.showing_ = true;
-
- // Modal containers manage dialog focus traversal. Otherwise, the focus
- // is managed by |this| dialog, by making all outside nodes unfocusable
- // while the dialog is shown.
- if (!this.hasModalContainer) {
- this.deactivatedNodes_ = this.findFocusableElements_(this.document_);
- this.tabIndexes_ = this.deactivatedNodes_.map(function(n) {
- return n.getAttribute('tabindex');
- });
- this.deactivatedNodes_.forEach(function(n) {
- n.tabIndex = -1;
- });
- } else {
- this.deactivatedNodes_ = [];
- }
-
- this.previousActiveElement_ = this.document_.activeElement;
- this.parentNode_.appendChild(this.container);
-
- this.onOk_ = opt_onOk;
- this.onCancel_ = opt_onCancel;
-
- if (title) {
- this.title.textContent = title;
- this.title.hidden = false;
- this.frame.setAttribute('aria-label', title);
- } else {
- this.title.textContent = '';
- this.title.hidden = true;
- this.frame.removeAttribute('aria-label');
- }
-
- const self = this;
- setTimeout(function() {
- // Check that hide() was not called in between.
- if (self.showing_) {
- self.container.classList.add('shown');
- self.initialFocusElement_.focus();
- }
- setTimeout(function() {
- if (opt_onShow) {
- opt_onShow();
- }
- }, BaseDialog.ANIMATE_STABLE_DURATION);
- }, 0);
- };
-
- /** @param {Function=} opt_onHide */
- BaseDialog.prototype.hide = function(opt_onHide) {
- this.showing_ = false;
-
- // Restore focusability for the non-modal container case.
- for (let i = 0; i < this.deactivatedNodes_.length; i++) {
- const node = this.deactivatedNodes_[i];
- if (this.tabIndexes_[i] === null) {
- node.removeAttribute('tabindex');
- } else {
- node.setAttribute('tabindex', this.tabIndexes_[i]);
- }
- }
- this.deactivatedNodes_ = null;
- this.tabIndexes_ = null;
-
- this.container.classList.remove('shown');
- this.container.classList.remove('pulse');
-
- if (this.previousActiveElement_) {
- this.previousActiveElement_.focus();
- } else {
- this.document_.body.focus();
- }
-
- const self = this;
- setTimeout(function() {
- // Wait until the transition is done before removing the dialog.
- // Check show() was not called in between.
- // It is also possible to show/hide/show/hide and have hide called twice
- // and container already removed from parentNode_.
- if (!self.showing_ && self.parentNode_ === self.container.parentNode) {
- self.parentNode_.removeChild(self.container);
- }
- if (opt_onHide) {
- opt_onHide();
- }
- }, BaseDialog.ANIMATE_STABLE_DURATION);
- };
-
- /**
- * AlertDialog contains just a message and an ok button.
- * @constructor
- * @extends {cr.ui.dialogs.BaseDialog}
- */
- /* #export */ function AlertDialog(parentNode) {
- BaseDialog.call(this, parentNode);
- this.cancelButton.style.display = 'none';
- }
-
- AlertDialog.prototype = {__proto__: BaseDialog.prototype};
-
- /**
- * @param {Function=} opt_onOk
- * @param {Function=} opt_onShow
- * @override
- */
- AlertDialog.prototype.show = function(message, opt_onOk, opt_onShow) {
- return BaseDialog.prototype.show.call(
- this, message, opt_onOk, opt_onOk, opt_onShow);
- };
-
- /**
- * ConfirmDialog contains a message, an ok button, and a cancel button.
- * @constructor
- * @extends {cr.ui.dialogs.BaseDialog}
- */
- /* #export */ function ConfirmDialog(parentNode) {
- BaseDialog.call(this, parentNode);
- }
-
- ConfirmDialog.prototype = {__proto__: BaseDialog.prototype};
-
- // #cr_define_end
- console.warn('crbug/1173575, non-JS module files deprecated.');
- return {
- BaseDialog: BaseDialog,
- AlertDialog: AlertDialog,
- ConfirmDialog: ConfirmDialog,
- };
-});
diff --git a/chromium/ui/webui/resources/js/cr/ui/dialogs.m.d.ts b/chromium/ui/webui/resources/js/cr/ui/dialogs.m.d.ts
deleted file mode 100644
index b78a1d5e649..00000000000
--- a/chromium/ui/webui/resources/js/cr/ui/dialogs.m.d.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-// 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.
-
-export class BaseDialog {
- constructor(parentNode: any);
- setOkLabel(label: string): void;
- setCancelLabel(label: string): void;
- setInitialFocusOnCancel(): void;
- show(
- message: string, onOk?: Function|undefined, onCancel?: Function|undefined,
- onShow?: Function|undefined): void;
- showHtml(
- title: string, message: string, onOk?: Function|undefined,
- onCancel?: Function|undefined, onShow?: Function|undefined): void;
- showWithTitle(
- title: string, message: string, onOk?: Function|undefined,
- onCancel?: Function|undefined, onShow?: Function|undefined): void;
- hide(onHide?: Function|undefined): void;
-
- /* eslint-disable @typescript-eslint/naming-convention */
- OK_LABEL: string;
- CANCEL_LABEL: string;
- ANIMATE_STABLE_DURATION: number;
- /* eslint-enable @typescript-eslint/naming-convention */
-}
-
-export class AlertDialog extends BaseDialog {
- constructor(parentNode: any);
- show(message: any, onOk?: Function|undefined, onShow?: Function|undefined):
- any;
-}
-
-export class ConfirmDialog extends BaseDialog {
- constructor(parentNode: any);
-}
diff --git a/chromium/ui/webui/resources/js/cr/ui/drag_wrapper.js b/chromium/ui/webui/resources/js/cr/ui/drag_wrapper.ts
index 3a586e3799c..b6fd31d8ea0 100644
--- a/chromium/ui/webui/resources/js/cr/ui/drag_wrapper.js
+++ b/chromium/ui/webui/resources/js/cr/ui/drag_wrapper.ts
@@ -7,81 +7,62 @@
* A class for simplifying HTML5 drag and drop. Classes should use this to
* handle the details of nested drag enters and leaves.
*/
-/** @interface */
-export class DragWrapperDelegate {
+export interface DragWrapperDelegate {
// TODO(devlin): The only method this "delegate" actually needs is
// shouldAcceptDrag(); the rest can be events emitted by the DragWrapper.
/**
- * @param {MouseEvent} e The event for the drag.
- * @return {boolean} Whether the drag should be accepted. If false,
+ * @return Whether the drag should be accepted. If false,
* subsequent methods (doDrag*) will not be called.
*/
- shouldAcceptDrag(e) {}
+ shouldAcceptDrag(e: MouseEvent): boolean;
- /** @param {MouseEvent} e */
- doDragEnter(e) {}
+ doDragEnter(e: MouseEvent): void;
- /** @param {MouseEvent} e */
- doDragLeave(e) {}
+ doDragLeave(e: MouseEvent): void;
- /** @param {MouseEvent} e */
- doDragOver(e) {}
+ doDragOver(e: MouseEvent): void;
- /** @param {MouseEvent} e */
- doDrop(e) {}
+ doDrop(e: MouseEvent): void;
}
- /**
- * Creates a DragWrapper which listens for drag target events on |target| and
- * delegates event handling to |delegate|.
- */
+/**
+ * Creates a DragWrapper which listens for drag target events on |target| and
+ * delegates event handling to |delegate|.
+ */
export class DragWrapper {
/**
- * @param {!Element} target
- * @param {!DragWrapperDelegate} delegate
+ * The number of un-paired dragenter events that have fired on |this|.
+ * This is incremented by |onDragEnter_| and decremented by
+ * |onDragLeave_|. This is necessary because dragging over child widgets
+ * will fire additional enter and leave events on |this|. A non-zero value
+ * does not necessarily indicate that |isCurrentDragTarget()| is true.
*/
- constructor(target, delegate) {
- /**
- * The number of un-paired dragenter events that have fired on |this|.
- * This is incremented by |onDragEnter_| and decremented by
- * |onDragLeave_|. This is necessary because dragging over child widgets
- * will fire additional enter and leave events on |this|. A non-zero value
- * does not necessarily indicate that |isCurrentDragTarget()| is true.
- * @private {number}
- */
- this.dragEnters_ = 0;
+ private dragEnters_: number = 0;
+ private target_: HTMLElement;
+ private delegate_: DragWrapperDelegate;
- /** @private {!Element} */
+ constructor(target: HTMLElement, delegate: DragWrapperDelegate) {
this.target_ = target;
-
- /** @private {!DragWrapperDelegate} */
this.delegate_ = delegate;
- target.addEventListener(
- 'dragenter', e => this.onDragEnter_(/** @type {!MouseEvent} */ (e)));
- target.addEventListener(
- 'dragover', e => this.onDragOver_(/** @type {!MouseEvent} */ (e)));
- target.addEventListener(
- 'drop', e => this.onDrop_(/** @type {!MouseEvent} */ (e)));
- target.addEventListener(
- 'dragleave', e => this.onDragLeave_(/** @type {!MouseEvent} */ (e)));
+ target.addEventListener('dragenter', e => this.onDragEnter_(e));
+ target.addEventListener('dragover', e => this.onDragOver_(e));
+ target.addEventListener('drop', e => this.onDrop_(e));
+ target.addEventListener('dragleave', e => this.onDragLeave_(e));
}
/**
* Whether the tile page is currently being dragged over with data it can
* accept.
- * @return {boolean}
*/
- get isCurrentDragTarget() {
+ get isCurrentDragTarget(): boolean {
return this.target_.classList.contains('drag-target');
}
/**
* Delegate for dragenter events fired on |target_|.
- * @param {!MouseEvent} e A MouseEvent for the drag.
- * @private
*/
- onDragEnter_(e) {
+ private onDragEnter_(e: MouseEvent) {
if (++this.dragEnters_ === 1) {
if (this.delegate_.shouldAcceptDrag(e)) {
this.target_.classList.add('drag-target');
@@ -99,10 +80,8 @@ export class DragWrapper {
/**
* Thunk for dragover events fired on |target_|.
- * @param {!MouseEvent} e A MouseEvent for the drag.
- * @private
*/
- onDragOver_(e) {
+ private onDragOver_(e: MouseEvent) {
if (!this.target_.classList.contains('drag-target')) {
return;
}
@@ -111,10 +90,8 @@ export class DragWrapper {
/**
* Thunk for drop events fired on |target_|.
- * @param {!MouseEvent} e A MouseEvent for the drag.
- * @private
*/
- onDrop_(e) {
+ private onDrop_(e: MouseEvent) {
this.dragEnters_ = 0;
if (!this.target_.classList.contains('drag-target')) {
return;
@@ -125,10 +102,8 @@ export class DragWrapper {
/**
* Thunk for dragleave events fired on |target_|.
- * @param {!MouseEvent} e A MouseEvent for the drag.
- * @private
*/
- onDragLeave_(e) {
+ private onDragLeave_(e: MouseEvent) {
if (--this.dragEnters_ > 0) {
return;
}
diff --git a/chromium/ui/webui/resources/js/cr/ui/focus_grid.js b/chromium/ui/webui/resources/js/cr/ui/focus_grid.ts
index 770121dd9a0..a765f727cc4 100644
--- a/chromium/ui/webui/resources/js/cr/ui/focus_grid.js
+++ b/chromium/ui/webui/resources/js/cr/ui/focus_grid.ts
@@ -4,6 +4,7 @@
// clang-format off
import {assert} from '../../assert.m.js';
+
import {FocusRow, FocusRowDelegate} from './focus_row.m.js';
// clang-format on
@@ -27,24 +28,13 @@ import {FocusRow, FocusRowDelegate} from './focus_row.m.js';
* focusable focusable focusable
* focusable focusable [focused] (row: 1, col: 2)
* focusable focusable focusable
- *
- * @implements {FocusRowDelegate}
*/
-export class FocusGrid {
- constructor() {
- /** @type {!Array<!FocusRow>} */
- this.rows = [];
-
- /** @private {boolean} */
- this.ignoreFocusChange_ = false;
-
- /** @private {?EventTarget} */
- this.lastFocused_ = null;
- }
+export class FocusGrid implements FocusRowDelegate {
+ rows: FocusRow[] = [];
+ private ignoreFocusChange_: boolean = false;
+ private lastFocused_: EventTarget|null = null;
- // override
- // Note: Not using @override because it breaks TypeScript.
- onFocus(row, e) {
+ onFocus(row: FocusRow, e: Event) {
if (this.ignoreFocusChange_) {
this.ignoreFocusChange_ = false;
} else {
@@ -56,8 +46,7 @@ export class FocusGrid {
});
}
- // override
- onKeydown(row, e) {
+ onKeydown(row: FocusRow, e: KeyboardEvent) {
const rowIndex = this.rows.indexOf(row);
assert(rowIndex >= 0);
@@ -76,10 +65,7 @@ export class FocusGrid {
const rowToFocus = this.rows[newRow];
if (rowToFocus) {
this.ignoreFocusChange_ = true;
- rowToFocus
- .getEquivalentElement(
- /** @type {!Element} */ (this.lastFocused_))
- .focus();
+ rowToFocus.getEquivalentElement(this.lastFocused_ as HTMLElement).focus();
e.preventDefault();
return true;
}
@@ -87,8 +73,7 @@ export class FocusGrid {
return false;
}
- // override
- getCustomEquivalent(sampleElement) {
+ getCustomEquivalent(_sampleElement: HTMLElement) {
return null;
}
@@ -103,12 +88,12 @@ export class FocusGrid {
}
/**
- * @param {!Element} target A target item to find in this grid.
- * @return {number} The row index. -1 if not found.
+ * @param target A target item to find in this grid.
+ * @return The row index. -1 if not found.
*/
- getRowIndexForTarget(target) {
+ getRowIndexForTarget(target: HTMLElement): number {
for (let i = 0; i < this.rows.length; ++i) {
- if (this.rows[i].getElements().indexOf(target) >= 0) {
+ if (this.rows[i]!.getElements().indexOf(target) >= 0) {
return i;
}
}
@@ -116,13 +101,13 @@ export class FocusGrid {
}
/**
- * @param {Element} root An element to search for.
- * @return {?FocusRow} The row with root of |root| or null.
+ * @param root An element to search for.
+ * @return The row with root of |root| or null.
*/
- getRowForRoot(root) {
+ getRowForRoot(root: HTMLElement): FocusRow|null {
for (let i = 0; i < this.rows.length; ++i) {
- if (this.rows[i].root === root) {
- return this.rows[i];
+ if (this.rows[i]!.root === root) {
+ return this.rows[i]!;
}
}
return null;
@@ -130,19 +115,19 @@ export class FocusGrid {
/**
* Adds |row| to the end of this list.
- * @param {!FocusRow} row The row that needs to be added to this grid.
+ * @param row The row that needs to be added to this grid.
*/
- addRow(row) {
+ addRow(row: FocusRow) {
this.addRowBefore(row, null);
}
/**
* Adds |row| before |nextRow|. If |nextRow| is not in the list or it's
* null, |row| is added to the end.
- * @param {!FocusRow} row The row that needs to be added to this grid.
- * @param {FocusRow} nextRow The row that should follow |row|.
+ * @param row The row that needs to be added to this grid.
+ * @param nextRow The row that should follow |row|.
*/
- addRowBefore(row, nextRow) {
+ addRowBefore(row: FocusRow, nextRow: FocusRow|null) {
row.delegate = row.delegate || this;
const nextRowIndex = nextRow ? this.rows.indexOf(nextRow) : -1;
@@ -155,9 +140,9 @@ export class FocusGrid {
/**
* Removes a row from the focus row. No-op if row is not in the grid.
- * @param {FocusRow} row The row that needs to be removed.
+ * @param row The row that needs to be removed.
*/
- removeRow(row) {
+ removeRow(row: FocusRow|null) {
const nextRowIndex = row ? this.rows.indexOf(row) : -1;
if (nextRowIndex > -1) {
this.rows.splice(nextRowIndex, 1);
@@ -167,21 +152,21 @@ export class FocusGrid {
/**
* Makes sure that at least one row is active. Should be called once, after
* adding all rows to FocusGrid.
- * @param {number=} preferredRow The row to select if no other row is
+ * @param preferredRow The row to select if no other row is
* active. Selects the first item if this is beyond the range of the
* grid.
*/
- ensureRowActive(preferredRow) {
+ ensureRowActive(preferredRow?: number) {
if (this.rows.length === 0) {
return;
}
for (let i = 0; i < this.rows.length; ++i) {
- if (this.rows[i].isActive()) {
+ if (this.rows[i]!.isActive()) {
return;
}
}
- (this.rows[preferredRow || 0] || this.rows[0]).makeActive(true);
+ (this.rows[preferredRow || 0] || this.rows[0]!).makeActive(true);
}
}
diff --git a/chromium/ui/webui/resources/js/cr/ui/focus_manager.js b/chromium/ui/webui/resources/js/cr/ui/focus_manager.js
index ab0f22f7f7a..80a6ab2c4ae 100644
--- a/chromium/ui/webui/resources/js/cr/ui/focus_manager.js
+++ b/chromium/ui/webui/resources/js/cr/ui/focus_manager.js
@@ -70,7 +70,7 @@ cr.define('cr.ui', function() {
// Accept nodes that are non-hidden and focusable.
return NodeFilter.FILTER_ACCEPT;
- }
+ },
}),
false);
diff --git a/chromium/ui/webui/resources/js/cr/ui/focus_row.js b/chromium/ui/webui/resources/js/cr/ui/focus_row.js
index 213cedac1fe..99abe3f84b3 100644
--- a/chromium/ui/webui/resources/js/cr/ui/focus_row.js
+++ b/chromium/ui/webui/resources/js/cr/ui/focus_row.js
@@ -85,8 +85,8 @@ cr.define('cr.ui', function() {
* that can gain focus is in a shadow DOM. Allowing an override via a
* function leaves the details of how the element is retrieved to the
* component.
- * @param {!Element} element
- * @return {!Element}
+ * @param {!HTMLElement} element
+ * @return {!HTMLElement}
*/
static getFocusableElement(element) {
if (element.getFocusableElement) {
@@ -141,16 +141,18 @@ cr.define('cr.ui', function() {
}
/**
- * @param {!Element} sampleElement An element for to find an equivalent for.
- * @return {!Element} An equivalent element to focus for |sampleElement|.
+ * @param {!HTMLElement} sampleElement An element for to find an equivalent
+ * for.
+ * @return {!HTMLElement} An equivalent element to focus for
+ * |sampleElement|.
* @protected
*/
getCustomEquivalent(sampleElement) {
- return /** @type {!Element} */ (assert(this.getFirstFocusable()));
+ return /** @type {!HTMLElement} */ (assert(this.getFirstFocusable()));
}
/**
- * @return {!Array<!Element>} All registered elements (regardless of
+ * @return {!Array<!HTMLElement>} All registered elements (regardless of
* focusability).
*/
getElements() {
@@ -160,9 +162,9 @@ cr.define('cr.ui', function() {
/**
* Find the element that best matches |sampleElement|.
- * @param {!Element} sampleElement An element from a row of the same type
- * which previously held focus.
- * @return {!Element} The element that best matches sampleElement.
+ * @param {!HTMLElement} sampleElement An element from a row of the same
+ * type which previously held focus.
+ * @return {!HTMLElement} The element that best matches sampleElement.
*/
getEquivalentElement(sampleElement) {
if (this.getFocusableElements().indexOf(sampleElement) >= 0) {
@@ -182,7 +184,7 @@ cr.define('cr.ui', function() {
/**
* @param {string=} opt_type An optional type to search for.
- * @return {?Element} The first focusable element with |type|.
+ * @return {?HTMLElement} The first focusable element with |type|.
*/
getFirstFocusable(opt_type) {
const element = this.getFocusableElements().find(
@@ -190,7 +192,7 @@ cr.define('cr.ui', function() {
return element || null;
}
- /** @return {!Array<!Element>} Registered, focusable elements. */
+ /** @return {!Array<!HTMLElement>} Registered, focusable elements. */
getFocusableElements() {
return this.getElements().filter(cr.ui.FocusRow.isFocusable);
}
@@ -234,7 +236,7 @@ cr.define('cr.ui', function() {
return;
}
- const currentTarget = /** @type {!Element} */ (e.currentTarget);
+ const currentTarget = /** @type {!HTMLElement} */ (e.currentTarget);
if (this.getFocusableElements().indexOf(currentTarget) >= 0) {
this.makeActive(false);
}
@@ -273,7 +275,7 @@ cr.define('cr.ui', function() {
onKeydown_(e) {
const elements = this.getFocusableElements();
const currentElement = cr.ui.FocusRow.getFocusableElement(
- /** @type {!Element} */ (e.currentTarget));
+ /** @type {!HTMLElement} */ (e.currentTarget));
const elementIndex = elements.indexOf(currentElement);
assert(elementIndex >= 0);
@@ -343,8 +345,8 @@ cr.define('cr.ui', function() {
onFocus(row, e) {}
/**
- * @param {!Element} sampleElement An element to find an equivalent for.
- * @return {?Element} An equivalent element to focus, or null to use the
+ * @param {!HTMLElement} sampleElement An element to find an equivalent for.
+ * @return {?HTMLElement} An equivalent element to focus, or null to use the
* default FocusRow element.
*/
getCustomEquivalent(sampleElement) {}
diff --git a/chromium/ui/webui/resources/js/cr/ui/focus_row_behavior.js b/chromium/ui/webui/resources/js/cr/ui/focus_row_behavior.js
index 0ee9a91f74b..be59eb9987b 100644
--- a/chromium/ui/webui/resources/js/cr/ui/focus_row_behavior.js
+++ b/chromium/ui/webui/resources/js/cr/ui/focus_row_behavior.js
@@ -30,7 +30,7 @@ cr.define('cr.ui', function() {
* @param {!Event} e
*/
onFocus(row, e) {
- const element = /** @type {!Element} */ (e.composedPath()[0]);
+ const element = /** @type {!HTMLElement} */ (e.composedPath()[0]);
const focusableElement = cr.ui.FocusRow.getFocusableElement(element);
if (element !== focusableElement) {
focusableElement.focus();
@@ -119,7 +119,7 @@ cr.define('cr.ui', function() {
observer: 'focusRowIndexChanged',
},
- /** @type {Element} */
+ /** @type {HTMLElement} */
lastFocused: {
type: Object,
notify: true,
@@ -394,7 +394,7 @@ cr.define('cr.ui', function() {
/** @type {number} */
this.focusRowIndex;
- /** @type {?Element} */
+ /** @type {?HTMLElement} */
this.lastFocused;
/** @type {number} */
diff --git a/chromium/ui/webui/resources/js/cr/ui/grid.js b/chromium/ui/webui/resources/js/cr/ui/grid.js
index 08d2d99984d..c72f59130d1 100644
--- a/chromium/ui/webui/resources/js/cr/ui/grid.js
+++ b/chromium/ui/webui/resources/js/cr/ui/grid.js
@@ -49,7 +49,7 @@ cr.define('cr.ui', function() {
decorate() {
ListItem.prototype.decorate.apply(this, arguments);
this.textContent = this.dataItem;
- }
+ },
};
/**
@@ -356,7 +356,7 @@ cr.define('cr.ui', function() {
}
List.prototype.redraw.call(this);
- }
+ },
};
/**
@@ -445,7 +445,7 @@ cr.define('cr.ui', function() {
return -1;
}
return index + 1;
- }
+ },
};
// #cr_define_end
@@ -453,6 +453,6 @@ cr.define('cr.ui', function() {
return {
Grid: Grid,
GridItem: GridItem,
- GridSelectionController: GridSelectionController
+ GridSelectionController: GridSelectionController,
};
});
diff --git a/chromium/ui/webui/resources/js/cr/ui/keyboard_shortcut_list.js b/chromium/ui/webui/resources/js/cr/ui/keyboard_shortcut_list.js
index 0322d992dd3..951e7faf5fe 100644
--- a/chromium/ui/webui/resources/js/cr/ui/keyboard_shortcut_list.js
+++ b/chromium/ui/webui/resources/js/cr/ui/keyboard_shortcut_list.js
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-cr.define('cr.ui', function() {
/** This is used to identify keyboard shortcuts. */
class KeyboardShortcut {
/**
@@ -66,7 +65,7 @@ cr.define('cr.ui', function() {
}
/** A list of keyboard shortcuts which all perform one command. */
- /* #export */ class KeyboardShortcutList {
+ export class KeyboardShortcutList {
/**
* @param {string} shortcuts Text-based representation of one or more
* keyboard shortcuts, separated by spaces.
@@ -90,9 +89,3 @@ cr.define('cr.ui', function() {
}
}
- // #cr_define_end
- console.warn('crbug/1173575, non-JS module files deprecated.');
- return {
- KeyboardShortcutList: KeyboardShortcutList,
- };
-});
diff --git a/chromium/ui/webui/resources/js/cr/ui/list.js b/chromium/ui/webui/resources/js/cr/ui/list.js
index 1cd5998d077..7f68c73d4f5 100644
--- a/chromium/ui/webui/resources/js/cr/ui/list.js
+++ b/chromium/ui/webui/resources/js/cr/ui/list.js
@@ -441,7 +441,7 @@ cr.define('cr.ui', function() {
marginBottom: 0,
width: 0,
marginLeft: 0,
- marginRight: 0
+ marginRight: 0,
};
}
const item = opt_item || this.cachedMeasuredItem_ ||
@@ -490,7 +490,7 @@ cr.define('cr.ui', function() {
marginBottom: mb,
width: Math.max(0, w),
marginLeft: ml,
- marginRight: mr
+ marginRight: mr,
};
},
@@ -1005,7 +1005,7 @@ cr.define('cr.ui', function() {
return {
first: 0,
length: this.dataModel.length,
- last: this.dataModel.length
+ last: this.dataModel.length,
};
} else {
const firstIndex = this.getIndexForListOffset_(scrollTop);
@@ -1014,7 +1014,7 @@ cr.define('cr.ui', function() {
return {
first: firstIndex,
length: lastIndex - firstIndex + 1,
- last: lastIndex + 1
+ last: lastIndex + 1,
};
}
},
diff --git a/chromium/ui/webui/resources/js/cr/ui/list.m.d.ts b/chromium/ui/webui/resources/js/cr/ui/list.m.d.ts
index 4d57484678f..dd2150f735a 100644
--- a/chromium/ui/webui/resources/js/cr/ui/list.m.d.ts
+++ b/chromium/ui/webui/resources/js/cr/ui/list.m.d.ts
@@ -7,14 +7,14 @@ import {ListItem} from './list_item.m.js';
import {ListSelectionController} from './list_selection_controller.m.js';
import {ListSelectionModel} from './list_selection_model.m.js';
-export type Size = {
- height: number,
- marginBottom: number,
- marginLeft: number,
- marginRight: number,
- marginTop: number,
- width: number,
-};
+export interface Size {
+ height: number;
+ marginBottom: number;
+ marginLeft: number;
+ marginRight: number;
+ marginTop: number;
+ width: number;
+}
declare class List extends HTMLUListElement {
constructor();
@@ -38,8 +38,6 @@ declare class List extends HTMLUListElement {
startBatchUpdates(): void;
endBatchUpdates(): void;
decorate(): void;
- measureItemHeight_(item: ListItem): number;
- getItemHeightByIndex_(index: number): number;
measureItem(item?: ListItem): Size|undefined;
getListItemAncestor(element?: HTMLElement): HTMLElement|undefined;
handleKeyDown(e: Event): void;
diff --git a/chromium/ui/webui/resources/js/cr/ui/list_selection_controller.js b/chromium/ui/webui/resources/js/cr/ui/list_selection_controller.js
index f6ed0f99bfe..c449db24515 100644
--- a/chromium/ui/webui/resources/js/cr/ui/list_selection_controller.js
+++ b/chromium/ui/webui/resources/js/cr/ui/list_selection_controller.js
@@ -304,7 +304,7 @@ cr.define('cr.ui', function() {
e.preventDefault();
}
}
- }
+ },
};
// #cr_define_end
diff --git a/chromium/ui/webui/resources/js/cr/ui/list_selection_model.js b/chromium/ui/webui/resources/js/cr/ui/list_selection_model.js
index f3774d6e678..e6e2d8952d5 100644
--- a/chromium/ui/webui/resources/js/cr/ui/list_selection_model.js
+++ b/chromium/ui/webui/resources/js/cr/ui/list_selection_model.js
@@ -272,7 +272,7 @@ cr.define('cr.ui', function() {
e.changes = indexes.map(function(index) {
return {
index: Number(index),
- selected: this.changedIndexes_[index]
+ selected: this.changedIndexes_[index],
};
}, this);
this.dispatchEvent(e);
diff --git a/chromium/ui/webui/resources/js/cr/ui/menu.js b/chromium/ui/webui/resources/js/cr/ui/menu.js
index bc3d4c27848..14738e59d8e 100644
--- a/chromium/ui/webui/resources/js/cr/ui/menu.js
+++ b/chromium/ui/webui/resources/js/cr/ui/menu.js
@@ -7,13 +7,11 @@
// should only be used by legacy UIs that have not yet been updated to new
// patterns. Use Web Components in any new code.
-// #import {assert, assertInstanceof} from '../../assert.m.js';
-// #import {define as crUiDefine, decorate} from '../ui.m.js';
-// #import {getPropertyDescriptor, PropertyKind} from '../../cr.m.js';
-// #import {MenuItem} from './menu_item.m.js';
+import {assert, assertInstanceof} from '../../assert.m.js';
+import {define as crUiDefine, decorate} from '../ui.m.js';
+import {getPropertyDescriptor, PropertyKind} from '../../cr.m.js';
+import {MenuItem} from './menu_item.js';
-cr.define('cr.ui', function() {
- /* #ignore */ /** @const */ const MenuItem = cr.ui.MenuItem;
/**
* Creates a new menu element. Menu dispatches all commands on the element it
@@ -23,7 +21,7 @@ cr.define('cr.ui', function() {
* @constructor
* @extends {HTMLElement}
*/
- /* #export */ const Menu = cr.ui.define('cr-menu');
+ export const Menu = crUiDefine('cr-menu');
Menu.prototype = {
__proto__: HTMLElement.prototype,
@@ -50,20 +48,21 @@ cr.define('cr.ui', function() {
// Decorate the children as menu items.
const menuItems = this.menuItems;
for (let i = 0, menuItem; menuItem = menuItems[i]; i++) {
- cr.ui.decorate(menuItem, MenuItem);
+ decorate(menuItem, MenuItem);
}
},
/**
* Adds menu item at the end of the list.
* @param {Object} item Menu item properties.
- * @return {!cr.ui.MenuItem} The created menu item.
+ * @return {!MenuItem} The created menu item.
*/
addMenuItem(item) {
- const menuItem = this.ownerDocument.createElement('cr-menu-item');
+ const menuItem = /** @type {!MenuItem} */ (
+ this.ownerDocument.createElement('cr-menu-item'));
this.appendChild(menuItem);
- cr.ui.decorate(menuItem, MenuItem);
+ decorate(menuItem, MenuItem);
if (item.label) {
menuItem.label = item.label;
@@ -81,7 +80,7 @@ cr.define('cr.ui', function() {
*/
addSeparator() {
const separator = this.ownerDocument.createElement('hr');
- cr.ui.decorate(separator, MenuItem);
+ decorate(separator, MenuItem);
this.appendChild(separator);
},
@@ -97,7 +96,7 @@ cr.define('cr.ui', function() {
* Walks up the ancestors of |node| until a menu item belonging to this menu
* is found.
* @param {Node} node The node to start searching from.
- * @return {cr.ui.MenuItem} The found menu item or null.
+ * @return {MenuItem} The found menu item or null.
* @private
*/
findMenuItem_(node) {
@@ -166,7 +165,7 @@ cr.define('cr.ui', function() {
/**
* The selected menu item or null if none.
- * @type {cr.ui.MenuItem}
+ * @type {MenuItem}
*/
get selectedItem() {
return this.menuItems[this.selectedIndex];
@@ -215,7 +214,7 @@ cr.define('cr.ui', function() {
/**
* Returns whether the given menu item is visible.
- * @param {!cr.ui.MenuItem} menuItem
+ * @param {!MenuItem} menuItem
* @return {boolean}
* @private
*/
@@ -368,7 +367,7 @@ cr.define('cr.ui', function() {
separatorRequired = true;
}
}
- }
+ },
};
/** @suppress {globalThis} This standalone function is used like method. */
@@ -391,8 +390,8 @@ cr.define('cr.ui', function() {
Menu.prototype.selectedIndex;
Object.defineProperty(
Menu.prototype, 'selectedIndex',
- cr.getPropertyDescriptor(
- 'selectedIndex', cr.PropertyKind.JS, selectedIndexChanged));
+ getPropertyDescriptor(
+ 'selectedIndex', PropertyKind.JS, selectedIndexChanged));
/**
* Selector for children which are menu items.
@@ -401,10 +400,4 @@ cr.define('cr.ui', function() {
Menu.prototype.menuItemSelector;
Object.defineProperty(
Menu.prototype, 'menuItemSelector',
- cr.getPropertyDescriptor('menuItemSelector', cr.PropertyKind.ATTR));
-
- // Export
- // #cr_define_end
- console.warn('crbug/1173575, non-JS module files deprecated.');
- return {Menu: Menu};
-});
+ getPropertyDescriptor('menuItemSelector', PropertyKind.ATTR));
diff --git a/chromium/ui/webui/resources/js/cr/ui/menu_button.m.d.ts b/chromium/ui/webui/resources/js/cr/ui/menu_button.d.ts
index b7afe6208d9..b7afe6208d9 100644
--- a/chromium/ui/webui/resources/js/cr/ui/menu_button.m.d.ts
+++ b/chromium/ui/webui/resources/js/cr/ui/menu_button.d.ts
diff --git a/chromium/ui/webui/resources/js/cr/ui/menu_button.js b/chromium/ui/webui/resources/js/cr/ui/menu_button.js
index 347e5f0cabd..250c470e7e3 100644
--- a/chromium/ui/webui/resources/js/cr/ui/menu_button.js
+++ b/chromium/ui/webui/resources/js/cr/ui/menu_button.js
@@ -7,30 +7,26 @@
// should only be used by legacy UIs that have not yet been updated to new
// patterns. Use Web Components in any new code.
-// #import {assert} from '../../assert.m.js';
-// #import {isWindows} from '../../cr.m.js';
-// #import {EventTracker} from '../../event_tracker.m.js'
-// #import {define as crUiDefine, decorate} from '../ui.m.js';
-// #import {positionPopupAroundElement, AnchorType} from './position_util.m.js';
-// #import {Menu} from './menu.m.js';
-// #import {MenuItem} from './menu_item.m.js';
+import {assert} from '../../assert.m.js';
+import {isWindows} from '../../cr.m.js';
+import {EventTracker} from '../../event_tracker.m.js';
+import {define as crUiDefine, decorate} from '../ui.m.js';
+import {positionPopupAroundElement, AnchorType} from './position_util.js';
+import {Menu} from './menu.js';
+import {MenuItem} from './menu_item.js';
-cr.define('cr.ui', function() {
- /* #ignore */ const Menu = cr.ui.Menu;
/**
* Enum for type of hide. Delayed is used when called by clicking on a
* checkable menu item.
* @enum {number}
*/
- /* #export */ const HideType = {
+ export const HideType = {
INSTANT: 0,
DELAYED: 1,
};
/** @const */
- /* #ignore */ const positionPopupAroundElement =
- /* #ignore */ cr.ui.positionPopupAroundElement;
/**
* Creates a new menu button element.
@@ -39,7 +35,7 @@ cr.define('cr.ui', function() {
* @extends {HTMLButtonElement}
* @implements {EventListener}
*/
- /* #export */ const MenuButton = cr.ui.define('button');
+ export const MenuButton = crUiDefine('button');
MenuButton.prototype = {
__proto__: HTMLButtonElement.prototype,
@@ -68,15 +64,15 @@ cr.define('cr.ui', function() {
// An event tracker for events we only connect to while the menu is
// displayed.
- this.showingEvents_ = new cr.EventTracker();
+ this.showingEvents_ = new EventTracker();
- this.anchorType = cr.ui.AnchorType.BELOW;
+ this.anchorType = AnchorType.BELOW;
this.invertLeftRight = false;
},
/**
* The menu associated with the menu button.
- * @type {cr.ui.Menu}
+ * @type {Menu}
*/
get menu() {
return this.menu_;
@@ -84,7 +80,7 @@ cr.define('cr.ui', function() {
set menu(menu) {
if (typeof menu === 'string' && menu[0] === '#') {
menu = assert(this.ownerDocument.getElementById(menu.slice(1)));
- cr.ui.decorate(menu, Menu);
+ decorate(menu, Menu);
}
this.menu_ = menu;
@@ -181,7 +177,7 @@ cr.define('cr.ui', function() {
break;
case 'activate':
const hideDelayed =
- e.target instanceof cr.ui.MenuItem && e.target.checkable;
+ e.target instanceof MenuItem && e.target.checkable;
const hideType = hideDelayed ? HideType.DELAYED : HideType.INSTANT;
if (e.originalEvent instanceof MouseEvent ||
e.originalEvent instanceof TouchEvent) {
@@ -260,8 +256,8 @@ cr.define('cr.ui', function() {
/**
* Hides the menu. If your menu can go out of scope, make sure to call this
* first.
- * @param {cr.ui.HideType=} opt_hideType Type of hide.
- * default: cr.ui.HideType.INSTANT.
+ * @param {HideType=} opt_hideType Type of hide.
+ * default: HideType.INSTANT.
*/
hideMenu(opt_hideType) {
this.hideMenuInternal_(true, opt_hideType);
@@ -270,8 +266,8 @@ cr.define('cr.ui', function() {
/**
* Hides the menu. If your menu can go out of scope, make sure to call this
* first.
- * @param {cr.ui.HideType=} opt_hideType Type of hide.
- * default: cr.ui.HideType.INSTANT.
+ * @param {HideType=} opt_hideType Type of hide.
+ * default: HideType.INSTANT.
*/
hideMenuWithoutTakingFocus_(opt_hideType) {
this.hideMenuInternal_(false, opt_hideType);
@@ -281,8 +277,8 @@ cr.define('cr.ui', function() {
* Hides the menu. If your menu can go out of scope, make sure to call this
* first.
* @param {boolean} shouldTakeFocus Moves the focus to the button if true.
- * @param {cr.ui.HideType=} opt_hideType Type of hide.
- * default: cr.ui.HideType.INSTANT.
+ * @param {HideType=} opt_hideType Type of hide.
+ * default: HideType.INSTANT.
*/
hideMenuInternal_(shouldTakeFocus, opt_hideType) {
if (!this.isMenuShown()) {
@@ -309,7 +305,7 @@ cr.define('cr.ui', function() {
// On windows we might hide the menu in a right mouse button up and if
// that is the case we wait some short period before we allow the menu
// to be shown again.
- this.hideTimestamp_ = cr.isWindows ? Date.now() : 0;
+ this.hideTimestamp_ = isWindows ? Date.now() : 0;
},
/**
@@ -351,14 +347,5 @@ cr.define('cr.ui', function() {
this.hideMenu();
break;
}
- }
- };
-
- // Export
- // #cr_define_end
- console.warn('crbug/1173575, non-JS module files deprecated.');
- return {
- HideType: HideType,
- MenuButton: MenuButton,
+ },
};
-});
diff --git a/chromium/ui/webui/resources/js/cr/ui/menu_item.m.d.ts b/chromium/ui/webui/resources/js/cr/ui/menu_item.d.ts
index c25cb77d01d..c25cb77d01d 100644
--- a/chromium/ui/webui/resources/js/cr/ui/menu_item.m.d.ts
+++ b/chromium/ui/webui/resources/js/cr/ui/menu_item.d.ts
diff --git a/chromium/ui/webui/resources/js/cr/ui/menu_item.js b/chromium/ui/webui/resources/js/cr/ui/menu_item.js
index 5970f301f1d..e90c8546321 100644
--- a/chromium/ui/webui/resources/js/cr/ui/menu_item.js
+++ b/chromium/ui/webui/resources/js/cr/ui/menu_item.js
@@ -8,15 +8,13 @@
// patterns. Use Web Components in any new code.
// clang-format off
-// #import {loadTimeData} from '../../load_time_data.m.js';
-// #import {assert} from '../../assert.m.js';
-// #import {Command} from './command.m.js';
-// #import {define as crUiDefine, decorate, swallowDoubleClick} from '../ui.m.js';
-// #import {getPropertyDescriptor, PropertyKind} from '../../cr.m.js';
+import {loadTimeData} from '../../load_time_data.m.js';
+import {assert} from '../../assert.m.js';
+import {Command} from './command.js';
+import {define as crUiDefine, decorate, swallowDoubleClick} from '../ui.m.js';
+import {getPropertyDescriptor, PropertyKind} from '../../cr.m.js';
// clang-format on
-cr.define('cr.ui', function() {
- /* #ignore */ const Command = cr.ui.Command;
/**
* Creates a new menu item element.
@@ -25,14 +23,14 @@ cr.define('cr.ui', function() {
* @extends {HTMLElement}
* @implements {EventListener}
*/
- /* #export */ const MenuItem = cr.ui.define('cr-menu-item');
+ export const MenuItem = crUiDefine('cr-menu-item');
/**
* Creates a new menu separator element.
- * @return {!cr.ui.MenuItem} The new separator element.
+ * @return {!MenuItem} The new separator element.
*/
MenuItem.createSeparator = function() {
- const el = /** @type {!cr.ui.MenuItem} */ (document.createElement('hr'));
+ const el = /** @type {!MenuItem} */ (document.createElement('hr'));
if (MenuItem.decorate) {
MenuItem.decorate(el);
}
@@ -74,7 +72,7 @@ cr.define('cr.ui', function() {
* The command associated with this menu item. If this is set to a string
* of the form "#element-id" then the element is looked up in the document
* of the command.
- * @type {cr.ui.Command}
+ * @type {Command}
*/
command_: null,
get command() {
@@ -90,7 +88,7 @@ cr.define('cr.ui', function() {
if (typeof command === 'string' && command[0] === '#') {
command = assert(this.ownerDocument.body.querySelector(command));
- cr.ui.decorate(command, Command);
+ decorate(command, Command);
}
this.command_ = command;
@@ -229,7 +227,7 @@ cr.define('cr.ui', function() {
const command = this.command;
if (command) {
command.execute(contextElement);
- cr.ui.swallowDoubleClick(e);
+ swallowDoubleClick(e);
}
}
}
@@ -264,7 +262,7 @@ cr.define('cr.ui', function() {
this.checked = this.command.checked;
break;
}
- }
+ },
};
/**
* Whether the menu item is disabled or not.
@@ -273,14 +271,14 @@ cr.define('cr.ui', function() {
MenuItem.prototype.disabled;
Object.defineProperty(
MenuItem.prototype, 'disabled',
- cr.getPropertyDescriptor('disabled', cr.PropertyKind.BOOL_ATTR));
+ getPropertyDescriptor('disabled', PropertyKind.BOOL_ATTR));
/**
* Whether the menu item is hidden or not.
*/
Object.defineProperty(
MenuItem.prototype, 'hidden',
- cr.getPropertyDescriptor('hidden', cr.PropertyKind.BOOL_ATTR));
+ getPropertyDescriptor('hidden', PropertyKind.BOOL_ATTR));
/**
* Whether the menu item is selected or not.
@@ -289,7 +287,7 @@ cr.define('cr.ui', function() {
MenuItem.prototype.selected;
Object.defineProperty(
MenuItem.prototype, 'selected',
- cr.getPropertyDescriptor('selected', cr.PropertyKind.BOOL_ATTR));
+ getPropertyDescriptor('selected', PropertyKind.BOOL_ATTR));
/**
* Whether the menu item is checked or not.
@@ -298,7 +296,7 @@ cr.define('cr.ui', function() {
MenuItem.prototype.checked;
Object.defineProperty(
MenuItem.prototype, 'checked',
- cr.getPropertyDescriptor('checked', cr.PropertyKind.BOOL_ATTR));
+ getPropertyDescriptor('checked', PropertyKind.BOOL_ATTR));
/**
* Whether the menu item is checkable or not.
@@ -307,9 +305,4 @@ cr.define('cr.ui', function() {
MenuItem.prototype.checkable;
Object.defineProperty(
MenuItem.prototype, 'checkable',
- cr.getPropertyDescriptor('checkable', cr.PropertyKind.BOOL_ATTR));
-
- // Export
- // #cr_define_end
- return {MenuItem: MenuItem};
-});
+ getPropertyDescriptor('checkable', PropertyKind.BOOL_ATTR));
diff --git a/chromium/ui/webui/resources/js/cr/ui/position_util.js b/chromium/ui/webui/resources/js/cr/ui/position_util.js
index 8357b57d1ce..66ca87fceed 100644
--- a/chromium/ui/webui/resources/js/cr/ui/position_util.js
+++ b/chromium/ui/webui/resources/js/cr/ui/position_util.js
@@ -6,7 +6,6 @@
* @fileoverview This file provides utility functions for position popups.
*/
-cr.define('cr.ui', function() {
/**
* Type def for rects as returned by getBoundingClientRect.
* @typedef {{left: number, top: number, width: number, height: number,
@@ -18,7 +17,7 @@ cr.define('cr.ui', function() {
* Enum for defining how to anchor a popup to an anchor element.
* @enum {number}
*/
- /* #export */ const AnchorType = {
+ export const AnchorType = {
/**
* The popup's right edge is aligned with the left edge of the anchor.
* The popup's top edge is aligned with the top edge of the anchor.
@@ -41,14 +40,14 @@ cr.define('cr.ui', function() {
* The popop's top edge is aligned with the bottom edge of the anchor.
* The popup's left edge is aligned with the left edge of the anchor.
*/
- BELOW: 4 // p: top, a: bottom, p: left, a: left
+ BELOW: 4, // p: top, a: bottom, p: left, a: left
};
/**
* Helper function for positionPopupAroundElement and positionPopupAroundRect.
* @param {!Rect} anchorRect The rect for the anchor.
* @param {!HTMLElement} popupElement The element used for the popup.
- * @param {cr.ui.AnchorType} type The type of anchoring to do.
+ * @param {AnchorType} type The type of anchoring to do.
* @param {boolean=} opt_invertLeftRight Whether to invert the right/left
* alignment.
*/
@@ -69,7 +68,7 @@ cr.define('cr.ui', function() {
top: 0,
bottom: docElement.clientHeight,
left: 0,
- right: docElement.clientWidth
+ right: docElement.clientWidth,
};
} else {
availRect = popupElement.offsetParent.getBoundingClientRect();
@@ -211,11 +210,11 @@ cr.define('cr.ui', function() {
* @param {!HTMLElement} anchorElement The element that the popup is anchored
* to.
* @param {!HTMLElement} popupElement The popup element we are positioning.
- * @param {cr.ui.AnchorType} type The type of anchoring we want.
+ * @param {AnchorType} type The type of anchoring we want.
* @param {boolean=} opt_invertLeftRight Whether to invert the right/left
* alignment.
*/
- /* #export */ function positionPopupAroundElement(
+ export function positionPopupAroundElement(
anchorElement, popupElement, type, opt_invertLeftRight) {
const anchorRect = anchorElement.getBoundingClientRect();
positionPopupAroundRect(
@@ -227,22 +226,12 @@ cr.define('cr.ui', function() {
* @param {number} x The client x position.
* @param {number} y The client y position.
* @param {!HTMLElement} popupElement The popup element we are positioning.
- * @param {cr.ui.AnchorType=} opt_anchorType The type of anchoring we want.
+ * @param {AnchorType=} opt_anchorType The type of anchoring we want.
*/
- /* #export */ function positionPopupAtPoint(
+ export function positionPopupAtPoint(
x, y, popupElement, opt_anchorType) {
const rect = {left: x, top: y, width: 0, height: 0, right: x, bottom: y};
const anchorType = opt_anchorType || AnchorType.BELOW;
positionPopupAroundRect(rect, popupElement, anchorType);
}
-
- // Export
- // #cr_define_end
- console.warn('crbug/1173575, non-JS module files deprecated.');
- return {
- AnchorType: AnchorType,
- positionPopupAroundElement: positionPopupAroundElement,
- positionPopupAtPoint: positionPopupAtPoint
- };
-});
diff --git a/chromium/ui/webui/resources/js/cr/ui/splitter.js b/chromium/ui/webui/resources/js/cr/ui/splitter.js
deleted file mode 100644
index cb78909c96b..00000000000
--- a/chromium/ui/webui/resources/js/cr/ui/splitter.js
+++ /dev/null
@@ -1,250 +0,0 @@
-// Copyright (c) 2012 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.
-
-// NOTE: This file depends on ui.js (or the autogenerated ui.m.js module
-// version). These files and all files that depend on them are deprecated, and
-// should only be used by legacy UIs that have not yet been updated to new
-// patterns. Use Web Components in any new code. cr_splitter
-// (ui/webui/resources/cr_elements/cr_splitter/) was specifically added as a
-// replacement for this file in UIs that are using Polymer.
-
-/**
- * @fileoverview This implements a splitter element which can be used to resize
- * elements in split panes.
- *
- * The parent of the splitter should be an hbox (display: -webkit-box) with at
- * least one previous element sibling. The splitter controls the width of the
- * element before it.
- *
- * <div class=split-pane>
- * <div class=left>...</div>
- * <div class=splitter></div>
- * ...
- * </div>
- *
- */
-
-import {dispatchSimpleEvent} from '../../cr.m.js';
-import {define as crUiDefine} from '../ui.m.js';
-
-/**
- * Creates a new splitter element.
- * @param {Object=} opt_propertyBag Optional properties.
- * @constructor
- * @extends {HTMLDivElement}
- */
-export const Splitter = crUiDefine('div');
-
-Splitter.prototype = {
- __proto__: HTMLDivElement.prototype,
-
- /**
- * Initializes the element.
- */
- decorate() {
- this.addEventListener('mousedown', this.handleMouseDown_.bind(this), true);
- this.addEventListener(
- 'touchstart', this.handleTouchStart_.bind(this), true);
- this.resizeNextElement_ = false;
- },
-
- /**
- * @param {boolean} resizeNext True if resize the next element.
- * By default, splitter resizes previous (left) element.
- */
- set resizeNextElement(resizeNext) {
- this.resizeNextElement_ = resizeNext;
- },
-
- /**
- * Starts the dragging of the splitter. Adds listeners for mouse or touch
- * events and calls splitter drag start handler.
- * @param {number} clientX X position of the mouse or touch event that
- * started the drag.
- * @param {boolean} isTouchEvent True if the drag started by touch event.
- */
- startDrag(clientX, isTouchEvent) {
- if (this.handlers_) {
- // Case of concurrent drags.
- this.endDrag_();
- }
- if (isTouchEvent) {
- const endDragBound = this.endDrag_.bind(this);
- this.handlers_ = {
- 'touchmove': this.handleTouchMove_.bind(this),
- 'touchend': endDragBound,
- 'touchcancel': endDragBound,
-
- // Another touch start (we somehow missed touchend or touchcancel).
- 'touchstart': endDragBound,
- };
- } else {
- this.handlers_ = {
- 'mousemove': this.handleMouseMove_.bind(this),
- 'mouseup': this.handleMouseUp_.bind(this),
- };
- }
-
- const doc = this.ownerDocument;
-
- // Use capturing events on the document to get events when the mouse
- // leaves the document.
- for (const eventType in this.handlers_) {
- doc.addEventListener(eventType, this.handlers_[eventType], true);
- }
-
- this.startX_ = clientX;
- this.handleSplitterDragStart();
- },
-
- /**
- * Ends the dragging of the splitter. Removes listeners set in startDrag
- * and calls splitter drag end handler.
- * @private
- */
- endDrag_() {
- const doc = this.ownerDocument;
- for (const eventType in this.handlers_) {
- doc.removeEventListener(eventType, this.handlers_[eventType], true);
- }
- this.handlers_ = null;
- this.handleSplitterDragEnd();
- },
-
- /**
- * @return {Element}
- * @private
- */
- getResizeTarget_() {
- return this.resizeNextElement_ ? this.nextElementSibling :
- this.previousElementSibling;
- },
-
- /**
- * Calculate width to resize target element.
- * @param {number} deltaX horizontal drag amount
- * @return {number}
- * @private
- */
- calcDeltaX_(deltaX) {
- return this.resizeNextElement_ ? -deltaX : deltaX;
- },
-
- /**
- * Handles the mousedown event which starts the dragging of the splitter.
- * @param {!Event} e The mouse event.
- * @private
- */
- handleMouseDown_(e) {
- e = /** @type {!MouseEvent} */ (e);
- if (e.button) {
- return;
- }
- this.startDrag(e.clientX, false);
- // Default action is to start selection and to move focus.
- e.preventDefault();
- },
-
- /**
- * Handles the touchstart event which starts the dragging of the splitter.
- * @param {!Event} e The touch event.
- * @private
- */
- handleTouchStart_(e) {
- e = /** @type {!TouchEvent} */ (e);
- if (e.touches.length === 1) {
- this.startDrag(e.touches[0].clientX, true);
- e.preventDefault();
- }
- },
-
- /**
- * Handles the mousemove event which moves the splitter as the user moves
- * the mouse.
- * @param {!MouseEvent} e The mouse event.
- * @private
- */
- handleMouseMove_(e) {
- this.handleMove_(e.clientX);
- },
-
- /**
- * Handles the touch move event.
- * @param {!TouchEvent} e The touch event.
- */
- handleTouchMove_(e) {
- if (e.touches.length === 1) {
- this.handleMove_(e.touches[0].clientX);
- }
- },
-
- /**
- * Common part of handling mousemove and touchmove. Calls splitter drag
- * move handler.
- * @param {number} clientX X position of the mouse or touch event.
- * @private
- */
- handleMove_(clientX) {
- const rtl =
- this.ownerDocument.defaultView.getComputedStyle(this).direction ===
- 'rtl';
- const dirMultiplier = rtl ? -1 : 1;
- const deltaX = dirMultiplier * (clientX - this.startX_);
- this.handleSplitterDragMove(deltaX);
- },
-
- /**
- * Handles the mouse up event which ends the dragging of the splitter.
- * @param {!MouseEvent} e The mouse event.
- * @private
- */
- handleMouseUp_(e) {
- this.endDrag_();
- },
-
- /**
- * Handles start of the splitter dragging. Saves current width of the
- * element being resized.
- */
- handleSplitterDragStart() {
- // Use the computed width style as the base so that we can ignore what
- // box sizing the element has. Add the difference between offset and
- // client widths to account for any scrollbars.
- const targetElement = this.getResizeTarget_();
- const doc = targetElement.ownerDocument;
- this.startWidth_ =
- parseFloat(doc.defaultView.getComputedStyle(targetElement).width) +
- targetElement.offsetWidth - targetElement.clientWidth;
-
- this.classList.add('splitter-active');
- },
-
- /**
- * Handles splitter moves. Updates width of the element being resized.
- * @param {number} deltaX The change of splitter horizontal position.
- */
- handleSplitterDragMove(deltaX) {
- const targetElement = this.getResizeTarget_();
- const newWidth = this.startWidth_ + this.calcDeltaX_(deltaX);
- targetElement.style.width = newWidth + 'px';
- dispatchSimpleEvent(this, 'dragmove');
- },
-
- /**
- * Handles end of the splitter dragging. This fires a 'resize' event if the
- * size changed.
- */
- handleSplitterDragEnd() {
- // Check if the size changed.
- const targetElement = this.getResizeTarget_();
- const doc = targetElement.ownerDocument;
- const computedWidth =
- parseFloat(doc.defaultView.getComputedStyle(targetElement).width);
- if (this.startWidth_ !== computedWidth) {
- dispatchSimpleEvent(this, 'resize');
- }
-
- this.classList.remove('splitter-active');
- },
-};
diff --git a/chromium/ui/webui/resources/js/cr/ui/store_ts.ts b/chromium/ui/webui/resources/js/cr/ui/store_ts.ts
new file mode 100644
index 00000000000..0676b81244c
--- /dev/null
+++ b/chromium/ui/webui/resources/js/cr/ui/store_ts.ts
@@ -0,0 +1,127 @@
+// 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.
+
+export interface Action {
+ name: string;
+}
+
+export type DeferredAction = (callback: (p: Action|null) => void) => void;
+
+export interface StoreObserver<T> {
+ onStateChanged(newState: T): void;
+}
+
+/**
+ * A generic datastore for the state of a page, where the state is publicly
+ * readable but can only be modified by dispatching an Action.
+ * The Store should be extended by specifying T, the page state type
+ * associated with the store.
+ */
+export class Store<T> {
+ data: T;
+ private reducer_: (state: T, action: Action) => T;
+ protected initialized_: boolean = false;
+ private queuedActions_: DeferredAction[] = [];
+ private observers_: Array<StoreObserver<T>> = [];
+ private batchMode_: boolean = false;
+
+ constructor(emptyState: T, reducer: (state: T, action: Action) => T) {
+ this.data = emptyState;
+ this.reducer_ = reducer;
+ }
+
+ init(initialState: T) {
+ this.data = initialState;
+
+ this.queuedActions_.forEach((action) => {
+ this.dispatchInternal_(action);
+ });
+ this.queuedActions_ = [];
+
+ this.initialized_ = true;
+ this.notifyObservers_(this.data);
+ }
+
+ isInitialized(): boolean {
+ return this.initialized_;
+ }
+
+ addObserver(observer: StoreObserver<T>) {
+ this.observers_.push(observer);
+ }
+
+ removeObserver(observer: StoreObserver<T>) {
+ const index = this.observers_.indexOf(observer);
+ this.observers_.splice(index, 1);
+ }
+
+ /**
+ * Begin a batch update to store data, which will disable updates to the
+ * UI until `endBatchUpdate` is called. This is useful when a single UI
+ * operation is likely to cause many sequential model updates (eg, deleting
+ * 100 bookmarks).
+ */
+ beginBatchUpdate() {
+ this.batchMode_ = true;
+ }
+
+ /**
+ * End a batch update to the store data, notifying the UI of any changes
+ * which occurred while batch mode was enabled.
+ */
+ endBatchUpdate() {
+ this.batchMode_ = false;
+ this.notifyObservers_(this.data);
+ }
+
+ /**
+ * Handles a 'deferred' action, which can asynchronously dispatch actions
+ * to the Store in order to reach a new UI state. DeferredActions have the
+ * form `dispatchAsync(function(dispatch) { ... })`). Inside that function,
+ * the |dispatch| callback can be called asynchronously to dispatch Actions
+ * directly to the Store.
+ */
+ dispatchAsync(action: DeferredAction) {
+ if (!this.initialized_) {
+ this.queuedActions_.push(action);
+ return;
+ }
+ this.dispatchInternal_(action);
+ }
+
+ /**
+ * Transition to a new UI state based on the supplied |action|, and notify
+ * observers of the change. If the Store has not yet been initialized, the
+ * action will be queued and performed upon initialization.
+ */
+ dispatch(action: Action|null) {
+ this.dispatchAsync(function(dispatch) {
+ dispatch(action);
+ });
+ }
+
+ private dispatchInternal_(action: DeferredAction) {
+ action(this.reduce.bind(this));
+ }
+
+ reduce(action: Action|null) {
+ if (!action) {
+ return;
+ }
+
+ this.data = this.reducer_(this.data, action);
+
+ // Batch notifications until after all initialization queuedActions are
+ // resolved.
+ if (this.isInitialized() && !this.batchMode_) {
+ this.notifyObservers_(this.data);
+ }
+ }
+
+ protected notifyObservers_(state: T) {
+ this.observers_.forEach(function(o) {
+ o.onStateChanged(state);
+ });
+ }
+}
diff --git a/chromium/ui/webui/resources/js/cr/ui/tree.js b/chromium/ui/webui/resources/js/cr/ui/tree.js
deleted file mode 100644
index 446adff0b28..00000000000
--- a/chromium/ui/webui/resources/js/cr/ui/tree.js
+++ /dev/null
@@ -1,767 +0,0 @@
-// Copyright (c) 2012 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.
-
-// NOTE: This file depends on ui.js (or the autogenerated ui.m.js module
-// version). These files and all files that depend on them are deprecated, and
-// should only be used by legacy UIs that have not yet been updated to new
-// patterns. Use Web Components in any new code.
-
-// clang-format off
-import {assert, assertInstanceof} from '../../assert.m.js';
-import {dispatchSimpleEvent, getPropertyDescriptor, isMac, PropertyKind} from '../../cr.m.js';
-import {getTrustedHTML} from '../../static_types.js';
-import {define as crUiDefine, limitInputWidth} from '../ui.m.js';
-// clang-format on
-
-/**
- * The number of pixels to indent per level.
- * @type {number}
- * @const
- */
-const INDENT = 20;
-
-/**
- * A custom rowElement depth (indent) style handler where undefined uses the
- * default depth INDENT styling, see TreeItem.setDepth_().
- *
- * @type {function(!TreeItem,number)|undefined}
- */
-let customRowElementDepthStyleHandler = undefined;
-
-/**
- * Returns the computed style for an element.
- * @param {!Element} el The element to get the computed style for.
- * @return {!CSSStyleDeclaration} The computed style.
- */
-function getComputedStyle(el) {
- return assert(el.ownerDocument.defaultView.getComputedStyle(el));
-}
-
-/**
- * Helper function that finds the first ancestor tree item.
- * @param {Node} node The node to start searching from.
- * @return {TreeItem} The found tree item or null if not found.
- */
-function findTreeItem(node) {
- while (node && !(node instanceof TreeItem)) {
- node = node.parentNode;
- }
- return node;
-}
-
-/**
- * Creates a new tree element.
- * @param {Object=} opt_propertyBag Optional properties.
- * @constructor
- * @extends {HTMLElement}
- */
-export const Tree = crUiDefine('tree');
-
-Tree.prototype = {
- __proto__: HTMLElement.prototype,
-
- /**
- * Initializes the element.
- */
- decorate() {
- // Make list focusable
- if (!this.hasAttribute('tabindex')) {
- this.tabIndex = 0;
- }
-
- this.addEventListener('click', this.handleClick);
- this.addEventListener('mousedown', this.handleMouseDown);
- this.addEventListener('dblclick', this.handleDblClick);
- this.addEventListener('keydown', this.handleKeyDown);
-
- if (!this.hasAttribute('role')) {
- this.setAttribute('role', 'tree');
- }
- },
-
- /**
- * Returns the tree item rowElement style handler.
- *
- * @return {function(!TreeItem,number)|undefined}
- */
- get rowElementDepthStyleHandler() {
- return customRowElementDepthStyleHandler;
- },
-
- /**
- * Sets a tree item rowElement style handler, which allows Tree users to
- * customize the depth (indent) style of tree item rowElements.
- *
- * @param {function(!TreeItem,number)|undefined} handler
- */
- set rowElementDepthStyleHandler(handler) {
- customRowElementDepthStyleHandler = handler;
- },
-
- /**
- * Returns the tree item that are children of this tree.
- */
- get items() {
- return this.children;
- },
-
- /**
- * Adds a tree item to the tree.
- * @param {!TreeItem} treeItem The item to add.
- */
- add(treeItem) {
- this.addAt(treeItem, 0xffffffff);
- },
-
- /**
- * Adds a tree item at the given index.
- * @param {!TreeItem} treeItem The item to add.
- * @param {number} index The index where we want to add the item.
- */
- addAt(treeItem, index) {
- this.insertBefore(treeItem, this.children[index]);
- treeItem.setDepth_(this.depth + 1);
- },
-
- /**
- * Removes a tree item child.
- *
- * TODO(dbeam): this method now conflicts with HTMLElement#remove(), which
- * is why the @param is optional. Rename.
- *
- * @param {!TreeItem=} treeItem The tree item to remove.
- */
- remove(treeItem) {
- this.removeChild(/** @type {!TreeItem} */ (treeItem));
- },
-
- /**
- * The depth of the node. This is 0 for the tree itself.
- * @type {number}
- */
- get depth() {
- return 0;
- },
-
- /**
- * Handles click events on the tree and forwards the event to the relevant
- * tree items as necessary.
- * @param {Event} e The click event object.
- */
- handleClick(e) {
- const treeItem = findTreeItem(/** @type {!Node} */ (e.target));
- if (treeItem) {
- treeItem.handleClick(e);
- }
- },
-
- handleMouseDown(e) {
- if (e.button === 2) { // right
- this.handleClick(e);
- }
- },
-
- /**
- * Handles double click events on the tree.
- * @param {Event} e The dblclick event object.
- */
- handleDblClick(e) {
- const treeItem = findTreeItem(/** @type {!Node} */ (e.target));
- if (treeItem) {
- treeItem.expanded = !treeItem.expanded;
- }
- },
-
- /**
- * Handles keydown events on the tree and updates selection and exanding
- * of tree items.
- * @param {Event} e The click event object.
- */
- handleKeyDown(e) {
- let itemToSelect;
- if (e.ctrlKey) {
- return;
- }
-
- const item = this.selectedItem;
- if (!item) {
- return;
- }
-
- const rtl = getComputedStyle(item).direction === 'rtl';
-
- switch (e.key) {
- case 'ArrowUp':
- itemToSelect =
- item ? getPrevious(item) : this.items[this.items.length - 1];
- break;
- case 'ArrowDown':
- itemToSelect = item ? getNext(item) : this.items[0];
- break;
- case 'ArrowLeft':
- case 'ArrowRight':
- // Don't let back/forward keyboard shortcuts be used.
- if (!isMac && e.altKey || isMac && e.metaKey) {
- break;
- }
-
- if (e.key === 'ArrowLeft' && !rtl || e.key === 'ArrowRight' && rtl) {
- if (item.expanded) {
- item.expanded = false;
- } else {
- itemToSelect = findTreeItem(item.parentNode);
- }
- } else {
- if (!item.expanded) {
- item.expanded = true;
- } else {
- itemToSelect = item.items[0];
- }
- }
- break;
- case 'Home':
- itemToSelect = this.items[0];
- break;
- case 'End':
- itemToSelect = this.items[this.items.length - 1];
- break;
- }
-
- if (itemToSelect) {
- itemToSelect.selected = true;
- e.preventDefault();
- }
- },
-
- /**
- * The selected tree item or null if none.
- * @type {TreeItem}
- */
- get selectedItem() {
- return this.selectedItem_ || null;
- },
- set selectedItem(item) {
- const oldSelectedItem = this.selectedItem_;
- if (oldSelectedItem !== item) {
- // Set the selectedItem_ before deselecting the old item since we only
- // want one change when moving between items.
- this.selectedItem_ = item;
-
- if (oldSelectedItem) {
- oldSelectedItem.selected = false;
- }
-
- if (item) {
- item.selected = true;
- if (item.id) {
- this.setAttribute('aria-activedescendant', item.id);
- }
- } else {
- this.removeAttribute('aria-activedescendant');
- }
- dispatchSimpleEvent(this, 'change');
- }
- },
-
- /**
- * @return {!ClientRect} The rect to use for the context menu.
- */
- getRectForContextMenu() {
- // TODO(arv): Add trait support so we can share more code between trees
- // and lists.
- if (this.selectedItem) {
- return this.selectedItem.rowElement.getBoundingClientRect();
- }
- return this.getBoundingClientRect();
- }
-};
-
-/**
- * Determines the visibility of icons next to the treeItem labels. If set to
- * 'hidden', no space is reserved for icons and no icons are displayed next
- * to treeItem labels. If set to 'parent', folder icons will be displayed
- * next to expandable parent nodes. If set to 'all' folder icons will be
- * displayed next to all nodes. Icons can be set using the treeItem's icon
- * property.
- * @type {boolean}
- */
-Tree.prototype.iconVisibility;
-Object.defineProperty(
- Tree.prototype, 'iconVisibility',
- getPropertyDescriptor('iconVisibility', PropertyKind.ATTR));
-
-/**
- * Incremental counter for an auto generated ID of the tree item. This will
- * be incremented per element, so each element never share same ID.
- *
- * @type {number}
- */
-let treeItemAutoGeneratedIdCounter = 0;
-
-/**
- * This is used as a blueprint for new tree item elements.
- * @type {!HTMLElement}
- */
-const treeItemProto = (function() {
- const treeItem = document.createElement('div');
- treeItem.className = 'tree-item';
- treeItem.innerHTML = getTrustedHTML`<div class="tree-row">
- <span class="expand-icon"></span>
- <span class="tree-label-icon"></span>
- <span class="tree-label"></span>
- </div>
- <div class="tree-children" role="group"></div>`;
-
-
- treeItem.setAttribute('role', 'treeitem');
- return treeItem;
-})();
-
-/**
- * Creates a new tree item.
- * @param {Object=} opt_propertyBag Optional properties.
- * @constructor
- * @extends {HTMLElement}
- */
-export const TreeItem = crUiDefine(function() {
- const treeItem = treeItemProto.cloneNode(true);
- treeItem.id = 'tree-item-autogen-id-' + treeItemAutoGeneratedIdCounter++;
- return treeItem;
-});
-
-TreeItem.prototype = {
- __proto__: HTMLElement.prototype,
-
- /**
- * Initializes the element.
- */
- decorate() {
- const labelId =
- 'tree-item-label-autogen-id-' + treeItemAutoGeneratedIdCounter;
- this.labelElement.id = labelId;
- this.setAttribute('aria-labelledby', labelId);
- },
-
- /**
- * The tree items children.
- */
- get items() {
- return this.lastElementChild.children;
- },
-
- /**
- * The depth of the tree item.
- * @type {number}
- */
- depth_: 0,
- get depth() {
- return this.depth_;
- },
-
- /**
- * Sets the depth.
- * @param {number} depth The new depth.
- * @private
- */
- setDepth_(depth) {
- if (depth !== this.depth_) {
- const rowDepth = Math.max(0, depth - 1);
- if (!customRowElementDepthStyleHandler) {
- this.rowElement.style.paddingInlineStart = rowDepth * INDENT + 'px';
- } else {
- customRowElementDepthStyleHandler(this, rowDepth);
- }
-
- this.depth_ = depth;
- const items = this.items;
- for (let i = 0, item; item = items[i]; i++) {
- item.setDepth_(depth + 1);
- }
- }
- },
-
- /**
- * Adds a tree item as a child.
- * @param {!TreeItem} child The child to add.
- */
- add(child) {
- this.addAt(child, 0xffffffff);
- },
-
- /**
- * Adds a tree item as a child at a given index.
- * @param {!TreeItem} child The child to add.
- * @param {number} index The index where to add the child.
- */
- addAt(child, index) {
- this.lastElementChild.insertBefore(child, this.items[index]);
- if (this.items.length === 1) {
- this.hasChildren = true;
- }
- child.setDepth_(this.depth + 1);
- },
-
- /**
- * Removes a child.
- * @param {!TreeItem=} child The tree item child to remove.
- * @override
- */
- remove(child) {
- // If we removed the selected item we should become selected.
- const tree = this.tree;
- const selectedItem = tree.selectedItem;
- if (selectedItem && child.contains(selectedItem)) {
- this.selected = true;
- }
-
- this.lastElementChild.removeChild(/** @type {!TreeItem} */ (child));
- if (this.items.length === 0) {
- this.hasChildren = false;
- }
- },
-
- /**
- * The parent tree item.
- * @type {!Tree|TreeItem}
- */
- get parentItem() {
- let p = this.parentNode;
- while (p && !(p instanceof TreeItem) && !(p instanceof Tree)) {
- p = p.parentNode;
- }
- return p;
- },
-
- /**
- * The tree that the tree item belongs to or null of no added to a tree.
- * @type {Tree}
- */
- get tree() {
- let t = this.parentItem;
- while (t && !(t instanceof Tree)) {
- t = t.parentItem;
- }
- return t;
- },
-
- /**
- * Whether the tree item is expanded or not.
- * @type {boolean}
- */
- get expanded() {
- return this.hasAttribute('expanded');
- },
- set expanded(b) {
- if (this.expanded === b) {
- return;
- }
-
- const treeChildren = this.lastElementChild;
-
- if (b) {
- if (this.mayHaveChildren_) {
- this.setAttribute('expanded', '');
- this.setAttribute('aria-expanded', 'true');
- treeChildren.setAttribute('expanded', '');
- dispatchSimpleEvent(this, 'expand', true);
- this.scrollIntoViewIfNeeded(false);
- }
- } else {
- const tree = this.tree;
- if (tree && !this.selected) {
- const oldSelected = tree.selectedItem;
- if (oldSelected && this.contains(oldSelected)) {
- this.selected = true;
- }
- }
- this.removeAttribute('expanded');
- if (this.mayHaveChildren_) {
- this.setAttribute('aria-expanded', 'false');
- } else {
- this.removeAttribute('aria-expanded');
- }
- treeChildren.removeAttribute('expanded');
- dispatchSimpleEvent(this, 'collapse', true);
- }
- },
-
- /**
- * Expands all parent items.
- */
- reveal() {
- let pi = this.parentItem;
- while (pi && !(pi instanceof Tree)) {
- pi.expanded = true;
- pi = pi.parentItem;
- }
- },
-
- /**
- * The element representing the row that gets highlighted.
- * @type {!HTMLElement}
- */
- get rowElement() {
- return this.firstElementChild;
- },
-
- /**
- * The element containing the label text.
- * @type {!HTMLElement}
- */
- get labelElement() {
- return this.rowElement.lastElementChild;
- },
-
- /**
- * The label text.
- * @type {string}
- */
- get label() {
- return this.labelElement.textContent;
- },
- set label(s) {
- this.labelElement.textContent = s;
- },
-
- /**
- * Whether the tree item is selected or not.
- * @type {boolean}
- */
- get selected() {
- return this.hasAttribute('selected');
- },
- set selected(b) {
- if (this.selected === b) {
- return;
- }
- const rowItem = this.rowElement;
- const tree = this.tree;
- if (b) {
- this.setAttribute('selected', '');
- rowItem.setAttribute('selected', '');
- this.reveal();
- this.labelElement.scrollIntoViewIfNeeded(false);
- if (tree) {
- tree.selectedItem = this;
- }
- } else {
- this.removeAttribute('selected');
- rowItem.removeAttribute('selected');
- if (tree && tree.selectedItem === this) {
- tree.selectedItem = null;
- }
- }
- },
-
- /**
- * Whether the tree item has children.
- * @type {boolean}
- */
- get mayHaveChildren_() {
- return this.hasAttribute('may-have-children');
- },
- set mayHaveChildren_(b) {
- const rowItem = this.rowElement;
- if (b) {
- this.setAttribute('may-have-children', '');
- rowItem.setAttribute('may-have-children', '');
- } else {
- this.removeAttribute('may-have-children');
- rowItem.removeAttribute('may-have-children');
- }
- },
-
- /**
- * Whether the tree item has children.
- * @type {boolean}
- */
- get hasChildren() {
- return !!this.items[0];
- },
-
- /**
- * Whether the tree item has children.
- * @type {boolean}
- */
- set hasChildren(b) {
- const rowItem = this.rowElement;
- this.setAttribute('has-children', b);
- rowItem.setAttribute('has-children', b);
- if (b) {
- this.mayHaveChildren_ = true;
- this.setAttribute('aria-expanded', this.expanded);
- }
- },
-
- /**
- * Called when the user clicks on a tree item. This is forwarded from the
- * Tree.
- * @param {Event} e The click event.
- */
- handleClick(e) {
- if (e.target.className === 'expand-icon') {
- this.expanded = !this.expanded;
- } else {
- this.selected = true;
- }
- },
-
- /**
- * Makes the tree item user editable. If the user renamed the item a
- * bubbling {@code rename} event is fired.
- * @type {boolean}
- */
- set editing(editing) {
- const oldEditing = this.editing;
- if (editing === oldEditing) {
- return;
- }
-
- const self = this;
- const labelEl = this.labelElement;
- const text = this.label;
- let input;
-
- // Handles enter and escape which trigger reset and commit respectively.
- function handleKeydown(e) {
- // Make sure that the tree does not handle the key.
- e.stopPropagation();
-
- // Calling tree.focus blurs the input which will make the tree item
- // non editable.
- switch (e.key) {
- case 'Escape':
- input.value = text;
- // fall through
- case 'Enter':
- self.tree.focus();
- }
- }
-
- function stopPropagation(e) {
- e.stopPropagation();
- }
-
- if (editing) {
- this.selected = true;
- this.setAttribute('editing', '');
- this.draggable = false;
-
- // We create an input[type=text] and copy over the label value. When
- // the input loses focus we set editing to false again.
- input = this.ownerDocument.createElement('input');
- input.value = text;
- if (labelEl.firstChild) {
- labelEl.replaceChild(input, labelEl.firstChild);
- } else {
- labelEl.appendChild(input);
- }
-
- input.addEventListener('keydown', handleKeydown);
- input.addEventListener('blur', (function() {
- this.editing = false;
- }).bind(this));
-
- // Make sure that double clicks do not expand and collapse the tree
- // item.
- const eventsToStop = ['mousedown', 'mouseup', 'contextmenu', 'dblclick'];
- eventsToStop.forEach(function(type) {
- input.addEventListener(type, stopPropagation);
- });
-
- // Wait for the input element to recieve focus before sizing it.
- const rowElement = this.rowElement;
- const onFocus = function() {
- input.removeEventListener('focus', onFocus);
- // 20 = the padding and border of the tree-row
- limitInputWidth(input, rowElement, 100);
- };
- input.addEventListener('focus', onFocus);
- input.focus();
- input.select();
-
- this.oldLabel_ = text;
- } else {
- this.removeAttribute('editing');
- this.draggable = true;
- input = labelEl.firstChild;
- const value = input.value;
- if (/^\s*$/.test(value)) {
- labelEl.textContent = this.oldLabel_;
- } else {
- labelEl.textContent = value;
- if (value !== this.oldLabel_) {
- dispatchSimpleEvent(this, 'rename', true);
- }
- }
- delete this.oldLabel_;
- }
- },
-
- get editing() {
- return this.hasAttribute('editing');
- }
-};
-
-/**
- * Helper function that returns the next visible tree item.
- * @param {TreeItem} item The tree item.
- * @return {TreeItem} The found item or null.
- */
-function getNext(item) {
- if (item.expanded) {
- const firstChild = item.items[0];
- if (firstChild) {
- return firstChild;
- }
- }
-
- return getNextHelper(item);
-}
-
-/**
- * Another helper function that returns the next visible tree item.
- * @param {TreeItem} item The tree item.
- * @return {TreeItem} The found item or null.
- */
-function getNextHelper(item) {
- if (!item) {
- return null;
- }
-
- const nextSibling = item.nextElementSibling;
- if (nextSibling) {
- return assertInstanceof(nextSibling, TreeItem);
- }
- return getNextHelper(item.parentItem);
-}
-
-/**
- * Helper function that returns the previous visible tree item.
- * @param {TreeItem} item The tree item.
- * @return {TreeItem} The found item or null.
- */
-function getPrevious(item) {
- const previousSibling = item.previousElementSibling;
- if (previousSibling) {
- return getLastHelper(assertInstanceof(previousSibling, TreeItem));
- }
- return item.parentItem;
-}
-
-/**
- * Helper function that returns the last visible tree item in the subtree.
- * @param {TreeItem} item The item to find the last visible item for.
- * @return {TreeItem} The found item or null.
- */
-function getLastHelper(item) {
- if (!item) {
- return null;
- }
- if (item.expanded && item.hasChildren) {
- const lastChild = item.items[item.items.length - 1];
- return getLastHelper(lastChild);
- }
- return item;
-}
diff --git a/chromium/ui/webui/resources/js/i18n_template_no_process.js b/chromium/ui/webui/resources/js/i18n_template_no_process.js
index aa25c0524c8..8a903568572 100644
--- a/chromium/ui/webui/resources/js/i18n_template_no_process.js
+++ b/chromium/ui/webui/resources/js/i18n_template_no_process.js
@@ -106,7 +106,7 @@ let ProcessingRoot;
element.setAttribute(propName, /** @type {string} */ (value));
}
});
- }
+ },
};
const prefixes = [''];
diff --git a/chromium/ui/webui/resources/js/icon.js b/chromium/ui/webui/resources/js/icon.js
index 8888fc0bb72..2d3d1e079a4 100644
--- a/chromium/ui/webui/resources/js/icon.js
+++ b/chromium/ui/webui/resources/js/icon.js
@@ -107,7 +107,7 @@ export function getImage(path) {
function getBaseFaviconUrl() {
const faviconUrl = new URL('chrome://favicon2/');
faviconUrl.searchParams.set('size', '16');
- faviconUrl.searchParams.set('scale_factor', 'SCALEFACTORx');
+ faviconUrl.searchParams.set('scaleFactor', 'SCALEFACTORx');
return faviconUrl;
}
@@ -119,7 +119,7 @@ function getBaseFaviconUrl() {
*/
export function getFavicon(url) {
const faviconUrl = getBaseFaviconUrl();
- faviconUrl.searchParams.set('icon_url', url);
+ faviconUrl.searchParams.set('iconUrl', url);
return getImageSet(faviconUrl.toString());
}
@@ -142,13 +142,13 @@ export function getFaviconForPageURL(
// chrome://favicon2 format in components/favicon_base/favicon_url_parser.h.
const faviconUrl = getBaseFaviconUrl();
faviconUrl.searchParams.set('size', size);
- faviconUrl.searchParams.set('page_url', url);
- // TODO(dbeam): use the presence of 'allow_google_server_fallback' to
+ faviconUrl.searchParams.set('pageUrl', url);
+ // TODO(dbeam): use the presence of 'allowGoogleServerFallback' to
// indicate true, otherwise false.
const fallback = isSyncedUrlForHistoryUi ? '1' : '0';
- faviconUrl.searchParams.set('allow_google_server_fallback', fallback);
+ faviconUrl.searchParams.set('allowGoogleServerFallback', fallback);
if (isSyncedUrlForHistoryUi) {
- faviconUrl.searchParams.set('icon_url', remoteIconUrlForUma);
+ faviconUrl.searchParams.set('iconUrl', remoteIconUrlForUma);
}
return getImageSet(faviconUrl.toString());
diff --git a/chromium/ui/webui/resources/js/ios/mojo_api.js b/chromium/ui/webui/resources/js/ios/mojo_api.js
index b25404529aa..85151b80ad9 100644
--- a/chromium/ui/webui/resources/js/ios/mojo_api.js
+++ b/chromium/ui/webui/resources/js/ios/mojo_api.js
@@ -56,8 +56,8 @@ Mojo.bindInterface = function(interfaceName, requestHandle) {
name: 'Mojo.bindInterface',
args: {
interfaceName: interfaceName,
- requestHandle: requestHandle.takeNativeHandle_()
- }
+ requestHandle: requestHandle.takeNativeHandle_(),
+ },
});
};
@@ -134,8 +134,8 @@ MojoHandle.prototype.watch = function(signals, callback) {
args: {
handle: this.nativeHandle_,
signals: signalsValue,
- callbackId: Mojo.internal.watchCallbacksHolder.getNextCallbackId()
- }
+ callbackId: Mojo.internal.watchCallbacksHolder.getNextCallbackId(),
+ },
});
Mojo.internal.watchCallbacksHolder.addWatchCallback(watchId, callback);
@@ -160,7 +160,7 @@ MojoHandle.prototype.writeMessage = function(buffer, handles) {
handle: this.nativeHandle_,
buffer: buffer,
handles: nativeHandles,
- }
+ },
});
};
@@ -296,6 +296,6 @@ Mojo.internal.watchCallbacksHolder = (function() {
callCallback: callCallback,
getNextCallbackId: getNextCallbackId,
addWatchCallback: addWatchCallback,
- removeWatchCallback: removeWatchCallback
+ removeWatchCallback: removeWatchCallback,
};
})();
diff --git a/chromium/ui/webui/resources/js/ios/web_ui.js b/chromium/ui/webui/resources/js/ios/web_ui.js
index 3dff8352dab..e49caedd152 100644
--- a/chromium/ui/webui/resources/js/ios/web_ui.js
+++ b/chromium/ui/webui/resources/js/ios/web_ui.js
@@ -15,7 +15,7 @@ window['chrome']['send'] = function(message, args) {
__gCrWeb.message.invokeOnHost({
'command': 'webui.chromeSend',
'message': message,
- 'arguments': args || []
+ 'arguments': args || [],
});
};
diff --git a/chromium/ui/webui/resources/js/list_property_update_behavior.m.d.ts b/chromium/ui/webui/resources/js/list_property_update_behavior.d.ts
index 9fc04208129..bacfb0be877 100644
--- a/chromium/ui/webui/resources/js/list_property_update_behavior.m.d.ts
+++ b/chromium/ui/webui/resources/js/list_property_update_behavior.d.ts
@@ -4,9 +4,8 @@
export interface ListPropertyUpdateBehavior {
updateList(
- propertyPath: string,
- identityGetter: ((arg0: any) => (any | string)),
- updatedList: object[], identityBasedUpdate?: boolean): boolean;
+ propertyPath: string, identityGetter: ((arg0: any) => (any | string)),
+ updatedList: any[], identityBasedUpdate?: boolean): boolean;
}
declare const ListPropertyUpdateBehavior: object;
diff --git a/chromium/ui/webui/resources/js/list_property_update_behavior.js b/chromium/ui/webui/resources/js/list_property_update_behavior.js
index 787bb99da5e..4d846fcade0 100644
--- a/chromium/ui/webui/resources/js/list_property_update_behavior.js
+++ b/chromium/ui/webui/resources/js/list_property_update_behavior.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 {calculateSplices} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {calculateSplices} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
/**
* @fileoverview |ListPropertyUpdateBehavior| is used to update an existing
@@ -12,7 +12,7 @@
* re-rendered from scratch.
*
* The minimal splices needed to transform the original list to the edited list
- * are calculated using |Polymer.ArraySplice.calculateSplices|. All the edits
+ * are calculated using |calculateSplices|. All the edits
* are then applied to the original list. Once completed, a single notification
* containing information about all the edits is sent to the polyer object.
*
@@ -21,7 +21,7 @@
*/
/** @polymerBehavior */
-/* #export */ const ListPropertyUpdateBehavior = {
+export const ListPropertyUpdateBehavior = {
/**
* @param {string} propertyPath
* @param {function(!Object): (!Object|string)} identityGetter
@@ -32,7 +32,7 @@
updateList(
propertyPath, identityGetter, updatedList, identityBasedUpdate = false) {
const list = this.get(propertyPath);
- const splices = Polymer.ArraySplice.calculateSplices(
+ const splices = calculateSplices(
updatedList.map(identityGetter), list.map(identityGetter));
splices.forEach(splice => {
@@ -67,7 +67,7 @@
},
};
-/* #export */ class ListPropertyUpdateBehaviorInterface {
+export class ListPropertyUpdateBehaviorInterface {
/**
* @param {string} propertyPath
* @param {function(!Object): (!Object|string)} identityGetter
@@ -78,5 +78,3 @@
updateList(
propertyPath, identityGetter, updatedList, identityBasedUpdate = false) {}
}
-
-/* #ignore */ console.warn('crbug/1173575, non-JS module files deprecated.');
diff --git a/chromium/ui/webui/resources/js/metrics_reporter/BUILD.gn b/chromium/ui/webui/resources/js/metrics_reporter/BUILD.gn
index 497ec96afc8..0a08ae9cb2a 100644
--- a/chromium/ui/webui/resources/js/metrics_reporter/BUILD.gn
+++ b/chromium/ui/webui/resources/js/metrics_reporter/BUILD.gn
@@ -48,6 +48,7 @@ generate_grd("build_grdp") {
grd_prefix = "webui_js_metrics_reporter"
out_grd = "$target_gen_dir/resources.grdp"
public_deps = [ ":build_ts" ]
- manifest_files = [ "$target_gen_dir/tsconfig.manifest" ]
+ manifest_files =
+ filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
resource_path_prefix = "js/metrics_reporter"
}
diff --git a/chromium/ui/webui/resources/js/metrics_reporter/metrics_reporter.ts b/chromium/ui/webui/resources/js/metrics_reporter/metrics_reporter.ts
index d44ec1f5768..14b518f08e1 100644
--- a/chromium/ui/webui/resources/js/metrics_reporter/metrics_reporter.ts
+++ b/chromium/ui/webui/resources/js/metrics_reporter/metrics_reporter.ts
@@ -77,7 +77,7 @@ export class MetricsReporterImpl implements MetricsReporter {
callbackRouter.onGetMark.addListener(
(name: string) => ({
markedTime:
- this.marks_.has(name) ? timeToMojo(this.marks_.get(name)!) : null
+ this.marks_.has(name) ? timeToMojo(this.marks_.get(name)!) : null,
}));
callbackRouter.onClearMark.addListener(
diff --git a/chromium/ui/webui/resources/js/parse_html_subset.js b/chromium/ui/webui/resources/js/parse_html_subset.js
index 0bfd0910309..83159d24975 100644
--- a/chromium/ui/webui/resources/js/parse_html_subset.js
+++ b/chromium/ui/webui/resources/js/parse_html_subset.js
@@ -59,7 +59,7 @@
return node.tagName === 'A' &&
(value.startsWith('chrome://') || value.startsWith('https://') ||
value === '#');
- }
+ },
],
[
'target',
@@ -67,7 +67,7 @@
// Only allow a[target='_blank'].
// TODO(dbeam): are there valid use cases for target !== '_blank'?
return node.tagName === 'A' && value === '_blank';
- }
+ },
],
]);
@@ -86,7 +86,7 @@
(node, value) => {
// Only allow img[src] starting with chrome://
return node.tagName === 'IMG' && value.startsWith('chrome://');
- }
+ },
],
['tabindex', allowAttribute],
['aria-hidden', allowAttribute],
diff --git a/chromium/ui/webui/resources/js/parse_html_subset.m.d.ts b/chromium/ui/webui/resources/js/parse_html_subset.m.d.ts
index 7f2a537204c..e2a263f52a2 100644
--- a/chromium/ui/webui/resources/js/parse_html_subset.m.d.ts
+++ b/chromium/ui/webui/resources/js/parse_html_subset.m.d.ts
@@ -2,14 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-export type SanitizeInnerHtmlOpts = {
- substitutions?: Array<string>,
- attrs?: Array<string>,
- tags?: Array<string>,
-};
+export interface SanitizeInnerHtmlOpts {
+ substitutions?: string[];
+ attrs?: string[];
+ tags?: string[];
+}
export function sanitizeInnerHtml(
rawString: string, opts?: SanitizeInnerHtmlOpts): string;
export function parseHtmlSubset(
- s: string, extraTags?: Array<string>,
- extraAttrs?: Array<string>): DocumentFragment;
+ s: string, extraTags?: string[], extraAttrs?: string[]): DocumentFragment;
diff --git a/chromium/ui/webui/resources/js/search_highlight_utils.js b/chromium/ui/webui/resources/js/search_highlight_utils.ts
index 7c29a013db1..59133de3639 100644
--- a/chromium/ui/webui/resources/js/search_highlight_utils.js
+++ b/chromium/ui/webui/resources/js/search_highlight_utils.ts
@@ -2,37 +2,37 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import {assert} from 'chrome://resources/js/assert.m.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
-/** @type {string} */
-const WRAPPER_CSS_CLASS = 'search-highlight-wrapper';
+const WRAPPER_CSS_CLASS: string = 'search-highlight-wrapper';
-/** @type {string} */
-const ORIGINAL_CONTENT_CSS_CLASS = 'search-highlight-original-content';
+const ORIGINAL_CONTENT_CSS_CLASS: string = 'search-highlight-original-content';
-/** @type {string} */
-const HIT_CSS_CLASS = 'search-highlight-hit';
+const HIT_CSS_CLASS: string = 'search-highlight-hit';
-/** @type {string} */
-const SEARCH_BUBBLE_CSS_CLASS = 'search-bubble';
+const SEARCH_BUBBLE_CSS_CLASS: string = 'search-bubble';
-/** @typedef {{start: number, length: number}} */
-export let Range;
+export interface Range {
+ start: number;
+ length: number;
+}
/**
* Replaces the the highlight wrappers given in |wrappers| with the original
* search nodes.
- * @param {!Array<!Node>} wrappers
*/
-export function removeHighlights(wrappers) {
+export function removeHighlights(wrappers: HTMLElement[]) {
for (const wrapper of wrappers) {
// If wrapper is already removed, do nothing.
if (!wrapper.parentElement) {
continue;
}
- const textNode =
- wrapper.querySelector(`.${ORIGINAL_CONTENT_CSS_CLASS}`).firstChild;
+ const originalContent =
+ wrapper.querySelector(`.${ORIGINAL_CONTENT_CSS_CLASS}`);
+ assert(originalContent);
+ const textNode = originalContent.firstChild;
+ assert(textNode);
wrapper.parentElement.replaceChild(textNode, wrapper);
}
}
@@ -42,28 +42,29 @@ export function removeHighlights(wrappers) {
* highlights (yellow rectangles) with the original search node. Searches only
* within the same shadowRoot and assumes that only one highlight wrapper
* exists under |node|.
- * @param {!Node} node
*/
-export function findAndRemoveHighlights(node) {
- const wrappers = Array.from(node.querySelectorAll(`.${WRAPPER_CSS_CLASS}`));
+export function findAndRemoveHighlights(node: Node) {
+ const wrappers =
+ Array.from((node as HTMLElement)
+ .querySelectorAll<HTMLElement>(`.${WRAPPER_CSS_CLASS}`));
assert(wrappers.length === 1);
removeHighlights(wrappers);
}
/**
* Applies the highlight UI (yellow rectangle) around all matches in |node|.
- * @param {!Node} node The text node to be highlighted. |node| ends up
+ * @param node The text node to be highlighted. |node| ends up
* being hidden.
- * @param {!Array<!Range>} ranges
- * @return {!HTMLElement} The new highlight wrapper.
+ * @return The new highlight wrapper.
*/
-export function highlight(node, ranges) {
+export function highlight(node: Node, ranges: Range[]): HTMLElement {
assert(ranges.length > 0);
- const wrapper = /** @type {!HTMLElement} */ (document.createElement('span'));
+ const wrapper = document.createElement('span');
wrapper.classList.add(WRAPPER_CSS_CLASS);
// Use existing node as placeholder to determine where to insert the
// replacement content.
+ assert(node.parentNode);
node.parentNode.replaceChild(wrapper, node);
// Keep the existing node around for when the highlights are removed. The
@@ -75,22 +76,22 @@ export function highlight(node, ranges) {
span.appendChild(node);
wrapper.appendChild(span);
- const text = node.textContent;
- /** @type {!Array<string>} */ const tokens = [];
+ const text = node.textContent!;
+ const tokens: string[] = [];
for (let i = 0; i < ranges.length; ++i) {
- const range = ranges[i];
- const prev = ranges[i - 1] || {start: 0, length: 0};
+ const range = ranges[i]!;
+ const prev = ranges[i - 1]! || {start: 0, length: 0};
const start = prev.start + prev.length;
const length = range.start - start;
tokens.push(text.substr(start, length));
tokens.push(text.substr(range.start, range.length));
}
- const last = ranges.slice(-1)[0];
+ const last = ranges.slice(-1)[0]!;
tokens.push(text.substr(last.start + last.length));
for (let i = 0; i < tokens.length; ++i) {
if (i % 2 === 0) {
- wrapper.appendChild(document.createTextNode(tokens[i]));
+ wrapper.appendChild(document.createTextNode(tokens[i]!));
} else {
const hitSpan = document.createElement('span');
hitSpan.classList.add(HIT_CSS_CLASS);
@@ -99,7 +100,7 @@ export function highlight(node, ranges) {
'var(--search-highlight-hit-background-color, #ffeb3b)';
// Defaults to the color associated with --google-grey-900.
hitSpan.style.color = 'var(--search-highlight-hit-color, #202124)';
- hitSpan.textContent = tokens[i];
+ hitSpan.textContent = tokens[i]!;
wrapper.appendChild(hitSpan);
}
}
@@ -109,30 +110,32 @@ export function highlight(node, ranges) {
/**
* Creates an empty search bubble (styled HTML element without text).
* |node| should already be visible or the bubble will render incorrectly.
- * @param {!Node} node The node to be highlighted.
- * @param {boolean=} horizontallyCenter Whether or not to horizontally center
+ * @param node The node to be highlighted.
+ * @param horizontallyCenter Whether or not to horizontally center
* the shown search bubble (if any) based on |node|'s left and width.
- * @return {!HTMLElement} The search bubble that was added, or null if no new
+ * @return The search bubble that was added, or null if no new
* bubble was added.
*/
-export function createEmptySearchBubble(node, horizontallyCenter) {
+export function createEmptySearchBubble(
+ node: Node, horizontallyCenter?: boolean): HTMLElement {
let anchor = node;
if (node.nodeName === 'SELECT') {
- anchor = node.parentNode;
+ anchor = node.parentNode!;
}
if (anchor instanceof ShadowRoot) {
- anchor = anchor.host.parentNode;
+ anchor = anchor.host.parentNode!;
}
- let searchBubble = /** @type {?HTMLElement} */ (
- anchor.querySelector(`.${SEARCH_BUBBLE_CSS_CLASS}`));
+ let searchBubble =
+ (anchor as HTMLElement)
+ .querySelector<HTMLElement>(`.${SEARCH_BUBBLE_CSS_CLASS}`);
// If the node has already been highlighted, there is no need to do
// anything.
if (searchBubble) {
return searchBubble;
}
- searchBubble = /** @type {!HTMLElement} */ (document.createElement('div'));
+ searchBubble = document.createElement('div');
searchBubble.classList.add(SEARCH_BUBBLE_CSS_CLASS);
const innards = document.createElement('div');
innards.classList.add('search-bubble-innards');
@@ -141,14 +144,16 @@ export function createEmptySearchBubble(node, horizontallyCenter) {
anchor.appendChild(searchBubble);
const updatePosition = function() {
- assert(typeof node.offsetTop === 'number');
- searchBubble.style.top = node.offsetTop +
+ const nodeEl = node as HTMLElement;
+ assert(searchBubble);
+ assert(typeof nodeEl.offsetTop === 'number');
+ searchBubble.style.top = nodeEl.offsetTop +
(innards.classList.contains('above') ? -searchBubble.offsetHeight :
- node.offsetHeight) +
+ nodeEl.offsetHeight) +
'px';
if (horizontallyCenter) {
- const width = node.offsetWidth - searchBubble.offsetWidth;
- searchBubble.style.left = node.offsetLeft + width / 2 + 'px';
+ const width = nodeEl.offsetWidth - searchBubble.offsetWidth;
+ searchBubble.style.left = nodeEl.offsetLeft + width / 2 + 'px';
}
};
updatePosition();
@@ -163,10 +168,6 @@ export function createEmptySearchBubble(node, horizontallyCenter) {
return searchBubble;
}
-/**
- * @param {string} text
- * @return {string}
- */
-export function stripDiacritics(text) {
+export function stripDiacritics(text: string): string {
return text.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
}
diff --git a/chromium/ui/webui/resources/js/static_types.d.ts b/chromium/ui/webui/resources/js/static_types.d.ts
index 3e605bd4b9b..75955698854 100644
--- a/chromium/ui/webui/resources/js/static_types.d.ts
+++ b/chromium/ui/webui/resources/js/static_types.d.ts
@@ -4,5 +4,7 @@
export function getTrustedHTML(literal: string[]|
TemplateStringsArray): TrustedHTML|string;
-export function getTrustedScript(literal: string[]): TrustedScript|string;
-export function getTrustedScriptURL(literal: string[]): TrustedScriptURL|string;
+export function getTrustedScript(literal: string[]|
+ TemplateStringsArray): TrustedScript|string;
+export function getTrustedScriptURL(literal: string[]|TemplateStringsArray):
+ TrustedScriptURL|string;
diff --git a/chromium/ui/webui/resources/js/static_types.js b/chromium/ui/webui/resources/js/static_types.js
index 4fddfc86df0..84f9392ebee 100644
--- a/chromium/ui/webui/resources/js/static_types.js
+++ b/chromium/ui/webui/resources/js/static_types.js
@@ -53,7 +53,7 @@ function createTypes(ignore, literal) {
const rules = {
createHTML: createTypes,
createScript: createTypes,
- createScriptURL: createTypes
+ createScriptURL: createTypes,
};
/**
diff --git a/chromium/ui/webui/resources/js/test_loader_util.js b/chromium/ui/webui/resources/js/test_loader_util.js
index 2aa3e9d4a7e..4a98bf2c4fe 100644
--- a/chromium/ui/webui/resources/js/test_loader_util.js
+++ b/chromium/ui/webui/resources/js/test_loader_util.js
@@ -10,7 +10,7 @@ export function loadTestModule() {
return false;
}
- const host = params.get('host') || 'test';
+ const host = params.get('host') || 'webui-test';
if (host !== 'test' && host !== 'webui-test') {
return false;
}
diff --git a/chromium/ui/webui/resources/js/util.js b/chromium/ui/webui/resources/js/util.js
index 6e4649b561b..9394b63d073 100644
--- a/chromium/ui/webui/resources/js/util.js
+++ b/chromium/ui/webui/resources/js/util.js
@@ -18,21 +18,6 @@
return el ? assertInstanceof(el, HTMLElement) : null;
}
-// TODO(devlin): This should return SVGElement, but closure compiler is missing
-// those externs.
-/**
- * Alias for document.getElementById. Found elements must be SVGElements.
- * @param {string} id The ID of the element to find.
- * @return {Element} The found element or null if not found.
- */
-/* #export */ function getSVGElement(id) {
- // Disable getElementById restriction here, since it is not suitable for SVG
- // elements.
- // eslint-disable-next-line no-restricted-properties
- const el = document.getElementById(id);
- return el ? assertInstanceof(el, Element) : null;
-}
-
/**
* @return {?Element} The currently focused element (including elements that are
* behind a shadow root), or null if nothing is focused.
@@ -69,17 +54,6 @@
// </if>
/**
- * @param {Node} el A node to search for ancestors with |className|.
- * @param {string} className A class to search for.
- * @return {Element} A node with class of |className| or null if none is found.
- */
-/* #export */ function findAncestorByClass(el, className) {
- return /** @type {Element} */ (findAncestor(el, function(el) {
- return el.classList && el.classList.contains(className);
- }));
-}
-
-/**
* Return the first ancestor for which the {@code predicate} returns true.
* @param {Node} node The node to check.
* @param {function(Node):boolean} predicate The function that tests the
@@ -99,32 +73,6 @@
}
/**
- * Disables text selection and dragging, with optional callbacks to specify
- * overrides.
- * @param {function(Event):boolean=} allowSelectStart Unless this function
- * is defined and returns true, the onselectionstart event will be
- * suppressed.
- * @param {function(Event):boolean=} allowDragStart Unless this function
- * is defined and returns true, the ondragstart event will be suppressed.
- */
-/* #export */ function disableTextSelectAndDrag(
- allowSelectStart, allowDragStart) {
- // Disable text selection.
- document.onselectstart = function(e) {
- if (!(allowSelectStart && allowSelectStart.call(this, e))) {
- e.preventDefault();
- }
- };
-
- // Disable dragging.
- document.ondragstart = function(e) {
- if (!(allowDragStart && allowDragStart.call(this, e))) {
- e.preventDefault();
- }
- };
-}
-
-/**
* Check the directionality of the page.
* @return {boolean} True if Chrome is running an RTL UI.
*/
@@ -145,21 +93,6 @@
}
/**
- * Query an element that's known to exist by a selector. We use this instead of
- * just calling querySelector and not checking the result because this lets us
- * satisfy the JSCompiler type system.
- * @param {string} selectors CSS selectors to query the element.
- * @param {(!Document|!DocumentFragment|!Element)=} context An optional
- * context object for querySelector.
- * @return {!HTMLElement} the Element.
- */
-/* #export */ function queryRequiredElement(selectors, context) {
- const element = (context || document).querySelector(selectors);
- return assertInstanceof(
- element, HTMLElement, 'Missing required element: ' + selectors);
-}
-
-/**
* Creates a new URL which is the old URL with a GET param of key=value.
* @param {string} url The base URL. There is no validation checking on the URL
* so it must be passed in a proper format.
@@ -219,46 +152,6 @@
}
/**
- * Alias for document.scrollTop getter.
- * @param {!HTMLDocument} doc The document node where information will be
- * queried from.
- * @return {number} The Y document scroll offset.
- */
-/* #export */ function scrollTopForDocument(doc) {
- return doc.documentElement.scrollTop || doc.body.scrollTop;
-}
-
-/**
- * Alias for document.scrollTop setter.
- * @param {!HTMLDocument} doc The document node where information will be
- * queried from.
- * @param {number} value The target Y scroll offset.
- */
-/* #export */ function setScrollTopForDocument(doc, value) {
- doc.documentElement.scrollTop = doc.body.scrollTop = value;
-}
-
-/**
- * Alias for document.scrollLeft getter.
- * @param {!HTMLDocument} doc The document node where information will be
- * queried from.
- * @return {number} The X document scroll offset.
- */
-/* #export */ function scrollLeftForDocument(doc) {
- return doc.documentElement.scrollLeft || doc.body.scrollLeft;
-}
-
-/**
- * Alias for document.scrollLeft setter.
- * @param {!HTMLDocument} doc The document node where information will be
- * queried from.
- * @param {number} value The target X scroll offset.
- */
-/* #export */ function setScrollLeftForDocument(doc, value) {
- doc.documentElement.scrollLeft = doc.body.scrollLeft = value;
-}
-
-/**
* Replaces '&', '<', '>', '"', and ''' characters with their HTML encoding.
* @param {string} original The original string.
* @return {string} The string with all the characters mentioned above replaced.
@@ -272,22 +165,6 @@
}
/**
- * Shortens the provided string (if necessary) to a string of length at most
- * |maxLength|.
- * @param {string} original The original string.
- * @param {number} maxLength The maximum length allowed for the string.
- * @return {string} The original string if its length does not exceed
- * |maxLength|. Otherwise the first |maxLength| - 1 characters with '...'
- * appended.
- */
-/* #export */ function elide(original, maxLength) {
- if (original.length <= maxLength) {
- return original;
- }
- return original.substring(0, maxLength - 1) + '\u2026';
-}
-
-/**
* Quote a string so it can be used in a regular expression.
* @param {string} str The source string.
* @return {string} The escaped string.
diff --git a/chromium/ui/webui/resources/mojo/BUILD.gn b/chromium/ui/webui/resources/mojo/BUILD.gn
index 918e11a62b7..7ff9d043631 100644
--- a/chromium/ui/webui/resources/mojo/BUILD.gn
+++ b/chromium/ui/webui/resources/mojo/BUILD.gn
@@ -16,6 +16,8 @@ ts_library("library") {
in_files = [
"mojo/public/mojom/base/big_buffer.mojom-webui.js",
"mojo/public/mojom/base/file_path.mojom-webui.js",
+ "mojo/public/mojom/base/int128.mojom-webui.js",
+ "mojo/public/mojom/base/process_id.mojom-webui.js",
"mojo/public/mojom/base/safe_base_name.mojom-webui.js",
"mojo/public/mojom/base/string16.mojom-webui.js",
"mojo/public/mojom/base/text_direction.mojom-webui.js",
@@ -49,11 +51,13 @@ ts_library("library") {
in_files += [
"ui/gfx/range/mojom/range.mojom-webui.js",
"chromeos/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js",
+ "chromeos/ash/services/auth_factor_config/public/mojom/auth_factor_config.mojom-webui.js",
"chromeos/services/network_config/public/mojom/network_types.mojom-webui.js",
"chromeos/services/network_health/public/mojom/network_diagnostics.mojom-webui.js",
"chromeos/services/network_health/public/mojom/network_health.mojom-webui.js",
]
extra_deps += [
+ "//chromeos/ash/services/auth_factor_config/public/mojom:mojom_js__generator",
"//chromeos/services/bluetooth_config/public/mojom:mojom_js__generator",
"//chromeos/services/network_config/public/mojom:network_types_js__generator",
"//chromeos/services/network_health/public/mojom:mojom_js__generator",
diff --git a/chromium/ui/webui/resources/tools/generate_grd.gni b/chromium/ui/webui/resources/tools/generate_grd.gni
index 7a99fc852c5..889b47b4995 100644
--- a/chromium/ui/webui/resources/tools/generate_grd.gni
+++ b/chromium/ui/webui/resources/tools/generate_grd.gni
@@ -10,6 +10,8 @@ template("generate_grd") {
[
"deps",
"public_deps",
+ "testonly",
+ "visibility",
])
inputs = []
diff --git a/chromium/ui/webui/untrusted_bubble_web_ui_controller.cc b/chromium/ui/webui/untrusted_bubble_web_ui_controller.cc
new file mode 100644
index 00000000000..3d98fbf51f3
--- /dev/null
+++ b/chromium/ui/webui/untrusted_bubble_web_ui_controller.cc
@@ -0,0 +1,25 @@
+// 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/webui/untrusted_bubble_web_ui_controller.h"
+
+#include "content/public/browser/web_ui.h"
+#include "content/public/common/bindings_policy.h"
+
+namespace ui {
+
+UntrustedBubbleWebUIController::UntrustedBubbleWebUIController(
+ content::WebUI* web_ui,
+ bool enable_chrome_send)
+ : MojoBubbleWebUIController(web_ui, enable_chrome_send) {
+ // chrome.send() will not work without bindings.
+ CHECK(!enable_chrome_send);
+ // UntrustedWebUIController should never enable WebUI bindings that expose
+ // all of the browser interfaces.
+ web_ui->SetBindings(content::BINDINGS_POLICY_NONE);
+}
+
+UntrustedBubbleWebUIController::~UntrustedBubbleWebUIController() = default;
+
+} // namespace ui \ No newline at end of file
diff --git a/chromium/ui/webui/untrusted_bubble_web_ui_controller.h b/chromium/ui/webui/untrusted_bubble_web_ui_controller.h
new file mode 100644
index 00000000000..5a7291e7643
--- /dev/null
+++ b/chromium/ui/webui/untrusted_bubble_web_ui_controller.h
@@ -0,0 +1,32 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_WEBUI_UNTRUSTED_BUBBLE_WEB_UI_CONTROLLER_H_
+#define UI_WEBUI_UNTRUSTED_BUBBLE_WEB_UI_CONTROLLER_H_
+
+#include "ui/webui/mojo_bubble_web_ui_controller.h"
+
+namespace content {
+class WebUI;
+}
+
+namespace ui {
+
+// UntrustedWebUIController is intended for WebUI pages that process untrusted
+// content. These WebUIController should never request WebUI bindings, but
+// should instead use the WebUI Interface Broker to expose the individual
+// interface needed.
+class UntrustedBubbleWebUIController : public MojoBubbleWebUIController {
+ public:
+ explicit UntrustedBubbleWebUIController(content::WebUI* contents,
+ bool enable_chrome_send = false);
+ ~UntrustedBubbleWebUIController() override;
+ UntrustedBubbleWebUIController(UntrustedBubbleWebUIController&) = delete;
+ UntrustedBubbleWebUIController& operator=(
+ const UntrustedBubbleWebUIController&) = delete;
+};
+
+} // namespace ui
+
+#endif // UI_WEBUI_UNTRUSTED_WEB_UI_CONTROLLER_H_
diff --git a/chromium/ui/webui/webui_features.gni b/chromium/ui/webui/webui_features.gni
index 0affd25bd87..73ac127bbf3 100644
--- a/chromium/ui/webui/webui_features.gni
+++ b/chromium/ui/webui/webui_features.gni
@@ -12,4 +12,8 @@ declare_args() {
# Enable the WebUI version of the browser's tab strip.
enable_webui_tab_strip = is_chromeos || is_linux || is_win
+
+ # Whether to inline source maps during build. This is an experimental feature
+ # currently only being used for New Tab Page being tracked at crbug/1337530.
+ enable_webui_inline_sourcemaps = false
}
diff --git a/chromium/ui/wm/BUILD.gn b/chromium/ui/wm/BUILD.gn
index d006f7979a8..b3b9eb6a5de 100644
--- a/chromium/ui/wm/BUILD.gn
+++ b/chromium/ui/wm/BUILD.gn
@@ -6,7 +6,10 @@ import("//build/config/chromeos/ui_mode.gni")
import("//build/config/ui.gni")
import("//testing/test.gni")
+assert(use_aura)
+
component("wm") {
+ output_name = "ui_wm"
sources = [
"core/accelerator_delegate.h",
"core/accelerator_filter.cc",
@@ -19,8 +22,16 @@ component("wm") {
"core/compound_event_filter.h",
"core/coordinate_conversion.cc",
"core/coordinate_conversion.h",
+ "core/cursor_loader.cc",
+ "core/cursor_loader.h",
+ "core/cursor_lookup.cc",
+ "core/cursor_lookup.h",
"core/cursor_manager.cc",
"core/cursor_manager.h",
+ "core/cursor_util.cc",
+ "core/cursor_util.h",
+ "core/cursors_aura.cc",
+ "core/cursors_aura.h",
"core/default_activation_client.cc",
"core/default_activation_client.h",
"core/default_screen_position_client.cc",
@@ -54,7 +65,6 @@ component("wm") {
"core/window_properties.h",
"core/window_util.cc",
"core/window_util.h",
- "core/wm_core_export.h",
"core/wm_core_switches.cc",
"core/wm_core_switches.h",
"core/wm_state.cc",
@@ -62,31 +72,32 @@ component("wm") {
]
configs += [ "//build/config:precompiled_headers" ]
- defines = [ "WM_CORE_IMPLEMENTATION" ]
+ defines = [ "IS_UI_WM_IMPL" ]
- deps = [
+ public_deps = [
"//base",
"//build:chromeos_buildflags",
- "//skia",
"//ui/aura",
"//ui/base",
"//ui/base/cursor",
"//ui/base/cursor/mojom:cursor_type",
- "//ui/base/ime",
"//ui/compositor",
- "//ui/compositor_extra",
"//ui/display",
"//ui/events",
- "//ui/events:events_base",
- "//ui/events/devices",
- "//ui/events/platform",
"//ui/gfx",
- "//ui/gfx/animation",
"//ui/gfx/geometry",
- "//ui/resources",
"//ui/wm/public",
]
+ deps = [
+ "//skia",
+ "//ui/base/ime",
+ "//ui/compositor_extra",
+ "//ui/events/platform",
+ "//ui/gfx/animation",
+ "//ui/resources",
+ ]
+
if (is_chromeos_ash) {
sources += [
"core/ime_util_chromeos.cc",
@@ -131,7 +142,9 @@ test("wm_unittests") {
"core/capture_controller_unittest.cc",
"core/compound_event_filter_unittest.cc",
"core/coordinate_conversion_unittest.cc",
+ "core/cursor_loader_unittest.cc",
"core/cursor_manager_unittest.cc",
+ "core/cursor_util_unittest.cc",
"core/focus_controller_unittest.cc",
"core/shadow_controller_unittest.cc",
"core/transient_window_manager_unittest.cc",
@@ -152,6 +165,7 @@ test("wm_unittests") {
"//skia",
"//testing/gtest",
"//ui/aura:test_support",
+ "//ui/base",
"//ui/base:test_support",
"//ui/base/cursor",
"//ui/base/cursor/mojom:cursor_type",
@@ -161,6 +175,7 @@ test("wm_unittests") {
"//ui/events:test_support",
"//ui/events/platform",
"//ui/gfx",
+ "//ui/gfx:gfx_skia",
"//ui/gfx/animation",
"//ui/gfx/geometry",
"//ui/gl:test_support",
@@ -176,8 +191,10 @@ test("wm_unittests") {
}
if (is_fuchsia) {
- use_cfv2 = false
- additional_manifest_fragments =
- [ "//build/config/fuchsia/test/present_view_capabilities.test-cmx" ]
+ use_cfv1 = false
+ additional_manifest_fragments = [
+ "//build/config/fuchsia/test/present_view.shard.test-cml",
+ "//third_party/fuchsia-sdk/sdk/pkg/vulkan/client.shard.cml",
+ ]
}
}
diff --git a/chromium/ui/wm/OWNERS b/chromium/ui/wm/OWNERS
new file mode 100644
index 00000000000..8657d05e8b2
--- /dev/null
+++ b/chromium/ui/wm/OWNERS
@@ -0,0 +1,2 @@
+sky@chromium.org
+oshima@chromium.org
diff --git a/chromium/ui/wm/core/OWNERS b/chromium/ui/wm/core/OWNERS
index 5c9931ca569..127c209c06f 100644
--- a/chromium/ui/wm/core/OWNERS
+++ b/chromium/ui/wm/core/OWNERS
@@ -1 +1,2 @@
+per-file cursor*=file://ui/base/cursor/OWNERS
per-file shadow*=estade@chromium.org
diff --git a/chromium/ui/wm/core/accelerator_filter.h b/chromium/ui/wm/core/accelerator_filter.h
index 5de3e49d58d..b448b0679ae 100644
--- a/chromium/ui/wm/core/accelerator_filter.h
+++ b/chromium/ui/wm/core/accelerator_filter.h
@@ -7,15 +7,15 @@
#include <memory>
+#include "base/component_export.h"
#include "ui/events/event_handler.h"
-#include "ui/wm/core/wm_core_export.h"
namespace wm {
class AcceleratorDelegate;
// AcceleratorFilter filters key events for AcceleratorControler handling global
// keyboard accelerators.
-class WM_CORE_EXPORT AcceleratorFilter : public ui::EventHandler {
+class COMPONENT_EXPORT(UI_WM) AcceleratorFilter : public ui::EventHandler {
public:
// AcceleratorFilter doesn't own |accelerator_history|, it's owned by
// AcceleratorController.
diff --git a/chromium/ui/wm/core/base_focus_rules.h b/chromium/ui/wm/core/base_focus_rules.h
index 79aba7f7389..bdc6a3b3dd0 100644
--- a/chromium/ui/wm/core/base_focus_rules.h
+++ b/chromium/ui/wm/core/base_focus_rules.h
@@ -5,13 +5,14 @@
#ifndef UI_WM_CORE_BASE_FOCUS_RULES_H_
#define UI_WM_CORE_BASE_FOCUS_RULES_H_
+#include "base/component_export.h"
#include "ui/wm/core/focus_rules.h"
namespace wm {
// A set of basic focus and activation rules. Specializations should most likely
// subclass this and call up to these methods rather than reimplementing them.
-class WM_CORE_EXPORT BaseFocusRules : public FocusRules {
+class COMPONENT_EXPORT(UI_WM) BaseFocusRules : public FocusRules {
public:
BaseFocusRules(const BaseFocusRules&) = delete;
BaseFocusRules& operator=(const BaseFocusRules&) = delete;
diff --git a/chromium/ui/wm/core/capture_controller.cc b/chromium/ui/wm/core/capture_controller.cc
index d5502eb4190..560912a3f90 100644
--- a/chromium/ui/wm/core/capture_controller.cc
+++ b/chromium/ui/wm/core/capture_controller.cc
@@ -60,18 +60,24 @@ void CaptureController::SetCapture(aura::Window* new_capture_window) {
std::map<aura::Window*, aura::client::CaptureDelegate*> delegates =
delegates_;
+ aura::WindowTracker tracker;
+ if (new_capture_window)
+ tracker.Add(new_capture_window);
+ if (old_capture_window)
+ tracker.Add(old_capture_window);
+
// If we're starting a new capture, cancel all touches that aren't
// targeted to the capturing window.
if (new_capture_window) {
+ aura::Env::GetInstance()->gesture_recognizer()->CancelActiveTouchesExcept(
+ new_capture_window);
// Cancelling touches might cause |new_capture_window| to get deleted.
// Track |new_capture_window| and check if it still exists before
// committing |capture_window_|.
- aura::WindowTracker tracker;
- tracker.Add(new_capture_window);
- aura::Env::GetInstance()->gesture_recognizer()->CancelActiveTouchesExcept(
- new_capture_window);
if (!tracker.Contains(new_capture_window))
new_capture_window = nullptr;
+ if (old_capture_window && !tracker.Contains(old_capture_window))
+ old_capture_window = nullptr;
}
capture_window_ = new_capture_window;
@@ -81,8 +87,15 @@ void CaptureController::SetCapture(aura::Window* new_capture_window) {
? nullptr
: delegates_[capture_root_window];
- for (const auto& it : delegates)
+ // With more than one delegate (e.g. multiple displays), an earlier
+ // UpdateCapture() call could cancel an existing capture and destroy
+ // |old_capture_window|, causing a later UpdateCapture() call to access
+ // a dangling pointer, so detect and handle it.
+ for (const auto& it : delegates) {
it.second->UpdateCapture(old_capture_window, new_capture_window);
+ if (old_capture_window && !tracker.Contains(old_capture_window))
+ old_capture_window = nullptr;
+ }
if (capture_delegate_ != old_capture_delegate) {
if (old_capture_delegate)
diff --git a/chromium/ui/wm/core/capture_controller.h b/chromium/ui/wm/core/capture_controller.h
index 358674ef13d..3be249ac1cd 100644
--- a/chromium/ui/wm/core/capture_controller.h
+++ b/chromium/ui/wm/core/capture_controller.h
@@ -7,11 +7,11 @@
#include <map>
+#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "ui/aura/client/capture_client.h"
#include "ui/aura/window_observer.h"
-#include "ui/wm/core/wm_core_export.h"
namespace aura {
namespace client {
@@ -22,7 +22,8 @@ class CaptureDelegate;
namespace wm {
// Internal CaptureClient implementation. See ScopedCaptureClient for details.
-class WM_CORE_EXPORT CaptureController : public aura::client::CaptureClient {
+class COMPONENT_EXPORT(UI_WM) CaptureController
+ : public aura::client::CaptureClient {
public:
CaptureController();
@@ -74,9 +75,10 @@ class WM_CORE_EXPORT CaptureController : public aura::client::CaptureClient {
// ScopedCaptureClient is responsible for creating a CaptureClient for a
// RootWindow. Specifically it creates a single CaptureController that is shared
// among all ScopedCaptureClients and adds the RootWindow to it.
-class WM_CORE_EXPORT ScopedCaptureClient : public aura::WindowObserver {
+class COMPONENT_EXPORT(UI_WM) ScopedCaptureClient
+ : public aura::WindowObserver {
public:
- class WM_CORE_EXPORT TestApi {
+ class COMPONENT_EXPORT(UI_WM) TestApi {
public:
explicit TestApi(ScopedCaptureClient* client) : client_(client) {}
diff --git a/chromium/ui/wm/core/capture_controller_unittest.cc b/chromium/ui/wm/core/capture_controller_unittest.cc
index 05d653f4a00..94b330b9f4a 100644
--- a/chromium/ui/wm/core/capture_controller_unittest.cc
+++ b/chromium/ui/wm/core/capture_controller_unittest.cc
@@ -14,6 +14,7 @@
#include "ui/aura/test/test_window_delegate.h"
#include "ui/aura/window.h"
#include "ui/aura/window_event_dispatcher.h"
+#include "ui/aura/window_tracker.h"
#include "ui/events/event.h"
#include "ui/events/event_utils.h"
#include "ui/events/test/event_generator.h"
@@ -28,26 +29,35 @@ namespace {
// has been acquired.
class TestCaptureDelegate : public aura::client::CaptureDelegate {
public:
- TestCaptureDelegate() : has_capture_(false) {}
+ TestCaptureDelegate() = default;
TestCaptureDelegate(const TestCaptureDelegate&) = delete;
TestCaptureDelegate& operator=(const TestCaptureDelegate&) = delete;
- ~TestCaptureDelegate() override {}
+ ~TestCaptureDelegate() override = default;
- bool HasNativeCapture() const {
- return has_capture_;
- }
+ bool HasNativeCapture() const { return has_capture_; }
+ aura::Window* old_capture() { return old_capture_; }
+ aura::Window* new_capture() { return new_capture_; }
+ void SetDestroyOldCapture(bool destroy) { destroy_old_capture_ = destroy; }
// aura::client::CaptureDelegate:
void UpdateCapture(aura::Window* old_capture,
- aura::Window* new_capture) override {}
+ aura::Window* new_capture) override {
+ old_capture_ = old_capture;
+ new_capture_ = new_capture;
+ if (old_capture && destroy_old_capture_)
+ delete old_capture;
+ }
void OnOtherRootGotCapture() override {}
void SetNativeCapture() override { has_capture_ = true; }
void ReleaseNativeCapture() override { has_capture_ = false; }
private:
- bool has_capture_;
+ bool has_capture_ = false;
+ aura::Window* old_capture_ = nullptr;
+ aura::Window* new_capture_ = nullptr;
+ bool destroy_old_capture_ = false;
};
} // namespace
@@ -61,26 +71,26 @@ class CaptureControllerTest : public aura::test::AuraTestBase {
void SetUp() override {
AuraTestBase::SetUp();
- capture_controller_ = std::make_unique<ScopedCaptureClient>(root_window());
+ capture_client_ = std::make_unique<ScopedCaptureClient>(root_window());
second_host_ = aura::WindowTreeHost::Create(
ui::PlatformWindowInitProperties{gfx::Rect(0, 0, 800, 600)});
second_host_->InitHost();
second_host_->window()->Show();
second_host_->SetBoundsInPixels(gfx::Rect(800, 600));
- second_capture_controller_ =
+ second_capture_client_ =
std::make_unique<ScopedCaptureClient>(second_host_->window());
}
void TearDown() override {
RunAllPendingInMessageLoop();
- second_capture_controller_.reset();
+ second_capture_client_.reset();
// Kill any active compositors before we hit the compositor shutdown paths.
second_host_.reset();
- capture_controller_.reset();
+ capture_client_.reset();
AuraTestBase::TearDown();
}
@@ -105,16 +115,17 @@ class CaptureControllerTest : public aura::test::AuraTestBase {
return CaptureController::Get()->GetCaptureWindow();
}
- std::unique_ptr<ScopedCaptureClient> capture_controller_;
+ std::unique_ptr<ScopedCaptureClient> capture_client_;
std::unique_ptr<aura::WindowTreeHost> second_host_;
- std::unique_ptr<ScopedCaptureClient> second_capture_controller_;
+ std::unique_ptr<ScopedCaptureClient> second_capture_client_;
};
// Makes sure that internal details that are set on mouse down (such as
// mouse_pressed_handler()) are cleared when another root window takes capture.
TEST_F(CaptureControllerTest, ResetMouseEventHandlerOnCapture) {
// Create a window inside the WindowEventDispatcher.
- std::unique_ptr<aura::Window> w1(CreateNormalWindow(1, root_window(), NULL));
+ std::unique_ptr<aura::Window> w1(
+ CreateNormalWindow(1, root_window(), nullptr));
// Make a synthesized mouse down event. Ensure that the WindowEventDispatcher
// will dispatch further mouse events to |w1|.
@@ -126,12 +137,12 @@ TEST_F(CaptureControllerTest, ResetMouseEventHandlerOnCapture) {
// Build a window in the second WindowEventDispatcher.
std::unique_ptr<aura::Window> w2(
- CreateNormalWindow(2, second_host_->window(), NULL));
+ CreateNormalWindow(2, second_host_->window(), nullptr));
// The act of having the second window take capture should clear out mouse
// pressed handler in the first WindowEventDispatcher.
w2->SetCapture();
- EXPECT_EQ(NULL, host()->dispatcher()->mouse_pressed_handler());
+ EXPECT_EQ(nullptr, host()->dispatcher()->mouse_pressed_handler());
}
// Makes sure that when one window gets capture, it forces the release on the
@@ -139,13 +150,14 @@ TEST_F(CaptureControllerTest, ResetMouseEventHandlerOnCapture) {
// check on Windows.
TEST_F(CaptureControllerTest, ResetOtherWindowCaptureOnCapture) {
// Create a window inside the WindowEventDispatcher.
- std::unique_ptr<aura::Window> w1(CreateNormalWindow(1, root_window(), NULL));
+ std::unique_ptr<aura::Window> w1(
+ CreateNormalWindow(1, root_window(), nullptr));
w1->SetCapture();
EXPECT_EQ(w1.get(), GetCaptureWindow());
// Build a window in the second WindowEventDispatcher and give it capture.
std::unique_ptr<aura::Window> w2(
- CreateNormalWindow(2, second_host_->window(), NULL));
+ CreateNormalWindow(2, second_host_->window(), nullptr));
w2->SetCapture();
EXPECT_EQ(w2.get(), GetCaptureWindow());
}
@@ -154,7 +166,8 @@ TEST_F(CaptureControllerTest, ResetOtherWindowCaptureOnCapture) {
// releasing capture.
TEST_F(CaptureControllerTest, TouchTargetResetOnCaptureChange) {
// Create a window inside the WindowEventDispatcher.
- std::unique_ptr<aura::Window> w1(CreateNormalWindow(1, root_window(), NULL));
+ std::unique_ptr<aura::Window> w1(
+ CreateNormalWindow(1, root_window(), nullptr));
ui::test::EventGenerator event_generator1(root_window());
event_generator1.PressTouch();
w1->SetCapture();
@@ -162,7 +175,7 @@ TEST_F(CaptureControllerTest, TouchTargetResetOnCaptureChange) {
// Build a window in the second WindowEventDispatcher and give it capture.
std::unique_ptr<aura::Window> w2(
- CreateNormalWindow(2, second_host_->window(), NULL));
+ CreateNormalWindow(2, second_host_->window(), nullptr));
w2->SetCapture();
EXPECT_EQ(w2.get(), GetCaptureWindow());
@@ -177,13 +190,14 @@ TEST_F(CaptureControllerTest, TouchTargetResetOnCaptureChange) {
// is reparented to a different root window while it has capture.
TEST_F(CaptureControllerTest, ReparentedWhileCaptured) {
std::unique_ptr<TestCaptureDelegate> delegate(new TestCaptureDelegate);
- ScopedCaptureClient::TestApi(capture_controller_.get())
+ ScopedCaptureClient::TestApi(capture_client_.get())
.SetDelegate(delegate.get());
std::unique_ptr<TestCaptureDelegate> delegate2(new TestCaptureDelegate);
- ScopedCaptureClient::TestApi(second_capture_controller_.get())
+ ScopedCaptureClient::TestApi(second_capture_client_.get())
.SetDelegate(delegate2.get());
- std::unique_ptr<aura::Window> w(CreateNormalWindow(1, root_window(), NULL));
+ std::unique_ptr<aura::Window> w(
+ CreateNormalWindow(1, root_window(), nullptr));
w->SetCapture();
EXPECT_EQ(w.get(), GetCaptureWindow());
EXPECT_TRUE(delegate->HasNativeCapture());
@@ -270,4 +284,57 @@ TEST_F(CaptureControllerTest, GestureResetWithCapture) {
DispatchEventUsingWindowDispatcher(&mouse_press);
}
+TEST_F(CaptureControllerTest, UpdateCaptureDestroysOldCaptureWindow) {
+ TestCaptureDelegate delegate;
+ ScopedCaptureClient::TestApi(capture_client_.get()).SetDelegate(&delegate);
+ TestCaptureDelegate delegate2;
+ ScopedCaptureClient::TestApi(second_capture_client_.get())
+ .SetDelegate(&delegate2);
+
+ // Since delegate iteration order is not deterministic, use this to assert
+ // that the two scenarios below have opposite order.
+ aura::Window* first_old_capture = nullptr;
+
+ {
+ // Create a window inside the WindowEventDispatcher.
+ std::unique_ptr<aura::Window> capture_window(
+ CreateNormalWindow(1, root_window(), nullptr));
+ ui::test::EventGenerator event_generator(root_window());
+ event_generator.PressTouch();
+ capture_window->SetCapture();
+
+ delegate.SetDestroyOldCapture(true);
+ delegate2.SetDestroyOldCapture(false);
+
+ aura::WindowTracker tracker({capture_window.get()});
+ CaptureController::Get()->SetCapture(nullptr);
+ EXPECT_EQ(delegate.old_capture(), capture_window.get());
+ first_old_capture = delegate2.old_capture();
+ EXPECT_FALSE(tracker.Contains(capture_window.get()));
+ if (!tracker.Contains(capture_window.get()))
+ capture_window.release();
+ }
+
+ {
+ // Create a window inside the WindowEventDispatcher.
+ std::unique_ptr<aura::Window> capture_window(
+ CreateNormalWindow(1, root_window(), nullptr));
+ ui::test::EventGenerator event_generator(root_window());
+ event_generator.PressTouch();
+ capture_window->SetCapture();
+
+ // Change order to account for map traversal order.
+ delegate.SetDestroyOldCapture(false);
+ delegate2.SetDestroyOldCapture(true);
+
+ aura::WindowTracker tracker({capture_window.get()});
+ CaptureController::Get()->SetCapture(nullptr);
+ EXPECT_NE(delegate.old_capture(), first_old_capture);
+ EXPECT_EQ(delegate2.old_capture(), capture_window.get());
+ EXPECT_FALSE(tracker.Contains(capture_window.get()));
+ if (!tracker.Contains(capture_window.get()))
+ capture_window.release();
+ }
+}
+
} // namespace wm
diff --git a/chromium/ui/wm/core/compound_event_filter.h b/chromium/ui/wm/core/compound_event_filter.h
index b0f127e42b1..22a531b2555 100644
--- a/chromium/ui/wm/core/compound_event_filter.h
+++ b/chromium/ui/wm/core/compound_event_filter.h
@@ -5,12 +5,12 @@
#ifndef UI_WM_CORE_COMPOUND_EVENT_FILTER_H_
#define UI_WM_CORE_COMPOUND_EVENT_FILTER_H_
+#include "base/component_export.h"
#include "base/observer_list.h"
#include "base/strings/string_piece.h"
#include "ui/events/event.h"
#include "ui/events/event_handler.h"
#include "ui/gfx/native_widget_types.h"
-#include "ui/wm/core/wm_core_export.h"
namespace ui {
class GestureEvent;
@@ -31,7 +31,7 @@ namespace wm {
// consumed by any of those filters. If an event is consumed by a filter, the
// rest of the filter(s) and CompoundEventFilter will not see the consumed
// event.
-class WM_CORE_EXPORT CompoundEventFilter : public ui::EventHandler {
+class COMPONENT_EXPORT(UI_WM) CompoundEventFilter : public ui::EventHandler {
public:
CompoundEventFilter();
diff --git a/chromium/ui/wm/core/coordinate_conversion.h b/chromium/ui/wm/core/coordinate_conversion.h
index e719999dc3c..363c6f88c65 100644
--- a/chromium/ui/wm/core/coordinate_conversion.h
+++ b/chromium/ui/wm/core/coordinate_conversion.h
@@ -5,7 +5,7 @@
#ifndef UI_WM_CORE_COORDINATE_CONVERSION_H_
#define UI_WM_CORE_COORDINATE_CONVERSION_H_
-#include "ui/wm/core/wm_core_export.h"
+#include "base/component_export.h"
namespace aura {
class Window;
@@ -23,37 +23,41 @@ namespace wm {
// Converts the |point| from a given |window|'s coordinates into the screen
// coordinates.
// TODO: Remove the integer versions of these functions. See crbug.com/773331.
-WM_CORE_EXPORT void ConvertPointToScreen(const aura::Window* window,
- gfx::Point* point);
+COMPONENT_EXPORT(UI_WM)
+void ConvertPointToScreen(const aura::Window* window, gfx::Point* point);
-WM_CORE_EXPORT void ConvertPointToScreen(const aura::Window* window,
- gfx::PointF* point);
+COMPONENT_EXPORT(UI_WM)
+void ConvertPointToScreen(const aura::Window* window, gfx::PointF* point);
// Converts the |point| from the screen coordinates to a given |window|'s
// coordinates.
-WM_CORE_EXPORT void ConvertPointFromScreen(const aura::Window* window,
- gfx::Point* point_in_screen);
+COMPONENT_EXPORT(UI_WM)
+void ConvertPointFromScreen(const aura::Window* window,
+ gfx::Point* point_in_screen);
-WM_CORE_EXPORT void ConvertPointFromScreen(const aura::Window* window,
- gfx::PointF* point_in_screen);
+COMPONENT_EXPORT(UI_WM)
+void ConvertPointFromScreen(const aura::Window* window,
+ gfx::PointF* point_in_screen);
// Converts |rect| from |window|'s coordinates to the virtual screen
// coordinates.
// TODO: Change the Rect versions to TranslateRect(To|From)Screen since they
// do not handle size changes.
-WM_CORE_EXPORT void ConvertRectToScreen(const aura::Window* window,
- gfx::Rect* rect);
+COMPONENT_EXPORT(UI_WM)
+void ConvertRectToScreen(const aura::Window* window, gfx::Rect* rect);
-WM_CORE_EXPORT void TranslateRectToScreen(const aura::Window* window,
- gfx::RectF* rect);
+COMPONENT_EXPORT(UI_WM)
+void TranslateRectToScreen(const aura::Window* window, gfx::RectF* rect);
// Converts |rect| from virtual screen coordinates to the |window|'s
// coordinates.
-WM_CORE_EXPORT void ConvertRectFromScreen(const aura::Window* window,
- gfx::Rect* rect_in_screen);
+COMPONENT_EXPORT(UI_WM)
+void ConvertRectFromScreen(const aura::Window* window,
+ gfx::Rect* rect_in_screen);
-WM_CORE_EXPORT void TranslateRectFromScreen(const aura::Window* window,
- gfx::RectF* rect_in_screen);
+COMPONENT_EXPORT(UI_WM)
+void TranslateRectFromScreen(const aura::Window* window,
+ gfx::RectF* rect_in_screen);
} // namespace wm
diff --git a/chromium/ui/aura/cursor/cursor_loader.cc b/chromium/ui/wm/core/cursor_loader.cc
index 60426ff77bf..0ff466a17e9 100644
--- a/chromium/ui/aura/cursor/cursor_loader.cc
+++ b/chromium/ui/wm/core/cursor_loader.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 "ui/aura/cursor/cursor_loader.h"
+#include "ui/wm/core/cursor_loader.h"
#include <map>
#include <vector>
@@ -10,16 +10,16 @@
#include "base/check.h"
#include "base/memory/scoped_refptr.h"
#include "base/time/time.h"
-#include "ui/aura/cursor/cursor_util.h"
-#include "ui/aura/cursor/cursors_aura.h"
#include "ui/base/cursor/cursor.h"
#include "ui/base/cursor/cursor_factory.h"
#include "ui/base/cursor/cursor_size.h"
#include "ui/base/cursor/mojom/cursor_type.mojom.h"
#include "ui/base/cursor/platform_cursor.h"
#include "ui/gfx/geometry/point.h"
+#include "ui/wm/core/cursor_util.h"
+#include "ui/wm/core/cursors_aura.h"
-namespace aura {
+namespace wm {
namespace {
@@ -141,4 +141,4 @@ scoped_refptr<ui::PlatformCursor> CursorLoader::LoadCursorFromAsset(
return nullptr;
}
-} // namespace aura
+} // namespace wm
diff --git a/chromium/ui/aura/cursor/cursor_loader.h b/chromium/ui/wm/core/cursor_loader.h
index 91a71508017..8cdb35a8fba 100644
--- a/chromium/ui/aura/cursor/cursor_loader.h
+++ b/chromium/ui/wm/core/cursor_loader.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_AURA_CURSOR_CURSOR_LOADER_H_
-#define UI_AURA_CURSOR_CURSOR_LOADER_H_
+#ifndef UI_WM_CORE_CURSOR_LOADER_H_
+#define UI_WM_CORE_CURSOR_LOADER_H_
#include <map>
#include <memory>
@@ -25,10 +25,9 @@ namespace ui {
class PlatformCursor;
}
-namespace aura {
+namespace wm {
-class COMPONENT_EXPORT(UI_AURA_CURSOR) CursorLoader
- : public ui::CursorFactoryObserver {
+class COMPONENT_EXPORT(UI_WM) CursorLoader : public ui::CursorFactoryObserver {
public:
explicit CursorLoader(bool use_platform_cursors = true);
CursorLoader(const CursorLoader&) = delete;
@@ -84,6 +83,6 @@ class COMPONENT_EXPORT(UI_AURA_CURSOR) CursorLoader
ui::CursorSize size_ = ui::CursorSize::kNormal;
};
-} // namespace aura
+} // namespace wm
-#endif // UI_AURA_CURSOR_CURSOR_LOADER_H_
+#endif // UI_WM_CORE_CURSOR_LOADER_H_
diff --git a/chromium/ui/aura/cursor/cursor_loader_unittest.cc b/chromium/ui/wm/core/cursor_loader_unittest.cc
index 64529c0033d..ab833f3f4ba 100644
--- a/chromium/ui/aura/cursor/cursor_loader_unittest.cc
+++ b/chromium/ui/wm/core/cursor_loader_unittest.cc
@@ -2,30 +2,26 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/aura/cursor/cursor_loader.h"
+#include "ui/wm/core/cursor_loader.h"
-#include "base/files/file_path.h"
#include "base/memory/scoped_refptr.h"
-#include "base/path_service.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/aura/cursor/cursor_lookup.h"
-#include "ui/aura/cursor/cursors_aura.h"
#include "ui/aura/test/aura_test_base.h"
#include "ui/base/cursor/cursor.h"
#include "ui/base/cursor/cursor_factory.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
#include "ui/base/cursor/platform_cursor.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/base/ui_base_paths.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/skia_util.h"
+#include "ui/wm/core/cursor_lookup.h"
+#include "ui/wm/core/cursors_aura.h"
-namespace aura {
+namespace wm {
namespace {
-using CursorLoaderTest = test::AuraTestBase;
+using CursorLoaderTest = ::aura::test::AuraTestBase;
using ::ui::mojom::CursorType;
SkBitmap GetTestBitmap() {
@@ -50,11 +46,6 @@ TEST_F(CursorLoaderTest, InvisibleCursor) {
// from cursor_lookup.h, that will be replaced by a method of the same name in
// CursorLoader.
TEST_F(CursorLoaderTest, GetCursorData) {
- ui::RegisterPathProvider();
- base::FilePath ui_test_pak_path =
- base::PathService::CheckedGet(ui::UI_TEST_PAK);
- ui::ResourceBundle::InitSharedInstanceWithPakPath(ui_test_pak_path);
-
const ui::Cursor invisible_cursor = CursorType::kNone;
EXPECT_TRUE(GetCursorBitmap(invisible_cursor).isNull());
EXPECT_TRUE(GetCursorHotspot(invisible_cursor).IsOrigin());
@@ -76,4 +67,4 @@ TEST_F(CursorLoaderTest, GetCursorData) {
EXPECT_EQ(GetCursorHotspot(custom_cursor), kHotspot);
}
-} // namespace aura
+} // namespace wm
diff --git a/chromium/ui/aura/cursor/cursor_lookup.cc b/chromium/ui/wm/core/cursor_lookup.cc
index e8db14fd69d..f7c6646dd5f 100644
--- a/chromium/ui/aura/cursor/cursor_lookup.cc
+++ b/chromium/ui/wm/core/cursor_lookup.cc
@@ -2,15 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/aura/cursor/cursor_lookup.h"
+#include "ui/wm/core/cursor_lookup.h"
#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/aura/cursor/cursors_aura.h"
#include "ui/base/cursor/cursor.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
#include "ui/gfx/geometry/point.h"
+#include "ui/wm/core/cursors_aura.h"
-namespace aura {
+namespace wm {
SkBitmap GetCursorBitmap(const ui::Cursor& cursor) {
if (cursor.type() == ui::mojom::CursorType::kCustom)
@@ -24,4 +24,4 @@ gfx::Point GetCursorHotspot(const ui::Cursor& cursor) {
return GetDefaultHotspot(cursor);
}
-} // namespace aura
+} // namespace wm
diff --git a/chromium/ui/aura/cursor/cursor_lookup.h b/chromium/ui/wm/core/cursor_lookup.h
index 955e5985bca..4fdc9a5372d 100644
--- a/chromium/ui/aura/cursor/cursor_lookup.h
+++ b/chromium/ui/wm/core/cursor_lookup.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_AURA_CURSOR_CURSOR_LOOKUP_H_
-#define UI_AURA_CURSOR_CURSOR_LOOKUP_H_
+#ifndef UI_WM_CORE_CURSOR_LOOKUP_H_
+#define UI_WM_CORE_CURSOR_LOOKUP_H_
#include "base/component_export.h"
@@ -17,14 +17,14 @@ namespace ui {
class Cursor;
}
-namespace aura {
+namespace wm {
-COMPONENT_EXPORT(UI_AURA_CURSOR)
+COMPONENT_EXPORT(UI_WM)
SkBitmap GetCursorBitmap(const ui::Cursor& cursor);
-COMPONENT_EXPORT(UI_AURA_CURSOR)
+COMPONENT_EXPORT(UI_WM)
gfx::Point GetCursorHotspot(const ui::Cursor& cursor);
-} // namespace aura
+} // namespace wm
-#endif // UI_AURA_CURSOR_CURSOR_LOOKUP_H_
+#endif // UI_WM_CORE_CURSOR_LOOKUP_H_
diff --git a/chromium/ui/wm/core/cursor_manager.h b/chromium/ui/wm/core/cursor_manager.h
index 011f2f04d67..3498836f551 100644
--- a/chromium/ui/wm/core/cursor_manager.h
+++ b/chromium/ui/wm/core/cursor_manager.h
@@ -7,13 +7,13 @@
#include <memory>
+#include "base/component_export.h"
#include "base/observer_list.h"
#include "ui/aura/client/cursor_client.h"
#include "ui/display/display.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/wm/core/native_cursor_manager_delegate.h"
-#include "ui/wm/core/wm_core_export.h"
namespace ui {
class KeyEvent;
@@ -32,8 +32,9 @@ class NativeCursorManager;
// requests to queue any further changes until a later time. It sends changes
// to the NativeCursorManager, which communicates back to us when these changes
// were made through the NativeCursorManagerDelegate interface.
-class WM_CORE_EXPORT CursorManager : public aura::client::CursorClient,
- public NativeCursorManagerDelegate {
+class COMPONENT_EXPORT(UI_WM) CursorManager
+ : public aura::client::CursorClient,
+ public NativeCursorManagerDelegate {
public:
explicit CursorManager(std::unique_ptr<NativeCursorManager> delegate);
diff --git a/chromium/ui/aura/cursor/cursor_util.cc b/chromium/ui/wm/core/cursor_util.cc
index c3660ee9afd..5f02a8d4625 100644
--- a/chromium/ui/aura/cursor/cursor_util.cc
+++ b/chromium/ui/wm/core/cursor_util.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 "ui/aura/cursor/cursor_util.h"
+#include "ui/wm/core/cursor_util.h"
#include "base/check_op.h"
#include "base/notreached.h"
@@ -17,7 +17,7 @@
#include "ui/gfx/image/image_skia_rep.h"
#include "ui/gfx/skbitmap_operations.h"
-namespace aura {
+namespace wm {
namespace {
@@ -160,4 +160,4 @@ void GetAnimatedCursorBitmaps(int resource_id,
}
}
-} // namespace aura
+} // namespace wm
diff --git a/chromium/ui/aura/cursor/cursor_util.h b/chromium/ui/wm/core/cursor_util.h
index 6d14a7ced12..5bf8350642f 100644
--- a/chromium/ui/aura/cursor/cursor_util.h
+++ b/chromium/ui/wm/core/cursor_util.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_AURA_CURSOR_CURSOR_UTIL_H_
-#define UI_AURA_CURSOR_CURSOR_UTIL_H_
+#ifndef UI_WM_CORE_CURSOR_UTIL_H_
+#define UI_WM_CORE_CURSOR_UTIL_H_
#include <vector>
@@ -16,12 +16,12 @@ namespace gfx {
class Point;
}
-namespace aura {
+namespace wm {
// Scale and rotate the cursor's bitmap and hotpoint.
// |bitmap_in_out| and |hotpoint_in_out| are used as
// both input and output.
-COMPONENT_EXPORT(UI_AURA_CURSOR)
+COMPONENT_EXPORT(UI_WM)
void ScaleAndRotateCursorBitmapAndHotpoint(float scale,
display::Display::Rotation rotation,
SkBitmap* bitmap_in_out,
@@ -39,6 +39,6 @@ void GetAnimatedCursorBitmaps(int resource_id,
gfx::Point* hotspot,
std::vector<SkBitmap>* bitmaps);
-} // namespace aura
+} // namespace wm
-#endif // UI_AURA_CURSOR_CURSOR_UTIL_H_
+#endif // UI_WM_CORE_CURSOR_UTIL_H_
diff --git a/chromium/ui/aura/cursor/cursor_util_unittest.cc b/chromium/ui/wm/core/cursor_util_unittest.cc
index 26d1165e27d..02f0241c47b 100644
--- a/chromium/ui/aura/cursor/cursor_util_unittest.cc
+++ b/chromium/ui/wm/core/cursor_util_unittest.cc
@@ -2,13 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/aura/cursor/cursor_util.h"
+#include "ui/wm/core/cursor_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/geometry/point.h"
-namespace aura {
+namespace wm {
namespace {
// Parameterized test for cursor bitmaps with premultiplied and unpremultiplied
@@ -67,4 +67,4 @@ TEST_P(CursorUtilTest, ScaleAndRotate) {
INSTANTIATE_TEST_SUITE_P(All, CursorUtilTest, testing::Bool());
} // namespace
-} // namespace aura
+} // namespace wm
diff --git a/chromium/ui/aura/cursor/cursors_aura.cc b/chromium/ui/wm/core/cursors_aura.cc
index 033fb431b8c..94c9c897937 100644
--- a/chromium/ui/aura/cursor/cursors_aura.cc
+++ b/chromium/ui/wm/core/cursors_aura.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 "ui/aura/cursor/cursors_aura.h"
+#include "ui/wm/core/cursors_aura.h"
#include <stddef.h>
@@ -18,12 +18,12 @@
#include "ui/resources/grit/ui_resources.h"
#if BUILDFLAG(IS_WIN)
-#include "ui/aura/cursor/cursor_loader.h"
#include "ui/base/win/win_cursor.h"
#include "ui/gfx/icon_util.h"
+#include "ui/wm/core/cursor_loader.h"
#endif
-namespace aura {
+namespace wm {
namespace {
@@ -332,7 +332,7 @@ bool GetCursorDataFor(ui::CursorSize cursor_size,
SkBitmap GetDefaultBitmap(const ui::Cursor& cursor) {
#if BUILDFLAG(IS_WIN)
ui::Cursor cursor_copy = cursor;
- aura::CursorLoader cursor_loader;
+ CursorLoader cursor_loader;
cursor_loader.SetPlatformCursor(&cursor_copy);
return IconUtil::CreateSkBitmapFromHICON(
ui::WinCursor::FromPlatformCursor(cursor_copy.platform())->hcursor());
@@ -353,7 +353,7 @@ SkBitmap GetDefaultBitmap(const ui::Cursor& cursor) {
gfx::Point GetDefaultHotspot(const ui::Cursor& cursor) {
#if BUILDFLAG(IS_WIN)
ui::Cursor cursor_copy = cursor;
- aura::CursorLoader cursor_loader;
+ CursorLoader cursor_loader;
cursor_loader.SetPlatformCursor(&cursor_copy);
return IconUtil::GetHotSpotFromHICON(
ui::WinCursor::FromPlatformCursor(cursor_copy.platform())->hcursor());
@@ -368,4 +368,4 @@ gfx::Point GetDefaultHotspot(const ui::Cursor& cursor) {
#endif
}
-} // namespace aura
+} // namespace wm
diff --git a/chromium/ui/aura/cursor/cursors_aura.h b/chromium/ui/wm/core/cursors_aura.h
index 3a13dcdc887..483dad32e89 100644
--- a/chromium/ui/aura/cursor/cursors_aura.h
+++ b/chromium/ui/wm/core/cursors_aura.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_AURA_CURSOR_CURSORS_AURA_H_
-#define UI_AURA_CURSOR_CURSORS_AURA_H_
+#ifndef UI_WM_CORE_CURSORS_AURA_H_
+#define UI_WM_CORE_CURSORS_AURA_H_
#include "base/component_export.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-forward.h"
@@ -19,25 +19,25 @@ class Cursor;
enum class CursorSize;
} // namespace ui
-namespace aura {
+namespace wm {
// Returns data about |id|, where id is a cursor constant like
// ui::mojom::CursorType::kHelp. The IDR will be placed in |resource_id| and
// the hotspots for the different DPIs will be placed in |hot_1x| and
// |hot_2x|. Returns false if |id| is invalid.
-COMPONENT_EXPORT(UI_AURA_CURSOR)
+COMPONENT_EXPORT(UI_WM)
bool GetCursorDataFor(ui::CursorSize cursor_size,
ui::mojom::CursorType id,
float scale_factor,
int* resource_id,
gfx::Point* point);
-COMPONENT_EXPORT(UI_AURA_CURSOR)
+COMPONENT_EXPORT(UI_WM)
SkBitmap GetDefaultBitmap(const ui::Cursor& cursor);
-COMPONENT_EXPORT(UI_AURA_CURSOR)
+COMPONENT_EXPORT(UI_WM)
gfx::Point GetDefaultHotspot(const ui::Cursor& cursor);
-} // namespace aura
+} // namespace wm
-#endif // UI_AURA_CURSOR_CURSORS_AURA_H_
+#endif // UI_WM_CORE_CURSORS_AURA_H_
diff --git a/chromium/ui/wm/core/default_activation_client.h b/chromium/ui/wm/core/default_activation_client.h
index 2ddeb02adb9..22434e29811 100644
--- a/chromium/ui/wm/core/default_activation_client.h
+++ b/chromium/ui/wm/core/default_activation_client.h
@@ -7,10 +7,10 @@
#include <vector>
+#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "ui/aura/window_observer.h"
-#include "ui/wm/core/wm_core_export.h"
#include "ui/wm/public/activation_change_observer.h"
#include "ui/wm/public/activation_client.h"
@@ -22,8 +22,9 @@ class ActivationChangeObserver;
// that just need basic behavior (e.g. activate windows whenever requested,
// restack windows at the top when they're activated, etc.). This object deletes
// itself when the root window it is associated with is destroyed.
-class WM_CORE_EXPORT DefaultActivationClient : public ActivationClient,
- public aura::WindowObserver {
+class COMPONENT_EXPORT(UI_WM) DefaultActivationClient
+ : public ActivationClient,
+ public aura::WindowObserver {
public:
explicit DefaultActivationClient(aura::Window* root_window);
diff --git a/chromium/ui/wm/core/default_screen_position_client.h b/chromium/ui/wm/core/default_screen_position_client.h
index 5d643b570ea..a867ff49756 100644
--- a/chromium/ui/wm/core/default_screen_position_client.h
+++ b/chromium/ui/wm/core/default_screen_position_client.h
@@ -5,15 +5,15 @@
#ifndef UI_WM_CORE_DEFAULT_SCREEN_POSITION_CLIENT_H_
#define UI_WM_CORE_DEFAULT_SCREEN_POSITION_CLIENT_H_
+#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "ui/aura/client/screen_position_client.h"
-#include "ui/wm/core/wm_core_export.h"
namespace wm {
// Client that always offsets by the toplevel RootWindow of the passed
// in child NativeWidgetAura.
-class WM_CORE_EXPORT DefaultScreenPositionClient
+class COMPONENT_EXPORT(UI_WM) DefaultScreenPositionClient
: public aura::client::ScreenPositionClient {
public:
explicit DefaultScreenPositionClient(aura::Window* root_window);
diff --git a/chromium/ui/wm/core/easy_resize_window_targeter.h b/chromium/ui/wm/core/easy_resize_window_targeter.h
index 111a0def46e..e21fb2aea1e 100644
--- a/chromium/ui/wm/core/easy_resize_window_targeter.h
+++ b/chromium/ui/wm/core/easy_resize_window_targeter.h
@@ -5,8 +5,8 @@
#ifndef UI_WM_CORE_EASY_RESIZE_WINDOW_TARGETER_H_
#define UI_WM_CORE_EASY_RESIZE_WINDOW_TARGETER_H_
+#include "base/component_export.h"
#include "ui/aura/window_targeter.h"
-#include "ui/wm/core/wm_core_export.h"
namespace gfx {
class Insets;
@@ -19,7 +19,8 @@ namespace wm {
// windows (top level Widgets that are resizable) to outside their bounds. For
// Ash, this correlates to ash::kResizeOutsideBoundsSize. For the interior
// resize area, see ash::InstallResizeHandleWindowTargeterForWindow().
-class WM_CORE_EXPORT EasyResizeWindowTargeter : public aura::WindowTargeter {
+class COMPONENT_EXPORT(UI_WM) EasyResizeWindowTargeter
+ : public aura::WindowTargeter {
public:
// NOTE: the insets must be negative.
EasyResizeWindowTargeter(const gfx::Insets& mouse_extend,
diff --git a/chromium/ui/wm/core/focus_controller.h b/chromium/ui/wm/core/focus_controller.h
index 1caeba49084..8e08c4cdb3e 100644
--- a/chromium/ui/wm/core/focus_controller.h
+++ b/chromium/ui/wm/core/focus_controller.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "base/scoped_multi_source_observation.h"
@@ -15,7 +16,6 @@
#include "ui/aura/client/focus_client.h"
#include "ui/aura/window_observer.h"
#include "ui/events/event_handler.h"
-#include "ui/wm/core/wm_core_export.h"
#include "ui/wm/public/activation_change_observer.h"
#include "ui/wm/public/activation_client.h"
@@ -41,10 +41,11 @@ class FocusRules;
// . ActivationReason::WINDOW_DISPOSITION_CHANGED: Window disposition changes
// (implemented here in aura::WindowObserver). (The FocusController registers
// itself as an observer of the active and focused windows).
-class WM_CORE_EXPORT FocusController : public ActivationClient,
- public aura::client::FocusClient,
- public ui::EventHandler,
- public aura::WindowObserver {
+class COMPONENT_EXPORT(UI_WM) FocusController : public ActivationClient,
+ public aura::client::FocusClient
+ ,
+ public ui::EventHandler,
+ public aura::WindowObserver {
public:
// |rules| cannot be NULL.
explicit FocusController(FocusRules* rules);
diff --git a/chromium/ui/wm/core/focus_controller_unittest.cc b/chromium/ui/wm/core/focus_controller_unittest.cc
index f6928187e3b..1bece4960ab 100644
--- a/chromium/ui/wm/core/focus_controller_unittest.cc
+++ b/chromium/ui/wm/core/focus_controller_unittest.cc
@@ -281,7 +281,8 @@ class DeleteOnActivationChangeObserver : public ActivationChangeObserver,
private:
raw_ptr<aura::Window> root_;
- raw_ptr<aura::Window> window_;
+ // TODO(crbug.com/1298696): Breaks wm_unittests.
+ raw_ptr<aura::Window, DegradeToNoOpWhenMTE> window_;
const bool delete_on_activating_;
const bool delete_window_losing_active_;
bool did_delete_;
@@ -322,7 +323,8 @@ class DeleteOnLoseFocusChangeObserver
private:
raw_ptr<aura::Window> root_;
- raw_ptr<aura::Window> window_;
+ // TODO(crbug.com/1298696): Breaks wm_unittests.
+ raw_ptr<aura::Window, DegradeToNoOpWhenMTE> window_;
bool did_delete_;
};
@@ -370,7 +372,8 @@ class ScopedTargetFocusNotificationObserver : public FocusNotificationObserver {
}
private:
- raw_ptr<aura::Window> target_;
+ // TODO(crbug.com/1298696): Breaks wm_unittests.
+ raw_ptr<aura::Window, DegradeToNoOpWhenMTE> target_;
aura::WindowTracker tracker_;
};
diff --git a/chromium/ui/wm/core/focus_rules.h b/chromium/ui/wm/core/focus_rules.h
index 44644c9c9a6..a30a70e9f5f 100644
--- a/chromium/ui/wm/core/focus_rules.h
+++ b/chromium/ui/wm/core/focus_rules.h
@@ -5,7 +5,7 @@
#ifndef UI_WM_CORE_FOCUS_RULES_H_
#define UI_WM_CORE_FOCUS_RULES_H_
-#include "ui/wm/core/wm_core_export.h"
+#include "base/component_export.h"
namespace aura {
class Window;
@@ -19,7 +19,7 @@ namespace wm {
// Implemented by an object that establishes the rules about what can be
// focused or activated.
-class WM_CORE_EXPORT FocusRules {
+class COMPONENT_EXPORT(UI_WM) FocusRules {
public:
virtual ~FocusRules() {}
diff --git a/chromium/ui/wm/core/ime_util_chromeos.h b/chromium/ui/wm/core/ime_util_chromeos.h
index eb5faae96f7..d139661ccaa 100644
--- a/chromium/ui/wm/core/ime_util_chromeos.h
+++ b/chromium/ui/wm/core/ime_util_chromeos.h
@@ -5,8 +5,8 @@
#ifndef UI_WM_CORE_IME_UTIL_CHROMEOS_H_
#define UI_WM_CORE_IME_UTIL_CHROMEOS_H_
+#include "base/component_export.h"
#include "ui/aura/window.h"
-#include "ui/wm/core/wm_core_export.h"
namespace gfx {
class Rect;
@@ -16,16 +16,18 @@ namespace wm {
// A property key to store the restore bounds for a window when moved by the
// virtual keyboard.
-WM_CORE_EXPORT extern const aura::WindowProperty<gfx::Rect*>* const
+COMPONENT_EXPORT(UI_WM)
+extern const aura::WindowProperty<gfx::Rect*>* const
kVirtualKeyboardRestoreBoundsKey;
// Moves |window| to ensure it does not intersect with |rect_in_screen|.
-WM_CORE_EXPORT void EnsureWindowNotInRect(aura::Window* window,
- const gfx::Rect& rect_in_screen);
+COMPONENT_EXPORT(UI_WM)
+void EnsureWindowNotInRect(aura::Window* window,
+ const gfx::Rect& rect_in_screen);
// Restores the window bounds when input client loses the focus on the window.
-WM_CORE_EXPORT void RestoreWindowBoundsOnClientFocusLost(
- aura::Window* top_level_window);
+COMPONENT_EXPORT(UI_WM)
+void RestoreWindowBoundsOnClientFocusLost(aura::Window* top_level_window);
} // namespace wm
diff --git a/chromium/ui/wm/core/native_cursor_manager.h b/chromium/ui/wm/core/native_cursor_manager.h
index ae427fe95cc..28aa6373731 100644
--- a/chromium/ui/wm/core/native_cursor_manager.h
+++ b/chromium/ui/wm/core/native_cursor_manager.h
@@ -5,8 +5,8 @@
#ifndef UI_WM_CORE_NATIVE_CURSOR_MANAGER_H_
#define UI_WM_CORE_NATIVE_CURSOR_MANAGER_H_
+#include "base/component_export.h"
#include "ui/wm/core/native_cursor_manager_delegate.h"
-#include "ui/wm/core/wm_core_export.h"
namespace display {
class Display;
@@ -22,7 +22,7 @@ namespace wm {
// requested changes to cursor state. When requested, implementer should tell
// the CursorManager of any actual state changes performed through the
// delegate.
-class WM_CORE_EXPORT NativeCursorManager {
+class COMPONENT_EXPORT(UI_WM) NativeCursorManager {
public:
virtual ~NativeCursorManager() {}
diff --git a/chromium/ui/wm/core/native_cursor_manager_delegate.h b/chromium/ui/wm/core/native_cursor_manager_delegate.h
index d1a5540fde3..4dfea286d29 100644
--- a/chromium/ui/wm/core/native_cursor_manager_delegate.h
+++ b/chromium/ui/wm/core/native_cursor_manager_delegate.h
@@ -5,8 +5,8 @@
#ifndef UI_WM_CORE_NATIVE_CURSOR_MANAGER_DELEGATE_H_
#define UI_WM_CORE_NATIVE_CURSOR_MANAGER_DELEGATE_H_
+#include "base/component_export.h"
#include "ui/gfx/native_widget_types.h"
-#include "ui/wm/core/wm_core_export.h"
namespace ui {
enum class CursorSize;
@@ -17,7 +17,7 @@ namespace wm {
// The non-public interface that CursorManager exposes to its users. This
// gives accessors to all the current state, and mutators to all the current
// state.
-class WM_CORE_EXPORT NativeCursorManagerDelegate {
+class COMPONENT_EXPORT(UI_WM) NativeCursorManagerDelegate {
public:
virtual ~NativeCursorManagerDelegate() {}
diff --git a/chromium/ui/wm/core/shadow_controller.h b/chromium/ui/wm/core/shadow_controller.h
index 7584634aff9..49cb4b3b9bb 100644
--- a/chromium/ui/wm/core/shadow_controller.h
+++ b/chromium/ui/wm/core/shadow_controller.h
@@ -7,9 +7,9 @@
#include <map>
+#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
-#include "ui/wm/core/wm_core_export.h"
#include "ui/wm/public/activation_change_observer.h"
namespace aura {
@@ -30,7 +30,8 @@ class ShadowControllerDelegate;
// shadows as needed. ShadowController itself is light weight and per
// ActivationClient. ShadowController delegates to its implementation class,
// which observes all window creation.
-class WM_CORE_EXPORT ShadowController : public ActivationChangeObserver {
+class COMPONENT_EXPORT(UI_WM) ShadowController
+ : public ActivationChangeObserver {
public:
// Returns the shadow for the |window|, or NULL if no shadow exists.
static ui::Shadow* GetShadowForWindow(aura::Window* window);
diff --git a/chromium/ui/wm/core/shadow_controller_delegate.h b/chromium/ui/wm/core/shadow_controller_delegate.h
index e0ce6e236fe..b64eb1bb087 100644
--- a/chromium/ui/wm/core/shadow_controller_delegate.h
+++ b/chromium/ui/wm/core/shadow_controller_delegate.h
@@ -5,7 +5,7 @@
#ifndef UI_WM_CORE_SHADOW_CONTROLLER_DELEGATE_H_
#define UI_WM_CORE_SHADOW_CONTROLLER_DELEGATE_H_
-#include "ui/wm/core/wm_core_export.h"
+#include "base/component_export.h"
namespace aura {
class Window;
@@ -15,7 +15,7 @@ namespace wm {
// ShadowControllerDelegate allows a user to modify a shadow on certain windows
// differently from the normal use case.
-class WM_CORE_EXPORT ShadowControllerDelegate {
+class COMPONENT_EXPORT(UI_WM) ShadowControllerDelegate {
public:
ShadowControllerDelegate() = default;
virtual ~ShadowControllerDelegate() = default;
@@ -27,4 +27,4 @@ class WM_CORE_EXPORT ShadowControllerDelegate {
} // namespace wm
-#endif // UI_WM_CORE_SHADOW_CONTROLLER_DELEGATE_H_ \ No newline at end of file
+#endif // UI_WM_CORE_SHADOW_CONTROLLER_DELEGATE_H_
diff --git a/chromium/ui/wm/core/shadow_types.h b/chromium/ui/wm/core/shadow_types.h
index d57dda9ab66..7ec0e3b0646 100644
--- a/chromium/ui/wm/core/shadow_types.h
+++ b/chromium/ui/wm/core/shadow_types.h
@@ -5,9 +5,9 @@
#ifndef UI_WM_CORE_SHADOW_TYPES_H_
#define UI_WM_CORE_SHADOW_TYPES_H_
+#include "base/component_export.h"
#include "build/chromeos_buildflags.h"
#include "ui/aura/window.h"
-#include "ui/wm/core/wm_core_export.h"
namespace wm {
@@ -31,20 +31,22 @@ constexpr int kShadowElevationInactiveWindow = 8;
#endif
constexpr int kShadowElevationActiveWindow = 24;
-WM_CORE_EXPORT void SetShadowElevation(aura::Window* window, int elevation);
+COMPONENT_EXPORT(UI_WM)
+void SetShadowElevation(aura::Window* window, int elevation);
// Returns the default shadow elevaltion value for |window|.
-WM_CORE_EXPORT int GetDefaultShadowElevationForWindow(
- const aura::Window* window);
+COMPONENT_EXPORT(UI_WM)
+int GetDefaultShadowElevationForWindow(const aura::Window* window);
// Returns the shadow elevation property value for |window|, converting
// |kShadowElevationDefault| to the appropriate value.
-WM_CORE_EXPORT int GetShadowElevationConvertDefault(const aura::Window* window);
+COMPONENT_EXPORT(UI_WM)
+int GetShadowElevationConvertDefault(const aura::Window* window);
// A property key describing the drop shadow that should be displayed under the
// window. A null value is interpreted as using the default.
-WM_CORE_EXPORT extern const aura::WindowProperty<int>* const
- kShadowElevationKey;
+COMPONENT_EXPORT(UI_WM)
+extern const aura::WindowProperty<int>* const kShadowElevationKey;
} // namespace wm
diff --git a/chromium/ui/wm/core/transient_window_controller.h b/chromium/ui/wm/core/transient_window_controller.h
index 4ed44e99009..99be3354e69 100644
--- a/chromium/ui/wm/core/transient_window_controller.h
+++ b/chromium/ui/wm/core/transient_window_controller.h
@@ -5,9 +5,9 @@
#ifndef UI_WM_CORE_TRANSIENT_WINDOW_CONTROLLER_H_
#define UI_WM_CORE_TRANSIENT_WINDOW_CONTROLLER_H_
+#include "base/component_export.h"
#include "base/observer_list.h"
#include "ui/aura/client/transient_window_client.h"
-#include "ui/wm/core/wm_core_export.h"
namespace wm {
@@ -15,7 +15,7 @@ class TransientWindowManager;
// TransientWindowClient implementation. Uses TransientWindowManager to handle
// tracking transient per window.
-class WM_CORE_EXPORT TransientWindowController
+class COMPONENT_EXPORT(UI_WM) TransientWindowController
: public aura::client::TransientWindowClient {
public:
TransientWindowController();
diff --git a/chromium/ui/wm/core/transient_window_manager.h b/chromium/ui/wm/core/transient_window_manager.h
index 5089b9dec55..898d67d184a 100644
--- a/chromium/ui/wm/core/transient_window_manager.h
+++ b/chromium/ui/wm/core/transient_window_manager.h
@@ -7,10 +7,10 @@
#include <vector>
+#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "ui/aura/window_observer.h"
-#include "ui/wm/core/wm_core_export.h"
namespace wm {
@@ -27,7 +27,8 @@ class TransientWindowObserver;
// . If a transient parent is hidden, it hides all transient children.
// For show operation, please refer to |set_parent_controls_visibility(bool)|.
// Transient windows are typically used for popups and menus.
-class WM_CORE_EXPORT TransientWindowManager : public aura::WindowObserver {
+class COMPONENT_EXPORT(UI_WM) TransientWindowManager
+ : public aura::WindowObserver {
public:
using Windows = std::vector<aura::Window*>;
diff --git a/chromium/ui/wm/core/transient_window_observer.h b/chromium/ui/wm/core/transient_window_observer.h
index d935a808dc8..73a14776b6c 100644
--- a/chromium/ui/wm/core/transient_window_observer.h
+++ b/chromium/ui/wm/core/transient_window_observer.h
@@ -5,7 +5,7 @@
#ifndef UI_WM_CORE_TRANSIENT_WINDOW_OBSERVER_H_
#define UI_WM_CORE_TRANSIENT_WINDOW_OBSERVER_H_
-#include "ui/wm/core/wm_core_export.h"
+#include "base/component_export.h"
namespace aura {
class Window;
@@ -13,7 +13,7 @@ class Window;
namespace wm {
-class WM_CORE_EXPORT TransientWindowObserver {
+class COMPONENT_EXPORT(UI_WM) TransientWindowObserver {
public:
// Called when a transient child is added to |window|.
virtual void OnTransientChildAdded(aura::Window* window,
diff --git a/chromium/ui/wm/core/transient_window_stacking_client.h b/chromium/ui/wm/core/transient_window_stacking_client.h
index df788fb237f..c4114cb08a5 100644
--- a/chromium/ui/wm/core/transient_window_stacking_client.h
+++ b/chromium/ui/wm/core/transient_window_stacking_client.h
@@ -5,14 +5,14 @@
#ifndef UI_WM_CORE_TRANSIENT_WINDOW_STACKING_CLIENT_H_
#define UI_WM_CORE_TRANSIENT_WINDOW_STACKING_CLIENT_H_
+#include "base/component_export.h"
#include "ui/aura/client/window_stacking_client.h"
-#include "ui/wm/core/wm_core_export.h"
namespace wm {
class TransientWindowManager;
-class WM_CORE_EXPORT TransientWindowStackingClient
+class COMPONENT_EXPORT(UI_WM) TransientWindowStackingClient
: public aura::client::WindowStackingClient {
public:
TransientWindowStackingClient();
diff --git a/chromium/ui/wm/core/visibility_controller.h b/chromium/ui/wm/core/visibility_controller.h
index 96efbf7482b..ec907849c29 100644
--- a/chromium/ui/wm/core/visibility_controller.h
+++ b/chromium/ui/wm/core/visibility_controller.h
@@ -5,13 +5,13 @@
#ifndef UI_WM_CORE_VISIBILITY_CONTROLLER_H_
#define UI_WM_CORE_VISIBILITY_CONTROLLER_H_
+#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "ui/aura/client/visibility_client.h"
-#include "ui/wm/core/wm_core_export.h"
namespace wm {
-class WM_CORE_EXPORT VisibilityController
+class COMPONENT_EXPORT(UI_WM) VisibilityController
: public aura::client::VisibilityClient {
public:
VisibilityController();
@@ -47,7 +47,7 @@ class WM_CORE_EXPORT VisibilityController
// // previous state.
// }
//
-class WM_CORE_EXPORT SuspendChildWindowVisibilityAnimations {
+class COMPONENT_EXPORT(UI_WM) SuspendChildWindowVisibilityAnimations {
public:
// Suspend visibility animations of child windows.
explicit SuspendChildWindowVisibilityAnimations(aura::Window* window);
@@ -74,13 +74,14 @@ class WM_CORE_EXPORT SuspendChildWindowVisibilityAnimations {
// whose animation is already enabled either by this function, or
// via SetChildWindowVisibilityChangesAnimatedbelow below is allowed and
// the animation stays enabled.
-void WM_CORE_EXPORT SetWindowVisibilityChangesAnimated(aura::Window* window);
+COMPONENT_EXPORT(UI_WM)
+void SetWindowVisibilityChangesAnimated(aura::Window* window);
// Enable visibility change animation for all children of the |window|.
// Typically applied to a container whose child windows should be animated
// when their visibility changes.
-void WM_CORE_EXPORT
-SetChildWindowVisibilityChangesAnimated(aura::Window* window);
+COMPONENT_EXPORT(UI_WM)
+void SetChildWindowVisibilityChangesAnimated(aura::Window* window);
} // namespace wm
diff --git a/chromium/ui/wm/core/window_animations.cc b/chromium/ui/wm/core/window_animations.cc
index 93d514c80cd..203cfea1224 100644
--- a/chromium/ui/wm/core/window_animations.cc
+++ b/chromium/ui/wm/core/window_animations.cc
@@ -123,7 +123,6 @@ class HidingWindowAnimationObserverBase : public aura::WindowObserver {
AnimationHost* animation_host = GetAnimationHost(window_);
if (animation_host)
animation_host->OnWindowHidingAnimationCompleted();
- window_->RemoveObserver(this);
}
delete this;
}
diff --git a/chromium/ui/wm/core/window_animations.h b/chromium/ui/wm/core/window_animations.h
index 7580e2a2c58..436abd40dee 100644
--- a/chromium/ui/wm/core/window_animations.h
+++ b/chromium/ui/wm/core/window_animations.h
@@ -5,10 +5,10 @@
#ifndef UI_WM_CORE_WINDOW_ANIMATIONS_H_
#define UI_WM_CORE_WINDOW_ANIMATIONS_H_
+#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "ui/compositor/scoped_layer_animation_settings.h"
#include "ui/wm/core/window_properties.h"
-#include "ui/wm/core/wm_core_export.h"
namespace aura {
class Window;
@@ -41,35 +41,39 @@ enum WindowAnimationType {
// These two methods use int for type rather than WindowVisibilityAnimationType
// since downstream libraries can extend the set of animations.
-WM_CORE_EXPORT void SetWindowVisibilityAnimationType(aura::Window* window,
- int type);
-WM_CORE_EXPORT int GetWindowVisibilityAnimationType(aura::Window* window);
+COMPONENT_EXPORT(UI_WM)
+void SetWindowVisibilityAnimationType(aura::Window* window, int type);
+COMPONENT_EXPORT(UI_WM)
+int GetWindowVisibilityAnimationType(aura::Window* window);
-WM_CORE_EXPORT void SetWindowVisibilityAnimationTransition(
+COMPONENT_EXPORT(UI_WM)
+void SetWindowVisibilityAnimationTransition(
aura::Window* window,
WindowVisibilityAnimationTransition transition);
-WM_CORE_EXPORT bool HasWindowVisibilityAnimationTransition(
+COMPONENT_EXPORT(UI_WM)
+bool HasWindowVisibilityAnimationTransition(
aura::Window* window,
WindowVisibilityAnimationTransition transition);
-WM_CORE_EXPORT void SetWindowVisibilityAnimationDuration(
- aura::Window* window,
- const base::TimeDelta& duration);
+COMPONENT_EXPORT(UI_WM)
+void SetWindowVisibilityAnimationDuration(aura::Window* window,
+ const base::TimeDelta& duration);
-WM_CORE_EXPORT base::TimeDelta GetWindowVisibilityAnimationDuration(
+COMPONENT_EXPORT(UI_WM)
+base::TimeDelta GetWindowVisibilityAnimationDuration(
const aura::Window& window);
-WM_CORE_EXPORT void SetWindowVisibilityAnimationVerticalPosition(
- aura::Window* window,
- float position);
+COMPONENT_EXPORT(UI_WM)
+void SetWindowVisibilityAnimationVerticalPosition(aura::Window* window,
+ float position);
class ImplicitHidingWindowAnimationObserver;
// A wrapper of ui::ScopedLayerAnimationSettings for implicit hiding animations.
// Use this to ensure that the hiding animation is visible even after
// the window is deleted or deactivated, instead of using
// ui::ScopedLayerAnimationSettings directly.
-class WM_CORE_EXPORT ScopedHidingAnimationSettings {
+class COMPONENT_EXPORT(UI_WM) ScopedHidingAnimationSettings {
public:
explicit ScopedHidingAnimationSettings(aura::Window* window);
@@ -90,15 +94,15 @@ class WM_CORE_EXPORT ScopedHidingAnimationSettings {
};
// Returns false if the |window| didn't animate.
-WM_CORE_EXPORT bool AnimateOnChildWindowVisibilityChanged(aura::Window* window,
- bool visible);
-WM_CORE_EXPORT bool AnimateWindow(aura::Window* window,
- WindowAnimationType type);
+COMPONENT_EXPORT(UI_WM)
+bool AnimateOnChildWindowVisibilityChanged(aura::Window* window, bool visible);
+COMPONENT_EXPORT(UI_WM)
+bool AnimateWindow(aura::Window* window, WindowAnimationType type);
// Returns true if window animations are disabled for |window|. Window
// animations are enabled by default. If |window| is nullptr, this just checks
// if the global flag disabling window animations is present.
-WM_CORE_EXPORT bool WindowAnimationsDisabled(aura::Window* window);
+COMPONENT_EXPORT(UI_WM) bool WindowAnimationsDisabled(aura::Window* window);
} // namespace wm
diff --git a/chromium/ui/wm/core/window_modality_controller.h b/chromium/ui/wm/core/window_modality_controller.h
index 2d1c7240edc..437b954f4c6 100644
--- a/chromium/ui/wm/core/window_modality_controller.h
+++ b/chromium/ui/wm/core/window_modality_controller.h
@@ -7,12 +7,12 @@
#include <vector>
+#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "base/strings/string_piece.h"
#include "ui/aura/env_observer.h"
#include "ui/aura/window_observer.h"
#include "ui/events/event_handler.h"
-#include "ui/wm/core/wm_core_export.h"
namespace aura {
class Env;
@@ -26,20 +26,22 @@ class LocatedEvent;
namespace wm {
// Sets the modal parent for the child.
-WM_CORE_EXPORT void SetModalParent(aura::Window* child, aura::Window* parent);
+COMPONENT_EXPORT(UI_WM)
+void SetModalParent(aura::Window* child, aura::Window* parent);
// Returns the modal transient child of |window|, or NULL if |window| does not
// have any modal transient children.
-WM_CORE_EXPORT aura::Window* GetModalTransient(aura::Window* window);
-WM_CORE_EXPORT const aura::Window* GetModalTransient(
- const aura::Window* window);
+COMPONENT_EXPORT(UI_WM) aura::Window* GetModalTransient(aura::Window* window);
+COMPONENT_EXPORT(UI_WM)
+const aura::Window* GetModalTransient(const aura::Window* window);
// WindowModalityController is an event filter that consumes events sent to
// windows that are the transient parents of window-modal windows. This filter
// must be added to the CompoundEventFilter so that activation works properly.
-class WM_CORE_EXPORT WindowModalityController : public ui::EventHandler,
- public aura::EnvObserver,
- public aura::WindowObserver {
+class COMPONENT_EXPORT(UI_WM) WindowModalityController
+ : public ui::EventHandler,
+ public aura::EnvObserver,
+ public aura::WindowObserver {
public:
explicit WindowModalityController(ui::EventTarget* event_target,
aura::Env* env = nullptr);
diff --git a/chromium/ui/wm/core/window_properties.cc b/chromium/ui/wm/core/window_properties.cc
index 506dd0c0cc4..73896945bec 100644
--- a/chromium/ui/wm/core/window_properties.cc
+++ b/chromium/ui/wm/core/window_properties.cc
@@ -6,10 +6,10 @@
#include "ui/wm/core/window_animations.h"
-DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(WM_CORE_EXPORT,
+DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(COMPONENT_EXPORT(UI_WM),
wm::WindowVisibilityAnimationTransition)
-DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(WM_CORE_EXPORT, float)
+DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(COMPONENT_EXPORT(UI_WM), float)
namespace wm {
diff --git a/chromium/ui/wm/core/window_properties.h b/chromium/ui/wm/core/window_properties.h
index ae131fc3ae9..62caea0f724 100644
--- a/chromium/ui/wm/core/window_properties.h
+++ b/chromium/ui/wm/core/window_properties.h
@@ -5,9 +5,9 @@
#ifndef UI_WM_CORE_WINDOW_PROPERTIES_H_
#define UI_WM_CORE_WINDOW_PROPERTIES_H_
+#include "base/component_export.h"
#include "base/time/time.h"
#include "ui/base/class_property.h"
-#include "ui/wm/core/wm_core_export.h"
namespace wm {
@@ -24,28 +24,30 @@ enum WindowVisibilityAnimationTransition {
// Property to tell if the container uses screen coordinates for the child
// windows.
-WM_CORE_EXPORT extern const ui::ClassProperty<bool>* const
- kUsesScreenCoordinatesKey;
+COMPONENT_EXPORT(UI_WM)
+extern const ui::ClassProperty<bool>* const kUsesScreenCoordinatesKey;
-WM_CORE_EXPORT extern const ui::ClassProperty<base::TimeDelta>* const
+COMPONENT_EXPORT(UI_WM)
+extern const ui::ClassProperty<base::TimeDelta>* const
kWindowVisibilityAnimationDurationKey;
-WM_CORE_EXPORT extern const ui::ClassProperty<
- WindowVisibilityAnimationTransition>* const
+COMPONENT_EXPORT(UI_WM)
+extern const ui::ClassProperty<WindowVisibilityAnimationTransition>* const
kWindowVisibilityAnimationTransitionKey;
-WM_CORE_EXPORT extern const ui::ClassProperty<int>* const
- kWindowVisibilityAnimationTypeKey;
+COMPONENT_EXPORT(UI_WM)
+extern const ui::ClassProperty<int>* const kWindowVisibilityAnimationTypeKey;
// Used if the animation-type is WINDOW_VISIBILITY_ANIMATION_TYPE_VERTICAL.
-WM_CORE_EXPORT extern const ui::ClassProperty<float>* const
+COMPONENT_EXPORT(UI_WM)
+extern const ui::ClassProperty<float>* const
kWindowVisibilityAnimationVerticalPositionKey;
} // namespace wm
// These need to be declared here for jumbo builds.
-DECLARE_EXPORTED_UI_CLASS_PROPERTY_TYPE(WM_CORE_EXPORT,
+DECLARE_EXPORTED_UI_CLASS_PROPERTY_TYPE(COMPONENT_EXPORT(UI_WM),
wm::WindowVisibilityAnimationTransition)
-DECLARE_EXPORTED_UI_CLASS_PROPERTY_TYPE(WM_CORE_EXPORT, float)
+DECLARE_EXPORTED_UI_CLASS_PROPERTY_TYPE(COMPONENT_EXPORT(UI_WM), float)
#endif // UI_WM_CORE_WINDOW_PROPERTIES_H_
diff --git a/chromium/ui/wm/core/window_util.cc b/chromium/ui/wm/core/window_util.cc
index b3899607628..939d4579f91 100644
--- a/chromium/ui/wm/core/window_util.cc
+++ b/chromium/ui/wm/core/window_util.cc
@@ -119,8 +119,10 @@ void SetWindowState(aura::Window* window, ui::WindowShowState state) {
}
void Restore(aura::Window* window) {
+ window->SetProperty(aura::client::kIsRestoringKey, true);
window->SetProperty(aura::client::kShowStateKey,
window->GetProperty(aura::client::kRestoreShowStateKey));
+ window->ClearProperty(aura::client::kIsRestoringKey);
}
void Unminimize(aura::Window* window) {
diff --git a/chromium/ui/wm/core/window_util.h b/chromium/ui/wm/core/window_util.h
index 33b0b964489..c33a30c47db 100644
--- a/chromium/ui/wm/core/window_util.h
+++ b/chromium/ui/wm/core/window_util.h
@@ -10,8 +10,8 @@
#include <vector>
#include "base/callback_forward.h"
+#include "base/component_export.h"
#include "ui/base/ui_base_types.h"
-#include "ui/wm/core/wm_core_export.h"
namespace aura {
class Window;
@@ -25,41 +25,43 @@ class LayerTreeOwner;
namespace wm {
-WM_CORE_EXPORT void ActivateWindow(aura::Window* window);
-WM_CORE_EXPORT void DeactivateWindow(aura::Window* window);
-WM_CORE_EXPORT bool IsActiveWindow(const aura::Window* window);
-WM_CORE_EXPORT bool CanActivateWindow(const aura::Window* window);
-WM_CORE_EXPORT void SetWindowFullscreen(aura::Window* window, bool fullscreen);
+COMPONENT_EXPORT(UI_WM) void ActivateWindow(aura::Window* window);
+COMPONENT_EXPORT(UI_WM) void DeactivateWindow(aura::Window* window);
+COMPONENT_EXPORT(UI_WM) bool IsActiveWindow(const aura::Window* window);
+COMPONENT_EXPORT(UI_WM) bool CanActivateWindow(const aura::Window* window);
+COMPONENT_EXPORT(UI_WM)
+void SetWindowFullscreen(aura::Window* window, bool fullscreen);
// Returns true if |window|'s show state is |state|.
-WM_CORE_EXPORT bool WindowStateIs(const aura::Window* window,
- ui::WindowShowState state);
+COMPONENT_EXPORT(UI_WM)
+bool WindowStateIs(const aura::Window* window, ui::WindowShowState state);
// Sets the window state to |state|.
-WM_CORE_EXPORT void SetWindowState(aura::Window* window,
- ui::WindowShowState state);
+COMPONENT_EXPORT(UI_WM)
+void SetWindowState(aura::Window* window, ui::WindowShowState state);
// Restores the window state from the current state to its previous applicable
// state. As an example, if the current state is minimized, Restore() will
// change the window's sate to its applicable pre-minimized state, which is the
// same as calling Unminimize() function.
-WM_CORE_EXPORT void Restore(aura::Window* window);
+COMPONENT_EXPORT(UI_WM) void Restore(aura::Window* window);
// Changes a window's state to its pre-minimized state.
-WM_CORE_EXPORT void Unminimize(aura::Window* window);
+COMPONENT_EXPORT(UI_WM) void Unminimize(aura::Window* window);
// Retrieves the activatable window for |window|. If |window| is activatable,
// this will just return it, otherwise it will climb the parent/transient parent
// chain looking for a window that is activatable, per the ActivationClient.
// If you're looking for a function to get the activatable "top level" window,
// this is probably the function you're looking for.
-WM_CORE_EXPORT aura::Window* GetActivatableWindow(aura::Window* window);
+COMPONENT_EXPORT(UI_WM)
+aura::Window* GetActivatableWindow(aura::Window* window);
// Retrieves the toplevel window for |window|. The ActivationClient makes this
// determination.
-WM_CORE_EXPORT aura::Window* GetToplevelWindow(aura::Window* window);
-WM_CORE_EXPORT const aura::Window* GetToplevelWindow(
- const aura::Window* window);
+COMPONENT_EXPORT(UI_WM) aura::Window* GetToplevelWindow(aura::Window* window);
+COMPONENT_EXPORT(UI_WM)
+const aura::Window* GetToplevelWindow(const aura::Window* window);
// Returns the existing Layer for |root| (and all its descendants) and creates
// a new layer for |root| and all its descendants. This is intended for
@@ -67,8 +69,8 @@ WM_CORE_EXPORT const aura::Window* GetToplevelWindow(
//
// As a result of this |root| has freshly created layers, meaning the layers
// have not yet been painted to.
-WM_CORE_EXPORT std::unique_ptr<ui::LayerTreeOwner> RecreateLayers(
- ui::LayerOwner* root);
+COMPONENT_EXPORT(UI_WM)
+std::unique_ptr<ui::LayerTreeOwner> RecreateLayers(ui::LayerOwner* root);
using MapLayerFunc =
base::RepeatingCallback<std::unique_ptr<ui::Layer>(ui::LayerOwner*)>;
@@ -77,38 +79,42 @@ using MapLayerFunc =
// layer tree. The recursion stops at the level when |map_func| returns nullptr
// on the owner's layer. MapLayers might return nullptr when |map_func| returns
// nullptr on the root layer's owner.
-WM_CORE_EXPORT std::unique_ptr<ui::LayerTreeOwner> RecreateLayersWithClosure(
+COMPONENT_EXPORT(UI_WM)
+std::unique_ptr<ui::LayerTreeOwner> RecreateLayersWithClosure(
ui::LayerOwner* root,
const MapLayerFunc& map_func);
// Returns a layer tree that mirrors |root|. Used for live window previews. If
// |sync_bounds| is true, the bounds of all mirror layers except the root are
// synchronized. See |sync_bounds_with_source_| in ui::Layer.
-WM_CORE_EXPORT std::unique_ptr<ui::LayerTreeOwner> MirrorLayers(
- ui::LayerOwner* root,
- bool sync_bounds);
+COMPONENT_EXPORT(UI_WM)
+std::unique_ptr<ui::LayerTreeOwner> MirrorLayers(ui::LayerOwner* root,
+ bool sync_bounds);
// Convenience functions that get the TransientWindowManager for the window and
// redirect appropriately. These are preferable to calling functions on
// TransientWindowManager as they handle the appropriate null checks.
-WM_CORE_EXPORT aura::Window* GetTransientParent(aura::Window* window);
-WM_CORE_EXPORT const aura::Window* GetTransientParent(
+COMPONENT_EXPORT(UI_WM) aura::Window* GetTransientParent(aura::Window* window);
+COMPONENT_EXPORT(UI_WM)
+const aura::Window* GetTransientParent(const aura::Window* window);
+COMPONENT_EXPORT(UI_WM)
+const std::vector<aura::Window*>& GetTransientChildren(
const aura::Window* window);
-WM_CORE_EXPORT const std::vector<aura::Window*>& GetTransientChildren(
- const aura::Window* window);
-WM_CORE_EXPORT void AddTransientChild(aura::Window* parent,
- aura::Window* child);
-WM_CORE_EXPORT void RemoveTransientChild(aura::Window* parent,
- aura::Window* child);
-WM_CORE_EXPORT aura::Window* GetTransientRoot(aura::Window* window);
+COMPONENT_EXPORT(UI_WM)
+void AddTransientChild(aura::Window* parent, aura::Window* child);
+COMPONENT_EXPORT(UI_WM)
+void RemoveTransientChild(aura::Window* parent, aura::Window* child);
+COMPONENT_EXPORT(UI_WM) aura::Window* GetTransientRoot(aura::Window* window);
// Returns true if |window| has |ancestor| as a transient ancestor. A transient
// ancestor is found by following the transient parent chain of the window.
-WM_CORE_EXPORT bool HasTransientAncestor(const aura::Window* window,
- const aura::Window* ancestor);
+COMPONENT_EXPORT(UI_WM)
+bool HasTransientAncestor(const aura::Window* window,
+ const aura::Window* ancestor);
// Snap the window's layer to physical pixel boundary.
-WM_CORE_EXPORT void SnapWindowToPixelBoundary(aura::Window* window);
+COMPONENT_EXPORT(UI_WM) void SnapWindowToPixelBoundary(aura::Window* window);
+
} // namespace wm
#endif // UI_WM_CORE_WINDOW_UTIL_H_
diff --git a/chromium/ui/wm/core/wm_core_export.h b/chromium/ui/wm/core/wm_core_export.h
deleted file mode 100644
index c033ddc9bab..00000000000
--- a/chromium/ui/wm/core/wm_core_export.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_WM_CORE_WM_CORE_EXPORT_H_
-#define UI_WM_CORE_WM_CORE_EXPORT_H_
-
-// Defines WM_CORE_EXPORT so that functionality implemented by the WM module
-// can be exported to consumers.
-
-#if defined(COMPONENT_BUILD)
-#if defined(WIN32)
-
-#if defined(WM_CORE_IMPLEMENTATION)
-#define WM_CORE_EXPORT __declspec(dllexport)
-#else
-#define WM_CORE_EXPORT __declspec(dllimport)
-#endif // defined(WM_CORE_IMPLEMENTATION)
-
-#else // defined(WIN32)
-#if defined(WM_CORE_IMPLEMENTATION)
-#define WM_CORE_EXPORT __attribute__((visibility("default")))
-#else
-#define WM_CORE_EXPORT
-#endif
-#endif
-
-#else // defined(COMPONENT_BUILD)
-#define WM_CORE_EXPORT
-#endif
-
-#endif // UI_WM_CORE_WM_CORE_EXPORT_H_
diff --git a/chromium/ui/wm/core/wm_core_switches.h b/chromium/ui/wm/core/wm_core_switches.h
index dd480256eef..3a9ddf430ad 100644
--- a/chromium/ui/wm/core/wm_core_switches.h
+++ b/chromium/ui/wm/core/wm_core_switches.h
@@ -5,8 +5,8 @@
#ifndef UI_WM_CORE_WM_CORE_SWITCHES_H_
#define UI_WM_CORE_WM_CORE_SWITCHES_H_
+#include "base/component_export.h"
#include "build/build_config.h"
-#include "ui/wm/core/wm_core_export.h"
namespace wm {
namespace switches {
@@ -16,7 +16,7 @@ namespace switches {
// see chromeos::LoginUtil::GetOffTheRecordCommandLine().)
// Please keep alphabetized.
-WM_CORE_EXPORT extern const char kWindowAnimationsDisabled[];
+COMPONENT_EXPORT(UI_WM) extern const char kWindowAnimationsDisabled[];
} // namespace switches
} // namespace wm
diff --git a/chromium/ui/wm/core/wm_state.h b/chromium/ui/wm/core/wm_state.h
index a0f182a1200..3686b03c98e 100644
--- a/chromium/ui/wm/core/wm_state.h
+++ b/chromium/ui/wm/core/wm_state.h
@@ -7,7 +7,7 @@
#include <memory>
-#include "ui/wm/core/wm_core_export.h"
+#include "base/component_export.h"
namespace wm {
@@ -16,7 +16,7 @@ class TransientWindowController;
class TransientWindowStackingClient;
// Installs state needed by the window manager.
-class WM_CORE_EXPORT WMState {
+class COMPONENT_EXPORT(UI_WM) WMState {
public:
WMState();
diff --git a/chromium/ui/wm/public/BUILD.gn b/chromium/ui/wm/public/BUILD.gn
index b4ae9394e3a..16ae5979629 100644
--- a/chromium/ui/wm/public/BUILD.gn
+++ b/chromium/ui/wm/public/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/ui.gni")
+
+assert(use_aura)
+
component("public") {
output_name = "wm_public"